跳到主要内容

比较推荐的学习路线

计算机专业所涉及的课程以及方向非常多,HackWay会尽可能详实地整理6大CS名校的所有关键课程,但这些课程对于个人学习者来说未免过于庞杂;而且相同的课程不同学校都有授课,到底该如何取舍?而且不少课程资源配套以及开放的程度不一,哪一门课提供的更加丰富...等等,在这里综合多方面的考量为大家提供一个值得参考的学习路线,既做到循序渐进,又不缺失核心的经典课程,而且课程的资源也比较容易获取。

大一上学期

进学校的第一门课对学生来说是非常重要的,尤其是不少同学之前完全没有接触过代码,甚至计算机的基础操作都不熟悉,

① 计算机科学导论

计算机科学到底是指什么,新入学的新生需要一本比较宏观简明的教材来对计算机科学有一个全景式的讲解,通常这样的入门课在计算机科学教育中被称之为"CS0" (Computer Science 0) ,旨在为没有任何计算机科学背景的学生提供基础。它通常不涉及深入的编程,而是介绍计算思维、基础的计算概念和计算机的日常应用。

这里推荐大家购买一本国外(或翻译版)的计算机科学概论或导论的教材,你可以像看“故事书”一样把这本书当成“课外读物”,顺便思考一下每个章节的课后习题。国外这样的书有好几个版本,比如以下这本,同时也比较建议学有余力的同学直接看英文版。

英文版电子书:计算机科学概论 第13版 英文 提取码: qs72

类似的还有机械工业出版社的《计算机科学概论(原书第7版)》、《计算机科学导论(原书第4版)》。这本书零基础可学,可以和后面的课程并行学习,非常推荐你在大一的时候能够通读整本书的内容。注意:不要死记硬背这本书里面的内容。

此外,还非常推荐大家观看《计算机科学速成课》的视频,共40集,每集10分钟左右,讲解的非常精炼而又清晰,可以和计算机科学概论一起配套学习。

学习地址: 计算机科学速成课

② Python

美国大多数计算机名校入门的第一课都是Python,而不是国内普遍采用的C语言。这是因为Python不仅有着直观、简洁的语法,能够让初学者更容易上手,而且它有着非常强大的社区生态和广泛的应用,能够让新手做出有用而且实用的功能,同时也为日后的各个领域的深入学习打下基础。

Python入门课在美国各大计算机名校也都是全校乃至全社会的“明星课”,校园内外参与学习的人数众多,和国内十数年都不会更新课程内容不同,这些课程都与时俱进,课程非常贴合企业、科研对编程方面的需求。

Python相关的知识,推荐大家学习哈佛大学的CS 50系列课程以及伯克利的CS61A,这两门课对外都提供了完整的学习资料,CS50入门相对来说更加简单,建议深入学习一下Web开发的分支课。

学习地址: CS50 计算机科学导论

伯克利的CS61A课程相对来说更难,它和哈佛CS50搭配的很好,具有比较一致的学习内容,两门课可以一起来学习。

学习地址: CS61A 计算机程序的结构和解释

③ C语言与Linux

尽管哈佛大学CS50就已经涉及到C语言的基础,但这样的基础仍然不足以让你在大二的时候能够开始学习CSAPP这门课,你还需要进一步学习C语言、Linux命令行以及汇编基础知识,推荐学习普林斯顿的COS217这门课。

学习地址: COS217 编程系统导论

与此同时,你需要在学习Linux的过程中掌握一些基础的工具,比如shell、git等,当然这些内容在COS217也有所提及。

学习地址:MIT 计算机教育中缺失的一课

大一下学期

① C++或Java

此外,你还需要根据自身的情况来选择一门相对而言更加复杂的面向对象的编程语言Java、C++或OCaml等。对于国内大多数计算机专业的学生来说,也就是如果你是普通985以下或本科毕业后就想找到工作,更加推荐学习Java;但是如果你是顶级985以及理工科强校,尤其是你有意读研深造,更加推荐C++,而追求更高一点且学有余力的同学则可以在C++基础上再了解一下OCaml的课程。

