什么才是软件开发中最佳实践呢?
“描述⼀个事物,唯有⼀个名词定义它的概念,唯有⼀个动词揭露它的⾏为,唯有⼀个形容词表现它的特征。要做的,就是⽤⼼去寻那个名词、那个动词、那个形容词……”
—— 福楼拜 (Gustave Flaubert)  我想讲个故事。
  很久很久以前(⼀般讲故事都是这样开头吧), 两个⽼⼯程师在⼀起聊天,谈各⾃⽣涯中最⾃豪的⼯程。其中⼀个先讲述了他的杰作:
  “ 我们建造的桥,横跨⼀个峡⾕,峡⾕很宽很深。我们花了两年时间研究地质,选择材料。聘请了最好的⼯程师团队来设计⽅案,⽽这⼜花了五年时间。 我们签下了最⼤的⼯程队,委托他们建造基础结构、塔墩、收费亭,以及⽤于连接桥梁和⾼速公路的道路。桥⾯下层是铁路,我们甚⾄还修了⾃⾏车道。 那座桥花费了我数年的⼼⾎。”
  另外⼀个听完之后,陷⼊了沉思,过了⼀会⼉,说到:
  “ 有⼀天晚上,我和⼀个朋友喝了点伏特加,然后我俩扔了⼀根绳⼦,越过⼀个河⾕。呃…… 就是⼀根绳⼦,两头系在两颗树上。 河⾕两边各有⼀个村庄,起初,有⼈加了个滑轮,⽤来传递包裹。然后,有⼈拉起了第⼆根绳⼦,勉强可以⾛⾛,虽然很危险,但⼩伙⼦们很喜欢。 后来,⼀⼈重新修建了⼀下,
使得更牢固。于是,⼥⼈们也开始从上⾯⾛,每天带着她们的农产品过桥。 就这样,在桥的另⼀边形成了⼀个市场。因为地⽅开阔,造了很多房⼦,慢慢地发展成了⼀个镇⼦。 绳索桥被⽊桥替代,这样就可以⾛马车了。 后来,镇上的⼈们修了⼀座真正的⽯桥。再然后,⼈们⼜把⽯料改成了钢材。 如今,那座钢构悬索桥依然伫⽴在那⾥。”
  前⼀个⼯程师沉默良久,说到:“ 有意思。我那座桥建成⼤约⼗年后,被拆除了。事实证明我们选错了地点,建好的桥没⼈⽤。据说有⼏个野路⼦的家伙,在下游⼏英⾥处,拉了⼀根绳⼦,所有⼈都从那⾛。”
⾦门⼤桥(旧⾦⼭)
  我很喜欢这个故事。故事的出处,在⼀款消息队列产品—— ZeroMQ 的官⽅指南第6章⾥。
  说完故事,我想聊聊软件开发中,常常可以听到的⼀个概念 —— Best Practice :最佳实践。Wikipedia 上对其解释为:
A best practice is a method or technique that has been generally accepted as superior to any alternatives because it produces results
that are superior to those achieved by other means or because it has become a standard way of doing things. 
  (最佳实践是⼀种:因其产⽣的结果优于其它选择下的结果,或其已经成为⼀种做事的标准,从⽽被普遍认可优于任何替代⽅案的⽅法或技术。)
  这个概念源于管理学,然后在 IT 界泛滥。简⽽⾔之,就是所谓“正确的做法”。
  最佳实践本⾝是美好的存在,犹如夜空中的⼀轮明⽉,照亮⿊暗中的⽅向,指引着摸索前⾏的凡⼈。
  但凡事有度,⼦⽈:“过犹不及。”
