前言
虽然可能来得有点晚,但CS大三的选课攻略终于完成了一大半。由于篇幅太多所以不得不分成多次推送,今天算是第一篇,以后也会有总集篇。我作为主笔和统筹结合自己的经历写了一小半的课程,有些顾及不到的则邀请了一些信得过的伙伴一起写,力求覆盖到全部课程。以下小伙伴是要着重感谢的:
Ajax/Gloria/伊恩/Peter/Richard/...... (排名不分先后)
为这篇文章贡献了许多宝贵的时间和精力!
其他要说的:CS系大三课程的多样性可谓是四年之最,丰富的选择与搭配往往让很多人无从下手,更不要说哪怕选了也不知道课程具体讲了些什么,所以作为上过这些课的人,我们希望能尽可能详细地介绍一下这些课程,而不是蜻蜓点水一般地略过,与此同时也尽量保证覆盖得尽量全面。我们会尽量避免一些主观判断例如“这门课很水/不用听课自学就好了”之类的建议。
CSC318
CSC318是CS系中为数不多介绍UI/UX(交互页面与交互逻辑)的专业课。CSC318会从产品的角度先教你如何做合理的research和review,具体包括如何最客观的找文献,做survey的各种不同方式 。之后会教如何设计一个正确的产品模型,以及该对产品的usability做哪些测试,并根据所学的知识分析一些主流产品设计上的优劣。最后才会正式教一些比较浅显的设计理论,具体包含颜色选择、排版、字体选择和logo设计。
刚学完CSC309中的HTML + CSS部分,很多人都会用现有的知识本能地写出惨不忍睹的网页......
课程没有考试,取而代之的是3个10%的设计相关的作业和一个贯穿整个学期47%的四人合作project。虽然不用像很多CS课那样熬夜赶代码,或者在考前疯狂复习,但CSC318依然要求你每周抽出个把小时来巩固内容,并跟着节奏完成相应的作业。
Project一共分成10个phase并占了总成绩的47%,每周都有活要做,请务必不要掉队!
CSC324
感谢Peter提供的情报!
CSC324是一门讲述Function programming和思维方式的课程,用一种不同于所有大一大二课程的编程范式去解决一些现实问题。
课程主要教Racket和Haskell这两种Functional Programming Language的用法和特性。从基础的lambda使用方法,到higher order functions,再到Macro和backtracking等高级技巧,你能感受到与之前OOP完全不一样的问题解决思路。Functional programming的精华在于不改变变量的值,然后用递归解决问题。根据教授的偏好可能会额外学习Prolog语言——一种常用于根据数据之间的关系给出答案的Logical Programming Language。
铺天盖地的括号可能是很多人对racket的第一印象,其实教授也常在课上花大把时间debug哪里少加了个括号导致compile不起来……
这门课程适合任何想写干净的代码的人(这大概是所有人吧)。
p.s. David Liu有一份写得很详细的Notes。
CSC343
CSC343是CS系入门的database入门课程。首先会教你relational algebra和relational database的基础概念,让你理解如何用数学公式和符号表达错综复杂的关系,以及一些概念,比如project和natural join,之后便上手SQL语言了!
相信各位都听说过这个梗,现在你们可以试试了。
SQL总体分成Data manipulation language(即给你一个已有的数据库,让你从中找出你想要的数据)和data definition language(即让你设立一些规则并自己搭建数据库)。之后会教你如何把SQL运用在java里,毕竟在生产环境中SQL往往是需要和其他语言混合使用。
每年的sql作业都会成为无数人的梦魇,给的数据过于简单,而要求提取出的数据又无比刁钻,还要考虑各种corner case。
SQL学完后会从更宏观角度教你如何设计一个合理的database,以及一些优化database的规则如。最后则是教你如何把现实生活中的情景通过E/R diagram表示,并最终转换成relational algebra,方便用数据库处理。
学完CSC343会让你对SQL和写query有个清晰的认识,但离真正的生产环境还有一定差距,比如我们可能依旧不知道该怎么部署一个MySQL数据库,所以各位不妨自己setup一个数据库好好练练手,也可以选择在偏应用的软件开发课(比如CSC301)中好好练习。
CSC 369
感谢Peter提供的情报!
CSC369是关于操作系统的入门课程,也是CS specialist最后一门必修的编程课。课程最开始会延续CSC209的process概念,并引入thread的概念。理解了thread和process的异同后便开始讨论操作系统中一大重要问题 ——Synchronization,如何保证不同线程进程同时读写同一块数据的时候保持数据的一致性,围绕这个问题提出了多种不同的解法如locks、semaphore和monitor。下一个重点则是scheduling,如何对不同进程做schedule好让它们以最合理高效的状态不断运行,具体则会推荐不同策略,如 SJF,roundrobin等用于不同的情况。Scheduling之后会讨论memory management并介绍虚拟内存(virtual memory)的概念,而将物理内存映射到虚拟内存的过程中,又会产生空间利用效率不高相互此案fragment的问题,所以会引入page和frame作为解决方案。在此基础上我们会学习各种不同情况下Address translation和不同的切换page的策略,如LRU和second chance等。
Final常见题型,通过已知的page table格式和其他信息最终推理出在特定虚拟内存地址的data内容。
最后的大头是file system——通过一些巧妙的设计和数据结构以用最小的空间在硬盘中储存尽量多的数据和一些metadata。课程还会介绍及讨论一些常用的方法如soft, hard link还有则是针对hard drive的scheduling。
建议考试要自己做aid-sheet,因为考试时间并没有充裕到能慢慢翻别人的aid-sheet。课程主要难度在几个作业上,这几个作业非常难以debug(第一个是内核模式下的,最后一个的代码量很大),记得留出足够的时间去debug,最好是在写代码之前先计划好要写什么)。
Aid sheet不能用放大镜,好在我们视力还不错。
CSC384
CSC384是CS系人工智能的入门课程。最开始课程会从search开始教你各种不同的方法,主要分为uninformed search和heuristic search两大类。Search结束后会教你用CSP(Constraint Satisfaction Problems)的思想去解构诸如数独等问题,并带你使用许多让解题更高效的技巧,诸如forward search和gac(generic arc consistency)等。之后则会以象棋等双人零和游戏为背景,引入game tree search和一些技巧,比如alpha-beta pruning。
第一个作业是以heuristicsearch为基础设计一套能解出不同推箱子场景的算法,虽然写到后面多半成了玄学。
随后CSC384会从更宏观的角度出发,通过probability和bayesian networks来计算一系列事件往不同方向发展的可能性,以及不同事件的相互关联性等。下一个大头则是knowledge representation,即如何把人类所谓的知识转换成机器能够处理的形式,发掘出很多事实背后的逻辑并做一定的分类、推导还有一些对应的证明。
每次一遇到bayesian network的题目总会引发BA lab里一群刷题的人的激烈讨论,在不断的论证与推翻中最终得到一个大家都认可的答案,可能这就是我们逝去的青春。
很多人听着Artificial intelligence的名字慕名而来,上完CSC384后却不免有些失望,毕竟大部分内容听上去都和Artificial Intelligence没什么关系。当然如果翻出大部分AI相关的课本,我们所学的内容都是基础且必要的,只是如何将课程设计的更实用还需要faculty多多考虑。
后记
怎么才五篇?自然会发更多的!请各位稍安勿躁。许多课程的文章已经处在收尾阶段了,近期就会与大家见面。另外如果对选课有什么疑问或者意见,欢迎私聊UT助手,那么我们下期再见。
下期再见!
文字/皮卡丘&Peter
编辑/皮卡丘
校对/半弦&z赢