本文档是对TeachYourselfCS[1]内容的中文翻译,原作者为OzanOnay[2]和MylesByrne[3]。如需了解翻译相关信息或帮助改进翻译,请参见本文档结尾[4]。
ThisdocumentisaChinesetranslationofTeachYourselfCS[5],whichiswrittenbyOzanOnay[6]andMylesByrne[7].Formoreinformationaboutthistranslation,pleaserefertotheendofthisdocument[8].
如果你是一个自学成才的工程师,或者从编程培训班毕业,那么你很有必要学习计算机科学。幸运的是,不必为此花上数年光阴和不菲费用去攻读一个学位:仅仅依靠自己,你就可以获得世界一流水平的教育??。
互联网上,到处都有许多的学习资源,然而精华与糟粕并存。你所需要的,不是一个诸如“+免费在线课程”的清单,而是以下问题的答案:
你应当学习哪些科目,为什么?对于这些科目,最好的书籍或者视频课程是什么?在这份指引中,我们尝试对这些问题做出确定的回答。
简而言之大致按照列出的顺序,借助我们所建议的教材或者视频课程(但是最好二者兼用),学习如下的九门科目。目标是先花到个小时学习完每一个科目,然后在你职业生涯中,不时温习其中的精髓??。
科目为何要学?最佳书籍最佳视频编程[9]不要做一个“永远没彻底搞懂”诸如递归等概念的程序员。《计算机程序的构造和解释》[10]BrianHarvey’sBerkeleyCS61A计算机架构[11]如果你对于计算机如何工作没有具体的概念,那么你所做出的所有高级抽象都是空中楼阁。《深入理解计算机系统》[12]BerkeleyCS61C算法与数据结构[13]如果你不懂得如何使用栈、队列、树、图等常见数据结构,遇到有难度的问题时,你将束手无策。《算法设计手册》[14]StevenSkiena’slectures数学知识[15]计算机科学基本上是应用数学的一个“跑偏的”分支,因此学习数学将会给你带来竞争优势。《计算机科学中的数学》[16]TomLeighton’sMIT6.J操作系统[17]你所写的代码,基本上都由操作系统来运行,因此你应当了解其运作的原理。《操作系统导论》[18]BerkeleyCS计算机网络[19]互联网已然势不可挡:理解工作原理才能解锁全部潜力。《计算机网络:自顶向下方法》[20]StanfordCS数据库[21]对于多数重要程序,数据是其核心,然而很少人理解数据库系统的工作原理。《ReadingsinDatabaseSystems》[22](暂无中译本)JoeHellerstein’sBerkeleyCS编程语言与编译器[23]若你懂得编程语言和编译器如何工作,你就能写出更好的代码,更轻松地学习新的编程语言。《CraftingInterpreters》[24]AlexAiken’scourseonLagunita分布式系统[25]如今,多数系统都是分布式的。《数据密集型应用系统设计》[26]MIT6.还是太多?如果花几年时间自学9门科目让人望而却步,我们建议你只专注于两本书:《深入理解计算机系统》和《数据密集型应用系统设计》。根据我们的经验,投入到这两本书的时间可以获得极高的回报率,特别适合从事网络应用开发的自学工程师。这两本书也可以作为上面表格中其他科目的纲领。
为什么要学习计算机科学?软件工程师分为两种:一种充分理解了计算机科学,从而有能力应对充满挑战的创造性工作;另一种仅仅凭着对一些高级工具的熟悉而勉强应付。
这两种人都自称软件工程师,都能在职业生涯早期挣到差不多的工资。然而,随着时间流逝,第一种工程师不断成长,所做的事情将会越来越有意义且更为高薪,不论是有价值的商业工作、突破性的开源项目、技术上的领导力或者高质量的个人贡献。
全球短信系统每日收发约亿条信息,而仅仅靠57名工程师,现在的WhatsApp每日收发亿条。
—BenedictEvans(
BenedictEvans)年2月2日[27]第一种工程师总是寻求深入学习计算机科学的方法,或是通过传统的方法学习,或是在职业生涯中永无止息地学习;第二种工程师通常浮于表面,只学习某些特定的工具和技术,而不研究其底层的基本原理,仅仅在技术潮流的风向改变时学习新的技能。
如今,涌入计算机行业的人数激增,然而计算机专业的毕业生数量基本上未曾改变。第二种工程师的供过于求正在开始减少他们的工作机会,使他们无法涉足行业内更加有意义的工作。对你而言,不论正在努力成为第一种工程师,还是只想让自己的职业生涯更加安全,学习计算机科学是唯一可靠的途径。
然而他们...pic.twitter.