软件体系结构(一)
近年来,软件产品越来越复杂,规模更大,相互之间的依赖性更强,分工也愈加细化。回想十年以前,如果你告诉开发人员需要一个软件,可以让你方便地出版各种媒体,并让数万名用户同时浏览这些出版物。可以想象可怜的开发者会瞪大眼睛,张大嘴巴,然后表示需要数万个工时来完成这个软件(或者更有可能的是:只完成一半)。但是在今天,他会轻松的耸耸肩膀,然后说:“没问题。BTW,你需要给这个web site增加一些交互功能吗?“
相同的情况也出现在软件设计领域,也许几年以前你需要这样说,“一个客户端(用户界面),提供用户与系统的友好访问;以及应用服务,专司业务逻辑的实现;最后是数据服务器,负责数据信息的存储、访问及其优化。“现在你只要说“三层结构“,人们就会明白你的意思。与之类似的词语还有MVC,Pipeline,甚至某些商标,比如著名的J2EE和.Net.
也许你还不太了解前者,MVC是指“模型-视图-控制器“,而不是索尼的数码相机。Pipeline也不是下水管道,尽管它们的确有些相似的地方。
随着软件系统越来越复杂和庞大,对数据结构和算法的选择在许多情况下成为较次要的部分。而对整个系统的设计和描述变得越来越重要。人们编写软件的方式和使用的开发语言及工具有一个显着的发展特点,即他们的抽象程度有规律的提高,也许这句话本身也有一点抽象。这里的抽象程度,指的是软件开发者进行设计时考虑问题的粒度,又是一句抽象的话。再继续下去,我们会得到无数抽象的概念,所以还是回头看看活生生的历史,看看过去的五十年里,软件开发技术是怎样发展的。
在上个世纪五十年代,第一批数字计算机诞生时,人们使用机器指令编程,用打孔卡片代表二进制的01串。工程师们直接在内存中读写指令和数据,安排和维护内存的分配。即使增加一行代码,也必须重新考虑所有指令和数据在内存中的分配。编制的程序完全像天书一样,全由0和1组成。很快,人们开始使用有意义的符号来代替机器指令和内存地址,内存的分配和更新也交由系统完成,这便诞生了汇编语言。1952年,MIT(美国麻省理工学院)在Whirlwind 系统上使用了符号地址,开始使用汇编语言编写程序,可以说是最早的软件抽象。
到了五十年代后期,人们逐渐提炼出一些最常用的编码方式,像算术表达式,逻辑运算,过程调用,循环和条件等等。一些较高级的语言(相对汇编语言来说),实现了对这些常用方式的语言级支持,使得开发者得以在更高级别的抽象上工作,大大地提高了效率。1954年,IBM公司的John Backus和他领导的研究组开始开发Fortran (Formula translation)语言,这是一种用于科学计算的程序设计语言。开发任务到1957年完成。Fortran是这些语言的杰出代表者。IBM公司在IBM704机上开发了用Fortran编写的监控程序系统,是操作系统的雏形,也是最早的对硬件的软件抽象。
比Fortran更高级的语言,开始提供对自定义数据类型和模块化的支持。1960年,来自丹麦、英国、法国、德国、荷兰、瑞士和美国的13名代表举行了一次国际会议,会后在计算机权威刊物CACM上发表了“关于算法语言Algol60的报告”。Algol是一种用日常英语和与常用数学表达式相近的形式表现算法的语言,没有输入输出语句,全部以过程的形式进行,以块结构为基础。瑞士的Njklaus Wirth