译文-Teach Yourself Computer Science-自学计算机科学

原文:Teach Yourself Computer Science

注:

  • 所有内容大部分使用google翻译得到,我对其中翻译完全不对的地方做了修改,整体读起来会很奇怪,因为它是英语的句式,但不影响对信息的获取。
  • 对于文中的书,添加了豆瓣的链接,如果有中译本的话也给出了中译本的豆瓣链接。

目录

[TOC]

如果你是一个自学成才的工程师或训练营的毕业生,这份资料值得你拥有。值得庆幸的是,你可以给自己一个世界级的计算机科学(CS)教育,而不用花多少年的时间和一笔小小的财富在学位课程中。

学习资源多的是,有些比其他的好。但你不需要另一个“200+免费在线课程”列表。您需要这些问题:

  • 你应该学习哪些科目为什么
  • 每个科目最好的书籍或视频讲座系列是什么?

本文试图给出最佳答案。

如果觉得后面的内容太多了看下面这段话和科目学习列表就可以了:

使用建议的教科书视频讲座系列,以大致的顺序学习下面的所有九个科目,理想情况下书和视频都学。每个科目花大概花100-200小时,在以后的职业生涯中不断回顾。

科目学习列表

编程-Programming

计算机体系结构-Computer Architecture

  • 为什么学?

    如果你没有一个计算机实际工作的坚实的心智模型,那么你的所有更高层次的抽象将变得脆弱。

  • 最好的书

    《Computer Organization and Design,亚马逊豆瓣》,中:《计算机组成与设计硬件》(豆瓣

  • 最好的视频

    Berkeley CS 61C

算法和数据结构-Algorithms and Data Structures

  • 为什么学?

    如果您不知道如何使用无处不在的数据结构(如堆栈,队列,树和图),则无法解决难题。

  • 最好的书

    《The Algorithm Design Manual,亚马逊豆瓣》,中:《算法设计指南》(豆瓣亚马逊

  • 最好的视频

    Steven Skiena’s lectures

数学-Math for CS

  • 为什么学?

    计算机科学基本上是应用数学的一个分支,所以学习数学会给你一个竞争优势。

  • 最好的书

    《Mathematics for Computer Science,豆瓣pdf

  • 最好的视频

    Tom Leighton’s MIT 6.042J

操作系统-operating system

  • 为什么学?

    你写的大多数代码是由操作系统运行的,所以你应该知道这些如何相互作用。

  • 最好的书

    《Operating Systems: Three Easy Pieces,OSTEP豆瓣

  • 最好的视频

    Berkeley CS 162

计算机网络-Computer Networking

  • 为什么学?

    互联网变成了一个伟大工程:理解它是如何发挥其全部潜力的。

  • 最好的书

    《Computer Networking: A Top-Down Approach,亚马逊》(中:《计算机网络:自顶向下方法,豆瓣》)

  • 最好的视频

    Stanford CS 144

数据库-Databases

编程语言和编译器-Languages and Compilers

  • 为什么学?

    如果您了解语言和编译器是如何工作的,那么您可以编写更好的代码并更轻松地学习新的语言。

  • 最好的书

    《Compilers: Principles, Techniques and Tools,亚马逊》中:《编译原理,豆瓣》)

  • 最好的视频

    Alex Aiken’s course on Lagunita

分布式系统-Distributed Systems

  • 为什么学?

    现在大多数系统都是分布式系统。

  • 最好的书

    《Distributed Systems, 3rd Edition by Maarten van Steen,资源豆瓣老版》(中:《分布式系统原理与范型,豆瓣老版》)

  • 最好的视频

    暂无,麻省理工学院的6.824

为什么学计算机科学

世界上有两种类型的软件工程师:一是那些对计算机科学有足够的理解力,能做富有挑战性的创新工作的人,二是那些因为熟悉一些高级工具而得到称号的人。

两种人都称自己是软件工程师,两种人在他们早期的职业生涯中获得相同的薪水。但是,第一类工程师随着时间的推移,会逐渐获得更多、更满意的工作、有价值的商业工作或突破性的开源项目、技术领导或高质量的个人贡献。

第一类工程师想方设法深入学习计算机科学,无论是通过传统的方式,还是通过在整个职业生涯中不懈的学习。 第二类工程师通常会停留在表面,学习特定的工具和技术而不是基础知识,只是在技术风潮变化的时候才会掌握新的技能。

目前进入这个行业(IT)的人数正在迅速增加,而计算机科学(CS)毕业生人数基本是不变的,(增加的人都不是转业计算机科学出生的)。 第二种工程师的这种供过于求的局面正在开始减少他们的就业机会,使他们得不到行业内更加令人满意的工作。 无论您是努力成为第一类工程师,还是只是寻求更多的工作保障,学习计算机科学是唯一可靠的途径。

科目指导

编程-Programming

大多数本科生的CS课程都是以“介绍”电脑程序设计开始的。这些课程的最佳版本不仅要面向新手,还要面向那些在初次学习代码时错过了相关概念和编程模型的人。

我们对这个内容的标准推荐是经典的《Structure and Interpretation of Computer Programs》(SICP),(中:《计算机程序的构造和解释》(豆瓣)),它是免费在线提供的,麻省理工学院的视频讲座。虽然这些讲座很棒,但我们的视频建议实际上是Brian Harvey的SICP讲座(伯克利的61A课程)。与麻省理工学院的讲座相比,这些内容更加完善,针对的是新生。

我们建议至少通过SICP的前三章进行练习。对于额外的练习,练习一些小的编程问题,如练习章节。

对于那些觉得SICP太具有挑战性的人,我们推荐《How to Design Programs亚马逊豆瓣》(中:《程序设计方法》,豆瓣)。对于那些觉得太简单的人,我们推荐《Concepts, Techniques, and Models of Computer Programming豆瓣》。

计算机体系结构-Computer Architecture

计算机体系结构 - 有时被称为“计算机系统”或“计算机组织” - 是软件表面之下重要的计算机知识。 根据我们的经验,这是自学成才的软件工程师中最被忽视的领域

The Elements of Computing Systems豆瓣》(中:《计算机系统要素》,豆瓣),也被称为“Nand2Tetris”,是一本雄心勃勃的书,试图解释清楚电脑中的一切是如何工作的。 每一章都涉及到构建整个系统的一小部分,从在HDL中编写基本逻辑门,到CPU和汇编程序,一直到一个俄罗斯方块游戏大小的应用程序。

我们建议阅读本书的前六章并完成相关的项目。 这将增进您对机器体系结构与其上运行的软件之间关系的理解。

本书的前半部分(及其所有项目)均可从Nand2Tetris网站免费获得。 也有一个Coursera课程视频

在追求简洁和内聚性的同时,Nand2Tetris进行了深入的研究。 但,现代计算机体系结构中两个非常重要的概念是流水线和存储器层次结构,但是这两者在文中大都不存在。

一旦您对Nand2Tetris的内容感到满意,我们的下一个建议是Patterson和Hennesy的《Computer Organization and Design亚马逊豆瓣》(中:《计算机组成与设计硬件》(豆瓣)),这是一个很好的,现代经典的教科书。 并不是书中的每一部分都是必不可少的。 我们建议按照伯克利的CS61C课程“计算机体系结构的伟大构想”进行具体阅读。 讲义和实验可在网上查阅,过去的讲座在互联网档案上。

算法和数据结构-Algorithms and Data Structures

几十年来我们同意对常见算法和数据结构的熟悉是计算机科学教育中最赋权的方面之一。 这也是培养一般解决问题能力的好地方,在其他各个学习领域都会得到回报。

有数百本书可用,但我们最喜欢的是Steven Skiena的《The Algorithm Design Manual亚马逊豆瓣》,(中:《算法设计指南》(豆瓣亚马逊))。 他显然喜欢算法这类东西,迫不及待想帮助你理解它。 在我们看来,这是一个令人耳目一新的变化,以前更普遍推荐的是Cormen,Leiserson,Rivest&Stein或Sedgewick的书籍。 对于那些学习这些材料主要是为了帮助他们解决问题的人来说,最后两本书往往过于严格。

对于那些喜欢视频讲座的人来说,Skiena慷慨地提供了在线资源。 我们也非常喜欢Tim Roughgarden的课程,可以从斯坦福大学的MOOC平台Lagunita或Coursera获得。 无论你喜欢Skiena还是Roughgarden的演讲风格,都将是个人喜好的问题(意思是说都可以)。

对于练习,我们首选的方法是让学生解决Leetcode上的问题。 这些解决方案和讨论的往往是有趣的问题。 他们还帮助您针对更具竞争力的软件公司的技术访谈中常用的问题来测试进度。 我们建议解决大约100个随机的leetcode问题作为你的学习的一部分。

最后,我们强烈推荐《 How to Solve It亚马逊豆瓣》(中:《怎样解题》,豆瓣),作为解决一般问题的绝佳指南; 它不仅适用于数学也适用于计算机科学。

数学-Math for CS

在某些方面,计算机科学是应用数学的一个分支。 尽管许多软件工程师试图在不同程度上取得成功,但是忽视这一点,我们鼓励您直接学习。 成功地做到这一点,将会给那些没有成功的人带来巨大的竞争优势。

CS最相关的数学领域被广泛地称为“离散数学”,其中“离散”与“连续”是相反的,并且是微积分之外的有趣的应用数学主题的集合。 鉴于含糊的定义,试图涵盖“离散数学”的整个范围是没有意义的。 一个更现实的目标是对逻辑,组合和概率,集合论,图论以及一些通知密码学(informing cryptography)的数论提出有效的理解。 线性代数是一个额外值得研究的领域,因为它在计算机图形学和机器学习中的重要性。

我们建议离散数学的学习起点是LászlóLovász的一套讲稿。 Lovász教授在内容的可接近性和直观性方面做得很好,所以这比起更正式的书来说是一个更好的起点。

对于更高级的学习,我们建议《 Mathematics for Computer Science,豆瓣pdf》,这是省理工学院同名课程的书籍讲义。 该课程的视频讲座也免费提供,是我们推荐的离散数学视频讲座。

对于线性代数,我们建议从《 Essence of linear algebra 》(基本线性代数视频系列)开始,接着吉尔伯特·斯特朗(Gilbert Strang)的书《Introduction to Linear Algebra,亚马逊豆瓣》和视频讲座

操作系统-operating system

《Operating System Concepts,亚马逊豆瓣》(中:《操作系统概念,豆瓣》)(“恐龙书”)和《 Modern Operating Systems,亚马逊》(中:《现代操作系统》,豆瓣)现代操作系统是操作系统上的“经典”书籍。 他们的写作风格都受到了评论,而且这本长达1000页的教科书每隔几年就会被哄抢,以鼓励购买“最新版本”。

《Operating Systems: Three Easy Pieces,OSTEP豆瓣》(应该暂无中译本)是一个很好的选择,可以在线免费获得。 我们特别喜欢这本书的结构,觉得练习非常值得。

OSTEP之后,我们鼓励您通过《 Lion’s commentary on Unix,亚马逊豆瓣》、《The Design and Implementation of the FreeBSD Operating System,亚马逊豆瓣》(中:《FreeBSD操作系统设计与实现,豆瓣》)以及《 Mac OS X Internals,亚马逊豆瓣》等“{OS名称}内部”样式的书来探索特定操作系统的设计决策。

巩固您对操作系统的理解的一个好方法是读取小内核的代码并添加特性。 一个很好的选择是xv6,一个从Unix V6到ANSI C的端口,在x86上维护一个x86课程。 OSTEP有一个潜在的xv6实验室的附录,对潜在的项目充满了很好的想法。

计算机网络-Computer Networking

鉴于如此多的软件工程都在网络服务器和客户端上,计算机科学中最直接有价值的领域之一就是计算机网络。 那些系统地学习网络的自学成才的学生发现,他们终于理解了多年来围绕他们的条款,概念和协议。

我们最喜欢的书是《Computer Networking: A Top-Down Approach,亚马逊》(中:《计算机网络:自顶向下方法,豆瓣》。 本书中的小项目和练习是非常值得的,我们特别喜欢他们在线提供的“Wireshark实验室”。

对于那些喜欢视频讲座的人,我们建议斯坦福大学的MOOC平台Lagunita上提供的《Introduction to Computer Networking course 》(计算机网络入门课程)。

对网络的学习更多的是从项目中获益,而不是从小型演习中获益。 一些可能的项目是:HTTP服务器,基于UDP的聊天应用程序,微型TCP堆栈,代理或负载平衡器以及分布式哈希表。

数据库-Databases

与大多数其他主题相比,我们需要更多的努力来自学数据库系统。 这是一个相对较新的(即1970年代以后)领域,具有强烈的商业激励作用,使创意保持闭门造车(因为赚钱,所以不那么“公开”)。 此外,许多潜在优秀的教科书作者宁愿加入或创办公司。

考虑到这种情况,我们鼓励自学者通常避免使用教科书,并从“Spring 2015 recording of CS 186-2015年春季录制的CS 186课程,主讲:乔·赫勒斯坦(Joe Hellerstein)”伯克利的数据库课程开始,并开始阅读文章。

其中一篇特别值得一提的是“Architecture of a Database System”,(“数据库系统的体系结构”),它特别提供了关系数据库管理系统(RDBMS)如何工作的高级视图。 这将成为进一步学习的有用框架。

《Readings in Database Systems,资源豆瓣》被称为“红皮书”,是Peter Bailis,Joe Hellerstein和Michael Stonebreaker一起编辑的一系列文章。对于那些已经完全掌握“CS 186”课程内容的人来说,红皮书应该是你的下一站。

如果你坚持使用入门教科书,我们建议Ramakrishnan和Gehrke的《 Database Management Systems,亚马逊豆瓣》。对于更高级的学生,Jim Gray的经典《 Transaction Processing: Concepts and Techniques,亚马逊豆瓣》是值得的,但是我们不鼓励将其作为第一学习资源。

如果不编写大量的代码,就很难巩固数据库理论。 CS 186学生给Spark添加了一些功能,这是一个合理的项目,但我们建议从头开始写一个简单的关系数据库管理系统。这当然不会是功能丰富的,但是即使是写出典型RDBMS各个方面最基本的版本也是会有启发性的。

最后,数据建模是数据库工作中被忽视,教学不善的一个方面。我们关于这个主题的建议书是《 Data and Reality: A Timeless Perspective on Perceiving and Managing Information in Our Imprecise World,亚马逊》。

编程语言和编译器-Languages and Compilers

大多数程序员学习语言,而大多数计算机科学家了解语言。这给了计算机科学家一个明显的优势,甚至在编程领域的程序员(也有同样优势,当他们也像计算机科学家一样了解语言的时候)!他们的知识很广发;他们能够比那些只学习特定语言的人更深入,更快地理解新语言的操作。

规范的介绍书是《 Compilers: Principles, Techniques & Tools,亚马逊》(中:《编译原理,豆瓣》),通常被称为“龙书”。不幸的是,这不是为自学而设计的,而是为了让教师选出1-2个学期的课程。这几乎是必不可少的,你挑选的主题,最好在导师的帮助下。

如果您选择使用龙书进行自学,我们建议您按照结构的视频讲座系列,然后根据需要深入龙书,以获得更多的深度。我们推荐的在线课程是Alex Aiken的,可从斯坦福大学的MOOC平台Lagunita获得

作为龙书的潜在替代品,我们建议Terence Parr的《Language Implementation Patterns,亚马逊》(中:《编程语言实现模式,豆瓣》)。它更直接地写给那些打算从事像DSL这样的小型语言项目的执业软件工程师,这可能针对你的项目更为实用。当然,这样做牺牲了一些有价值的理论。

对于项目工作,我们建议编写一个编译器,用于简单的教学语言,如COOL,或者用于您感兴趣的语言子集。那些望而生畏的人可以从Make a Lisp开始,这会引导你完成项目。

分布式系统-Distributed Systems

随着电脑数量的增加,并且它们是分布的。企业以前会购买大的大型机,现在通常情况下即使是非常小的应用程序也可以在多台机器上运行。分布式系统是研究如何权衡这种做法(是大型机还是分布式),这是一项越来越重要的技能。

我们建议的自学教科书是Maarten van Steen和Andrew Tanenbaum的《 Distributed Systems, 3rd Edition,资源豆瓣老版》(中:《分布式系统原理与范型,豆瓣老版》)。与以前的版本相比,这是一个很大的改进,并且由于作者的慷慨解囊,可以免费在线阅读。鉴于分布式系统是一个快速变化的领域,没有任何教科书可以作为指导,但Maarten van Steen’s是我们所见到的最好的基础。

有些视频在线的好的课程是麻省理工学院的6.824(研究生课程,youtube),但不幸的是,录制的音频质量很差,录音是否被授权还不清楚。

无论教科书还是其他辅助资源的选择,分布式系统的研究绝对要求阅读论文这里有一个很好的列表,我们将极力鼓励您参加当地的“ Papers We Love”。

常见问题

AI/graphics/pet-topic-X如何?

我们试图将我们的列表限制在计算机科学的主题上,我们觉得每个软件工程师都应该知道,不管专业或行业。 有了这个基础,您将能够更好地拿起教科书或论文,在没有太多指导的情况下学习核心概念。 以下是我们建议的几个常见“选修课”的起点:

  • 对于人工智能:通过观看视频和完成优秀的Pacman项目来学习Berkeley的AI课程。 作为教科书,使用罗素(Russell )和诺维格(Norvig’s )的《Artificial Intelligence: A modern approach,豆瓣》(中:《人工智能:一种现代的方法,豆瓣》)。
  • 对于机器学习:Andrew Ng的Coursera课程。 要有耐心,确保你在深入了解像深度学习这样闪亮的新话题之前了解基础知识。
  • 对于计算机图形学:通过伯克利的CS 184材料,并使用《Computer Graphics: Principles and Practice ,亚马逊》(中:《计算机图形学原理及实践,豆瓣》)作为一本教科书。

建议的学习顺序有多严格?

实际上,所有这些主题都有很大的重叠,并且是相互循环的。 以离散数学和算法之间的关系为例:首先学习数学将帮助您更深入地分析和理解您的算法,但首先学习算法会为离散数学学习提供更大的动力和背景。 理想情况下,你会在整个职业生涯中多次重温这两个主题。

因此,我们建议的排序主要是为了帮助您开始…如果您有一个令人信服的理由来选择不同的顺序,那就去做吧。 我们认为最重要的“先决条件”是:操作系统或数据库在计算机体系结构之前,分布式系统在网络和操作系统之前。

本指南的目标受众是谁?

我们默认,你是一个自学成才的软件工程师,训练有素的毕业生或早熟的高中生,或者一个大学生希望通过一些自学来补充你的正规教育。 什么时候开始这个旅程是一个完全个人化的问题,但是大多数人在深入研究CS理论之前倾向于从一些专业经验中受益。 例如,我们注意到,如果学生已经在数据库专业上工作过,那么他们就喜欢学习数据库系统;如果他们已经在一个或两个Web项目上工作,那么他们就喜欢使用计算机网络。

这与Open Source Society或freeCodeCamp课程相比如何?

OSS指南的主题太多,其中的提供了许多较差的资源,对于特定课程为什么或哪些方面是有价值的,没有说理由。 我们努力将我们的课程列表限制为您应该了解的,为软件工程师准备的列表,不管您的专业是什么,并且帮助您理解为什么每门课程都包含在内。

freeCodeCamp主要侧重于编程,而不是计算机科学。 为什么你要学习计算机科学,请参阅上文。

某个语言如何?

学习一门特定的编程语言和学习一个计算机科学领域完全不在一个层次上 - 学习一门语言要容易得多,而且要少得多。 如果您已经了解了几种语言,我们强烈建议您简单地按照我们的指导和适应语言习得的差距,或之后离开。 如果你已经学好了编程(比如通过“计算机程序的结构和解释”),特别是如果你已经学过编译器,那么学习新语言的基本要素只需要一个周末。

某个时髦技术如何?

没有哪一项技术是足够重要的,学习使用它应该是你教育的核心部分。 另一方面,你很高兴知道这件事。 诀窍是从特定的技术向下工作到底层领域或概念,并深入了解您的时髦技术如何适应更大的目标。

你们为什么还在推荐龙书?

龙书仍然是讲编译器最完整的单一资源。 它的名声很差,通常过分强调某些不太流行的话题,比如解析。 事情是,这本书从来没有打算全面覆盖,只是为教师提供足够的材料来组成一门课程。 同样,一个自学者可以通过本书选择自己的部分,或者更好地遵循公共课程讲师在课程大纲中提出的建议。

我怎样才能得到廉价的教科书?

我们建议的许多教科书都可以在线免费获得,这要感谢作者的慷慨解囊。 对于那些不免费的,我们建议购买旧版本。 一般来说,如果有一两本以上的教科书版本,很可能旧版本是完全适合的。 即使价格不同,最新的版本比旧版本要好10倍也不太可能!

这份材料是谁做的?

本指南由旧金山布拉德菲尔德计算机科学学院的教师Ozan Onay和Myles Byrne撰写。 这是基于我们教几百名大多是自学成才的工程师和训练营毕业生学习计算机科学的经验写成的。 感谢我们所有的学生对自我教育资源的持续反馈。 感谢Alek Sharma,Omar Rayward,Ammar Mian和Tyler Bettilyon对本指南的反馈意见。

(完)


相关参考:

Teach Yourself Computer Science

A Self-Learning, Modern Computer Science Curriculum

Grow Your Technical Skills with Google