Skip to main content

路线图

注意

这是一份偏软件方向的路线图,主要适用于软件工程师方向的。 我们精选了美国顶尖大学最负盛名的计算机科学核心基础课程,力求为你呈现最精华的学习内容。虽然在课程筛选过程中我们尽可能避开了难度过高的选项,但不可否认,这些课程仍具有相当的挑战性。 请做好充分的心理准备:你即将面对的是真正的"硬核"CS课程。这些课程之所以享誉全球,正是因为它们深入浅出,能够有效培养学习者的计算机科学思维和解决问题的能力。 在开始学习之旅前,请始终铭记:真正有价值的事情往往充满挑战。这条学习之路可能会让你感到吃力,甚至偶尔沮丧,但克服这些困难后,你将获得的不仅是知识,更是解决复杂问题的能力和持续学习的毅力。这些正是区分普通程序员和卓越软件工程师的关键所在。

这份精简路线图,旨在帮助你掌握顶级科技公司青睐的核心计算机科学理念和工程实践。这份路线图不拘泥于特定专业或行业,而是聚焦于最基础、最关键的知识点。 这份路线图分为两个主要部分:

  1. 核心基础课程: 包括CS50和CS61系列课程,以及相关数学课程。这些构成了计算机科学专业的基础知识体系,为后面的学习打下坚实的理论基础。

  2. 高级系统与原理课程: 包括计算机网络、编译原理、操作系统、分布式系统和数据库系统。这些课程深入探讨了计算机科学的核心领域,同时与日常软件开发实践密切相关。虽然它们是理论性较强的课程,但它们所涵盖的知识在现代软件开发中起着关键作用。通过学习这些课程,开发者能够更深入地理解软件系统的各个层面,从而在日常开发中做出更明智的设计决策,解决更复杂的技术问题,并进行更有效的性能优化。

考虑到学习时间有限,我们特意挑选了难度适中、易于理解的课程,力求在有限时间内取得最佳学习效果。掌握这些基础后,你将能够更轻松地自主深入学习。 如今,即便没有传统的计算机科学教育背景,也能成为软件工程师。但是,仅会开发应用的工程师与能够设计、构建和维护大规模系统的高级工程师之间仍存在明显差距。我们的目标就是帮助你系统地缩小这一差距。 无论你是对学校课程不满的在校生,还是感觉基础不扎实的在职工程师,按照这个路线图学习,都能获得扎实的计算机科学功底,达到优秀CS本科毕业生的水平。

简要

大致按照列出的顺序,借助我们所建议的教材或者视频课程(但是最好二者兼用),学习如下的科目。目标是先花 100 到 200 个小时学习完每一个科目,完成基础学习后,根据你的职业规划和个人兴趣,选择特定的细分领域进行深入研究。计算机科学领域广阔,找到你真正热爱的方向很重要。

