CMU 計算機選課上有什麼特別好的課程推薦?

可以為後來人做借鑒~


懶癌晚期患者拖到畢業半年後才寫完這篇文章,主要是最近有太多學弟學妹們問我選課的問題,所以就想把這篇文章趕出來造福CMU的同學們。介紹一下自己,我是15spring入學的MS in ECE, 16年五月份畢業,目前在Google工作。在CMU一年半的學習生涯中收穫了很多,同時也走了一些彎路,所以寫下這篇課程介紹的文章,供學弟學妹們參考。我以下介紹的這些課都是我自己實際上過的,並且都拿了A的,每門課包括了課號、我所上的學期、課名、介紹以及針對考試的一些建議。

15213 (15 spring) Introduction to Computer Systems

這門課我想不需要做過多介紹,CMU的招牌課程,基本是每個在CMU學CS的人都必選的課。唯一需要提醒的是,如果有機會在暑假修這門課,那麼請務必在暑假就把它修掉,因為有很多後續課程都需要這門課作為先修,而且即使是碩士生也不能waive。為了在進入CMU之後可以自由地選課,花費暑假的時間學15213是值得的。平時作業是7個lab,再加期中期末兩門考試,期末考試考全學期內容。如果不讀textbook的話,周花費大概在10-15小時(然而如果你有空餘的時間,強烈推薦讀一遍textbook,基本讀完面試中的「硬知識點」就不虛了)。

Cracking the exam: 看ppt+刷歷年題足矣,如果時間緊可以只刷題。

15619 (15 spring) Cloud Computing

著名的cc,基本是每個中國人都會修的課程。這是一門純project課和純網課,基本是每周一個 individual project、每周一次quiz的節奏。後半學期會有team project (三人),和每周的individual project、quiz同時進行。Individual projects 的東西很雜,包括AWS (EC2, S3, ASG, EMR, ELB)、DB(HBase, MySQL, DynamoDB)、Hadoop(MapReduce, Hbase, HDFS, Hive, YARN, Spark)以及很多奇奇怪怪的東西(Concurrency, shell scripting, etc.)。Team project 主要是搭一個Web Service,包括前端和後端。期間會用到Load balancing, horizontal scaling and Database storage的知識。整個system需要滿足一定的throughput和latency的需求。 聽說從上學期開始支持的query包括read和write,更加加大了team project的難度。 總的來說,這門課唱好唱衰的聲音都有,Quora和知乎上都有專門關於15-619課程討論。說這門課好的人,覺得這門課什麼知識都會涉及到一些,有種一門課抵十門的感覺,而且也接觸到了各種「高大上」上的東西,比如MapReduce, Hadoop, Spark。 說這門課差的人覺得這門課在各方面都走馬觀花、淺嘗輒止,所謂的高大上的東西也早就已經是十多年前的陳舊知識,而且這門課用時太多(有team project的時候基本是每周50個小時的工作量),花了大量時間卻沒有學到太多的東西,「性價比」太低。 我覺得雙方都說得很有道理,cc就是這樣一門課。對於適合的學生來說(e.g. 轉cs的學生,對Mapreduce, Hadoop, scalable web service不了解的),這門課可以讓你了解到一些和cloud computing、web service相關的名詞,如果面試的時候碰到不至於懵逼。而對於cs科班學生以及自學能力較強的學生,這門課的性價比就會顯得較低,可能會感覺花費了大量時間也沒學到幾個知識點。最後,我對選這門課有幾個建議:1、選隊友很重要,有沒有大腿不一定很重要,但一定不要有豬隊友(e.g. 不幹活、幫倒忙);2、如果有可能,最好選了DS(e.g. 15640)的課程後再來修cc,對team project的理解會加深,也能學到更多東西;3、如果覺得這門課性價比低,或者真的想學一些cloud computing 相關的前沿知識,請修acc (15719).

Cracking the exam: 這門課沒有exam,只有每周的quiz。真.大神可以邊做quiz邊看material,一般人還是建議提前個兩三個小時先看一下。

15719 (16 spring) Advanced cloud computing

