我在 UCSD 读 CS75(续)

10502
7
本帖参考某学长的帖子:instant.1point3acres.cn
【你能在本文看到什么】
0. 一些阅读小 tips
1. 我在 UCSD CS75 上过的 12 门课
2. 我没有上过但是了解过的课
3. 另一个小 tips

【你不能看到什么】
0. 找工作
1. 刷题

2. 生活

【Part 0:小 tips】

0. 课程编号 1 开头的是本科生课程,2 开头的是研究生课程。有一类特殊的研究生课程编号为 291,不同的课程以 291-A,291-B,291-C 等等进行区分。这些课程大多数是刚开一两年的课程,如果合理的话,之后会「转正」成正常 2 开头的课程。

1. 本科生课程给分较为严格,一般平均 GPA 在 3.0 上下。研究生课程由于有 breadth B- 以上才能算毕业学分的要求,给分非常宽松,我上过平均 GPA 3.8/3.9 甚至 4.0 的课。因此整个项目里面满 GPA 的人也不在少数。
2. 在选课时,除了课程编号之外还需要关注教授本身,同一门课不同教授的教学内容和给分情况都不一定相同。本科生课程可以通过 cape.ucsd.edu 查看教学评价,研究生课程大概只能通过口口相传。
3. 即使课程编号和教授都完全相同,不同的年份之间,教学内容和作业形式也会有微调。

【Part 1:我上过的 12 门课】
课程名称:CSE 120 Princ/Computer Operating Systm
授课老师:Joseph Pasquale
给分情况:A+ 3.3%,A 22.8%,A- 14.7%,平均 GPA 3.23,人数 184
教学内容:本科难度 OS 知识,例如进程、上下文切换、进程间通信、死锁、虚拟内存、文件系统等。一共有 4 个 project,在教授自己开发的包含 4 个部分的 UMIX 系统上,每个 project 屏蔽 1 个部分的功能并要求编写代码实现。只会给出基本的测试数据,最终评分会使用 hidden testcases,但允许所有选课的同学共享自己设计的(包括往年的)testcases 源码。midterm 和 final 都是选择题,其中 final 难度稍大,会涉及一些 project 中遇到的概念和设计。
个人评价:Joseph 讲课非常清晰,语速不快,是我为数不多的(在不需要签到的情况下)都会选择去线下听的课。这门课在我这里的主要作用是(1)把我本科一行代码都没写的背书考试 OS 再学一遍(2)了解一些专业术语对应的英文单词,对后续研究生课程也有一些帮助。project 主要体现在思维难度,编码部分的难度稍微低了一些,大概平均下来不到 100 行代码的样子。
建议先修:C++,服务器使用,单元测试

---

课程名称:CSE 231 Advanced Compiler Design
授课老师:Sorin Lerner
给分情况:A+ 10.6%,A 76.9%,A- 8.1%,平均 GPA 3.95,人数 160
教学内容:一些看上去很吓人但并不难的编译器优化技巧合集,例如 deadcode elimination、constant folding,以及一些动态分析,例如 control flow graph、dataflow graph。一共有 4 个 project,第一个是 LLVM pass 入门,剩余的三个都是根据 LLVM IR 进行一些基础的分析。midterm 和 final 都是选择和填空题。
个人评价:这门课讲的内容对于大部分 SDE 来说可能很难用到,但其中很多概念,例如 LLVM 所追求的中间表示是 CS 各领域中(例如 Qemu 的 instruction-level virtualization)很重要的一部分。学完这门课也不会再去纠结代码应该写 x *= 2 还是 x <<= 1 了。这门课 GPA 非常高的原因,很大程度上是 Lerner 讲课非常喜欢互动,导致讲得比较慢,每一周 150min 的课程感觉换个老师估计只需要讲 40min。并且前 3 个 project 没有 hidden testcases,并且十分水,例如 LLVM IR 中的 phi node 几乎没有被测试到。第 4 个 project 由于疫情原因,从 hidden testcases 变成了 visible testcases,最后甚至直接下发了所有 testcases。由于 Sorin 已经晋升成了整个 CSE 的 Dean,目测他未来不会再教这门课了,现在 CSE 231 是 Joe Politz 教,授课内容完全不一样。
建议先修:C++,汇编,图论,Docker 使用

