The Hard Way Learn Computer Science
写给我的女朋友,一个不愿意减肥的小可爱
如何从零开始成为一个工程师,现在知识如同浩瀚银河,如果没有目标就很容易迷失在知识的海洋之中。
软件工程师分为两种:一种充分理解了计算机科学,从而有能力应对充满挑战的创造性工作;另一种仅仅凭着对一些高级工具的熟悉而勉强应付。
如果是完全的新手请左转 编程新手指南
科目 | 为何要学? |
---|---|
编程 | 编程乃是程序之基础 |
算法与数据结构 | 如果你不懂得如何使用栈、队列、树、图等常见数据结构,遇到有难度的问题时,你将束手无策。 |
计算机架构 | 如果你对于计算机如何工作没有具体的概念,那么你所做出的所有高级抽象都是空中楼阁。 |
计算机网络 | 离开了网络世界,计算机世界也不剩下什么。 |
分布式系统 | 现在的系统绝大多数都是分布式的。 |
操作系统 | 你所写的代码,基本上都由操作系统来运行,因此你应当了解其运作的原理。 |
编程
在此时代如果你说自己仅仅是一个 XXX
语言程序员,那显然是不合格的,一个合格的程序员可以专注于某个领域,但是不能专注于某门语言,因此在现代至少需要学会
- 系统级编程语言: C [
Linux驱动
] > Rust [未来驱动
] - 工具语言: 帮助我们完成一些小工具或者是原型设计
- 工业语言: 一门在行业大规模使用的通用语言 Java Go …
但是这一些还只是 编程语言
,完全达不成 程序设计
的范畴,对于应该如何设计程序,推荐两本书 《面向对象分析与设计》 和 《计算机程序的构造和解释》 分别代表了 OOP
和 FP
的程序应该如何设计,除了对于程序设计,我们还需要知道一些写代码的 工业实践
那这些内容就不得不推荐看一下 《代码大全》。
资料 | 级别 | 为什么是它 |
---|---|---|
计算机程序的构造和解释 | 入门 | 洗礼入教,懂一点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 Memory
的 RTOS
也是可以作为入门的对象,因此本文推荐了三个“从零实现操作系统”
的教程,完成一个操作系统再去看看现在的操作系统会进步的快一点。
当然最后我们需要看看真实世界的操作系统是怎么运作,如果是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
等等,那时候你可以会超过本文推荐的任意一本的深度,你不得不去自学去探索这一切,不用畏惧,你已经有了良好的基础,剩下来的路需要你带上这些武器,披荆斩棘,希望你在计算机的世界玩的开心。