說完了cc再來說acc。Acc雖然說是cc的進階版,但其實周花費會低於cc。這門課由CMU CS系的扛把子Garth Gibson主講,Majd(cc的instructor)輔助。課程內容涵蓋了cloud computing的各方面前沿知識,包括elasticity (auto scaling), encapsulation, virtulization, programming model (MapReduce, Spark), storage (GFS, SDS, K-V), scheduling, mobile computing, fault tolerance, tail latency, security, network (SDN), stream processing 和 tracing (logging)。這門課每節課上課之前會布置3-4篇和lecture topic 相關的經典paper(e.g. Google 的三篇經典paper),其中有一篇是要求必須讀,其他幾篇選讀。Garth課前會隨機抽人起來回答paper 里的一些內容,不算太難,只要你讀過paper都能說一點東西出來(然而無論你答成什麼樣Garth都會嘲諷你:))。

課程的project 我們這一屆有三個(前兩個individual project,第三個 2人 group project),第一個是用OpenStack搭一個private cloud並自己實現LB 和 auto scaling service(i.e. 實現類似ELB和ASG的功能,所以當用戶用你的private cloud 請求VM之後可以再配置LB和auto scaling)。第二個是用sprak優化一個機器學習的演算法,有buget和optimization factor 的要求,這個project和10605的最後一個project是基本一樣的。第三個是搭一個private cloud, 在其基礎上部署YARN,再給YARN寫一個customized的scheduler. 最後這個project會持續後半學期,有三個checkpoint。 這個project最cool的一點在於每個小組都會分到五台physical node,然後你再在上面搭virtual machine,模擬出一個cluster。需要注意的是,由於這門課開設時間較短,project還不成熟,所以今後的project可能會有所調整。我是上了cc之後再上的acc,我發現我在acc上學到了更多的東西,而cc更像是糊裡糊塗地做了一堆project卻不求甚解。如果一個人要了解cloud computing的相關知識(注意是clouding computing,不是Hadoop/AWS使用方法)我更推薦acc這門課。這門課從課程設置上來說屬於phd level的課程,但是上課的基本都是MS,所以大家不用太擔心自己跟不上。這門課Garth也經常會請一些業界/學術界的大牛來講guest lecture,比如我們那一學期就請了微軟的來講Azure還有Linkedin的來講stream processing.

Cracking the exam: 有期中和期末兩次考試,加起來佔50%的成績,期末考試只考後半學期內容。考試允許帶一張雙面的cheat sheet, 然而並沒有什麼卵用:)。 Garth 出的考試題就如同其他的業界大牛一般:十分靈活、需要對相關topic有很深的理解,屬於那種就算開卷也沒什麼卵用的類型。所以想拿A的同學,上課請認真聽講、記筆記,考前請認真看PPT,盡你最大可能去理解裡面的內容。要求閱讀的Paper reading 對考試有一定幫助,如果有時間也請複習一遍。考試前一周的時候,Garth會放出來幾套前幾年的考試題,推薦在複習完了之後做,重點是熟悉題目的風格以及加深你自己對課程topic的理解(碰到原題什麼的就不要指望了,也不要用這些題去「套」課程考試的重點)。總的來說這門課的考試是很有難度的。PS:這門課的期中期末考試*都是*隨堂考(一次lecture的時間),這有優點也有缺點。比如期末考試,這門課會在考試周之前的最後一次課考試,這樣你在考試周可以少複習一門課,但也意味著你要在其他課還在趕最後的final project的時候還抽出時間複習準備考試。

15746 (15 fall) Storage Systems

這是Garth Gibson教的另一門課,也是Garth的老本行(他本人就是因為提出了RAID 而出名)。另外一位老師是Greg Ganger,也是一位大牛。這門課的內容前半學期會講一些偏硬體和底層的內容(Disk, SSD, Filesystem, FS journal, disk arrays),後半學期會講現代比較時髦的內容(Distributed file systems, Multi-Server file systems, Parallel file systems, Cloud file systems)。總的來說這門課和acc一樣,都屬於那種「我知道這門課內容很好但是我就是聽不懂啊!」的課。反正我自己後半學期都一直處於雲里霧裡的狀態QAQ。這門課像acc,每節課也會有幾篇經典paper,一篇必讀另外幾篇選讀(並不會提問XD)。這門課這門課也會有guest lecture。Garth領導的Parallel Data Lab培養出了很多優秀的學生,以至於現在業界正火的各種Distributed file systems的developer 基本都有Garth的學生。像我們那學期就請了一個Google的人來給我們講Colossus (Google File System 2.0),而講完之後我們連ppt都沒有拿到,因為Colossus相關內容還屬於「比較機密所以可以現場學術交流,但是不能給你材料」的類型。這些內容也只有跟著Garth我們才能接觸到吧。

