所有人应该都同意,设计(程序设计)是整个软件开发项目的核心,因为经由它生产真正的「产品」,所以许多开发团队都把大量资源投注在这个阶段。不过我建议,应该早在「前置时期」就为这个阶段进行绵密的准备与监控工作,甚至开始「制造」产品了。
除了努力制造产品外,开发成员在这个阶段还应该怀抱另一个崇高的目标,就是希望产品能够具备「可回收再利用」的特质。因为产品是花费大量人力、物力,好不容易才完成的,没有人愿意见到自己的产出在用过一次后就成为废物。
环保概念每个人可能都具备一些,不过真正能符合环保要求的并不多。许多软件开发项目完成(或中途夭折)之后,所有相关的程序代码与技术文件就全被送进仓库里存盘,或等待垃圾车运走。
垃圾何其多 ?
历经千辛万苦所制造出来的产品,为何总是无法被重复使用呢?通常有两个原因。第一、这些产品知识只存放在某些成员的脑袋里,一旦成员离职,公司就没有人能接手,自然无法重复使用。第二个原因则是这项产品本身就不具备「可回收利用」特质,要不成为垃圾也难。
要解决第一个问题,不能单单仰赖「道德劝说」或「人际关系」等难以掌握的非制度性方法,而必须仰赖一整套的软件开发制度与标准作业规范。如果您阅读过前几周的专栏,应该会了解一路谈下来的 RUP ( Rational Unified Process )作业准则,目的就在解决这个问题。
至于第二个问题,则出在软件设计本身方面。唯有从一开始就遵循「可回收再利用」原则,进行系统架构的设计与开发,产品才能逃脱最终成为垃圾的宿命。
设计的目的
RUP 将设计阶段的工作称为「对象导向设计」,这是由先前「对象导向分析」延续下来的观念与作法,同样确定工作能吻合对象导向的真正精神与意义。此外,分析的目的是「了解问题」,所以设计的目的就是「解决问题」。
事实上,任何一个软件系统应该都是为了「解决问题」。例如,使用者透过浏览器送出一个要求,系统处理后,再把结果送回给使用者,整个过程就是解决一个问题。所以,一个软件系统可谓是解决一堆特定问题的综合体。问题有大有小、有简单有复杂、有具体有抽象,有些问题还是一连串其它问题的纠结混合。我认为,设计的真正目的是以最有效益的方式,把原始问题予以拆解组合,让这些问题的解决方案达到最佳化与可重复使用的目标。
为了达到这个目标,建议建立一种以「组件」为基础的系统架构。这个系统由各个组件组成,用来解决各自的特定问题,它可以被独立发展并重复使用。
组件概念
什么是「组件( Component )」?它是指可以执行特定功能的一段程序代码组合。比较确切的描述应该是:「组件是系统里的一个小程序,它拥有清楚的边界,内含可执行的特定功能,并透过接口与外界沟通,并且能在系统中被部署与替换」。
软件系统的组件概念,其实跟硬件系统很类似。举例来说,一台计算机是由许多「组件」所组成,包括主机板、显示卡、声卡等,这些组件都有各自的特定功能,也有清楚的边界。当使用者透过键盘或鼠标等操作接口,与计算机沟通时,各组件就会依照功能进行分工处理与响应。
软件系统也应当如此,它是由一个个的组件所构成,每个组件可以被独立开发、设计、修改与维护,还可以被放回系统里,成为其它系统的组件,这样才具备可重复使用的功能。就如同计算机一样,当你无法用计算机玩 3D 射击游戏时,可能只要更换一片显示卡就可以解决,不需更换整台计算机;即使未来添购新计算机,旧的显示卡还是可以安装在新计算机里继续使用,不必被当成垃圾丢掉。这就是「组件」的真正精神,不论在硬件或软件系统里都一样。