The Hard Way Learn Computer Science

写给我的女朋友,一个不愿意减肥的小可爱

如何从零开始成为一个工程师,现在知识如同浩瀚银河,如果没有目标就很容易迷失在知识的海洋之中。

软件工程师分为两种:一种充分理解了计算机科学,从而有能力应对充满挑战的创造性工作;另一种仅仅凭着对一些高级工具的熟悉而勉强应付。

如果是完全的新手请左转 编程新手指南

科目 为何要学?
编程 编程乃是程序之基础
算法与数据结构 如果你不懂得如何使用栈、队列、树、图等常见数据结构,遇到有难度的问题时,你将束手无策。
计算机架构 如果你对于计算机如何工作没有具体的概念,那么你所做出的所有高级抽象都是空中楼阁。
计算机网络 离开了网络世界,计算机世界也不剩下什么。
分布式系统 现在的系统绝大多数都是分布式的。
操作系统 你所写的代码,基本上都由操作系统来运行,因此你应当了解其运作的原理。

编程

在此时代如果你说自己仅仅是一个 XXX 语言程序员,那显然是不合格的,一个合格的程序员可以专注于某个领域,但是不能专注于某门语言,因此在现代至少需要学会

  1. 系统级编程语言: C [Linux驱动] > Rust [未来驱动]
  2. 工具语言: 帮助我们完成一些小工具或者是原型设计
  3. 工业语言: 一门在行业大规模使用的通用语言 Java Go …

但是这一些还只是 编程语言,完全达不成 程序设计 的范畴,对于应该如何设计程序,推荐两本书 《面向对象分析与设计》《计算机程序的构造和解释》 分别代表了 OOPFP 的程序应该如何设计,除了对于程序设计,我们还需要知道一些写代码的 工业实践 那这些内容就不得不推荐看一下 《代码大全》

资料 级别 为什么是它
计算机程序的构造和解释 入门 洗礼入教,懂一点FP很棒。
面向对象分析与设计 入门 和 FP 抗衡并且赢下了半个世界的 OOP 总是要学对吧
C程序设计语言 入门 最贴近硬件的高级语言,在底层的世界总是逃不了
代码大全 进阶 软件工程研发领域的方方面面
Tutorial: Get started with Go 可选 云原生的最佳语言
The Rust Programming Language 可选 如何写一个安全的代码,Rust 会告诉你答案
The Hard Way to Python3 可选 你总是需要一个方便实现想法的小工具

算法

算法是无限的,但是经典算法是有限的,有成百上千的书可供使用,但是我觉得最经典的莫过于 《算法》,用 Java 描述算是一个不错的选择。花一些时间将算法搞定,是一件受益终身的事情。

资料 级别 为什么是它
算法 入门 正儿八经写给软件工程师看的算法书,并且更关注实践上。
算法心得:高效算法的奥秘 进阶 瞧瞧真实编程世界的一些算法优化手段
编程珠玑 进阶 如何活学活用才是学会的标准

为什么不推荐 算法导论(原书第2版),在我看来这本书更像是一本数学系的数据,是否适合软件工程师是一个大大的问号。

计算机架构

计算机架构——有时候又被称为“计算机系统”或者“计算机组成”——是了解软件底层的的重要视角。根据我们的经验,这是自学的软件工程师最容易忽视的领域。最棒的入门书是 《深入理解计算机系统》

资料 级别 为什么是它
深入理解计算机系统 入门 高屋建瓴的完成一次计算机体系的知识更新。

计算机网络

计算机网络现在已经是逃不了的学科,个人推荐可以先从实操性很强的 CCNA 入门,比较学起来会比较有趣,一下子就会修公司的网了。之后我们需要完善 知识体系,因此推荐 《计算机网络》 ,之后可以单独看下 TCP/IP 然后实现它,那你就会对网络流有8层的掌握,最终看看真实世界的网络是如何被操作系统驱动起来的 **Linux IP Networking**。

资料 级别 为什么是它
CCNA学习指南 入门 建议所有的软件工程师从实践的角度实践下网络设备于IP网络基础。
计算机网络 入门 体系化的学习网络
TCP/IP详解 卷1:协议 进阶 理解协议的原理才能越战越勇
Let’s code a TCP/IP stack 实践 实现一个 TCP IP Stack,多么合乎道理
RFC 793 - Transmission Control Protocol 进阶 拒绝二手知识,好好读一遍协议本身
Linux IP Networking 进阶 只有了解真实的网络才有切实的价值,资料较早,自行过滤过期知识

操作系统

笔者在操作系统上溜达了好多年,发现最终你还是要自己动手去实现才能了解这一切的背后

《现代操作系统》 值得一看,预备一点知识的基础,之后就应该去看一些简单的系统的实现,略过 Virtual MemoryRTOS 也是可以作为入门的对象,因此本文推荐了三个“从零实现操作系统”的教程,完成一个操作系统再去看看现在的操作系统会进步的快一点。

当然最后我们需要看看真实世界的操作系统是怎么运作,如果是Linux推荐:**《Linux内核设计与实现(原书第3版)》**

资料 级别 为什么是它
现代操作系统 预科 了解操作系统应有的抽象
操作系统(哈工大李治军老师 入门 基于 Linux 0.11 讲解一个最简单的系统构成
os-dev && Roll your own toy UNIX-clone OS && Operating Systems: From 0 to 1 进阶 一个操作系统的五脏六腑
MIT 6.828 进阶 完整的完成一个 OS
Linux内核设计与实现(原书第3版) 进阶 了解 Linux 的实现

分布式系统

随着计算机在数量上的增加,计算机需要很多机器联动才能完成一些任务,因此分布式系统已经成了一门显学。推荐的自学参考书是 Martin Kleppmann 的 **《数据密集型应用系统设计》**它是一本为实践者设计的具有很高的可读性的书。
对于喜欢视频课程的人,MIT 的 6.824 是一门很好的在线视频课程,由 Robert Morris 教授的研究生课程,记得做习题。

资料 级别 为什么是它
MIT 6.824 入门 分布式领域的王牌教程
数据密集型应用系统设计 入门 分布式领域的数据系统

*数据库

数据库是较为复杂的多学科构成的领域,很多系统并没有开源,开源的文档或者研究也不算甚多,因此推荐 Readings in Database Systems 作为入门的选项, 《数据库管理系统:原理与设计》 可以作为导论查阅。

数据库笔者涉及甚少,不做推荐了

NEXT

当你完成了这一些,或者在半途,你总是会遇见很多不一样的情况,比如你加入了 CNCF 的社区,为公司编写 API Gateway 等等,那时候你可以会超过本文推荐的任意一本的深度,你不得不去自学去探索这一切,不用畏惧,你已经有了良好的基础,剩下来的路需要你带上这些武器,披荆斩棘,希望你在计算机的世界玩的开心。

Ref