mit 6.824 - (sunznx) 振翅飞翔
25 April 2021

最近完成了 mit 6.824 的所有 project,花费大量的时间,基本上是把能踩的坑都踩了一遍。

完成这个课程的感想:
首先,我觉得分布式是困难的,测试和调试都非常麻烦,特别是测试。能完成课程里面的 4 个 project 全靠看测试用例的提示。在写 raft 协议的时候,每当我觉得这样写似乎是正确了,马上又会被下一个 TestCase 打败,然后会发现以前的路走错了,得重头再来。

试想这套软件如果是在生产,如果没有这么全面的测试用例,每当你上完线,以为功能正常了,冷不丁的就会有用户提 bug/issue,然后你才会恍然大悟『emmm,哪里哪里可能有问题,哪里哪里得加日志才能复现问题』。这样做出来的产品用户体验会很糟糕,越复杂的系统,开发和测试都是很重要的。

其次,现在很多人都喜欢说『代码不重要,思想重要』。站在『大神或者不写代码的那批人』的角度来看,这个说法似乎成立。这个课程基本上是围绕着 raft 的论文来实现的,这个是『思想』。但是当我照着论文去实现的时候,很多细节的疏忽,都会导致实现错误。还是要对代码保持敬畏 :)

在并发环境错综复杂的情况下,用 lock 基本上会让代码的逻辑混乱,lab 所有的代码中,最后都是用的 channel 来实现。

最后,在平常的工作写的代码基本调用链路都很短『基本都是 curd』,代码实现的时候也不会很多逻辑分支,这个课程里面的 project 有时候分支是比较多的。比如,在 lab4,做 shard 迁移的时候,怎么迁移,迁移的时候挂了怎么办,迁移到一半收到 key 怎么办,日志怎么 apply,日志 apply 到一半为什么死锁了。很多问题都是要实现在纸上计算好,急急忙忙动手写代码会导致一些细节点被遗漏,重新往里面加,代码很多又要重写。

接下来会写几篇文章,总结这个过程。


相关阅读