本科阶段学习总结和科研踩过的坑

今天下午,终于结束了 SRTP(Student Research Training Program,本科生科研训练计划)的结题答辩,写一篇文章记录一下整个过程,也算是我本科生阶段关于学习、科研的一个回顾。部分摘抄自和 zsx 的对话,非常感谢他,开导了我很多。

在开始之前,推一个东西就是我的书单,我都收藏在豆瓣里了,点击这里。我有个习惯就是在豆瓣上记录这些。书单就大致能反映我的学习路径。我是大学才接触计算机的,大一我还在电子系,起手开团姿势是 C 语言。但我在开学前的寒假,神奇般地觉得,大学了,寒假应该学点东西,不应该像中学那样假期只是用来放松。可以说这次神奇的自学很影响我。所以我买了一本刘汝佳的紫书来入门 C(很神奇的姿势)。由于寒假期间的自学,所以一入学我就比周围的同学稍微厉害那么点,下学期开学的时候我教了我的舍友们怎么写 helloworld。上了一个月课,我直接要来所有ppt,寻思学校教的东西是不是有点捞?我为什么不自学?然后我就买了一本《C Primer Plus》。这是我第一本看完的大部头,这个时候我特别喜欢啃书,照着敲代码。就是得益于寒假的提前自学,我发现了计算机专业中特别重要的能力——自学能力。

然后这个时候我加入计算机实验班也开始写博客,大一的寒假我看了《C++ Primer Plus》的大部分内容。所以 C++ 这门课在大学的授课内容对我来说也是 completed 了。看出什么门道没有?下学期要学什么课,我在上个学期或者寒暑假假期中我就会提前找到对应的国外的好的教材和教科书自学,避免了国内大学落后的教育和质量堪忧的教科书和 PPT 的荼毒,接收到了高质量的计算机科学教育。然后我是在大一下,开始推 CSAPP(《Computer Systems: A Programmer’s Perspective》,中文译名:《深入理解计算机系统》)副本,我看这本书,是因为知乎、豆瓣以及很多博客大神推荐的加成,在我的读书笔记和书评里都有写原因。大一下,别人在上C++ 课,我在看 CSAPP。以及很多什么政治课、校选课的时间都被我利用起来了。我花了三个月,从头到尾啃了一遍,暑假打了代码验证里面的知识点,还写了博客总结。可以说这段时光回想起来是真的很快乐的学习过程,而且 CSAPP 是非常好的书,让我建立了对计算机科学全局的视野,而且在以后的学习过程中我也不会再对大部头有畏难情绪。大一下的暑假,我在看算法导论,回想当初,技术水平还太差,看课后题如看天书。啃算法导论是真的很有意思,暑假的时候我每天窝在卧室看书,配套看 Bilibili 上 MIT 的授课视频。学校教的那点算法,不行的,太少了,而且训练强度完全不够。所以说,我大多数的课程,走的路,学的方法和内容,都是 hard 模式。

这个时候实验班班主任,觉得我不错主动找我的,吸纳我进了他的实验室,我非常感谢他。这个实验室是搞网络的(剧透 其实这段经历目前来看有点 bad ending)。进了一个搞网络的实验室,而此时的我连网络协议是什么也不知道,于是,我抱着一本《TCP/IP详解 卷1:协议》就又开始了。这一次,我花了三个月看完了整个TCPIP详解卷1,而且是 completely,我completely 到什么程度,我 completely 到 ip header 的一个 checksum 是怎么算的,里面数学证明我都自己去推导了一遍,博客在这里。我这里想说什么呢,就是想说,我当时看书非常非常细。但我在这里不是自夸,这个说来是优点也是缺点,而且对于科研来说,更多来说是一个缺点,坏处的占比更大。因为我当时算是,陷入了细节,而陷入细节其实在进入新的领域时其实是一件不好的事情,这一点直到我进入实验室以后非常久才明白。因为急需广泛的总揽全局,我这样是只见树叶不见森林,花了很多时间(关于这方面的论述,我推荐你们看看周志华老师西瓜书的前言)。进实验室这期间我个人感觉在实验室存在感不高,因为我还在学基础知识,没办法做什么事情。

