zoukankan      html  css  js  c++  java
  • 新手如何学习编程

    2008 年北京奥运会的那年,我们国家突破性的拿到了 48 枚金牌,整个国家都是沸腾的。那年,我上了大学,学了编程,一晃十多年就过去了。

    我的命运也因此发生了改变。

    讲真,十多年前,我真没想过,自己有朝一日能在洛阳这座城市扎根,哪怕洛阳只是一座三线城市,我也没想过。心里只是暗下决心,无论如何,一定要走出农村,原因很简单,农村的生活真的很苦,尤其是农忙的季节。

    陶渊明有句诗:“晨兴理荒秽,带月荷锄归。”很美好,很有诗意。从时间上来说,的确这样的,早起晚归;但从身体的负荷程度来说,再没有比干农活更累的了,真的艰辛。所以上学期间,我最讨厌的就是放暑假,哈哈哈。

    给大家看一张图片吧,这是我妹站在我小叔家的房顶上拍的。隐约可见的窑洞是我外婆家,我小时候经常在这里住。带瓷砖的平房是我爷爷家,后来分家分给了我小叔家,之前是瓦房(我上高中的时候才盖了现在的平房),平房的后面也是窑洞,不过已经塌陷了。

    父亲曾说过一句让我刻骨铭心的话:“我的历史使命就是让你从农村回到城市。”如今他做到了,我在城市扎了根。提一句,我爷爷当年就是从洛阳(轴承厂)下乡到我们村的。

    我之所以能够逆袭成功,因素有很多,但我想以下这三点非常重要:

    • 父母的支持
    • 自己的努力
    • 选择了编程

    关注我的读者当中,大多数都是学编程的,那么如何才能把编程学好呢,如何才能让它成为我们安身立命的根本呢?

    一开始,不管是学习哪一门编程语言,C语言也好,Java 语言也好,一定要能让电脑屏幕打印出“hello world”。

    如果10 分钟内不能完成,就说明你的学习方法是有问题的。

    学习的最好方法就是逐步扩大胜利战果,先从最小的胜利开始,让自己感受到学习的快乐,尽快地进入到一种正反馈的状态当中。

    如果一门编程语言需要你研究很多预备知识,才能完成“hello world”的打印,那么它就不太适合初学者。

    学习编程的过程,大致如下:

    1)入门

    • 看视频、看教程、看书
    • 模仿视频、教程、书上的代码,进行复现
    • 思考学习别人的思路,脱离视频、教程和书本,自己独自实现一些小 Demo

    2)进阶

    • 学会调用 API,学会使用框架
    • 在 API 和框架的帮助下,实现业务代码
    • 阅读 API 和框架的源码,理解背后的实现原理
    • 攻克技术难点

    3)成神

    • 做架构
    • 做业务模块拆分
    • 带着别人做开发
    • 出视频、出教程、出书

    以下是这十多年我个人总结出的编程心得,毫不保留地分享给大家,希望能给大家一点点启发和帮助。

    1)让编程成为习惯

    如果哪天我没有敲上一行代码,我总感觉缺了点啥。其实说白了,就是编程已经深入我的工作和生活,成了密不可分的一部分。

    养成习惯的一个好办法就是拒绝“拖延症”,尤其是在新手阶段,千万不要因为一些客观或者主观因素,感到厌烦或者抗拒。

    我大一刚开始学习 Java 的时候,其实就蛮抗拒的。因为要配置环境变量,配置完成后要在命令行里敲代码。这样学编程的坏处很多。

    第一,我家里比较穷,所以大一上半学期没有买电脑,学习编程只能到机房去,而机房的电脑只要重启,配置好的环境变量就会丢失,还得重新配置一遍,不厌其烦。

    第二,命令行编程对新手实在是太不友好了,我经常拼错关键字,比如说 main 拼成 mian,就导致出现一些莫名其妙的错误,而命令行的错误提示一点也不直接,这就导致找一些简单的错误要花很久的时间,自己的心情也会变得比较糟糕。

    所以,千万不要信一些大牛的话,说什么命令行编程、记事本编程容易锻炼新人的编程思维——帽子戴得也太大了点。

    如果你是初学 Java,直接上 Intellij IDEA 就可以了,JDK 可以直接下,环境变量不用配,直接就可以上手敲“hello world”,单词拼错了,还有提醒。

    你就会感觉学编程是一件很简单的事儿,信心就上来了。

    大学阶段,记得每天至少敲一行代码。如果觉得一行代码没意义,可以到 LeetCode 上刷一道算法题,哪怕是自己没有解题思路,也可以看看别人的嘛,找最简单的开始做,做不出来就先抄别人的,不要不好意思,不要觉得自己笨,新人,最重要的是脸皮要厚,保持对编程的热情。

    我在 博客园 共输出了 100 多篇 Java 方面的文章,总字数超过 30 万字, 内容风趣幽默、通俗易懂,收获了很多初学者的认可和支持,内容包括 Java 语法、Java 集合框架、Java 并发编程、Java 虚拟机等核心内容


    为了帮助更多的 Java 初学者,我“一怒之下”就把这些文章重新整理并开源到了 GitHub,起名《教妹学 Java》,听起来是不是就很有趣?

    GitHub 开源地址(欢迎 star)https://github.com/itwanger/jmx-java

    2)阅读别人的代码

    在我看来,提升编程水平的最佳途径就是多看、多写。

    优秀的开源项目的源码经过了几千人的上万次修改,非常经典。就像 JDK 的源码一样,经历了二十多年的考验,可以说是经典中的经典。

    读这些源码可以让你的编程能力突飞猛进,举个例子来讲吧。

    public void run() {
        if (state == ChannelState.RECEIVED) {
            try {
                handler.received(channel, message);
            } catch (Exception e) { }
        } else {
            switch (state) {
                case CONNECTED:
                    try {
                        handler.connected(channel);
                    } catch (Exception e) {}
                    break;
                case DISCONNECTED:
                    try {
                        handler.disconnected(channel);
                    } catch (Exception e) {}
                    break;
                case SENT:
                    try {
                        handler.sent(channel, message);
                    } catch (Exception e) { }
                    break;
                case CAUGHT:
                    try {
                        handler.caught(channel, exception);
                    } catch (Exception e) { }
                    break;
                default:
            }
        }
    }

    这是 Dubbo 源码中的 ChannelEventRunnable 类的run 方法,这段代码里先用 if 做了判断,然后才在 else 中使用 switch 做了分支判断。为什么不全部使用 switch 呢?

    因为现代 CPU 都支持分支预测(branch prediction)和指令流水线(instruction pipeline),这两个结合可以极大提高 CPU 效率。对于像简单的 if 跳转,CPU 是可以比较好地做分支预测的。但是对于 switch 跳转,CPU 则没有太多的办法。switch 本质上是根据索引,从地址数组里取地址再跳转的。

    显然,state == ChannelState.RECEIVED 的这个分支发生的频率更好,写在 if 语句中能充分利用 CPU 的分支预测功能,从而提升程序的性能,写到 switch 语句里就无能为力了。

    我一开始读代码也很慢,有很多看不懂,后来代码写多了以后,再读别人的代码就会明显地感觉到速度变快了。

    慢不是因为缺少编程天赋,而是因为对常用的 API 不熟,再加上没有多少编程经验造成的。

    看的多了,写的多了,很多代码扫一眼就明白了,思路就不会被不懂的语法或者编程技巧打断,注意力就会一直停留在程序的逻辑上,读代码就轻松多了。

    说 4 个阅读源码的技巧吧。

    • 自顶向下:从需求开始,然后再到实现细节。比如说看一个方法,可以把 debug 模式打开,一步步地跳进去,然后再跳出来。
    • 提纲挈领:先看一个类、一个方法的 doc 文档,如果英语功底不好的话,可以在 Intellij IDEA 中装一个translation 的翻译插件,先大致过一下这个类、这个方法是干嘛的。
    • 广度优先:一开始,可以把重心放在整体上而不是局部细节上,一些一时半会理解不了的就暂时跳过去,没关系的。后面经验足了,可以回头再读。
    • 选择合适的版本,不要追求最新。如果你要阅读 JDK 的源码,比如说 String 类、HashMap 类这些经典的类库,一定要选择 JDK 8,里面的语法没有太多炫技的,比较扎实;如果选择 JDK 11 或者以上的版本,你会发现里面有一些细节真的是看得头大,因为穿插了很多对新手不那么友好的技巧。

    记住一点,不要漫无目的地去阅读源码,尤其是那些超出个人能力之外的源码。比如说,你初学编程,就去看 Linux 的源码,就会撑着。

    什么时候开始读源码呢?

    • 当你没有自己的实现思路,需要借鉴别人的代码的时候。
    • 当你 debug 的时候,可能你是为了找出问题,或者是解决问题。
    • 当你想要给一个项目添加 feature 或者提交 PR 的时候。

    3)记笔记写技术文章

    对于代码,通过敲代码、大量的练习加强理解;对于理论知识,通过记笔记、写技术文章加深记忆。

    新手在一开始学习编程的时候,容易进入两种误区,一种是认为自己学不会,好难;一种是认为自己学会了,盲目自信。

    检验自己到底有没有学会,可以通过记笔记或者写技术文章的形式来检验。

    如果记笔记的时候脑子一片空白,就证明自己压根没有记住或者理解。

    如果写了技术博客,别人看不懂,或者被别人检出了问题,就说明还有待提高,提高的方面很可能不是写作技巧方面,而是自己掌握的不够扎实。

    罗马不是一天建成的,保持耐心。

    在这个过程中,你可能会经历高潮和低谷,可以通过笔记和文章的形式把这个过程记录下来,等你空闲下来的时候,再去回顾当初的学习方法或者心得体会,就会有一种“复前行,豁然开朗”的感觉。

    衣食住行,是生活的基本条件,而计算机,已经渗透到衣食住行的方方面面了,可以说是“无孔不入”。因此,计算机专业的学生完全不用担心就业问题,因为每年的需求量都很大,关键是薪资还高。

    在我看来,计算机专业至少还能热门 10 年左右。而编程,是计算机专业中非常重要的一项技能。

    有个很流行的说法叫:穷学编程,富学金融,超级有钱学哲学,还是非常有道理的。

    对于我们家境一般、农村走出来的孩子来说,学习编程可能是最好的出路。

  • 相关阅读:
    sweetalert使用随笔
    Web框架之Django_07 进阶操作(MTV与MVC、多对多表三种创建方式、前后端传输数据编码格式contentType、ajax、自定义分页器)
    Web框架之Django_06 模型层了解(F查询、Q查询、事务、update和save、only和defer、choice属性、bulk_create)
    Web框架之Django_05 模型层了解(单表查询、多表查询、聚合查询、分组查询)
    Web框架之Django_04 模板层了解(过滤器、标签、自定义过滤器、标签、inclusion_tag、模板的继承与导入)
    Web框架之Django_03 路由层了解(路有层 无名分组、有名分组、反向解析、路由分发 视图层 JsonResponse,FBV、CBV、文件上传)
    SQLAlchemy相关文档
    TCP三次握手四次挥手
    网络编程与并发编程参考资料
    MySQL数据库相关资料
  • 原文地址:https://www.cnblogs.com/qing-gee/p/15136508.html
Copyright © 2011-2022 走看看