当今软件系统行业中,软件架构决定了,软件的好坏。就好比人等骨架,如果人等骨架都不好,那么人也很脆弱。软件架构这个在软件工程领域将是一个永恒的话题。随着软件行业的高速发展,现在国际软件工程界在软件架构设计方面已经获得来较快发展,大量图书、文章和文献记载来这方面等成熟经验与成果。软件架构设计往往是一件非常复杂等工作,涉及到很多细节和方方面面,可探讨等话题也很多。但是架构没有最好的,所以你如果认为成熟或者那个人架构出来的架构很完美,其实是不能怎么说的,只能说架构是很适合它的系统。并不是可以直接搬来用。架构适应软件就是完美的。
架构决定成败
软件架构是软件产品、软件系统设计当中等主要结构和主要矛盾。任何软件都有架构,哪怕最基本等“HelloWorld”程序。软件架构设计的成败决定了软件产品和系统研发等成败。软件架构自身所具有等属性和特点,决定来软件架构设计等复杂性和难度。
在管理学上有“细节决定成败”,这话不能算是全对,细节确实很重要,一方面,战术细节固然很重要,但是,战略也同样重要。只能说战略决定了整体的成败,如果战略都错了,那么细节有什么意思了。因此 战略正确+专注细节+运气=成功。
类似地,正确的软件架构设计,应该既包括战略全局上的设计,也包括战术细节(关键路径)上的设计。有一种错误的观点认为,软件架构设计只要分分层和包,画一个大体的轮廓草图,就完事了。这种“纸上谈兵”型的架构师行为是非常有害的。事实上,既然软件架构是软件建筑的主体结构、隐蔽工程、承重墙和要害部位,那么软件架构也必然要落实到实际的算法和代码,不但要有实现代码,还要包括对这部分架构进行测试的代码,以保证获得高质量的、满足各种功能和非功能质量属性要求的架构。除了完成概念、模型设计外,软件架构师一定要参与实际的编码、测试和调试,做一位真正的hands-on practitioner,这已经成为了敏捷软件工程所倡导的主流文化。
两个架构
我们在日常的软件产品和系统开发中,实际上会遇到两种、两个部分的软件架构,即待开发的应用部分的软件架构(简称“应用架构”),以及既有的基础平台部分的软件架构(简称“基础架构”)。这两部分架构之间是互为依赖、相辅相成的关系,它们共同组成了整个软件产品和系统的架构。
基础架构的例子包括:.NET和J2EE等主流的基础平台和各种公共应用框架,由基础库API、对象模型、事件模型、各种开发和应用的扩展规则等内容组成。我们只有熟悉基础架构的构造细节、应用机理,才能有效地开发出高质量、高性能的上层应用。然而,开发一个面向最终用户的软件应用系统和产品,仅仅掌握一般的计算机高级编程语言知识和基础平台架构、API的使用知识显然是不够的,我们还需要根据客户应用的类型和特点,在基础架构之上,设计出符合用户要求的高质量应用软件。
熟悉OOA、OOD抽象建模技术、设计原则以及架构模式和设计模式等等方法技术,不但有助于我们更好地理解和利用基础平台架构,也有助于我们设计开发出更高质量的应用软件架构。
风险驱动、敏捷迭代的架构设计与开发
软件架构将随着软件产品和系统的生命周期而演化,其生命期往往超过了一个项目、一次发布,甚至有可能长达数年之久,因而软件架构无论对于客户还是开发商来说都是一项极其重要的资产。
软件架构的设计应该遵循什么样的开发过程?或者说,有没有更好的、成熟的软件架构设计和开发过程?回答是,21世纪的软件架构设计应该优先采用敏捷迭代的开发方式和方法。与传统做法不同,敏捷迭代开发主张软件架构采用演进式设计(evolutionary design),一个软件产品或系统的架构是通过多次迭代,乃至多次发布,在开发生命周期中逐步建立和完善起来的。
好的软件架构不是一蹴而就的。在架构设计开发过程中,我们应该尽量避免瀑布式思维,通过一个“架构设计阶段”来完成系统的架构设计乃至详细设计,然后再根据架构图纸和模型,在“编码实现阶段”按图索骥进行架构的编码与实现。这种传统做法的错误在于认为软件架构就是图纸上的模型,而不是真正可以高质量执行的源代码。几十年的软件工程实践表明,没有经过代码实现、测试、用户确认过的架构设计,往往会存在着不可靠的臆想、猜测和过度设计、过度工程,极易造成浪费和返工,导致较高的失败率。
风险是任何可能阻碍和导致软件产品/系统研发失败的潜在因素和问题。软件架构是软件产品和系统研发的主要矛盾和主要技术风险,软件架构的质量决定了整个软件系统和产品的质量。不确定性往往是软件架构设计当中一种最大的潜在风险。因此,软件架构的设计与开发应该遵循风险驱动的原则,在整个开发生命周期内至始至终维护一张风险问题清单,随着迭代的前进,根据风险的实时动态变化,首先化解和处理最主要的架构风险,再依次化解和处理次要的架构风险。
架构设计的可视化建模
软件架构设计的难度源于软件设计问题本身的复杂性,一个复杂的软件系统往往存在大量复杂的、难于被人类所理解的细节和不确定因素。抽象与建模是人类自诞生以来就已掌握的理解复杂事物的方法,因而人类所从事的软件设计工作本质上也是一个不断建模的过程。我们可以通过各种抽象的模型和视图,从各个不同层次、宏观和微观的角度来理解复杂的软件架构,以保证作出正确和有效的设计。
有人认为:“软件架构就是源代码(source codes)”以及“源代码就是设计”。这种说法其实是片面的。什么是真正的软件?我们知道,最终可以在电脑上执行的真正的软件其实是二进制代码0和1,借助编译器我们把高级编程语言翻译成底层的汇编语言、机器语言等,没有人能直接、完整地看到二进制程序在CPU上的实际运行状况(runtime),人们大多只能通过各种调试工具、窗口视图等方式来间接地动态观察这些真正的软件的运行片段。因此,Java、C#、C++ 等等设计时(design time)源代码在本质上也是一种模型,虽然是一种经处理后可执行的静态模型,但显然它们并不是真实软件和软件架构的全部。可见,源代码模型(有时也叫实现模型)与UML模型其实都是软件架构的一种模型(逻辑反映),差别就在于抽象层次的不同。完整的软件架构(建筑)不仅仅包括源代码(实现模型),还包括了需求模型、分析模型、设计模型、实现模型和测试模型等等许多模型,软件架构本身就是一组模型的集合。
UML、SysML是当前国际上流行的软件/系统架构可视化建模语言。在编写实际的代码之前,利用包图、类图、活动图、交互图、状态图等等各种标准图形符号对软件架构进行建模,探讨和交流各种可行的设计方案,发现潜在的设计问题,保证具体编码实现之前抽象设计的正确性,被实践证明是一种非常有效和高效、敏捷的工作方式。
架构设计的重用
重用(Reuse)是在软件工程实践中获得高效率、高质量产品和系统开发的一种基本手段和主要途径,通过有组织的、系统和有效的重用,我们往往可以获得10倍率以上的效率提升。而一个优秀的、有长久生命力的软件架构(比方主流的一些框架软件),其本身或其组件被重用的次数越多,其体现的价值也就越大。
软件重用有各种不同的范围、层次、粒度和类型,从函数重用、类重用、构件/组件重用、库(API)重用,到框架重用、架构重用、模式重用,再到软件设计知识、思想的重用等等,重用的效能和效果各有不同。
软件工程经过几十年的发展,已经积累了大量的软件架构模式和设计模式,它们记载、蕴藏了大量成熟、已经验证的软件设计知识、思想和经验。我们平时对各种基础平台、主流框架和API的应用和调用,本身就是一种最为普遍的重用形式。而一个优秀、成熟的软件研发组织,必然会在日常开发中注意收集各种软件设计知识和经验,建立和维护基于架构模式和设计模式等内容的软件重用知识库,积极主动和频繁地运用各种软件模式来解决实际工程问题。
框架(Framework)是一类具有高可重用度的软件,针对某一类应用或领域,它们具有非常灵活的、高度可扩展的软件架构。那么,如何才能设计出可重用的软件架构或其组件?借助于OOA、OOD等抽象分析和设计技术是一种重要的方法。人们在实践中发现,往往越抽象的东西,其适应面也就越广,可重用度也就越高;相反,越具体的东西,其适应面也就越窄,可重用度也就越低。重用,意味着充分利用现成、既有的东西、成果来解决新问题或重复的问题,以“不变”应“万变”。在软件架构设计中,应该主动地区分软件架构中的“不变”与“可变”之处,系统地管理好这些稳定点和变化点以适应未来的变化,这也是提高软件架构重用度、获得高质量框架设计的一种重要方法。
架构设计的权衡
与其它所有工程行业一样,软件工程本质上也是一门讲究权衡的科学和艺术。软件架构设计的最难之处往往在于如何在各种相互竞争、矛盾的制约条件之下,作出巧妙的最佳权衡。软件架构设计的权衡水平,也是最能体现软件架构师的设计经验、能力和技巧的地方。
在软件开发和软件架构的设计过程中,从选择平台,到选择语言,选择框架,选择设计模式,选择工具…等等,我们无时不刻都需要权衡,对各种候选项作出合理评判。在架构师带领下,软件研发团队往往还需要对近期目标与远期目标、质量与速度和效率、质量与成本、功能与性能、灵活性与复杂性…等等许多彼此矛盾的设计选项、因素和约束进行细致、小心和理性的权衡。
理性权衡意味着科学决策。进行有效的架构设计权衡,离不开科学的方法,也就是如何运用定量分析和定性分析相结合的方法、因果逻辑和根源分析等等技术,找到最终的甜点(Sweet Spot)。许多时候,能否在很短的时间内。
分享到:
相关推荐
在当今软件行业的快速发展中,软件架构设计的重要性愈发凸显,它不仅仅决定了软件的整体结构和功能实现,更在很大程度上影响了软件的可扩展性、可维护性和性能。一个合理的软件架构如同人体的骨架,支撑起整个软件...
整个培训课程的目标是通过掌握.NET开发技术、设计模式、软件架构设计要点和SOA等理念或技术,让学员能够了解当前软件发展的热点技术。此外,培训还包括了软件架构设计方法论、软件架构设计模式、软件架构设计流程、...
本文总结了软件平台架构设计与技术管理之道的重要性、架构设计要点、架构设计目标与原则、技术管理的关键作用等知识点。 一、软件平台架构设计的重要性 软件平台架构设计是指软件系统的基本结构、组件和模块的组合...
作者提倡的“逻辑架构+物理架构”设计方法,能让读者从宏观到微观全面把握软件架构设计的要点。 需求分析作为软件开发的起始点,在本书中占据了相当的篇幅。作者讨论了需求开发的两个部分,即愿景分析和需求分析,...
软件架构设计的核心要点包括: 1. **相机图像获取**:利用Linux下开源的相机驱动和API,如GigE Vision或USB3 Vision,实现从相机高效稳定地获取图像。 2. **图像预处理**:图像在被送入特定的视觉算法之前,可能...
2. **方法论与架构设计**:敏捷方法如Scrum或Kanban可以应用于架构设计过程中,通过短周期的Sprint或迭代,确保架构设计始终保持与当前需求的一致性。 3. **架构设计的敏捷视图**:敏捷架构不仅关注系统的整体结构...
系统架构设计师(高级)复习精华 1系统架构:系统架构师是怎样炼成的 2系统架构:小议软件架构设计要点3
### 软件架构设计的思想与模式 #### 一、软件架构设计的重要性 软件架构设计在软件开发过程中占据着至关重要的地位。一个优秀的软件产品不仅仅依赖于高效的编码,更重要的是良好的架构设计。软件架构设计决定了...
课程内容涵盖软件架构设计、软件工程、项目管理等关键领域,旨在覆盖广泛的理论知识,确保零基础考生也能理解和掌握考试要点。本课程特别适合那些对基础知识掌握不牢固,需要明确复习方向的考生。 在计算机组成与...
二、软考系统架构设计师考试要点 1. 考试大纲:了解考试的范围和要求,包括系统分析、设计、评估等技能。 2. 知识体系:涵盖计算机网络、操作系统、数据库、软件工程等多个领域的基础知识。 3. 设计原则:理解并掌握...
10. 考试指南和模拟题:《系统架构设计师教程(第2版)-希赛版》还应包括针对软考系统架构设计师考试的指南,提供模拟试题和历年真题解析,帮助考生了解考试要点和题型。 读者在使用本书时,应该将理论学习与实践相...
8. 多租户架构:由于SaaS应用通常需要支持多位租户(即多个客户),因此多租户架构是SaaS应用的另一个关键设计要点。该架构需要确保用户数据隔离和安全,并能够有效共享系统资源,降低每个租户的成本。 9. 订阅模式...
描述中提到的典型项目案例介绍,预示着培训中将采用实际案例来说明理论知识的应用,帮助学员更好地理解和掌握软件架构设计的要点。 培训内容的结构化表明,学员将会从架构设计的基本概念开始,逐步深入到架构分析、...
### 系统架构设计师考试知识要点 #### 一、系统架构师的概念与职责 **1.1.1 系统架构师的概念** - **现代信息系统架构三要素:** - **构件(Component):** 构成系统的最基本单元,如模块、服务等。 - **模式...
软件的容错能力是车载GPS系统软件架构设计的另一个核心要点。在实际使用中,用户可能经常进行手写输入或设置目的地等操作。如果系统偶尔无法响应触摸屏操作,那么可能是因为微控制器MCU与导航系统之间的通讯出现了...
课程会详细阐述这些组件之间的交互和设计要点。 在整个培训过程中,编码与设计并重,强调每个团队成员都需要具备优秀的面向对象分析与设计能力,以确保软件质量。课程内容深入浅出,涵盖OOAD、UML、RUP、DDD、重构...
### Hadoop分布式文件系统:架构和设计要点 #### 前提和设计目标 Hadoop分布式文件系统(HDFS)的设计初衷是为了满足大数据处理的需求,尤其是针对那些需要高吞吐量而非低延迟访问的应用程序。以下几点是HDFS设计...