软件开发金科玉律之-不要重复发明轮子!
以前有个小朋友,特别有好奇心,也喜欢动手捣腾。有一天,他做出来了一个圆圆的,会滚动的东西,感到特别兴奋,到处去向别人展示自己的"新发明"。结果他发现别人一点都不稀奇,原来这个东西叫做“轮子”,早在几千年前就有了,现在已经发展出了上百种的不同规格、材质、样式,自己的这个相比之下太不完善了,根本不能算是什么发明。这个小朋友,现在就藏在我们的心里,尤其是经验不够丰富的程序员身上。
几年前我曾经做过一个项目,经过长时间的挣扎之后,项目依然失败了。主要的原因之一,就是我们重复发明了太多的轮子。事情是这样的,时任项目核心开发人员的 同事很有钻研精神,也相当自信,当时客户提出的一些基本功能,譬如用户管理、输入验证、内容管理等,虽然市面上随处可见现成的模块和控件,可他总是觉得那 些做得不够好,说不如自己重新做一个方便,而且重新做更能符合客户的特殊需求。我当时作为PM,虽然对此略有质疑,但看他自信满满很有激情,而项目时间也很宽松,就同意了。后来仅仅输入验证这个功能就推翻重来了三次,最终还是选用了一个现成的控件直接用,因为他做出来的太不具备通用性,十分难以维护;同时,用户管理模块也做得千疮百孔,极不稳定,出现了很多Bug和 考虑不周全的地方,最后也不得不去找现有的成熟的组件替换。结果,这些“重复发明轮子”的开发工作,不但耗费了大量的时间、金钱和精力,而且也没能发挥预 期的效用。事实证明,现成的控件“轮子”(开源的或收费的),经历过时间的检测和众人的改进,总比自己重新捣腾出来的要更成熟、更稳定,同时也更加省事、 好用。我们在这个项目中花费了这么多时间、金钱、心血,终于证明了“不要重复发明轮子”这句话是很有道理的,这个惨痛的教训让我迄今记忆犹新。
虽 然此事已经时过境迁,但近些年来我发现有很多人都在“重复发明轮子”,尤其是在我们软件开发这个圈子里面,年轻的小伙伴们充满了发明轮子的欲望和激情,就 好像那个可爱的小朋友一样。因为他们觉得这样做会让自己学到很多东西,如果做出来了也会很有成就感。确实,成长和成就的确是他们所需要的东西。可如果你是 客户,你会愿意为此承担更高的费用和风险么?如果你是项目经理呢,在成员练手跟项目成功交付之间,哪个更重要?
我觉得如 果出于练兵的目的,重新捣腾一个轮子出来当然是个好方法,就好像比赛开始前反复练习投篮一样正常。可如果你已经上战场了,已经开始比赛了,已经去帮客户做 项目了,这时候才来练习是非常不合适的。因为你很可能会因此而输掉比赛、丢掉客户,而且因为你极其不专业的表现,会影响你的职业生涯。所以在公司里面,应 该明确区分什么时候是练兵,什么时候是上阵,一定要杜绝上阵后才练兵的不专业表现。换句话说,工作中不要重复发明轮子,要练习投篮下场后自己慢慢练去,不 要轻易浪费在赛场上的出手机会,just beprofessional.