主题课程介绍教材视频讨论组
编程入门Harvard CS50哈佛大学的CS50课程是一门面向所有学生的计算机科学导论课程,非常适合小白入门。该课程旨在教授计算机科学的基本概念和编程技能,并帮助学生理解计算机科学在当今世界的重要性。中文语音 | 英文原声discord
UC Berkeley CS61ACS61A《Structure and Interpretation of Computer Programs》中文名称《计算机程序的结构与解释》 该课程是伯克利大学最受欢迎的课程之一,每年有超过 10,000 名学生注册。 该课程旨在帮助学生理解计算机程序的构造和解释,培养学生的编程能力和解决问题的能力。 在线教材 | 在线教材中译版本 中文语音 | 英文原声discord
算法与数据结构UC Berkeley CS61BCS61B: 《Data Structures and Algorithms》。 CS 61系列是计算机科学的介绍,特别强调以程序员的视角来看软件和机器。CS 61A涵盖了高级问题解决方法,为您提供了将编程问题的解决方案组织为函数组合、对象集合或规则集的多种方式。在CS61B中,更详细地(在某种程度上更基础地)关注编程的效率,特别侧重于编写程序(设计)和运行程序(运行时)的效率。本课程没有指定的教科书,但有推荐的阅读材料和书籍 中文语音 | 英文原声discord
计算机系统结构UC Berkeley CS61CCS61C:《Great Ideas in Computer Architecture》,伯克利大学的计算机科学CS61系列的最后一门课程,同61A,61B一样声名远播,这门课程关注的是计算机架构中的重要概念。它以C语言和RISC-V汇编语言为基础,深入剖析数字电路和CPU硬件实现。课程还涵盖了计算机系统的抽象层面,包括cache、虚拟内存、I/O的原理,并且深入探讨了并行计算。P&H,K&R,WSC,CSAPP中文语音 | 英文原声discord
计算机科学中的数学MIT 18.01《Single Variable Calculus》单变量微积分是麻省理工学院的基础课程,它在理解科学、工程、经济学和计算机科学等学科中扮演着重要角色。这门入门微积分课程涵盖了单变量函数的微分和积分,以及其应用。西蒙斯,乔治·F. 《解析几何与微积分》第二版。中文语音 | 英文原声discord
MIT 18.02《Multivariable Calculus》多变量微积分,继单变量函数的微分积分之后,这门课程涵盖了多元函数的微分、积分和矢量微积分。这些数学工具和方法在物理科学、工程学、经济学和计算机图形学中被广泛应用。《Multivariable Calculus》第六版中文语音 | 英文原声discord
MIT 18.06这门课程涵盖了矩阵理论和线性代数,强调在其他学科中有用的主题。线性代数是数学的一个分支,研究线性方程组和矩阵的性质。线性代数的概念在物理学、经济学和社会科学、自然科学以及工程学中都非常有用。由于其广泛的应用范围,线性代数是大学数学中教学最广泛的学科之一(在高中也越来越受到重视)。《线性代数导论》第四版 | 《线性代数导论》第五版中文语音 | 英文原声discord
MIT 6.042J本课程为计算机科学与工程领域提供离散数学的互动式入门教学。内容大致分为三部分:数学基础概念:定义、证明、集合、函数、关系;离散结构:图论、状态机、模运算、计数;离散概率论。完成6.042J课程后,学生将能够解释并应用离散(非连续)数学的基本方法于计算机科学中。他们将在后续的算法设计与分析、可计算性理论、软件工程及计算机系统等课程中运用这些方法中文语音 | 英文原声discord
操作系统UC Berkeley CS162本课程旨在教授操作系统设计及在其他计算机系统中出现的操作系统概念。涵盖的主题包括操作系统概念、系统编程、网络与分布式系统以及存储系统,具体内容涉及多程序系统(进程、进程间通信与同步)、内存分配(分段、分页)、资源分配与调度、文件系统、基础网络(套接字、分层架构、API接口及可靠性)事务处理机制以及安全性与隐私保护等。《Operating Systems: Principles and Practice》 中文语音 | 英文原声discord
计算机网络Stanford CS144CS144 是一门计算机网络入门课程,涵盖网络基本原理如分组交换、分层封装和协议。课程中将探索互联网的工作原理,并实践构建网络基础设施,如路由器和数据传输服务。通过动手实验和课堂练习,你将深入了解支撑万维网、视频流媒体和视频会议等应用的底层技术。此外,课程还包含行业专家的特邀讲座,提供实际网络运营的宝贵见解。中文语音 | 英文原声discord
数据库CMU 15-445是的,这是卡内基梅隆大学关于数据库管理系统设计与实现的首屈一指的课程。课程内容涵盖数据模型(关系型、文档型、键值对)、存储模型(n元组、分解法)、查询语言(SQL、存储过程)、存储架构(堆式、日志结构)、索引与过滤器(保序树、哈希表、向量索引)、事务处理(ACID属性、并发控制)、恢复机制(日志记录、检查点)、查询处理(连接操作、排序算法、聚合函数及优化)以及并行架构设计(多核计算与分布式系统)。通过开源和商业数据库系统的案例分析,深入探讨这些技术及其权衡取舍。本课程适合那些准备充分并愿意磨练其系统编程技能的学生。 《Database System Concepts》 中文语音 | 英文原声discord
编译原理Stanford CS143本课程将深入探讨编译器的前端(词法分析、语法分析、语义分析)和后端(代码优化、目标代码生成、指令调度等)的核心技术。学生将学习如何构建语言处理工具,掌握编译技术理论并通过项目实践应用这些知识。 《编译原理》通常称为龙书中文语音 | 英文原声discord
分布式系统MIT6.824随着计算机在数量上的增加,计算机同样开始 分散。尽管商业公司过去愿意购买越来越大的大型机,现在的典型情况是,甚至很小的应用程序都同时在多台机器上运行。思考这样做的利弊权衡,即是分布式系统的研究所在,也是越来越重要的一项技能。中文语音 | 英文原声discord

