Dare To Think, Strive To Execute

当我写分布式算法的时候在想些什么

  前一段时间参加一个电信举办的天翼杯大数据比赛,让我好生反思了自己前半年的工作,以至于当天晚上我难过得失眠了半宿。这半年我总共写了五个分布式算法,涉及了图计算、矩阵分解、监督学习,从数量上讲不算少,小辉老师跟我们说我们的BDALib已经有30000多行代码了,考虑到我的贡献,5000行应该还是有的,scala本身是比较精炼的语言,另外每次写完还有code review,我对这个数量还是挺满意的。可是当我需要用到这些算法的时候,我竟然觉得自己写的代码不可靠,要不是数据量达到一定规模,我是决计不愿意用自己写的算法的。同样是实现了Factorization Machine, 尽管我更清楚自己写的算法的逻辑,但是我还是更愿意用LibFM。当我抱着试试的态度用我的算法包跑上G的训练数据的时候,中途果真是崩溃了,我感觉我被这意料之中的事实甩了一记响亮的耳光。

  当天晚上我就一直反思我写BDALib的意义,从我的角度而言,我深入地知道了这些算法的逻辑,更加熟悉了spark以及Pregel等分布式系统以及分布式框架的使用,知道怎么优化算法,提高可扩展性,用在年末工作汇报大boss的话说,我的工作对自己的提升是很明显的。可是,我也觉得写了若干算法,只有为数不多的能经得起上亿规模数据,鲁棒性不可知,也是件极其悲哀的事儿。我想如果有一天别人问我,我的那些基于spark平台的机器学习算法如何的适合,我可以拍拍胸脯告诉他,如果哪一天在一个场合可以用到她,我会毫不犹豫的选择自己的算法包,那样我就知足了。写多了那种写完了过两天就没用的垃圾代码,可想而知内心对自己的鄙视。当自己在不断成长地同时,这样的事实真是让我越来越不能淡定了。

  这里我想起了自己曾经写的一个感悟。

  大部分事儿,不好好坚持下来意义不大,比如学了一年就没怎么用心的摄影,比如偶尔想起来会去游泳健身,比如一时兴起才会看看的严肃书籍,并没有多大用;因为我不好意思说自己会摄影,只好说我会用单反,我也不好意思说我健身,或者我的身体并没有很大的改善,因为我并不怎么健身;我不好意思说我了解政治,通晓历史,因为我只是知道一些边角料罢了。

  当我离找工作的日子越来越近,当知道我不懂得越来越多,这个时候我更希望自己能坚持自己的初衷,写一个鲁棒、性能不错、可扩展性强的分布式算法的意义远比草率地写好多坨垃圾代码强的多。写代码真的是个精雕细琢的活,即使是写好了,测试也是件不容忽视的过程。想想当初我跟大boss信誓旦旦地说我们的BDALib有code review,有算法的设计文档,有单机版本,有详细的测试报告,有友好的API,这是多么的naive。 单元测试有了,可是有实例测试有几个,有小数据集中等数据集测试,上亿规模的数据集测试过了么?做工程,学习的过程已不仅仅是掌握其中的技术原理,更要紧的是要明白做工程的态度,做精致做细节。路还有很长,踏踏实实,不骄不躁,莫要心大,以此自勉。

  在我写这篇自省的博客的时候,队友告诉我,我们初赛进入了前十,我们用了十天的时间达到了这个效果,还是非常欣慰的。另外这也给我一个警醒,趁着第二赛季的大数据还没来,早点提高BDALib中算法的鲁棒性。

  当我写分布式算法的时候,我不是在想我要学会用spark,不是在想搞懂这个算法,我在想我要搞一个“简单可依赖”的分布式算法包。