几天前还在看别人的面试经验,没想到现在也轮到我写了。
个人背景
- 学校与排名:北航计算机专业,前五个学期 rk 24/205,大约在 11% 左右(前六个学期 19/205,可惜没赶上)
- 竞赛:系统能力大赛编译赛·华为毕昇杯(一等奖,全国第二);蓝桥杯(省一国三);CSP 认证(单次 1.51%,累计 0.99%);以及其它一些小奖(见 roife/resume)
- 科研经历:两段体系结构(GPU 方向)的经历,以及一段正在做的 JIT 编译器的经历,无论文
- 项目经历:两个编译器项目,两个前后端和移动端项目,以及一些课设(CPU/OS)
似乎老师基本不怎么看竞赛,面试也没被问到过,所以可能竞赛经历的用处很小。
从重要性上来说,应该是 排名 > 论文 > 科研经历 > 项目 ~ 竞赛。
夏令营参加情况
学校 | 学院 | 初审 | 结果 | 备注 |
---|---|---|---|---|
南京大学 | CS | 补录 | 学硕优营 | NJU CS 的考核包括 1 次笔试和 2 次面试 |
中科院计算所 | 国重的程序分析组 | 通过 | 放弃 | 因为过了 NJU CS,所以直接放弃了 |
准备环节(三月~五月)
确定研究生方向
本科期间我做的科研项目主要是体系结构与编译方向,但是个人可能更加想做编译方向的事。同时我对 PL 这个方向也比较感兴趣,本科期间看过一些书,所以最后决定做PL/程序分析的方向。
确定了研究生方向后,可以去查一下这个方向有哪些推荐的导师、导师所在的学校以及学校的考核流程,为后面做准备。(我是后面才知道原来 NJU CS 还要通过系笔试和系面试,所以准备得太晚了)
联系导师
一般来说 4、5 月份的时候就可以联系导师了,6 月份考虑到要准备期末考,其实已经非常忙了,所以建议最晚五月份的时候联系导师(建议通过邮件联系)。联系上导师后可以问问考核的流程。
这一阶段我通过邮件联系了 NJU 和 ICT 的两位老师,两位老师都很热情地加了我微信,并且进行了简单的线上面试,面试效果都还不错。
这里需要注意的是,在联系导师前最后先进行简单的复习,主要是专业方向方面以及科研项目方面的,极有可能在面试时被问到。
笔试面试准备(五月~六月)
这一部分主要是针对 NJU CS 的。在联系完导师后,我才知道 NJU CS 是强 COM,必须要通过计算机系自己的笔试和面试,而且导师是无法干预的,所以立刻开始准备复习。
根据这两年的经验,NJU CS 的笔试主要还是以 408 相关内容为主,所以可以直接刷考研书了。四本书的重要程度(刷的先后顺序)大概是数据结构 > 操作系统 > 计网 ~ 计组。
这里还有一个坑点。我是开始刷 408 后才知道原来北航学的数据结构_计算机组成和 408 有非常大的区别。诸如希尔排序_二叉平衡树这些内容北航都是不会讲的,浮点数之类的也没有重点要求,对于一些人来说可能是现学一遍,有一定难度,需要提前准备。
我大概是期末考试前刷完了数据结构,而且本学期刚学了计网,准备期末考试的时候顺手刷了计网,然后期末考试结束开始刷操作系统和组成,供参考。
夏令营
南京大学 CS
据说南京大学属于超强 com,最终成绩里笔试面试都会算。因此想进的话,笔试必须要有比较高的分数。流程和时间点大概如下(其中每个节点都有两三天的补录,每次基本是晚上出结果):
- 6.28 初审结果通知
- 7.7 计算机系笔试
- 7.8 笔试结果通知
- 7.9~7.12 宣讲和组内面试(之前如果组内面试过了可以不参加)
- 7.13~7.14 计算机系面试
- 7.16 面试结果通知
我一开始初审被刷了 :(,后面补录上了。
笔试
题量非常非常大,大概有一百多题,一个小时根本做不完(实际上我也没做完)。题目分为单选和多选,分别为 2 分和 3 分,多选题漏选错选多选都不算分。
具体的题目忘了,题目涵盖了数据结构、计算机组成原理、操作系统、计算机网络、算法设计、程序设计、软件工程等等方面的问题,这里我只能凭印象列举一些知识点。
- B 树
- 希尔排序
- C++ 语法以及 C++ 的各种算法
- 正则表达式(例如 w、W 之类的是什么意思等)
- 软件工程里 Major、Minor、Build Number、Revision 版本号规范
- 最短路算法和最小生成树算法(Dijkstra/Bellman-Ford/Floyd/Prim/Kruskal/etc)以及他们的限制
- 计网交换机和路由器的区别
- 计网中的各种协议(重点是 TCP,一定要知道所有细节)
- 进程与线程
- 操作系统处理中断的流程
- 面向对象设计中的一些概念
- 命令式_面向对象_函数式编程语言各自的特点
- JVM 相关知识点
- ……
面试
NJU 的面试环节主要是问英语和专业课问题,虽然按照道理说这个环节也会深入问项目和科研经历(隔壁),但是可能是因为时间紧迫所以没问我这些东西,总共面了 10 分钟左右。
在英语问答环节,也许是考官认为个人介绍、学校介绍之类的东西可以提前准备背诵,因此直接要求我用英语回答专业课问题。我的题目是用英文解释某个算法,我回答得有点糟糕。这个部分建议提前积累一些名词,例如“贪心算法”、“分治算法”、“递归"等等,据说也有可能问 OS 相关的问题。
专业课问题似乎很看老师,一般来说老师会问自己擅长的方向的问题。老师首先问了我数据结构和数据库相关的知识,这一部分我回答得比较一般。接着是问了我一些编译相关的问题,正好问到了我擅长的点上,所以我展开说了很多,并且扯到了 GCC/LLVM 上,看起来老师对我这部分的回答也比较满意。
出结果
最终录到了学硕,很开心,保研之路提前结束了。
中科院计算所
实际上计算所这里我没怎么参加,因为开营之前我已经拿到了 NJU 的 offer,所以只面了 7.16 上午的一场面试,而且过程比较惨。
中科院明显不像 NJU 那样问一些 CS 方面比较基础的问题,而是更着重问对应方向的问题。例如我就被问了 20 分钟左右程序分析相关的问题(包括莱斯定理、数据流分析、指针分析等),回答得非常艰难。我这一部分主要是看网课自学,而且面试前没有准备过,所以有点寄。
可能是老师觉得我回答得实在太烂了,于是后面 40 分钟就直接开始让我刷 leetcode。
老师先是给了我一个中等难度的题,数据结构方面的,基本上可以秒掉。然后又给了我困难难度的一道 DP 题,类似于 LCS,我想了一下才开始写,最后因为时间问题没写完,但是中间基本的过程都是对的,所以老师让我面试结束后把写完的程序发给他。
当天晚上 NJU CS 出结果了,所以我就直接拒绝了计算所后面的考核(主要是懒得找老师写推荐信了)。
总结
排名是最重要的,一定要提升自己的排名。如果去 NJU CS 一定要记得提前刷 408。感谢老师全程关注,还督促我复习。