# 西浦Y3课程

我校ics的课程涵盖还是比较标准的，基本的计算机核心课都有了，申请研究生肯定是足够的。但是如果是希望自己能够从事一些开发工作或者是科研访学，这些课程是远远不够的，可以说如果仅仅学课内课程的话什么活也干不了（非常抽象），更别说有些课的质量实在是一言难尽。这篇会分享ics基本的核心课信息+一点网课推荐。作者是20级的，所以是根据20级的课设和lecturer写的，后续有可能会做出调整，但大体不会改变。

## Y3-S1

#### CAN201 Introduction to Networking

Delivered by: Dr. Fei Chen and Dr. Enjun Fan

Programming Language: Python

Workload：★★★☆☆ (3/5) 课程收获: ★★★★☆ (4/5)

这门课在20级之前应该都是Fei Chen一个人带的，19级的cw据说很难，给了一个diy的protocol然后手搓C/S，我校为数不多的还可以的coding exercise，评分标准是按传输文件的速度，完全符合正态分布，被卷成麻花，report基本不看，后来据说惨遭投诉课程难度下降(cw难度被腰斩了)。分数结构上cw的占比很高(40%)，和期末(45%)差不多。有百分之15是lab课白送的，基本只要上了lab就能拿满。学期初还说要考勤，搞得人心惶惶的，结果每节课都有录播，不用去lab，看完录播课提交每周的assignment就可以拿满15分。在期中之前的lecture是Fei Chen讲的，后半学期则是Wenjun Fan。