一般来说,Java和C++也是算法课最常用的编程语言,两者并没有优劣,不过不同的学习路线采用的教材和课程也会有所不同。

选择Java的同学,推荐先学习普林斯顿的COS216,由于之前已经学习过Python,你应该能够很快掌握Java的语法,因此你可以和后面的数据结构与算法一起同步学习。

学习地址:COS126 计算机科学:跨学科方法

而如果选择学习C++,则非常推荐你学习Standford的CS106B/CS106X.

学习地址:CS106B/CS106X 程序抽象

② 离散数学

当然在大一期间,你需要学习的只是数据结构与算法的基础知识,更加复杂的算法可以在大二、大三继续学习。但在学习数据结构与算法之前,非常建议你同步学习一下微积分(上)以及离散数学,尤其是离散数学。

其中微积分部分的内容你可以跟着学校的课程来学,也可以去看MIT的单变量微积分。

学习地址:MIT 18.01/18.02 微积分

但是离散数学则更加建议你去自学国外的教材,以下三本教材可以选择其中之一。

③ 数据结构与算法基础

算法是计算机专业的基础与核心之一,同时也是未来你面试、考研乃至去外企的重点,值得你在整个大学生涯都给予高度的重视。算法并不依赖于某一门编程语言,但是在教学领域,Java和C++会更多一些。

如果你大学生涯决定主修的是Java,那就不得不提到Java《算法》红皮书,推荐你去学习以下两门课,伯克利的CS61B以及普林斯顿的COS226。

学习地址: CS61B 数据结构

学习地址: COS226 算法和数据结构

而如果你大学生涯决定主修的是C++,那推荐你算法或计算机科学相关的课程,可以选择Standord的C++课程以及MIT的算法课程。

学习地址: 6.006 算法概论

大学二年级

在整个大学二年级,你需要做好以下四件事情:一、学好软件工程,它可以让你在大二毕业后的暑假开始找实习;二、继续深入学习算法;三,学好CSAPP;四,学好操作系统。这四个内容并无先后顺序之分,都需要你投入大量的学习时间。

① 软件工程

软件工程是一个非常复杂的概念,它不仅关注代码的编写,还涉及到整个软件开发生命周期,包括需求分析、系统设计、编码、测试、维护和项目管理等环节。对于个人来说,你需要掌握一套应对职业需求的技术栈,能够开发出工业级、商业级的项目

这个时候,你就需要多去招聘网站,了解一下技术类的岗位需求,尽管企业里的技术岗位方向很多,但是这些岗位都遵循相似的软件工程方法论,同时也包含技术解决方案的软件生态,这些都值得去学习与关注。

国内很多计算机专业的学生无法应对企业招聘的需求,很大一部分原因在于学校对代码编写、项目开发以及软件工程方法论的落地并不重视,因此使得不少学生需要观看一些培训班的教学视频。学习软件工程时,你不仅要掌握培训班里提到的一些“开发技能”,也需要了解软件工程的一些“方法论”。

常见的项目开发方向(也是招聘岗位方向),包括Java后端开发、JavaScript前端开发、C++服务器端开发、Golang云原生开发等等,这些技术方向通常是围绕某一门编程语言的“生态”,包含的内容也错综复杂,比如:

  • Java后端开发:你会发现Java编程语言仅仅只是这个技术栈的一部分,你还需要掌握Spring、Vue/React、数据库、CI/CD等知识,你通常需要掌握Spring来开发出一个全栈项目;
  • JavaScript前端开发:在很多学校的教学里,并不会深入学习JavaScript,但是在市场里JavaScript是岗位需求量最大的编程语言之一,同样它也不只是要求你学习JavaScript这门编程语言的语法,还需要你学习Vue/React框架、Nodejs、数据库等知识

这整套的项目开发所涉及的内容极为繁杂,国内外也并没有非常好的课程能够教好,本学习路线也会给出一些方向上的建议。关于软件工程方法论的知识,这里推荐一下普林斯顿的COS 333,伯克利CS169以及MIT 6.031。

