五门CS基础课推荐


干货:五门CS基础课推荐

题记

程序员的行业是多金的,虽然网上总是会妖魔化我们,但是不可否认,码农是时下最热门的行业。比如,最近Google日本在扩招,如果你有幸刚毕业就加入Google日本,成为一名工程师。那么薪水意义上,你的起点其实就是绝大多数日本人的终点了。机会没来的时候,你在观望,机会来了,你却在抱怨来不及了。你或许在害怕英文,或许在害怕一个个无人陪伴的夜晚。但是实现一个梦想最好的时间,一个是十年前,一个就是现在。

别等。看完这篇文章。关上手机,静下心来学习即可。每天八小时事,半年小有所成,一年便可登上互联网的快车。

MOOC和我

MOOC,全称Massive Open Online Courses,也就是网络公开课。

2013年,研究生即将毕业的我,突然萌生了转行计算机的想法。因为当时计算机的薪水实在高的令人发指(现在更高了),所以我就直接去面试腾讯的实习生了。不出意料,没有系统学过计算机的我,杯具了。经过一些准备,2015年底,我拿到了硅谷工资最高最火的三家(Facebook, Google, LinkedIn) 的offer。记忆中,当时CMU的同学中,全部拿了这三家的只有我一个。

我从来没有在学校系统的读过计算机,即使在CMU读硕士的时候,我的主攻方向是是网络安全和密码学,学习的课程主要偏数学以及各种渗透技术。我所在的Program,八个人,也只有我一个人会编程。我对知识的获取方式特别挑剔,上学的时候,我如果觉得没必要去上课,或者老师水平一般(按书讲,或者读ppt),我是不屑于在教室出现的。但是推荐的这几门课,我找不到任何缺点。而我在找到工作前的大部分知识,都是通过MOOC获取的。

如果你能够坚持上完这些课,即使没有一个CS学位,也可以打好很扎实的计算机基础。而且因为这些都是很优秀的国外公开课,即使你在国外读大学,本校的课程也不一定能跟上这些课程的档次。认真学完之后,你的基础不输普通大学的CS科班生。

为什么要介绍国外的MOOC呢?

虽然国内的CS教育进步很快,但是国外的CS课程在设计上往往更合理,而且每年会随着业界的发展不断更新。授课教师往往都具有很强的学术和工业界的背景,所以他们不单知道怎么把知识交给你,也知道怎么让你成为一个优秀的工程师。国内的课程体系往往比较落后,偏理论,而且进展很慢。比如,国内很多学校还在用C语言入门,教着8086/8088,操作系统上成文科课。

无论是CS科班,还是转专业的学生,或者是PHD,这些课都是很好的参考资料。美国大学一门课的收费在5000美元左右,所以如果真的能够把这些课上下来,相当于赚了2万多美刀。

这几门课都属于比较早期的经典课程,经历过时间的验证。在CS界,其实最好的东西,往往是免费的。

找工作不是光刷题就好了吗?

找工作刷题肯定是必须的。但是为了找工作直接就开始刷题,难免有点操之过急了。而且也为了以后的工作做准备,扎实的计算机基础还是很必须的。而这些是刷题无法给你的。工作以后,基础比较好的人往往会更快的发现并解决工作中的问题。而且其实找到工作只是一个开始,进入公司需要学的东西很多,没有一定的基础,其实很快就会不适应快节奏的工作。2019年了,现在单纯的靠刷题已经很难找到工作了,很多公司都会在面试中穿插一些非算法的题目。

这些课都配套了非常有意思的project,对于没有project可以写,背景比较薄弱的同学来说,完全是可以写到简历上的。当然,如果刚开始一个人自学,可以跳过project,因为一个人做project确实会有些难度。

对于想来硅谷找工作的同学来说,这些课程可以让你更好的复习一些基础知识,可以使你 talk like a silicon valley engineer. 上课的时候,注意老师是怎么解释每个Topic的,注意他们是怎么举例子的,这些会提升你在面试中的交流技巧。

Udacity: Introduction to Computer Science(计算机科学导论)

计算机科学导论

Udacity的CS入门级神课,讲解的非常简单。这门课面向的对象是没有任何编程经验的人,所以任何人都是可以上的。这是Udacity上第一批课程,也是质量非常刚得一门课程。课程的介绍页面写的很详细了,我就不介绍了。我上这门课的时候,udacity还没有收费服务。不过良心的是,你仍然可以免费上所有的课!

如果是CS科班的同学,其实可以跳过这么课,因为内容比较简单了。但是对于编程技术比较薄弱,或者英语能力一般的,这绝对是非常适合入门的课。课程的语言为python,属于码农必会语言。现在2019年了,Python也基本稳定霸占最流行编程语言的前三了。硅谷的面试中,很多同学直接使用python进行面试。