课程结构直接是照抄的[Computer Networking: A Top-Down Approach](https://gaia.cs.umass.edu/kurose_ross/index.php)。非常经典的计算机网络课程，进度非常快，讲课进度和umass官方提供的视频课程差不多，个人感觉跟着这个进度是吃不透这门课的。如果想找替代课程的同学，推荐观看[中科大计算机网络](https://www.bilibili.com/video/BV1JV411t7ow/)。课程时长比较恐怖，2小时只讲我校一半lecture的东西，不做多赘述，自行观看。 有关cw：20届的cw变成了groupwork，并且分为了两个part，每个part判分分为code和report两个部分。Pt.1是阉割版本的19cw，给定了protocol和server文件，只要求完成对应的client文件，难度急剧下降。Pt.2是实现根据OpenFlow protocol的SDN重定向流量，还是比较有意思的，虽然实现功能只要在OPF1.3的基础上多加几行代码，但是要看懂SDN控制器的工作流程需要花一点时间，作者猛看OFP文档才找到了对应的API，最抽象的是下一节lab直接把答案需要使用的API讲出来了。由于难度被阉割，所以每一组的判分不会很悬殊，甚至变成了report大赛。

#### CPT 203 Software Engineering

Delivered by: Soon Phei Tin

Programming Language: Java

Workload：★☆☆☆☆ (1/5) 课程收获: ★☆☆☆☆ (1/5)

这门课可能会让很多同学失望的一门课，非常非常非常traditional的SE课程，PPT都快包浆了，课程也很无聊，作者只上了第一节lecture就再也没有去过了。同许多老旧软件工程课一样强调各种类图、文档设计、测试，大部分都是概念类的知识，猛猛背书就完事了。

Lecture讲课昏昏欲睡，感觉水平也不是很好，没有学到practical的东西。唯二涉及到一定代码的可能是高内聚低耦合部分会讲一点java代码的类设计还有是junit test。（很少）要拿分重中之中是时序图，类图，活动图，类图等图的设计和绘画，建议自己多使用visual paradigm等软件或者手画一下，期末时候占比很重。 两个Assessment也是纯文字的选择，很水很水，而且答案玄学。 希望这门课能早点改掉吧，能学到东西的部分真的很少。

#### CPT 205 Computer Graphics

Delivered by: Yong Yue

Programming Language: C++

Workload：★★★☆☆ (3/5) （如果很卷的话 cwworkload可以做的很大） 课程收获: ★★★☆☆ (3/5)

这一门课和DB是俩门选修课，二选一，如果想走游戏引擎或者游戏客户端开发的同学可以选这门课。(然而并没有什么很大用处) 岳老板常年沉淀过的课，对于图形学的intro课来说，理论内容应该算是面面俱到：从一开始的基础线性代数，变换矩阵，渲染管线，建模（这一部分感觉有的知识比较多余），光照和材质，纹理映射等。理论内容还是很多的。PPT依旧包浆，像Ray tracing之类的知识没有涉及到。岳老板可能年纪大了，lecture都感觉一直在念ppt，昏昏欲睡。Lab给的sample code还是挺有用的，值得看看，对完成两个coursework很有帮助。Lec内容和Lab内容可能有点割裂，lec纯理论，结尾时候会讲解几个OpenGL的API，lab的话就是给了基于OpenGL的samplecode，去看一些理论的简单运用。

Coursework：两个，一个是2D，一个是3D。两个都是基于OpenGL的，两个都是基于Freeglut库的，应该只能使用STL和freeglut俩Cpp的库，不给使用多余的库。第一个cw公布的时间在前半学期，能用到的知识比较少，基本只有画一些基本图形和几何变化，可以做的很卷，美工大赛。第二个3d作业也是用openGL搭建场景，可以运用到光照，纹理映射的知识了。有认识的同学做的很卷很卷。很像美术创意大赛，做的好看应该分数就不错。个人觉得有点不太合理 如果想要自己深入学习图形学的同学，可以先看看闫神的[GAMES101](https://www.bilibili.com/video/BV1X7411F744/?spm_id_from=333.337.search-card.all.click\&vd_source=27a7dfe7f23984062616fef51dbba7fa)（*GAMES系列的课质量真不错哇，喜欢图形学游戏引擎的同学可以多看看，做做cw，网上有很多做完的作业，如果手搓完GAMES101的作业应该会对图形学有更深的理解，作者是懒狗，很后悔没写*），然后再来看这门课。如果只是想要学习一下OpenGL的同学，可以直接看看[LearnOpenGL](https://learnopengl-cn.github.io)

#### INT 201 Decision Computation and Language

Delivered by: Yushi Li

Programming Language: 无

Workload：★★☆☆☆ (2/5) 课程收获: ★★☆☆☆ (2/5)

讲得不咋滴，印象很深的是有一个TTL给的答案画生成树要先把CFL换成Chomsky范式，但是也没有人讲这个，还是和同学在讨论中发现的。也没有公布两个cw的评分细则，包括期末的回答题目的格式。[哈工大的形式语言与自动机](https://www.bilibili.com/video/BV1oE4116794/?spm_id_from=333.337.search-card.all.click)可以完美替代这门课的内容，只要看下每周TTL的答题格式就好了。不过个人认为如果因为格式扣分是真\*\*，别的方法就能算我错？油管上有一门MIT的类似课程讲得也很好,可以自行搜寻。

## Y3-S2

下学期内容是后面由其他几位同学补充的，所以受主观因素影响，可能和之前的内容的评价标准不完全一致；行文上也会有差别。

#### INT202 Complexity of Algorithms

Delivered by: Rui Yang and Chunchuan Lyu

Programming Language: 无

Workload：★★☆☆☆ (2/5) 课程收获: ★★☆☆☆ (2/5)

INT202是一门算法课，感觉是大二那门算法课INT102的进阶版，主要涉及到了一些重要的算法，数据结构和它们的时间复杂度分析。这门课一共有两个quiz和一个Final Exam，两个quiz很考验反应能力，这两年都是7道题，一共有10个空，15min的时间完成考试。每个题目计算量不是很大，只要掌握算法的关键步骤就行，全部都是填空题。期末考试可以带一张help sheet去，可以打印也可以手写，看个人喜好吧。博主当时是将每课的重要算法（核心思想，步骤，时间复杂度等）整理出来，一面4页，拼接在一起打印过去的。

这门课一共有两个老师，上半学期是杨瑞老师，个人觉着杨瑞老师讲的很好，算法讲的很清楚，他的课我是全部有去听的。下半学期是吕纯川老师，我觉得他连自己在讲啥都不知道，PPT一些地方都是扣过来的，错了都没改，不如自学。

然后这门课平常的时候把tutorial上的题目做了，然后跟着老师的板书规范一下过程就好，考试上很多题型都是tutorial上的。不会的，可以在Office hour去问老师，我觉得大多数的老师都很乐意解决你的疑惑，而且在Office hour的时候是用中文回答，理解起来要好很多。在期末考试之前，集中精力复习老师考纲上的内容和重点。

#### CPT208 Human-Centric Computing

Delivered by: Yue Li and Teng Ma

Prototype Software: 有很多可以用的软件，我们用的是Figma

Workload：★★★★★ (5/5)（因为是小组作业所以wl拉满！）课程收获: ★★☆☆☆ (2/5)

这门课的每个PPT都很长加上图片很多文字较为分散，可能会让同学们不知道哪里是重点。22-23是Yue Li和Teng Ma两个老师穿插的来讲的，当时因为说建议每节课大家以小组作业为单位来签到，所以博主尽量每节课都去了，但是感觉能从课上学到的东西很少，只能说Yue Li老师讲的会好一些，上课超级有活力，很有人格魅力，个人很喜欢她。

Coursework：博主本人深受两个15%的小组作业的迫害，大概就是别人在和伴侣出去玩，我在写小组作业，并且每次都能被他们交上来的垃圾气的不清，怎么能有人到了大三写作业还不知道看tasksheet。扯远了，听说23-24届cw有所改革，不知道是不是因为我在MQ里口诛笔伐。扯远了，建议大家一定要提前找好队友，有的时候成绩只是表面，一个人的品行才是决定了这个作业质量的好坏。实在不行的话，建议大家放下“如果这个作业全是我做的，我心里很不平衡”的想法，毕竟分数是自己的，在大三这个最重要的刷分阶段，分数是一切。并且你最终会发现，和傻逼一起合作写作业不如一个人全部肝完来的高效。作业形式应该还是以一个原型设计以及竞品评估两个cw。其实个人感觉原型的想法是否新颖并不一定在打分的考量范围内，关键在于是否应用到课程中学习到的知识，并且能够有较为现实的考量。举个例子来说，一开始我们组打算做一款用户群体为视障人士的产品，这一产品的困难点就在于我们无法找到目标用户去做调研，失去了用户调研的产品就没有考虑到现实性，也违背了HCI设计过程中的问卷设计...方面（记得不太清楚了）。竞品分析也是同理，并不一定要找非常成熟的产品，一个产品如果很成熟的话，就说明能够被找寻的问题是少的。做竞品分析本质上是考察大家对于Nielsen's 10 usability heuristics的理解和应用，我们做竞品分析是希望能够在自己的产品中规避他人的缺点，加入他人的优势。

期末考试：208的期末考试占了70%，允许带一张cheat sheet，没记错的话是允许打印的，建议拿学校电脑来上传打印材料，可以把8页纸打印在一页纸上面。而且老师考试前会上传一个Revison的outline，并不是每一课的都是考试范围，应该只有9个Lec会被考到，其实就是Design，Prototype，Evaluation各三个部分。大家准备cheat sheet的时候，基本上就是把概念性的东西抄上去，比如说 Interaction Design的definition和goal，evaluating有几种方法等。建议大家在考试的时候，不要光抄概念，谁都会抄概念，最好和自己cw时做的东西相结合，把每个概念的主体讲完之后都举例讲解。HCI人机交互本质上就是以人为本，注重用户的体验，用户的反馈，所有的概念方法都是在不断的探索中实践出来的，空有理论没有结合实际就没有HCI的意义。所以老师希望看到其实是一张将理论与实践紧密结合的答卷。以及如果遇到完全不知道答什么的题目，可以先留到最后再写，但一定要写！！哪怕只是抄相近的概念也可以的，总是能给个1，2分的辛苦分的！（最后加一句：我真挚地希望大家不要被任何课下的小组作业影响到自己的分数，或多或少我们总会遇到很垃圾的组员，但希望大家明白自己的目标是什么，坚定自己的目标，其他的都不用去理会，在有的时候不要感情用事，理智的去解决它）

#### CPT204 Advanced OO Programming

Delivered by: Erick Purwanto

Programming Language: Java

Workload：★★★☆☆ (3/5) 课程收获: ★★★★☆ (4/5)

这门课是基于 MIT 的 [6.031: Software Construction, Fall 2020](https://web.mit.edu/6.031/www/fa20/) 这个课程设计的。课程设计和安排还不错，确实能学到不少东西。而且 MIT 也提供了完整的课件内容和例题，所以学起来也比较容易。不过对于编程基础比较弱的同学可能课程内容不是特别友好，需要多花些时间去理解。因为课程涉及大量 Java 语法内容，用 Java 语言讲面对对象编程的各种概念，自然也需要用到 CPT111 Java Programming 的基本知识。我个人是基本上自己看课件和 MIT 对应的资料学的，最后成绩还是不错的。

**Assessments**

这门课我们这一届虽然均分 56 不是很高，但其实主要是因为方差比较大。低分和高分都有点极端，30%+ 的人不到五十分，同时还有 9 个人九十多分甚至满分。总的来说，这门课高分不算特别困难，属于是很适合大三刷分的一门课。但代码部分如果平常没有好好练的话，限时考试的时候会很拖节奏，最后导致写不完试题。具体来说,这门课的评分组成是:

* 10% Lab Exercises
* 10% Coding Assignments
* 40% Final Project
* 40% Final Exam

虽然其中20%的平时的代码题 Lab Exercises 和 Coding Assignments 基本上就是送分，但也一定要自己写一下，别直接抄。因为后面 Final Project 和 Final Exam 里面都有限时代码题，和平常的代码作业强相关，对日常作业理解透能节省很多时间。如果觉得平常作业比较困难，可以额外有针对性地刷刷力扣简单题。

Final Project 我们是分了两部分，一部分是完成几个函数实现一个游戏再加一个限时编程。限时编程基本上就是检查你有没有好好写平常的作业，难度不大。另一部分是写一个游戏的 AI 玩家和 GUI，还要录个视频 Pre 一下。这个基本上就是 UC Berkeley CS61b 的某个大作业的修改版，框架源码基本上没改，所以网络上有很多可以参考的资料。不过具体的算法实现需要查文献资料，但不需要你卷算法部分，找一个主流的算法就行。评分更在于结合文献讲清楚使用算法的原因，以及其他课上概念内容的实践。此外还有一个额外加分的 GUI，我们是把这个也写了，不过这个在 200 分的作业里就加 10 分，还挺废时间的，看个人取舍吧。

Final Exam 开卷考试，内容是概念题 + 编程。可以提前去机房传资料到电脑上，可以自带键鼠（不过好像就我自带了 hhh）。概念题和课件以及 MIT 网站上例题的内容差不多，而且还可以用软件的搜索功能，所以熟悉的话基本上就是白给的。需要注意的是答题策略，要留够时间给编程题，因为题目顺序是随机的，别在一个地方卡太久，不然后面容易写不完。
