当你熟悉一门技术后,并不是学习的结束,而是另一个开始。再锋利的武器也会随着时间逐渐钝化,具体到软件开发行业本身,每隔7到8年,软件工程师们面向的编程平台、对应的技术、硬件、用户的场景都会大不一样,每一个技术栈都有其擅长和局限的地方,具体流行的技术很可能会不断变化,这就是工程师们常说的「技术过期很快」、「需要不断学习」的直接原因。但当我们细细思考这些变化,有很多是几十年不变的底层逻辑,这些知识也叫「基本功」或「计算机基础」。在十多年的工作经历中,在面试或培养团队时,我时常能听到这样的学习规划:“我现在对 A 语言比较熟悉了,我计划学习 B 语言,拓宽自己技术视野”。在我看来,这种做法比较低效,当你熟练掌握一门的技术后,接下来应该学习的只有两种知识:一种是能使你工作效率有明显提升的,例如从 Objective-C 到 Swift;另一种则是比当前层次更底层的知识,如使用了几十年的算法、网络协议、操作系统、数据库原理等基本功。而后者是你花费大部分时间的地方,因为应用层的具体细化一般是比较明确可现学现用。如果你当前掌握的语言不是像 Javascript ES5 这类设计相对不完善的语言,那下一门最应该学习的语言,是 C/C++,不是为了学习其语法本身,是为了通过它了解计算机系统的底层设计。计算机的底层知识之所以数十年不过时,是因为计算过程中需要解决的基本问题没有变化(在可遇见的未来,量子计算的场景可能会大幅度更新计算的底层方法),例如当大家深入学习内存并发模型和分布式系统时,会发现这与 CPU 多核协同的场景有很多类似的地方。