---

课程名称:CSE 260 Parallel Computation
授课老师:Bryan Chin
给分情况:A+ 10.0%,A 53.3%,A- 6.7%,平均 GPA 3.75,人数 60
教学内容:各种支持并行的软件/硬件的使用方法和底层原理,例如 SIMD(SSE、AVX)、SIMT(CUDA、TPU)、OpenMP、MPI。一共有 3 个 project,难度依次递减,前两个是使用 CPU 和 GPU 优化矩阵乘法,最后一个是使用 MPI 实现一个简单的算法。project 的给分为两部分:一部分是严格的 performance(绝对值),例如运算速度和运行时间;另一部分是 report,需要根据不同的超参数得到大量的数据,汇总并回答问题。final 包含选择、填空和问答题,难度稍大。
个人评价:Bryan 作为工业界的元老级别的人物(目测有 50-60 岁了),讲课的内容非常有深度和广度。但正因如此,他缺乏一些在学术界的历练,导致上课不容易讲懂,并且 slides 的内容比较没有章法。但好在他会给出一些课外阅读材料,也大概能把这些内容理解了。前两个 project 只需要阅读并理解了对应的论文,实现起来并不难,最后一个 project 几乎没有难度(只要实现了算法就可以达到 100% 的 performance,无需优化),但可以体验一下 sd 的超算,还是很值的,我把我的 credit 用光了之后,厚着脸皮问我的队友要 credit(笑死)。project 占总评 85% 的分数,而且还包含 extra credit,所以这一部分都是接近满分,能拿 A+ 还是 A 就要看期末考得怎么样了,难度还是有的,平均分大概不到 80%,有一些 TPU 的问题我几乎都没有回答上来。
建议先修:C++,本科 arch 中的 cache 部分,LaTeX,matplotlib,服务器使用

---

课程名称:CSE 230 Principles/Program Languages
授课老师:Ranjit Jhala
给分情况:A+ 49.7%,A 17.6%,A- 3.2%,S 26.2%,平均 GPA 3.97,人数 187(由于疫情原因,这学期课程可选 S/U,只要拿 S 即可计入学分)
教学内容:前几节课会讲 Lambda 演算,后面就开始进入 Haskell 的世界,包括基础语法、Functor、Applicative、Monad、IO、Transformer 等。project 数量不少,但都给了非常完善的 starter code,基本只需要做完形填空就行。project 有 hidden testcases,但 functional programming 的好处就在于测试起来非常方便,所以不会扣多少分数。final 也是一个额外的 project,大概就是做一些 Applicative 和 Parser 相关的代码完形填空,但最近一个学期 final 应该改成了基于 Ranjit 和他的学生开发的一个 Haskell GUI 库做一个小游戏。
个人评价:functional programming 可以讲得很简单,也可以讲得很难。Ranjit 的这门课属于中规中矩的类型,例如 Lambda 演算的部分虽然讲到了 Y-combinator 但没有深入讲下去,这个东西还是很有意思的。我有幸在本科就学过 Haskell,但当时的课程非常水,只讲到 Applicative,后面的 Monad 只要求自学并提交自学报告。所以这门课可以说是进一步加深了我对函数式编程的理解。这门课在之前好像风评并不好,但在因为疫情原因改成线上之后,Ranjit 可以直接分享他的屏幕给我们看他写 Haskell 代码和 debug,就会使得课堂效率变得很高(线下根本看不清屏幕上的代码好吧),当然他还是经常拖堂,可能是函数式编程里面的概念对于第一次学习的人来说还是不太容易理解的。
建议先修:单元测试

---

