我的2020
我的2020
转眼又是农历新年,家家户户辞旧迎新。在年交之时,总结过去,展望未来,这是去年我给自己定下的目标。不过,去年有个漫长的暑假,于是又给自己的研究生生涯做了计划。这样一来,年更的总结反倒像是半年更的了。
虽然说是2020年的年度总结,但说实话,我对毕业之前在学校待过的匆匆一月也没有太多印象。记得的事也不过是提交实习项目报告和毕业设计两件事。实习报告由于疫情直接变成了自选项目报告,拿了个以前写的Todo List当模板,写了下实现的思路就交上去了。毕业设计则相当地水,然后我在演示的时候竟然出现了Bug,幸好老师不追究,也就匆匆水过。但是那个Bug其实也就是一行代码的关系,事后稍作修改,也就过了。
毕业之后是漫长的暑假。暑假的前一个月,我隔天交叉学习MIT6.824和SICP。6.824实在让我受益匪浅,作为分布式的课程实在是再合适不过。而SICP则似乎名不符实,知乎上盛赞其是程序员的内功,毫不吝啬溢美之词。然而,学完以后我只觉得这门课的价值并没有那么高。这门课中提及的模块化的抽象,黑盒以及流式计算等概念实在太过经典,以至于每一个计算机专业的学生都不可能没有听过,因此再花费一些时间去重新学习用Lisp怎么表达和处理这些概念实在有些浪费。正如在《MIT为何停掉SICP》中提到的“Sussman 指出,现代的软件工程师们的主要工作是为那些他们并不完全理解的复杂的硬件(由于商业机密的缘故,也不可能理解)而写代码。软件层面也存在同样的情况,编程环境是由无所不能的巨大的程序库构成”,SICP的所教授的知识更像是用来独立编写一个模块或者是开发整个软件所需要的知识,而现代分工过于细化和追求商业利益优先而进行的敏捷开发则与其背道而驰。不过,我依旧不能否认当我发现Lisp可以用两个操作写出自己解释器时的赞叹之情。
九月份正式报到,算是开启了研究生生涯(虽然有点水)。流水账地回顾一下这半年的生活。九月份已经大致明确了将来要做的方向,要么分布式数据库,要么后台开发。因为6.824的余毒未清,所以九月份都在看一些额外的论文,Dynamo之类的。所以十月份主要在看CMU15-445的视频,给数据库打个底子并且写相关的课程作业。十一月份则是读《数据库系统概念》,再把MIT6.824的作业认认真真地做完。十二月读了交大出的《现代操作系统》,也读了一些RocksDB的源码。一月份的前一个星期和后一个星期在做TinyKV,而中间两个星期由于考试的缘故,在疯狂划水。
这几个月的学习,也基本是让我决定了走上分布式数据库的道路。
回忆起来,其实每个月的学习还算Solid,这些东西写简历上去找一个不那么好的实习也够用了。但是半年的时间实在是太紧了,分布式的基础理论刚刚入门,数据库的知识也仅仅是了解了个大纲,与这两者相关的计算机网络和操作系统都没有针对性地深入地了解。这些基础知识都只局限于408的范围,如果想要真正在这个方向走下去,必须要有能力修改底层的Linux源码或者自定义通信协议。
不过,值得庆幸的是,我对于Raft算法已经有了一定的理解,至少所有关于Raft的问题,我都有信心答上来。另外,数据库的事务的隔离级别和实现,我也有一套可以自圆其说的理解。但是对于SQL Plan的生成,SQL的执行都还有从理论到实践的距离,毕竟14-445的实验实在算不上有工业级的质量。
这里不妨结合我对分布式数据库的理解,做一个简单的知识梳理。分布式数据库有两大块的知识,分布式和数据库,其中分布式的通信涉及计算机网络,数据库的优化涉及操作系统,正如我上面说的,这两块知识是我必须补齐的。分布式数据库和单机的数据库区别在于两点,一:单机的数据库存储数据具有上限,所以必须将一张表的数据Split到两台机器,这一块负责的是拓展性,可以用Shard做到,二:由于大多数服务需要很强的可用性,所以分布式的数据库还需要提供备份的功能,这一块负责的是可用性,可以用Replica做到。在Shard时,我们要考虑单机数据库事务的ACID的要求,其中,Isolation和Atomic有别于单机数据库。其他的两个概念,Consistency本来就是不准确的概念,需要通过其他三个来保证,Duration和单机一样,都是用WAL来实现的。Atomic其实就是要求一个事务要么在所有机器上都执行,要么都不执行,一般使用2PC来解决这个问题。Isolation在单机中三种实现方案,2PL,TO和OCC,貌似被使用的只有2PL和OCC。这里也对应两种方案,Percolator使用2PL加2PC来解决A和I,Omid使用OCC加2PC来实现A和I。而Replica则比较简单,只需要在一个Group里执行Raft或者Paxos算法就可以了。另外,在读取完需要的数据以后还要执行的Join或者Count等操作就要设计分布式计算的内容,这一块实在不太了解。其他的数据库内容,比如底层使用以LSM Tree为结构的KV存储还是参照传统数据库使用Page的存储都可以视为单机的问题。
最后一部分是对未来的展望和计划。
首当其冲的是表达能力,这么多次面试下来,最大的感觉就是不能将自己学的东西表达出来,并不是不会,而是开始面试以后说话不会深思熟虑,只想更快地回答问题。自我反思以后感觉有两个问题,第一个是心态问题:其实说句自大的话,我自己应该至少是华为保底的,那么大可不必那么害怕失败,面试本质是一个技术交流的场景,在这个场景里不会的就说不会,会的就尽可能地吹起来,不应该有太多的心理负担;第二个是对知识的梳理不够清晰,简历的东西其实都在我自己的脑子里,无非是记得清楚不清楚的问题,但是只有把所有的东西都清楚的梳理一遍,才能在说出来的时候有条理,有自信。我想对于这两点的解决方案是预设一些问题,然后反复地练习怎么回答,最后才能达到想要的状态。
先讲一讲离得近的计划——实习。目前直投了阿里的提前批,后面至少要投华为,微软,阿里,字节这几家,所以一个合理的顺序是必要的。我准备是按照华为,阿里,字节的顺序投,不写微软是因为微软的面试内容只有算法,和其他的没什么关系,不构成攒经验的说法,然后在华为和阿里中间应该还要加几家一般的公司。期望的目标是,希望能在微软先做几个月,然后到明年的三月份再去字节或者阿里实习。这么考虑是因为微软的实习比较轻松也比较近,所以能够有比较长的时间带薪自习,去了解数据库相关内容的实现,Linux源码和计算机网络,再学习一下C++的知识,最好能够看到Azure内部的文档,学习一下他们分布式数据库的实现。最后,准备充分以后再去面试大厂的核心数据库部门,开启第二段实习,实习到九月份转正,十二月毕业就能直接入职。
最后再聊一聊开源项目和GSoC。去年也说了,希望今年能够申请一个GSoC的项目,在给TinyKV提交过两个Pull Request以后,大概能了解到开源项目需要怎么样的贡献,另外,在学习分布式数据库的过程中也了解到很多的新技术,希望能把Proposal写得漂亮,详实一点,最好能申请到和数据库相关的工作。如果真的能够申请下来,那么这无疑是简历上的巨大两点。在开源项目方面,我非常看好PingCAP的前景。随着信息化程度加深,需要存储的数据指数级别增加,开源数据库必然是大势所趋,大厂有能力自己研发,小厂只能寻求开源的解决方案,MySQL的方案实在不够优雅,PingCAP的HTAP相当诱人。另外,我认为他们做Share-Nothing的结构也是出于小厂没有能力搭建分布式文件系统的考虑。如果能去PingCAP实习,也不失为一个好选择。
回顾去年,最大的收获是发现了自己过去四年都在白混,如果能在本科四年确定要学的东西并且认真学下去,那我应该能找到一份不错的工作。但是现在也算是因祸得福,虽说也不知道算不算福气,走上了分布式数据库的道路,如果能在这条路上走下去,应该能成为核心团队的成员,35岁危机也小一些。现在,我总算是知道了要学什么——分布式数据库,怎么学——看国外公开课,做作业,参与开源,希望我能在这条路上好好走下去。
最后的最后,祝我自己找到一份不错的实习,拿到GSoC的项目,学习未知的知识时能够融会贯通,走在历史的进程上。