GitHub 上这份计算机自学指南火了~

最近在逛GitHub的时候,发现了一个宝藏开源仓库「TeachYourselfCS-CN」,内容涉及计算机科学专业的自学指南,目前收获了10k+的Star。

这份指南最早是由 Bradfield 计算机科学学院的两名教员 Ozan Onay 和 Myles Byrne 编写的,内容主要源自他们对数千名自学成才的工程师和培训班学生教授计算机科学基础的经验。

此前,一名毕业自上海交通大学,现为微软实习生的开发者 Keith Null 将其翻译成了中文,并将其中文版本正式开源到了 GitHub 上,开源地址为:

https://github.com/izackwu/TeachYourselfCS-CN/blob/master/TeachYourselfCS-CN.md

现把这个自学指南分享给大家看下,下面是正文。


如果你是一个自学成才的工程师,或者从编程培训班毕业,那么你很有必要学习计算机科学。幸运的是,不必为此花上数年光阴和不菲费用去攻读一个学位:仅仅依靠自己,你就可以获得世界一流水平的教育。

互联网上,到处都有许多的学习资源,然而精华与糟粕并存。你所需要的,不是一个诸如 “200 + 免费在线课程” 的清单,而是以下问题的答案:

  • 你应当学习哪些科目,为什么/p>

  • 对于这些科目,最好的书籍或者视频课程是什么/p>

在这份指引中,我们尝试对这些问题做出确定的回答。

简而言之

大致按照列出的顺序,借助我们所建议的教材或者视频课程(但是最好二者兼用),学习如下的九门科目。目标是先花 100 到 200 个小时学习完每一个科目,然后在你职业生涯中,不时温习其中的精髓。

科目 为何要学/th> 最佳书籍 最佳视频
编程 不要做一个 “永远没彻底搞懂” 诸如递归等概念的程序员。 《计算机程序的构造和解释》 Brian Harvey’s Berkeley CS 61A
计算机架构 如果你对于计算机如何工作没有具体的概念,那么你所做出的所有高级抽象都是空中楼阁。 《深入理解计算机系统》 Berkeley CS 61C
算法与数据结构 如果你不懂得如何使用栈、队列、树、图等常见数据结构,遇到有难度的问题时,你将束手无策。 《算法设计手册》 Steven Skiena’s lectures
数学知识 计算机科学基本上是应用数学的一个 “跑偏的” 分支,因此学习数学将会给你带来竞争优势。 《计算机科学中的数学》 Tom Leighton’s MIT 6.042J
操作系统 你所写的代码,基本上都由操作系统来运行,因此你应当了解其运作的原理。 《操作系统导论》 Berkeley CS 162
计算机网络 互联网已然势不可挡:理解工作原理才能解锁全部潜力。 《计算机网络:自顶向下方法》 Stanford CS 144
数据库 对于多数重要程序,数据是其核心,然而很少人理解数据库系统的工作原理。 《Readings in Database Systems》 (暂无中译本) Joe Hellerstein’s Berkeley CS 186
编程语言与编译器 若你懂得编程语言和编译器如何工作,你就能写出更好的代码,更轻松地学习新的编程语言。 《Crafting Interpreters》 Alex Aiken’s course on Lagunita
分布式系统 如今,多数 系统都是分布式的。 《数据密集型应用系统设计》 MIT 6.824

还是太多/h2>

如果花几年时间自学 9 门科目让人望而却步,我们建议你只专注于两本书:《深入理解计算机系统》《数据密集型应用系统设计》。根据我们的经验,投入到这两本书的时间可以获得极高的回报率,特别适合从事网络应用开发的自学工程师。这两本书也可以作为上面表格中其他科目的纲领。

为什么要学习计算机科学/h2>

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

这两种人都自称软件工程师,都能在职业生涯早期挣到差不多的工资。然而,随着时间流逝,第一种工程师不断成长,所做的事情将会越来越有意义且更为高薪,不论是有价值的商业工作、突破性的开源项目、技术上的领导力或者高质量的个人贡献。

全球短信系统每日收发约 200 亿条信息,而仅仅靠 57 名工程师,现在的 WhatsApp 每日收发 420 亿条。

— Benedict Evans (@BenedictEvans) 2016 年 2 月 2 日

第一种工程师总是寻求深入学习计算机科学的方法,或是通过传统的方法学习,或是在职业生涯中永无止息地学习;第二种工程师 通常浮于表面,只学习某些特定的工具和技术,而不研究其底层的基本原理,仅仅在技术潮流的风向改变时学习新的技能。

如今,涌入计算机行业的人数激增,然而计算机专业的毕业生数量基本上未曾改变。第二种工程师的供过于求正在开始减少他们的工作机会,使他们无法涉足行业内更加有意义的工作。对你而言,不论正在努力成为第一种工程师,还是只想让自己的职业生涯更加安全,学习计算机科学是唯一可靠的途径。

