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 上刷一道算法题,哪怕是自己没有解题思路,也可以看看别人的嘛,找最简单的开始做,做不出来就先抄别人的,不要不好意思,不要觉得自己笨,新人,最重要的是脸皮要厚,保持对编程的热情。
我在 CSDN 共输出了 100 多篇 Java 方面的文章,总字数超过 30 万字, 内容风趣幽默、通俗易懂,收获了很多初学者的认可和支持,内容包括 Java 语法、Java 集合框架、Java 并发编程、Java 虚拟机等核心内容。
为了帮助更多的 Java 初学者,我“一怒之下”就把这些文章重新整理并开源到了 开源广场,起名《教妹学 Java》,听起来是不是就很有趣?
CodeChina 开源地址(欢迎 star):https://codechina.csdn.net/qing_gee/jmx-java
2)阅读别人的代码
在我看来,提升编程水平的最佳途径就是多看、多写。
优秀的开源项目的源码经过了几千人的上万次修改,非常经典。就像 JDK 的源码一样,经历了二十多年的考验,可以说是经典中的经典。
读这些源码可以让你的编程能力突飞猛进,举个例子来讲吧。
这是 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)记笔记写技术文章
对于代码,通过敲代码、大量的练习加强理解;对于理论知识,通过记笔记、写技术文章加深记忆。
新手在一开始学习编程的时候,容易进入两种误区,一种是认为自己学不会,好难;一种是认为自己学会了,盲目自信。
检验自己到底有没有学会,可以通过记笔记或者写技术文章的形式来检验。
如果记笔记的时候脑子一片空白,就证明自己压根没有记住或者理解。
如果写了技术博客,别人看不懂,或者被别人检出了问题,就说明还有待提高,提高的方面很可能不是写作技巧方面,而是自己掌握的不够扎实。
罗马不是一天建成的,保持耐心。
在这个过程中,你可能会经历高潮和低谷,可以通过笔记和文章的形式把这个过程记录下来,等你空闲下来的时候,再去回顾当初的学习方法或者心得体会,就会有一种“复前行,豁然开朗”的感觉。