软件开发中的最佳实践是什么?
英文原文:What Is a Best Practice in Software Development?
刚才,我在 Pluralsight 网站发布了一个教程,标题为“促成商业交易的最佳实践”。 (如果你想阅读、但没有 Pluralsight 账号,请注册右边侧栏中的邮件列表,我将给你发送一份免费的 30 天订阅)。这个标题有个不太认真的元素,它在媒介上或许不是必要的最好想法,我这里的好处是和标题吸引力最大化有着关联。但是,如果你在笑,生活会更加有 趣。
不管怎样,它有些不太认真的理由是,我发现“最佳实践”这个术语在很多语境中是骗人的。最好情况下,它是模糊的、主观的、和语境高度相关的。本 质上,这个课程的目的是,“嘿,如果你认为,你的团队应该采用 X 实践,那么你最好搞清楚在管理上得到纯利益的东西——‘最佳’实践是有利可图的实践。”因此,我想可以送出这份教程介绍部分的副本,我在这个部分详细讨论 了这个术语。事实上,第一部分称之为“‘最佳实践’究竟是什么?”
最佳实践:理想的、真正的和愤世嫉俗的
我提供的“最佳实践”【注1】的第一个定义是,某个人或许将其描述为“官方”版本,但是我把它称作“理想版本”。维基百科对其定义为,“为持续 有效地达到企业目标而采取的最成功的解决方案或解决问题的方法,它被用作一种基准。”换句话讲,一种“最佳实践”,多多少少在经验上验证过是最好的一种实 践。举个例子,如果你准备鸡肉有三种可能方法:生的、半生不熟、完全熟,那么根据死亡和疾病的事故次数,完全熟将显现为一种最佳实践。我把这种定义称为 “理想”的原因是,它意味着明确地有一种做某个事情的最好方法,现实生活很少如此齐整。拿鸡肉的例子。完全熟好于半生不熟,但是并不缺乏完全弄熟鸡肉的方 法——你能用火烤、用烤箱、用烤炉、有油炸等。任意一条这些方法是经验上认为的“最佳”、或者它变成了偏爱和看法的一种方式?
这导致我将轻率地将其称为最佳实践的“真正的”定义,我的意思是,这也变成了最被普遍应用的定义。它通常被称作是做某事的、可接受方式的一种约 定,经常为某些标准机构所推崇,比如 ISO 或其它类似的机构。从这个角度看,或许,关于最佳实践的更好名字可能是“标准化实践”或“可接受的实践”。关于这种情况的例子或许是,外科医生洗手的优先 级要高于外科手术。它是如此地被广泛接受且被标准化地实践,以致于那些不遵循此实践的实习生,会让人心生反感。洗手相较于不洗手,在病人治疗效果方面已经 从经验上被论证为是更好的了。在该领域,外科医生令人信服地在手术之前洗手,那么这种洗手是绝对的“最佳”实践吗?好吧,这个哲学问题相对于我把最佳实践 称作“理想的”定义,不是特别重要。重要的是,洗手是有好处的、且广为接受。
现在,谈谈愤世嫉俗的定义。对于很多人来说,“最佳实践”基本上是一种无意义的漂亮口号,让一个人的行动看起来比实际情况更重要、更合理、或更 正当。我敢肯定,不只是我听到人们把“最佳实践”的术语挂在嘴边,以此评判人们的行动,明显的是,这种实践既没有在经验上被论证为最好的可能实践,也没有 受到规范或标准组织的通过。你将经常听到开发人员把他们解决某些问题的方法谈论为一种“最佳实践”,当他们在高资历的位置、或控制着组织的技术决定时,就 更明显了。但是,它是一种真正的最佳实践吗?或者,他们只是使用这个词语来避开争论?
通过考虑这三种定义,我们可能定义成一种连续统一体。愤世嫉俗版本在最佳实践术语的使用上,有着最少的可信度,而理想版符合这个术语防弹的用 法。这样,有人把某种实践定义为“最佳实践”,如果他不能提供证据,就符合愤世嫉俗版。如果他成功地论证了价值,并建立了一种正当的标准,就符合真正版; 如果他或多或少地论证了这种实践基本上是可能的最佳实践,就符合理想版。
软件开发的“最佳实践”
我们已经讨论过了“最佳实践”术语的一些定义了,接下来说一些例子, 它们通常在某种程度上提到了最佳实践,或者我刚才提到的连续统一体。我打算讨论一个小组或组织中的某些具体东东,比如你们的设计师认为,一个小组的“最佳 实践”就是使用她写的校验资源库。我也不打算讨论家喻户晓的、已经定义好的行业实践。不是这些实践没有被一致通过或没有他们的诋毁,而是多数开发人员貌似 看到了采用的潜在价值,即使他们相信,可能地,采用的价值比其成本和麻烦更加重要。换句话说,可能是相信某些东东是最佳实践,而不是值得这样做。
下面是软件开发领域里的一些例子。
- 敏捷方法论如日中天。现在整个行业都在致力于帮助公司采用敏捷实践。
- 自动化测试几乎被普遍赞同而作为一种值得赞美的目标。
- 测试驱动开发或许更多地归结为有争议的影响,但是根本就不缺乏那些认为这是最佳实践的开发人员。
- 持续集成,相对于仓库分支的开发,有着大量的合并工作量,很大程度地被视作有益处。
- 有原始的、所谓的 Gang of Four【注2】面向对象设计模式清单,但是模式清单已经扩大了,超过了这四位作者建议的清单。总之,在策略上使用这些模式被视作为一种最佳实践。
- 代码审查广泛被视作是促进代码质量的、不可或缺的方法。
- 结对编程把代码审查带到了下个阶段,让开发一直处于连续的审查状态。
- 一键化自动开发,对于大多数组织而言,被视作重要目标;与之形成鲜明对比的是,某个劳动力用半天时间,才能让软件达到可部署状态。
上面的清单不一定是全面的,可能也不是没有争议的。你可能认为其中一条或几条甚至不是优秀的思路。然而,总的来说,这个行业已经朝着一个方向前进,一种背道而驰的视角。不论好坏,这个行业共同认为,这些都是值得达到的目标。
但是,在共同维护一种优秀思想的利益和昙花一现之间,有一条分界线。在传统智慧和普遍误解之间,有一条分界线。该怎样才能知道这些实践是真正的优秀思想,更重要的是,该怎样知道这些实践对他自己和组织是有好处的?
喔,这就是本教程的主旨(这里有个暗示——向钱看)。
要点
我是一名软件开发人员,我可以假设你们很多读者也是。几乎可以肯定,你是一名开发人员、一名前开发人员、或与有一定能力的开发人员共事的人。那 么,我们都知道,对于软件开发人员而言,存在一种自然倾向,他们想在工作中尝试新东西,并收获宝贵的经验。我们都知道,想采用最新的开发实践、语言、流程 的开发人员,和想采用最新框架的开发人员之间,存在这一种天然的紧张局势,因为他们对这样做有兴趣,而开发人员想做对他们的组织或项目最有意义的事情。这 只是走在该行业中的一条普遍分界线。
我对本教程的目标非常简单,是为了帮助你走过在这两种关注点之间的分界线。我想给你一种方式来看待被行业吹捧为最佳实践的东东,来鉴别采用这些 实践对你的组织是否有着实际意义。还有,我想给你一种方式,让你沿着“最佳实践连续统一体”,从“我想去做因为人们说它好”变成“我们可以公正评判的习 俗”,变成理想的、在某种程度上的、“我们这样做是因为它从经验上被论证过,要好于其它方法”。
有了我向你展示的启发和结构,你可以得出结论,所谓的行业最佳实践,实际上对于你的团队或组织没有意义。不错,是这样的。重要的是,你根据可测量的经验和数据做决定,而不是嘴里的词语和猜测。最重要的是要明白,所谓的最佳实践是否为真正的最佳实践。
注1:最佳实践(best practice),是一个管理学概念,认为存在某种技术、方法、过程、活动或机制可以使生产或管理实践的结果达到最优,并减少出错的可能性。 http://zh.wikipedia.org/wiki/%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5
注2:The authors of the DesignPatternsBook came to be known as the “Gang of Four.” The name of the book (“Design Patterns: Elements of Reusable Object-Oriented Software”) is too long for e-mail, so “book by the gang of four” became a shorthand name for it. After all, it isn’t the ONLY book on patterns. That got shortened to “GOF book”, which is pretty cryptic the first time you hear it. http://c2.com/cgi/wiki?GangOfFour
译文: 《软件开发中的最佳实践是什么? 》 腊八粥