分科目说明

编程入门

计算机专业的本科教育通常以程序设计「导论」课程作为入门。卓越的导论课程不仅能满足初学者的需求,还能为那些已有编程基础但可能错过某些关键概念和设计模式的学生提供价值。这类课程旨在夯实基础,填补知识空白,同时为学生未来的编程之路奠定坚实基础。它们融合了基础知识和进阶技巧,既能启发新手,又能丰富有经验者的技能库。通过这样全面而灵活的教学方法,「导论」课程成为计算机教育中不可或缺的一环,为学生的长期发展提供了良好的起点。

推荐课程

  • cs50x

有些人可能会觉得CS50X这门课程过于简单或者啰嗦,但实际上,这门课程的内容并不简单,它全面涵盖了计算机科学的基础知识,包括算法、数据结构、软件工程,以及网络。学习CS50X将会让你对计算机科学有一>个比较全面的理解学完之后对计算机科学不再那么迷茫,而且还有机会学习多种编程语言,包括C、Python和JavaScript,以及SQL、CSS和HTML。因为是面向所有人的基础导论课程,因此,教授在讲解时循序渐进会>尽可能详细和清晰,以确保每个人都能跟上。这种教学方式可能会让一些已经有一定基础的学生觉得啰嗦,但对于初学者来说,这无疑是非常有帮助的。所以将 CS50X 作为计算机科学入门第一课是非常好的选择。 CS50X提供了丰富的课程资源包括

  • 课程网站
  • Lecture
  • Video | 课程视频
  • Slider | 课程PPT
  • soruce code | 课程代码
  • notes | 课程笔记
  • shorts(对单个知识点回顾重点讲解)
  • Section(课后作业思路讲解)
  • Practice Problems(除了lab,Problem Set 之外可选做的练习题)
  • Lab (课程实验,可以与同学合作完成)
  • Problem Set (课程作业,需要每个人独立完成)
  • cs 61A