在大二暑假,我刚看完 TCPIP,前沿的 paper 还没看几篇,实验室打一个全国性的网络竞赛组队要组五个人,带上了我。项目和论文的 idea 是大三的组长提的,还有两个大三的、一个大四的,再加上大二的我,这就是五个人的 team。三个大三的实现了这个系统,大四写 paperwork,我负责……理解这个系统做了一个 ppt。。。那个时候我不会 python 语法的情况下,组长给我一做解释这个系统,我一边做答辩演示的 ppt 动画。从现在开始,我这个人的学习习惯开始成为科研路上的缺点和绊脚石,就是过于关注细节了。比如这个 python 语法吧,起码当时的我,不找本书来从头看到尾真的是不舒服的(这个方法不是很好,请朋友们谨慎模仿)。

时间来到大二下,导师给我弄了个 SRTP,一年期嘛,让我去报名。就是本科生科研计划,导师给我指定了课题,让我去研究那个。大二下课很多,而我又计划未来要出国,所以学习成绩和课业我不敢怠慢(相比,组内有人是不怎么顾课业甚至可以翘课来做科研,成绩刚好通过即可,我和他完全比不了)。当时其他实验室成员、学长们都有事要干,所以我就加了三个新人组队……三个同级(都是大二下)选手。就是他们直接和我组队,然后直接相当于进了实验室。然后到了去开题答辩的日子,我X?竟然评了国家级项目?我成了国家级大学生创新训练计划项目的负责人?说句实话,我是真的内心没感受到一丝喜悦,因为到那个时候为止,我是完全没有项目成功经历的。

然后大二下就这么过去了,暑假了,看起来 SRTP 这个事情是个事儿,在大二下和大三上课太多没时间做,那只能暑假留下来干吧。我留下来了。暑假开始了,我在实验室看了一周的源代码和 api 手册,(不吐槽这个学习方法了,实话实说我不知道有没有问题,不过学习记录都放在博客里了)大概弄懂了我要做的是什么东西。那东西很低层,设计到很多 os、kernel、网络的东西,就是纯 C 语言。刚开始的一周多后,我开了个会,给我的三个队友讲了讲,我看手册、看代码学到了什么,因为感觉他们在这一两周好像没有跟着我前进……I feel like I am alone. 在这个国家级项目中,我感觉我是真真的败犬。我开会是把他们三人叫来,讲了很多手册上的东西、程序、代码、api、怎么做实验等等……他们会上都在点头,但我相信如果听进去能有百分之十就谢天谢地了。虽然我的工作方式有问题,但是当时 too young 的我也只能那么做。会后我稍微规划了一下合理的进展目标——我说 谁谁 你帮我做一下这个东西 有搞头。另外两谁谁 做那个啥啥啥吧,啊你说不行啊?那你就先熟悉这个框架吧,就按照我今天说的来,散会……散会了,对,其实我是 team leader 了(虽然说从立项一开始我就是负责人,但这次开会才体现出实际的领导作用)。散会之后,我继续研究这个东西。但其他人其实好像没有实质性进展(我非常主观的感受,有可能有错误)。我问那个我布置任务的人,做了吗?他说:我安装这个环境的这一步报了这个错了,我 google 到现在没成果。我凭借我可悲的领导力,说要不你 mail list 问一下吧,他说好,三天过去,他说,我照着某个人的回复做了,但还是不行。那个时候我真的不想自己接手我布置给他的任务从头做,因为我这边看代码看的也真的头大。我是希望他这个任务搞定之后我直接抛代码给他 可以开始跑实验,然后我把这事问了下导师,导师给了一个比较暧昧的回复,因为导师也不会直接帮你的,说 ok 那就先不做这个吧。我当时布置这个是觉得这个做出来的确对项目进展很有利,然后我就确实不知道该怎么办了。

这时候我大二下。

我觉得我是leader,但自己的技术不够好,团队也不是良性团队,因为一旦我再布置任务肯定会像上次一样,而且,叫其他人去熟悉系统,肯定也是摸了。我就继续看代码和手册,跑了几个实验。我不知道是约束力不足还是我的领导力不足,还是客观条件确实有问题,还是什么别的。关于这个,我现在有答案了,放到之后再讲。