课程名称:CSE 240A Princ/Computer Architecture
授课老师:Jishen Zhao
给分情况:A 50.8%,A- 23.5%,S 22.0%,平均 GPA 3.87,人数 132(由于疫情原因,这学期课程可选 S/U,只要拿 S 即可计入学分)
教学内容:本科难度的 arch 加上稍微难一些的概念,例如 out-of-order execution、forwarding、memory consistency model、cache coherence(MESI model)。有几次 assignment,都是根据课上讲的内容做题。只有一个 project,做 branch prediction。midterm 是全选择题,final 有选择、填空和简答题。除此之外在第一周还有一个摸底测试,占比不多(大概 5%),考察内容是本科难度的 arch,毕竟这门课的计划是讲 grad-level arch 的(虽然还是会把很多本科难度的知识点再讲一遍就是了)。
个人评价:这门课从「水」的维度可以说是性价比最高的一门课了。如果学过本科 arch,基本全程可以不用听课,只需要把没学过的那几个知识点拎出来学一下。project 只需要效果比 baseline 高就是满分。midterm 和 final 也都没什么难度,Jishen 会明确表示一些难的知识点不考。由于我上的那学期是第一次纯线上授课,因此 midterm 出现了一些小问题:所有人的题目是一样的,但做题是随机打乱,并且做完一题才能做下一题,不能回看,导致有些非酋第一题直接随机到了最难的那题然后心态爆炸。但目测现在应该是没有这些问题了。
建议先修:C++,汇编

---

课程名称:CSE 291 Top/Computer Sci & Engineering - Unsupervised Learning
授课老师:Sanjoy Dasgupta
给分情况:A 68.6%,S 28.6%,平均 GPA 4.0,人数 105(由于疫情原因,这学期课程可选 S/U,只要拿 S 即可计入学分)
教学内容:一些经典的无监督学习算法,例如 knn、clustering、embedding 等。上课以提出问题 + 分析 + 给出证明为主,Sanjoy 手写 lecture notes 以及画图。有 4 个 assignments,大部分是数学证明。只有一个 open project,可以自选任意无监督学习方法进行一些探索。
个人评价:Sanjoy 讲课非常清楚,lecture notes 也非常清晰,全程几乎没有什么理解方面的问题。assignments 虽然是证明题,但难度并不大,非常有趣,每道大题的几个小问会一步一步推动你得到最终的结论,并且大部分题目不需要本科难度的数学技巧。open project 我选择的是 locality sensitive hashing,还发现了课上讲的一个小错误。总体来说这门课比起 AI 课来说,更像是一门数学课,即使不想上 AI 的也可以一试。而且我上的那个学期给分极好。最近一个学期应该是加入了一些编程作业。
建议先修:线性代数,概率统计,LaTeX

---

课程名称:CSE 107 Intro to Modern Cryptography
授课老师:Nadia Heninger
给分情况:A+ 3.3%,A 24.8%,A- 14.9%,平均 GPA 2.97,人数 121
教学内容:本科难度密码学知识三大件,即古典密码学、对称加密和非对称加密。课程主要是从各种 adversary 来展开,例如 PRF、IND-CPA、UF-CMA 等,非对称加密部分讲的是 RSA 和 DH key exchange 以及后续的 certificate 和 TLS 等,没有讲到椭圆曲线。最后还介绍了一些 topic,例如 government backdoor 和比特币等。有挺多 assignments,前半学期的 assignments 以证明为主,后半学期的 assignments 以给出一个加密方式,编写 adversary 代码为主。midterm 考察判断题、证明以及手写 adversary 伪代码,final 除此之外还考察了简答题,并且难度较大,需要对一些概念有较深的理解。
个人评价:这门课可以说是弥补了我本科没有学过密码学的遗憾了。课程的前半部分难度不大,但从 RSA 开始就需要比较扎实的离散数学和组合数学功底,才能理解例如群、扩展欧几里得算法、欧拉函数等概念以及 RSA 算法本身。这就导致课程后半部分的作业需要的时间方差极大,根据 survey 大概平均每周需要 3-4 小时,最多的可能需要 10 小时以上,但我可以在半小时之内搞定。对于 midterm 和 final 来说,大部分题目与 Nadia 给出的 midterm sample 和 final sample 很类似,如果 sample 可以独立完成的话,考试就不会有什么问题。除此之外 final 考了一些难度较大的简答题,想做好这一部分一定要把知识点都整合起来,例如 AES/RSA 只能加密固定长度的 block,那么要想用它们来加密(或者 hash)任意长度的 block 需要怎么做。
建议先修:Python,离散数学,组合数学,概率统计

