6.824 Lab1 MapReduce

前前后后做了15个小时看到PASSED ALL 30 TESTING TRIALS的那一刻太爽

概述

这个实验要求实现经典论文MapReduce的模型MapReduce在Google内部是跑在一个服务器集群里的这些服务器共享一个分布式文件系统GFS这个实验只要求实现运行在本机多个进程上的本地文件系统上的MapReduce模型省去了与分布式文件系统的交互要做负载均衡这个很重要而且应该很麻烦

实现过程流水账

先读论文花了3h左右内心活动这论文真简单

然后开始实现我并不会go语言官网那个tour我也就做了一点点事实证明全做完比较省时间第一次写的代码全是if-else我还没有加入容错机制的时候代码已经复杂到我读不懂了内心活动工业界实现这玩意的人是神仙吧然后我把3个小时码的200多行代码全都回滚掉了:-(

第二次写代码之前我决定写一个类似于有限状态自动机的东西事实证明这个模型还不错让我的思路变得比较清晰并且便于拓展然后花了2h画图+搭框架就是只写了一堆switch-case每种状态对应的转移和转移前需要进行的操作的注释然后就头晕下班了

今天是第三次碰这个东西今天如果再自闭我可能就要对这实验产生心理阴影了好在我上次的DFA没啥大问题只是有些corner case没想到缝缝补补搞了一段时间终于把注释转换成了代码最戏剧性的一刻来了开码10小时后我终于进行了第一次编译我以为会得到巨长无比的报错结果报错就八九行然后就是改完一行错再出现一行错改完最后一行错之后又蹦出来十几个错误改了若干年……通过编译之后他在起始状态就出错了……然后又改了若干年终于输出了结果

第一个教训把语言学明白勤编译勤测试

我查看输出文件的前三行共两万行发现与标准输出一样然后高兴地去跑测试脚本结果第一个正确性测试点就挂了……

第二个教训测试要认真严谨

然后又改了若干年期间多次翻阅论文发现人家写进论文的东西都是经过取舍和迭代的还是非常精华的后来就是无限改bug调试按下不表终于在今天码代码的第8小时通过了所有测试

做的不错的地方

  1. 画DFA
  2. 头脑不清楚的时候出门转转可以花掉长达20分钟的时间但是回来之后你就复活了

想要做得更好的地方

  1. 阶段性编译测试例如我的DFA设计好了这时候就可以测试下转移有没有问题然后再在转移前后加功能
  2. 有设计测试点的能力对于这个实验我是用户而且一定程度上可以说是赶时间所以用老师的脚本来测试调试没有什么错但是一旦成为真正意义上的开发者bug都要自己找不提开源社区之类需要有能力设计若干测试来检验自己的代码在各方面的正确性/性能这确实需要写一些没用的代码但是它们通常很简单而且很有用如算法竞赛里的对拍程序和暴力程序例如我尽管知道各个操作的时间/空间复杂度但还是不知道我这个实现并发性如何究竟有多少CPU时间是overhead
  3. 证明我的DFA的正确性
  4. Challenge
  5. 阅读老师的测试脚本学习写脚本