希慕阿巴阿巴 发表于 2023-4-10 22:31:46

盘点CMU SCS计算机学院的硬核系统课

开篇

时光如梭, 白马过隙. 在北美知名技校的两年读研时光很快就要过去. 临毕业前夕, 想要来记录盘点一下自己上的SCS计算机学院下的15-XXX开头的硬核系统课, 为后来者提供一些介绍和见解. 两年下来, 虽然自己也勉强算是本科CS科班出身, 但是本科的课程和在CMU这里感觉难度上天壤之别, 也算是回炉重造"转码"了.
其实项目一开始的时候我选的是Analytics机器学习方向, 但学了一学期后果断决定半路跳车去学System系统方向. 原本三学期就可以毕业了, 愣是为了把System Track想上的课上完多在匹村带了一学期. 做决定的时候其实内心也有过挣扎: 真的有必要学这些课吗? 毕竟现在的北美市场找工作只要会做Leetcode就行, 剩下就是看命和运气.
但或许是因为年轻, 我的观点或许是错的. 我总还是觉得有些东西只有在学校里才能静下心来学扎实了, 未来才能在技术的道路上走得顺利走得长远. 未来要工作20年, 30年, 在此之前多花一学期的时间扎实基础应该还是不亏的. 但愿如此吧!
15-513 Introduction to Computer Systems

版本: Spring 2022
传送门: Introduction to Computer Systems
性质: 公开课
编程语言: C
个人评分: ★★★★★
课业压力: ★★★★☆

这门课便是网上无人不知无人不晓的计算机系统入门神课, CSAPP这本书的配套课程. 在知乎上我看到过好多同学自学CSAPP并做这门课配套的lab, 以及对一些lab的详解, 学习气氛非常浓厚.
课程的内容主要是针对现在计算机系统的一个比较广泛, 但点到为止的介绍. 其中的一些核心概念包括:

[*]字节码的底层表示
[*]汇编语言的理解
[*]x86架构的指令执行
[*]内存结构与布局
[*]硬件缓存与策略
[*]虚拟内存的架构实现
[*]信号、中断、异常
[*]基础网络通信
[*]基础并发编程
Labs主要是以C语言为主, 都是单人project, 其中attack lab和bomb lab是人眼分析解读汇编并写输出.

[*]data lab是热身lab, 熟悉一下各种位运算的小tricks
[*]cache lab是写一个in-memory cache
[*]malloc lab是在一个虚拟出来的heap上分配管理内存, 需要由简到难逐步实现implicit list, explicit list 和 segregate list 外加一些mini-block管理的优化. 是所有lab里代码量上最多的一个, 大概得有1500-2000行左右最后.
[*]shell lab是要实现一个terminal, 能支持前端/后端运行指令. 这个lab是个人觉得最诡异的一个, 因为本身对signal信号不是很了解, 做的时候有点懵懂, 犯了好多race condition的错. 但其实做完后吧, 还是感觉对signal信号有点心里发怵, 敬而远之.
[*]proxy lab是要实现一个坐落于client和server中间的网络代理层来进行缓存, 加快服务器的响应时间. 这个lab其实是比较轻松的, 因为底层套接字socket都被提供的starter code封装好了, 很大程度上调包就完事儿了.
总体而言, 个人觉得这是来CMU但凡学计算机相关的专业, 绝对值得一上的神级基础课. 很多时间感觉, 上和没上过这个课是一个"有无基本系统知识素养"的分水岭.
15-619 Cloud Computing

版本: Spring 2022
传送门: CMU 15-619 Spring 2020 Home Page
性质: 封闭课
编程语言: Java & Python
个人评分: ★★☆☆☆
课业压力: ★★★★★

这门课是15学分的云计算导论, 其实对他的评价是比较矛盾的. 一方面来说, 这课给我带来了在CMU最狠的熬夜的一学期, 做team project的时候常常是一周和队友一起熬大夜: 中午12点在自习室集合, 坐牢坐到第二天早上4、5点太阳出来了再离开回家睡觉. 这样的日子一周能有两三天 (要夸一下我的两个队友都是神仙队友, 一起干活毫不马虎都全力以赴). 另一方面来说, 这门课的team project真的是非常扎实, 是那种可以写在简历上和面试官好好吹嘘一番的有深度的感觉. 但其实现在感觉, 课上很多搞配置的那些知识又遗忘的差不多了, 可能以后重新需要的时候可以快一点的pick up.
先说一下每两周一个的单人individual project:

[*]AutoScaling: 让你用Amazon AWS的Java或Python API集来监考你的cluster的workload, 如果高了就要加机器, 如果低了就要减机器, 最后根据满足的requests数量和VM的时间总和来算分. 中规中矩的一个project, 代码量倒是不少, 需要仔细的阅读Amazon AWS的API手册
[*]Web Tier: 这个project主要是让我们熟悉Web的不同tier的结构和使用Helm来操作K8S cluster. 最终是需要为了容灾的考虑, 把服务器同时部署在Microsoft Azure和Google GCP的云上, 并分流. 还是比较让人开眼界的
[*]Database: 这个project是让我们操练不同的database. 从正常的relational的MySQL开始, 然后是NoSQL的HBase, 最后是GraphSQL. 感觉还是比较有趣的, 工作量中等
[*]Large-Scale Processing: 这个project是让人用Spark做一个PageRank的算法. 要求用Scala完成. 非常的简单, 代码加起来不超过50行就能做得到. 之前从没用过Scala, 稍微看了一会儿入门手册, 函数式编程倒是让人感觉有点意思.
[*]Kafka/Samza: 这个project是让人操作流式Streaming数据的. 具体的是说有一个打车软件, 你需要实时匹配乘客和司机并更新大家的位置. 纯调Apache Kafka和Samza的包, 问题不是很大, 还算挺有意思的.
[*]Machine Learning: 没做. 只需要完成6个projects里的5个, 由于我前5个都做了, 这个直接跳过没做.
再来说说噩梦般team project:
三人组队. 这个project一共分三个阶段, 会先让你写出3个microservices然后优化他们的表现, 部署在AWS上用不同的配置和容器. 在阶段二和阶段三的时候分别有一小时的live test来横向比较所有team的表现来排名, 排名高的有extra bonus points. 这个team project大部分时间都在试错, 因为从零开始部署一个Service会需要经历各种各样奇怪的问题: Docker build不起来, build了但跑不了, load balancer连不上网, load balancer特别慢, database连不上, database disk I/O太高被AWS卡住了, etc. 每一步都是血与泪与熬大夜的经验教训所得. 很多时候非常气人的是, 在piazza上如果你去提问问助教问题, 助教要么是不回复你, 要么是回复得牛头不对马嘴, 或者索性谜语人说不能告诉你要自己去解决. 很多时候真的是看了piazza感觉生气得当场要脑淤血昏过去了.
好在在三人一起熬了一学期努力下, 最后我们的team project还算是成功, 在二阶段和三阶段都分别拿下了全班前三的成绩 (其实发现前几名基本上全是同届的MCDS的同学, 因为这是必修课).
总体来说, 我觉得这个课其实是比较综合的, 并不是很上来大家一来CMU就直接上. 我有听说别的学院转码的同学一来就选这门课, 说是因为这门课是online的所以没有SCS名额限制才能选的上. 我觉得这个是比较误区的, 一上来就上这个课会让你的一学期生活非常悲惨和倍受打击, 我觉得大可不必. 如果是为了了解一下云计算方面的知识, 我觉得上本科版本课号的15-419就可以, 因为本科版本不需要做team project, 那样的话体验还是会更不错的.



阶段三的最终排名, 我们组叫ThreeCobblers, 寓意三个臭皮匠顶一个诸葛亮

15-645 Database Systems

版本: Fall 2022
传送门: CMU 15-445/645 :: Intro to Database Systems (Fall 2022)
性质: 公开课
编程语言: C++
个人评分: ★★★★★
课业压力: ★★★☆☆

这也是一节有名火爆的数据课方向的公开课, 网上也有不少人自学做labs. 之前写过一篇关于这门课的文章, 可以移步:
总体而言是非常好评的这节课.
从lectures来说, 教授Andy他是真的懂数据库的, 讲得非常清楚, 课上还经常会直接terminal打开mysql, sqlserver和postgres开始demo做演示. 核心内容包括:

[*]数据存储形式与压缩
[*]哈希索引和B+数索引
[*]并发管理算法
[*]排序、集合、Join的不同算法
[*]Two-Phase Locking
[*]Timestamp Locking
[*]MVCC
[*]故障恢复
[*]分布式数据库简介
从labs来说, 这节课BusTub的labs自成一体, 单人projects, 选取4个比较重要的compoents让同学实现. 我上的这个学期分别是:

[*]P1 (缓冲池 Buffer Pool Manager): 为了更好的管理磁盘页和内存页之间的映射同步, 要求实现可扩展哈希表(Extensible HashTable)和LRU-K置换算法
[*]P2 (B+ Tree Index B+树索引): 为了更快地检索和遍历数据表中的大量数据, 要求实现了一个支持并发的B+树索引和迭代器
[*]P3 (查询执行 Query Execution): 为支持SQL查询(最新版的BusTub增加了基础SQL语句的Parse和Query Planning), 要求实现了顺序扫描,索引扫描,插入,删除,投影,过滤,嵌套循环join,索引join,哈希join,聚合,排序,limit,top-N等核心执行功能
[*]P4 (并发事务管理 Lock Manager): 为了管理并发事务, 要求实现资源锁管理器来根据不同的事务授予/阻塞资源锁请求.它支持READ_UNCOMMITED,READ_COMMITTED和REPEATABLE_READ作为事务隔离级别和分层的资源锁
个人感觉, 从难度来说P2 > P1 = P4 > P3. 不知道为什么, CMU很少课是用C++的, 要么是C要么就是Python. 所以这节课还可以操练一下Modern C++, 感觉还挺珍贵的. labs都是在gradescope上自动评分的, 可以无限次提交. 而且TA的回答问题非常到位和迅速, 给予很大的帮助 (和上面15619形成了鲜明的对比). 而且数据库这个概念本身, 在实操中就非常常用,所以我觉得在众多15-XXX系统课里是属于优先级比较高需要上的.
此外, 这节课的gradescope有个排行榜, 一学期下来累计在排行榜上排名高的, Andy会发一件BusTub短袖衣服. 穿着这衣服在CMU校园里逛的时候可神气了!


15-641 Computer Network

版本: Fall 2022
传送门: Networking and the Internet, Fall 2022
性质: 封闭课
编程语言: C
个人评分: ★★★☆☆
课业压力: ★★★☆☆

计算机网络也算得上是计算机教育体系里非常基础的课程了. 在本科阶段我没选上计算机网络的选修课, 所以心里一直有点遗憾念叨着这门课, 来CMU强行拉着我的队友总算圆梦了. 这门课人数挺少的, 在一个小教室里上大概30,40个人, 并不算是一门热门的SCS系统课.
教授Justine Sherry's Homepage 比较的风趣幽默, 很典型的美国白人女孩儿风格, 上课还会给大家带糖吃. 课程的内容其实还比较分散, 大概2~3节lectures就能讲完一个话题. 核心概念有:

[*]链路层: Routing算法(Distance Vector, Linked State Routing, SDN)
[*]网络层: IP Routing, Ipv4/6, Subnetting, BGP算法, Gao-Rexford条件
[*]传输层: UDP, TCP(三次握手四次挥手, 阻塞调控)
[*]DNS, CDN, 视频传输的BBA算法
[*]TLS, 对称与非对称性加密传输, 安全认证
[*]网络虚拟化
这节课一共有3个双人组队labs的, 其实内容本身还算比较的有趣solid, 唯一不足的地方就是自动评分的gradescope时常有bugs, 比如它卡时间卡的非常紧, 你一个包非得在1秒到2秒之间到, 你0.8秒和2.2秒都算你错, 而且gradescope掩掉了stdout所以你并不知道到底是哪里出了问题, 究竟是代码crash了还是只是单纯的和他的要求不符等. 具体的3个labs内容包括:

[*]Mixnet安全混合源路由:为了在网络中实现安全通信,Mixnet实现了链路层(Linker Layer)的报文路由的加密,重定向和混合, 以防止网络中的窃听者. 从生成树协议(Spanning Tree Protocol)来构建网络拓扑, 并用Dijkstra最短路径加上混合路由来传包
[*]TCP Protocol: 直接了当, 请实现个TCP协议. 使得可以在两端用户之间建立双向有序可靠的数据传输, 是网络模型结构中传输层的一个协议. 要点包括:三次握手四次挥手(SYN/FIN),数据块排序重组(stream reassembl),流量控制(滑动窗口),重发机制(指数补偿),状态转换(有限状态自动机), 等
[*]Http: 分别实现HTTP server和client. 服务器端解析和验证HTTP请求, 并支持GET,HEAD,POST方法且能I/O复用同时服务多个客户端. 客户端会根据依赖关系构建图, 并为单个客户端实现流水线多请求和并行连接, 以获得更好的性能
这节课其实在所有SCS系统课里, 并算不上是优先级特别高的课. 大部分人的工作中, 对计算机网络有个大致的了解其实就可以了, 很多细节最多只能算是锦上添花的good to know.
但我个人somehow非常喜欢这些计算机网络的话题内容. 在十二月份结课后的圣诞节, 我决定把这节课的labs的内容合起来规整一下做成一个自己的项目 -- 一个轻量的C++网络库. 持续更新中, 现在github已经收集了100颗星星✨. 我在知乎也有直播这个项目的进度, 希望有兴趣的同学可以关注并star一下我的Turtle.
15-640 Distributed System