23333 然而他们… pic.twitter.com/XVNYlXAHar

— Jenna Bilotta (@jenna) 2017 年 3 月 4 日

分科目指引

编程

大多数计算机专业本科教学以程序设计 “导论” 作为开始。这类课程的最佳版本不仅能满足初学者的需要,还适用于那些在初学编程阶段遗漏了某些有益的概念和程序设计模式的人。

对于这部分内容,我们的标准推荐是这部经典著作:《计算机程序的构造和解释》。在网络上,这本书既可供免费阅读(英文版),也作为 MIT 的免费视频课程。不过尽管这些视频课程很不错,我们对于视频课程的推荐实际上是 Brian Harvey 开设的 SICP 课程(即 Berkeley 的 61A 课程)。比起 MIT 的课程,它更加完善,更适用于初学者。

我们建议至少学完 SICP 的前三章,并完成配套的习题。如果需要额外的练习,可以去解决一些小的程序设计问题,比如 exercism。

中文翻译新增:

  • 关于 SICP 国内视频观看地址

    • MIT 的免费视频课程(中英字幕)

    • Brian Harvey 开设的 SICP 课程(英文字幕)

  • Scheme 学习的相关资源参见:https://github.com/DeathKing/Learning-SICP

  • 更详细的补充说明:#3

自从 2016 年首次发布这份指南以来,最常被问到的一个问题是,我们是否推荐由 John DeNero 讲授的更新的 CS 61A 课程,以及配套的书籍 《Composing Programs》,这本书 “继承自 SICP” 但使用 Python 讲解。我们认为 DeNero 的课程也很不错,有的学生可能更喜欢,但我们还是建议把 SICP, Scheme 和 Brian Harvey 的视频课程作为首选。

为什么这么说呢为 SICP 是独一无二的,它可以 —— 至少很有可能 —— 改变你对计算机和编程的基本认识。不是每个人都有这样的体验。有的人讨厌这本书,有的人看了前几页就放弃了。但潜在的回报让它值得一读。

如果你觉得 SICP 过于难,试试 《Composing Programs》。如果还是不合适,那我们推荐 《程序设计方法》(中文版,英文版) ;如果你觉得 SICP 过于简单,那我们推荐 《Concepts, Techniques, and Models of Computer Programming》 。如果读这些书让你觉得没有收获,也行你应该先学习其他科目,一两年后再重新审视编程的理念。

新版原文删除了对 《Concepts, Techniques, and Models of Computer Programming》 一书的推荐,但这本书对各种编程模型有深入的见解,值得一读。所以译文中依然保留。 — 译者注

最后,有一点要说明的是:本指南不适用于完全不懂编程的新手。我们假定你是一个没有计算机专业背景的程序员,希望填补一些知识空白。事实上,我们把 “编程” 章节包括进来只是提醒你还有更多知识需要学习。对于那些从来没有学过编程,但又想学的人来说,这份指南更合适。

a2f3b413f1407dd70ccc61f798178964.png

硬件是平台。

— Mike Acton, Engine Director at Insomniac Games (观看他在 CppCon 上的演说)

算法与数据结构

正如几十年来的共识,我们认为,计算机科学教育所赋予人们的最大能量在于对常见算法和数据结构的熟悉。此外,这也可以训练一个人对于各种问题的解决能力,有助于其他领域的学习。

关于算法与数据结构,有成百上千的书可供使用,但是我们的最爱是 Steven Skiena 编写的 《算法设计手册》。显而易见,他对此充满热爱,迫不及待地想要帮助其他人理解。在我们看来,这本书给人一种焕然一新的体验,完全不同于那些更加经常被推荐的书(比如 Cormen,Leiserson,Rivest 和 Stein,或者 Sedgewick 的书,后两者充斥着过多的证明,不适合以 解决问题 为导向的学习)。

如果你更喜欢视频课程,Skiena 慷慨地提供了他的课程。此外,Tim Roughgarden 的课程也很不错, 在 Stanford 的 MOOC 平台 Lagunita,或者 Coursera 上均可获得。Skiena 和 Roughgarden 的这两门课程没有优劣之分,选择何者取决于个人品味。

至于练习,我们推荐学生在 Leetcode 上解决问题。Leetcode 上的问题往往有趣且带有良好的解法和讨论。此外,在竞争日益激烈的软件行业,这些问题可以帮助你评估自己应对技术面试中常见问题的能力。我们建议解决大约 100 道随机挑选的 Leetcode 问题,作为学习的一部分。

最后,我们强烈推荐 《怎样解题》。这本书极为优秀且独特,指导人们解决广义上的问题,因而一如其适用于数学,它适用于计算机科学。

9885fb3886697fb7b11f0c98e714b16d.png

如果人们不相信数学是简单的,那么只能是因为他们没有意识到生活有多么复杂。

— John von Neumann

操作系统

