“描述一个事物,惟有一个名词定义它的概念,惟有一个动词揭露它的行为,惟有一个形容词表现它的特征。要作的,就是用心去寻找那个名词、那个动词、那个形容词……”前端
—— 福楼拜 (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~~
这个页面上的表格行数逐年增多
现在,再有人问我最好的编程语言或者最好的文本编辑器的问题的话,我会说:
“朋友,要打架吗?”
这两个问题的最佳实践,惟有暴力。
本文已独家受权给脚本之家(ID:jb51net)公众号发布