這門課的project總共有兩個,前半學期做一個,後半學期做一個,每個project都有三個checkpoint,均為individual project。第一個project是給SSD寫一個FTL(Flash Translation Layer),需要實現Address translation, Garbage Collection、Wear leveling等SSD的特性。做完這個project後你對SSD是啥就有一個比較感性的認識了,畢竟SSD是下一代的硬碟,多了解一些它的特性還是很有好處的。後半學期要做一個Cloud/Local SSD Hybrid FS。這也是很有趣的一個項目,大概就是一個混合硬碟,大文件會放在雲上,小文件以及大文件的元數據(文件名、創建時間等)會放在本地硬碟,當你讀取小文件或者大文件元數據時(e.g. ls command)會直接從本地讀取,而當你要讀取大文件時會去雲端下載。這是這個FS的基本思想,也是checkpoint 1要實現的內容,隨後還需要對這個FS進行優化(deduplication, checkpoint2的內容), 以及支持FS snapshot (checkpoint 3的內容,不懂的同學可以類比ghost 系統:))。 我個人認為這個project十分有意思,因為基本所有功能全靠自己寫,老師基本只提供OS層面的一些文件操作以及雲端的Get(), Put()方法。而最後寫好的Hybird文件系統也十分酷,因為它對user是transparent的,也就是之前說的什麼從本地讀取大文件元數據、從雲端Download大文件,這些對user來說都是不可見的,user就看見一個文件系統,如果他不去測網速之類的,根本不知道這個文件是存在哪的、怎麼存的。

Cracking the exam: 類似於acc (是不是覺得這門課和acc太像了!誰讓老師是同一個人呢),這門課也是期中期末兩次考試,也是十分靈活、很考驗對topic的理解,考前也會放出前幾年的題,也是lecture隨堂考,也是期末只考後半學期內容。複習建議也類似於acc:平時上課認真聽講記筆記,儘可能去理解課程內容。考試前再儘可能去理解一遍,然後就聽天由命吧:)。考試也允許帶一頁cheat sheet,也並沒有什麼卵用,唯一的建議是把計算MTBF的那些公式給抄上去,可以少背幾個公式。對了,這門課的paper reading完全不會出現在exam里,也就是說時間很緊張又想拿A的同學,只複習slides即可 (我可沒鼓勵你們不去看paper啊,雖然課上不提問,考試也不考,但是如果你想更多地理解老師課上講的內容,還是去看看paper)。

15641 (15 fall) Computer Networks

說完了兩門高階課程,我們來說一門本科生的課(15441)。這門課是CMU CS major本科生五選一的system課的其中一門(其餘四門是15410, 15418, 15440, 15411)。總的來說這門課的難度屬於幾門system課里比較低的(流傳的難度排序是:15410 &>= 15411 &> 15418 &> 15440 &>= 15441)。但我仍然被這門課狠狠地虐了一遍(我只能說,選好隊友很重要。。)。這門課的lecture內容沒有太特別的地方,基本和國內的計算機網路課差不多,前半學期會從physical layer 一直講到 transport layer,重點自然是TCP/IP 協議,後半學期會講一些application layer的東西(Web, P2P, CDN, QoS, Video streaming, security)以及一些「現代」的網路技術(mobile network, wireless, last-mile question 還有三網融合)。總的來說是一門不折不扣的計算機網路課吧,老師 (Peter Steenkiste)講的還是很細緻很清楚的,他中間曾經出差,請另一位老師來代了一次課,那真的是沒有對比就沒有傷害,代課老師基本就是在念ppt。

