Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >架构师必备底层逻辑:设计与建模

架构师必备底层逻辑:设计与建模

作者头像
腾讯云开发者
发布于 2024-08-07 06:57:36
发布于 2024-08-07 06:57:36
6030
举报

程序员往往习惯于接到需求立马开始撸代码,原因无非是需求急任务重老板盯得紧。但在实际的开发场景中,我们往往会发现,写完代码,需求变了;人力多了,质量差了;业务代码,写起来没劲…… 在追崇多人协作的现代软件开发体系下,这些问题背后的前置解决方案,其实就是设计和建模。本文将带你深入软件开发的初始,了解写代码前要做的几件事。

01、软件开发需求现状与实际困局

古早时期的软件开发,老夫写代码就是一把梭,Ctr C+V,单测是什么?直接上线!有问题下个版本再改,业务需求不等人,哪有时间做排期。

而随着互联网的不断发展,当前时代下的软件开发已经形成了集团军作战、体系化排需、工程化落地、自动化测试的正规路子。——从需求,编码实现,测试,发布的流程中不断优化,利用 CICD,加速迭代。

即便是业界广受推崇的“Two Pizza Team”,除了 2-3 个研发人员,也还会配备一定规模的产品经理,更别提测试、运维、运营等人员了。需求越来越复杂,人力堆砌就成了必然,想上线?先取号排期吧!

然而,研发流程确实规范化了,速度也确实提上去了,需求变更却还是让开发人员头痛不已,项目质量也在持续变差。老板还在“速度、质量、成本”的不可能三角中,一遍一遍地强调既、又、还……

怎么办?结构性的问题往往无解,但动手写业务需求代码前,确实还有更多提高效率的工作可以做——设计和建模。

02、为什么要做设计和建模?

所谓架构师,是软件开发中那些对业务抽象做得最好的人,随着级别的提升,工程师所面对的需求会越来越抽象。承接抽象需求,提供抽象架构是架构师走向卓越的必经之途。

这有点类似于建筑行业,一栋摩天大楼的落地建成,往往需要特别精密的前期测算与图纸设计,在分析设计之后,按照图纸规划施工——写代码也应当如此。

设计建模的有效性源于,一,重新回到业务的跑道,跟业务一致;二,设计建模才能让协作真实有效;

研发和业务需求的摩擦,本质是研发实现跟实际需求不一致,无论是研发走偏了,没有理解需求,还是需求本身不能满足涉众的利益,都会使得最终上线的功能需要回炉重造,折磨项目组的成员。从设计的语言上看,设计的层次有所不同,不仅仅有代码细节上的设计,也有业务上高层次的设计,高层次的设计是用业务的术语去表达,最贴近业务实际情况,也能帮助研发同学发现业务中不合理的点。

进行设计建模能够让协作变得有效,一方面,设计建模前期是沟通和信息对齐,将协作的内容提前,一方面,采用合适的图形化工具,review 的成本是相对较低的。

03、设计和建模的三个关键点

3.1 业务建模

业务建模主要聚焦于分析涉众利益,厘清业务流程。从工具上来说,主要是用例图,流程图;从内容上来说,主要是找人(利益涉众,系统执行者),找业务实体(其余系统,相关的重要对象)。

分析涉众利益:

  1. 找到软件产品的愿景,愿景表达了软件产品带来的核心意义。
  2. 找到利益相关的的涉众和其利益诉求。

一部戏演什么内容,不是演员决定,而是由台下各种观众的口味角逐而定。观众按照重要性排排坐,优先照顾第一排的口味 、然后第二排、第三排….…同理,软件系统也要依次照顾各排涉众的利益。涉众利益之间的冲突和平衡,决定了系统的需求。对于实在照顾不到的后排,很多时候只好抱歉了,这个系统可能会损害你的利益。

业务用例图:

知道了涉众的利益之后,就要分析业务流程,并对现有的流程进行改进。软件产品没诞生之前,业务是如何被处理的,找到原来业务的处理方式则可以梳理出业务用例。

以一个商城购买配送系统为例:

物流公司和设备渠道商都是辅助购买设备的执行者,因此放到右边。值得注意的是,业务用例要体现价值,虽然在实际业务流程中,商户同时做了很多事情,比如签收设备,但签收设备不能反映业务价值,故而只有一个购买设备的用例。