---

课程名称:CSE 202 Algorithm Design and Analysis
授课老师:Ramamohan Paturi
给分情况:A+ 7.1%,A 27.7%,A- 15.2%,平均 GPA 3.4,人数 112
教学内容:经典的算法合集:分治、贪心、动态规划、网络流、NP 和近似算法。有 5 个 assignments,其中 assignment 0 不算分,每个 assignment 包含 4-5 题,每道题需要写三段论:算法描述、正确性证明、时间复杂度分析,但只会随机选其中的 2 题给分。有 2 次 midterm 和 1 次 final,midterm 的题目形式和 assigment 一致,但只有 3 题,第一次 midterm 考察分治、贪心、动态规划,第二次 midterm 考察网络流。final 考察所有知识点,形式除了 midterm 以外还有若干判断题。
个人评价:不是很建议选 Ramamohan 的 202,可以考虑选其它老师的。作为一名印度教授,他的口语非常的迷惑,我只能靠教材自学。每一个 assignment 都要花掉我差不多两个晚上的时间,写出 10 页左右的 LaTeX,打公式打到想骂人。关键是 assignments 一共只占 10%,真的是做之无味,弃之可惜。midterm 只给 75 分钟,需要手写每一题的三段论,每次考完手都直接废了。这门课有两个 section,期末考试时间不一样,section B 先考,很多人两小时就全做完交卷了,section A 考得巨难无比,网络流考了最小割证明,近似算法考了一个上课完全没有讲过的模型,最终两个 section 给分差距也不小。TA 有的时候眼神不好,作业乱改,我 argue 过两次作业和一次 midterm,都成功了。我这门课本来应该全满分的,结果 final 给我贪心证明扣了一分,我算了下不 argue 也没问题就懒得管了。
建议先修:时间复杂度分析,数学证明方法(数学归纳法、反证法等),LaTeX

---

课程名称:CSE 258 Recommender Sys&Web Mining
授课老师:Julian McAuley
给分情况:A+ 51.3%,A 32.3%,A- 11.1%,平均 GPA 3.93,人数 226
教学内容:虽然课程名称包含 web mining,但我上的那个学期并没有讲爬虫相关的知识(前几年是讲了的),主要还是讲比较经典的机器学习模型,例如 regression,logistic regression 以及一些推荐系统模型,例如协同过滤,latent factor 以及一堆 xxxFM,还讲了讲基础的 nlp,例如 BOW,TF-IDF 之类的。有 4 个 assignments,可以 drop 一个分数最低的,每个 assignment 大部分是写 python 代码来处理数据和训练模型,以及一点点的证明。midterm 和 assignment 的结构几乎一样。project 有 2 个,第一个是打 Julian 自己搞的一个 kaggle 比赛,根据绝对排名(超过 baseline)和相对排名给分;第二个 project 是 open project,可以自选一个数据集和一个 prediction task。
个人评价:同样这是一门在「水」维度性价比很高的课,愿意在于可以 drop 一次 assignment,这就导致在 midterm 结束之后,如果第一个 kaggle project 做得差不多了,那么之后就只有一个 open project 了,其它啥作业都没有,甚至连课都不需要听了。除了 kaggle project 以外,其余的工作几乎都是按部就班地读题目 + 写代码就能拿到满分或接近满分,kaggle project 的数据集只有 user id,item id 和 prediction(也有 description,但大部分人不会用到),想要在这个基础之上建立一个模型,非常容易在 hidden test data 上面过拟合。
建议先修:Python,Jupyter Notebook,线性代数,概率统计

---

