问题：﻿CMU 计算机选课上有什么特别好的课程推荐？ 可以为后来人做借鉴~
话题：﻿计算机、大学、计算机科学、卡内基梅隆大学(CarnegieMellonUniversity)
回答：﻿刚结束第一个学期，目前上过的课里面值得一提的有以下三门。希望能给在纠结选课的同学提供一些客观的信息，方便做判断。1.15513(IntrotoComputerSystems)内容每学期都一样，详见官网：http://www.cs.cmu.edu/~./213/授课：513不论是在学校里学还是在国内暑期远程学，都是视频课。视频和教材《CSAPP》的内容是完全重合的，对于CS基础不好的同学（看视频跟不上，我当时的状态），如果想把基础打扎实一些，推荐精读教材2-3遍+过一遍视频复习；如果基础很好，或者不想花太多时间学这门课，直接看视频更省时间；不少业务熟练的大神可以啥都不看直接做project。project：这门课的核心是8个project，用C语言，每个project代码量从150行到1500行不等。project的难度主要在于debug，每做完一个project不仅对当前的topic能有比较清晰的理解，代码能力和debug能力也能提升不少（前几个lab比较底层，主要靠GNUdebugger逐行执行汇编/C代码，后几个lab主要靠print）。个人感觉最困难的两个lab是malloc和proxy，前者经常会遇到内存访问相关的segmentationfault，很难根据bug推测出哪一块代码有问题；后者要考虑多线程访问同一块资源的同步性问题，以及用C写socketIO出现的一些莫名其妙的问题（我至今没有搞得很明白）。这门课没有笔答的作业，书上的练习题质量都还不错，如果有时间推荐做一下，可以加深对知识点的理解。考试&给分：每个project的autolab测试花时间应该可以拿满分，但后半部分project有代码风格分，占比10-20%，每次都扣的比较狠（不管我如何认真地写注释，整理代码模块，一般都只能拿到50%），期中期末两次考试，平均分可能在85上下。基础好的不用说，基础不好但肯花时间的话，拿A不难。收获：能清晰理解computersystem方向的主要topic，再接触system领域的其他内容至少不会手足无措。副产品是debug能力提升不少；后面几个project代码量基本在500行以上，malloc和proxy在千行左右，而且复杂度很高，对于没太认真写过代码的我来说，也算是有了一点项目经验。需要提一下的是，这门课的范畴仅仅是computersystem，对找工作/面试/刷题的直接帮助不大，也写不上简历；对专注于machinelearning方向的同学帮助也不大。综合评价：100分，是我目前学过的收获/投入比最高的一门课，没有之一。2.15640(DistributedSystems)18fallYuvraj&Daniel版本，详见官网：15-440/640,Fall2018:DistributedSystems授课：这门课没有与课堂一致度比较高的教材，也没有视频，只能靠课上听。Yuvraj的授课相对成熟一些，Daniel是来CMU的博士后，年轻帅气有激情，但是讲课缺乏逻辑，基础不好的同学（又是我）可能会觉得前言不搭后语，PPT也看不太懂。上半学期偏理论一些，从network到RPC，再到concurrency以及各种consensusprotocol。下半学期比较像一门文科课，从工业界的分布式应用，如GFS/Hadoop/Spark到DNS/CDN再到security，完全走马观花。从课程的逻辑性，衔接度来看，上半学期是好课，下半学期质量不高。作业&project：Project是这门课的亮点，一共4个，每个占比9-12%，全部用Go语言，每个作业实现一个分布式系统，侧重点分别为：project0主要熟悉Go语言，实现一个可以处理多线程请求的数据库server，project1侧重networkprotocol，project2侧重consensusprotocol，project3侧重leasebasedcache与routingandstoragebasedonconsistenthash。其中project1的第一部分，要求两人一组实现一个介于UDP和TCP之间的协议，这是所有project里面复杂度最高的一块。我一开始是抱着学习513的认真态度来做这个project，认真设计出逻辑严谨的架构，分模块分层写代码。但事实证明对于640，不如少想多写，当时因为仔细研读了助教给的需求文档，导致从一开始的设计就是错误的，后来不得不推翻重做，反复了大约两次。后来助教也承认他们写的需求文档是有一定误导性的，必须要看testprogram的代码才能写对。这个作业写完了之后，差不多一开始的300个学生里有100个都退课了，大概一部分是因为作业困难，另一部分大概是真的受不了了（当然也有项目经验非常丰富的大神，每次都能心领神会助教的意图）。除了project之外，这门课还有笔答的homework，均为助教出题。题目质量比较低，除了题本身经常有问题之外，与课程的关联也很弱。建议在保证做完的前提下，尽量晚开始做，这样在piazza上会有非常多的提问以及勘误可以参考，能节省不少时间。考试&给分：主要考课上的内容，难度不高，但很难领会出题人的意图，判分也不很宽松。期中期末的平均分都在70左右，而且不curve。对成绩比较在意的同学需要注意，我们这学期大多数同学都集中在B+/B/B-这三个档，平均分和中位数应该都是B。即使平时的作业和project都不怎么扣分，因为期中期末考试不curve的缘故，拿A也是非常看缘分和天赋的。收获：分布式系统相关的啥都接触一点，写代码能力有大幅度提升。对找工作有一定帮助。综合评价：60分，同为system课，15640的产出投入比明显低于15513，非常折腾，但也学到了很多东西。3.10701(IntrotoMachineLearningforPHD)18fallPradeep&Ziv版本，详见官网：INTROTOMACHINELEARNING授课：当初选10701的原因之一，其实是想瞻仰一下Pradeep，在CMU搞传统machinelearning仅次于EricXing的大牛。虽然科研很厉害，但从讲课技巧来说，两位老师都不算很好，特别是Ziv的口音我花了半个学期才能适应。从内容来看，大概一半有监督学习，另外一半是无监督学习+概率图模型+强化学习，一个学期把传统机器学习领域的基本方法和工具过得差不多，理论和应用都有涉及，进度蛮合理。关于10601和10701这两门课，我观察到的主要差异在于授课进度。在期中考试的时候，老师有推荐刷一些601的期末考试题。对比之后，感觉在进度上，701到期中的进度已经基本可以cover601期末80%以上的内容了。作业&project：701本学期一共四次作业，每次占比10%，每次作业4-5个证明/推导大题（每个证明大题包括几个小题）+1个编程题。证明题主要证明某个方法（比如SVM）的一些数学性质，感觉这部分题目质量不高。编程题不限制语言，通常是自己实现一个学习算法并且在给定的小规模数据集上跑一下，比如GaussianMixtureModel，NaiveBayes.所有编程作业都仅仅要求实现模型，不对运行效率做任何要求，这也是我觉得701这门课从应用的角度来看不够完善的一方面。除了作业之外还有一个占比25%的project，可以在限定的题目里选题，3人一组。我们做的是基于Facebook数据的无监督聚类。这个project比较有意思的一点是数据的量级比平时作业的编程题大一些，用笔记本跑一次实验大概要几个小时。比较有趣的一点在于，这个project由于数据量级稍大一点，可以暴露出自己手写的聚类算法相比Pythonpackage的效率低的问题，同时也在大神队友们的带领下学习到了很多类似multiprocessing的技巧。一个project做下来，对机器学习在实际应用中会遇到的问题也能有一点点体会。考试&给分：701一共两次考试，历年的期中考试都是又难又偏，在复习充分的情况下，基本10个题里面也只有1-2个有把握做对。我们这学期的期中考试也是同样的感觉，但最终在助教努力不断放宽标准的情况下，平均分也奇迹般地上了60.尽管考试比较折腾，但是复习考试的过程确实（自学）学到了不少。期末考试明显比期中简单，平均分85.总评成绩curve之后大概平均能到A-，算是非常厚道的课了。综合评价：70分，主要靠自学但课程进度合理，自学容易跟上。时间投入不到15640的一半，产出投入比高于15640。PS：640和701仍然算是收获很大的好课，给出60分和70分的评价具有一定主观性，也是为了体现和513差距很大的事实。按同样的标准，我这学期的另外两门课只能打0分和10分。