UWaterloo的CS课程介绍,一篇充斥着淡淡忧伤的总结…..ˋ(╯ω╰)ˊ
(原文地址:http://blog.renren.com/blog/237573071/889197245)
转眼在UW的时间也3年多了,虽然还没有毕业,但是林林总总下来,基本UW的CS课还是上过了不少了,特此把自己或者周围朋友上过的CS课程介绍以及一些资料整合一下。能帮到人最好,也算是纪念一下自己的大学生活吧。
同时,也希望能尽可能的补完此CS课程总结,CS专业或者非CS专业的CS课程,如果有同学希望能贡献一份力量请联系我。
特别感谢: @张俊亚(263179881)
其他CS众神: @丁柏宇Anakin(247575564) @朱剑Jayson(264410843) @刘博(251980561)
============因为不只是我一个人在卖萌。。。所以好像得有个版权声明======================
纯原创内容,转载请注明出处
谢谢各位
============================有事儿没事儿ge一下==========================
首先常用的几个link给大家发一下:
–
Bachelor Of Computer Science(BCS) degree requirement
========================正文开始前的废话快结束了===========================
因为版权问题,所以我po上来的全部都是可以直接从google上面搜索到的内容。并没有直接转发粘贴等,只以link形式出现。不过基本在这篇总结中出现的课程的作业原题我都可以搞到,有需要的话可以试着联系一下我,但是答案什么的就算了,在UW学CS的,抄作业答案这种幸福的事情是跟你没关系的。。
你如果想说。。。。
是不是这么悲剧啊老湿。。。。。。。。。。。
恩。。。现实就这么悲剧。。。。谁让你选CS了。。。。千万不要想着去抄神马的。。否则学校方面很容易就可以发现,然后把你XXOO^$%^$什么的。。。绝对惨不忍睹
最后再废话一句,后面提到的作业所需coding时间,是实打实的坐在电脑前面,敲code的时间,要除去写不出来找基友扯淡一下,刷个人人微博Facebook,clash of clans抢个钱,赛车游戏跑一把,出去买个咖啡什么的划水时间的。。所以。。恩。。大家都懂的。。。这就叫coding时间。。
=========================正文终于开始了耶(兴奋个P啊。。)======================
CS115
非CS专业的学生必上的2门课。内容涉及一种叫做scheme的编程语言。算是很基础的入门编程课程。很多的利用了一种叫做recursion的概念,中文叫递归(其实我不知道递归是什么东西。。)这个概念搞明白会用了,基本115就无压力了。作业拿分要点,code是一方面,design recipe占的比重同样的大(个人认为很脑残的一项设置)前面几个作业在你没有摸清楚老师的判分标准前会被各种莫名其妙的理由扣分。(此特性,116,135同样适用)
CS115官方网站(包含作业,notes,课程介绍等,但是作业和notes会在每学期末删除)
–
CS 116( preq CS115)
CS 116的上半学期的课程仍然是进阶的讲解关于scheme的内容,具体设计到lambda的使用(abstract function, 其实是什么东西不用深究也可以,会用就行了。。)
下半个学期会涉及到一种新的语言,python。有兴趣的可以去google一下。建议刚开始讲python这个部分的几节课一定要去听(大部分人会跳掉CS115和116的课吧。。恩。。大家懂的)因为python除了recursion之外允许使用loop的概念,跟scheme相比还可以随便更改variable的值等等,总之跟scheme很不一样,所以入门去听一下还是很重要的。
CS116 官方网站(包含作业,notes,课程介绍等,但是作业和notes会在每学期末删除)
–
CS 135
CS专业的第一们课。和115一样,专攻scheme的语言,同样是recursion。只是编程难度增加了而已。没啥好说的。但是由于不和其他语言一样可以用什么for while loop只能用recursion,刚上手可能会有一些难度。作业的分数和115一样脑残,design recipe会占很大部分,要格外小心,否则code全对但是每个作业只拿个70多也是很有可能的。最后1-2个作业会格外有难度,一般都是一个完整的长的project问题,需要小心。
–
CS 136(preq CS135)
CS入门第二个课程,近两年现在给人的感觉是难度明显比之前增大了。前半部分仍然是scheme,多了lambda等东西(abstract function)。到了后半学期,语言变成了C,讲解的进度也是从初级入门开始的,所以即使不知道也没关系。但是进度很快,需要自学的东西可能会多一些。
至于作业,相信是从C的作业开始看到segmentation fault什么的吧(试图访问invalid memory address)。各种malloc和free什么的。
最后2,3个作业的工作量会明显加大。就最近几个学期上的朋友来说,写个5-10个钟头貌似也不是很夸张。不过实话说,如果在CS136的时候最后几个作业编程实践在10-15个小时仍然没有头绪搞不清楚作业的思路的话,或许CS专业并不适合你。
另外,136的作业提交用到了一个叫做marmoset的东西。这是UW自己开发出来的一个自动作业测试平台。所有用到marmoset的基本规则都是,每一个题有两组test,一组是public test,你有无限次的机会提交,当你的code通过了public test之后,你可以进入下一组test,这一组test就不会是无限机会了。不同的course的计算方式都不一样,有的可能没12个小时允许你跑3-5次这种test(叫做给你3-5个test token,每12个小时regenerate一次)
相信所有用过marmoset的人都会记得这种结果。。。
Test 1 0/12 Blind test
–
CS 145/146
CS135,136的进阶版,之前145=135+136,现在好像145不再冲着去讲C了,而是去进一步深究scheme的用法。如果觉得自己热情高涨可以去学,而且145就开始直接用marmoset了。
LZ刚入学的时候曾经激情满满的去上了半个term的145.。。。。然后就果断downgrade到135去了。。
官方网站:
–
–
=============================卧槽要2了要2了居然到2开头了==================
CS 245 (preq CS 136 or CS 146)
终于2字头了。245的课程叫做Logic And Computation,和编程逻辑很有关系(但是我其实不知道computation是个毛。。)不过在说内容之前,特别叮嘱一句,245有一个著名坑爹的prof,D**i*d T*m*n…在rate my prof上面此人为UW中评分最低的CS prof没有之一。。此君人其实很nice,而且slides也不错。但是上课教学方式实在不敢恭维。。手舞足蹈完全不知所云。。LZ怨念的因为他把CS245押后了一个term学。。遇到此君可以的话请诸位尽可能绕道。
废话扯完,来说245.这个course没有涉及coding的作业,所有作业都是纸笔完成提交,纯理论课程。内容涉及到logic proposition的证明。Formal Language用法以及相关证明等。
如果prof不坑爹的话,基本上课会把相关的例题证明什么的给出来,所以上课还是非常有必要的。由于是必修,所以也不存在什么推荐不推荐。只能coding恨死理论知识的各位,硬着头皮上吧。。木有办法。。(= ̄ω ̄=)
–
CS 246 (Preq CS 136 or CS 146)
一门编程为主的课,下半学期有一些关于软件设计的内容,比如UML和Design Pattern,这些内容在CS445和446中有详细的讲解。
最开始的时候会介绍一些linux的命令,应用以及bash shell script的写法,都是非常的浅显,只是教你如何在linux的环境下如何修改文档权限,如何compiel你的code,如何进行test等等,并没有多么的深入。不过自此之后CS的coding作业(高年级的作业,不只是CS246)就大部分在linux环境下完成了,所以这个部分一定要搞明白。
此课的正题是Object Oriented Programming的应用。使用的语言为C++.仍然是从最基础教起,基本的cin,cout到array, pointer,class的应用,到后面的dynamic memory allocation,Inheritance,Operator Overridden, type casting等。
一般是5-6个作业吧,前面2,3个都是比较容易的划水作业,后面的难度陡然增加。CS专业中第一个需要连着coding N个小时的课程就是246了(N>=10,大神除外)
作业提交仍然是marmoset.
考试方面,coding占的比重不小,所以作业一定要好好做,对考试的帮助很大。
考试中其他的概念部分的问题,一般都是课上强调的重点,所以最好能够去上课(混蛋为什么是“最好”?不是应该每节课都去的么?哦呵呵呵呵呵呵)
–
CS 251 (preq CS 136 or CS 146)
又是一门纯理论课。相对来说此课程更偏重于硬件方面的知识,还有逻辑电路。
首先会涉及到一些基础的逻辑方面的东西:logic gate, truth table, logic equation(245的东西), finite state machines(CS241会用到)。
然后就是signed和unsigned number的一些计算,CPU的构造以及如何工作等,从硬件角度去解释CPU程序。记得考试中一个考点是关于pipeline的,就是一系列的指令按照一定的顺序执行以达到加快运行效率的目的,会让你arrange一些instructions的order什么的
最后的就是零散的一些关于Memory和cache方面的(CS350会用到)以及networks的了,不过都是点到为止,而且考试的重点也会侧重在这方面。
所有的作业均为纸笔,木有coding。
考试方面,好好上课,把作业都搞懂(尤其是逻辑电路那里,刚开始会不知道如何下手),70-80+ 都应该还是没压力的。(碰到无比坑爹的prof除外。。)
–
CS 241 (preq CS 246)
个人认为CS的必修的coding课程里面第一个相对算是比较难度很大的课程。
此课的内容为compiler原理。所谓compiler说白了就是把编程语言变成机器语言的工具。这个转换是分很多步骤的,241详解了这些步骤。还提到了系统如何使用内存来支持程序的运行。
基本会有10-11个assignment。
第1,2个作业基本是划水的,让你写MIPS的程序来实现一些简单的加减,if condition等。感觉5小时左右基本可以搞定一个,如果你数学和逻辑思维畅通的话。
第3,4个作业的时候,正主来了,第一个assembler,asm.xx.可以用scheme,Java,C++来写。和几个朋友一起讨论结果是如果不是特别熟悉java和C++的话,用scheme来写最容易,分析原因如下,不用考虑data type,全是list直接扔进去就可以。不需要去管什么memory allocation(java也一样)所以不会有segfault。然后不容易有一些其他的奇怪的reference,include error。
不过想要真的去练习编程的话,还是去用Java和C++吧,毕竟真的工作环境里面用scheme的实在凤毛麟角。
这两个作业就是让你逐渐完善一个把MIPS Assembly language转换成MIPS二进制代码的assembler。逐渐加入功能:jr,jalr,add,sub,slt,sltu,beq等等。
第5,6,7相对容易一些,每一个应该不超过10小时可以搞定。相对都很独立的内容,让你熟悉DFA(Deterministic Finite Automation)以及WLPP这个坑爹的语言的(为了CS241开发出来折磨你的,介绍在这里https://www.student.cs.uwaterloo.ca/~cs241/wlpp/WLPP.html)
第8,9,10,11个作业,噩梦开始了。会给你一个WLPP language的reader,而你的任务是一步步的添加逻辑,让你的程序可以处理翻译越来越多的WLPP language (declaration, error checking以及许多其他的语法规则)每一个作业的时间基本都是10小时+,至于+多少,就看个人能力了。总之给大家的建议就是,提早开始,因为是要用marmoset做testing,所以最好是assignment post出来就开始做,以便有更多的testing token。
考试的方向,虽说这是一个hardcore programing course,但是不会考大段的code,反而是state machine会考的不少,然后就是零零散散贯穿整个course的各种概念了,背吧。。
–
CS 240 (preq CS 245 + CS 246)
理论课,重点在各种算法的实现方法以及运行效率(Runtime).
最开始会讲到big O notation(以及什么omega, theta等)这几个会贯穿整个course以及之后其他算法相关课程的概念。
之后会包括的算法,有一些Sorting的方法,然后就是Binary Search Trees以及其他的几种tree的一些相关算法。
Hashing也是一个重要的概念。还有如何利用一些data structure进行有效的search/sort.
看了看2012 Fall的notes,发现最后还包括了一个Compression的概念,快速扫过一遍发现是在讲关于如何去encoding text以用来做data transmission.
考试的话,基本离不开平时的作业,所以一定要注意搞懂平时的作业,否则基本就是个悲剧收场。。
另外就是240会有几个作业是有coding的(有的时候每个作业都有coding),相对来说不是很难,注意自己多做test就好了。
顺便提一句,面试中,大部分公司会问到的算法方面的问题,在240的课堂中都有所涉及,能多记住一些就记住一些吧。。不要考完了就直接跟我一样全扔给prof了。。。以后还要再捡起来,很悲催的。。(当然,除了Google,Amazon Facebook什么的可能会坑爹的让你面试的时候做dynamic programming这种层次的算法问题,但那些是大神的世界了。。恩。。。m( _ _ )m )
–
========================我去居然都3了!你确定你还要读CS?!=====================
CS 341 (preq CS 240 + CS 245 + Math 239)
简单一句话介绍,就是“这货是CS 240的升级版”。所以上过240以后你就能明白这货是什么个屌样了。。
不过。。。仍然是CS专业的必修,所以不用想太多,硬着头皮上吧。
既然是升级版,也就是说这又是一门关于算法的课。
此课仍然是各种围绕着Runtime来讲,只不过除了Runtime之外,关于算法的分析还加入了资源使用方面的计算(Spacing)。然后就是一大堆的算法。
Divide & Conquer, Master Theorem, Greedy Algorithm, Dynamic Programming,
然后个人觉得最蛋疼的部分就是和graph有关的一些算法,还有就是NP-Complete相关的东西
这个的考试跟240差不多。。概念的问答题,以及用上述那些算法来实际应用的大题结合。。
作业中仍然会有少部分coding 的问题,但是个人觉得比较坑爹的是,作业即使你写完了,也基本不知道对错。。(当然,大神除外,给跪。。)不过一般答案都是会发的,所以。。。多去要作业的标准答案吧,为了考试,恩恩。。
–
CS 343 (preq CS 350)
终于写到一个不是必修的课了。。但是提到这课各种哀伤啊。。LZ刚跟一群朋友上了(团灭了?)这门课,IA对于final的tag是,343 final真是一件忧伤的事情。。。
不管怎样吧。。还是来介绍一下。
此课的名为Concurrency,也就是多线程(multi-thread)运算,主要讲的是多线程同步处理和控制,以及管理多线程之间的通讯。此课的概念多如满天繁星,数量之大足够闪吓任何优质钛合金狗眼。。。所以概念方面我就不赘述了。。想要notes来参考一下的话可以自己google,或者懒得话可以找我要。此课使用的语言为大神级prof Peter Buhr亲自编写的uC++. uC++.是一个在C++基础上所编写的支持high-level concurrency的神奇的语言。
此课作业所占比重很大,认真对待。作业的顺序,最开始主要是让你习惯code之间是可以有跳跃性,而不是和管理一样第一行执行之后就一定要执行第二行,甚至一行code可以没有跑完就跳到另外的地方度个假逛两圈才再回来继续。而后面则是让你逐渐掌握去管理这种跳跃性的方法,如果利用这种功能来写code。主要难点在于如果同时有很多个线程在跑同一段code,访问同一块儿数据(critical section),那么会可能遇到什么样的问题,如何解决,并且怎样能够利用多线程的概念来提高程序运算的效率。
如果使用的教程是Peter Buhr编写的教程的话,那么作业应该没有多少变化,一共应该有6个作业,5个individual,1个是2人的group work。
关于用到的一些synchronization mechanism,分开说一下
semi-coroutine, full-coroutin的部分,弄明白怎么suspend(),怎么resume()基本就没问题了,。
而task的重点用某人的一个比喻就是,仿佛一个搬砖的小屌丝,当你把它创建出来之后,首先会按照他的constructor里面的东西初始化他有的数据,接着就会按着你在main里面写好的东西,勤勤恳恳的把所有的事儿干完,并且完全不需要别人指挥(你只需要告诉他去哪儿搬砖就行,不需要告诉他具体怎么来做)直到他被delete。
到了Lock,因为这个课程的preq是CS 350,而这个是CS350的第一个作业,所以。。详见CS350的解释吧。如果到了这里你已经忘了什么是lock了。。good luck。。哈哈
Monitor的特点即是同时只可能有一个线程运行Monitor中的member function,其他试图访问的都会被block住。并且注意一点的是,使用Monitor的时候,里面不要用其他的explicit Mutual Exclusion Mechanism,比如lock神马的,否则monitor会出现神奇的error而不work。
Administrator的特点是基本不会做任何实质性的工作,他的任务就是指挥task干活儿。
其实我觉得,没有上过 343的人读我上面的话会觉得云里雾里,而上过的人肯定一目了然的明白我在说什么而且觉得我在说废话。总的来说,这门课的coding的时间相对较大,每个作业的平均coding时间大概在20个小时吧。可是最后确实能够学到很多有用的概念和coding的方法。但是!这门课唯一坑爹的地方就在考试。。呼应一下开头,概念多的足够闪瞎任何钛合金狗眼,考试内容只有30%-40%和作业有关,纯粹从学习东西的角度来说这门课是很有用的,不过在乎GPA的。。慎选这门课吧不然的话。。。否则你上完了之后肯定会想说。。。
\
–
CS 348 (preq CS 240)
课名为Database,顾名思义就是讲解关于数据库的相关内容了。
会数据库的数据关系以及结构设计,还有就是SQL的使用(各种select,when,join, where, from, group by, order by等等)
作业包含用ER diagram设计数据库结构,并且按照要求设计需要的database table, attributes等;coding部分,包括按要求写出一些query来,从某个特定的数据库中提取符合某些条件的数据(比如从一个学校的老师,课程,学生编号,时间表相关的数据库中,选出来在周一教过课的prof的名字,编号,部门等)
另外就是用C/C++来编写embedded SQL。
最后一个部分是关于数据库安全方面的。比如如何更新数据库会保证所需要的更新都会反映到数据库中去,以及如果数据库出现crash,怎样能够最大程度的将原来的数据以及更新recover回来。
一般4个作业,第一个和第四个是手写的,第二个和第三个是coding相关。每个作业的时间大概在10小时左右吧,要求的时间并不是特别的多。
考试内容和作业关系较紧密,但同时notes中的概念也是必不可少的。复习难易程度 属于manageable的范畴,slides虽然较多但是每一章之内的内容联系相对较紧密。应用范围也较为广泛。
不过好一点的。。就是作业虽然做的云里雾里,不过就几个term的尿性来看,作业的给分还是不错的。。
看到这里你是不是想说
那你就真的是图样图森破了。。。。因为这课考试的给分一般都很坑爹。。。。。
–
CS 350 (preq CS 240 + CS241 + CS 246 + CS 251 )
其实看着这作为CS必修课中,众所周知的最难的一门课的时候。。。我的心里是这样的。。
然后对于已经上过了的各位。。。在没上之前心里面多少还是有些忐忑的吧。。。
不过上过之后相信大部分都会觉得这课不过也就是。。。
好了废话不多说开始正文:
–
350学期开始介绍的是程序,或者说简单一点,就一段code,是怎么在系统里面跑起来的。不过这里的code不是我们平时写的C,C++,而是系统最底层的assembly,是码农们能够看懂的最底层的语言,再下面就真的是0和1了。。。说高级一点,就是现在的系统,能够在一两个CPU,不到10个内核上面同时跑几百个线程,到底是怎么办到的。当然,这里也就正式开始介绍进程(process)和线程(thread)的概念了。这部分的知识非常重要,不仅是你后面做作业的基础,一些面试官也会问这里讲过的知识(true story)。当然,还会介绍系统里面一些用来指挥进线程协调工作(synchronization)的实现方法和算法。之后就是作为操作系统,如何向运行在系统上面的应用程序提供支持,比如打开,读取,写入文件什么的,还有系统对内存和虚拟内存的管理。最关键的是,不管上层的程序写的有多烂,操作系统本身必须不能在任何情况下hold不住,crash掉。。。测试你系统抗造能力也是作业之一,测试项目非常惨绝人寰。。。midterm内容就到此为止了,当然还有所有的作业所需要的知识。下半学期都是各种细节性的概念还有算法,比如怎么样管理硬盘空间是高效的,计算机网络的基本原理。这些知识分别为各种4开头的课程进行铺垫。
简单的说一下作业(具体请看后面的大神日志)
第一个作业基本属于打酱油级别的。是让你熟悉synchronization的简单机制。(lock)作业是让你模拟一个猫和老鼠吃东西的程序。要求是猫和老鼠不能同时吃东西,而同种族之间可以同时吃东西。概念就这么简单。5小时左右基本可以搞定,此作业为individual work。
第2,3个作业就开始就是分组了。350的小组为3人一组,强烈建议开始coding之前要统一好code的source control问题。学校提供的cvs应用起来比较繁琐,但是使用的当的话会比传统的copy paste省事很多。
第二个作业的内容是实现一些基本的system call,如open, close, read, write, fork, getpid, waitpid,exit, execv.工作量来说,最好全组统一好具体使用的数据结构,细节定下来之后再开始分工开始写。工作量来说的话,一个人可以去具体实现数据结构的各个功能,一个人可以来搞定fork,waitpid,getpid等,最后一个人搞定剩下其他syscall,然后debug的时候大家一起来,以便所有人都对code有一个比较全面的了解。理论上来说这是还算合理的分配方式了。相比第三个作业来说,第二个相对轻松,平均每个人20-30个小时可以搞定。
第三个作业的内容是实现内存管理的功能。物理内存和虚拟内存的协调,还有提高内存使用效率,和程序使用内存的方法等等的。
这个作业相对难度会较大。具体细节请参考后面大神们的日志。时间分配来说,30小时+应该还是有的,所以请准备好充足的时间。
–
CS 349(preq CS240 + CS 246)
用户界面的设计,包括如何安排图形界面来方便用户的使用。最关键的思想就是用户可以不看说明书,或者说不主动去找说明书看,就能在你的程序上找到所有他们需要的功能。还介绍了一些在设计用户界面和包含用户界面的程序的时候需要的一些基本的概念,比如MVC(Model-View-Control)。作业使用X11,C++ , Java, Android SDK完成,都是设计制作带有图形界面的程序,非常耗时。每学期有5个左右作业。考试考的都是上课和slides中提到的概念,作业纯编程,使用很少的课堂知识,时间来说,粗略估算每一个需要的coding时间为20小时+,时间紧迫,请慎重安排作业时间(比如你同一学期还选了CS 350,那结果很有可能是24k纯跪啊。。)
另外此课给分比较坑爹。。。重视平均分的同学慎选。
当然,听说过的高分飘过这课的大神不在少数,毕竟对于大神。。这个课嘛。。人家只会说:
–
CS 370 (preq MATH138 + MATH136 + CS251)
@丁柏宇Anakin(247575564)
等等。。为什么一个CS的课给我蹦出来了MATH的preq。。。。
答案很简单。。因为这课尼玛特么很大程度都是数学啊。。。名字就直接出卖了他好么。。Numerical Computation啊。。
不过。。引用某大神的话。。”在CS的课里面算是比较水的一门课,其分数之好拿是大部分数学比较好的共识。只要是数学没问题的,这门课准是拉高平均分的课。”
此课的内容包括Floating Point System, Computation Error, Splines, FFT, Google page ranks。这门课的大部分情况都是开卷考试,因为公式繁多,公式的变化也是极致,所以不管是midterm还是final,大家尽可能的把necessary公式写在一张A4纸上,有助于提高考试速度。本门另外水份含量高的地方在于assignment,每份作业基本都是combination of 前几个term的题目,比方说那个用matlab画手的题目,还有那个matlab版本的白痴angrybird。
以下为anakin大神为此课进行的内容总结,大家来膜拜一下:
–
1.Numerical Computation
这个章节没什么就是在说computer是以怎么形式存取,读写,运算我们的输入的数字。首先介绍Floating Point System(FPS)再来就是FP在运算时所产生的error。避免error的发生我们如何用各种不同的roundoff 或是machine eplison去解决,它产生的error stability 又是如何。
–
2.Interpolation
本人觉得最好玩的一章,其实总的说就是在坐标轴上给你几点怎么找best fit refined curve。但是好玩归好玩,interpolation有很多不同的form:Polynomial Interpolation, Monomial Representation, Lagrange Form, Newton Representation, Piecewise Polynomial Interpolation, Piecewise Cubic Hermit Interpolation, Cubic Spline, Parametric Curves, Bezier Curves。 其中Piecewise Polynomial Interpolation 和 Cubic Spline是这所有里面的重点中的重点。
–
3.Ordinary Differential Equation(ODE)
这个那就比方说给了你一个只有一个independent variable t的微分方程(differential equation), 怎么找到unknown function y(t)。我们CS370最主要讲的是first degree 和 second degree ODE。再来就是讲复杂一点的方法比方说Forward/Backward Euler Method, Trapezoidal & Imporved Euler 还有怎么用Taylor’s expansion算出对应的Global & Local Truncation Error. 后面这些比较复杂的部分最主要是在运算作简化的时候比较恶心,单是一旦掌握规律其实不难。在补充以下,还有一个叫Runge-kutta method的东西。
–
4.Fast Fourier Transform
这章节极度极度恶心,各种的死记硬背。一开始会有铺垫的无理数(irrational Number)运算的复习。在FFT里面root of unity(w)是提高运算的关键,请必须彻底了解。之后会有DTF 的 IDTF的运算。IDTF: {F0,…,Fn} -> {f0,…,fn}。 DTF: {f0,…,fn}->{F0,…,Fn}。有上课的就知道我在写什么了,最主要我在上课的时候经常把IDTF 和 DTF记反
–
5.Google Page Range
这张的这几个东西搞清楚就行了Gaussian Elimination, LU factorization, pivoting, norms
–
好了以上为大神总结。。。实话说。。对自己数学没啥信心的。。。或者对matlab没啥兴趣的。。或者不知道matlab能不能吃的。。慎选这门课。。。否则你可能就跟我当初上这门课上的一样悲剧。。别怪我没提醒你。。
===========================卧槽卧槽卧槽?!你居然坚挺到4开头的了?!============
CS 445 (preq CS350)
CS的 Software Engineering Option和Software Engineer专业的必修课。
主要讲的是在详细设计和开发软件、系统之前如何制定设计细节,并证明设计可行性。不过上课实际讲的都是Bi-directional Word Processor(比如中文英语都是从左向右,阿拉伯语从右向左)和Unicode在处理Bi-Directional Text时候的算法。作业一学期有5个,分5步来给一个现存的软件系统写一份User Manual和System Specification,包括Sequence Diagram, Class Diagram, Use Case Scenario等等。4人小组,速度快的话可以一晚上搞定。另外建议学的同学稍微复习一下CS 245学的东西。
–
特别注意:如果不是SE Option或者SE的同学,不推荐此课,感觉很没有组织,上了一学期都不知道重点在哪。考试考上课讲过的概念,可以背slides通过考试,但是很烦。没有midterm。
然后这个课基本上都是由两个prof来轮流讲的,一个名为Richard Trefler,此人也教CS245等课,教学质量还不错。不过重点在于另外一位prof。。。Daniel Berry,人称Dan。。。由于他的听力有一些问题,所以导致他的口音异常的含糊不清。。也就导致了虽然讲课的时候很有激情(喜欢突然拍一下桌子神马的,或者突然爆出来一个笑点有点奇怪的joke)但是却仍然让你听的云里雾里。。。。而上面说了,考试还会考上课讲的东西。。。。然后。。就没有然后了。。。。
–
CS 446 (preq CS350)
CS的 Software Engineering Option和Software Engineer专业的必修课。
软件系统的具体制作和规划,如何设计系统的subsystem和class才能便于后期开发和以后的维护管理。上课讲的是各种软件设计方法,各种设计pattern。还有一个软件系统的各种功能应该如何分配到一个个subsystem和class里面。作业一学期交3份,实际是分3步来设计一套软件系统。第一步是subsystem和粗略的class规划,第二步是详细的class规划和class间的联系,第三部就是成品软件了。
可以开发iOS, Android移动软件,也可以开发用于windows,mac的桌面软件,甚至web app。4人一组,最后几节课每组都要做简短的presentation来介绍自己组的成果。midterm和final可以背slides通过。考的都是各种设计理论。
有远大志向的码农们的必修课。
什么?你是个没远大志向的码农?那你看这篇充满忧伤的文章干什么。。。
此课程的资料是通过eLearn来发放的。
–
CS 447 (preq CS350)
CS的 Software Engineering Option和Software Engineer专业的必修课。
关于软件测试等方面的课,LZ下个学期(2013 Winter)会和10多个战友一起奋战此门课,到时候补上简介。
–
CS 452 (preq CS350)
传说中的小火车。。。和CS444/CS488共称UW的CS课程中的三大。。。并且这是公认的三大之中最难的一门。。不过目前来说木有找到上过的前辈们留下来的墨宝。。。
不过LZ下个学期(2013 Winter)也会和10多个战友一起奋斗此门课。。到时候补上简介。。
–
(Edited on Apr. 10, 2013)CS452的总结请参见这里
CS 454 (preq CS350)
分布式计算和计算机系统(听着很装B吧。就是Distributed System)
讲的是现在非常热火的云系统的概念和实现的具体办法,包括远程过程调用(RPC),分布式文件系统等等,还有分布式系统内部的同步。比如判断在两台电脑上发生的事件,谁先谁后的问题(一台电脑上你可以记录发生的时间,但不见得两台电脑的时钟是完全同步的,所以两台电脑的话你没法通过本地时间来判断事件先后);还有对共享资源访问的控制,比如整个网络里面同时只能有1个系统做某件事,那么如何实现;Dropbox这样的软件如果需要在云网络上传输,备份用户的文件,文件系统要怎么设计。
一学期有3个作业,第一个纯笔答,各种概念简答题,第二个是简单的两台电脑之间通讯,第三个是写一个RPC库,在一台电脑上可以调用运行在另一台电脑上面的函数,或者方法。对云系统有兴趣的同学可以上,作业使用C/C++完成,第2,3个作业两人小组。
考试和大部分的CS课一样,纯粹通过背slides来破。分高不高就看你背功如何了。。
–
CS 456 (preq CS350)
计算机网络(networks)。
基础的计算机网络原理,非常底层的概念和细节。如果有同学知道计算机网络实际上分为7层的话,456主讲1,2,3,4层使用的通讯方法和各种协议。很详细的讲了第4层的TCP, UDP,还有路由的原理。还讲了一些常用的网络服务,比如DHCP,DNS等等,这部分有一些和454重叠的内容。一学期有两个作业和一个lab(不过貌似2012 Spring Term又没有lab了)。第一个作业是写一个模拟TCP传输的sender和Receiver,第二个是写一个模拟路由器用来发现网络上其他路由器的位置和前往路径的方法。(就是比如你家的路由器要发送数据包到学校服务器的话,这个数据包下一步该交给谁),作业使用JAVA完成,以前是两人小组,现在貌似是solo了
–
CS 458 (preq CS350)
计算机安全(Computer Security and Privacy)
开始的时候讲的是各种计算机安全漏洞的类型和概念,后面是比较抽象的安全理论了,比如一些确保信息安全的policy,为了保证数据安全,用户权限需要怎么分配。在设计系统安全保障的时候应该注意的一些概念,还有如何保障用户的隐私。一学期有4个作业,
第一个是利用linux下一个软件的漏洞来获取系统root权限(比如通过buffer overflow)
第二个是通过一个网站的漏洞来获取本来不应该被泄露的数据,比如用户资料,密码什么的,或者达到一些用户权限之外的事情。
第三个是RSA和其他Math-based Security,简答题。
第四个是有关用户数据保密和隐私的东西。(k-anonymity)
基本上每个作业都是coding题和简答题对半。考试考的都是上课和slides上面讲的概念和知识。
作业难度属于manageable的程度。第一个作业相对难度不小,一定要会用gdb来debug。否则这个作业15+小时可能就出去了。
后面的3个作业难度相对ok,10个小时左右应该都可以搞定
–
CS 466 (preq CS341)
@朱剑Jayson(264410843)
突然出现一个CS 341为preq的课。。有木有突然看的精神一振。。。?
木有错。。这个课就是CS341的进阶版,又是一个hardcore的算法课是也。。。
课本:与CS341同一课本《Introduction to Algorithms(算法导论)》我就说他是341的进阶版吧。。。
再PS. 跟MIT一个课本,很NB有木有
课程主要内容:
- Amortized cost analysis:计算算法平均每个步骤cost的分析方式
- Randomized Algorithm:随机算法,算法结果有很高的几率是正确的,也可能错误,但总体时间(runtime)好,效率高
- Approximation Algorithm:近似算法,算法结果近似于要求结果。
- Online Algorithm:线上算法,与以往算法知道全部数据不同,线上算法的处理方式是随着数据逐步输入而进行的算法,CS350中Paging的步骤就是一种线上算法的实例,你并不知道下一个需要的page是哪一页。
不同之处:
算法的要求不同,466课中讲到的算法并不像341或者240中的算法一定会得到想要的结果,更多的是为了节约时间甚至空间而放弃了结果的准确性。例如,在341中的一些NP-Complete问题在466中可以用polynomial time解决,但结果可能是近似的。
作业与考试重点的不同:466的作业和考试更着重于“分析”比如,随机算法中会有的期望值,因为随机的原因,算法的运行时间(runtime)并不是固定的,所以对算法运行时间的评估使用worst case并不合理,而是用expected time。近似算法中,对近似值的求证之类。
适合学生:
CS466的理论性比较强,一般CS公司面试并不会到达这么深的程度(Google之类的变态除外),适合数学和逻辑比较好的学生,同学可以在466之前尝试CS360,365,370,371之类的数学性比较强的课程。CO的同学应该觉得466压力不大。
对算法有兴趣,以及想念Master甚至PhD的同学可以尝试,非常欢乐。 。。
否则的话。。。退散吧。。这课不适合我等平民。。
CS 486 (preq CS341)
@丁柏宇Anakin(247575564)
此门课名为Introduction to Artificial Intelligence, 也就是传说中的AI,主要是讲怎么让machine think and act rationally(不一定让machine做的对的或人性化的,但是machine必须要perform合理化)。此刻刚开始真的很爽很开心,各种高科技的抽象概念和想象,到后来开始讲的东西都是CS341的延伸。最主要是课的后面2/3是machine learning,其实说白了就是stat, 你要是2xx统计学得不好推荐还是不要冒险拿这门课,因为你会死在考试上面。
这门课的assignment依不同的prof情况不同(我的是machine learning的prof:Pascal Poupart),4份assginments,给我的感觉都不难,大部分都是code和writing的combination 可以自由选择任何语言(C, C++, JAVA, Matlab, etc)。一般老师会推荐你matlab因为matlab的matrix performance比较方便,而且有些图片是一定要用matlab画的。我的话是用C++写完,output拿到matlab里面去process图片,当然这都取决于你自己。
这门课要说的一点是如果你的prof是Chrysanne Di Marco 恭喜你!CS486将会变成灰常简单。
接下来就是来分析这么课的构造:
第一部分是searching algorithm,其实很多东西都是在cs341见过的只不过变了个形式。在AI的searching里面你要想象成在finite-state machine(FSM)里面做search一样,每个state都代表一个result of an action。而什么样的state和什么样的action是你想要search on的。Search 大概分两种Uninformed search 和 Informed Search。还有一种叫Local search不晓得规哪一类。概念不少,都很重要。其中Constraint Satisfaction Problem(CSP)是个很重要的application。
第二部分是basic statistics review and basic Bayesian Networks and Decision Networks。到第二部分结束为止都不算难,这部分最主要是帮你复习stat,之后是把简单的文字叙述变成Baysian Network,之后是在Baysian Network的基础上make a query然后建造相对应的Decision Network最后make 简单的decision。其中Baysian Network的conversion 是比较难得部分,应该会有assignment的操练。Decision Network的原理就是在Baysian Network的基础上加上decision node 然后进行event probability 或是expected result 的运算。
第三部分是整个course后半部的重头,讲的是Statistical learning的network包括Markov Decision Process,Decision Tree learning,Conditional Random Field,First Order Logic,Markov Logic Network,and so on。这部分我只能语重心长的说good luck..太太太难了..大部分都是理论所以可想而知考试你会死多惨..
这门课在写code方面很好玩,但是考试真心恶心。比重大概是assignment40%,midterm20%,final40%,所以作业比重大请不要忽略。为了造福人民我决定贡献一下我和Andreas Lin同学做的final review 总结:http://db.tt/o153tc7w
CS 488 (preq CS341 + CS350 + CS370)
@刘博(251980561)
CS三大之二的Introduction to Computer Graphics 先说难度:这门课的难度应该是仅次于小火车(real-time CS452)的,所以如果打算学的话,建议那个学期只上3门或者4门课。一定不要跟小火车或者CS444一起上。真的,不要轻敌。而且这门课对数学的要求还是比较高的,尤其是线性代数和解析几何,所以如果数学基础不够扎实的话,可能要花更多的时间在上面。
这门课特别适合对游戏设计感兴趣的同学们。课上会讲各种建模的方法,如何变换视角,如何把3D场景投影到屏幕上,如何做物体的浓淡处理,如何把隐藏面消除,如何反锯齿,如何实现阴影、反光、半透明等等。内容相当丰富。
课上还会讲光线跟踪,这个技术可以用来制作3D动画片,靠跟踪眼睛的实现来渲染。虽然渲染比较慢,但是出来的图像效果很真实。还有更高端的光子映射和散焦一类的。
这门课的作业是两周一次。第一次是让熟悉一下OpenGL。第二次了解一下绘图管线,就是各种图形向量和矩阵的变幻。第三次是建模。第四次光线跟踪。每学期的作业几乎没什么变化,所以有兴趣的话可以去课程网站上先了解一下。作业涉及到的是课程前半段的内容,那后半段呢?当然是项目啦。项目的内容是自己选随便选的,可以是游戏,也可以是光线追踪,也可以是个建模工具一类的。给个忠告啊,不要把项目搞的太复杂,否则会死得很惨。
—-488的介绍都不是我写的真的不是我写的—
顺便吐槽一句。。这课真心很难。。执笔写此门课的童鞋是我们周围公认的大神,他都说不要掉以轻心神马的。。那就是很难的意思了- -看不起他的话。。最后你肯定会。。
11 comments
Leave a Reply Cancel reply
This site uses Akismet to reduce spam. Learn how your comment data is processed.
Recent Comments
- Franny on 留言板
- jerry on UWaterloo的CS课程介绍,一篇充斥着淡淡忧伤的总结…..ˋ(╯ω╰)ˊ
- 上官小天 on UWaterloo的CS课程介绍,一篇充斥着淡淡忧伤的总结…..ˋ(╯ω╰)ˊ
- tooyoungtoosimple on UWaterloo的CS课程介绍,一篇充斥着淡淡忧伤的总结…..ˋ(╯ω╰)ˊ
- 上官小天 on UWaterloo的CS课程介绍,一篇充斥着淡淡忧伤的总结…..ˋ(╯ω╰)ˊ
想请教一下LZ,我正在做cs350的第二次作业,感觉很抽象,有点不知所措,有什么建议吗?
system call这部分的确开始的时候不知所措。首先要搞清楚system call都有什么,都要干什么。建议从open, close, read, write开始,也要看看现有的syscall是如何办到的
问题: 现有的system call只有reboot可以看,所以感觉没有什么有效的提示。不知道用什么function写open,close,write。
PS:我已经写出了write to console,和pass arguments.
谢谢楼主!!
其实OS161已经有打开,关闭和读写文件的功能了。所谓open, close这些syscall要做的只是对file descriptor的管理,和调用系统中相关vfs函数而已。管理每个thread已经打开的文件的fd和实际的vnode的对应关系。研究一下include/vfs.h就明白了
lz 上完real-time 了吗 咋样啊
现在还在上。。。。工作量的确不小,不过也学到了很多跟kernel底层开发有关的东西
lz 不是winter上吗
现在不就是winter么。。。。
我2了
呵呵
楼主上的怎么样 real-time