课程名称:CSE 224 Graduate Networked Systems
授课老师:George Porter
给分情况:A+ 60.8%,A 16.2%,A- 9.7%,平均 GPA 3.78,人数 278
教学内容:前两周复习本科 network 里面的概念,例如 latency/throughput、DNS、socket、TCP 等。之后讲了分布式系统中用到的一些 design 和 protocol,例如 rpc、两阶段提交、一致性哈希、bloom filter、RAFT。一共有 6 个 project 占了 95% 的分数,前两个 project 旨在帮助学习 go 语言和 go channel + goroutine,后三个 project 分别是 HTTP server、single storage system server 和基于 RAFT protocol 的 multiple storage system server。最后一个 project 和剩下 5% 的 paper reading 基本算是送分。前四个 project 是 hidden testcases,第五个 RAFT 是 visible testcases,期末可以选择两个 project 重新提交并取较高分。
个人评价:说实话这门课并没有达到我的期望,但也算是还凑合的 project-based 的研究生课了。究其原因大概是因为今年扩容了,所以 project 放水特别严重,特别是 RAFT 的部分,往年是 code from scratch,我上的学期给了 starter code + visible testcases,属于是怎么写都能满分了。再加上删除了 dynamoDB 的作业,并且允许期末两次重新提交的机会,使得这门课并有维持神课的地位。很多的时候写复杂的代码往往吃力不太好,原因是 testcase 即使 hidden 也太水了,一般就测个几台服务器传个十几次数据,代码里能用一把大锁就不会用更细粒度的锁或者读写锁,能把文件直接全部下载下来就不会增量下载。所以如果想认真学习分布式的话还是建议 mit 6.824,这门课最多入个门。
建议先修:Go,本科 network 中 HTTP、TCP 部分,本科 OS 中的锁部分

---

课程名称:CSE 291 Top/Computer Sci & Engineering - Virtualization
授课老师:Yiying Zhang
给分情况:A+ 7.3%,A 58.5%,A- 19.5%,平均 GPA 3.87,人数 41
教学内容:主要包含四个部分,各种硬件(IO、memory、CPU、GPU、甚至 FPGA)的虚拟化技术以及 VMM,容器(LXC、Docker、K8s),serverless computing,虚拟化安全。每周需要读 2-3 篇 paper 并且写 review,课上主要也是基于阅读的 paper 展开进行讲解,还会补充很多背景知识。有三次 quiz,大部分是选择题,也会有少数简答题。有一个 open project,大部分组选的 goal 是(1)profile VM platform(2)profile Yiying 组里的一个 project。
个人评价:这门课其实是 out of my expectation 的,因为真的是我上过的最难的一门课了,并且最后剩下的 41 个人也很多都是 system 大佬,我在 final pre 之前甚至一度以为自己要挂科了。不过后来发现除了一个组之外,大家 final pre 都没做出来啥可行的东西,也就知道了不止我一个人或者我们一个组觉得难。我觉得 paper 的部分的帮助很大,三次 quiz 的难度也越来越正常,但如果 project 部分能够不那么 open,或者规范一些就更好了,很多组在初期都花费了大量无效的时间去调研。并且这门课讲的知识以及背景知识真的很多,Yiying 有的时候讲不完就会疯狂提速,导致最后很多东西其实没怎么搞懂。不过这门课应该也是第二年开,以后还有很大的改进时间和空间,我感觉也学到了不少的系统设计理念和虚拟化知识。
建议先修:本科 OS,本科 arch

---

