本文是我对迭代开发的一点儿感悟,或有稚嫩之处,欢迎斧正!
迭代 (iteration) 本意是「重复」,但现在更多泛指「一小步一小步地更新」。迭代,就是不停地重复一个短小的开发流程。在这种看似简单的模式里,蕴含着巨大的力量。
上小学、中学的时候,一份课业经常很短小、简单,基本上 50 分钟的时间就足够学完整节课的知识。那时候的作业也是这样,基本上一个小时就能写完一个模块,最变态也鲜有超过一个晚上。考试也局限在几个小时以内,考生们在这几个小时里奋力做到尽善尽美。然而,中学毕业后,当我们真正开始钻研一门学科、做项目、做实验,或者上班、搞工程的时候却发现,太多事情并不是 100 米冲刺,而是复杂的野外远行。我们必须周密地计划,同时随机应变;更重要的是,我们必须「长期」地做同一件事,比如做一周、一个月,甚至一年。
任务越来越复杂,想做到良好,优秀,甚至完美,越来越困难、越来越耗时间。如果一开始就把众多复杂的要求都加进 todo 清单,全力地想去把每一处做到最好,那不出几天,就会发现,许多个「最好」组合起来,却成了一团浆糊,毫无章法。更有甚者,做了几步就不堪重负,无法继续。所以,试图从最开始就列出详尽的计划,然后一点点执行,这种道路往往是行不通的。
让我用「画人像」来类比吧。对绝大多数人而言,如果只是一小块一小块地摹画模特,头发、眉毛、眼睛、鼻子、嘴……最后成品往往会走形严重,令人不忍直视。然而,如果先起形,找准轮廓,找准五官在脸上的相对位置,进而在画每个小部分的时候,都在附近找两三个参照点,这样,想画出更准确的人像,就容易多了。
我们对一张脸大概长什么样都是有印象的。换句话说,我们对「脸」有全体的认知。即使这样,如果没有「已经画好的简单的脸模型」,我们还是不能画准位置。这就是我们的弱点所在。对细节的丰富与对整体的把握是冲突的。我们的精力有限,如果过分地注意细节,就会失去对大局的把控。
我们都希望自己的工作能够尽善尽美,希望每个部件都有绝妙的设计,简洁之余还展现出强大的功能。不但接口易用,实现效率还很高。我们希望鱼与熊掌可以兼得,但必须承认上一段指出的事实:对细微之处的打磨,对整体的协调,二者往往不能同时进行。
那么,是不是先有了详细的规划,然后再去填充细节,就可以成功了呢?我认为,事实并非如此。老话说,「计划不如变化」。做再多规划,实际操作的时候都可能有意想不到的问题。比如,一个软件架构师设计出了一个看似完备的架构,但实现的时候却发现,有的地方过度抽象,有的地方接口鬼畜,有的地方功能不足,更要命的是,有的模块由于技术原因几乎是无法实现的。你可能会问,为什么架构师设计的时候没考虑到这么「明显」的问题?我觉得,很多时候这种「明显」的问题只有在实际去做的时候才能显现出来。这个架构师也想调整,但项目已经做了很久,现在再修改已经是「牵一发而动全身」了。再比如,一个游戏策划想出了「很有趣的玩法系统」(也很复杂),结果开发实现的时候模块太多,管理不过来,整个项目成了一摊大饼,许多小组都在等别的小组实现,还有许多小组在研究 bug 到底是出在自己的模块还是其他组的模块里。于是,交付不得不推迟下去。
达成完美主义的道路,不是一开始就做到无懈可击,而是先接受「目前并不完美」的事实,一点点地,一步一个脚印地走向理想中的目标。我们大多数人都不是完人,都难以掌握庞大的任务。因此,我们应该把大任务化为小任务。这就是「迭代」。在真正制作出心目中那个「完美」的产品之前,我们需要制作先做一个丐版,它只有最基础、最普通的功能,甚至这最普通的功能都不完善;但仍然是一个五脏俱全的产品(「全」不是完备的意思,而是说,有简单的可用的组件暂时代替)。在这个基础之上,我们验证它是否有缺陷,我们像搭积木一样一点点添加新的功能、扩展已有的功能。每走一段适当的距离,就检查一下:「目前为止有什么缺陷?」「有什么亟需的更新?」「有没有偏离最初的计划?」如此重复,最后项目就会成长为一个强大、完备的产品。
敏捷开发、TDD 等方法,我觉得最根本的其实就是要解决人的精力的问题。"Keep It Simple, Stupid"。把一个开发步骤的周期缩短,然后不断重复(迭代)这个过程,其目的在于集中我们的精力。同时,由于每一步得到的都是完整可行的解决方案,区别只在于功能的强弱、多少,所以也不会失去对大局的掌控。出现问题可以及时反馈,但又不会同时出现太多问题。这个顺序正如那句名言所说:"Make it work, make it right, make it fast."[1]
Reference
- Henderson, A., Prakash, A., Yan, L. K., Hu, X., Wang, X., Zhou, R., & Yin, H. (2014). Make it work, make it right, make it fast: Building a platform-neutral whole-system dynamic binary analysis platform. In 2014 International Symposium on Software Testing and Analysis, ISSTA 2014 - Proceedings (pp. 248-258). (2014 International Symposium on Software Testing and Analysis, ISSTA 2014 - Proceedings). Association for Computing Machinery, Inc.