国家统计局的数据显示,2016 年信息传输、软件和信息技术服务业年平均工资为 122478 元,首超金融行业,并于 2017 年再次夺魁。
在互联网和人工智能浪潮的推动下,一大批年轻人选择了 CS(计算机科学) 专业,这里面还包括各种转专业的学生。
此前营长也给大家推荐过很多学习资源,但是大多都是单个资源,比较零散。其实,很多读者需要的是建议,而不仅仅是资源。
特别是对于自学的小伙伴来说,为什么要学习 CS?应该学习什么?如何选择教材或者视频课程?都是让人困扰的问题。
我们知道,任何行业的从业人员的专业水平都是参差不齐的。有人将软件工程师也分成了两类:一类是对 CS 这门学科理解透彻,可以胜任各种挑战性和创新性的工作;另一类则仅仅是对一些高级工具比较熟悉而已。
虽然两者都自称为软件工程师,而且一开始的起薪都差不多,但是第一类工程师显然有更大的发展空间。
比如 WhatsApp 一天要处理 420 亿条信息(2016 年 2 月),但当时 WhatsApp 只有 57 名工程师,要完成这个挑战靠第二种类型的工程师是不太可能的。
其实 CS 不只是编程,还涉及到很多知识。本文将重点介绍编程、计算机架构、算法和数据结构、数学、操作系统、计算机网络、数据库、计算机语言和编译器、以及分布式系统。接下来我们一一分析。
计算机系统结构是最容易被自学者忽略的,但是它其实非常重要。营长推荐 The Elements of Computing Systems 这本书,建议至少看完前 6 章并完成相应的作业。不过这本书并不是完全免费,因此也可以选择伯克利大学的 CS61C 课程:Great Ideas in Computer Architecture,而且可以下载之前的讲义。
学好算法和数据结构,将有助于培养你解决问题的能力。营长推荐 The Algorithm Design Manual 这本书,但是真的很贵。不过,这本书的作者很慷慨把这本书的配套视频免费共享到了网上。如果你想练练手,则可以选择刷 Leetcode。
虽然很多人对畏惧数学,但是“计算机之父”冯诺依曼曾经说过:如果人们不相信数学有多简单,那是因为他们没意识到生活有多复杂。
至于线性代数,则建议从 Essence of linear algebra 视频系列开始,然后是麻省理工的相关视频课程。
自学数据库还是比较难的。营长建议自学者不要直接看教材,而是通过在线视频来学习,比如伯克利的 CS168 课程。那些想了解 RDBMS(关系型数据库管理系统)的读者,一定要看一下 Architecture of a Database System 这篇论文。此外,Readings in Database Systems 也值得一读。
对于自学者,营长推荐斯坦福的在线课程:Compilers。关于练手项目,营长建议你从 Make a Lisp 开始。
分布式系统的教材可以选择 Distributed Systems, 3rd Edition,而且是免费的。同时你也可以选择麻省理工的在线。而且营长还准备了一份论文清单,供你参考。
有人可能会问,应该从那一门开始学起?然而这并不是最重要的,克服拖延症,行动起来才是关键,而且每一门都需要全身心投入至少 100~200 小时的时间。

