诗海

我们越谦卑,就离真理越近

0%

对接下来一段时间自我学习的路线思考

入学EPFL也有一学期的时间了,自己也算是逐渐适应了国外的学习生活。说实话,对于在瑞士的CS学习,我是不太满意的。当然这也跟自己初来乍到没有确定好未来的路线规划有很大的关系。现在,至少这个问题已经逐步清晰起来了。下面我就想主要地回顾一下自己的心路历程,同时为接下来一段时间的自我学习指明道路。

研究生之前历史的回顾

首先,自己第一次进行系统的CS自学规划,是在2019年9月份的时候,直到现在我还记得当时正是在备考第二次的GRE考试,每天晚上在国软后面的废弃操场散步思考是我难得的休息时间。当时,就是在这样压力的环境下,我开始了对结束英语学习以后,腾出来的大量时间该做什么进行了思考。当时初步定的想法就是打实基础,提高技术,为春招实习做准备。于是在这样的思路指导下,我从11月份结束国外申请后,用了40天的时间第一次系统啃完了《算法》(第四版)连同Coursera上Princeton的Algorithm课程,完成了所有的作业,并且在12月份开始进行Leetcode刷题,这种高强度的练习一直进行到2020年的春节期间(1月底)

之后突如其来的疫情打乱了我原有的计划安排,再加上毕业设计的时间挤占,以及最重要的,个人在家学习的极低效率,导致原有的计划不得不无限期拖延。期间虽然也强行参加了一些面试,笔试,但是都是三心二意,没有成体系地复习准备过,可以说仅仅是又一次的刷经验而已(如果这样的情况下我都能过,那只能说明是公司门槛太低了)。面对不得不调整的形势,我随即利用半年在家的时间,开始了一次本科阶段重要课程的巩固性书籍阅读,《深入理解Java虚拟机》(第二版)、《MySQL技术内幕:InnoDB存储引擎》、《操作系统导论》(OSTEP)、《Java实战》(第二版),基本上是一个月一本书的阅读速度。这显然是比较慢的,但是却因此大大提高了我个人对于技术书籍阅读的自信心。我是有能力进行完整的技术书阅读的,而不再是像本科时期的很多课程一样,书只看一点点就停下不看了。

但是,这样的学习其实现在看来也是存在着问题的,最大的两个问题就是:第一,太慢,不得不说自己看书的速度实在是堪忧,有一段时间甚至就是在强迫自己看,“啃书”一词可以说是非常形象的了。自己在看书的时候也会有意放慢速度,尝试去查找,弄懂一些关联性的概念等等,总之就是读得太仔细,太认真了。这当然从静下心来研究的角度来说不是什么坏事,但是对于个人的技术成长进步来说,依然是显得太慢了。正确的、符合人类记忆的做法是多次的重复阅读,而非一次性的精读。第二,就是没有配套的练习/编程机制,不知道具体的代码实现,导致了很多东西学了又忘,以至于半年后的今天很多概念又变得模糊了起来。这两点问题,是以后自己读书应该着力避免的。

之后的8月份,有鉴于自己动手能力实在是太差,没有任何能打的项目写在简历上拿的出手,因此我开始了Coursera上面Programming Language系列的学习,这个分成了两部分,8月份的前25天完成了一半的课程;后面的一半直到今年春节之前(1月20日考完试花了15天时间完成)。在这个过程中,使用VSCode编程极大提高了我个人对于任何一门新语言的自信心,现在即便是随便给我一个从未用过的新语言,我也有信心很快地去掌握并使用它。但是,我自己的初衷并没有很好地达到,也就是说,代码量依然不够看(每个作业也就是100-200行的代码量,不管怎么说这只是UW的本科课程而已啊)

研究生半年的体验

首先,我想记录一下自己为什么选择来洛桑,而不是去美国读书。这其中固然有很多额外因素的考虑(比如说金钱花销,疫情)等等,但是最主要的考虑是这样的:我觉得绝大多数的美国master项目,其时间长度(一般是1年半 - 2年)就是为了找工作去的,换句话说,我人一旦到了美国,就要考虑找工作的事情。这样短平快的思路是让我很不舒服的。由于本科时期长期的功利主义、结果主义的思维导向,造成了我对于技术方面没有踏实深入的、静下心来的钻研;而是怎么快地掌握怎么来,浮于表面,不求甚解,根本经不起任何的考验。所以我正是看中了来瑞士可以有比较充分的转圜时间(不管是决定找工作也好,还是决定走科研路线也好,都有静下来的充分的自我时间),才选择来到这里的。