讓我覺得這門課很值的是它的project,這門課共三個project,第一個是individual, 第二個第三個是 2人 group project。第一個project要求你實現一個web server (純C實現), 支持Get(), Post(), CGI, HTTPS等。要求用lex and yacc來parse請求,並發處理要求不能用process/thread來實現,而要用I/O multiplexing (i.e. select()). 在我看來這個project很實用,一方面理解了web內部的機制,另一方面感受了如何用I/O復用來實現並發,這和之前的進程/線程模型完全不一樣。 第二個project是要實現一個P2P的File transfer system (用C實現迅雷,就問你酷不酷!)。這個project的主要難度是要自己實現TCP協議,包括retransmission, sliding window and congestion control。相信我做完這個project你就可以拍著胸脯說I know something about TCP並且對設計TCP協議的人充滿綿綿不絕的崇拜。 第三個project是要實現一個CDN system來滿足Video adaptive streaming。這個project比較簡單,主要是要實現DNS協議以及CDN server的load balancing。比較有趣的部分是application本身(Video adaptive steaming), 你需要自己實現一個根據網路情況從480p到1080p藍光會員來播放視頻的system。對了,這門課的project為了讓學生更好地理解「協議」,所以會要求學生去讀RFC,具體是RFC 2616 (Web)以及RFC 1035 (DNS),並且根據RFC來實現協議(i.e. 老師並不會告訴你具體需求,反正是實現協議,一切按照協議標準來),怎麼說呢,也算一種鍛煉吧。 除了三個project外,這門課還有四次 homework, 基本屬於一個晚上能搞定的工作量,主要是幫助理解課程內容吧。

Crackig the exam: 這門課有期中期末兩次考試,期中考前半學期內容,期末考*整個學期*的內容。考試不算難,但會比較靈活。複習建議就是刷ppt和做前幾年的考試題(請善用Google搜索)。考試前請把homework都複習一遍,會考到類似的題目。期末考試前請把期中考試的卷子拿出來再複習一遍,會考到類似的題目。

18641 (15 fall) Java for Smart Phone Development

說完CS系的641,再來說說ECE系的641,四個字:不值得上:)。這門課CS學院的人估計不會選,主要是ECE和INI的同學們。這門課的前半學期是講java SE,會從基本語法一直講到 Multithreading, socket programming, HTTP and servlet以及JDBC,後半學期會講Android development,最後會有一個team project(3人)實現一個 Android app。聽上去是不是感覺乾貨滿滿!不僅能學java還能做app,簡直神課啊!然而如果我告訴你以上內容都要你自學呢?這門課老師講課基本沒有什麼用,照著ppt念,而且ppt還是過時了的,給的例子在新的Android OS上根本不能run(其實也不是很新的Android,4.0、5.0這個樣子吧)。我上這門課基本都是靠https://developer.android.com度過的,不得不說官方教程就是好,講解清楚還有sample code。如果你覺得這門課自學不算個事的話,那麼還有更令人抓狂的:老師經常改作業需求。這門課是每周有一個individual project要求做一個小application,需要用到這周講的feature。但是老師經常改作業的需求,你可以提前體會到程序員是多麼痛恨pm改需求。關鍵是這門課還很看重OO design,所有程序都要求手畫UML圖,每次一改需求,又要重畫UML。所以我到後來在交作業前兩天就不上piazza(一個課程論壇)了,因為基本上每次上都會發現某個同學提問說老師這裡是不是應該這樣啊,然後老師就會說不是的應該是balabala,然後全班同學都發現自己理解錯了,都開始瘋狂地修改:)。以至於到最後都沒有人在piazza上問作業相關的問題,因為問一次改一次,還是不要問的好,這樣還可以拿handout來argue。 Team project並不限制內容,但會要求寫很多design doc, requirement analysis,說實話這些東西連同前面的OO design,其實還是有用的,但是實在敵不過一個一直改需求的老師。所以建議,如果不是沒課上了,請不要上這門課。 ECE的同學我最後會介紹幾門用來抵60學分核心課的課。

Cracking the exam: 這門課沒有考試,但後半學期team project上來,每周還有individual project (just like cc),load還是不小的。

18645 (15 spring) How to Write Fast Code

ECE版的parallel computing,無論是課程質量還是課程難度都遠遠低於15418。如果你在糾結這兩門上哪一門,請不要猶豫,去選15418吧:)。 這門課的主要內容有三大塊,CPU based parallel computing (ILP, SIMD, OpenMP), GPU based parallel computing (CUDA) and cloud parallel computing (MapReduce and Spark)。其實從課程內容來看還是很不錯的,無奈乎老師講課水平太差以及課程要求太低,這些內容都是淺嘗輒止。

