思维之海

——在云端,寻找我的星匙。

912内容学习计划

本文为写给学堂在线的一篇912学习指南,旨在帮助更多对考研(912)有想法的人尽快入门。

References

912_project

REKCARC-TSC-UHT

学习总览

考研究生从来不是一件易事。在明确了方向以后,信息和道路也十分关键。这对于自主命题高校来说,尤其重要。考研对于很多人来说是一场信息战,但是,要想达到理想的学习情况,应该要对自己想要报考的学校、专业、老师、课程内容和历史有充分的了解。确定这是自己真正想要的。

作为一名二战的跨专业考生,我在第一次考研的过程中,就深刻地感受到信息不对称和环境所带来的困扰,一方面,学堂在线丰富的计算机课程和训练营体系,给了我一个真正入门的机会——我有时候会暗自思考,如果仅仅靠自己慢慢摸索,我是否可以坚持这么远,坚持这么久,去追求我理想中的“球状闪电”?然后,唏嘘以后,却仍然对另一条路充满了不确定性。

在另一方面,虽然我入了门,对于研究生入学考试所要求的专业水平,却还是相去甚远,这是由于我在大学期间没有一个良好的学习体系,只是盲目地根据兴趣挑挑拣拣计算机课程,而在研究生入学所需的课程上有明显的不足。比如,在我第一次学习算法的时候,我甚至没有学习任何的数据结构。就算以后,我系统地学习一些基础算法和数据结构,在参加多次算法比赛中都展现了惨不忍睹的成绩。路漫漫其修远兮。

计算机科学的道路是非常漫长的,无论是从纵向的时间还是横向的知识延展来说。从入门开始,到考研,到研究生阶段,每一个阶段你都会明显感觉自身的一个质变。然而,千里之堤,一步一砖,只有埋头努力。

每个人对于计算机科学的热爱,都有不同的发源地,以不同的方式表现。每个人的经验也往往不同,然而,只有自己走出的路才是适合自己的路——而这是一条你在走之前无法确定的路。但是,所有的经验终究是建立现实的基础上,在这样的意义上被影射为万千的知识库。也许没有办法做到,复制一条确保成功的路,但是所有一切通向成功的基石,都可以展露无遗。那么,最后的选择权将完完全全地落在你们的手上。我以为,这就是学习经验的最好的表现形式。网上经常会涌现很多经验贴,但是多数经验帖的承载内容和专注形式通常在于个人经历的描述,这自然不能看作学习经验,因为你很可能无法复现。

我们需要着重于学习经验的积累和消化,这些学习经验应该包括知识、课程、练习、实验、解惑、测试等等一系列资源。这些资源既需要丰富,也需要简洁——毕竟这是一场争分夺秒、坚持以恒的人生旅程。912_project就是在这样的思想下诞生的产物,它几乎包括了考研以来项目维护者所使用的所有资源。我相信,在资源和信息收集的意义上,它已经足够全面了。但是,除了这些资源以外,一点工程式的经验也许在某种程度上产生非凡的效果——我是说,它们虽然足够丰富,但是却未必足够简洁。把书读厚通常是一件简单事,但是,把书读薄却要困难上许多许多。

总的来说,考研的四门专业课:数据结构、操作系统、计算机原理、计算机网络。这四门课是非常值得花费精力认真学习的;只要时间允许,就决不要想着偷工减料。四门课程之间相互渗透,相互促进;在学完了一部分内容以后,会逐渐形成系统,体会到不同学科之间的联系。

学习专业课的顺序,建议应该按照常规的学习顺序,即一般的大学课程体系的参考顺序。但是,对于考研来说,各个科目之间仍然有一些相对独立性,多线并行也是可行的。这时候需要自行调整最合适的学习方针。所有的资料都已经维护在912_project中。下面,分方向进行简单的介绍。

计算机原理

计算机原理,在考研的范围内可以理解为叫做计算机组成。计算机组成描述的是计算机科学的物理底层,学习它可以更加理解计算机可以做什么、做不到什么。这便是计算思维的起点。因此作为复习的第一门课我觉得是比较合适的。学习它需要花费的精力比计算机网络稍微多一些,但明显少于数据结构和操作系统。你学习这门课的速度也可以作为参考来调整之后的专业课复习计划。