学习地址: 普林斯顿COS333 高级编程技术

学习地址: 伯克利CS169A/L 软件工程

学习地址: 6.031 软件构建要素

② 算法导论

优秀的算法教材有很多,难度相差也比较大,因此选择时尽可能循序渐进,不一定要直接从《算法导论》这本书开始学起。值得一提的是,关于算法,网上也有非常丰富的资源,能够辅助你的学习,那资料那么多,又应该怎么选择呢?

在学习的时候,你可以按部就班按照CS名校的课程来学习,这些课程由浅入深,讲解得非常详细而且系统,同时也建议你刷一刷LeetCode的题目。市面上的算法题有很多,但是一般只建议你集中力量研究少量的算法题,比如只关注LeetCode上面的题目。

一般来说,求职所需要掌握的算法知识并没有CS名校教学的内容难,你只需要刷一些常用的算法面试题以及中低难度的LeetCode就足以让你进入国内一线大厂了。算法的学习是非常耗时的,如果你是以找工作为目的,你可以学习《算法》这本红皮书的内容,学习伯克利以及Stanford的算法课程。

学习地址: 伯克利CS170 高效算法和棘手问题

学习地址: 斯坦福CS 161 算法的设计与分析

但是如果你对算法有比较高的追求,你可以学习MIT的算法体系课,包含MIT 6.006 算法概论、6.046 算法设计与分析、6.854 高级算法以及选用算法导论这本教材。

学习地址: 6.046 算法设计与分析

③ 深入理解计算机系统

深入理解计算机系统,这本书堪称神书,CMU的这门课(CMU 15-213)堪称神课,这门课足够重要,如果计算机有四大神课或四大神书,那么这门课或者说这本书就一定是首位的,因此需要你在大二期间投入足够多的时间来学好它。

学习地址: 15-213 计算机系统概论

④ 操作系统

要想学好操作系统,是一定要调试运行乃至开发一下操作系统内核的源码的,不能只看PPT、视频以及书籍。为了更好地教学,美国的很多CS名校都推出了类似于Linux、但是更加简单的教学用操作系统,因此你学习操作系统时更建议你以教学类操作系统为主。

比如Stanford、霍普金斯、伯克利等大学使用的是PintOS操作系统(由斯坦福大学主导),因此你可以去选择学习这几所学校的课程,将它们的课程资源、作业等一起来参考。比如MIT、哥伦比亚、华盛顿等大学使用的则是XV6操作系统(由MIT主导);比如哈佛大学、布朗大学、纽约大学等使用的则是WeensyOS。

目前来说这三个教学类操作系统你可以选择其中之一来学习,如果比较偏爱伯克利、斯坦福的课程可以选择PintOS,比如国内北京大学选择的就是PintOS,清华大学曾经选用过xv6,现在采用的是rcore/ucore。

要运行这些简版的操作系统,你需要下载模拟器或虚拟机工具来运行它,而这些操作系统的内核源码通常使用的都是C语言,因此你需要在学习这门课之前就要对Linux与C语言有一定的了解,甚至在学习这门课的时候,你还需要掌握一些Rust。

操作系统这门课,你需要结合Lab以及教材一起来学习,实践与理论要同步一起学习,也就是你需要按照课程的要求一遍做Lab,一遍看教材的总结,绝对不能只看书。

大学三年级

计算机网络、数据库系统、分布式,这三门课背后都有一本“圣经”一样的参考教材,和其他计算机科学的核心课程一样,你既需要掌握这些教材里面的理论知识,同时也需要学习以这些书为参考教材的CS名校提供的Lab,不能只看理论,一定要一边实践一边总结。

① 计算机网络

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

学习地址: CS 144 计算机网络

② 数据库系统

③ 并行计算与分布式

并行计算 CMU 15-418/Stanford CS149: Parallel Computing

分布式系统 MIT 6.824: Distributed System