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

如果我们把所有时间花在重建现有的技术上,那么就无法取得技术上的进步。软件工程的工作是构建自动化的系统,而我们应该自动化的第一件事就是日常的软件工程工作。现在问题的关键在于了解我们需要重用哪些系统,如何根据自身的独特需求改造这些系统,同时在这个过程中解决新发现的问题。

软件受到复杂性的限制

软件的功能性往往会受到复杂性的限制,却与投入的资源量没有太大关系。

通常IT系统都有很多功能,但仍然无法博得用户的喜爱,因为这些系统非常混乱。相比之下,名列前茅的移动应用往往因其简单性和直观性而备受称赞。学习使用软件很难。除此之外,实际上用户并不喜欢新功能,因为日益积累的复杂性终有一日会决堤。例如,iTunes在担任苹果的媒体生态系统中心近20年后,于今年分裂成了三个不同的应用程序(分别服务于音乐、播客和电视节目),因为对于一个应用而言iTunes的功能过于复杂。从实用性的角度来看,限制不是说可以实现多少个功能,而是说哪些才是简单直观的功能。

即便抛开实用性不提,一旦项目变得过于复杂,工程进度就会停滞不前。向应用程序添加每一行新代码都需要考虑与其他代码的交互。应用程序的代码库越大,构建新功能时引入的bug就越多。最终,bug的产生速率会超越新功能的开发速率。这就是赫赫有名的“技术负债”,也是专业软件开发的主要挑战。这就是为什么许多大型IT系统中依然存在多年未解决的问题的原因。向项目添加人手只会让局面更混乱:由于代码库无法承其重而崩溃,所以这些开发人员只能在原地打转。

推荐阅读