问题：﻿CMU 计算机选课上有什么特别好的课程推荐？ 可以为后来人做借鉴~
话题：﻿计算机、大学、计算机科学、卡内基梅隆大学(CarnegieMellonUniversity)
回答：﻿懒癌晚期患者拖到毕业半年后才写完这篇文章，主要是最近有太多学弟学妹们问我选课的问题，所以就想把这篇文章赶出来造福CMU的同学们。介绍一下自己，我是15spring入学的MSinECE,16年五月份毕业，目前在Google工作。在CMU一年半的学习生涯中收获了很多，同时也走了一些弯路，所以写下这篇课程介绍的文章，供学弟学妹们参考。我以下介绍的这些课都是我自己实际上过的，并且都拿了A的，每门课包括了课号、我所上的学期、课名、介绍以及针对考试的一些建议。15213(15spring)IntroductiontoComputerSystems这门课我想不需要做过多介绍，CMU的招牌课程，基本是每个在CMU学CS的人都必选的课。唯一需要提醒的是，如果有机会在暑假修这门课，那么请务必在暑假就把它修掉，因为有很多后续课程都需要这门课作为先修，而且即使是硕士生也不能waive。为了在进入CMU之后可以自由地选课，花费暑假的时间学15213是值得的。平时作业是7个lab，再加期中期末两门考试，期末考试考全学期内容。如果不读textbook的话，周花费大概在10-15小时（然而如果你有空余的时间，强烈推荐读一遍textbook，基本读完面试中的“硬知识点”就不虚了）。Crackingtheexam:看ppt＋刷历年题足矣，如果时间紧可以只刷题。15619(15spring)CloudComputing著名的cc，基本是每个中国人都会修的课程。这是一门纯project课和纯网课，基本是每周一个individualproject、每周一次quiz的节奏。后半学期会有teamproject(三人)，和每周的individualproject、quiz同时进行。Individualprojects的东西很杂，包括AWS(EC2,S3,ASG,EMR,ELB)、DB(HBase,MySQL,DynamoDB)、Hadoop(MapReduce,Hbase,HDFS,Hive,YARN,Spark)以及很多奇奇怪怪的东西(Concurrency,shellscripting,etc.)。Teamproject主要是搭一个WebService，包括前端和后端。期间会用到Loadbalancing,horizontalscalingandDatabasestorage的知识。整个system需要满足一定的throughput和latency的需求。听说从上学期开始支持的query包括read和write，更加加大了teamproject的难度。总的来说，这门课唱好唱衰的声音都有，Quora和知乎上都有专门关于15-619课程讨论。说这门课好的人，觉得这门课什么知识都会涉及到一些，有种一门课抵十门的感觉，而且也接触到了各种“高大上”上的东西，比如MapReduce,Hadoop,Spark。说这门课差的人觉得这门课在各方面都走马观花、浅尝辄止，所谓的高大上的东西也早就已经是十多年前的陈旧知识，而且这门课用时太多（有teamproject的时候基本是每周50个小时的工作量），花了大量时间却没有学到太多的东西，“性价比”太低。我觉得双方都说得很有道理，cc就是这样一门课。对于适合的学生来说（e.g.转cs的学生，对Mapreduce,Hadoop,scalablewebservice不了解的），这门课可以让你了解到一些和cloudcomputing、webservice相关的名词，如果面试的时候碰到不至于懵逼。而对于cs科班学生以及自学能力较强的学生，这门课的性价比就会显得较低，可能会感觉花费了大量时间也没学到几个知识点。最后，我对选这门课有几个建议：1、选队友很重要，有没有大腿不一定很重要，但一定不要有猪队友（e.g.不干活、帮倒忙）；2、如果有可能，最好选了DS(e.g.15640)的课程后再来修cc，对teamproject的理解会加深，也能学到更多东西；3、如果觉得这门课性价比低，或者真的想学一些cloudcomputing相关的前沿知识，请修acc(15719).Crackingtheexam:这门课没有exam，只有每周的quiz。真.大神可以边做quiz边看material，一般人还是建议提前个两三个小时先看一下。15719(16spring)Advancedcloudcomputing说完了cc再来说acc。Acc虽然说是cc的进阶版，但其实周花费会低于cc。这门课由CMUCS系的扛把子GarthGibson主讲，Majd(cc的instructor)辅助。课程内容涵盖了cloudcomputing的各方面前沿知识，包括elasticity(autoscaling),encapsulation,virtulization,programmingmodel(MapReduce,Spark),storage(GFS,SDS,K-V),scheduling,mobilecomputing,faulttolerance,taillatency,security,network(SDN),streamprocessing和tracing(logging)。这门课每节课上课之前会布置3-4篇和lecturetopic相关的经典paper(e.g.Google的三篇经典paper)，其中有一篇是要求必须读，其他几篇选读。Garth课前会随机抽人起来回答paper里的一些内容，不算太难，只要你读过paper都能说一点东西出来（然而无论你答成什么样Garth都会嘲讽你:))。课程的project我们这一届有三个（前两个individualproject，第三个2人groupproject)，第一个是用OpenStack搭一个privatecloud并自己实现LB和autoscalingservice(i.e.实现类似ELB和ASG的功能，所以当用户用你的privatecloud请求VM之后可以再配置LB和autoscaling)。第二个是用sprak优化一个机器学习的算法，有buget和optimizationfactor的要求，这个project和10605的最后一个project是基本一样的。第三个是搭一个privatecloud,在其基础上部署YARN，再给YARN写一个customized的scheduler.最后这个project会持续后半学期，有三个checkpoint。这个project最cool的一点在于每个小组都会分到五台physicalnode，然后你再在上面搭virtualmachine，模拟出一个cluster。需要注意的是，由于这门课开设时间较短，project还不成熟，所以今后的project可能会有所调整。我是上了cc之后再上的acc，我发现我在acc上学到了更多的东西，而cc更像是糊里糊涂地做了一堆project却不求甚解。如果一个人要了解cloudcomputing的相关知识(注意是cloudingcomputing，不是Hadoop/AWS使用方法)我更推荐acc这门课。这门课从课程设置上来说属于phdlevel的课程，但是上课的基本都是MS，所以大家不用太担心自己跟不上。这门课Garth也经常会请一些业界／学术界的大牛来讲guestlecture，比如我们那一学期就请了微软的来讲Azure还有Linkedin的来讲streamprocessing.Crackingtheexam:有期中和期末两次考试，加起来占50%的成绩，期末考试只考后半学期内容。考试允许带一张双面的cheatsheet,然而并没有什么卵用:)。Garth出的考试题就如同其他的业界大牛一般：十分灵活、需要对相关topic有很深的理解，属于那种就算开卷也没什么卵用的类型。所以想拿A的同学，上课请认真听讲、记笔记，考前请认真看PPT，尽你最大可能去理解里面的内容。要求阅读的Paperreading对考试有一定帮助，如果有时间也请复习一遍。考试前一周的时候，Garth会放出来几套前几年的考试题，推荐在复习完了之后做，重点是熟悉题目的风格以及加深你自己对课程topic的理解（碰到原题什么的就不要指望了，也不要用这些题去“套”课程考试的重点）。总的来说这门课的考试是很有难度的。PS：这门课的期中期末考试*都是*随堂考（一次lecture的时间），这有优点也有缺点。比如期末考试，这门课会在考试周之前的最后一次课考试，这样你在考试周可以少复习一门课，但也意味着你要在其他课还在赶最后的finalproject的时候还抽出时间复习准备考试。15746(15fall)StorageSystems这是GarthGibson教的另一门课，也是Garth的老本行（他本人就是因为提出了RAID而出名）。另外一位老师是GregGanger，也是一位大牛。这门课的内容前半学期会讲一些偏硬件和底层的内容(Disk,SSD,Filesystem,FSjournal,diskarrays)，后半学期会讲现代比较时髦的内容（Distributedfilesystems,Multi-Serverfilesystems,Parallelfilesystems,Cloudfilesystems）。总的来说这门课和acc一样，都属于那种“我知道这门课内容很好但是我就是听不懂啊！”的课。反正我自己后半学期都一直处于云里雾里的状态QAQ。这门课像acc，每节课也会有几篇经典paper，一篇必读另外几篇选读(并不会提问XD)。这门课这门课也会有guestlecture。Garth领导的ParallelDataLab培养出了很多优秀的学生，以至于现在业界正火的各种Distributedfilesystems的developer基本都有Garth的学生。像我们那学期就请了一个Google的人来给我们讲Colossus(GoogleFileSystem2.0)，而讲完之后我们连ppt都没有拿到，因为Colossus相关内容还属于“比较机密所以可以现场学术交流，但是不能给你材料”的类型。这些内容也只有跟着Garth我们才能接触到吧。这门课的project总共有两个，前半学期做一个，后半学期做一个，每个project都有三个checkpoint，均为individualproject。第一个project是给SSD写一个FTL(FlashTranslationLayer)，需要实现Addresstranslation,GarbageCollection、Wearleveling等SSD的特性。做完这个project后你对SSD是啥就有一个比较感性的认识了，毕竟SSD是下一代的硬盘，多了解一些它的特性还是很有好处的。后半学期要做一个Cloud/LocalSSDHybridFS。这也是很有趣的一个项目，大概就是一个混合硬盘，大文件会放在云上，小文件以及大文件的元数据（文件名、创建时间等）会放在本地硬盘，当你读取小文件或者大文件元数据时(e.g.lscommand)会直接从本地读取，而当你要读取大文件时会去云端下载。这是这个FS的基本思想，也是checkpoint1要实现的内容，随后还需要对这个FS进行优化(deduplication,checkpoint2的内容),以及支持FSsnapshot(checkpoint3的内容，不懂的同学可以类比ghost系统:))。我个人认为这个project十分有意思，因为基本所有功能全靠自己写，老师基本只提供OS层面的一些文件操作以及云端的Get(),Put()方法。而最后写好的Hybird文件系统也十分酷，因为它对user是transparent的，也就是之前说的什么从本地读取大文件元数据、从云端Download大文件，这些对user来说都是不可见的，user就看见一个文件系统，如果他不去测网速之类的，根本不知道这个文件是存在哪的、怎么存的。Crackingtheexam:类似于acc(是不是觉得这门课和acc太像了！谁让老师是同一个人呢)，这门课也是期中期末两次考试，也是十分灵活、很考验对topic的理解，考前也会放出前几年的题，也是lecture随堂考，也是期末只考后半学期内容。复习建议也类似于acc：平时上课认真听讲记笔记，尽可能去理解课程内容。考试前再尽可能去理解一遍，然后就听天由命吧：）。考试也允许带一页cheatsheet，也并没有什么卵用，唯一的建议是把计算MTBF的那些公式给抄上去，可以少背几个公式。对了，这门课的paperreading完全不会出现在exam里，也就是说时间很紧张又想拿A的同学，只复习slides即可(我可没鼓励你们不去看paper啊，虽然课上不提问，考试也不考，但是如果你想更多地理解老师课上讲的内容，还是去看看paper)。15641(15fall)ComputerNetworks说完了两门高阶课程，我们来说一门本科生的课(15441)。这门课是CMUCSmajor本科生五选一的system课的其中一门(其余四门是15410,15418,15440,15411)。总的来说这门课的难度属于几门system课里比较低的(流传的难度排序是：15410>=15411>15418>15440>=15441)。但我仍然被这门课狠狠地虐了一遍（我只能说，选好队友很重要。。）。这门课的lecture内容没有太特别的地方，基本和国内的计算机网络课差不多，前半学期会从physicallayer一直讲到transportlayer，重点自然是TCP/IP协议，后半学期会讲一些applicationlayer的东西(Web,P2P,CDN,QoS,Videostreaming,security)以及一些“现代”的网络技术(mobilenetwork,wireless,last-milequestion还有三网融合)。总的来说是一门不折不扣的计算机网络课吧，老师(PeterSteenkiste)讲的还是很细致很清楚的，他中间曾经出差，请另一位老师来代了一次课，那真的是没有对比就没有伤害，代课老师基本就是在念ppt。让我觉得这门课很值的是它的project，这门课共三个project，第一个是individual,第二个第三个是2人groupproject。第一个project要求你实现一个webserver(纯C实现),支持Get(),Post(),CGI,HTTPS等。要求用lexandyacc来parse请求，并发处理要求不能用process/thread来实现，而要用I/Omultiplexing(i.e.select()).在我看来这个project很实用，一方面理解了web内部的机制，另一方面感受了如何用I/O复用来实现并发，这和之前的进程／线程模型完全不一样。第二个project是要实现一个P2P的Filetransfersystem(用C实现迅雷，就问你酷不酷！)。这个project的主要难度是要自己实现TCP协议，包括retransmission,slidingwindowandcongestioncontrol。相信我做完这个project你就可以拍着胸脯说IknowsomethingaboutTCP并且对设计TCP协议的人充满绵绵不绝的崇拜。第三个project是要实现一个CDNsystem来满足Videoadaptivestreaming。这个project比较简单，主要是要实现DNS协议以及CDNserver的loadbalancing。比较有趣的部分是application本身(Videoadaptivesteaming),你需要自己实现一个根据网络情况从480p到1080p蓝光会员来播放视频的system。对了，这门课的project为了让学生更好地理解“协议”，所以会要求学生去读RFC，具体是RFC2616(Web)以及RFC1035(DNS)，并且根据RFC来实现协议（i.e.老师并不会告诉你具体需求，反正是实现协议，一切按照协议标准来)，怎么说呢，也算一种锻炼吧。除了三个project外，这门课还有四次homework,基本属于一个晚上能搞定的工作量，主要是帮助理解课程内容吧。Crackigtheexam:这门课有期中期末两次考试，期中考前半学期内容，期末考*整个学期*的内容。考试不算难，但会比较灵活。复习建议就是刷ppt和做前几年的考试题（请善用Google搜索）。考试前请把homework都复习一遍，会考到类似的题目。期末考试前请把期中考试的卷子拿出来再复习一遍，会考到类似的题目。18641(15fall)JavaforSmartPhoneDevelopment说完CS系的641，再来说说ECE系的641，四个字：不值得上:)。这门课CS学院的人估计不会选，主要是ECE和INI的同学们。这门课的前半学期是讲javaSE，会从基本语法一直讲到Multithreading,socketprogramming,HTTPandservlet以及JDBC，后半学期会讲Androiddevelopment，最后会有一个teamproject(3人)实现一个Androidapp。听上去是不是感觉干货满满！不仅能学java还能做app，简直神课啊！然而如果我告诉你以上内容都要你自学呢？这门课老师讲课基本没有什么用，照着ppt念，而且ppt还是过时了的，给的例子在新的AndroidOS上根本不能run（其实也不是很新的Android，4.0、5.0这个样子吧）。我上这门课基本都是靠https://developer.android.com度过的，不得不说官方教程就是好，讲解清楚还有samplecode。如果你觉得这门课自学不算个事的话，那么还有更令人抓狂的：老师经常改作业需求。这门课是每周有一个individualproject要求做一个小application，需要用到这周讲的feature。但是老师经常改作业的需求，你可以提前体会到程序员是多么痛恨pm改需求。关键是这门课还很看重OOdesign，所有程序都要求手画UML图，每次一改需求，又要重画UML。所以我到后来在交作业前两天就不上piazza（一个课程论坛）了，因为基本上每次上都会发现某个同学提问说老师这里是不是应该这样啊，然后老师就会说不是的应该是balabala，然后全班同学都发现自己理解错了，都开始疯狂地修改:)。以至于到最后都没有人在piazza上问作业相关的问题，因为问一次改一次，还是不要问的好，这样还可以拿handout来argue。Teamproject并不限制内容，但会要求写很多designdoc,requirementanalysis，说实话这些东西连同前面的OOdesign，其实还是有用的，但是实在敌不过一个一直改需求的老师。所以建议，如果不是没课上了，请不要上这门课。ECE的同学我最后会介绍几门用来抵60学分核心课的课。Crackingtheexam:这门课没有考试，但后半学期teamproject上来，每周还有individualproject(justlikecc)，load还是不小的。18645(15spring)HowtoWriteFastCodeECE版的parallelcomputing，无论是课程质量还是课程难度都远远低于15418。如果你在纠结这两门上哪一门，请不要犹豫，去选15418吧:)。这门课的主要内容有三大块，CPUbasedparallelcomputing(ILP,SIMD,OpenMP),GPUbasedparallelcomputing(CUDA)andcloudparallelcomputing(MapReduceandSpark)。其实从课程内容来看还是很不错的，无奈乎老师讲课水平太差以及课程要求太低，这些内容都是浅尝辄止。这门课有三次作业和四次project，作业都是独自完成，project都是组队完成（2-3人）。基本上作业就是帮你熟悉project的开发环境，跑一个sampleprogram再把输出结果提交上去。而project相对有意思一点，前三次project各自对应课程的三大块内容，要求你用OpenMP,CUDA以及MapReduce来优化一个基础算法(矩阵乘法、K-means、N-gram)，project的评分参照两点：你的优化程序相对于原始算法的运算速度，以及你的程序相对于别的小组的程序的运算速度。做得最好的team还可以去做presentaion，给大家讲你们的优化思路XD.第四个project要求你自行选题，用课程学到的parallelcomputing的方法去优化一个实际算法，并且写一篇小论文。我们组当时选的是中值滤波，把三个方法都用了一遍，发现还是mapreduce大法好:)。总的来说这门课的缺点在于课程内容太浅，project也没有什么锻炼量，如果ECE的同学想找一门不是太水的水课来抵学分，那还是可以一上的。Crackingtheexam:期中期末两次考试，期末考*全部学期*的内容，允许携带一页cheatsheet。这个cheatsheet很有用，因为这门课的考试会考一些比较干的知识点，所以可以提前把一些名词解释、公式(重点：怎么计算GPU的GFLOPS)给写上。大家考试前过一遍ppt，边过边把cheatsheet整理出来即可。考试不算难，但期中考试时间可能会严重不够（因为是随堂考）。18899(15springand15fall)AppliedMachineLearning(A4)andData&Inference(A3)TL;DR:除非你是ECE的同学并且需要用水课抵60学分，不然你可以跳过这一段了。这是两门课，但是课号一样（不同section），老师也一样，所以放在一起说。我最初是抱着认真学习的态度去的(AppliedMachineLearning,听上去是不是很实用！)然而事实证明这两门是不折不扣的水课，我给几个关键词：成绩=10%平时成绩+3*30%三次作业、一次作业=十小时、无考试。平心而论这两门课是可以不水的，AppliedMachineLearning主要讲各种机器学习算法，然而完全比不上ng的课，Data&Inference主要讲数据处理和数据可视化，然而还不上我本科时在实验室打杂自学的内容。总的来说就是老师要求太低了，上课有一半时间在举(che)例(dan)，讲了很多实际的例子。不过作为一门水课，它很好地完成了自己的目标。PS：老师(PatrickMcSharry)是牛津毕业，有着迷人的口音，上课无聊的时候听听他的口音还是很不错的。Crackingtheexam:都说了没有考试了你还想怎样:(15640(16spring)DistributedSystems这也是一门只要有可能每个中国学生都会选的神课。需要注意的是，这门课有两个版本，YuvrajAgarwal和SriniSeshan上的fall学期以及Satya和Babu上的spring学期。Fall的15640用go语言，更加偏向于应用一些（e.g.实现mapreduce、比特币挖矿），Spring的15640用C和Java,更加偏系统一些。因为我上的是spring的课，所以以下介绍主要对应Satya的15640。这门课我感觉就是一个大杂烩，如果你像我一样上过15641、15605、15719、15746四门课，那么我觉得这门课并没有太大的必要。这门课的主讲人Satya是AFS的发明者，所以他上课的很多内容和project都是围绕着DistributedFilesystem，当然这其中很多东西对generaldistributedsystem也是适用的。这门课前半学期主讲RPC、Caching，其中caching是大头。RPC可以说是一切DS的基础，而caching则会聚焦到很多DS的难点问题，比如怎么解决共享资源的锁。后半学期会讲scaling和Faulttolerance(FailureResiliency)，其中Faulttolerance是大头。很多经典的问题和算法比如Transaction,Jounralling,2PC,Replication,Paxos都会涉及到，还是能开开眼界。除了上面这些，还会讲Concurrency,GFS,computationscaleout(MR,MPI,Spark,P2P)等零碎知识点。总的来说是一门好课，老师Satya讲得很细很慢，按他自己的话说就是宁愿学生们学得少一点但是学精了，而不希望学了很多但都一知半解。不过我个人还是觉得他讲课太慢了XD。另外他总是强调这门课并不是要告诉你现在世界上那些“时髦”的算法、架构而是希望你能学会一些即使再过二十年也不会过时的核心知识。我觉得他说的还是很有道理的，我同时上着这门课和15719，就刚好是这门课会讲一些基本的东西,而acc就会给你讲一些很前沿的云计算技术，然而这些“云”归根到底还是依赖于DS的这些基本知识。这门课有四个project，四次homework，均为单人完成。四次homework就是做一些简单的题，帮助理解课程内容。第一个project是用C实现一个RemoteFileSystem(多个Client和一个server，文件都存在Server，client通过RPC操作文件)。这个project的难点是实现RPC，因为会有一些复杂的数据结构需要marshallingandunmarshalling，以及需要考虑一些cornercase。第二个project是在第一个project的基础上实现caching，即当client从server得到文件后可以cache在本地，下次访问就不需要从server处再去拿。这个project的难点是Concurrency，即当多个clinet要访问同一个文件的时候caching的处理。这两个project是前半学期的内容，分别对应RPC和caching两大块课程内容。第三个project是实现Auto-scaling，需要动态地根据server的RPS来增减node数，难点在于测试样例十分恶心，有日常小高峰也有黑五大高峰，很难写出一个满足各种情况auto-scaling的程序，需要不断修正程序参数。第四个project是自行实现一个2PCsystem，主要帮助理解2PC吧，没有太大难度。总的来说四个project下来你对DS,client,server这些东西也能玩得比较转了，值得一做。Crackingtheexam:期中期末两次考试，期末考_全部_内容。考试不难，把ppt里的东西弄懂即可。需要提醒的是，考高分并不容易，因为考试不难所以批改反而很严格，答题的时候注意不要漏写、略写，审题的时候要仔细。15605(16spring)OperatingSystemDesignandImplementation（后退，我要开始装逼了），压轴的课来了，CMU传说中的OS课。本着“我不入地狱，谁入地狱”的精神，我去上了这门传说中CMU最难的课。先透露一下课程load：每周三次课，五个project，两次作业，两次考试，一篇读书报告，工作量大概每周50小时，P3时每周60小时有的吧。这门课的广度、深度都超过了一般的课，一般老师没有两把刷子真的是上不下来的。前半学期是比较正常的OS内容，Stack,Hardware,Process,Thread,Deadlock,VirtualMemory，Scheduling,但是难度会十分大，毕竟一般os课的这些内容在15213里早就讲了，所以这门课主要就会讲很深的内容，比如如何用stack实现Thread和Process、如何实现lock等。前半学期讲的这些基本也就是所有project需要实现的内容。后半学期画风突变，开始走广度路线，会讲NFS(AFS),Virtulization,Storage,CacheCoherence,MemoryConsistency,security,Filesystem,Transaction,Driver,Lockfree(RCU)等层出不穷的内容，一节课一个全新topic。除此之外，每节课上课之前还会有个“十分钟”小课堂，老师会讲一些C编程的“奇技淫巧”，比如如何用C实现面向对象编程、如何使用版本控制等等，这些对project很有帮助。我当初是把这门课和15640,15719两门课一起上的，三门课在一起真的有一种相辅相成的感觉，有时OS才讲了Transcation,DS就会讲Journalling而acc就会讲journal-basedFaulttolerance，感觉就是OS在讲单机的内容，DS在讲cluster的内容，而acc又在一个更高的层次上讲一个cloud的内容。但无论怎样，有些技术、思想会反反复复出现，以不同的形式，不同的手段。我当初也是误打误撞选了这样三门课，但感觉这些system的课真的是相通的。说回这门课，两次作业题量都不大，但是很tricky，基本是关于lock,memoryconsistency的问题，属于那种思考难度很大，很容易就想错的了题。一份读书报告，是要求你在开学时选一本书（老师会指定一个书单／论文集列表，基本是OS相关的），一学期内自己抽时间把书读完，最后写一份两页纸的读书报告。这个作业其实敷衍的话也不难，但其实有人这样push你去读一本书，也未尝不是件好事。我当初选的是《LinuxKernelDevelopment》(RobertLove)，一学期读完后收获很大。最后来详细说说五个project，这估计也是很多人最关心的部分（对了所有都是C实现，我并不是很明白为何有人认为OS还可以用java写）：P0，单人project，主要作用是“筛选”出那些不适合这门课的同学，如果这个project你都做得很吃力，那么基本上你就可以放弃这门课了。。。这个project主要是要写一个Clibrary,实现trackback的功能，即当某个函数调用traceback()这个函数，可以在屏幕上打印出函数的的调用栈（从main一直到该函数），只要debug单步调试过的人应该对这个功能很熟悉。实现这个不算难，主要是考验对stack的理解。P1,单人project，主要是给写console,keyboard和timer三个devices写driver，并在三个driver之上写一个小游戏(run在kernelmode)。这个project主要是熟悉x86kernelprogramming，同时自己写的devicedriver也会在P3和P4用到。P2,groupproject（两人，后面的P3、P4也一样），写一个userspace的threadlibrary。就像普通的threadlibrary一样，需要实现pthread_create(),pthread_join(),pthread_exit(),pthread_gettid()等常用函数。此外还需要写mutex,conditionvariables,semaphores,R/Wlocks等锁的library（实际上你如果要实现一个threadlibrary,这些基本的锁都是必要的）。这个project开始，就有各种抓狂的东西进来了，为了一个bug调三天是常有的事，因为涉及到不同thread的stack还有各种锁，所以很容易出现bug，有些还很难发现。这个project用的kernel是一个老师写好的kernel，但它的behavior、systemcall等都是你P3需要实现，因此也算是提前熟悉一些kernelspecs。P3,也就是传说中的大boss，你需要自己实现一个kernel,包括各种systemcall(fork(),exec(),wait()，exit(),read(),print()等),virtualmemorymanagement,preemptivemultitasking,scheduler等等。同时把你P1的devicedriver(有了keyboard和console才有输入输出嘛)以及P2的threadlibrary整合进去。这个project的handout就有55页，时间跨度是两个月，然而你还是会感觉时间不够用啊时间不够用。基本做完这个project，你对OS的了解层度就比一般人要深不少了。P4,算是一个post-P3project,这个project必须在教授承认你已经做完了P3的情况下才能继续，否则就不能做P4，别人做P4的时间你接着做P3，因为P3算是整个OS课最核心的内容。每年P4的内容都不一样，比如给kernel再写一个filesystem,支持更多的devicedriver等等。我们这一年分到的都是使kernel能在multi-processor上工作，采用的是AMP模型。总的来说十分有趣，不同core之间需要收发message,在OS里玩出了DS的感觉。再说一下project的评分方式，老师给你一部分测试样例，包括unittest和stressingtest等，但是你交上去后还会有另一部分测试样例。这门课一大特色是助教会把你的code全部打出来，然后用红笔帮你修正，相当于帮你做了codereview。Review完了之后会有一个1:1的interview,他会问你一些design和implementation的问题，也会指出你的一些缺陷，是很好的学习机会。最后你的成绩是测试样例通过率、codedesign和codestyle等的综合。值得强调的一点是，这门课不仅注重implementation也注重design(请看课名)。OS是一个很大的system，你如何设计各个component使得整个system能完整地运转，这也是这门课要求你掌握的一个重要的能力。当然了你这门课上完之后，Cprogramming的能力也会突飞猛进，特别是debug能力XD。整个OS课上下来，project做完，会学到很多东西，让你搞清楚之前很多似是而非的概念，同时又可以帮助对DS,acc等system课的理解，最后达到一种融会贯通的状态。有很多人都听说这门课太难，而不敢去上，但你要知道，你学得越痛苦，最后学到东西也越多。我有时候真的觉得，花了高价学费来到了CMU，不上上传说中的神课真的可惜了，就像是你去了少林寺拜师学艺，然而却不想学洗髓经一样。这里我将OS比做洗髓经是有原因的，OS这门课就像你的内功，不会有马上立竿见影的效果，但是为你今后CS的学习成长打下了基础，铺平了了道路。同时CMUOS的教授把这门课称为"transformative"的课，我想“洗髓”正是其最好的翻译吧。所以如果你有份好学的心，真的推荐这门课。最后说明一点，这门课在选课的时候需要教授一个个把学生加到这门课里，也就是说需要教授认可你才可以上这门课，那么如果才算认同呢？按照我的经验，你至少需要15213+一门其他CMU的system课(15411,15440,15441,15418)都拿A，注意15619这样的application的课在教授看来完全没有卵用。Crackingtheexam:期中期末两次考试，很多PPT都不会考！很多PPT都不会考！很多PPT都不会考！特别是那些体现“广度”的ppt，基本都不会考，所以你不要再像我一样去背OS在启动时候要经过哪些过程之类很琐碎的知识点了。那么这门课考试考什么呢？现场写程序！对的，你没有看错，现场给你library和Systemcall,让你开始实现算法，我真的是在考试场写出了面试onsite的感觉啊。所以说，project很重要，一定要认真design认真code，同时认真读同伴写的code。最后一段再推荐一些我没有上过但是听说不错的课。首先是本科CS剩余的两门system的课15411,15418，然后是高阶system课15721(这门课我试听过，真的不错，教你如何实现一个memorybaseddatabasesystem，老师讲课细致，ppt做得很艺术，然而无奈位置太少没有挤进去),15826。除此之外还有一些application课,15415,15437，一些基础课15210(强烈推荐，用functionalprogramming来实现各种算法和数据结构，既学了函数式编程又学了算法),15214,15251。最后是一些给ECE孩子们的抵60学分核心课的:之前的15746,15826,15719,15721都不错,18649,18697,请不要上18842，据称是一门烂课。还有一些抵60学分的水课（所以你可以抽出时间来上15的好课）:18645,18899,18660。周日花了一下午+一晚上的时间，终于写完了这篇文章。如今已经毕业半年，也步入了社会开始工作，这时才发现自己很怀念学生时光，那种不顾一切只想着学习的专注，那份赶due到凌晨四五点的执着，那丝通宵debug最终找到bug的喜悦，和小伙伴为了一个design的问题而争得面红耳赤，现在在工作中都很难体会到了，也不知是少了什么，可能是没有当初那么“纯粹”了吧。希望还在CMU的同学们好好珍惜校园时光，无论是其中的惬意还是劳累，都会是你今后一份珍贵的回忆。如果你想更多地了解我对CMU的看法，请参考我的另一篇回答：在卡内基梅隆大学（CMU）学习计算机是什么感觉？-Ke克的回答-知乎