为何优秀如程序员,也会构建 Bug 满格的软件?( 六 )

在这种情况下,唯一方法是以退为进,改善并简化代码库的结构。重新设计系统架构,防止意外的交互。有些非关键的功能,即便是已然构建完毕,也可以将其删除。另外,我们还可以部署自动化工具来检查bug和编写不良的代码。比尔·盖茨曾说过:“用代码行数来衡量编程的进度,就如同用重量来衡量飞机的制造进度。”人类思维只能处理有限的复杂性,因此软件系统的复杂程度取决于如何有效地利用这些复杂度。

构建良好的软件涉及扩展与降低复杂性的循环交替。随着新功能的开发,系统中自然会积累混乱。当这种混乱开始引发更大的问题时,你就需要暂停进度,花时间清理混乱。这两个步骤都是必要的过程,因为这个世界上没有柏拉图式的工程:软件工程取决于你的需求和实际遇到的问题。即使是非常简单的用户界面(比如Google的搜索栏),表面下也有可能包含大量的复杂性,你无法在一次迭代中完善这些复杂性。难点在于如何管理这个循环,在开发新功能的时候允许适度的复杂度,同时又不能让复杂度过度积累以至于变得势不可挡。

软件的核心是积累知识而不是编写代码

在软件开发中,大多数想法都很糟糕,但这不是任何人的错。只不过人们的各种想法实在太多了,所以某些想法肯定会行不通,即使非常谨慎和明智地抉择,也再所难免遭遇失败。所以为了顺利地推进项目,你需要从一堆糟糕的想法中摈弃最坏的想法,并发展最有希望的想法。苹果就是一个富有远见的设计典范,但在最终的产品问世之前,它也经历了几十个原型。最终的产品看似简单,但其中蕴含着错综复杂的知识,为什么他们选择了这个特定的解决方案?为什么其他替代方案不可行?

推荐阅读