计算机原理可以分为计算机系统概述、数据表示和运算、存储系统、指令系统、CPU/流水线、总线。

清华大学的计算机原理有公开MOOC可供学习:计算机组成原理。这个MOOC内容是清华本科课堂的公开录像,建议一定要全程跟下来,并记录下其中的重点(有一些实验和架构细节部分可以略过)。清华大学的912考研真题较少,并且计算机原理的内容更少,可以提前查看试题内容,并了解到考试中的重点,这样方便在听课时做记录。计算机原理整体考的并不难,但是需要对已知的考察类型做充分的了解,否则其中的很多细节便会捉摸不清。912的计算机原理题目中常常会考到过去曾经出现的真题、习题、期末题等等,因此对真题、习题的掌握是重中之重,一定要保证这部分内容的复习质量。

清华大学的计算机原理使用的学习教材:《计算机组成PPT》,《 计算机组成:软硬件接口》。这两本书,《计算机组成PPT》中包含了大部分知识点,建议作为核心参考教材使用,遇到陌生的概念在PPT搜索往往会得到答案。《软硬件接口》则是专用的课程教材,其上的内容更为详细,讲解也很细致,遇到难懂的知识点,在这本书上查阅往往可以获得比较详细直白的解释。当然,还有一本书叫做《深入理解计算机系统(CSAPP)》,这本书的流水线部分可能有助于相关知识、过程的理解,但这本书使用的是x86汇编,可以作为简单的参考书使用。

注意,清华大学所使用的计算机原理汇编语言和操作系统的汇编语言不相同,在计算机原理中使用MIPS汇编,而在旧版操作系统(2020年以前)中使用x86汇编,在最新的操作系统课中则使用RISC-V汇编。如果对MIPS汇编不熟悉,可以看《软硬件接口》第2章,或者学堂在线的汇编语言程序设计第5章,以及其他的相关材料。你应该熟悉常见的MIPS汇编指令以及格式,因为流水线计算中一定会涉及到这方面的内容。

除此之外,王诚老师的蓝皮书(《计算机组成与体系结构-第3版》)(或刘卫东老师的红皮书?这个可以自行到购书应用上搜索)也可适当参考,但是并不特别推荐,因为其中包含了许多本科的实验内容,而这些在考研中几乎不涉及。

在练习题方面,如之前所说,包括计算机原理在内的多数清华计算机系课程的历年期中、期末题、习题可以在清华大学计算机系课程攻略中找到。还有其他的计组练习题,比如袁春风老师的计算机组成课后习题及答案,王道408的计组部分课后习题,都有一定程度的参考价值,可以根据复习时间来自行选取和安排。

下面是一个简单的、近些年912中的计算机原理考点整理,方便你有一个直观的认识:

计算机原理考点整理

考点 2020 2019 2018 2017 2016
流水线相关计算 ★★★★ ★★★ ★★★ ★★★
流水线冲突 ★★★ ★★ ★★★
浮点数表示
Cache缺失/映射 ★★ ★★
RAID ★★
补码表示
CPU指标(CPI/主频)
Cache相关计算 ★★ ★★★
指令的概念 ★★
异常处理/中断
虚拟内存
C语言
总线
显存带宽计算
RAM
冯诺依曼架构
时序/组合逻辑
海明码检错/纠错

在看完了上面的考点整理以后,相信你对考试内容的重点、难点已经有了一个总体的认识。流水线相关的考题几乎是必考题,而且常常以计算、压轴的形式给出,需要重视。此外,简单的数据表示、Cache高速缓存、RAID磁盘冗余阵列相关知识也几乎必考,然后便是大量零散的小知识点,比如指令、异常、总线、编码等知识。以上考过的知识并不代表所以可能会考到的知识点,但它表现出的倾向性是明显的。

时间如何分配,内容和知识点如何学习,这些,你应该已经有所了解。但考研,贵在坚持,如果不能持之以恒,把这些内容尽快、高效地学完,那么再多的资料也没有意义。另外,你还需要对学习过程做足够的笔记,这样的笔记应该便于检索和查阅——这会为你后期的巩固和多轮复习带来巨大的优势,这里我建议有条件的同学可以使用类似ipad平板电脑上的Margin Note 3软件,将学习过程逐步数字化、信息化,在这样记笔记过程中形成的脑图会帮助你构建知识体系、快速解决问题。

