架构设计流程

今天我主要说说架构设计流程,围绕着这么几个方面来讲?

(1)识别复杂度;

(2)设计备选方案;

(3)评估和选择备选方案;

(4)详细方案设计;

一、识别复杂度

在如下两篇文章中,我阐述了六个复杂度来源。

文章分别为:架构设计之六个复杂度来源

架构设计之六个复杂度来源(续)

如果不了解架构设计的六个复杂度来源可以参考我的上述两篇文章看看。

从软件层面上来看,前面说过,架构设计的目的就是为了解决软件系统的复杂度。所以我们在设计这个软件的时候,首先需要做的就是分析系统的复杂性。只有正确分析出了系统的复杂性,后续的架构设计方案才不偏离方向,否则,如果对系统的复杂性判断错误,即使后续的架构设计方案再完美再先进,都是南辕北辙,做的越好,错的越多越离谱。

比如,如果一个系统的复杂度本来是业务逻辑太复杂,功能耦合严重,架构师却设计了一个TPS达到50000/秒的高性能架构,即使这个架构最终的性能再优秀也没有任何意义,因为架构没有解决正确的复杂性问题。

针对诸如这样的例子,我们正确的做法是:

将主要的复杂度问题列出来,然后根据业务、技术、团队等综合情况进行排序,优先解决当前面临的最主要复杂度问题。

对于按照复杂度优先级排序解决的方式,存在一个普遍的担忧:如果按照优先级来解决复杂度,可能会出现解决了优先级排在前面的复杂度后,解决后续复杂度的方案需要将已经落地的方案推倒重来。这个担忧理论上是可能的,但现实中机会是不可能出现的,原因在于软件系统的可塑性和易变性。对于同一个复杂度问题,软件系统的方案可以有多个,总是可以挑出综合来看性价比最高的方案。

即使架构师决定要推到重来,这个新的方案也必须能够同时解决已经被解决的复杂度问题,一般来说,能够达到这种理想状态的方案基本都是依靠新技术的引入。例如,Hadoop能够将高可用、高性能、大容量三个大数据处理的复杂问题同时解决。

识别复杂度对架构师来说是一项挑战,因为原始的需要中并没有哪个地方会明确地说明复杂度在哪里,需要架构师在理解需求的基础上进行分析。有经验的架构师可能一看需求就知道复杂度大概在哪里;如果经验不足,那只能采用“排除法”,从不同的角度逐一进行分析。

二、设计备选方案

架构师在设计架构时,通常不能仅仅从一个角度上考虑,应该是从多个角度上看。从不同的角度可以衍生不同的备选方案。

目前业界有很多现成的解决方案,比如我们前面提到的OA方面,还有就是规则引擎,规则引擎除了Drools之外,还有OpenRules等。

虽然软件技术经过几十年的发展,新的技术层出不穷,经过时间考验,已经被各种场景验证过的成熟技术其实更多。例如,高可用的主备方案、集群方案、高性能的负载均衡、多路复用,可扩展的分层、插件化等技术,基本上只要我们有了明确的目标,基本上按图索骥就可以找到可选的解决方案。

解决方案太多,让人眼花缭乱,因为可选的实在是太多了,组合方案更多,往往一个问题的解决方案有很多个,如何设计最终的方案,并不是一件容易的事情,这个阶段也是很多架构师容易犯错的地方。

常见错误如下所示:

1.设计最优秀的解决方案

2.只做一个方案

3.备选方案过于详细

关于“设计最优秀的解决方案”,我在前几篇有关架构方面的文章中说过,任何架构都是由简单到复杂,一步一步扩展,一步一步演化过来的。

包括最普通的方案变为最优秀的方案也是如此,就好比一个屌丝逆袭,屌丝逆袭成为高富帅,也是需要一个过程的。

关于“只做一个方案”,就好比今天貌似阳光明媚是一个很适合出门的日子,借此机会出去玩耍,比如去欢乐谷玩,但是很多项目要排队,排队是不可避免的,总不可能打道回府不玩了吧。

这就需要你心中有好几个方案,比如路线方案、舍得方案。

路线方案是比如玩完激流勇进后可以顺便玩下一些不是很刺激的小项目来段放松的插曲。

舍得方案是欢乐谷那么多项目,休息日人肯定是非常多的,总不可能全部玩完吧(有的项目是有时间限制,比如极速飞车早上10点30到晚上6点之间这段时间才能玩,超过六点后就不能玩了)。

从出去玩这个大家都喜欢的生活方式考虑,只做一个方案是不行的,更何况软件这种复杂多变的玩意呢。

关于“备选方案过于详细”,如果一个两个甚至三个还好,请问如果十几个的话,架构师岂不是会累死,十几个方案面面俱到,最后的结果可能是浪费了大量时间反而费力费时不讨好。

一般备选方案遵循简化话就好,当然了,也不能太简单,还是得有点篇幅,不过这个篇幅不是写作文那样动不动至少800字。