课程名称:ECE 141A Software Foundations I
授课老师:Richard Gessner
给分情况:A+ 5.9%,A 10.6%,A- 9.4%,平均 GPA 2.84,人数 85
教学内容:前三周讲 modern C++ 中的一些新特性,例如 variant、any、function、lambda function 等,后几周讲各种设计模式。这门课事情非常多,包括每周一次的 quiz,六个 project,四次 peer review,各种时不时出现的 extra credit,在正常课程和 TA session 之外的 dojo time,不考试的 midterm 和 final。quiz 基本是选择题,在讲设计模式时也会有简答题,project 有五个是写代码,一个是纯设计,其中写代码的 project 提供 autograder,但分数除了这部分之外还有 peer review 和 TA review 组成。peer review 是审核另一个学生的前四次 project 并打分,midterm 是和 TA 1 on 1 讨论前两次 project 的代码,final 包括选择题、简答题和写代码题,其中写代码题的部分和 project 类似。
个人评价:这门课是我上过最 unorganized 的一门课。Richard 并没有 PhD title,只是个 lecturer,授课水平很差,课上疯狂夹带私货,并且这些私货在 final 中大量出现。例如他认为 if (a == 3) 是 anti-pattern,应该写成 if (3 == a),因为前者容易写成 if (a = 3) 导致很难看出来 bug,但这都 2202 年了,一个正常的编译器都能给出 warning。再例如只有在他 slides 里出现的,而 google 都查不到的 inside-out 和 outside-in 设计模式,让我不禁怀疑他是不是 in-and-out 的忠实粉丝。而 modern C++ 中最重要的概念「右值」他竟然提都没有提。project 本身的质量也特别差,有些 project 甚至不 make sense,例如第一个 project 甚至需要我们在 int,float,string 类型之间实现一个比较函数,很多 project 给的 starter code 的格式(尤其是缩进)乱七八糟,我只能说学过 2 年 C++ 的人写出的代码都能比他写得好。平均每个 project 会被学生找出一个 bug,而 Richard 修改 bug 的形式竟然是发 canvas 邮件通知「应该将代码的 x 行的 yyy 改成 zzz」,而不去改 Github 上的源代码。对于 peer review 环节,其中有一次对方的代码就没有正确按照 canvas 邮件修改,导致我根本不知道如何 review;另一次对方甚至都没有实现要求的函数,我直接给了个 0 分。这类 peer review 除了浪费时间,把本来应该 TA 做的事情安排给学生之外,没有任何用处。除了 Richard 本人以外,他的 TA 水平也很差,并且还懒。第三个 assignment 大概是第 5-6 周的 ddl,我直到期末考完了才收到 grade,并且在此之前我发邮件询问 TA 时,被告知我的 assignment 他们忘记 grade 了。他们整个授课团队就好像活在自己的世界里一样,教着自以为是的 C++ 和设计模式,沾沾自喜,与现实世界完全脱节。Richard 是 2018 年 Lecturer of the Year,如果他不是在撒谎,那我都不知道这到底是谁的问题了。
建议先修:C++,面向对象

【Part2:我了解过的课】
CSE109,Introduction to Programming Contests:算法竞赛,授课老师 Jingbo Shang 是 ICPC World Finals 2013 亚军
CSE 127,Intro to Computer Security:网络安全,project 主要是做 hack,非常有趣,每个 quarter 都有
CSE 150B,AI: Search and Reasoning:搜索优化,project 是写各种游戏的 AI,授课老师 Sicun Gao 在 ratemyprofessors 上评分 5.0
CSE 207A,Modern Cryptography:和 CSE 107 用的同一套课件,但作业难度加大(偏证明),并且给分很严格
CSE 207B,Applied Cryptography:和 CSE 107 用的同一套课件,但作业难度加大(偏 adversary)
CSE 210,Principles of Software Engineering:全栈课,project 是做一个全栈项目,组队,其它的事情也不少
CSE 221,Operating Systems:每周需要读 4 篇 paper,project 是做系统的 profiling,如果一个学期都跟上了会对整个 system 领域的设计有充分的了解
CSE 223b,Distributed Computing & Systems:被称为 grad 最硬核的课,强制要求先修 CSE 221,任务量巨大,有 paper reading,quiz,project 和 open project
CSE 250A,AI: Prob. Reason & Learning:以 final 题量巨大而著名
CSE 251A,AI: Learning Algorithms:AI 水课
CSE 257,Search and Optimization:与 CSE 150b 类似

【Part3:一个和选课无关的小 tips】
0. 对于组队的课程,一定要选好队友,优先选认识且靠谱的,如果没有就要做好自己一个人挑起大梁的觉悟,和不认识的人组队,划水的概率很高