计算机原理的部分暂时先介绍到这里。

数据结构

数据结构内容丰富,并且进阶知识系统及其庞大。但在考察上,通常侧重于对知识点原理性的深入理解,而不是工程上的实现细节。清华大学的数据结构有非常鲜明的风格与特点。

数据结构按章节主要分为:绪论、向量、列表、栈与队列、二叉树、图、二叉搜索树、高级搜索树、词典、优先级队列、串、排序。其中,高级搜索树、词典和排序应该算是比较难掌握的章节,需要投入更多精力。

同理,在课程上数据结构也有MOOC:包括数据结构-上数据结构-下算法训练营。其中数据结构免费向公众开放,而算法训练营需要单独购课。但是,对于考研,至少初试阶段来说,对算法的需求并不大,只要掌握了邓公在数据结构中的课程,便能起到几乎完备的效果。数据结构的课程内容已然很充足,从内容上来说甚至被分成了上、下两门课,足以窥见其知识点之多、学科的复杂性。数据结构中,理论性、结论性的内容很多,因此在复习过程过要善于总结,对不同的算法和数据结构也要有比较意识,对它们的应用场景有一定的了解。比如,败者树和锦标赛树,Splay单层和双层伸展,KMP和蛮力算法等等。在这样的比较过程中,加深对数据结构的理解。

清华大学数据结构使用的教材是《数据结构PPT》和《数据结构(第3版)》,其中PPT作为了本科学习的一个类似讲义的存在,是重中之重,其中有很多教材上并未涉及,近年来新增的知识点,包括前面提到的败者树、线段树等等。配套的习题集是《数据结构习题集》,这本习题集中的典型结论必须一一牢固掌握,并且与相应的课程章节联系在一起。

其余的参考书还有诸如《算法导论》,《具体数学》等。《算法导论》可以提供一些更详细的某些算法的解释,但建议浅尝辄止。912的考题中曾经考到《具体数学》中的某道判断复杂度的习题,不过仍然建议浅尝辄止。

为了得到及时的最新资料,还应该关注邓公的官网:https://dsa.cs.tsinghua.edu.cn/~deng/。其中会提供包括教材、习题集、PPT讲义、数据结构在线演示(https://dsa.cs.tsinghua.edu.cn/~deng/ds/demo/index.htm)等一系列数据结构方面的资源,请务必重视。

数据结构方面的练习题,请以邓公习题集、PPT课后思考题、期中期末考提、912真题这几类为准。

下面给出近年来912中数据结构的考点分析:

数据结构考点整理

考点 2020 2019 2018 2017 2016
BBST(红黑/AVL/Splay/B树) ★★★ ★★ ★★★★ ★★ ★★
散列表 ★★ ★★★
BST遍历/PFS ★★★★x2 ★★★★★★ ★★★★★★ ★★★×3
排序(冒/插/选/基/归/锦/败、CBA) ★★★★ ★★★★★ ★★ ★★★★ ★★
串匹配(KMP/BM) ★★ ★★ ★★
复杂度 ★★
编码树(Huffman/PFC)
RPN
减治 ★★★ ★★★
Catalan
堆(完全、左式堆) ★★★★★ ★★
栈(调用栈、栈混洗)
Dijkstra算法
跳转表
二分、Fib查找 ★★★★★
最小生成树(Prim) ★★★
非法表达式
逻辑地址

可以看到,关于高级搜索树、散列表、二叉树遍历、排序、串匹配等知识,几乎是年年必考;而一些较为冷门的知识点,比如跳转表、表达式、左式堆、栈混洗等,则有时出没。如果想在数据结构上取得高分,则必须在完整掌握常见考点的基础上,对大量的冷门知识、结论做归纳。一定要编织严密的知识网,才能自如地应付考研。尤其是,在912考试中,因为题量较大,而且数据结构作为试卷上的第一门并且是分值最大的科目,如果不够熟练,那么将直接影响后面科目的得分,尤其是计算机网路。比如,我考试的时候,对于KMP的next数组的计算等等便不够娴熟,导致我做题速度偏慢,后面的计算机网络题目就几乎来不及做了。因此,你应该注意把控答题的时间,不要在某一道题上纠结太久,因小失大。