三、评估和选择备选方案

在完成备选方案设计后,如何挑选出最终的方案也是一个很大的挑战,主要原因为如下三个方面:

(1)每个方案都是可行的,如果方案不可行就不应该作为备选方案;

(2)没有哪个方案是完美的;

(3)评价标准主观性比较强;

正是因为选择备选方案存在这些困难,所以实践中很多设计师或者架构师就采取了下面几种指导思想:

(1)最简派(柿子还是挑软的捏);

(2)最牛派(一般倾向于使用非常牛逼的技术);

(3)最熟派(挑选自己以往设计方案最有经验的);

(4)领导派(自己把握不准,列出好几个方案,最后让领导去决策,好的话,说明领导有远见,自己设计也不错,把握的很好,不好的话,这个背锅任务就交给领导吧,反正当初是你挑的,不管我的事情,这种领导派显得比较圆滑);

前面列出了几种指导思想,真正应该选择哪种方法来评估和选择备选方案呢?李运华先生对此的观点是:360度环评。

具体的操作方式是:列出我们需要关注的质量属性点,然后分别从这些质量属性的维度去评估每个方案,再综合挑选适合当时情况的最优方案。

常见的方案质量属性点分别是:

(1)性能;

(2)可用性;

(3)硬件成本;

(4)项目投入;

(5)复杂度;

(6)安全性;

(7)可扩展性;

举例说明:

以智能酒店项目来说,首先对于上述七点都要求比较高,硬件成本,也很大,比如客控系统(客控系统主要是对酒店房间里面的电脑、电视、空调、洗衣机、灯光亮度等由客户自己在触摸屏上调制或者关注小程序来调控),客控系统硬件成本投入是比较大的,对于性能方面要求也很高,假设你这个系统性能不是特别好的话,通常对于用户量少,造不成很大的影响,如果用户量十分大,造成的将会是毁灭性打击。智能酒店项目囊括比较广,上述七点都要求很高。我仅仅只是挑出两点来讲。剩下的读者可以自行结合自己的项目来比对。当然了,也可以去百度上找一些项目来研究研究,研究它的架构为什么要这样。以上面指导思想来看,并结合质量属性点,你一定会发现不一样的东西。

四、详细方案设计

以瀑布模式为例,从侧面反映出详细方案设计的重要作用。

瀑布模式是这样的:可行性方案分析->需求分析->概要设计->详细设计->编码->单元测试->测试->集成->运行维护。

其中详细方案设计的目的在于精确化准确化,在瀑布模式中你可以理解为只要详细设计做的好,程序员可以不过多的思考,就可以直接开始编码了。

从架构上看,架构的详细方案设计做不做的好,不仅仅对当下,还有对将来,如果你的架构详细设计方案让人家看的云里雾里,那么最后可能就像我前面说到过会造成毁灭性的打击,这个打击效果不是特别大的情况你可能需要重构一部分,如果很大的话,可能推到重来。这个推到重来,我在最初的pms的系统中就已经感触很深了。借此机会,希望给大家一个警惕。

小结:

本文围绕着识别复杂度、设计备选方案、评估和选择备选方案、详细方案设计等四个方面来讲述架构设计流程,希望能给大家有一定的启发并在实际开发或者设计中有一定的借鉴意义。

感谢李运华先生的专栏《从0开始学架构》,从中我还是学了不少东西。有一句我要阐述一下,旧书不厌百回读,熟读深思子自知。记得当初在校学编程的时候,我哥哥推荐了一本书叫《计算机文化》,书中涵盖很多计算机理论基础方面的知识,当时我没有看也看不怎么懂,后来有一天,我突然将其全部翻了一遍,感觉其实并不是那么难懂难看,还是很有意思的,很多基础方面的知识,你每抽点时间回头看看,一定会有不一样的启发。比如你干了五六年的Java回头再看看《Java编程思想》,你会觉得书虽然厚点但是其实很薄。这是当初参加美团的技术沙龙,一位IT朋友对我说的。当然了,以我现在的情况下,读读《Java编程思想》还是有些吃力的。

此文部分内容参考李运华先生的《从0开始学架构》

原文地址:https://www.cnblogs.com/youcong/p/10050770.html

时间: 2024-10-09 21:02:41

架构设计流程的相关文章

tiG - 原型改进、架构设计与测试计划

施工中 WBS 架构设计 ? 流程概览 ? 目录结构 原型改进 ? 欢迎主页 ? 日志视图 ? 工作区 下周任务安排 ? 工作区:卢明凯.刘海港.邹卓辉 (预计1周) ? 提交历史视图:泽瑞坤 (预计1.5周) ? 测试与翻译工作:张凯亮 (预计1周) 测试计划 由于是全员参与到GitLib中的接口开发,故由各个提交者负责对应的单元测试编写,最后凯亮会进行回溯测试. GUI的单元测试由于时间有限,暂时没有加入的计划. 后续计划 由于时间有限且课程安排紧张,同时接下来考试等事情较多,我们目前的计划