《操作系统概念》 (“恐龙书”)和 《现代操作系统》 是操作系统领域的经典书籍。二者都因为写作风格和对学生不友好而招致了一些批评。

《操作系统导论》(Operating Systems: Three Easy Pieces) 是一个不错的替代品,并且可在网上免费获得(英文版)。我们格外喜欢这本书的结构,并且认为这本书的习题很值得一做。

在读完《操作系统导论》后,我们鼓励你探索特定操作系统的设计。可以借助 “{OS name} Internals” 风格的书籍,比如 Lion’s commentary on Unix, The Design and Implementation of the FreeBSD Operating System,以及 Mac OS X Internals。对于 Linux ,我们推荐 Robert Love 的 《Linux 内核设计与实现》

为了巩固对操作系统的理解,阅读小型系统内核的代码并且为其增加特性是一个很不错的方法。比如,xv6,由 MIT 的一门课程所维护的从 Unix V6 到 ANSI C 和 x86 的移植,就是一个很棒的选择。《操作系统导论》有一个附录,记载了一些可能的 xv6 实验项目,其中充满了关于潜在项目的很棒想法。

c42d9b877438f529b788a4b8fa35a089.png

你无法盯着水晶球预见未来,未来的互联网何去何从取决于社会。

— Bob Kahn

数据库

比起其他主题,自学数据库系统需要更多的付出。这是一个相对年轻的研究领域,并且出于很强的商业动机,研究者把想法藏在紧闭的门后。此外,许多原本有潜力写出优秀教材的作者反而选择了加入或创立公司。

鉴于如上情况,我们鼓励自学者大体上抛弃教材,而是从 2015 年春季学期的 CS 186 课程(Joe Hellerstein 在 Berkeley 的数据库课程)开始,然后前往阅读论文。

对于初学者,有一篇格外值得提及的论文:“Architecture of a Database System”。这篇论文提供了独特的对关系型数据库管理系统(RDBMS)如何工作的高层次观点,是后续学习的实用梗概。

《Readings in Database Systems》,或者以数据库 “红书” 更为人知,是由 Peter Bailis,Joe Hellerstein 和 Michael Stonebraker 编纂的论文合集。对于那些想要在 CS 186 课程的水平更进一步的学习者,“红书” 应当是下一步。

如果你坚持一定要一本导论教材,那我们推荐 Ramakrishnan 和 Gehrke 所著的 《数据库管理系统:原理与设计》。如需更深一步,Jim Gray 的经典著作 《Transaction Processing: Concepts and Techniques》 值得一读,不过我们不建议把这本书当作首要资源。

如果没有编写足够数量的代码,很难巩固数据库理论。CS 186 课程的学生给 Spark 添加特性,倒是不错的项目,不过我们仅仅建议从零实现一个简单的关系型数据库管理系统。自然,它将不会有太多的特性,但是即便只实现典型的关系型数据库管理系统每个方面最基础的功能,也是相当有启发的。

最后,数据模型往往是数据库中一个被忽视的、教学不充分的方面。关于这个主题,我们推荐的书籍是 Data and Reality: A Timeless Perspective on Perceiving and Managing Information in Our Imprecise World

67a88906eedc9443911f5b24520f60bc.png

不要做一个只写样板代码的程序员。相反,给用户和其他程序员创造工具。从纺织工业和钢铁工业中学习历史教训:你想制造机器和工具,还是操作这些机器/p>

— Ras Bodik 在他的编译器课程伊始

分布式系统

随着计算机在数量上的增加,计算机同样开始 分散。尽管商业公司过去愿意购买越来越大的大型机,现在的典型情况是,甚至很小的应用程序都同时在多台机器上运行。思考这样做的利弊权衡,即是分布式系统的研究所在,也是越来越重要的一项技能。

我们推荐的自学参考书是 Martin Kleppmann 的 《数据密集型应用系统设计》。与传统的教科书相比,它是一本为实践者设计的具有很高的可读性的书,并且保持了深度和严谨性。

对于那些偏爱传统教材,或者希望可以从网上免费获取的人,我们推荐的教材是 Maarten van Steen 和 Andrew Tanenbaum 所著的 《分布式系统原理与范型》(中文第二版,英文第三版)

对于喜欢视频课程的人,MIT 的 6.824 是一门很好的在线视频课程,由 Robert Morris 教授的研究生课程,在这里可以看到课程安排。

不管选择怎样的教材或者其他辅助资料,学习分布式系统必然要求阅读论文。这里有一个不错的论文清单,而且我们强烈建议你出席你当地的 Papers We Love(仅限美国)。

6eee76c8a4bea3797716174aefe4389c.gif

·················END·················

推荐大家关注下面公众号

每天分享一个GitHub项目

文章知识点与官方知识档案匹配,可进一步学习相关知识算法技能树首页概览33834 人正在系统学习中

来源:程序IT圈

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年10月22日
下一篇 2021年10月22日

相关推荐