3.2 业务流程分析

完整的业务流程图可能很庞大,需要关注的是其中最有可能影响涉众利益的流程片段,如下为购买设备业务流程中配送设备的流程片段:

这里的业务流程问题体现在,配送设备的流程是在全部业务流程中较为繁重,人肉工作量大的流程片段,不符合涉众利益。所以系统需要改进流程,替代人的部分工作,如下图。

业务序列图中,每一个箭头代表的是职责,在业务序列图中,需要考虑的是职责的层次问题,过小的职责放入流程图中,会导致信息过载,忽略最有价值的职责。

业务流程分析是一件很复杂的事情,研发同学可以利用需求中的信息,同时加上自己跟涉众的日常沟通和调研,把握核心的涉众利益,业务用例和业务流程,就可以解决大部分在需求上的理解偏差问题。

3.3 系统建模

系统建模关注的是系统与外部的边界和系统自身的职责,主要聚焦两件事:1,画出系统用例;2,写出用例规约。

系统用例图

系统用例图是业务流程中,系统执行者与系统发生的有价值的交互。系统执行者可以是人,可以是外部系统,甚至可以是时间。系统用例要体现系统的价值,系统会做很多事情来实现业务价值,我们应当关注业务价值。有些是低层次的职责,没有体系具体价值,如:“获取商城订单信息”是为了配送订单中的设备而发生,应当关注“配送设备”。

如下是仓配系统的系统用例图:

系统用例规约

有了业务流程图和系统用例图,需要根据进一步细化系统边界上的约束,保证系统的稳定性。系统执行者与系统的交互细化了详细的约束,系统的稳定性才能提高,如果没有仔细列出约束,有可能会忽略一些边界条件,导致系统的故障;如:仓配系统不考虑来自第三方商城订单要配送的设备数量限制,则会因为第三方商城出现的错误,导致资产损失。

系统约束来源于系统用例,根据业务的规则,详细描述业务流程中的基本路径,扩展路径和约束。值得一提的是,约束不是告诉研发同学如何实现功能,约束是指业务规则,厘清系统执行者与系统之间的边界,以及边界上的约束。设计评审的时候,可以关注关键路径上的安全规则是否到位,这么做对提高系统的安全稳定有极大的帮助。

3.4 类的分析与设计

识别类

常见的类一般有三种——边界类、控制类和实体类。边界类是外部系统在系统内部的映射,借由边界类,系统和外部系统交互。一些接口请求、输入输出都属于边界类的职责。控制类往往体现用例流程,一般情况下,一个用例就是一个控制类。实体类是系统的核心,良好的实体类设计能够提高系统的复用程度,减低系统的复杂性。

找实体名词

识别具体的类需要去找业务流程、系统流程、系统规约中经常出现的名词。在前文的流程图中,订单、商城、设备、物流、用户是反复出现的名称,说明这就是类的业务实体体现。

找属性

类的属性不是凭空产生,需要对业务实现有价值。找到那些对于系统实现必不可少的属性,放到正确的类中。如仓配系统中的订单,包含订单号,商品,用户。用户则有收件地址。

找职责

业务规则和约束中,可以找到一些实体应当有的职责。以订单为例,其就具备验证合法性的职责。

状态机

对于一些主要的实体类,还需要设计出他的状态机,清晰的状态机能有效地厘清系统内的一些事件和状态,增强系统整体的健壮性。

以仓配系统中的订单为例,从用户购买的待发货状态,到通知物流发货,再到实际发货,物流签收有一系列状态的演变,这都要体现在状态机上。

04、总结

不同的建模理论中提到的名词概念很多,每个概念单独拿出来讲都可以写一个章节或者写成一本书。建议一开始不要陷入各种复杂概念的理解和纠结上,先去充分地理解何为面向对象,建模的本质是映射,再去回看各种建模书中阐述再多的道法术,因为这些招式都是围绕寻找软件对象世界中的人,事,物和规则展开的。这里也非常推荐大家去阅读《软件方法》、《软件建模与设计》等经典书籍。

写好代码只是软件实现的工程手段,如果没有好的设计、建模,再好的代码可能也是一种浪费。你说呢?

