学习底层技术的必要性
所谓底层软件,就是被应用层软件依赖的软件。比如数据库,缓存,网络服务器等。程序员如果走技术路线,离不开底层知识。因为学习底层知识可以:
- 提升技术深度。软件开发的门槛一直在降低,尤其是有了AI工具之后。这是因为大部分开发工作其实是在拼接或调用已有的组件。可以尝试在技术深度上增加竞争力。
- 增加工作机会。程序员不必限定在低门槛的 CRUD 工作中,更不必用语言、框架来限定自己。各种层面的软件都需要人来开发。这就需要提前学习底层知识。
- 增强工作能力。即使不是直接参与底层开发,日常工作中的排查问题、性能优化、架构设计也要用到大量计算机知识。如果没有系统化的学习和实践,就难以掌握。
通过动手做项目来学习底层开发
编程是实操技能,所以要结合项目来学习。比如手写数据库,Redis,HTTP服务器。
- 通过动手来验证学习成果。许多底层知识,包括操作系统、网络、数据结构等,都是计算机专业的课程,然而大部分程序员只是了解,工作中没有应用。这类项目创造了实践机会。
- 可参考真实项目,需求明确,不会闭门造车。
- 有利于求职。一个有技术深度的项目可以作为亮点,尤其是没有项目经历的学生。面试时如果问到底层技术,你可以告诉对方,你自己代码实现过,强于背诵八股文。
学习路线
各种底层软件涉及到的知识,主要分成这几块:
- Linux 下的开发:网络、并发、操作系统等。
- 计算机基础知识:数据结构、计算机原理(二进制、内存、指针、CPU指令等)。
- 编程语言:C, C++, Rust。这些是能直接触达硬件和操作系统API的语言。
作者挑选了一些“从0开始实现X”的项目和教程,全面覆盖这些知识。这些项目既是一个循序渐进的学习途径,也是自身能力的证明。完成其中任何一个都会让你在求职时脱颖而出。
项目1:从0开始实现 Redis
Redis 涵盖的底层知识较广:Linux API、网络编程、数据结构等。网上有个高质量教程:
Build Your Own Redis with C/C++
因为各种知识都有涉及,所以适合入门学习。而且这个教程是按照实用的角度来编写的,没有过度简化,可以深入学习。
项目2:从0开始写数据库
很多复杂的底层技术背后的原理其实都不难。比如数据库原理,虽然网上有各种理论资料,但很多都是管中窥豹。能教你完整的实现一个数据库的教程不多见。但根据作者的实践,只需3000行代码,就可以实现核心功能(SQL,储存,索引,并发)。
-
作者正在编写的教程。从零开始实现 KV 存储引擎,SQL,LSM树索引等。教程由几十个循序渐进的小步骤组成,每步最多几十行代码,并有测试用例来指引。
Build Your Own Database in Go:
在 Reddit 和 HN 上很火的教程。完整度高,包含 B+tree、SQL、事务、并发。
项目3:编译器/解释器
通过自己创造一门编程语言,来学习计算机如何运作、学习汇编、深入理解编程语言。
-
跨度很广的项目。虚构了一个计算机,从底层的逻辑门一直学到顶层的编程语言。
From Source Code To Machine Code:
简单的编译器,输出可运行的 binary,完成后很有成就感。学习 x64 汇编和底层细节。
Learn C & Build Your Own Lisp:
非常简单的解释器,顺带入门C语言。如果有选择困难,就从这个最简单的项目开始吧。