说到CS 61A,不得不提及一部与该课程同名的经典著作 《Structure and Interpretation of Computer Programs》,中文译本 《计算机程序的构造和解释》也就是大名鼎鼎的SICP。很多大学的计算机专业本科程序设计「导论」课程都以SICP为教材,其中大> 家较为熟知的有

  • MIT6.001 由SICP的作者之一 Hal Abelson 授课。以LISP的变体scheme为授课语言。

  • UCB CS61A Brian Harvey 开设的 SICP 课程,该课程也是以scheme为授课语言。Spring 2011是该课 程的最后一版,后续的课程更新为以Python为授课语言。比起 MIT 的课程,它更加完善,更适用于初学者。

  • John DeNero 讲授的更新的 CS 61A 课程,升级后的课程继承了SICP但使用Python语言讲解。而且为课程重新编写了配套书籍 Composing Programs。 考虑到python是当下使用范围最广的编程语言之一且学习难度低,所以本指南选用UCB更新后的 CS 61A 课程。但强烈建议学有余力的同学阅读 SICP 结合 Brian Harvey 的 CS61a 课程学习SICP。因为 SICP 是> 独一无二的,它可以很有可能改变你对计算机和编程的基本认识。不是每个人都有这样的体验。有的人讨厌这本书,有的人看了前几页就放弃了。但潜在的回报让它值得一读。 cs61a(新版) 提供了丰富的课程资源包括:

  • 课程网站

  • Videos | 提前录制的由John DeNero 授课的课程视频

  • Recordings | 课堂实录(内容跟video一样,需要登陆 bcourses.berkeley.edu 账号才能观看)

  • slides | 课程PPT

  • Textbook | 阅读教材

  • Lab | 实验

  • Discussions | 讨论环节的问题集

  • Homework | 作业

  • Projects | 项目

虽然CS50,CS61a 都是CSEE学科的编程入门基础课程,但是直接上手CS61A 对学习能力有一定的要求,所以建议先学习CS50x,然后学习CS61A,以免因学习难度过高而导致信心受挫

算法与数据结构

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

  • 《Introduction to Algorithms》(中文译本《算法导论》)通常被称为"CLRS" 这本书是算法领域的经典之作。在MIT被用作 6.006和6.046课程的教材,难度较大。
  • 《Algorithms (4th Edition)》 算法领域经典的参考书,通常被称为算法红宝书,浅显易懂是一本不可多得的算法入门书。如果你更喜欢观看视频课程,普林斯顿大学(本书作者任教的学校)在Coursera 上 慷慨地提供了配套课程 Algorithms I Algorithms II

