1.1 软件开发架构
1.软件架构的定义
计算机软件的历史开始于20世纪50年代,历史非常短暂,而相比之下,建筑工程则从石器时代就开始了,人类在几千年的建筑设计实践中积累了大量的经验和教训。建筑设计基本上包含两点,一是建筑风格,二是建筑模式。独特的建筑风格和恰当的建筑模式,可以使一个建筑独一无二。
图1-1所示为中美洲古代玛雅建筑——Chichen-Itza大金字塔,9个巨大的石级堆垒而上, 91级台阶(象征着四季的天数)夺路而出,塔顶的神殿耸入云天。所有的数字都如日历般严谨,风格雄浑。与此类似地,自从有了建筑以来,建筑与人类的关系就一直是建筑设计师必须面对的核心问题。
图1-1 位于墨西哥的古玛雅建筑
几乎所有的软件设计理念都可以在浩如烟海的建筑学历史中找到更为遥远的历史回响。软件与人类的关系是架构师必须面对的核心问题,也是自从软件进入历史舞台之后就出现的问题。什么是软件系统的架构(Architecture)?一般而言,架构有两个要素:
(1)它是一个软件系统从整体到部分的最高层次的划分。
一个系统通常是由元件组成的,而这些元件如何形成,相互之间如何发生作用,则是关于这个系统本身结构的重要信息。
详细地说,它包括架构元件(Architecture Component)、联结器(Connector)、任务流(Task-flow)。所谓架构元件,也就是组成系统的核心“砖瓦”,而联结器则描述这些元件之间通信的路径、通信的机制、通信的预期结果,任务流则描述系统如何使用这些元件和联结器完成某一项需求。
(2)建造一个系统所作出的最高层次的、以后难以更改的商业和技术的决定。
在建造一个系统之前会有很多的重要决定需要事先作出,而一旦系统开始进行详细设计甚至建造,这些决定就很难更改甚至无法更改。显然,这样的决定必定是有关系统设计成败的最重要决定,必须经过非常慎重的研究和考察。
2.软件架构的目标
正如同软件本身有其要达到的目标一样,架构设计要达到的目标是什么呢?一般而言,软件架构设计要达到如下的目标:
(1)可靠性(Reliable)。软件系统对于用户的商业经营和管理来说极为重要,因此软件系统必须非常可靠。
(2)安全行(Secure)。软件系统所承担的交易的商业价值极高,系统的安全性非常重要。
(3)可扩展性(Scalable)。软件必须能够在用户的使用率和用户数目增加很快的情况下,保持合理的性能。只有这样,才能适应用户的市场扩展。
(4)可定制化(Customizable)。同样的一套软件,可以根据客户群的不同和市场需求的变化来进行调整。
(5)可扩展性(Extensible)。在新技术出现的时候,一个软件系统应当允许导入新技术,从而对现有系统进行功能和性能的扩展。
(6)可维护性(Maintainable)。软件系统的维护包括两个方面,一是排除现有的错误,二是将新的软件需求反映到现有系统中去。一个易于维护的系统可以有效地降低技术支持的花费。
(7)客户体验(Customer Experience)。软件系统必须易于使用。
(8)市场时机(Time to Market)。软件用户要面临同业竞争,软件提供商也要面临同业竞争。以最快的速度争夺市场先机则非常重要。
基于Java技术的软件开发架构,宏观上的层次如图1-2所示。
图1-2 软件开发架构
在具体的实现中,表现层可为Struts/JSF等,业务层、访问层可为JavaBean或EJB等,资源层一般为数据库。
注意
软件设计师中有一些技术水平较高、经验较为丰富的人,他们需要承担软件系统的架构设计,也就是需要设计系统的元件如何划分、元件之间如何发生相互作用,以及系统中逻辑的、物理的、系统的重要决定的作出。
这样的人就是所谓的架构师(Architecter)。在很多公司中,架构师不是一个专门的和正式的职务。通常在一个开发小组中,最有经验的程序员会负责一些架构方面的工作。在一个部门中,最有经验的项目经理会负责一些架构方面的工作。
但是,越来越多的公司认识到架构工作的重要性,并且在不同的组织层次上设置专门的架构师位置,由他们负责不同层次上的逻辑架构、物理架构、系统架构的设计、配置、维护等工作。