-End-

原创作者|boris

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-08-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯云开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
写代码之前应该做的几件事
作者:borisyang,腾讯 WXG 应用开发工程师 作为程序员,刚刚开始学会写代码,常常是接过需求就开始撸代码。有时候发现,写完代码,需求变了。更多时候,觉得写业务代码枯燥无聊,没有技术含量。另外一边的事实却是,项目里面研发人数变多了,项目的质量缺却变低了,多人开发也不过是一个个单打独斗的组合而已。 1 研发环境日益成熟 经历过 PC 互联网的不断深入发展,移动互联网的蓬勃生长,互联网进入了成熟繁荣期,研发环境也发生了巨大变化;从原来一个人,一把键盘,写完代码就上线,变成了更加规范的研发体系和更多
腾讯技术工程官方号
2020/07/14
1.3K0
架构师基本功:如何画好一张UML用例图?
在做程序设计的时候,开发同学往往都有类似的困惑:分不清楚业务用例图、系统用例图都是什么,二者的区别是什么,也不确定自己画的图对不对,会不会被评审挑战。 本文作者从业务建模角度切入,详细拆解了业务用例图和系统用例图的分析与画法,相信能够帮助你在之后的设计中画图信手拈来、得心应手。
腾讯云开发者
2024/08/14
9000
架构师基本功:如何画好一张UML用例图?
业务建模、业务用例图、系统用例图都是啥?一文读懂《软件方法》
虽然乍一看以为只是一本21天教你学画 UML 图的工具书,实际看下来,却是扎扎实实地在教你如何分析你的业务,找到组织的竞争优势。
腾讯云开发者
2024/07/09
2.3K1
业务建模、业务用例图、系统用例图都是啥?一文读懂《软件方法》
UMLChina建模竞赛题大全-题目全文+分卷自测(10套100题)
以下是UMLChina出过的建模竞赛题,答案不直接给出,可访问每套题后面的自测链接或扫二维码自测,做到全对才能知道答案。
用户6288414
2020/02/19
7770
何伟潮的《软件方法》读书笔记(用其他工具把书里的图画了一遍)(1-3)系统用例图
重点3:老大、愿景、需求都是基于现状寻找最值得的改进。改进过后,又是新的现状了,还是基于现状寻找最值得的改进。进一步说也可以说,需求只有真假对错,没有变化。说需求有变化,那是从一个静止时间点来看的。
用户6288414
2020/07/14
7920
代码千行不如架构图一张!程序员如何培养业务思维,做有价值的需求?
去年写的《业务系统是怎么逐步变成“万人嫌”的》只是回顾了系统是怎么一步步变坏,然而最难的部分怎么防止变坏却没有写出来,因为这涉及到流程规范、团队文化、组织管理等方方面面,我的认识有限确实无法全面总结,不过我可以站在一名普通研发的角度,选取“做有价值的需求”这一个点来继续聊聊。
腾讯云开发者
2024/06/19
1.2K0
代码千行不如架构图一张!程序员如何培养业务思维,做有价值的需求?
CTO也糊涂的常用术语:功能模块、业务架构、用户需求、文档
功能模块、业务架构、需求分析、用户需求、系统分析、功能设计、详细设计、文档、业务、技术……很多被随口使用的名词,其实是含糊甚至错误的。
用户6288414
2019/09/23
2.7K0
CTO也糊涂的常用术语:功能模块、业务架构、用户需求、文档
软件建模与文档:架构师怎样绘制系统架构蓝图?
首先,请你设想这样一个场景:如果公司安排你做架构师,要你在项目开发前期进行软件架构设计,你该如何开展你的工作?如何输出你的工作成果?如何确定你的设计是否满足用户需求?你是否有把握最后交付的软件是满足要求的?是否有把握让团队每个工程师清楚自己的职责范围并有效地完成开发工作……
小熊学Java
2023/11/27
7010
软件建模与文档:架构师怎样绘制系统架构蓝图?
团队内训-“软件需求设计建模方法学全程实例剖析”训练方案(202208更新)
http://www.umlchina.com/training/slide.html
用户6288414
2022/10/31
4750
团队内训-“软件需求设计建模方法学全程实例剖析”训练方案(202208更新)
《软件方法》强化自测题-需求(1)
答案不直接给出,可访问每套题后面给出的自测链接或扫二维码自测,做到全对才能知道答案。
用户6288414
2022/04/09
2040
《软件方法》强化自测题-需求(1)
UMLChina建模竞赛题答案及解析(添加试卷3和4解析)
建模竞赛题比起《软件方法》书中的题目要更难一些,可以作为熟悉了《软件方法》中的基本知识之后的进一步练习。题目颇有些陷阱,应一些同学的要求,挑部分题目给出答案并详细讲解,知识点其实都在书中。
用户6288414
2020/03/25
1.1K0
UMLChina建模竞赛题答案及解析(添加试卷3和4解析)
优秀的架构师,如何画一手好的架构蓝图?
今天我们来了解一些关于软件设计文档的基础知识,这样你在学习后面的具体案例时,就能更加清楚地理解文档是基于什么方式来组织的了。
码猿技术专栏
2023/12/26
6120
优秀的架构师,如何画一手好的架构蓝图?
业务开发方法与实践 - 业务篇
在大多数情况下,表示一个组织、公司或个人所从事的商业活动、服务或工作,有相应的流程和规则。可以理解为达成某种目的(如盈利、增长、满足客户需求等)所进行的各种活动,涉及到如何创建价值、满足需求和实现目标。
腾讯大讲堂
2023/11/22
5320
业务开发方法与实践 - 业务篇
《DDD 小册》第2章:DDD 建模 —— 架构师总说的风暴模型是什么?
四色建模(风暴事件)是整个 DDD 这套软件设计方法中用于工程拆分界限上下文的非常重要的实践手段。通过建模过程快速识别业务领域中的关键事件和核心流程,也是在这个过程中设计出领域对象的,为后面详细设计和代码开发做指导。
小傅哥
2024/07/25
8700
《DDD 小册》第2章:DDD 建模 —— 架构师总说的风暴模型是什么?
UMLChina建模竞赛题答案及解析(试卷1)
建模竞赛题比起《软件方法》书中的题目要更难一些,可以作为熟悉了《软件方法》中的基本知识之后的进一步练习。题目颇有些陷阱,应一些同学的要求,挑部分题目给出答案并详细讲解,知识点其实都在书中。
用户6288414
2020/03/12
8850
业务工人业务实体元模型-软件方法(下)第9章分析类图案例篇Part09
前面为了不干扰主要的知识点,一直在回避一个问题:怎么看待在组织外面和组织打交道的人?例如,以“中原城镇银行”为目标组织,它服务的储户算什么?
用户6288414
2022/10/31
5860
业务工人业务实体元模型-软件方法(下)第9章分析类图案例篇Part09
解读架构师的核心工作内容
很多做软件开发同学的梦想都是成为一名架构师,而架构师的核心工作就是做好软件设计。软件设计是软件开发过程中的一个重要环节,那么如何进行软件设计,其输出标准又是什么呢?软件设计过程中,如何和各个相关方沟通,使软件设计能同时满足用户的功能需求和非功能需求,并降低公司的开发成本?
架构之家
2022/07/12
7250
解读架构师的核心工作内容
UMLChina建模竞赛题答案及解析(添加试卷2解析)
建模竞赛题比起《软件方法》书中的题目要更难一些,可以作为熟悉了《软件方法》中的基本知识之后的进一步练习。题目颇有些陷阱,应一些同学的要求,挑部分题目给出答案并详细讲解,知识点其实都在书中。
用户6288414
2020/03/12
7710
基于UML的需求分析和系统设计
本文主要讲解如何在项目过程各阶段采用合适的UML图形进行分析和设计,重点关注以下问题:
架构之家
2022/09/01
1.1K0
基于UML的需求分析和系统设计
何伟潮的《软件方法》读书笔记(用其他工具把书里的图画了一遍)(1-2)业务序列图
重点3:老大、愿景、需求都是基于现状寻找最值得的改进。改进过后,又是新的现状了,还是基于现状寻找最值得的改进。进一步说也可以说,需求只有真假对错,没有变化。说需求有变化,那是从一个静止时间点来看的。
用户6288414
2020/07/14
4990
推荐阅读
相关推荐
写代码之前应该做的几件事
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档