版本: Spring 2023
传送门: Distributed Systems
性质: 封闭课
编程语言: Java为主
个人评分: ★★★★☆
课业压力: ★★☆☆☆

这门640分布式系统应该是很多来CMU上课的同学的心中梦课了. 它有两个版本, 秋季很潮流是用Go来做labs, 春季比较复古是C(1个project)和Java(3个projects).
教授Satya 资历非常老, 是上个世纪80,90年代主导编写CMU的andrew file system的主力军. 他的lectures风格是那种, 一节课80分钟只讲了10页PPT但却让你听的津津有味的类型. 我个人觉得这种风格挺不错, 把要讲的东西都讲的很清楚, 虽然也有别的同学觉得讲的太慢了. 不过可能是因为上过不少系统课了的话, 并没有觉得在这门课里学到很多新东西, 大多时候都更像是一种复习. 核心概念包括:

[*]分布式系统的历史与演进
[*]网络通信的不稳定性对分布式系统带来的挑战
[*]RPC与实现
[*]缓存和Prefetching的重要性
[*]分布式系统中各种错误的可能性与防范
[*]系统扩容
[*]分布式共识协议: Two-Phase Commit, Quorum, Paxos
[*]分布式系统的安全
一共有4个单人project, 前两个代码量稍微大一些, 后面两个好做一些. 内容分别是:

[*](C) 文件rpc远程过程调用: 用TCP Socket实现rpc call来"重载"一系列基本的如open, write, read, lseek, close等system call使得这些指令被传输到远程机器上执行并打包返回. 服务端可以并发地处理对不同文件进行操作的多个客户端, 并来回序列化/反序列化参数和错误码. 比较扎实和tedious的一个project, 让人深刻的明白写rpc的stub是多么的麻烦, 所以在现实生活中应该尽可能去调现成的rpc的包
[*](Java) 分布式文件缓存代理: 多个客户端可以连接到一个本地代理; 多个本地代理可以连接到一个中心服务器. 文件缓存提供打开文件时会话语义的一致性(session-semantics consistency),并使用Check-On-Use方法保证缓存的新鲜度
[*](Java) 自扩容与缩容: 这是我个人觉得比较无聊的一个project. 它用Process来模拟VM, 然后会不断的给你的Server发请求, server需要根据当前的流量决定是否需要扩容或者缩容. 和15619的第一个project非常的类似. 但有点搞笑的是, starter code里给了一些library 是 java class的形式, 但是用现代IDE比如IntelliJ打开后, 可以直接反编译读到一些重要变量的值, 比如一个request需要多久执行, 前后端process所需要用时等等, 直接就能很简单的计算出需要多少的VM了. 我很怀疑老师是不是以为给大家一个Java class而不给源码大家就看不到这些值了
[*](Java) 分布式事务-两阶段提交: 这个就是比较经典的Two-Phase Commit的实现. 在阶段一中, 主节点向每个参与节点提出事务, 希望获得一致同意. 在收集完所有参与者节点的投票后, 主节点做出最终决定(提交Commit或中断Abort)并进入第二阶段, 将该决定分发给每个参与节点. 为了应对各种可能的故障, 主节点和参与节点都使用预写式日志(Write-Ahead Logging)来实现状态持久化和崩溃恢复. 整体比较的直观, 很快就能写完. 感觉autolab的test case其实是不太全的, 稍微处理一下failure case就能过, 但我其实心里知道某个角落里估计代码还有些小问题
整体而言, 这节课还是比较值得一上的, 尤其是在如果你只能选很有限的SCS系统课的限制下, 这门课因为比较包容万象, 优先级应该比较高. 但也能感觉到课上有些同学的基础比较薄弱, 应该是没上过15513就来上了这门课. 我是比较喜欢在piazza上回答问题的, 但有些同学的问题实在是有点好笑让人忍俊不禁, 没法回答.
15-618 Parallel Computer Architecture and Programming

版本: Spring 2023
传送门: 15-418/15-618: Parallel Computer Architecture and Programming, Spring 2023
性质: 封闭课
编程语言: C++
个人评分: ★★★☆☆
课业压力: ★★★★☆

这门课我觉得可能是SCS 15-XXX课里对硬件讲得最多的一门课了. 在本科阶段的时候就上过一门并行计算的, 当时对那些机器结构啥的学的迷迷糊糊, 在这门课里总算是都学明白了. 但这门课的workload有点大: 首先它每周要上3节lectures,一节课可以讲上100页PPT, 快得像开飞机.lectures上70%学期, 2次考试. 然后放你4周时间做一个final project.
课程的核心概念非常的多和扎实, 包括:

[*]不同的并行编程模型概述
[*]GPU架构与CUDA编程
[*]共享内存并行 OpenMP, Clik
[*]进程间通信并行 MPI
[*]调度scheduling和locaity
[*]硬件缓存一致性(cache coherence)的架构与实行
[*]Interconnect的不同硬件建筑方式
[*]内存一致性模型(memory consistency)
[*]精细锁与lock-free无锁编程
[*]事务性内存(transactional memory)
[*]深度学习中的并行运用
整个学期有4个双人组队的projects:

[*]ISPC: 用Intel的ispc指令集来写vectorization向量化的代码来加速计算
[*]CUDA: 用CUDA来编写GPU的程序来处理一个图像处理的问题
[*]OpenMP: 用共享内存的并行编程的方式来加速经典物理模拟问题N-body-simulation
[*]MPI: 用进程间通信的方式来加速同一个N-body-simulation问题
虽然我在上面轻描谈写的描述了这4个projects, 其实他们都是有很大的workload的. 首先, 每个projects都对应一种不同的并行编程模型语言, 要写一个正确的版本已经需要花一定的功夫了, 而且每个projects的要求都非常高, 常常需要用perf和gprof去仔细profile程序每一步的耗时和瓶颈在在哪里, 要优化到非常极限的地方才能拿满分. 这点我其实不是特别喜欢, 很多时候其实只有1种特定的优化算法可以达到要求的性能, 你不断的迭代优化提升都非常有限, 直到你最终想到了那种特殊的优化算法后一下子就柳暗花明了. 但做出来后确实是非常有成就感: 最终优化的版本可能比你写出来第一个正确的版本要快上千倍, 都是你和队友一点一点优化出来的.
学期末有个为期4周的组队final project, 任何和并行计算相关的话题都可以, 时间其实还是挺紧张的没法做太大的project. 我和队友现在正在施工中, 打算做一个线程独立队列、带工作偷取功能的threadpool来取得更好的workload balance.有兴趣的话可以持续关注
总体来说, 这门课比较的底层low-level, 对硬件感兴趣的同学可能会觉得非常有趣, 不感兴趣的同学可能碰都不会碰. 在选课优先级上应该也不算是特别的高, 即不是特别热门的课. 对底层优化有兴趣的同学可以挑战一下.
遗憾

最遗憾的就是没有时间和精力, 或许也没有胆量, 去上15-610 Operating System Design and Implementation. 这课最终的成果是你写一个操作系统, 然后load进一个光盘里可以在一个老旧的电脑上跑起来. 在朋友圈我有看到过成功上下来的同学拍的视频, 在教授的办公室里那个老旧的电脑上把自己写的操作系统跑起来的成就感.
但我没有足够的时间去上了, 如果上这门课的话可能一学期啥别的事儿都不用干了. 我们项目里有基础很不错的同学曾挑战上这个课, 最后都是期中后drop了这门课因为workload太大了, 没能完成.
立个flag: 以后得了空, 一定得把MIT那门公开课的那个OS lab给他写出来, 实现一下我想要自己写操作系统的小目标.
结语

两年的时光, 我觉得值了. 村里真的很枯燥无聊, "好在"CMU作业够多让人一起忙碌着没空闲下来.
最近如果空了的话应该会继续修修补补我的Turtle项目, 把Timer定时器做完后, 争取能在6月前第一版定型收尾.
有兴趣的小伙伴可以关注我的github: https://github.com/YukunJ 求粉求星星

-----------------------------

周亦 发表于 2023-4-10 23:35:39

[惊喜]居然没上15410

断桥烟雨ミ旧人 发表于 2023-4-11 00:40:45

妈的 本科期间刷到就好了[生气][生气]

包容 发表于 2023-4-11 02:18:05

[笑哭]实力不允许啊

晓玲 发表于 2023-4-11 03:41:32

[害羞]现在看看也不晚的!

14别好吧 发表于 2023-4-11 05:02:51

羡慕能够接受这么优质的教育[赞]

糯米糍 发表于 2023-4-11 06:24:21

看完受益良多,感谢!

小女孩 发表于 2023-4-11 08:17:28

作者是美本吗[思考]

益琳骅 发表于 2023-4-11 09:24:48

是滴. 看我主页~[爱]

奇迹 发表于 2023-4-11 10:31:03

带我走吧 [大哭][大哭][大哭][大哭]
页: [1]
查看完整版本: 盘点CMU SCS计算机学院的硬核系统课