【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)

作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 :  -- u-boot 源码 : http://download.csdn.net/detail/han1202012/8342761 -- S3C2440 文档 : http://download.csdn.net/detail/han1202012/8342701 -- S5PV210_iROM_Applicati

分布式任务调度平台SIA-TASK的架构设计与运行流程

一.分布式任务调度的背景 无论是互联网应用或者企业级应用,都充斥着大量的批处理任务.我们常常需要一些任务调度系统来帮助解决问题.随着微服务化架构的逐步演进,单体架构逐渐演变为分布式.微服务架构.在此背景下,很多原先的任务调度平台已经不能满足业务系统的需求,于是出现了一些基于分布式的任务调度平台. 1.1 分布式任务调度的演进 在实际业务开发过程中,很多时候我们无可避免地需要使用一些定时任务来解决问题.通常我们会有多种解决方案:使用 Crontab 或 SpringCron (当然这种情况可能机器

宜信开源|分布式任务调度平台SIA-TASK的架构设计与运行流程

一.分布式任务调度的背景 无论是互联网应用或者企业级应用,都充斥着大量的批处理任务.我们常常需要一些任务调度系统来帮助解决问题.随着微服务化架构的逐步演进,单体架构逐渐演变为分布式.微服务架构.在此背景下,很多原先的任务调度平台已经不能满足业务系统的需求,于是出现了一些基于分布式的任务调度平台. 1.1 分布式任务调度的演进 在实际业务开发过程中,很多时候我们无可避免地需要使用一些定时任务来解决问题.通常我们会有多种解决方案:使用 Crontab 或 SpringCron (当然这种情况可能机器

《游戏架构设计与策划基础》笔记 第一章 游戏策划概述(上)

1.1 什么是游戏策划 游戏的目的就是通过玩来获得娱乐,因此,设计游戏既需要艺术家一样的创造力,也需要工程师一样的精心规划.游戏设计是一门手艺,就像是好莱坞的电影摄像或服装设计一样.一个游戏既含有艺术要素,也含有功能要素:它必须能给人以美的享受,同时又必须能很好地运行,让游戏者享受到快乐.具备这两种特点的游戏才是好的游戏. 1.2 游戏策划的任务 游戏策划根据自己的创作理念,结合市场调研得来的数据,参考其他开发人员的意见和建议,在开发条件允许的基础上,将游戏创意以及游戏内容和规则细化完整,形成策

Swing程序最佳架构设计—以业务对象为中心的MVC模式(转)

前言: 我打算写一系列关于Swing程序开发的文章.这是由于最近我在做一个Swing产品的开发.长期做JavaEE程序,让我有些麻木了.Swing是设计模式的典范,是一件优雅的艺术品,是一件超越时代的产品! 有机会作Swing软件的开发,让我非常有感觉! 呵呵,希望有机会能够用Java3D编写软件,那种感觉一定更棒! Java和Swing都是杰作.我这个人对别人一向很挑剔的,能够得到我由衷地赞誉,可想而知它们有多优秀了.奇怪的是,它们居然一直都无法占领桌面市场.有人说这是技术的原因.我认为这应该

谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现

一.前言 <码神联盟>是一款为技术人做的开源情怀游戏,每一种编程语言都是一位英雄.客户端和服务端均使用C#开发,客户端使用Unity3D引擎,数据库使用MySQL.这个MOBA类游戏是笔者在学习时期和客户端美术策划的小伙伴一起做的游戏,笔者主要负责游戏服务端开发,客户端也参与了一部分,同时也是这个项目的发起和负责人.这次主要分享这款游戏的服务端相关的设计与实现,从整体的架构设计,到服务器网络通信底层的搭建,通信协议.模型定制,再到游戏逻辑的分层架构实现.同时这篇博客也沉淀了笔者在游戏公司实践五

分布式架构设计之电商平台

分布式架构设计之电商平台 何为软件架构?不同人的答案会有所不同,而我认为一个好的软件架构除了要具备业务功能外,还应该具备一定的高性能.高可用.高伸缩性及可拓展等非功能需求.而软件架构是由业务架构和技术架构两部分组成,因为有了业务结构才会催生出软件架构,进而来满足业务上的需求,所以,在做软件架构设计时,需要分为业务架构设计和技术软件架构设计,二者不可分离哦!那么,接下来就以本人实际工作中的电商平台为例,进行说明电商平台架构设计,因为不同行业产品系统不同业务不同,而催生的系统软件的实现要求及架构设计

ENode框架Conference案例分析系列之 - 架构设计

Conference架构概述 先贴一下Conference案例的在线地址,UI因为完全拿了微软的实现,所以都是英文的,以后我有空再改为中文的. Conference后台会议管理:http://www.enode.me/conference Conference前台预定座位:http://www.enode.me/registration ENode论坛开源案例:http://www.enode.me/post ENode开源项目地址:https://github.com/tangxuehua/e