数据结构的部分暂时先介绍到这里。

计算机网络

计算机网络在某种意义上独立性较高,它的内容相对规范化,因此知识固定容易掌握。计算机网络还相对简单,考试分值也低,只需记忆和理解各种各样的体系和协议即可。

计算机网络方面清华并没有在线的MOOC,但是王道的计算机网络课程在大部分内容上已经足够代替。只需跟着看完课程即可,难度不高。

计算机网络的教材方面,推荐王道的计算机网络配套的PPT,以及清华大学的课程课件《计算机网络PPT》。王道PPT的课件质量很高,大部分网络知识都可以在上面找到答案,并且通俗易懂,整理得很好;但是另一方面,在清华的课件上可以找到一些冷门知识点的答案,比如水平分裂算法、SNMP简单网络管理协议,SONET/SDH系统等。

计算机网络的参考书包括《计算机网络(第5版)》,《计算机网络:自顶向下方法》,《计算机网络(第7版)-谢希仁》。其中,《计算机网络(第5版)》是重点,有时间可以看,但是这本书很厚,时间不够的同学,可以按照考察重点来学习,比如912中曾经考到的蜂窝网络,在这本书中就有涉及到(当然,在清华习题课件中也有提到)。

计算机网络的练习题,包括期中期末考题、平时的练习题、王道上的习题等等。建议多做一些,熟悉题型。912的计算机网络部分常常考到原题,所以已有的资料请务必做完做懂。

下面给出近年来912中计算机网络的考点分析:

计算机网络考点整理

考点 2020 2019 2018 2017 2016
TCP(拥塞/握手/报文等) ★★★ ★★ ★★ ★★★
路由器计算 ★★★ ★★★ ★★★ ★★★
信道利用率
ARQ(停等/后退/选择) ★★
HTTP ★★★
网桥转发 ★★★
ARP ★★★
物理层设备
调制/解调
水平分裂
蜂窝
最小帧长
以太网
分组转发
OSI&TCP/IP
奈奎斯特定理
数据链路层概念
DNS
SMTP
SNMP

可以看到,大题通常考察TCP协议相关问题和路由器,其它的考点随机性较强,所以需要全面复习。

计算机网络的部分暂时先介绍到这里。

操作系统

操作系统实际上是四门课程中最复杂最难掌握的一门课。它知识点多,并且实验细节特别多,需要很多额外的知识,比如汇编语言设计、软件工程等。

清华大学操作系统的课程MOOC可以在学堂在线上找到:操作系统(另有b站资源,以及旧版,或王道操作系统)。另外,今年(2020)又出了操作系统(RISC-V)新版在线课程,即基于RISC-V和Rust架构的rCore教学操作系统,需要留意。因为操作系统在考题中常常涉及当年授课过程中的新问题(比如,当年piaaza平台上发布的问题被解决后可能会作为考题出现在试卷中),在学习上要尽量与时俱进。操作系统在学习上还是应该以uCore为主(在线ucore操作系统实验任务书),但新版rCore的教程(在线rCore操作系统实验任务书)的代码已经逐渐成熟了,考察的可能性也不是没有。两者在架构上是很类似的,所以看懂了uCore那么学习rCore将不会耗费过多的时间。在实践方面,如果时间不足,可以选择只分析代码而不做具体实验,但实验指导书上的内容应该仔细阅读并理解。

清华大学操作系统的教材包括:《操作系统PPT》,《操作系统实验书》。《操作系统PPT》今年也出了新版,除了uCore版的实验书,今年可能需要看一看rCore-Tutorial(这是V3最新维护版)。

清华大学操作系统官方提供了三本参考书:《操作系统:精髓与设计》,《操作系统概念》,《现代操作系统》。除此之外,也可以适当参考《simple_os_book》等。

操作系统提供了一个讨论区pizza。在上面有历年操作系统课的所有答疑,请务必在遇到难题和不解时记得使用,往往在上面可以找到解答——当然你可能需要一些搜索技巧。

操作系统还提供了一些练习:习题集操作系统-题库。除了这些之外,和其他科目一样也有期中期末试卷、真题等。这些题目基本可以满足考研复习的需求了。

