今天来聊一聊一个常识话题,方法论。

我们从小就从父母、老师那里习得大量窍门与方法。比如,我们都听说过大数学家高斯通过数列计算100累加和时的巧妙算法:将 1,2,3……100 看作一个数组的话,那么第 n 个数与第 100 - (n-1) 个数的和总是相等的,这样,他很快地算得了累加和是 5050 的结果。在数学学习过程中,老师们带领我们去推导一个个公式,即使题目是用自然语言来描述问题,我们依然能将它们抽象为数学问题,最后成功求解。这就是我们学习数学的方法。

通常在生活里我们说讲究方法,指的往往是高效地运用工具。如果把方法的范围再从“高效地运用工具”,缩小到“运用工具”,乃至“在做事情之前要思考”,我们再拿日常生活中的不少显然反智的东西来比较,我们发现,即使是只要求思考,讲究方法也不是人人都能做到。从完成工作,到高效地完成工作之间,对高效方法持续运用的能力,很大程度上成为了对不同水平的工作人员的区分度。“做事要用脑子”是一个通俗的道理,从乡间种田的农人到治理国家的领导人都能明白。可事实却是,如此简单的道理却常常被人们抛到了脑后。


《Web 全栈工程师的自我修养》一书中介绍过“野生程序员”的概念,也就是没有计算机基础知识和相关教育经历,靠着对计算机开发的兴趣进入这个行业,虽然知识面比较广,但是各方面都一知半解的开发者。野生程序员写出的代码通常不忍直视。要想不做野生程序员,显然也要讲究写程序的方法。不少初学都受到前人的教诲,知道写代码要学习设计模式,要学习使用一些流行的框架。这些就是对方法的学习。还记得《设计模式》一书的副标题吗:“可复用面向对象软件的基础”,其重点在于它们是可复用的软件结构。因此如果恰到好处地将它们运用于自己开发软件的实际工作中,往往能收到事半功倍的效果。

软件开发领域里的方法就叫做最佳实践。最佳实践讲的就是前人总结好的经验和方法,供其他开发人员在遇到相似问题时,可以直接运用或参考的方法。那么,除了上面讲的《设计模式》,类似的最佳实践还有很多。比如,《领域驱动设计:软件复度性的核心解决之道》,从名字就能看出来它是做什么的了。

最佳实践往往指代的是解决特定问题的方法。设计模式,以及领域驱动设计,就是在面临对应的问题时,对特定代码模块进行设计的方法。不少人都有买书如山倒,看书如抽丝的感受,初学则更然也。刚开始接触这些理论的时候,简直如同天书般晦涩难懂。那么,有没有坡度比较缓一些的低难度的最佳实践呢?最好是细节到逐行代码的?

当然要有啊。

先从专业性说起。在学校的时候,老师们曾说不管同学们学到了多少知何,首先要懂得的是如何做好一个人。程序员也一样, 不管用的是什么编程平台,首先我们要做好一个程序员。这里推荐两本书《程序员的职业素养》,以及《程序员修炼之道——从小工到专家》,都是自然语言,后面一本略有代码。它们都是讲如何培养自己的专业主义,前面一本很薄、几乎都是讲解,却很有吸引力;后面一本更多从一个程序员的日常着手,介绍很多实用的建议,教读者如何成为养成良好的习惯,逐渐成长为一个专业的程序员。

接下来,当你进入编码阶段,如何写出一手漂亮的代码?很多人说 ThoughtWorks 的面试难,其中之一的难点就在于需要在面试的过程中与面试官一起秀一段代码。在面试这样的场景下,现场编程对于很多人来说确实是压力倍增的。但我相信如果一个程序员在平时有写漂亮代码的习惯,那么对于这样的一场在自己写的代码基础之上的补充并不困难。那么,怎样才能写出好的代码呢?答案就是,不断地练习、总结,再提升!如果说有哪些好的最佳实践来帮助大家成长,那就是:

  • 各大厂的编码规范
  • 书《.NET设计规范 约定、惯用法与模式》、《整洁代码之道》
  • 书《重构》、《重构到模式》

简要介绍一下。编码规范从名字听起来,就是一种最佳实践。这东西,我知道很多团队都在搞。在有些团队里,人们也不知道自己为什么要搞,只觉得好像听起来很厉害的样子,不如我们也来搞一个?编码规范之所以重要,是因为一些成熟的团队里在历史的开发历程中被一些“低级”错误所绊,导致吃过一些亏。所以这些团队通过制定这些规范来防止类似的错误再次发生。因而,对于一些入门者而言,直接套用这些团队的编码规范也不失为一种不错的思路。

后面几本书,有的告诉你什么是好代码,有的教你如何将烂代码改造成好代码。《.NET设计规范 约定、惯用法与模式》是在 .NET 平台里的必读书,它讲的正是代码细节上的最佳实践。细致到什么时候应该用属性,什么时候应该用方法,以及异常时应该如何捕获和重新抛出异常等。《整洁代码之道》也是类似的,其中讲了很多经验之谈,甚至细致到注释该怎么写,哪些是有用的哪些是没有的等等。而《重构》两本则更有意思,它细致地讲解了如何将糟糕的代码(坏味道),一步步地变成整洁的代码。


当你掌握了这些代码细节的最佳实践,相信不久之后你也就很容易理解了设计模式的原理、领域驱动设计的思路,以及《企业应用架构模式》的背景。然后,这时候不要飘飘然,理解离掌握、超越还早的很。这时的你,还是要继续练习,持续练习!练习到了一定的阶段,你发现,这些理论讲的内容都只适应于特定的场景,到了另一些场景它们要么需要变通地用,要么完全不能适用。不过,只要持续学习和运用这些过往的最佳实践,懂得在合适的时候灵活地调整和创新,我们既能容易快速接纳新的方法,还能基于前人的实践自主地进行创新。考虑一下,我们现如今在开发应用程序时使用的六边形架构、全异步等方法在十几年前是难以料想的,而自宿主、容器化和无服务器等方法也都是以前想都不敢想的东西。

回到“最佳实践”,这一词汇在软件开发领域已经存在多年,如果要给最佳实践提供一个定义的话,我觉得 《.NET 最佳实践》一书中,对“最佳实践”定义是我最喜欢的:最佳实践指的是需要冷静待之的有益实践。这里所指的实践即方法,而最佳被解释为“有益”。这个定义还强调了要冷静待之,也就是“尽信书不如无书”的道理。懂得运用,还懂得创新才是硬道理。但创新却需要基于懂得运用的基础之上,如果连运用都不懂得就来谈创新的话,恐怕只会贻笑于大方之家的。