架构设计培训Word格式.docx
《架构设计培训Word格式.docx》由会员分享,可在线阅读,更多相关《架构设计培训Word格式.docx(85页珍藏版)》请在冰点文库上搜索。
-TimothyC.Lethbridge,《面向对象软件工程》?
软件架构设计为什么这么难?
–因为它是跨越现实世界与计算机世界之间鸿沟的一座桥。
–软件架构设计要完成从面向业务到面向技术的转换,在鸿沟上架起一座桥梁。
–需求->
架构设计->
软件架构->
系统开发->
软件系统
软件架构对新产品开发的作用:
–上承业务目标。
上承业务目标。
–下接技术决策。
下接技术决策。
–控制复杂性。
控制复杂性。
先进行架构设计,后进行详细设计和编码实现,符合“基于问题深度分而治之”的理念。
–组织开发。
组织开发。
软件架构方案在小组中间扮演了“桥梁”和“合作契约”的作用。
–利于迭代开发和增量交付。
利于迭代开发和增量交付。
以架构为中心进行开发,为增量交付提供了良好的基础。
在架构经过验证之后,可以专注于功能的增量提交。
–提高质量。
提高质量。
软件产品线软件产品线:
指具有一组可管理的、公共特性的、软件密集性系统的集合,这些系统满足特定的市场需求或任务需求,并且按照预定义方式从一个公共的核心资产集开发得到。
软件产品线架构软件产品线架构:
针对一个公司或组织内的一系列产品而设计的通用架构。
软件架构对软件产品线开发的作用:
–固化核心知识;
–提供可重用资产;
–缩短推出产品的周期;
–降低开发和维护成本;
–提高产品质量;
–支持批量定制;
架构师应当为项目相关的不同角色而设计:
–架构师要为客户负责,满足他们的业务目标和约束条件。
–架构师要为用户负责,满足他们关心的功能需求和运行期质量属性。
–架构师必须顾及处于协作分工“下游”的开发人员。
–架构师必须考虑“周边”的管理人员,为他们进行分工管理、协调控制和评估监控等工作提供清晰的基础。
软件架构视图
——让设计建模更明白、更有效
张云贵
2010-05-21
“系统架构图”?
架构设计的多重视图–从根本上来说是因为需求种类的复杂性所致。
–比如一个媒体发布系统:
功能需求:
用户可以通过浏览器浏览媒体的发布。
据此初步设计出采用浏览器插件的方案;
约束条件:
不能影响用户浏览器的安全性;
细化设计方案,需要对插件进行认证,自动判别客户端是否存在,及版本比较;
自动下载注册等。
使用期质量属性:
为保证浏览的流畅,应减少中间等待的时间,因此应对下一步需使用的媒体做预测等。
制作发布期的质量保证:
保证在遇到较大的媒体时能保持浏览的流畅,应在发布时将视频等流式化。
软件系统的需求种类复杂
什么是软件架构视图–个架构视图是对于从某一视角或某一点上看到的系统所做的简化描述,描述中涵盖了系统的某一特定方面,而省略了于此方面无关的实体。
–架构要涵盖的内容和决策太多了,超过了人脑“一蹴而就”的能力范围,因此采用“分而治之”的办法从不同视角分别设计;
同时,也为软件架构的理解、交流和归档提供了方便。
–多视图方法是软件架构归档的方法,更是指导我们进行架构设计的思维方法。
逻辑架构–逻辑架构关注功能。
其设计着重考虑功能需求。
开发架构–开发架构关注程序包。
其设计着重考虑开发期质量属性,如可扩展性、可重用性、可移植性、易理解性和易测试性等。
运行架构–运行架构关注进程、线程、对象等运行时概念,以及相关的并发、同步、通信等问题。
–其设计着重考虑运行期质量属性,例如性能、可伸缩性、持续可用性和安全性等。
物理架构–物理架构关注软件系统最终如何安装或部署到物理机器。
其设计着重考虑“安装和部署需求”。
以及如何部署机器和网络来配合软件系统的可靠性、可伸缩性等要求。
数据架构–数据架构关注持久化数据的存储方案。
设计着重考虑“数据需求”。
关系
逻辑视图逻辑视图。
逻辑视图不仅关注用户可见的功能,还包括为实现用户功能而必须提供的“辅助功能模块”;
它们可能是逻辑层、功能模块等。
开发视图开发视图。
开发视图关注程序包,不仅包括要编写的源程序,还包括可以直接使用的第三方SDK和现成框架、类库,以及开发的系统将运行于其上的系统软件或中间件。
开发视图和逻辑视图之间可能存在一定的映射关系:
比如逻辑层一般会映射到多个程序包等。
运行视图运行视图。
和开发视图的关系:
开发视图一般偏重程序包在编译时期的静态依赖关系,而这些程序运行起来之后会表现为对象、线程、进程,运行视图比较关注的正是这些运行时单元的交互问题。
物理视图物理视图。
和运行视图的关系:
运行视图特别关注目标程序的动态执行情况,而物理视图重视目标程序的静态位置问题;
物理视图是综合考虑软件系统和整个IT系统相互影响的架构视图。
软件生命周期与软件架构介绍
软件架构师的定位
系统架构师的职责:
一、理解系统的业务需求,制定系统的整体框架(包括:
技术框架和业务框架)?
二、对系统框架相关技术和业务进行培训,指导开发人员开发。
并解决系统开发、运行中出现的各种问题。
系统架构师的目的:
对系统的重用、扩展、安全、性能、伸缩性、简洁等做系统级的把握。
系统架构师能力要求:
一、系统架构相关的知识和经验。
二、很强的自学能力、分析能力、解决问题的能力。
三、写作、沟通表达、培训。
24
角色?
软件架构师SoftwareArchitect?
定义?
主导系统全局分析设计和实施、负责软件构架和关键技术决策的角色
25
职责–领导与协调整个项目中的技术活动(分析、设计和实施等)–推动主要的技术决策,并最终表达为软件构架–确定和文档化系统的相对构架而言意义重大的方面,包括系统的需求、设计、实施和部署等“视图”–确定设计元素的分组以及这些主要分组之间的接口–为技术决策提供规则,平衡各类涉众的不同关注点,化解技术风险,并保证相关决定被有效的传达和贯彻–理解、评价并接收系统需求–评价和确认软件架构的实现
26
专业技能?
技术全面、成熟练达、洞察力强、经验丰富,具备在缺乏完整信息、众多问题交织一团、模糊和矛盾的情况下,迅速抓住问题要害,并做出合理的关键决定的能力。
具备战略性和前瞻性思维能力,善于把握全局,能够在更高抽象级别上进行思考。
对项目开发涉及的所有问题领域都有经验,包括彻底地理解项目需求,开展分析设计之类软件工程活动等。
具备领导素质,以在各小组之间推进技术工作,并在项目压力下做出牢靠的关键决策。
拥有优秀的沟通能力,用以进行说服、鼓励和指导等活动,并赢得项目成员的信任。
27
以目标导向和主动的方式来不带任何感情色彩地关注项目结果,构架师应当是项目背后的技术推动力,而非构想者或梦想家(追求完美)?
精通构架设计的理论、实践和工具,并掌握多种参考构架、主要的可重用构架机制和模式。
具备系统设计员的所有技能,但涉及面更广、抽象级别更高。
28
软件架构师的知识体系
软件架构师作为整个软件系统结构的总设计师,其知识体系、技能和经验决定了软件系统的可靠性、安全性、可维护性、可扩展性和可移植性等方面的性能。
因此一个优秀的软件架构师必须具备相当丰富的知识、技能和经验。
通过对比软件架构师和系统分析师在软件开发中的职责和角色,不难发现软件架构师与系统分析师所必需的知识体系也是不尽相同的,系统分析师的主要职责是在需求分析、开发管理、运行维护等方面,而软件架构师的重点工作是在架构与设计这两个关键环节上。
因此在系统分析师必须具备的知识体系中对系统的构架与设计等方面知识体系的要求就相对低些;
而软件架构师在需求分析、项目管理、运行维护等方面知识的要求也就相对低些。
29
成为一名合格的软件架构师必须具备的知识–信息系统综合知识体系–软件架构知识体系
30
?
MFC,MSF,MOF,RUP,J2EE,Spring,SOA,JUnit,ORM,.Net?
MVC,UML,XML,Corba,MDA,MDD,Web-Service?
RSS,Web2.0,AJAX,Serverlet,Hibernate?
IOC,AOP?
RubyOnRails?
Rup?
BPEL?
WorkflowEngine?
LBS?
Oracle?
CMMI?
MQ?
…
31
软件架构师在干什么?
思考、思考、再思考–深入理解、准确把握建设的业务需求–分析所有可见的问题、障碍、风险–充分参考已有的成功方案,降低风险?
交流、讨论、博弈、质疑–对构思中的方案不断提出质疑,避免漏洞–广泛听取各层面的意见,开拓思路–反复质疑、逐步完善已有的设计构思?
在动手实现之前验证设计方案的正确性
32
软件架构师的知识结构
软件知识–最好要有系统开发全过程经验。
–对IT建设生命周期各个环节有深入了解,包括:
系统/模块逻辑设计、物理设计、代码开发、项目管理、测试、发布、运行维护等。
–深入掌握1-2种主流技术平台上开发系统的方法。
–了解多种应用系统的结构。
–了解架构设计领域的主要理论、流派、框架。
33
软件架构师的知识结构?
业务知识–深入了解系统建设的业务需求。
–了解系统的非功能需求和运行维护需求。
–了解企业IT公共设施、网络环境、外部系统。
34
软件架构师的思维方式
基于框架的思维–架构设计的层次(Enterprise,Application,etc)–IT的生命周期(What,Why,Where,How,When,etc)–成功经验以及方法论的指导?
合理把握技术细节–把握各个层次应有的内容–合理忽略不应有的技术细节
35
风险管理意识–采用成功经验、避免不应有的风险?
多方位的开放思维–多维度、多方向、包容性、避免排他性–分析、质疑、抽象、归纳–没有绝对好的架构设计,只有相对优秀的方案
36
注意:
并不存在通用的设计方法。
我们认为,给定的某种固定的方法总是会顾此失彼,而且这种不平衡性不太容易觉察。
如果给定的某种方法所注重的方面与系统需求不吻合,则这种方法就会将设计引入歧途。
所以我们给出的是一些技巧,任何一次设计过程,都需要设计师仔细分析系统的需求和相关的约束条件,灵活运用众多的设计技巧,针对不同的设计方案进行取舍,做出合理的决策。
37
为了有效地控制设计工作的复杂性,一般把设计活动分为总体设计和详细设计两个层次。
总体设计主要关注于体系结构和接口这些全局性的内容,而详细设计主要关注于每个模块内部的数据结构和算法。
至于数据,则在设计的各个层次都会涉及。
软件设计是一个迭代的过程,是一个逐步细化和求精的过程。
因此,总体设计和详细设计之间的划分并不是绝对的。
哪些是总体设计任务,哪些是详细设计任务,取决于设计师对于整个项目的把握,并没有一个统一的标准。
设计师在设计时实际是在做一系列的设计决策,来满足系统的行为目标,质量目标和开发目标。
如果一个结构对于完成这些目标非常重要,则它是构架的一部分。
相反,如果它可以留到以后再完善,则它不是构架的组成部分。
因此,总的说来,一个设计是不是属于构架设计,要看你当前的设计目标。
38
管理陷阱–随着管理性责任的增加,你所从事技术性工作的时间就会显著减少。
这样,因为在完成技术性任务和保持职业技能上花费时间的减少,你可能会失去技术优势。
–软件架构师和管理者有很大的差异:
软件架构师是直接的技术贡献者;
而管理者则是通过协调其他人员的活动来间接做出贡献。
他们往往一起协作,构成高效的管理团队。
以经验看,把两者结合起来却不能长久地工作。
–作为一名软件架构师,如果你已经建立起个人的职业原则的话,就有可能避免成为管理者。
架构和设计应该做到何种程度
软件架构必须设计到“能为开发人员提供足够的指导和限制”的程度。
分而治之的两种方式–分而治之的缘由:
问题太复杂了,超出了人们能够“一蹴而就”的范围。
(接口和实现分离)–一、先不把问题研究得那么深,那么细,浅尝辄止,见好就收。
这种分而治之的方式称为“按问题深度分而治之”。
–二、先不研究整个问题,而是研究问题的一部分,分割问题。
这种分而治之的方式称为“按问题广度分而治之”。
(比如展现层、业务层和数据层的开发)
40
随着软件设计工作越来越复杂,将架构设计和详细设计分离已成为普遍的做法。
将设计分为架构设计和详细设计,是对“按问题深度分而治之”思想的运用。
–所谓架构设计,就是关于如何构建软件的一些最重要的设计决策;
–详细设计针对每个部分的内部进行设计。
可以这么说,软件架构设计应当解决的是全局性的、涉及不同“局部”之间交互的设计问题,而不同“局部”的设计由后续的详细设计负责。
41
面对“技术复杂性”和“管理复杂性”这样的双重困难,以架构为中心的开发方法是有效的途径:
一方面:
“软件系统的架构涵盖了整个系统,尽管架构的有些部分可能只有‘一寸深’”。
构造一个具有一定抽象层次的解决方案,而不是将所有细节统统展开,从而有效地控制了“技术复杂性”。
没有“把问题研究那么深、那么细”,属于“按问题深度分而治之”
42
另一方面,因为“架构中包含了关于各元素应如何彼此相关的信息”,从而可以把不同模块分配给不同小组分头开发,而软件架构设计方案在这些小组中间扮演“桥梁”和“合作契约”的作用。
每个小组的工作覆盖了“整个问题的一部分”,各小组之间可以互相独立地进行并行工作,这种“分割问题,各个击破”的策略,属于“按问题广度分而治之”。
这样一来,模块的技术细节被局部化到了小组内部,内部的细节不会成为小组间协作沟通的主要内容,理顺了沟通的层次。
另外,对“人尽其才”也有好处,不同小组的成员需要精通的技术各不相同。
例如,用户界面层、数据管理层、系统交互层。
43
架构要进行到什么程度–软件架构是团队开发的基础,应明确规定后期分头开发所必须的公共设计约定,为分头开发提供足够的指导和限制。
–另一方面,具体的架构设计程度还会因软件项目的不同而不同。
–架构设计对软件的不同部分的设计程度并不是整齐划一的。
(通信机制、持久化机制、消息机制等对应的公共模块;
具体的业务功能模块在架构设计中往往设计程度不深。
)?
归纳:
–由于项目的不同、开发团队情况的不同,软件架构的设计程度会有不同;
–软件架构应当为开发人员提供足够的指导和限制。
44
高来高去式架构设计的症状?
不能为开发人员提供足够的指导和限制的那种架构设计方案。
高来高去式架构设计现象极为普遍,危害:
–缺少来自架构的足够的指导和限制,开发人员在进入分头开发阶段之后会碰到很多问题,并且容易造成管理混乱,沟通和协作效率低;
–对软件质量非常关键的全局性设计决定被拖延到分头开发期间草率决定;
–没有完成化解重大技术风险的职责;
–团队成员对架构师意见大,团队士气受到打击。
45
症状一:
缺失重要架构视图。
给团队的不同角色提供指导。
症状二:
架构设计方案停留在概念性架构的层面,全局性的设计决策最后由具体开发人员从局部视角考虑并确定下来,造成技术和管理上的种种问题。
症状三:
名不副实的分层架构。
对各层之间交互接口和交互机制的设计严重不足。
46
架构设计的GRASP模式
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
质量属性驱动架构设计策略
软件质量及质量模型–软件质量是一个复杂的概念,不同的人从不同的角度来看软件质量问题,会有不同的理解。
–从用户的角度看,质量就是满足客户的需求;
–从开发者的角度看,质量就是与需求说明保持一致;
–从产品的角度看,质量就是产品的内在特点;
–从价值的角度看,质量就是客户是否愿意购买。
在软件项目开发过程中,项目经理眼中的质量就是能“令人满意”地工作以完成预期功能的软件产品。
所谓“令人满意”,包括功能、性能、接口需求及其他指标,如可靠性、可维护性、可复用性和正确性。
然而在实际工作中,一旦出现问题时,项目管理人员必须权衡利弊,作出取舍,在满足某一个指标的同时,牺牲另外一个或几个指标。
比如为了按期交货,需对软件功能进行分类,在第一个版本中实现优先级较高的功能,在第二个版本中实现优先级较低的功能。
因此,项目经理需要一个对其工作有指导意义的质量模型和度量方法。
该模型一方面可以帮助项目经理生产出符合标准的软件产品,另一方面帮助项目经理识别可能影响产品质量的风险。
为什么那么多软件产品需要重新设计?
–难以维护?
–运行速度太慢?
–稳定性差?
–无法进行功能扩展?
–易遭受安全攻击?
忽视包括质量属性需求在内的非功能需求是致命的。
质量属性分为:
–运行期质量属性–开发期质量属性?
各类需求架构设计的不同影响–高可移植性?
对硬件和平台相关特性进行封装、隔离–高性能?
精心规划职责模型?
在质量属性方面需求折衷
质量属性分析的位置–质量属性分析是概念性架构设计的重要步骤。
–通过质量属性分析,制定出满足非功能需求的高层设计决策。
–质量属性分析所处的位置如图所示
”属性-场景-决策”表法–运用“关键需求决定架构”的策略,使质量属性分析的“输入”集中到关键质量属性需求。
–“属性-场景-决策”表方法提倡通过一组具体场景将要达到的质量属性需求目标细化,再根据场景制定架构决策。
“属性-场景-决策“表法
“属性-场景-决策”表法的好处:
–可操作性强。
质量熟悉需求是笼统的目标,而一组质量场景使之明确化。
–避免过度设计。
借助“属性-场景-决策”表对质量场景进行评估,通过权衡场景发生的概率和遗漏它的代价,决定是否应满足该场景的要求。
–便于系统升级时参考。
例:
可扩展性质量属性
运用“属性-场景-决策”表方法,细化PMTool的可扩展性需求,制定架构决策,如下表所示:
非功能需求对软件架构的影响比功能需求更大。
“属性-场景-决策”表可以帮助软件架构师以一种更透明、更可操作的方式完成从质量属性需求到质量场景的细化,最终根据具体的场景有针对性地设计架构决策。
架构的目标
正确性correctness?
可靠性(Reliable):
–软件系统对于用户的商业经营和管理来说极为重要,因此软件系统必须非常可靠。
–健壮性robustness?
安全性(Secure):
–软件系统所承担的交易的商业价值极高,系统的安全性非常重要。
可伸缩性(Scalable):
–软件必须能够在用户的使用率、用户的数目增加很快的情况下,保持合理的性能。
只有这样,才能适应用户的市场扩展得可能性。
可定制化(Customizable):
–同样的一套软件,可以根据客户群的不同和市场需求的变化进行调整。
可扩展性(Extensible):
–在新技术出现的时候,一个软件系统应当允许导入新技术,从而对现有系统进行功能和性能的扩展?
可复用性reusability?
可维护性(Maintainable):
–软件系统的维护包括两方面,一是排除现有的错误,二是将新的软件需求反映到现有系统中去。
一个易于维护的系统可以有效地降低技术支持的花费。
兼容性compatibility?
可移植性portability?
易用性easeofuse?
高效性efficiency?
timeliness,economyandfunctionality
客户体验(CustomerExperience):
–软件系统必须易于使用。
市场时机(TimetoMarket):
–软件用户要面临同业竞争,软件提供商也要面临同业竞争。
以最快的速度争夺市场先机非常重要。
软件可维护性
87
重型和轻型方法–重型方法:
偏重于计划、过程和中间产物–敏捷方法:
更加看重人和沟通。
人和沟通永远是第一位的,而计划、过程和中间产物,只是保证沟通、实现目标的手段。
并非计划、过程、中间产物不重要,但不能本末倒置。
评判软件成功的标准:
–很多。
对敏捷方法:
首先在于交付可用的软件。
–为了保证软件的可用性,需求是根本。
对于架构设计工作,从需求出发来设计架构,是保证软