程序员培训机构去到极客时间  我今天想说的,就是这⽉亮的背⾯。(传说中,⽉球背⾯隐藏着…… 嘘~)
潮汐锁定导致⽉球永远以同⼀⾯朝向地球
  ⾸先,最佳实践容易带来思想包袱,让⼈⽆法专注于解决问题本⾝。
  总是希望采⽤最好的技术⽅法,不愿意在不正确的做法上浪费时间,导致瞻前顾后,甚⾄裹⾜不前。此时的最佳实践,已然成为了⼀种毒药,⼀旦偏离了问题本⾝这个出发点,就会不知不觉⾛进“宏⼤构想”的思维陷阱。把简单的问题复杂化,阻碍了迈出第⼀步,直到能规划出“包罗万象”的解决⽅案后才肯动⼿,拖延症就这样来了,时间却⾛了。
  你想好了未来每⼀天怎么过吗…… 没想好? 那……不活了?
  其次,对最佳实践的执念容易让⼈钻⽜⾓尖,将⽬标的重⼼带偏。
  过度关注实施过程是否符合标准化,忽视了项⽬中其它重要的东西,⽐如⽤户体验,⽐如实际需求。就像故事⾥讲的那样:第⼀座⼤桥,⼏乎是教科书般的标准化路数,可产品落地后和客户需求却差了好⼏英⾥;第⼆个看上去很野路⼦,但精准地解决了痛点,从始⾃终都是紧紧围绕实际需求迭代,每⼀次的进步都可以产⽣效⽤,这才叫杀⼿级应⽤。
  这让我想起了 Plan-9 的传说。
  你听说过 Plan-9 OS 吗? ⼀款由贝尔实验室的极客们打造的⽤于完善 UNIX 不⾜的操作系统。什么不⾜?在 UNIX 的哲学中,有⼀条叫做 “⼀切皆⽂件” ,但实际上UNIX本⾝并没有严格遵从这⼀条。于是,Plan-9 OS 完美实现了这⼀点。然后呢……? 没有然后了。它从没进过市场,所以如果你没听说过它,⼀点也不奇怪。Plan-9 OS 没有解决任何现实问题,没⼈在乎 “⼀切皆不皆⽂件”。
  这种执念的另⼀种表现就是⼯程师思维,沉迷于奇技淫巧中⽆法⾃拔,程序员尤其容易中招。
  ⽐如性能优化。“优秀的程序员应该榨⼲每⼀字节内存”,听起来很熟悉,不是吗?但经济学上来讲,边际效应决定了⼀次项⽬中,越优化性价⽐越低。有⼀个很容易被忽略的事实:硬件其实⽐程序员要便宜。
  再⽐如对设计模式的崇拜。设计模式当然是好东西,但如果像强迫症⼀样使⽤它们,坚持⽤上它们才是正确的编程,就会导致按图索骥,强⾏让问题去适应设计模式,⽽不是让解决⽅案针对问题,这就本末倒置了。
  我有个基友,C++ 极客。毕业后⼊了腾讯,积累了巨额财富后,⾃⼰创业了。当然,当⽼板可⽐写 C++ 难多了,于是现在⼜去积累巨额财富了。想当年和那厮聊天,⾔必出设计模式,没事侃正则,再没事就研究 GC 策略 (好像玩 C++ 的普遍这德性) 。前不久看他代码,差点没认出来,这家伙画风⼀转,现在连接⼝都懒得多⽤(估计看到这,某些狂热分⼦肯定在破⼝⼤骂:你什么意思,你说你没⽤⾯向接⼝编程?)那位兄台甚⾄都懒得多聊,轻描淡写来⼀句,“没⼼思,以后有需要再加。”
  顺便扯⼀句,那哥们最近负责开发⼀款⼿游,他跟⽼板汇报的时候,预估的研发周期要12个⽉,然后⽼板跟他说:“好,12⽉出公测。” (哈~ 估计他肯定⾆头打结把“12个⽉”说成了“12⽉”)。看到这的你,是否回忆起了你的⽼板?
  这也是我接下来想说的关于最佳实践的另⼀个问题:项⽬实施。
  ⼯作数年,⼤⼩项⽬经历若⼲,慢慢体会到,⼀个项⽬的开发顺利与否,并不在于技术选型是否为最佳实践,更多的时候,取决于开发⽅案和技术储备之间的平衡。做项⽬毕竟是要讲⽅案落地的,如果最佳实践中的技术成本,超出了开发者的落实能⼒,那就是坑,这时盲从最佳实践⽆异于挖坟。如果