其实刚开始在EPFL选课的时候,心里还是挺激动的,对于国外的课程质量也抱有很大的期望。也曾经一度萌生过读博的想法,因此在选课上,还是选择了一些热门的(比如Machine Learning,Natural Language Processing这些),但是我很快就发现自己挖了一个大坑,而且大到超过了自己的能力范围。一直以来,数学都不是我的强项,但是要往AI方向深入地学习,数学必不可少,甚至比编程能力重要得多。如果要入坑的话,那我估计很多本科的课程都需要仔细钻研了(比如高等数学,概率论,线性代数)。经过我再三的思考,我还是决定放弃这个领域(虽然它确实很诱人,而且相关的资源也有很多),专注于对未来找工作有帮助的System方向。

除了让我痛苦的AI方向,EPFL的课程也可谓是一言难尽,就是确实比武汉大学的质量要高一些,考试的难度也大一些,但是依然是有很多概念性的东西,不求甚解。比如说TCP/IP虽然对于很多协议(比如BGP)的讲述比本科的计网课程详尽了很多,也有一些配套的练习;或者是Distributed Algorithm对于各种Broadcast的概念讲解。但是我依然学完了之后没有很大的提高,既不知道这些的本质(如何用C语言实现TCP/IP协议?),也不知道这些概念对应的应用到底为何(DDIA书上貌似有一章详细地解释了Broadcast算法)。感觉还是停留在一种学校象牙塔里的学习。这时候就不得不说美国的学校了,必须要承认名校就是名校,如果我配套完成了CMU的15-441 Project,或者是MIT的6.824 Project,或许就能对Network,DA有更深的理解了。这当然只能是自己课余的努力,而非EPFL课程本身所能带给自己的了。

我自己目前对于本质的问题看得很重,如果学习依然是停留在概念的记忆上,那我觉得跟本科也差不了太多了。不管是对于AI的算法也好(从数学上我就能证明这个算法它就是好的,就是对的),还是对于System的计算机网络,操作系统,数据库...了解它本质的运行情况(一行命令/代码下去到底发生了什么),做到如同机器一样的思考,是我目前特别希望自己能拥有的能力。因此,在之后的学习中,我都希望自己能够不在意成绩的高低,而是着重在意这样的本质思考能力。

第一学期由于各种生活上的原因,非学习的时间很多,整个一学期在疫情下战战兢兢,不能很好地静下心来做自己的正事。因此除了正课之外,可以说没有任何其余的学习投入,有时候甚至一天工作1-2小时就是胜利了,这是非常不好的(也由此中断了连续几个月的自学提高)。之后的学期再也不能延续同样的状态了,至少,每天要能工作5-6小时吧,再留下2-3小时的休闲娱乐。

接下来的自我学习

第一学期最大的耻辱,不是在于最后的考试成绩上(说实话,我现在已经完全摆脱了长期以来的成绩束缚,身心高度自由),而是自己因为惧怕C/C++语言,因而直接撤掉了Concurrent Algorithm这门课程。对于C/C++的恐惧心理是我必须要克服的。因为不克服这种恐惧,我自己所希望的,能够了解本质的学习就不能进行下去。不管是Operating System的Kernel编程,还是DataBase的B+树数据存储,亦或是TCP/IP协议栈的实现,甚至是Java虚拟机的功能实现,都离不开C/C++语言。如果害怕这门语言,那了解底层原理,读懂底层代码就无从谈起。自己所谓的本质主义思考也就是不可能的。

对于未来,我计划的CS自我学习提高放在以下两个方面:

第一,看书。这次由于环境所限,要挑战一下第一次看全英文的书籍了。我希望能在上课之余先完成《C++ Primer》的阅读,每天50页,共需一个月的时间(一定一定要注意阅读速度,速度就是一切)。之后,再说Effective系列的书籍阅读。

第二,项目。能够把之前的CA Project完成是最好的,如果没有时间,那着重做好Compiler的课程作业也行。此外,还有自己从bilibili上看到的别人推荐的一些开源项目,也可以拿来阅读,作为自己代码风格的提高。

至于说额外的课程学习(CMU/MIT/Coursera上面的),估计要放在寒暑假期间了,毕竟自己也是有正课压力的呀,而且如果说遇到了EPFL的好课程,也是应该深入紧跟着学习的,不能完全偏废。平时如果真的还有时间和干劲的话,再考虑吧。