突然有一天,我有了一个 idea(这个也是我在上一篇文章“Why I dislike research”中吐槽过的一个点),和导师汇报,导师觉得可以做。当然这个时候,我感觉:“团队 = 我”,我没有队友。时间大概是暑假8月初,有一天我要做实验的时候,我突然发现我这台机子上的硬件配置不对。询问之,是我组内某位同学说,我做个实验,没有网卡,就挪过来用用。我当时心态有点炸裂。但是当时我,没有生气,我就只是觉得我很难受,我甚至没有意识到我可以跟他说,你赶紧给我装回来。我就过了两天。直接回家了……是真的,而且也没有和导师讲过。大概就是自闭,哀莫大于心死。(其实就是当时还不成熟)回想起这段经历的时候,其实觉得自己当时还是太不成熟了,完全可以直接要求同学赶紧复原硬件,因为不经过同意拿走了别人的东西,甚至还没发现你拿走,直到我要用,完全可以进行沟通。但当时的自己的确没有很好的办法来解决这个问题,由于自身性格还不够成熟的原因。

回家了之后,导师说,你把你的 idea 先写一个 patent 吧。我说,我还没实现,就可以写专利?why?导师说 都是这样的,还发了几个例子给我,我就开始研究。写 patent 得先上网站搜有没有类似的已有 patent,搜了下我的 idea 好在没有什么雷同的。但是。看了一阵和我研究课题有关的 patent 之后,我觉得小部分 patent 还有点意思,大部分……(一言难尽),因为我看过手册看过源代码,而且还算看得比较细,我甚至发现有的 patent 的内容就其实是机翻手册。。(我满脸黑人问号,这明明是人家公司写出来的手册公开到网上的,怎么被你拿来当专利)。可以说,经过这次的经验之后,我对于专利、论文,就再也没有迷信了(此处的迷信是指,我不再会因为一个人仅仅有专利有论文我就会下意识地觉得这个人水平非常优秀,而是要实际地去考察了)。我觉得我追求的是,我能做出来东西就好,而不想水这些文字材料。我找了实验室学长倾诉我这个困惑,他说,对啊 patent就是水的。。。。。学长说完,我也就没什么困惑了。

我就开始照猫画虎地写,写了一稿给导师,导师说:创新不足。我真的满脑子浆糊……因为: 我,还,没有!实现!!所以我现在其实,就是在瞎写,跟我一贯的性格和学习习惯真的已经有很大的违背了。二稿写出来,丢过去,导师丢回给我一个用机器学习搞网络策略的论文,问我能不能往这个方向靠,这样更有可能专利会投中。我看了这个论文 ojbk,还不错的 paper,但是我tm这个时候还不会 machine learning 啊!!!!我说 导师 给我点时间学一下?(你也知道我的学“一下”要多久),导师说,可以,于是。。。

我的 patent 到现在再也没动过笔。

大三上也是课非常多的,但是毕竟国家级项目有一年嘛,我就说,课太多了,我不太想再来实验室了,顾不过来。我也就先隐形了,先好好上课,冲学分。这个时候,我上了一门软件工程课,这个课程需要同学们组队,完成一个有实际意义和真实用户的软件。我作为 leader 找齐一个团队,这个项目还算是成功,合作非常愉快,队友虽然技术力不高,但是在课程上的压迫感,大家的合作意愿摆出来了。然后我感觉我是在带领他们,我发现这个软工课程的 team 和国家级项目的 team 有很大的不同,最大的不同,就是我们始终在一起战斗。说说刚才的话题,为什么这个team领导不起来?是团队缺少一个目标的情况下又缺少压力。不过,我不想只这么简单地下一个结论。从逻辑学角度来说:从一个错误的前提出发,什么谬误都可以推导出来。比如刚才提到的:自我驱动、约束力?领导力不足?也许都不是问题的重点,而是在一开始就有错误,在一开始这个 team 就不够好,不像软工团队那么好。国创的团队,像是随机拼凑的,而我在挑软工团队时,我发了个招聘启事来仔细寻找队友。我深夜debug时是三个人一起的,跑通一个测试,是三个人一起欢欣雀跃。我为什么自闭还有一个原因就是,这一年我这个项目的进行过程中,我的导师刚好到美国去访学一年,我真的觉得我缺乏指导,然后team里又我一个人孤军奋战,和软工团队一比,实在是让人难受,差不多就是除却巫山不是云的心态。这种感觉很重要,不是我自闭前行,然后还发现自己的硬件被队友搬走。突然有一天,我想起来这事,我问队员说,你网卡用完了么,装回来我要跑一下。他说好。过两天,他说装好了,我却一点儿再去做那个实验动力都没有了。本来暑假的事情拖了这么久,你想想我自闭到了什么程度。从大二下暑假到大三下开学的很久一段时间我都没怎么和导师交流了,也没有参加过实验室的组会。我真的大部分时间都在自责,我觉得我自己做的不好,我觉得我辜负了我导师的期望。我觉得我的学习方法不适合科研,我始终想改,但好像没办法有根本性的改变。我依然乐忠于啃书。贴上 zsx 安慰我的话,在这里我想表达对他最真诚的感谢:

如果Team里面有成员对Team有一些想法,就很容易造成很大的麻烦……虽然有点伤人,我觉得你的导师本身对本科生期望就不高,他的目的是让你有一个更高的平台和更广阔的视野,而不是让你做出什么成绩。

悲伤的故事基本上讲完了。在项目的后期,我甚至没跟队员说我的idea、和我在写 patent 的事。事实也证明,我的队友之后的时候也开始写 paper,他们做的研究、在做什么事情、在看什么 paper,其实都没有和组内的其他人有过任何交流。和队员之间我是已经完全自闭,我真的和他们打照面我都不知道怎么和他们聊天,甚至我个人私下觉得我和他们的关系已经无法调和。队员甲,那个搬我硬件的队员,我当时觉得和他性格不合,有时候说话甚至有火药味。队员乙,考试时被我看到作弊,我是一个很讨厌学术不端的人,我和他摊牌了,我说你作弊就别和我在一个组里呆。他给我道歉了,说以后不会了,求我不要追究,我同意了,但到结题之前我都心存芥蒂。

不过,我对这些事情的看法的改变,源自于最近我看的认识偏差(cognitive bias)这个有意思的心理学话题,其中有几个条目是这样的:

极端预期 Exaggerated expectation 实际上的情况通常不如我们所预期的极端。

鸵鸟效应 Ostrich effect 忽视明显的(负面)情况。

在结合《人月神话》中说的,软件开发从业者往往会对项目进展情况有过分乐观的估计,导致乐观主义的弥漫,然后项目遇到困难后延期或一蹶不振。通过上述的观点,我得到了一种启发,就是:一件事情的好与坏的程度,其实也类似于正态分布,非常好的事情和极端坏的事情,其实占比都是非常少的。但我们人类由于 cognitive bias 会像人月神话中说到的软件开发危机那样过分乐观,也可能会过分悲观或过分极端,认为问题就无法解决,矛盾就无法调和了。大部分的事情的好坏程度,其实既没有那么好也没有那么差。想到这里,我也开始说服自己,摆脱了之前项目进展过程中不顺利的影响,也不再觉得和队友是一句话都不能说的。到了项目的末期,我们几个队友还是老老实实地把最后的材料完成,并且通过了结题答辩,并没有落到最后连答辩都去不了或是团队解散的程度。

刚刚结题答辩结束的时候,仿佛卸下带在身上的一个沉重的枷锁,虽然我不认为这是一个很好的过程,但自觉也对得起实验室和导师(申请的课题带来了经费),感谢队友。如果问我大学一定不要干什么,我说一定不要报SRTP。结题答辩的时候,几位老师绝对不会关心你做了啥,估计也不是我们院的,而会只问你有没有专利有没有竞赛获奖有没有论文。没有导师问项目相关的东西,比如在我们前面上台答辩的各组,当老师问有没有成果的时候,这些同学说没有写专利没有写论文没有参加比赛,老师们会发出叹息之声,频频摇头。而当我递上去我们组的专利和论文复印稿的时候(虽然我心里觉得是一堆nonsense),他们欣喜若狂地问这问那,发表了没有?过审了没有?在什么阶段?……我心里觉得,他们其实也清楚,学校批给 SRTP 的钱就是拿去买 paper publication 的。

……

好像写到这里就没什么想写下去的了,不如就到此结束吧。