课程虽然简单,但是这并不影响课程的价值。北美学校基本都会使用python作为入门语言,这样可以快速让学生上手,同时对CS产生强烈的兴趣。现在纯python的工作岗位也越来越多了,比如web,数据分析,机器学习。国内学校一般仍然在采用C语言作为计算机入门语言,上完之后很多同学再也不想碰编程了。

这门课主要讲的是构建一个基本的基本的搜索引擎,麻雀虽小,五脏俱全。会讲到网页的爬取(crawling),索引(indexing),存储(storage),和访问(serving)。其实这个和工业界的系统是类似的,只不过工业界的处理的问题要比这个复杂多了。里面的每一个小块,其实都是足够你投入毕生精力去研究的。这也就是国外课程的魅力,其实你毕业处理的问题和学校学的很像,只不过规模不同了。

CS 61A: The Structure and Interpretation of Computer Programs

Berkeley的经典CS入门课。虽然是入门,确是非常有深度的一门课。学完之后,可以让你的python水平大涨,让你学会很多python的奇巧淫技。同时也会让你对编程语言有比较深层次的理解。虽然是python授课,但是里面的topic同样适合其他语言。上完这么课,我觉得我第一次懂得了什么是recursion,第一次懂了什么是function call。里面的很多内容对我至今影响深远。

我只听过John DeNero的版本,因为他准备的资料非常丰富。大神John DeNero,研究搞得好,并且在也有丰富的工业界的经验(Google Scientist)。更难能可贵的是,他把所有课程的资料都放到了网上,并且每年都在更新。在这个物欲横流的社会,真的是一股清流。2019年开始出现Dan Garcia的版本了,但是他目前没有提供视频。

这门课用的教材是SICP的Python改版。John Denero把SICP的书改写成了Python的版本,使得这本经典的CS教材更符合现代码农的需要。他也因此获得了campus Distinguished Teaching Award。SICP这本书,是计算机界Top10的经典的著作,恰巧也是最薄的。跟人聊天的时候,只要提到SICP这个词,绝对让你逼格提高八度。很久很久以前,我曾经尝试着读过原版,不是很读的下去。。。但是后来跟着这门课同步学习了这本书,受益匪浅!

The Structure and Interpretation of Computer Programs

这里可以看到所有的版本,这门课每年都会更新,选择自己喜欢的年份即可。一般选择比较新的年份,有些年份没有视频,可以往前慢慢翻。现在课程的autograder也对外开放了,不过我就还没试过。The autograder is now open to the public. Sign up using entry code MNXYKX at gradescope.com.

CS61B: Data Structures

如果说非要选一门对找工作最重要的课,那么就是这一门了。如果时间不允许,只能上一门课的话,那么就上这门课了。上完这门课,你就可以刷题了。这门课选用的语言是Java,相对于C++而言,比较容易上手。而且现在C++的岗位越来越少了,如果非得选,就选Java。

61b主要讲:Java和算法。这么课是从61a平稳过度来的。课程内容非常丰富。

Data Structures

以前,这门课比较流行的版本是2014 Spring的版本(传送)。授课老师采用传统的黑板书写方式。我并没有看课程的视频,我只是反复阅读了课程的讲义,字里行间都让我受益匪浅。有基础的同学可以直接阅读讲义之后做作业!

我个人比较喜欢Josh Hug的版本。 该版本的内容更加丰富。老师基本就是让学生不的实现新东西. 学生虽然被虐的很爽,但是对老师的评价确非常非常的高。Josh Hug在Berkeley 有多受欢迎呢?请看这个网页,Berkeley的同学在reddit上集体膜拜这个老师,有同学说:“The only negative thing about Josh Hug is that he doesn’t teach every course in which I am enrolled. Completely agree with your sentiments. I’ve never had a more dedicated and engaged professor.” 虽然一般难的课评分不容易高,但是Josh在ratemyprofessors上的评分有4.8/5,前面提到的John DeNero也有4.7分之高。Josh经常会手把手教你好多东西。课程有两个大的project,每年都会变。对新手来说,确实有一点难度,但是却可以作为简历上比较有分量的Project。当然不做也是可以的,专心做完Homework和lab即可。

其实很大一部分面试题都是那些经典算法的变种,所以数据结构非常重要!而且其实一般的面试当中,数据结构的范围是不会超过61b的数据结构范围的。如果真的遇到了,那只能说你遇到极品面试官了。

Coursera: Princeton Algorithm

Princeton Algorithm

采用java语言,Princeton神级教授倾力讲授。我比较推荐的是这门课的教材:红书。我买了一本,带去了美国。Josh Hug 的cs61b也参考了这本课本,因为Josh Hug是Princeton走出去的大神。其实也正式这个原因,其实Josh Hug的课程的后半部分和这门课程有很大的重叠,这么课可以跳着看,把61b没有覆盖的章节补充一下即可。

