Columbia MSCS 课程测评与推荐

写这篇文章的时候已经毕业半年了,再加上本人记性不佳,可能参考价值不大。

21 Fall

COMS W4995 Parallel Functional Programming - Stephen A. Edwards

Stephen 讲课非常有趣,slides 也很清晰,清晰到完全可以当作自学材料(导致我没怎么去听课)。这门课用的是 Haskell,我本以为会侧重 parallel,但其实大部分时间是在教 functional programming in Haskell,只有最后几节课涉及到 Haskell,最后一到两人组队完成一个用到并行的小项目(物理模拟相关的比较多)。

推荐想尝试函数式编程的人选,如果之前已经会 Haskell 了(比如我)就不建议选。

COMS E6156 Cloud Computing

水课,推荐给需要 6000-level 学分的同学上。

学期中 workload 极小,只有期末的时候需要整个队伍一起努力几天完成一个对界面没有要求的用到一堆 AWS 服务的网页应用。

COMS W4186 Malware Analysis and Reverse Engineering - Michael S. Sikorski

很喜欢的一门课,也学到了很多东西。学期结束后我才发现,课程教材的作者就是教授。教授同时还在一家公司任职,几乎每节课都会请工业界的 guest 来讲一些主题,当然也有提问互动环节,所以整个课程都非常 practical。

作业和考试的形式都是逆向二进制,考试的形式是 take home 的,需要完成一个病毒分析报告。有一个有趣的作业是修改 Win7 的纸牌,让游戏一运行就播放通关后纸牌下落的动画。

推荐任何对逆向(或者称为 hacker)有兴趣的同学选,另外不推荐使用 ARM 平台的 Mac 用户选,因为作业都需要在 x86 的虚拟机里进行。

COMS W4444 Programming and Problem Solving - Kenneth A. Ross

比较神奇的课,整个学期有四个开放性的优化问题(类似于已经绝版的 Google Hash Code 比赛的题),不需要《算法导论》里的算法,只需要一些启发式的策略和实现。

对于每个问题,前面若干节课是讨论,之后一两节课会现场运行各个组实现的策略,最后一节课每个组提交报告(给的样例还挺长的)和 presentation(以录制好的视频形式)。这节课要求到场,而且有参与分,没有考试。学期结束的时候会设计并出售 4444 这节课的周边(可惜因为太丑所以没买)。

这门课的组队是随机的,也可以指定和某个人组队,但是任意两个人不会在同一个队伍里超过一次。

因为组队的随机性,不建议很看重 GPA 的人选。此外需要一定的交流能力和 Carry 拉跨队友的能力。

ENGI E5000 Workplace Communication in English - Hyoseon Lee

工院的免费英语课之一,workload 比较小(但是要求线下已经是巨大的 workload 了),学期内会有一次团队 presentation。

推荐给刚入学想要交朋友的同学(像我这种自闭的是交不到朋友的),或者想提升英语(并提前接受印度英语拷打)的同学。

22 Spring

COMS W4118 Operating Systems I - Jae Woo Lee

http://www.cs.columbia.edu/~jae/4118-LAST/

在我上课课中最值的一门,也是我学到东西最多的一门课,而且是在我本科已经学过操作系统的情况下。

  • 可以在这门课体验 Linux kernel hacking,有机会阅读并修改 Linux 代码。
  • 这门课的答疑平台不是 Piazza 或者 Ed,而是 mailing list,也是非常新鲜的体验。
  • 课程内容与时俱进,作业和考试题的设计都非常好,老师和 TA 团队也非常好。(甚至 TA 们愿意在毕业后无偿为 Jae 当 TA。)
  • 是传说中的 workload 20h/week 的课,实际上并没有那么久。

推荐给所有计算机专业的同学。

COMS W4701 Artificial Intelligence - Tony Dear

质量很高的 AI 课程,涵盖范围也很广,作业题量也很丰富,包含了问答题和编程题。考试是开卷(期末的时候甚至开电脑),可见考试还是很有难度的。

对于想混 AI 学费满足 breadth 要求的我算是上当了,不过推荐给想打好 AI 基础的同学。

另:这门课对作业答案有友尽风险。

COMS W4113 Distributed Systems Fundamentals - Roxana Geambasu

基于经典的 MIT 6.824,前面四个作业和 6.824 是一样的,最后一个作业是自研的(难度算相对简单)。上课讲的内容和作业没什么关联,上课内容有提供 lecture notes(会比 slides 更加详细),考试不难。作业算是编程作业里相当硬核的,主要是分布式的东西 debug 比较困难(而且可能没人能救),此外作业里提供的代码质量会比原版的 MIT 课程更差一些。

推荐给想学分布式但又不想自学 6.824 的同学。

COMS W4115 Programming Languages and Translators - Ronghui Gu

课程设计是 Stephen A. Edwards 做的,所以 slides 保持了一贯的高水准(清晰完整,甚至可以不用听课了)。这门课在我校还有另一个版本,使用的语言是 C++,需要基于 LLVM 实现一些东西(比如实现一些 optimization pass)。而这个 Ronghui 和 Stephen 的版本则是用 OCaml,最后需要设计并实现一门语言(编译到 LLVM IR)。

相比起常规的编译原理课程,这门课花了更多的时间在教你如何使用 OCaml 上,此外还有对 lambda calculus 的介绍,作为代价,编译原理的部分比较浅。

推荐给想要尝试函数式编程以及没上过编译原理课的同学。

22 Summer

COMS W4995 C++ for C Programmers - Jae Woo Lee

我没上过这门课,但是当了这门课的 TA。这门课保持了 Jae 一贯的高水准,课程设计,教学质量,作业内容,TA 团队都是一流的。

适合暑假期间想入门或巩固 C++ 的同学。

22 Fall

COMS W4236 Introduction to Computational Complexity - Xi Chen

课程和作业都主要以证明为主,有些复杂的证明可以讲好几节课。作业难度较高(但还是比课上讲的证明简单),所以可能比较依赖 OH。OH 上会有人把所有题目问一遍,然后 TA 也会把所有题目讲一遍。

课程质量不错,老师讲得也很不错,就是有些硬核。适合想要活化大脑的同学。另外我个人选这门课的原因之一是,这类偏理论的东西离开学校就再也没机会接触到了。

COMS E6998 Readings Language Design - Bjarne Stroustrup

教授是 C++ 之父,算是传奇人物。本来听说要退休了,结果那个学期又开了课,甚至之后也还在开课,可以说是非常热爱了。

这门课主要是轮流讲 HOPL (History of Programming Languages) 上的论文(每人一次),然后进行讨论。在学期末的时候需要提交一篇 2000 词以上的 Essay,综述性质的就可以了。

推荐这门课给不知道 6000-level 课选什么的同学,因为总体而言比较轻松,而且可以和传奇人物 Bjarne 近距离互动(以及要合影)。

COMS W4995 Competitive Programming - Yongwhan Lim

当时是第一次开设这门课程,而我也当了这门课的 TA,算是见证了这门课的诞生。这门课我不愿意过多评价,如果是本科生大一大二且对 CP 有兴趣可以试一试,想提升算法水平准备面试的建议上同一个老师的另一门课 Tech Interview Preparation。