在每个阶段,不同的计算机书籍对我的影响是不一样的。
刚入门阶段时:Data Structure and Algorithms in Python;
在我没有读《Data Structure and Algorithms in Python》这本书之前,我对编程几乎是一无所知。
当我读到这本书时,突然对面向对象有些领悟,明白了问题怎么办和为什么,虽然这本书是主要讲解算法的实现过程。把数据结构中的数列、链表、字典、栈、队列、树、图又加深了一次印象,对查找、排序、递归等算法再次有了新的理解。
成长阶段:Structure and Intepretation of Computer Programs、SICP;The C Programming Language;Domain Modelling Made Functional;
在程序员这个道路上刚起步时,想学一些东西,但是又不知道如何下手。当我读到《Structure and Intepretation of Computer Programs》这本书时,告诉了我怎么使用抽象数据结构、怎么使用抽象函数调用、怎么使用抽象状态和模块、怎么使用抽象元数据等。这本书主要是讲解决问题框架,即如何系统化解决设计问题。
除此之外,这本书还讲解了Lisp Scheme;程序员不接触Lisp,会是成为一种遗憾。
还有《Domain Modelling Made Functional》这本书,让我对函数式编程有了进一步的理解,知道在工程中如何使用函数式编程。
深入阶段:Computer Systems: A Programmer's Perspective、CSAPP;Clean Architecture和重读 SICP和CSAPP。
当做程序员有一段时间后,非常渴望了解系统底层知识和编译运行知识,不在满足于只会调用API或使用别人做好的工具,想去探索这些未知的问题。
当我读到《Computer Systems: A Programmer's Perspective》这本书时,对硬盘、CPU、内存、缓存有了更深入的认识,明白了在硬件上程序是如何工作的,对如何提高程序性能的问题有点眉目了。
《Clean Architecture》这本书最好在有工程项目经验之后在去读,你才能领悟到书中讲解的内容意义,书中讲的内容会与你在工程项目中的感受原则一致,可以对实践进行指导。
我看的这些书都是从硬件到软件,在从软件到算法和架构,它们之间是有一定的关联,就像递归执行过程一样,不同的层次总有相似的原则出现。
比如,算法中讲解的ADT(Abstract Data Type)是一种接口;而在SICP中,接口是另一种数据抽象方式,在硬件和编译器之间,指令集是接口。又比如,算法中数据可能是以不同的方式在内存中存储,如数列和链表,这也是软件和硬件相结合。
总之,读计算机书籍与做数学题类似,读+抄写代码+刷题。
在另外提一嘴,程序员本身是一个挣钱的美好职业,但是很多程序员不知道自己在市场上到底值多少钱。或许,你该了解钱了,了解自己在市场上到底是个什么价值,自己每个月拿的工资到底有多少成本等,这比书中的知识和代码更有趣,也更基础。
钱,是收入;时间,是支出和投资;钱和时间的比例就是RIO(投入产出比),程序员除了用技能和经验进行衡量外,用钱/时间比来衡量会更直观。
比如你学习Go语言,学起来容易,使用也容易,你投入的时间少,收益也高,RIO自然也高;毕竟Go语言偏向后端和工具,工作机会多,钱也多。
但是,你学Rust就不一样了,Rust学习周期长,上手难,投入时间较长,虽然钱多,但RIO不如Go语言高,工作机会也少。
TypeScript/Java/JavaScript则是投入时间少,收益中等;毕竟这几种语言学起来容易,上手也容易,要想拿到高收入,得看个人机遇。