首先,入门选手千万不要读算法导论!入门选手千万不要读算法导论!入门选手千万不要读算法导论!有多少人因为算法导论,从此对算法望而生畏。书当然是超级好的书,但是这本书更适合研究算法的人!而且如果没有人给你画重点,你几乎可以深陷其中,不能自拔。至今在知乎上,仍有人不知疲倦的给新手推荐算法导论作为刷题的入门教材,毁人不倦。算法导论一般美国大学偏理论的算法课使用的教材,比较适合以后的进阶高阶读本。

与大部分的算法课不同是,这么课并没有过多注重于数学,而是一直在教你如何正确的实现一个算法,并且老师很注意帮你养成简洁的编程习惯,这也是我喜欢这门课的原因。其实这门课实现的算法都属于比较复杂的算法,对大部分人来说,工作和刷题中很少会遇到比这些更复杂的算法。老师的视频里面有各种动画,可以很好的帮你理解各种算法。这么课分part I 和part II。Part I里面的所有内容都是非常重要的。Par II我只看了Graph和String。其他不看也行。

红书最强之处在于,它的编程风格非常简洁明了,对我的代码风格影响很大。书中对于每个算法的实现(merge sort, quick sort, graph algorithm)都是我见过的最好的。我曾经在面试的时候被人要求手写PriorityQueue,然后我写出了红书中的那种简洁的代码。我之后的代码几乎都在模仿这本书。其实代码的风格很重要,对于一个新手来说,越早的养成自己的风格,就意味着越早能写出无bug的代码。

CMU 15213 CSAPP

这是CMU当之无愧Top 1神课。国内一些大学也引入了这么课(可见,有一个好的老师是多么重要的事情)。网上比较全的版本是UW的一个公开课的版本,UW的版本比CMU的版本简单了一点,但是也够用了。这门课原本是在Cousera上提供的,可惜Coursera改版之后被删了。现在可以在UW的官网上看到。当时UW讲这门课的Prof Gaetano Borriello 已经在2015年去世了,可是他的课程依然影响着千千万万的人。

CMU 15213 CSAPP

这么课神就神在,它基本上把CS界的那些经典领域都不深不浅的介绍了一遍,所以这么课是cmu很多高阶课的前提课程。这门课的作业非常的神,每个作业都设计的非常有趣,能够让你花一整天去研究他。这么课的教材(CSAPP)也是CS界的经典著作之一,有空一定要深读(只读网课讲过的章节即可)。这门课选用的语言是C语言和汇编。其实这个时候学C语言恰到好处,了解了计算机体系结构之后,而C语言最大的优势就是“是一门底层语言”。

学完这么课,我瞬间感觉了任督二脉被打通了。我觉得我第一次理解了计算机。对计算机有种莫名的通透的感觉。感觉任何概念都可以轻松理解了。计算机没了神秘感。学完汇编,你会发现,其实处理器能做的事情就那么简单,都是指令集写好的。学位内存结构,你会觉得现在的堆栈和递归都是显而易见的事情。学完数字的bit表示模式,内存在你眼里只不过是一群0101而已。学完gdb的debug,你将不再恐惧黑黑的命令行。你甚至写了一个shell,然后写shell里面的一些常见命令。写完malloc,其实内存分配也就那样了。multi thread的proxy,让你对多线程没了恐惧,对网络也有了一些了解,其实就是一些包送来送去。

这么课我研究的很通透。在CMU的时候,每个人的作业的版本都是不一样的,由于某些原因,这么课的作业我不止做过一份。。。这样导致我的213学的非常扎实,至今我都能说出个所以然来。

后记

现在已经是2019了,MOOC的数量比当时大大增加了。以上只是介绍了CS的一些基础课,其实我也接触过一些高阶的课程,等有机会再介绍了。大家没事多去coursera和udacity上逛逛,活用google,会找到很多有用的课程。美国很多顶级大学的课程多会把材料放到网上,真正利用起来其实前途无量。

如果真的能够坚持上完这几门课,那么恭喜你,你的CS基础已经非常扎实了。我靠着这些基础的加成,在CMU混的很轻松。回头想想,其实自己的基础课都是名校加成过的,随便个一招半式都够用了。

这几门课,时间充裕的可以慢慢上。时间紧的可以挑着上(上一门python,一门java,一门c),主要是要养成一种自我学习的习惯,而这也是码农生涯里面最重要的一个习惯。




Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • 2379. Minimum Recolors to Get K Consecutive Black Blocks
  • 2471. Minimum Number of Operations to Sort a Binary Tree by Level
  • 1387. Sort Integers by The Power Value
  • 2090. K Radius Subarray Averages
  • 2545. Sort the Students by Their Kth Score