如果你不太喜欢太多的证明过程,和大量的数学公式,偏向于以解决问题为向导的学习 《the algorithm design manual》(中文译本《算法设计手册》是你的不二之选。这本书给人一种焕然一新的体验,完全不同于以上两本书。如果你喜欢观看视频课程Skiena 慷慨地提供了他的课程

推荐课程

  • cs 61B

伯克利 CS61 系列的第二门课程,深入到更为细致(一定程度上也更基础)的编程层面,专注于编写程序的设计效率以及运行时的性能优化,注重数据结构与算法的设计。课程涵盖了每位严肃程序员必须了解的关于算> 法和数据结构的核心知识,重点在于应用以及对Java实现进行科学性能分析,课程假设您没有任何Java经验,前期会迅速讲解基础的Java语法。 课程资源包括:

  • 课程网站
  • Videos | 由Josh Hug 录制的授课的课程视频
  • Recordings | 课堂实录(内容跟video一样,需要登陆 bcourses.berkeley.edu 账号才能观看)
  • slides | 课程PPT
  • Textbook | 阅读教材
  • Lab | 实验
  • Discussions | 讨论环节的问题集,分三种类型
    • Bridge:助教带领一个专为当周不太熟悉材料的学生设计的两小时讨论课(在课程网站上没有)
    • Regular :已跟上课程进度并准备应对中等难度问题的讨论课
    • Exam-Level :熟悉考试级别的问题及解题策略的讨论课
  • Homework | 作业
  • Projects | 项目

后续进阶课程

  • cs170:高效算法与难解问题

计算机系统结构

如果你对于计算机如何工作没有具体的概念,那么你所做出的所有高级抽象都是空中楼阁。计算机系统结构——有时候又被称为「计算机系统」或者「计算机组成」——是了解软件底层的的重要视角。 关于计算机系统结构,不得不提及一本书「Computer Systems: A Programmer’s Perspective」——中文译本「深入理解计算机系统」,因为它太经典了,各种版本的“程序员必读书单”都要推荐它,它还是卡内基梅隆大学计算机系主任 Bryant 为镇系神课 15-213/15-513 而编写的教材。

推荐课程

CMU的15-213/15-513课程无疑是一门优秀的课程,但其内容繁杂,项目难度巨大,自学需要坚定的决心和扎实的编程基础。为了避免在学习过程中信心受挫,我建议您考虑另一门同样经典且优秀,但难度稍微适中的课程:加州大学伯克利分校的CS61C。如果您希望对计算机系统有更全面的理解,我仍然强烈推荐您结合CMU 15-213/15-513课程,深入研读"深入理解计算机系统"这本大部头。

  • cs 61C

UCB CS61系列的最后一门课程主要专注于计算机架构的核心概念。这门课程涵盖了一系列主题,包括:C语言和汇编语言编程、高级程序到机器语言的转换、计算机的组织结构、缓存技术、性能评估、并行处理、CPU> 设计,以及仓库级计算和相关议题。对于那些不熟悉C语言的学生,建议他们提前阅读《C Programming Language》等相关书籍,以掌握C语言的基本语法。 课程资源包括:

  • 课程网站
  • Lecture Video
  • Lecture Slides
  • Discussions | 讨论环节的问题集
  • Homework | 需要登陆账户才能查看作业
  • Lab | 实验
  • Projects | 项目

后续进阶课程

  • cs cs152:计算机体系结构与工程

数学知识

计算机科学与数学有着深厚的渊源,可以说是应用数学的一个高度发展的分支。虽然在日常工作中,一些软件工程师可能觉得自己很少直接运用数学知识,但数学思维对于解决复杂问题、设计高效算法以及理解先进技术都至关重要。掌握扎实的数学基础,将为你在竞争激烈的科技行业中带来显著优势。

数学是一个庞大的领域,我们将重点介绍一些与计算机科学密切相关的核心数学知识:

  1. 离散数学:

    • 这是计算机科学的基础,涉及算法、数据结构、数据库、密码学、人工智能等多个领域。
    • 主要内容包括:集合论、逻辑、关系、函数、排列组合、图论、数论、递归与递归关系、生成函数、布尔代数等。
    • 离散数学培养的逻辑思维和问题解决能力对软件开发至关重要。
  2. 线性代数:

    • 在计算机图形学、机器学习、数据分析、网络科学等领域非常关键。
    • 核心内容包括:向量、矩阵、线性方程组、特征值与特征向量、线性变换等。
    • 理解线性代数有助于优化算法、处理高维数据和实现复杂的数学运算。
  3. 微积分:

    • 作为高等数学的入门课,理解函数、导数和积分是掌握其它许多数学概念的关键。
    • 在计算机图形学、物理模拟、优化算法(如梯度下降)等领域有重要应用。
    • 微积分思想有助于理解连续变化和优化问题。
  4. 概率论与统计:

    • 同微积分一样,是高等数学的入门课程,也是一门非常好的工具学科。
    • 在机器学习、数据科学、网络安全等领域广泛应用。
    • 帮助理解和分析不确定性,对设计随机算法和评估系统性能很有帮助。
    • 统计学知识对于数据分析和决策制定至关重要。

推荐课程

1. MIT 18.01 单变量微积分
2. MIT 18.02 多变量微积分
3. MIT 18.06 线性代数
4. MIT 6.042J 计算机科学的数学基础
  • 课程链接Mathematics for Computer Science

    Online Publications 在线互动课程,注册账户登录后可以保存课程进度,提交前保存答案,以及其他更多功能!

  • 课程介绍

    • 专为计算机科学学生设计的离散数学和概率论综合课程
    • 主要涵盖三部分:
      • 数学基础概念:定义、证明、集合、函数、关系;
      • 离散结构:图论、状态机、模运算、计数;
      • 离散概率论
    • 强调数学推理和问题解决能力的培养
    • 对理解算法设计、密码学、可计算理论、计算机系统等核心领域至关重要

操作系统

我们所编写的代码在操作系统的环境中运行,因此,了解操作系统的运作原理对于计算机专业人员至关重要。这不仅有助于我们优化代码性能、合理利用系统资源,还能在遇到问题时快速定位并解决,从而提高软件开发的质量和效率。

推荐课程

  • UCB CS 162 《操作系统和系统编程》

    CS 162深入探讨操作系统的设计理念与核心机制,这些基础概念贯穿于现代计算机系统的方方面面。虽然该课程以难度大著称,但能够学习到此阶段的同学,已然具备了扎实的计算机科学功底和超强的学习能力,在你们面前所有难题都是纸老虎。 前提条件 CS 61A、CS 61B、CS 61C和CS 70 ( MIT 6.042J 同等课程),或同等课程。这意味着你理解:

    • 数据结构:数组、链表、二叉树和哈希
    • 汇编语言编程
    • C语言编程
    • 使用GDB调试C程序
    • CPU缓存和内存层次结构
    • 虚拟内存(如CS 61C所涵盖的内容)
    • CPU流水线和基本数字逻辑设计
    • 随机变量和概率分布的基础知识(如CS 70所涵盖的内容) 课程提供的资源包括:
    • 课程官网https://cs162.org
    • Lecture Video,Lecture PPT
    • Readings | 课程推荐的阅读材料
    • Homeworks
    • Projects

计算机网络

计算机网络是计算机科学中最能直接体现实用价值的领域之一,尤其是涉及网络服务端和客户端的软件工程。通过系统地学习计算机网络,学生能够深入理解那些曾让他们感到困惑的术语、概念和协议,为他们的知识体系提供更坚实的基础。

推荐书籍

  • 计算机网络:自顶向下方法

    《自顶向下方法》采用了一种与传统“自底向上”方法不同的教学策略。它从应用层开始,然后逐步向下到传输层、网络层、链路层和物理层,这样学生可以从他们最熟悉的网络应用开始学习,逐渐深入到网络的底层细节。书中包含了大量的实际案例研究,帮助学生理解网络概念如何应用于现实世界中的网络设计和问题解决。

推荐课程

  • Stanford CS144: Introduction to Computer Networking

    融理论与实践于一体,以"动手构建互联网"为特色。学生将系统学习网络基础理论,包括分组交换、分层架构等核心概念;通过亲手构建路由器、实现可靠数据传输服务等项目,深入理解网络工作原理。课程还邀请业界专家分享实战经验,配合课堂实践环节,让学生掌握关键的工程技能。

数据库系统

数据是众多重要程序的核心,但真正深入理解数据库系统工作原理的人却少之又少。作为一门多领域交叉的学科,数据库系统的学习不仅需要扎实的系统编程基础,还因其复杂性而比其他主题更具自学难度。 自学者不必拘泥于传统教材,首先从一名优秀的数据库课程入手 例如 CMU 15-445 ,先搭建整体知识框架,随后深入阅读相关领域的经典论文 。

经典论文

  • Architecture of a Database System 这篇论文提供了对关系型数据库管理系统(RDBMS)工作原理的独特高层次视角,是后续深入学习的实用指南。
  • Readings in Database Systems 数据库【红书】,是由 Peter Bailis、Joe Hellerstein 和 Michael Stonebraker 编纂的论文合集。 在次强调 如果你没有足够的编码能力,很难掌握数据库理论的。

推荐课程

CMU 15-445 Database Systems

这是一门关于数据库管理系统内部原理的高级课程。非常重视编程项目,每节课都有指定的阅读材料、作业以及两次考试。成功完成本课程后,学生应能够: 使用关系代数表达数据库查询。 运用SQL与数据库管理系统进行交互。 利用函数依赖和范式设计合适的数据库表。 实现一个面向磁盘的数据库存储管理器,包括表堆和索引。 理解、比较并实现基本的并发控制算法。