|
最基础的,你要熟练使用数据结构(CS261),算法(CS325), 和计算原理(CS321)。这些课是3 term pathway 肯定会上的。
如果你要学习人工智能方向,算法和线性代数很重要。人工智能方向有机器学习(CS 534,秋季),深度学习(CS 519,冬季),人工智能导论(CS 531,冬季)等课程,我打算来年上的。
学习图形学方向,请学好线性代数,三角学(主要是sin cos)和 图形学入门(CS450/CS550,秋季)。入门课中,你先会接触基础的图形学操作。首先是画多边形,然后是三大变换,平移,旋转,伸缩。接着是做简易动画,贴图,光照,使用着色器等。
3D 图形学很有意思,等你学了入门课后,可以学下面的课程 图形渲染(CS551,春季), 动画(CS552,冬季),几何建模(CS554,秋季)。这三门课是Eugene Zhang 教的(原中国人)。他的课不要考试,但是要做siggraph的paper项目,难度不小,而且平时作业很多要自己查。他的课是数学课,各种讲数学概念的底层逻辑。我已经上了渲染(正在上)和动画。
渲染课开始学习顶点颜色调和算法,然后是变换矩阵(包括平移,旋转,伸缩,相机,投影),最后是光照模型算法的实现。最疯狂的是做全局光照模型。
动画课里将基础旋转,机械臂动画算法,mesh动画算法,粒子系统,甚至是流体粒子系统。
几何建模我没上过,但是可以肯定的是这课要讲mesh 3D模型,平滑曲线曲面等等。
还有着色器(CS557,冬季)。另外,计算机视觉(CS556,冬季)也勉强被归入图形学方向。
编程语言方向,主要用函数式编程语言来研究各种编程语言的特性。比如,lamda表达式的实现原理,程序结构,程序语义(把程序结构编程结果),数值和函数的类型,语言解析器,语言运行环境变量(比如变量的运行栈)。这方向要用haskell,idris等你可能没有用过的语言。上手难,等你精通了会发现他的好处。特别是用Haskell 的 functor, monad等抽象概念去实现多态。本科课程为编程语言基础(CS381)。研究生科有编程语言阶段一(CS581,秋季),编程语言阶段二(CS582,冬季),函数式编程(CS583,春季),还有每年话题都不一样的(CS589,春季)。这方向有俩教授,一个是年轻的eric,一个是老教授martin。eric的课比较好过。martin的要求很严,不过也很和善。函数式编程给我最大的印象就是一切皆函数,数据也可以当做函数。函数被当参数传很正常。
在算法方向,课很多,我先说我上过的两门。
算法和数据结构(CS515,秋季),主讲递归, 动态规划,分治法,随机化算法,最大流最小割算法和线性规划算法的应用,期中期末考试要当堂解算法大题,作业是纸质版,三部曲,写算法流程,证明正确性,时间复杂度。会做作业,考试基本没压力。虽然这是小组1到3人作业,尽量自己吧所有题做一遍才能真正应对考试。
高阶算法(CS523,以往每年春季,今年冬季,以后是每两年才提供一次,上的人太少)。主要讲NP问题的近似算法,NP问题的动态规划算法,和NP问题的问题等价简化,我上过,内容难度比较大,只有作业,老师只看解题paper。也是看你的算法流程,证明正确性,时间复杂度,近似算法还要看渐进因子的证明。老师会抓你的语法拼写等等,因为老师想提高你的英语学术写作水平。每俩星期一次解题会谈,和同学交流,然后回去写paper。写完paper初稿,老师会给feedback。初稿写不好别有太大精神压力,老师重点看的是第二稿。第二稿你把逻辑写对,把表达方式按照老师的要求修改,就是拿A。
其他算法方向有CS520(图论,冬季),据说特好过。CS516(秋季) CS517(春季),两门计算理论课,讲的是图灵机,DFA,PUMPING DOWN 等在CS321里面提到的内容,相当于国内的编译原理。CS527(编码学,秋季)。
系统方向有数据库(CS540,冬季),网络安全(CS576,冬季),体系结构(CS572,秋季和春季),操作系统第二阶(CS544,秋季和春季),高速体系结构(CS570,冬季),并发编程入门(CS575,春季)。
特别值得一提的是操作系统第二阶(CS544),这课要求你做一堆改linux内核的作业,final project更是要你拿intel开发板从装操作系统,装编译器,自己修改内核代码测试修改内核一条龙做。老师为了培养你的自学能力,基本让你自己上网查资料做,他不会回答任何网上能找到的问题。另外还要超多多进程编程练习。对于多进程编程,老师会让你在堂上写实现想法,再回去编程。如果你没上课,只做了编程,没写纸条,100给34分(一定要全勤,血的教训)。另外,他打开作业用脚本,如果你把文件放进文件夹里再打包,0分。另外,每次作业要写报告,要用latex写。而且你的latex源码必须放上去,如果只有pdf,或者你的latex文件不能通过编译,那么恭喜你,又是0分。每次大作业你还要找助教做演示(demo)。这是我目前为止唯一没有拿A的课,是B+。你如果全勤,做到该做的,拿A其实也很容易。
562 569 等等是软件工程方向的课,我没具体了解。
容易过的课有520,527,540,550,557,570,572,575,581。
不过如果你真想学得精,我倒是建议你找些难点的,思维深入一点的课来学。比如CS515,CS516,CS517,CS523,CS534,CS531,CS544,CS532,CS551,CS552,CS554,CS556,CS583。这些课看上去容易挂,但是如果你深入去探索,比起学习水课的收获要大很多。
下面是我对各学科方向的理解。
人工智能,在国内已经有政策大力支持,重点在于机器通过大量数据分析学习得到较好的近似解。而图形学可以做炫酷画面,也可以进一步让你接触数学,物理学知识,对游戏开发必备。算法是所有软件高级思想的核心,让你在运算时间,结果正确性(对于NP问题一般求近似可行解,对于P问题肯定要求最优解)和内存使用量中寻求平衡。计算理论加编程语言能让你了解编程语言特性的底层实现,从而让你能更好地使用你喜欢的编程语言,同时也让你有强大的字符串解析能力。计算机视觉可以将人工智能和图形学结合在一起,把图片变为数据。而操作系统让你了解文件系统,内存系统,进程系统,I/O系统的软件层面管理。体系结构让你了解底层硬件的实现,运算器是整门课程的绝对核心。软件工程则是如何管理团队做快速开发,满足客户需求,以及测试维护等。
我比较有兴趣的是图形学,编程语言,算法,人工智能这四大方向。
我建议你最好根据自己兴趣和自身需要选课,不要一味选水课。
希望我的建议能给你产生帮助。 |
|