四年前的我还像一张白纸,看什么书都觉得大有长进,当一张白纸的感觉也不坏。但渐渐的收效甚微,囫囵吞枣后只剩下了星星点点的记忆。于是在短暂的迷茫之后,写下了《小小程序员的学习计划》这篇文章,确立自己的学习路线。既然热爱编程,决定要走很远,那么就静下心来闭关修炼。时光荏苒,一眨眼就过去了四年,不知道当年的同学朋友还有多少在坚持写代码,也是时候总结一下自己这些年的进展了。
尽管一直没有停下脚步,但总结起进度来还是多少有些惭愧。有些书当时图方便买的中文版,有些后悔,而且影印版好像印的很少、卖的很快,现在只要有影印版就一定买。对照着《小小程序员的学习计划》总结如下:
Ø 计算机数学:《具体数学》影印版看了两章… 这种书需要一整块时间静下来好好看,一旦有什么事打断就难以继续。《离散数学》一直也没买,更没有看了。
Ø C语言:这一部分完成的还不错,《C程序设计语言》和《C和指针》两本经典著作都读完了。只不过C平时练的少,还是多写一些算法题或者Linux小程序。
Ø 数据结构与算法:《算法导论》读了三遍才把第一部分读完,高级设计技术还得继续看。最近又买了几本不错的算法书对《算法导论》进行补充,准备再来一次,争取攻下这一难关。
Ø 计算机系统和操作系统:这两块是我最引以为豪的,从《汇编语言》到《操作系统概念》和《CSAPP, 2nd edition》影印版,《操作系统概念》《Orange:一个操作系统的实现》当时看了一少半,加上近期买入的《现代操作系统》影印版,准备再配合学一下。
Ø 计算机网络:这一部分让我很惭愧,科班出身,对网络中偏软的部分还行,偏硬的真是不感兴趣… 毕竟当年考大学选专业就是想学网络的软件技术,当一名隐居山林的黑客 ( ╯□╰ )。《TCP/IP详解》第一卷看完也没总结,都忘得差不多了。第二卷实现准备择日入手。
Ø 编译原理和系统内核:应该是最难的一部分了,《龙书》一直都没敢看,《深入理解Linux内核》也是一页都没动,勉强才看完了小薄册子《Linux内核设计与分析》。什么时候才能够水平看呢…
Ø 平台开发:这一部分也还不错,Linux和Windows开发都看了几本书,《Linux一站式学习》挺不错。虽说没有太多的实践(只写过系统调用的helloworld、一些算法题、《深入解析Nginx模块开发》中的模块开发、Qt编程等),但需要时写起来还有些基础。
虽然看起来像是东一榔头、西一棒子,但大方向上还是在按照当年的计划执行,这一点还是值得庆贺一下的!而且有了这些年的尝试,对每一块知识都有了新的认识,于是参考《编程珠玑》,重新修正一下之前的计划。
Ø 问题定义:定义好问题就成功了一大半了!所以我们先要定义好问题,包括前置/后置断言,以及约束条件等。
Ø 解决方案设计:Solution设计当然少不了数据结构和算法,很多时候不只用现成的方案,还需要设计算法和扩展数据结构。设计好了Solution就要用伪代码写出来。
Ø 算法分析:有了伪代码,就可以进行正确性的证明和运行时间分析了。正确性和运行效率不仅是执行后续步骤的基石,也能及早地发现问题,降低修复的成本。
Ø 系统环境:这一部分是我们写出实用程序的基础,因为大多数时候我们解决的都不是纯算法的问题,即便是算法问题也要读入读出数据,也会涉及系统环境,所以这一部分也相当重要!大致可以分为:计算机架构(计算机组成原理、汇编语言等)、操作系统(Linux和Windows常用系统API等)、编译链接(编译和链接的原理)。
Ø 代码实现:C/C++/Java等主流语言,如何实现我们的设计,包括语言语法、内存分配、封装抽象、分包引库等小细节。
Ø 代码设计:对于简短的小程序,经过上面几步就已基本完成了。但在大型项目中,上述步骤只能搞定一个个小积木,如何将代码组装起来也是学问。所以这一部分涉及到抽象层次定义、23种设计模式、重构改善设计等。
这一部分主要关注我们程序员参与的部分,例如单元测试的框架和技巧,性能测试的方法,性能优化等。尽管前面已经有了证明代码正确性一步,但我们还是需要测试来增强我们的信息,验证代码的确没有bug。
比尔盖茨说:“人生就像一场大火,我们每个人唯一可以做的就是从这场大火中多抢救一些东西出来。” 计划在照常执行值得庆贺,但前方路漫漫,时间无多,体力、精力、智力的黄金时段都已远去,我还需加倍努力,期望在这条路上走的远一些,再远一些!