Fergus Henderson 是 Google 的资深工程师,他领导着google的 Text-to-speech 开发团队。过去的十多年来,他在 Google 还开发了编译工具 Blaze,以及语音识别和声音操控产品,这些技术和产品是 Siri 的前身。
2017 年 1 月份他发布了一本书,叫做 《Google 软件工程》,介绍了 Google 公司在软件开发中的工程方法。
这是一本薄薄的只有 20 页的书,概要介绍了 Google 软件工程中的“软件开发”、“项目管理”、“HR 管理”。其它部分回头再细说,其中一下子吸引了我的,是“软件开发”部分的第11节,该节介绍的是 Google 公司如何“频繁的重写代码”。为了便于大家领会,这里附上我的翻译。
频繁的重写代码
Google 的大部分软件,每过几年,就要重写一遍
这样做无疑是成本高昂的。确实,重写代码耗费了 Google 很多资源。然而,这种做法也带来了巨大的好处,对于 Google 的能力提供以及长期的成功,可谓至关重要。一般来说,每过几年时间,产品的需求就会发生巨大的变化。这种变化是随着产品周围的软件环境和其他技术的变化而发生的,而且技术和市场的变化,也影响了用户的需求、欲求和期望。 用过几年的软件,都是在过去老的需求下设计的,其设计思路并不适应当前的需求。还有,老的软件通常复杂度上升。重写代码就能够降低复杂度,造成复杂度升高的那些历史包袱是完全不必要的,它们所应对的需求已经不重要了。另外,重写代码也是转移知识的好方法,同时还给新加入的团队成员带来主人翁的感觉。这种主人的体验,对于提高生产率是必不可少的: 当工程师们感到软件是属于“自己的”,他们才会投入忘我地开发功能并解决问题。频繁的重写代码还能够鼓励工程师在不同项目之间流动,这种流动将多样化的、新鲜的思想带到项目中来。 频繁的重写代码,也有助于确保代码所用的技术和方法都是最先进的。
先说这一句:“另外,重写代码也是转移知识的好方法,同时还给新加入的团队成员带来主人翁的感觉。”
这个说法雷人雷到外焦里嫩。地主家真的有余粮啊! 为了让收麦子的长工们有主人翁的感觉,干脆烧了装满陈粮的仓库.......这就是有钱人的风格啊,买豆浆要买两碗,喝一碗倒一碗。
还有这一句:“重写代码也是转移知识的好方法”。 眼前立刻浮现一个场景:开发经理发愁的对部门经理说离职员工的代码交接工作不顺利,部门经理大手一挥说,小鬼啊,思想再开放一些嘛,步子再迈大一些嘛,把代码重写一遍就不用交接了。
当然,这些都是开玩笑。代码重写一直是个少有人关注、少有人研究的课题。通常,都是产品不成功,或者产品实在老到没法再用了,我们才会考虑重写。这都是发扬了我们节约的好传统,软件也都是补丁摞补丁鹑衣百结。经常能看到一些软件产品,已经用了10年,20年都不新鲜。Vb的,Delphi的,开发团队要小心翼翼的维护那早已停止支持的开发环境。
在软件产品还能够运行,甚至运行情况良好的时候,就痛下毒手,行霹雳手段开始重写,这人心得多狠呢。
这句话:“一般来说,每过几年时间,产品的需求就会发生巨大的变化。这种变化是随着产品周围的软件环境和其他技术的变化而发生的,而且技术和市场的变化,也影响了用户的需求、欲求和期望。 ”
女孩们应该最喜欢这句话,把其中的产品换成服饰看看:“一般来说,每过几年时间,女士服装的需求就会发生巨大的变化。这种变化是随着时尚的环境和其他潮流的变化而发生的,而且市场和潮流的变化,也影响了女士们的的需求、欲求和期望。” Google 就像白富美,一柜子的衣服,每件只穿了一次两次,马上就换。常常在早上发愁,没有合适的“貂儿”来配今天的指甲油。
重写代码来降低软件复杂度,去掉其中无用的那些功能和特性。维护过产品的人,都应该深有体会,看着那叠床架屋的功能和代码,心里仿佛塞满了稻草。要查个 Bug,做个调试,那心头有一万头草尼马呼啸而过。唉,歧视啊歧视偏见啊偏见,不论是软件,还是女朋友,程序员们都喜欢简单、纯洁的。带着心已沧桑、满腹故事的她去看旋转木马,虽然一样浪漫,但毕竟她已爬不上木马了。所有的程序员都不愿意维护别人的老代码,都宁愿重写.......然后留下自己的老代码,让别人发愁。
重写代码,较之优化和维护老代码,区别仿佛革命与改良。在社会层面,人们已经从上个200年的革命热情中,冷静下来,认可改良主义,认可保守主义。但是,代码的社会,与人的社会不一样,人存在习俗、惯性和新旧利益之争,而代码扔掉也就扔掉,没有旧代码会抵触,也不需要做思想工作。可以说,只要你舍得浪费,扔代码比甩男朋友女朋友容易得多。
Google这样的大土豪,当然不必考虑成本了,它投资个几百亿美元就跟我们苦逼程序员买个机械键盘一样轻松。但我这样穷苦出身的程序员,总是对扔掉的代码、浪费的人月,感到心疼不已。平常吃个饭,都要把米粒扒拉干净,可想而知,扔掉十万行还可以运行的代码,那就跟割肉差不多了。乡亲们那,这是要遭雷劈的啊.....
我觉得,早晚的,科技界会出台“代码伦理”或者“代码法”,用来约束对代码资源的浪费。就像管理垃圾的《垃圾处理法》......
不过,要想产品好,就不能太小气。农村老太太用破布烂棉花纳鞋底的价值观和工作方法,并不适合今天的科技界啦。该扔就扔吧,历史的潮流要向前,女人的衣服要时尚。做不到象Google 那样土豪,人家每几年重写一遍,咱们可以每十年重写一遍。钱紧张,没有预算? 那就少喝一碗豆浆,别涂指甲油,也别穿貂,更别去骑旋转木马,省下钱来雇程序员。再穷不能穷软件,再苦不能苦程序员。软件产品,还是要追求精益求精的。下定决心、排除万难,团结一心向前看,马上开始重新写......程序员们摩拳擦掌好兴奋。
只是,重写后,新的一定比老的好吗?
全世界的程序员都笑了:好还是不好,那还不都是听我们的?