操作系统的相关课程信息见:课程信息(2019)-Github。注意跟进每年的新进展,在清华大学计算机系操作系统系列课程主页上可以找到最新的课程信息。点击进入具体的某个课程,便可以方便地获取包括课程介绍、课程教材、课程讲义及视频、教学交流和讨论社区、教学实验、操作系统课程常见问题及回答等等丰富的资源。

操作系统的实验平台包括:操作系统实验 - 实验楼,或虚拟机,或装机,或……环境搭建方式很多。之前已经提到,做实验对于初试来说并不是必须的,但理解实验内容却是非常必须的,这里请自行斟酌。

从上面的介绍可以看出,操作系统方面的资料非常丰富,甚至有点太多了。你在复习的过程中要有所取舍,围绕初试来学习,要首先把核心的考点掌握,对于比如uCore的代码题,可以稍稍放一放,等到后期有时间剩余时在批量解决。

下面给出近年来912中操作系统的考点分析:

操作系统考点整理

考点 2020 2019 2018 2017 2016
uCore代码 ★★★ ★★★★ ★★★ ★★★
虚/实地址(转换/扩展) ★★★ ★★★ ★★★
进程控制/系统调用 ★★★★ ★★★
管程 ★★★★★
belady ★★★
x86硬件 ★★
信号量
死锁
线程
文件系统 ★★★ ★★★
调度算法
僵尸/孤儿进程
中断
Cache
哲学家就餐 ★★★
硬/软链接
stride算法
x86特权级
优先级反置
伙伴系统
自旋锁
动态分区算法
RAID

如果想要在操作系统上取得高分,实验代码是一道绕不过去的坎,除了代码理解题以外,实验还会以其他的题型考查,比如曾考到uCore的时钟中断,这意味着实验部分的分值不仅仅只有代码题的分,这一点要引起重视。

操作系统的部分暂时先介绍到这里。

算法

单独把算法这一部分拿出来说,一是因为初试的专业课中考察算法实在不多或者不难,二是因为复试中将不可避免地涉及到机试算法题。

在初试中数据结构中所可能涉及到的算法题,常常比较简单。大概有以下几类:二分、减治、递归,动态规划。并且一般只会考察数据结构课程上所涉及到的“代码精致”的算法(因为这样才可能在考试中通过手写的方式呈现出来),它既要足够有区分度,又要足够简单。在这样的约束下,剩下的选择其实不多。

对于复试,机试难度大约在 【提高组省选】 之间(这里的提高组、省选是参考的OI信息竞赛的难度标准,实际上912机试的风格和OI竞赛风格非常类似)。这意味着你需要对这个难度层次的题型有完整的了解和足够的题量训练。建议有机会可以参加学堂在线Code+比赛。

下面列出适合复试er的常见的 OJ

机试允许携带模板,这意味着你应该在初始结束后甚至更早开始积累模板。模板应该尽量简洁易懂,便于在考场上查阅。你还可以通过做模板题来积累题型模板(洛谷模板题)。机试还允许使用标准模板库STL,这意味着很多算法和数据结构不需要你去手写,比如快速排序、优先队列、字典、栈和队列等,它们的使用方法需要熟练掌握。

更多的信息可见于:912_project - 复试 - 机试

科研

作为一个研究生,或者将要考研究生。拥有一些科研经历,似乎也是名副其实,这些经历在复试中显然会给你带来很大的加分。毕竟,研究生的主要任务,就是搞科研。如果你的目标是学术硕士,那么科研经历就可能更为重要。

你应该尽早开始一些有科研性质的项目的准备,包括有理论性工作性质的实习经历,在本科实验室或者其他科研院所的研究经历,发表或参与发表的学术论文。即使没有适合的途径,也应该提前了解报考的方向,清华大学计算机系的大部分老师都有个人主页,在他们的主页上你可以了解到他们的科研方向、论文专著甚至硕士名额,你可以在这些研究方向上有所了解,进一步做一些简单的开源项目或者实验等。这些都可以体现出你对科研的兴趣和培养你在科研方面的实践基础。

最后,如果一切顺利的话,欢迎开启人生的新阶段。希望这是你真正想要的。