无敌干货|CS 300+课程血泪介绍1.1

  前言

  继之前的1.0之后又有许多课程攻略完成了,这次算第二篇,以后也会有总集篇。我作为主笔和统筹结合自己的经历写了一小半的课程,有些顾及不到的则邀请了一些信得过的伙伴一起写,力求覆盖到全部课程。以下小伙伴是要着重感谢的:

  Ajax/Gloria/伊恩/Peter/Richard/......(排名不分先后)

  为这篇文章贡献了许多宝贵的时间和精力!

  其他要说的:CS系大三课程的多样性可谓是四年之最,丰富的选择与搭配往往让很多人无从下手,更不要说哪怕选了也不知道课程具体讲了些什么,所以作为上过这些课的人,我们希望能尽可能详细地介绍一下这些课程,而不是蜻蜓点水一般地略过,与此同时也尽量保证覆盖得全面。我们会尽量避免一些主观判断例如“这门课很水/不用听课自学就好了”之类的建议。

  CSC301

感谢Ajax提供的情报。

CS系唯一一门七人组队的软件开发课程。课程有两条主线,一条是以Java入手,说了很多Java和OOP的特性。另一条则是科普一些正规的软件开发概念。

先讲讲软件开发这一块,课程首先详细讲解了一遍版本控制工具git和一些常见的git指令,以及一些自动化测试的工具如Travis CI和Maven等。之后介绍了常见的软件开发的流程如waterfall和agil,再加上agile的很多细节诸如extreme programming和test driven programming等。从更宏观的角度出发,课程还介绍了scrum和kanban等不同管理方法。从product management出发,课程更详细地定义了到底什么是一个产品并通过persona和use case diagrams等不同方法让制作人更详细地了解自己的产品。

再说OOP,课程的另一条主线。在207之后课程又把很多之前提到的OOP概念进行解读,并辅以4个作业帮助你深入理解。首先比较了inheritance和composition的异同,之后从最基础的iterator开始,介绍了诸多不同的design pattern。重点提到地有observe、adapter、factory和builder 。其他提到的概念还有lambda expression、serialization/deserialization、multithreading和asynchronous programming等。

这门课没有final,只有一个长达一学期的project,一个midterm和若干(4至5个)Java的assignment。Midterm较难而project与CSC309相比题材和形式更加宽松,可以接受的有各个平台的app,也可以是命令行工具或者浏览器插件,甚至是一款游戏。但project 的难度要达到一个七人团队的正常水平。存在的问题是TA和教授对project题材的评价比较主观,经常存在TA觉得OK但是教授觉得无趣这种情况。Project评分方面,主要决定分数高低的有你每个阶段的planning和反馈的文档质量,以及个人对这个project贡献(Github上对这个project的commitment达到一周两次及以上的频率)。

  

和葫芦娃类似,只有7人齐心协力才能合体成葫芦小金刚好好完成project,所以请随时和队友保持联络,不要一个一个送。

  CSC309

可能是多大CS系唯一一门网页开发课。教的东西是实打实的全栈技能。课程内容从制作网页的基础HTML和CSS开始,学会了这两项制作一些静态页面便没问题了(比如个人网站)。而为了制作动态页面(比如问卷调查网站)以及更好的理解网页的结构,则介绍了java、html form和DOM,以及为了让 java更方便使用而产生的库jQuery。接下来则是更宏观层面的template和框架如react和handlebars等。

之后则会渐渐地从前端过度到后端,比如让前后端能够交流的rest和ajax,以及主要在后端运用的基于java的node.js语言和另一个框架express 。之后会短暂的教一下database,但毕竟不是CSC343所以只是短暂地提一下SQL和NoSQL的区别。最后一个重点则是网络安全,主要介绍了十种左右常见的网络安全隐患以及对应的防范措施,以及公钥私钥的加密原理等。

总体来说,课程涵盖了JS开发、Restful API、数据库和网络安全等等,基本上完整门课以后可以掌握独立开发网页app所需要的基础技巧。课程的分数构成以作业和project为主,另外加上final和tutorial。Tutorial给的任务都比较有引导性,能够很有条理地带你过一遍课上所教授的内容。

Project自由度较高,在满足教授给的基本要求下可以随便做自己喜欢的东西,也允许使用一些开源的前端框架和样式库。如果project完成得比较好的话完全是可以写进简历的。校园内有不少实用的app的前身都是CSC309的project,由开发者在这门课上完以后继续开发完善,比如大家所熟知的鲸语和智能课表等等。

  

如图所示

  最后由于前端内容日新月异,所以课程涵盖的内容每年也稍有改变,本篇攻略基于2016 Fall写成。

  CSC320

