架构设计策略之风险驱动设计
你今日预咗风险未?
每次与项目成员沟通后,应该都会预感项目有风险吧。
大概都会遇到这些问题:进度风险、技术难点、需求变更、资源分配问题等等。
别和我说,基本没啥风险,项目很稳定。真有这样没风险的项目,那就不需要架构师了。毕竟这样的项目肯定会有成熟的“轮子”,直接借鉴就好了。
实际上,没风险的项目很少,需要开发的软件项目总有风险的,因为实际需求都是随时间变化的。
我们日常生活很多事情都是看风险来做决定的,最明显莫过于股票、基金等投资行为,在自己能接受的风险范围内进行决策。这是因为风险可以反映出真实世界的不确定性,而且是一个很好的决策指示器,它能帮助我们看清障碍,做出合理的选择。
因此,风险是可以指导我们进行优秀的架构设计,也就是说我们可以采用风险驱动模型进行架构设计。
风险驱动设计
风险驱动模型就是以风险为中心,根据合乎逻辑的理由进行决策权衡的模型。
采用风险驱动的话,必须要能回答以下这些问题:
- 项目的主要失败风险有哪些?
- 应对失败风险的技术有哪些?
- 何时结束和恢复架构设计?
为了解答以上问题,主要的对策有:
- 识别风险、描述风险
- 选择技术降低风险
- 设定风险阈值,权衡架构设计
下面就将详细讲解以上的问题和对策。
风险
风险是指一个事件产生我们所不希望的后果的可能性。对于已经发生的,应该称之为事故。
以上对风险的定义无法直观衡量,我们借鉴下在工程领域对风险的定义,即:
风险 = 失败的概率 x 失败带来的影响
但定义中失败的概率和影响大部分的时候是难以精确度量的,除非我们能觉察到风险,也就是说只能在已知的条件下去定义风险。因此,风险的定义就变为:
当前已知条件下的风险 = 觉察到的失败的概率 x 觉察到的影响
此定义是让我们接受现实,尽力去降低觉察到风险,使架构设计达到已知的最优。
有了定义,首先我们要识别风险,然后就可以去描述风险,更深入地理解风险。
识别风险
识别风险的方法主要有:
- 确定难以实现的需求。例如,复杂难以理解的业务问题,就需要开需求会议来评估风险。
- 识别不完整或难以理解的质量属性(非功能属性)需求。例如,“保证可靠性”这种不可测试的质量属性,就需要开发质量属性研讨会来识别风险。
- 借鉴典型风险来识别。例如,web项目必须要关注安全性。
- 风险分类排序。以利益相关方需求的优先级和开发者觉察到的难度来进行风险分类排序。
描述风险
根据风险的定义,描述风险至少需要三个部分:条件、后果、优先级。条件是当前风险可能发生的实际情况,后果(觉察到的影响)是由条件引发的将来可能出现的不良状况,优先级(觉察到的失败的概率和影响等来确定)是已知条件下风险的重要程度。
然而,这样的描述方式缺乏项目交叉引用的能力,因此为了标识风险以及便于沟通理解,我们还需要加入四个部分:名称、编号、类型、来源。
我们可以采用表格的形式记录风险。例如,可以用表1作为示例来描述风险。
表1 描述风险
风险名称 | 风险编号 | 风险类型 | 条件 | 后果 | 优先级 | 来源 |
---|---|---|---|---|---|---|
数据处理风险 | R1.1 | 数据风险 | 业务系统CPU、磁盘和网络带宽已占有80%,数据处理将消耗大量的时间和资源 | 可能无法顺利完成任务 | 高 | 数据需求D1.1:必须1小时内处理完数据 |
通过描述理解了风险后,我们可以通过以下方式去降低或消除风险:
- 降低概率。减少业务系统的资源占有。
- 减少影响。优化数据处理的能力,提升资源的利用率。
- 减小风险发生的时间窗口。在业务系统空闲时,进行数据处理。
- 移除条件。增加CPU、磁盘和网络带等资源,或需求来源方沟通,降低质量属性的要求
- 接受现状,等接近不可接受的程度再着手处理。优先级不高,数据处理超时和资源不够用的情况较少出现,等解决完优先级高的风险后或风险优先级上升后再处理。
风险指导架构设计
一旦能清楚地识别和描述所面临的风险,就可以借助风险来指导架构设计,进而运用合适的技术去降低或消除风。
可以把风险理解为架构设计的GPS,它帮助我们进行架构设计的定位,告知我们目前在何地距离要去的目的地还有多远。
技术选择
根据风险选择技术是最敏捷高效的,这样就不会把时间和资源浪费在那些低效的技术上,也不会忽略那些危及项目的风险,主动地推动我们进行最优的技术选型。
借助风险选择技术的方法主要有:
- 分析风险的条件、影响、概率、时间窗口,确定可以解决的部分,进而选择解决问题的技术。
- 借鉴业界成熟解决方案。
- 研究密切相关的技术,寻找解决风险的技术
为了实现架构设计的可重复性,我们还可以总结经验,做出风险指导架构设计的指南。例如:
面临的风险 | 解决的技术 | 时间和成本预计 |
---|---|---|
数据处理无法顺利完成 | 增加硬件资源、引入数据处理框架 | 硬件资源每年花费XX元,引入XX框架学习成本是x个人天 |
设定风险阈值
风险的阈值到底是多少?
我们参考下《恰如其分的软件架构》对风险阈值的定义:风险降低到不再是系统中最大风险源的地步。当然这是主观的判断,但只要能保证所设计的架构能克服所面临的失败即可。
如果架构不再是系统中最大的风险源,就可以从主动设计转为被动设计,否则从被动设计转为主动设计。主动设计是指主动设法降低或消除风险。被动设计是指在需求变更、出现未知的性能问题等需要及时纠正的情况。
需要注意的是,架构还可以随时重新变回重大的风险源,这可能是因为现实环境的变化、重大的需求变更、不可控的项目管理风险等等。当这些情况出现时,肯定要切换回主动设计模型。
总结
运用风险驱动设计的方法,可以识别和描述风险,并选择一套架构和设计技术来降低或消除这些风险,还可以根据风险的重要程度和阈值,把握住架构设计的度,进行最高效敏捷的设计。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
架构设计策略之寻找设计的最佳平衡点
如果没有所谓的“Deadline”(最后期限),我们就不用担心架构设计的问题,因为我们有足够的时间去研究去学习找到最优的架构设计方案。然而,做梦是可以有的。那怎么寻找?相信大家都各有各的看法,基本分为这几派: 梭哈派,不要给我说什么架构设计、设计思维!老夫架构设计就是敲代码,边敲边设计,自然而然代码就是架构,想那么多还不如直接敲。 借鉴派,善于借鉴业界成熟项目的标准,都按成熟标准来就好。 灵活派,根据实际项目需求来做架构设计,最好看现场情况来判断。 文档派,都得写文档,写完整了文档,就能预防后续的问题和风险。 肯定不止上面的介绍的对于架构设计的看法,相信大家都有自己认同的看法,欢迎评论区留下“最强流派”。 那架构设计的最佳平衡点肯定会有架构大师做了研究的,下面将从专业的研究分析下。 架构设计对总工期的影响 参考Barry Boehm《Architecting: How Much and When?》书中项目工期的构成:开发、架构设计、返工(处理技术债:打补丁、改BUG、重构、重写)(见图2)。 可见,Boehm证明了随着架构设计时间的增加,开发和返工量都会减少。书中还详细地研究了系统规...
- 下一篇
Java并发编程专题系列之深入分析synchronized(基础篇)
synchronized同步关键字简介 synchronized是属于JVM层面的一个关键字,底层是通过一个monitor对象(管程对象)来完成,由于wait()/notify()等方法也依赖于monitor对象,所以只有在同步的块或者方法中才能调用wait/notify等方法 synchronized同步代码块底层实现 synchronized同步语句块的实现使用monitorenter和 monitorexit 指令。 monitorenter:指令指向同步代码块的开始位置 monitorexit:指令则指明同步代码块的结束位置 synchronized获取锁 当执行monitorenter指令时,当前线程将试图获取objectref(即对象锁) 所对应的 monitor的持有权,当 objectref的monitor 的进入计数器**为0,那线程可以成功取得 monitor,并将计数器值设置为 1,取锁成功。 如果当前线程已经拥有 objectref 的 monitor 的持有权,那它可以重入这个 monitor (关于重入性稍后会分析),重入时计数器的值也会加 1。 倘若其他线...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装Docker,最新的服务器搭配容器使用
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19