是⼀个⼈的项⽬,抽时间恶补⼀通,兴许能填填坑,这取决于IQ。但要是⼀个团队,那就不是什么 IQ,EQ,QQ 的问题了,这中间产⽣的学习成本,集体培训成本,反复沟通成本,⼤量的初级错误,千奇百怪的代码,互相冲突引发的焦躁情绪,等等。这些负⾯的东西如果不能妥善的处理,⾜以抵消掉最佳实践带来的好处。别忘了,deadline 正在迫近。
  我⾃⼰曾经在⼀个项⽬组⾥,强⾏推⾏ Git 做源代码管理,当时组⾥共9⼈,有7⼈只会 SVN,但我坚持 Git 是 “最佳实践”。要不说年少⽆知少不更事呢,罢了,后来的事情我不想回忆了…… 那次项⽬之后,我再也不在⼀只会 SVN 的队伍⾥提 Git 了。
  ⼀个⼈做软件已经很难,⽐这更难的,是⼀⼈做软件。
  当尘埃落定,蓦然回⾸,最佳实践很可能没你想象中那么重要。它更多的是⼀种精神层⾯的求道,并⾮物质世界的必要。
  扎克伯格 ( Mark Zuckerberg ) 于2004年在哈佛柯克兰公寓 ( Kirkland House ) ⾥写出 TheFacebook 的时候 ( 次年更名为Facebook ) ,⽤的是“世界上最好的编程语⾔” PHP。这门可能是业界被吐槽次数最多的语⾔⼀直⽀撑着FB帝国的诞⽣,直到席卷全球。Stack Overflow 的联合创始⼈ Jeff Atwood 曾公开揶揄 Facebook 是⼀家 “召集全球顶级程序员在 Windows XP 上写 PHP ” 的公司。但这⽆所谓,⼗四年前的马克也不纠结。⼀直等到需要的时候 (2010年),Facebook⾃⼰动⼿研发了⼀个编程语⾔ —
— Hack,来解决 PHP 带来的危机。
《社交⽹络》
  最佳实践,关键在时机(Timing)。
  如果说⽤ Facebook 这个 “根本不存在” 的⽹站来举例,纯属虚构的话,那我们来说点真实的例⼦,Web 技术的基⽯——HTML。由20世纪最重要的100⼈之⼀的 Tim Berners-Lee 创造的 HTML,其发明之伟⼤,⾜以单独开篇博⽂来赞美了,这⾥就不赘述了。
  这样⼀个造福全⼈类的神作,本⾝的设计结构绝⾮完美,甚⾄可以⽤混乱不堪来形容。没有严格统⼀的约束,形同虚设的规范,标准化进程的难产。以⾄于在很长⼀段时间内,连⾃⾝元素的定义,都可以向浏览器⼚商妥协。但是,种种被⼈诟病的存在,丝毫不影响 HTML 改变世界的脚步。你我今天能相会于园,皆仰赖它的诞⽣。
  同样的例⼦还发⽣在 Web 世界另⼀个巨擎上——JavaScript。当今世界,Web 前端技术已经⽔银泻地般肆虐整个开发界,前端框架百花齐放、JS 衍⽣品鳞次栉⽐。所有这⼀切的背后,全都源于上世纪90年代横空出世的 JavaScript。
  那么,JavaScript是最佳实践吗?
  别逗了,如果有什么语⾔可以和刚才说到的 PHP 竞争⼀下谁被骂的次数更多,那⾮ JavaScript 莫属。这个仅花了⼗天设计出来的语⾔,打⼀出⾝就被贴上了怪胎的标签。混乱的标准,多样的实现,安全漏洞,语法随意,反⼈类…… 总之,JavaScript 和最佳实践半⽑钱关系都扯不上,但它却是撑起当今互联⽹半壁江⼭的擎天柱。
  所以,⽤最接地⽓地话来说,不管⿊猫⽩猫,逮着耗⼦就是最佳实践猫。
  汝之蜜糖,吾之。所谓最佳实践,其定义本⾝往往也是分歧的源头。什么是最佳?这个最佳是独⼀⽆⼆的吗?世界上有很多很多现实问题,可能根本就没有所谓的最佳实践。
  请听题,世界上最好的编程语⾔是哪个?
  第⼆题,世界上最好的⽂本编辑器是哪个?
  朋友,这天还聊得下去吗……
  最后,说⼀个我⾃⼰的故事。
  很久很久以前,为了⼀款满意的⽂本编辑器,我⼲了⼀件可能是前⽆古⼈,后不知道有没有来者的蠢事 —— 我打开 Wikipedia,搜索 “ text editor
” ,然后转到⼀个叫做 “ List of text editors ” 的页⾯,接下来的⼀个⽉,我⼏乎把当时那个页⾯上,所有我能下载安装的⽂本编辑器,全部试⽤了⼀遍……
  嗯?你问我为什么这么做?呵呵,不把全世界的⽂本编辑器遍历⼀遍,我怎么知道哪个是最好的?
  这事细节我不想再提了,我也不想回忆了。要不说年少⽆知少不更事呢,时⾄今⽇,我想不出⽐这更愚蠢的事了。WTF~~
这个页⾯上的表格⾏数逐年增多
  如今,再有⼈问我最好的编程语⾔或者最好的⽂本编辑器的问题的话,我会说: 
  “朋友,要打架吗?” 
  这两个问题的最佳实践,唯有暴⼒。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。