高级软件架构设计师实战信息与电气工程学院高洪江ghj1104@163.com158535672302020/3/81软件系统开始坏死的症状一个软件系统开始坏死时表现的症状有:–硬化Rigidity——系统变得越来越难以变更,修复或增添新功能的代价高昂;–脆弱Fragility——对系统的任何哪怕是微小的变更都可能造成四处(甚至是与变更处没有逻辑上的关联之处)崩溃;–绑死Immobility——抽取系统的任何部分用来复用都非常困难;–胶着Viscosity——以与原有设计保持一致的方式来对实施变更已经非常困难,诱使开发人员绕过它选择容易但有害的途径,其结果却使系统死的更快。2020/3/82什么是软件架构–软件架构的概念很混乱。如果你问五个不同的人,可能会得到五种不同的答案。–软件架构概念主要分为两大流派:»组成派:软件架构=组件+交互。»决策派:软件架构=重要决策集。–组成派和决策派的概念相辅相成。2020/3/83软件架构要层次化并隔离关注点–复杂性是层次化的。--《人月神话》–好的架构设计必须把变化点错落有致地封装到软件系统的不同部分(即关注点分离)。–通过关注点分离,达到“系统中的一部分发生了变化,不会影响其他部分”的目标。2020/3/84软件单元的粒度:–粒度最小的单元通常是“类”。–几个类紧密协作形成“模块”。–完成相对独立的功能的多个模块构成了“子系统”。–多个子系统相互配合才能满足一个完整应用的需求,从而构成了软件“系统”。–一个大型企业往往使用多套系统,多套系统通过互操作形成“集成系统”。–软件单元的粒度是相对的。同一个软件单元,在不同场景下我们会以不同的粒度看待它。2020/3/85架构(Architecture)与框架(Framework)。–框架只是一种特殊的软件,框架也有架构。–可以通过架构框架化达到“架构重用”的目的,如很多人都在用Spring框架提供的控制反转和依赖注入来构建自己的架构。2020/3/86软件架构的作用–如果一个项目的系统架构(包括理论基础)尚未确定,就不应该进行此系统的全面开发。--BarryBoehm,《EngineeringContext》–一个缺陷充斥的系统,将始终是一个缺陷充斥的系统。--TimothyC.Lethbridge,《面向对象软件工程》软件架构设计为什么这么难?–因为它是跨越现实世界与计算机世界之间鸿沟的一座桥。–软件架构设计要完成从面向业务到面向技术的转换,在鸿沟上架起一座桥梁。–需求-架构设计-软件架构-系统开发-软件系统2020/3/87软件架构对新产品开发的作用:–上承业务目标。–下接技术决策。–控制复杂性。»先进行架构设计,后进行详细设计和编码实现,符合“基于问题深度分而治之”的理念。–组织开发。»软件架构方案在小组中间扮演了“桥梁”和“合作契约”的作用。–利于迭代开发和增量交付。»以架构为中心进行开发,为增量交付提供了良好的基础。在架构经过验证之后,可以专注于功能的增量提交。–提高质量。2020/3/88软件产品线:指具有一组可管理的、公共特性的、软件密集性系统的集合,这些系统满足特定的市场需求或任务需求,并且按照预定义方式从一个公共的核心资产集开发得到。软件产品线架构:针对一个公司或组织内的一系列产品而设计的通用架构。软件架构对软件产品线开发的作用:–固化核心知识;–提供可重用资产;–缩短推出产品的周期;–降低开发和维护成本;–提高产品质量;–支持批量定制;2020/3/89架构师应当为项目相关的不同角色而设计:–架构师要为客户负责,满足他们的业务目标和约束条件。–架构师要为用户负责,满足他们关心的功能需求和运行期质量属性。–架构师必须顾及处于协作分工“下游”的开发人员。–架构师必须考虑“周边”的管理人员,为他们进行分工管理、协调控制和评估监控等工作提供清晰的基础。2020/3/810软件架构视图2020/3/811“系统架构图”?2020/3/812架构设计的多重视图–从根本上来说是因为需求种类的复杂性所致。–比如一个媒体发布系统:»功能需求:用户可以通过浏览器浏览媒体的发布。据此初步设计出采用浏览器插件的方案;»约束条件:不能影响用户浏览器的安全性;细化设计方案,需要对插件进行认证,自动判别客户端是否存在,及版本比较;自动下载注册等。»使用期质量属性:为保证浏览的流畅,应减少中间等待的时间,因此应对下一步需使用的媒体做预测等。»制作发布期的质量保证:保证在遇到较大的媒体时能保持浏览的流畅,应在发布时将视频等流式化。2020/3/813软件系统的需求种类复杂2020/3/814什么是软件架构视图–个架构视图是对于从某一视角或某一点上看到的系统所做的简化描述,描述中涵盖了系统的某一特定方面,而省略了于此方面无关的实体。–架构要涵盖的内容和决策太多了,超过了人脑“一蹴而就”的能力范围,因此采用“分而治之”的办法从不同视角分别设计;同时,也为软件架构的理解、交流和归档提供了方便。–多视图方法是软件架构归档的方法,更是指导我们进行架构设计的思维方法。2020/3/8152020/3/816逻辑架构–逻辑架构关注功能。其设计着重考虑功能需求。开发架构–开发架构关注程序包。其设计着重考虑开发期质量属性,如可扩展性、可重用性、可移植性、易理解性和易测试性等。运行架构–运行架构关注进程、线程、对象等运行时概念,以及相关的并发、同步、通信等问题。–其设计着重考虑运行期质量属性,例如性能、可伸缩性、持续可用性和安全性等。物理架构–物理架构关注软件系统最终如何安装或部署到物理机器。其设计着重考虑“安装和部署需求”。以及如何部署机器和网络来配合软件系统的可靠性、可伸缩性等要求。数据架构–数据架构关注持久化数据的存储方案。设计着重考虑“数据需求”。2020/3/817关系逻辑视图。逻辑视图不仅关注用户可见的功能,还包括为实现用户功能而必须提供的“辅助功能模块”;它们可能是逻辑层、功能模块等。开发视图。开发视图关注程序包,不仅包括要编写的源程序,还包括可以直接使用的第三方SDK和现成框架、类库,以及开发的系统将运行于其上的系统软件或中间件。开发视图和逻辑视图之间可能存在一定的映射关系:比如逻辑层一般会映射到多个程序包等。运行视图。和开发视图的关系:开发视图一般偏重程序包在编译时期的静态依赖关系,而这些程序运行起来之后会表现为对象、线程、进程,运行视图比较关注的正是这些运行时单元的交互问题。物理视图。和运行视图的关系:运行视图特别关注目标程序的动态执行情况,而物理视图重视目标程序的静态位置问题;物理视图是综合考虑软件系统和整个IT系统相互影响的架构视图。2020/3/8182020/3/8192020/3/820软件生命周期与软件架构介绍2020/3/82121软件架构师的定位系统架构师的职责:一、理解系统的业务需求,制定系统的整体框架(包括:技术框架和业务框架)二、对系统框架相关技术和业务进行培训,指导开发人员开发。并解决系统开发、运行中出现的各种问题。系统架构师的目的:对系统的重用、扩展、安全、性能、伸缩性、简洁等做系统级的把握。系统架构师能力要求:一、系统架构相关的知识和经验。二、很强的自学能力、分析能力、解决问题的能力。三、写作、沟通表达、培训。2020/3/82222角色软件架构师SoftwareArchitect定义主导系统全局分析设计和实施、负责软件构架和关键技术决策的角色2020/3/82323职责–领导与协调整个项目中的技术活动(分析、设计和实施等)–推动主要的技术决策,并最终表达为软件构架–确定和文档化系统的相对构架而言意义重大的方面,包括系统的需求、设计、实施和部署等“视图”–确定设计元素的分组以及这些主要分组之间的接口–为技术决策提供规则,平衡各类涉众的不同关注点,化解技术风险,并保证相关决定被有效的传达和贯彻–理解、评价并接收系统需求–评价和确认软件架构的实现2020/3/82424专业技能技术全面、成熟练达、洞察力强、经验丰富,具备在缺乏完整信息、众多问题交织一团、模糊和矛盾的情况下,迅速抓住问题要害,并做出合理的关键决定的能力。具备战略性和前瞻性思维能力,善于把握全局,能够在更高抽象级别上进行思考。对项目开发涉及的所有问题领域都有经验,包括彻底地理解项目需求,开展分析设计之类软件工程活动等。具备领导素质,以在各小组之间推进技术工作,并在项目压力下做出牢靠的关键决策。拥有优秀的沟通能力,用以进行说服、鼓励和指导等活动,并赢得项目成员的信任。2020/3/82525以目标导向和主动的方式来不带任何感情色彩地关注项目结果,构架师应当是项目背后的技术推动力,而非构想者或梦想家(追求完美)精通构架设计的理论、实践和工具,并掌握多种参考构架、主要的可重用构架机制和模式。具备系统设计员的所有技能,但涉及面更广、抽象级别更高。2020/3/82626软件架构师的知识体系软件架构师作为整个软件系统结构的总设计师,其知识体系、技能和经验决定了软件系统的可靠性、安全性、可维护性、可扩展性和可移植性等方面的性能。因此一个优秀的软件架构师必须具备相当丰富的知识、技能和经验。通过对比软件架构师和系统分析师在软件开发中的职责和角色,不难发现软件架构师与系统分析师所必需的知识体系也是不尽相同的,系统分析师的主要职责是在需求分析、开发管理、运行维护等方面,而软件架构师的重点工作是在架构与设计这两个关键环节上。因此在系统分析师必须具备的知识体系中对系统的构架与设计等方面知识体系的要求就相对低些;而软件架构师在需求分析、项目管理、运行维护等方面知识的要求也就相对低些。2020/3/82727成为一名合格的软件架构师必须具备的知识–信息系统综合知识体系–软件架构知识体系2020/3/82828?MFC,MSF,MOF,RUP,J2EE,Spring,SOA,JUnit,ORM,.NetMVC,UML,XML,Corba,MDA,MDD,Web-ServiceRSS,Web2.0,AJAX,Serverlet,HibernateIOC,AOPRubyOnRailsRupBPELWorkflowEngineLBSOracleCMMIMQ…2020/3/82929软件架构师在干什么?思考、思考、再思考–深入理解、准确把握建设的业务需求–分析所有可见的问题、障碍、风险–充分参考已有的成功方案,降低风险交流、讨论、博弈、质疑–对构思中的方案不断提出质疑,避免漏洞–广泛听取各层面的意见,开拓思路–反复质疑、逐步完善已有的设计构思在动手实现之前验证设计方案的正确性2020/3/83030软件架构师的知识结构软件知识–最好要有系统开发全过程经验。–对IT建设生命周期各个环节有深入了解,包括:系统/模块逻辑设计、物理设计、代码开发、项目管理、测试、发布、运行维护等。–深入掌握1-2种主流技术平台上开发系统的方法。–了解多种应用系统的结构。–了解架构设计领域的主要理论、流派、框架。2020/3/83131软件架构师的知识结构业务知识–深入了解系统建设的业务需求。–了解系统的非功能需求和运行维护需求。–了解企业IT公共设施、网络环境、外部系统。2020/3/83232软件架构师的思维方式基于框架的思维–架构设计的层次(Enterprise,Application,etc)–IT的生命周期(What,Why,Where,How,When,etc)–成功经验以及方法论的指导合理把握技术细节–把握各个层次应有的内容–合理忽略不应有的技术细节2020/3/83333软件架构师的思维方式风险管理意识–采用成功经验、避免不应有的风险多方位的开放思维–多维度、多方向、包容性、避免排他性–分析、质疑、抽象、归纳–没有绝对好的架构设计,只有相对优秀的方案2020/3/834注意:并不存在通用的设计方法。我们认为,给定的某种固定的方法总是会顾此失彼,而且