1.软件开发的本质
软件开发的首要难题是什么?需求的收集?技术的选型?项目管理?都没错,但用一个词来总结那就是:复杂度!《Code Complete》中引用了Brooks(没错,就是写出了著名的《人月神话》的那位)论文《No Silver Bullets: Essence and Accidents of Software Engi- neering》里对软件开发复杂度的阐述,按照亚里士多德的哲学观,将事物的属性分为本质(Essential)和附属(Accidental)。本质属性就是一样东西之所以是它的属性,比如车都要有引擎,但引擎是什么型号的就是附属的属性。软件开发一路发展过来,像编程语言、编译器、开发环境等工具方面都有了长足的进步。可直到今天,我们仍然不能说软件开发很简单,所以就如Brooks所说:软件开发本质上是复杂的,所以首要任务就是管理复杂度!那么哪些元素致使软件开发的复杂度这样高呢?下面就以《Code Complete》第五章为资料,加以一些个人的思考,来看一看软件工程复杂的原因、构成以及如何应对。
2.复杂无序的世界
正如前文所说,即便我们有了类似自然语言一般的高级编程语言、最自动化的工具等,也无法消灭软件开发的复杂性。因为我们用期望用软件来解决现实世界中的问题,而非最理想情况下的计算(例如算法书里一个简单的数据结构的伪代码),所以我们要处理各种可能的用户输入,潜在的硬件、网络、磁盘等错误,复杂的业务逻辑和UI展示,以及不断随着时间而变化的客户需求。因为现实世界就是如此,所以复杂度难以避免。那现在就来看看真实世界给我们带来了哪些挑战。
2.1 从原子到星云:细节
软件开发者对自己工作“最引以为傲”的一点可能就是软件开发中横跨的数量级。计算机科学泰斗Dijkstra指出,编程(计算)是唯一横跨9个数量级的智力活动的职业。到今天为止,在一个复杂的大型项目里这个数量级可以很容易就超过15个。任何人,即便是最强大脑,也不可能把一个项目所有的细枝末节都灌入脑海。就像马戏团里的演员,不断地将小球扔入空中再用另一只手接下来,玩的球越多就越容易掉到地上。