软件开发活动中的复杂度似乎与能量一样也存在守恒定律,即,复杂度是守恒的。先从几个方面来看看,复杂度守恒定律是在软件行业是如何体现的吧。

    先从开发管理说起。软件开发一开始或许是没有管理的,可能只是几个软件工程师合在一起就开始一个产品的开发了。但是,渐渐地出现了问题,比如,并行开发问题、版本管理问题,等等。最终工程师们发现得形成一定的规范才能最终完成软件产品的开发。当产品越做越大时,有些软件工程师可能根本没有时间去做具体的软件开发工作了,慢慢地离技术也越来越远了,最后成了一个专职的管理者。管理者的出现,无疑为开发人员减轻了某方面的工作,让开发人员觉得更轻松了。但随之而来的是管理者对于开发人员的要求越来越多了,为了管理的需要一会儿向开发人员要这个数据、一会儿向开发人员要那个数据、或是要求通过TL9000认证,等等。有了来自管理人员的各种要求后,部分开发人员的工作量将会有所上升。站在开发人员的角度来看,好像有了管理以后事情更简单了,但站在整体上看来,的确简单了吗?或许只不过是将一些问题从软件工程师身上转移到了管理者身上?复杂度是守恒的?

    接着看一看编程语言。一开始的编程语言是汇编,后来进化成了面向过程的,最后又演变成了面向对象的。如果运用得好,采用面向对象编程语言所获得的面向对象设计,其可维护性和可扩展性将更加的诱人。那面向对象编程语言的出现使开发出高质量软件这一事情简单了吗?不一定!因为面向对象语言比面向过程语言具有更高层次的抽象能力,因此,程序在开发时也需要用更加抽象的方法去设计,而这对软件工程师能力的要求也就更高了。面向过程的语言易学,但要开发出高质量的软件相对的难;而面向对象的语言难学,但一旦掌握了,运用它开发出来的软件质量将相对的高。看来复杂度还是守恒的?

    最后说一说软件设计。一个好的设计需要更多的时间去思考,而一个随意的设计需要的思考时间却相对的少。但一个好的设计其后期的维护成本将更低,反之,一个随意的设计所需的则更高。看来复杂度也是守恒的?

    即然复杂度是守恒的,那不是怎么做都可以吗。软件开发不需要管理,编程语言也只需使用面向过程的,最后设计也不用那么的考究。复杂度真的完全守恒吗?

    现实中,汽车、飞机被发明出来使得交通更加的便利,但汽车和飞机的发明及制造却需要很多的努力,当然这些努力是从没有汽车和飞机进行徒步远行的努力转移过来的。从现实的例子看来,很多的复杂度守恒从短期来看是守恒的,但从长远来看并不守恒,而是方便了生活或提高生活质量,软件开发需要管理、编程应当运用面向对象语言和软件必须重视设计都是为了使我们的工作更为高效和高质量。尽管在短期它们会给我们带来困难和耗费时间进而增加成本,但从长远来看我们将从中受益。

    当然现实工作中也的确存在复杂度真正守恒的例子,事情从一方面看来是简化了,但总体上其实并没有简化,只不过是从一种形式转化成了另一种我们所不太关心的形式,或者从自己这边转移到了他人那边、从一个模块简单地转移到了另一个模块,等等。对于从中不能收益的复杂度转移活动我们应当尽可能地避免,否则那将意味着资源的浪费。