感谢Richard提供的情报。

CS专业基础的computer vision相关课程,也是AI和computer vision focus的要求课程之一。不过这门课和AI的相关内容不多,主要介绍一系列的传统的图片处理理论和算法,接触到的内容较多,并对数学基础有一些要求,而且上下内容的相关性不大,相当于零散学习了一些图片处理的技巧,加深了对图片的理解。

这门课一般会有四个assignment,难度适中但是耗时比较大,内容和上课内容以及考试内容相关性一般不大。Assignment主要考察算法流程的理解,以及对python中numpy module的掌握。Assignments有一些部分对于程序性能(速度)的要求很高,是很好的python/numpy练手项目。好好写完四个assignment的同学一定成为numpy达人(雾。

上课以及考试涉及calculus和linear algebra较多,因此建议数学基础比较好的同学选择这门课。考试需要熟悉lecture的内容。莫名其妙的数学题以及一些lecture上不起眼的知识很有可能会出一道大题。建议做好schedule认真完成四个assignment,可以从中收获很多。

  

每次上官网都能看到的封面图

  CSC321

感谢Richard提供的情报。

多大CS专业基础的machine learning & neural network相关课程,是AI focus的要求课程之一。在内容上和CSC411有一半左右的重合,主要包括一系列的neural network model与其优化技巧,以及一些理论上的模型(如boltzmann machine)。这门课比较与时俱进,会在lecture上甚至作业中介绍一些目前AI业界最新的高效模型&算法,可以说是很好的一门deep learning入门课。

在winter 2017 semester这门课的作业由四个programming assignment和10个左右的writing problem set组成。前者每个占比重10%,后者problem sets合计占比20%左右。相比CSC411,这门课programming assignment的workload要小一些,因为有写好的starter code,学生只需要完成最关键的部分即可,不必纠结繁琐的细节,有助于对于整个模型运行的理解。Programming assignments对于性能(速度)一般都有要求,这也是个学习python/numpy中小trick的好机会。

这门课的考试相对简单,形式和writing problem sets中的题目类似,多为概念运用以及简单的activation或者概率计算题,主要考查对各种模型的理解,以及对一些概率有关知识的掌握。建议认真完成作业,对理解这门课内容以及考试都有很大的帮助。

任教的呆萌Prof. Grosse是MIT的博士高才生,主攻autoencoder方面,大家可以多多膜拜~

作业之一,要求你 hard-coding a network

  CSC373

  CSC373作为CS系算法相关的最后一门必修课,尝试解决大部分程序员在整体算法领域中能遇到的较难的问题。CSC373从CSC263就提到过的divide and conquer问题开始,继而介绍greedy algorithm和几种不同的证明方法,以及它的一些运用如huffman coding。

  下一个大头则是dynamic programming,也经常被教授说是课程中最难的部分。Dynamic programming的核心在于把原问题分解成一些形式相同的子问题(很多时候子问题会有重叠),并用一些数据结构保存这些子问题的解,从而靠牺牲一点空间来获得更高的运算效率。

  下一个部分则是network flow,以寻找最短路径为目标介绍了dijkstra、bellman-ford和Floydwarshall等算法以应对不同情况。之后又更彻底的讲解了flow的概念并通过Ford-Fulkerson来计算最大限流问题和max-flow min-cut定理。而其解法则与linear programming有关,并围绕着linear programming介绍了duality等性质,还有则是提到了simplex等应用。最后也是最抽象的话题便是大名鼎鼎的P NP问题,逐一讨论了P、NP、NP-hard和NP-complete等概念后以一些经典题目举例做了一些NP-complete的证明以及其approximation和Optimation类型的运用。

  

多大的算法课程很多时候就是在解读这本书(算法导论,被誉为算法界的圣经,俗称CLRS),而即便上完了这么多CS算法课对这本书的讨论还是有限的,建议无论找工作还是提升算法功力都把这本书基本弄懂。

  总体来说,373对算法的探讨从广度上和深度上都比之前深了不少。尤其P NP之类的话题让很多同学望而却步。但考试和作业等大多有固定题型,只要多看书,多练习,多理解把大部分题解出来并不难。希望各位能意识到这门课的挑战不要零时抱佛脚!

  后记

  至此三年级的选课已经说了大半,还剩下的部分会在日后慢慢放出,请各位少安毋躁!另外如果对选课有什么疑问或者意见,欢迎私聊UT助手,那么我们下期再见。

  

  下期再见!

文字/皮卡丘&Ajax&Richard

编辑皮卡丘

校对半弦&z赢

声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
推荐阅读