這門課有三次作業和四次project,作業都是獨自完成,project都是組隊完成(2-3人)。基本上作業就是幫你熟悉project的開發環境,跑一個sample program再把輸出結果提交上去。而project相對有意思一點,前三次project各自對應課程的三大塊內容,要求你用OpenMP, CUDA 以及 MapReduce來優化一個基礎演算法(矩陣乘法、K-means、N-gram),project的評分參照兩點:你的優化程序相對於原始演算法的運算速度,以及你的程序相對於別的小組的程序的運算速度。做得最好的team還可以去做presentaion,給大家講你們的優化思路XD. 第四個project要求你自行選題,用課程學到的parallel computing的方法去優化一個實際演算法,並且寫一篇小論文。 我們組當時選的是中值濾波,把三個方法都用了一遍,發現還是mapreduce 大法好:)。 總的來說這門課的缺點在於課程內容太淺,project也沒有什麼鍛煉量,如果ECE的同學想找一門不是太水的水課來抵學分,那還是可以一上的。

Cracking the exam: 期中期末兩次考試,期末考*全部學期*的內容,允許攜帶一頁cheat sheet。這個cheat sheet很有用,因為這門課的考試會考一些比較乾的知識點,所以可以提前把一些名詞解釋、公式(重點:怎麼計算GPU的GFLOPS)給寫上。大家考試前過一遍ppt,邊過邊把cheat sheet 整理出來即可。考試不算難,但期中考試時間可能會嚴重不夠(因為是隨堂考)。

18899 (15 spring and 15 fall) Applied Machine Learning (A4) and Data Inference (A3)

TL;DR: 除非你是ECE的同學並且需要用水課抵60學分,不然你可以跳過這一段了。

這是兩門課,但是課號一樣(不同section),老師也一樣,所以放在一起說。我最初是抱著認真學習的態度去的(Applied Machine Learning,聽上去是不是很實用!)然而事實證明這兩門是不折不扣的水課,我給幾個關鍵詞:成績=10%平時成績+3*30%三次作業、一次作業=十小時、無考試。平心而論這兩門課是可以不水的,Applied Machine Learning主要講各種機器學習演算法,然而完全比不上ng的課,Data Inference主要講數據處理和數據可視化,然而還不上我本科時在實驗室打雜自學的內容。總的來說就是老師要求太低了,上課有一半時間在舉(che)例(dan),講了很多實際的例子。不過作為一門水課,它很好地完成了自己的目標。 PS:老師(Patrick McSharry)是牛津畢業,有著迷人的口音,上課無聊的時候聽聽他的口音還是很不錯的。

Cracking the exam: 都說了沒有考試了你還想怎樣 :(

15640 (16 spring) Distributed Systems

這也是一門只要有可能每個中國學生都會選的神課。需要注意的是,這門課有兩個版本,Yuvraj Agarwal和Srini Seshan上的fall學期以及Satya和Babu上的spring學期。Fall的15640用go語言,更加偏向於應用一些(e.g. 實現mapreduce、比特幣挖礦),Spring的15640用C和Java,更加偏系統一些。因為我上的是spring的課,所以以下介紹主要對應Satya的15640。這門課我感覺就是一個大雜燴,如果你像我一樣上過15641、15605、15719、15746四門課,那麼我覺得這門課並沒有太大的必要。這門課的主講人Satya是AFS的發明者,所以他上課的很多內容和project都是圍繞著 Distributed File system,當然這其中很多東西對general distributed system 也是適用的。這門課前半學期主講RPC、Caching,其中caching是大頭。RPC可以說是一切DS的基礎,而caching則會聚焦到很多DS的難點問題,比如怎麼解決共享資源的鎖。後半學期會講scaling和Fault tolerance (Failure Resiliency),其中Fault tolerance是大頭。很多經典的問題和演算法比如 Transaction, Jounralling, 2PC, Replication, Paxos都會涉及到,還是能開開眼界。除了上面這些,還會講Concurrency, GFS, computation scale out (MR, MPI, Spark, P2P)等零碎知識點。總的來說是一門好課,老師Satya講得很細很慢,按他自己的話說就是寧願學生們學得少一點但是學精了,而不希望學了很多但都一知半解。不過我個人還是覺得他講課太慢了XD。另外他總是強調這門課並不是要告訴你現在世界上那些「時髦」的演算法、架構而是希望你能學會一些即使再過二十年也不會過時的核心知識。我覺得他說的還是很有道理的,我同時上著這門課和15719,就剛好是這門課會講一些基本的東西,而acc就會給你講一些很前沿的雲計算技術,然而這些「雲」歸根到底還是依賴於DS的這些基本知識。

這門課有四個project,四次homework,均為單人完成。四次homework就是做一些簡單的題,幫助理解課程內容。第一個project是用C實現一個Remote File System (多個Client和一個server,文件都存在Server,client通過RPC操作文件)。這個project的難點是實現RPC,因為會有一些複雜的數據結構需要marshalling and unmarshalling,以及需要考慮一些corner case。第二個project是在第一個project的基礎上實現caching,即當client從server得到文件後可以cache在本地,下次訪問就不需要從server處再去拿。這個project的難點是Concurrency,即當多個clinet要訪問同一個文件的時候caching的處理。這兩個project是前半學期的內容,分別對應RPC和caching兩大塊課程內容。第三個project是實現Auto-scaling,需要動態地根據server的RPS來增減node數,難點在於測試樣例十分噁心,有日常小高峰也有黑五大高峰,很難寫出一個滿足各種情況auto-scaling的程序,需要不斷修正程序參數。第四個project是自行實現一個2PC system,主要幫助理解2PC吧,沒有太大難度。總的來說四個project下來你對DS, client, server這些東西也能玩得比較轉了,值得一做。

Cracking the exam: 期中期末兩次考試,期末考_全部_內容。考試不難,把ppt里的東西弄懂即可。需要提醒的是,考高分並不容易,因為考試不難所以批改反而很嚴格,答題的時候注意不要漏寫、略寫,審題的時候要仔細。

15605 (16 spring) Operating System Design and Implementation

(後退,我要開始裝逼了),壓軸的課來了,CMU傳說中的OS課。本著「我不入地獄,誰入地獄」的精神,我去上了這門傳說中CMU最難的課。先透露一下課程load:每周三次課,五個project,兩次作業,兩次考試,一篇讀書報告,工作量大概每周50小時,P3時每周60小時有的吧。這門課的廣度、深度都超過了一般的課,一般老師沒有兩把刷子真的是上不下來的。前半學期是比較正常的OS內容,Stack, Hardware, Process, Thread, Deadlock, Virtual Memory,Scheduling, 但是難度會十分大,畢竟一般os課的這些內容在15213里早就講了,所以這門課主要就會講很深的內容,比如如何用stack實現Thread和Process、如何實現lock等。前半學期講的這些基本也就是所有project需要實現的內容。 後半學期畫風突變,開始走廣度路線,會講NFS(AFS), Virtulization, Storage, Cache Coherence, Memory Consistency, security, Filesystem, Transaction, Driver, Lockfree(RCU)等層出不窮的內容,一節課一個全新topic。除此之外,每節課上課之前還會有個「十分鐘」小課堂,老師會講一些C編程的「奇技淫巧」,比如如何用C實現面向對象編程、如何使用版本控制等等,這些對project很有幫助。我當初是把這門課和15640, 15719兩門課一起上的,三門課在一起真的有一種相輔相成的感覺,有時OS才講了Transcation, DS就會講Journalling 而acc就會講journal-based Fault tolerance,感覺就是OS在講單機的內容,DS在講cluster的內容,而acc又在一個更高的層次上講一個cloud的內容。但無論怎樣,有些技術、思想會反反覆復出現,以不同的形式,不同的手段。我當初也是誤打誤撞選了這樣三門課,但感覺這些system的課真的是相通的。說回這門課,兩次作業題量都不大,但是很tricky,基本是關於lock, memory consistency的問題,屬於那種思考難度很大,很容易就想錯的了題。 一份讀書報告,是要求你在開學時選一本書(老師會指定一個書單/論文集列表,基本是OS相關的),一學期內自己抽時間把書讀完,最後寫一份兩頁紙的讀書報告。這個作業其實敷衍的話也不難,但其實有人這樣push你去讀一本書,也未嘗不是件好事。我當初選的是《Linux Kernel Development》 (Robert Love),一學期讀完後收穫很大。

最後來詳細說說五個project,這估計也是很多人最關心的部分(對了所有都是C實現,我並不是很明白為何有人認為OS還可以用java寫):

P0,單人project,主要作用是「篩選」出那些不適合這門課的同學,如果這個project你都做得很吃力,那麼基本上你就可以放棄這門課了。。。這個project主要是要寫一個C library, 實現trackback的功能,即當某個函數調用traceback()這個函數,可以在屏幕上列印出函數的的調用棧(從main一直到該函數),只要debug單步調試過的人應該對這個功能很熟悉。實現這個不算難,主要是考驗對stack的理解。

P1, 單人project,主要是給寫console, keyboard 和timer三個devices寫driver,並在三個driver之上寫一個小遊戲(run在kernel mode)。這個project主要是熟悉x86 kernel programming,同時自己寫的device driver也會在P3和P4用到。

P2, group project (兩人,後面的P3、P4也一樣), 寫一個user space的thread library。就像普通的thread library一樣,需要實現pthread_create(), pthread_join(), pthread_exit(), pthread_gettid()等常用函數。此外還需要寫mutex, condition variables, semaphores, R/W locks等鎖的library (實際上你如果要實現一個thread library, 這些基本的鎖都是必要的)。這個project開始,就有各種抓狂的東西進來了,為了一個bug調三天是常有的事,因為涉及到不同thread的stack還有各種鎖,所以很容易出現bug,有些還很難發現。這個project用的kernel是一個老師寫好的kernel,但它的behavior、system call等都是你P3需要實現,因此也算是提前熟悉一些kernel specs。

P3, 也就是傳說中的大boss,你需要自己實現一個kernel, 包括各種system call (fork(), exec(), wait(),exit(), read(), print()等), virtual memory management, preemptive multitasking, scheduler等等。同時把你P1的device driver (有了keyboard 和 console才有輸入輸出嘛)以及P2的thread library整合進去。這個project的handout就有55頁,時間跨度是兩個月,然而你還是會感覺時間不夠用啊時間不夠用。基本做完這個project,你對OS的了解層度就比一般人要深不少了。

P4, 算是一個post-P3 project, 這個project必須在教授承認你已經做完了P3的情況下才能繼續,否則就不能做P4,別人做P4的時間你接著做P3,因為P3算是整個OS課最核心的內容。每年P4的內容都不一樣,比如給kernel再寫一個file system, 支持更多的device driver等等。我們這一年分到的都是使kernel能在multi-processor上工作,採用的是AMP模型。總的來說十分有趣,不同core之間需要收發message, 在OS里玩出了DS的感覺。

再說一下project的評分方式,老師給你一部分測試樣例,包括unit test和stressing test等,但是你交上去後還會有另一部分測試樣例。 這門課一大特色是助教會把你的code全部打出來,然後用紅筆幫你修正,相當於幫你做了code review。Review 完了之後會有一個1:1的interview, 他會問你一些design和implementation的問題,也會指出你的一些缺陷,是很好的學習機會。最後你的成績是測試樣例通過率、code design 和code style等的綜合。

值得強調的一點是,這門課不僅注重implementation也注重design(請看課名)。OS是一個很大的system,你如何設計各個component使得整個system能完整地運轉,這也是這門課要求你掌握的一個重要的能力。當然了你這門課上完之後,C programming 的能力也會突飛猛進,特別是debug能力XD。整個OS課上下來,project做完,會學到很多東西,讓你搞清楚之前很多似是而非的概念,同時又可以幫助對DS, acc等system課的理解,最後達到一種融會貫通的狀態。有很多人都聽說這門課太難,而不敢去上,但你要知道,你學得越痛苦,最後學到東西也越多。我有時候真的覺得,花了高價學費來到了CMU,不上上傳說中的神課真的可惜了,就像是你去了少林寺拜師學藝,然而卻不想學洗髓經一樣。這裡我將OS比做洗髓經是有原因的,OS這門課就像你的內功,不會有馬上立竿見影的效果,但是為你今後CS的學習成長打下了基礎,鋪平了了道路。同時CMU OS的教授把這門課稱為"transformative"的課,我想「洗髓」正是其最好的翻譯吧。所以如果你有份好學的心,真的推薦這門課。最後說明一點,這門課在選課的時候需要教授一個個把學生加到這門課里,也就是說需要教授認可你才可以上這門課,那麼如果才算認同呢?按照我的經驗,你至少需要15213 + 一門其他CMU的system 課(15411, 15440, 15441, 15418)都拿A,注意15619這樣的application的課在教授看來完全沒有卵用。

Cracking the exam: 期中期末兩次考試,很多PPT都不會考!很多PPT都不會考!很多PPT都不會考!特別是那些體現「廣度」的ppt,基本都不會考,所以你不要再像我一樣去背OS在啟動時候要經過哪些過程之類很瑣碎的知識點了。那麼這門課考試考什麼呢? 現場寫程序!對的,你沒有看錯,現場給你library和System call, 讓你開始實現演算法,我真的是在考試場寫出了面試onsite的感覺啊。 所以說,project很重要,一定要認真design認真code,同時認真讀同伴寫的code。

最後一段再推薦一些我沒有上過但是聽說不錯的課。首先是本科CS剩餘的兩門system的課 15411, 15418,然後是高階system課 15721 (這門課我試聽過,真的不錯,教你如何實現一個memory based database system,老師講課細緻,ppt做得很藝術,然而無奈位置太少沒有擠進去), 15826。除此之外還有一些application課, 15415, 15437,一些基礎課 15210 (強烈推薦,用functional programming來實現各種演算法和數據結構,既學了函數式編程又學了演算法), 15214, 15251。 最後是一些給ECE孩子們的抵60學分核心課的: 之前的15746, 15826, 15719, 15721都不錯, 18649, 18697, 請不要上18842,據稱是一門爛課。還有一些抵60學分的水課(所以你可以抽出時間來上15的好課): 18645, 18899, 18660。

周日花了一下午+一晚上的時間,終於寫完了這篇文章。如今已經畢業半年,也步入了社會開始工作,這時才發現自己很懷念學生時光,那種不顧一切只想著學習的專註,那份趕due到凌晨四五點的執著,那絲通宵debug最終找到bug的喜悅,和小夥伴為了一個design的問題而爭得面紅耳赤,現在在工作中都很難體會到了,也不知是少了什麼,可能是沒有當初那麼「純粹」了吧。希望還在CMU的同學們好好珍惜校園時光,無論是其中的愜意還是勞累,都會是你今後一份珍貴的回憶。

如果你想更多地了解我對CMU的看法,請參考我的另一篇回答: 在卡內基梅隆大學(CMU)學習計算機是什麼感覺? - Ke克的回答 - 知乎


Courses Taught by Golan Levin at Carnegie Mellon University, 2004-

不敢說特別好,如果你想學,這門課可以學到很多,不想學也可以水過。

Golan一般會在課上給你介紹整個computer art history,其餘時間就是project-based workshops,充斥著Demo, Peer review, Final Presentation。做的project往往千奇百怪,什麼樣的都有,基本的computer art相關的Processing, OpenFrameworks, Rhino...都會用到

雖然課程向全校各年級開放,但比較建議在有了一定CS基礎以後再修

還有一門是Luis von Ahn 開的一門創業相關的課程,名字實在想不起來了,開課時間不定,註冊是網上另行申請還要面試的,如果碰到開課就果斷試試吧,機會難得。


真男神Terry Lee的08722,

Roni Rosenfeld的10601,

還有好多人推薦的15637,15619,11642,15651,目前都在waitlist??sigh


15112, 拉近和程序員男票心的距離=33=


本科狗的話 15112

不論是不是CS專業都上一上


15640。 這門課起到了一個很好的承上啟下的作用。上是網路,下是操作系統。


15213


15410


CMU有哪些值得一上的演算法課? - 計算機科學


15619


推薦閱讀:

二本學生如何獲得微軟的實習機會?
該不該放棄學了四個月的Haskell,轉去學C++?
c++成員函數聲明()後加&或&&表示什麼?
用傳統毛筆顏料宣紙畫水墨畫和用PS數位板畫水墨畫,哪個更有價值?
腦電波的研究目前是什麼現狀?

TAG:計算機 | 大學 | 計算機科學 | 卡內基梅隆大學CarnegieMellonUniversity |