架构技能(四):需求分析
需求分析,即分析需求,分析软件用户需要解决的问题。
需求分析的下一环节是软件的整体架构设计,需求是输入,架构是输出,需求决定了架构。
决定架构的是软件的所有需求吗?肯定不是,真正决定架构设计的是关键需求或用户要解决的关键问题,其余非关键性的需求或非关键性的问题,可以用来验证软件架构设计的合理性。
需求分析,是在谈什么?谈识别关键需求。
如何识别关键需求呢?
关键需求具有决定性的意义和价值,根据笔者所参与研发过软件,总结为:关键需求往往是基础需求、核心需求和高风险需求。
-
基础需求:基础需求体现在软件上是基础功能,往往具有 “稳定” 和 “原子化” 特征;基础功能很稳定,很少受到需求变动的影响;而且,基础功能往往不会再拆分;基于基础功能,软件往往会衍生出更多的扩展功能;在电商系统中,像 “商品”、“订单”、“支付” 等属于软件的基础功能,以此为基础进行扩展的 “营销”、“评论”、“客服” 则属于软件的扩展功能。
-
核心需求:核心需求很容易理解,往往是软件必须要提供的能力,失去了核心需求,软件则没有意义;比如,移动手机系统的电话功能、智能汽车的驾驶功能、微信软件的聊天功能等等;识别关键需求,往往从识别用户必须要解决的关键问题入手来确认核心需求。
-
高风险需求:高风险需求往往会影响软件研发的成败,必须在软件架构设计时充分考虑其高风险性,提出解决方案,降低或消除其风险;高风险需求更多体现在非功能需求方面,比如:在电商系统中用户搜索任何一类商品必须在 0.5 秒内看到结果,在水利监测系统中任意1~3台服务器宕机都不会影响水情警报的告警。
所以,架构师在接触到纷繁复杂的一堆需求时,切忌眉毛胡子一把抓地逐一分析,而应该将精力放在识别关键需求上面。
关键需求 = 基础需求 || 核心需求 || 高风险需求。
普适需求分析模型
这里,以 IM 系统为例,总结一个普适性的需求分析模型,见下图。
首先对所有需求点进行筛选,区分出 “功能需求” 和 “非功能需求”;然后对 “功能需求” 进行分析,识别出 “基础功能需求” 和 “扩展功能需求”,这样则将一团需求点从同一视角出发,拆分成了同类要素,整体化繁为简。
-
基础功能需求:基础功能需求是整个系统的核心,往往体现关键需求中的 “基础需求” 和 “核心需求”; IM 系统的基础功能需求包括三部分: “用户”、“联系人” 和 “消息”,“用户” 描述的是当前登录者, “联系人” 描述的是当前登录用户的好友,“消息” 是 IM 系统最最核心的功能,包括 “私信消息”、“系统消息”、“云消息” 和 “离线消息”。
-
扩展功能需求:是对基础功能需求的扩展,扩展功能需求的典型特征就是 “变动” 和 “扩展”,需求最不稳定;在实现扩展功能需求时往往基于基础功能进行。IM 系统的基础功能需求决定了 整个 IM 的业务框架,IM 系统的扩展功能需求,如: “群消息”、“多媒体消息”、“子母号”、 “红包” 等都是基于 IM的 “基础功能需求” 实现的;据说,微信的 “摇一摇” 功能,是由三个实习生用了不到一周时间就上线的功能。
-
非功能需求:非功能需求更多体现的是关键需求中的 “高风险需求”;软件的非功能需求很多,我们对其进行归类和抽象,总结为高扩展需求、高吞吐需求和稳定性需求。
-
高扩展—高扩展包括功能的高扩展和容量的高扩展; 功能的高扩展是指基于现有功能和代码,通过简单改造就可以轻松实现新的功能,这要求系统的基础功能的实现做到合适粒度的 “高内聚” 和 “低耦合”(在《架构技能(三):扩展性》一文中有详细分析); 容量的高扩展是指可以轻松地对集群进行线性横向扩容,以处理更高流量规模的访问请求。
-
高吞吐—是互联网系统一直孜孜不倦的所追求的目标,如何提高系统的吞吐量呢?需要从两个方面着手,一是提高系统的并发量,一是提高系统的处理性能;也就是 “高吞吐” 依赖 “高并发” 和 “高性能”,这里需要注意,严格地说,在系统资源未耗尽之前提高并发量可以在一定程度上提高吞吐量;高吞吐、高并发、高性能是系统在同一维度三个不同视角的描述,一体三面,相互关联。
-
稳定性—稳定性包括两个方面,分别是可用性和可靠性; 可用性是指系统持续工作的能力,比如系统可以 7 * 24 连续工作; 可靠性是指系统对于正确的输入一定会有正确的输出。可用性通常依赖于系统的整体架构设计,而可靠性通常更多的依赖于合理地程序编写。
-
直播答题案例
需求分析时,需要识别关键需求,对关键需求进行重点剖析,从而由关键需求导出系统的架构设计。下面以百万直播答题系统为例,演示整个过程。
百万直播答题系统需求描述如下:
直播答题是在视频直播的基础上增加了答题的玩法,每场12道题,每次下发一道题,答题时间10s,作答时间结束几秒后下发答案和统计数据,全部答对者平分奖金,答错或者超时未作答不可继续答题。
对上述文字描述进行分析,画出直播答题系统的客户端与服务端之间的交互流程,时序图如下:
综合文字描述和时序图,可以确定系统模块边界,业务范围框图如下:
明确了直播答题系统的业务流程、模块边界、功能需求和非功能需求后,可以进一步分析出其关键需求。
-
百万用户同时在线答题,集中在10秒内提交答案,对系统的并发访问和造成的瞬时负载是非常高的,这是首当其冲最不能忽视的一点,所以 “高并发访问” 作为非功能需求,体现了关键需求的高风险需求类型;
-
直播答题是在视频直播的基础上增加的答题的玩法,视频直播是整个系统的基座,体现了关键需求的基础需求类型;
-
直播答题系统解决的是多个用户在线集中答题的问题,用户答题是系统必不可少的功能,体现了关键需求的核心需求类型;另外,“平分奖金” 的诱惑肯定会吸引 “黑客用户” 的蜂拥而至,因此 “防用户作弊” 也是系统的关键需求。
根据上述分析,百万直播答题系统的关键需求包括:
-
高并发访问
-
视频直播
-
用户答题
-
防用户作弊
在充分考虑上述四项关键需求后,可以推导出系统的架构设计,见下图。
如何根据关键需求,推导出系统的架构设计?系统的架构是如何实现上述关键需求的?以及怎样用非关键需求验证架构设计的合理性?在后续的文章中逐步进行分析。
最后,总结文中关键:
-
真正决定架构设计的是关键需求,非关键性需求用来验证软件架构设计的合理性;
-
关键需求往往是基础需求、核心需求和高风险需求;
-
普适性的需求分析模型中,将需求划分为功能需求和非功能需求,功能需求可划分为基础功能需求和扩展功能需求;
-
百万直播答题案例中,关键需求包括:高并发访问、视频直播、用户答题、防用户作弊。
相关文章:

架构技能(四):需求分析
需求分析,即分析需求,分析软件用户需要解决的问题。 需求分析的下一环节是软件的整体架构设计,需求是输入,架构是输出,需求决定了架构。 决定架构的是软件的所有需求吗?肯定不是,真正决定架构…...

Linux环境下的Java项目部署技巧:安装 Nginx
Nginx 的简介: Nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP / POP3 / SMTP 代理服务器。它可以作为网站静态资源的 web 服务器,也可以作为其他应用服务器的反向代理服务器。同时, Nginx 还具有负载均衡的功能。 N…...
前端 Vue 性能提升策略
一、引言 前端性能优化是确保 Web 应用快速响应和流畅用户体验的关键。对于使用 Vue.js 构建的应用,性能优化不仅涉及通用的前端技术,还包括针对 Vue 特性的特定优化措施。本文将从多个方面探讨如何全面提升前端和 Vue 应用的性能。 二、前端性能优化基础 1. 减少初始加载…...

深入理解linux中的文件(上)
1.前置知识: (1)文章 内容 属性 (2)访问文件之前,都必须打开它(打开文件,等价于把文件加载到内存中) 如果不打开文件,文件就在磁盘中 (3&am…...

Unity特效插件GodFX
2022Unity安装使用方法,将MinDrawer.cs文件MinAttribute改成UnityEngine.PostProcessing.MinAttribute 参考链接: Unity3D特效插件GodFX使用教程_哔哩哔哩_bilibili...
从 C 到 C++:理解结构体中字符串的存储与操作
对于刚入门 C/C 的程序员来说,字符串的存储和操作可能是个容易混淆的知识点。在 C 中,std::string 提供了非常友好的接口,我们可以轻松地在结构体中使用字符串类型,无需关注底层细节。然而,在 C 语言中,字符…...

Linux进阶——时间服务器
NTP是网络时间协议(network time protocol)的简称(应用层的协议),通过UDP123端口进行网络时钟同步。 Chrony是一个开源自由的网络时间协议NTP的客户端和服务器软件。它能让计算机保持系统时钟与时钟服务器(…...
力扣 295. 数据流的中位数
🔗 https://leetcode.cn/problems/find-median-from-data-stream/ 题目 数据流中不断有数添加进来,add 表示添加数据,find 返回数据流中的中位数 思路 大根堆存储数据流中偏小的数据小根堆存储数据流中偏大的数据若当前的 num 比大根堆的…...

【Linux】进程状态和优先级
个人主页~ 进程状态和优先级 一、进程状态1、操作系统进程状态(一)运行态(二)阻塞态(三)挂起态 2、Linux进程状态(一)R-运行状态并发执行 (二)S-浅度睡眠状态…...

携程Java开发面试题及参考答案 (200道-上)
说说四层模型、七层模型。 七层模型(OSI 参考模型) 七层模型,即 OSI(Open System Interconnection)参考模型,是一种概念模型,用于描述网络通信的架构。它将计算机网络从下到上分为七层,各层的功能和作用如下: 物理层:物理层是计算机网络的最底层,主要负责传输比特流…...

Docker 部署教程jenkins
Docker 部署 jenkins 教程 Jenkins 官方网站 Jenkins 是一个开源的自动化服务器,主要用于持续集成(CI)和持续交付(CD)过程。它帮助开发人员自动化构建、测试和部署应用程序,显著提高软件开发的效率和质量…...

深入理解开放寻址法中的三种探测序列
一、引言 开放寻址法是解决散列表中冲突的一种重要方法,当发生冲突(即两个不同的键通过散列函数计算得到相同的散列值)时,它会在散列表中寻找下一个可用的存储位置。而探测序列就是用于确定在发生冲突后,依次尝试哪些…...
图像噪声处理技术:让图像更清晰的艺术
在这个数字化时代,图像作为信息传递的重要载体,其质量直接影响着我们的视觉体验和信息解读。然而,在图像采集、传输或处理过程中,难免会遇到各种噪声干扰,如高斯噪声、椒盐噪声等,这些噪声会降低图像的清晰…...

linux运行级别
运行级别:指linux系统在启动和运行过程中所处的不同的状态。 运行级别之间的切换:init (级别数) 示例: linux的运行级别一共有7种,分别是: 运行级别0:停机状态 运行级别1:单用户模式/救援模式…...
深入剖析Electron的原理
Electron是一个强大的跨平台桌面应用开发框架,它允许开发者使用HTML、CSS和JavaScript来构建各种桌面应用程序。了解Electron的原理对于开发者至关重要,这样在设计应用时能更合理,遇到问题也能更准确地分析和解决。下面将从多个方面深入剖析E…...

C++ 游戏开发:完整指南
目录 什么是游戏开发? 为什么选择 C 进行游戏开发? C 游戏开发:完整指南 1. 理解游戏开发的基础 2. 学习游戏引擎 3. 精通 C 进行游戏开发 4. 学习数学在游戏开发中的应用 5. 探索图形编程 6. 专注于游戏开发的某一领域 7. 通过游戏项目进行实…...
WebForms SortedList 深度解析
WebForms SortedList 深度解析 引言 在Web开发领域,对于数据结构的理解与应用至关重要。其中,SortedList类在WebForms中是一个常用的数据结构,它能够帮助开发者高效地管理有序数据集合。本文将深入解析SortedList类在WebForms中的应用,包括其基本概念、常用方法、性能特点…...

【hot100】刷题记录(12)-回文链表
题目描述: 给你一个单链表的头节点 head ,请你判断该链表是否为 回文链表 。如果是,返回 true ;否则,返回 false 。 示例 1: 输入:head [1,2,2,1] 输出:true示例 2: …...
深入理解 Unix Shell 管道 Pipes:基础和高级用法 xargs tee awk sed等(中英双语)
深入理解 Unix Shell 管道(|) 1. 什么是管道(Pipe)? 管道(|)是 Unix/Linux Shell 中最强大的功能之一,它允许将一个命令的输出作为另一个命令的输入,从而实现数据流的处…...
[MySQL]事务的理论、属性与常见操作
目录 一、事物的理论 1.什么是事务 2.事务的属性(ACID) 3.再谈事务的本质 4.为什么要有事务 二、事务的操作 1.事务的支持版本 2.事务的提交模式 介绍 自动提交模式 手动提交模式 3.事务的操作 4.事务的操作演示 验证事务的回滚 事务异常…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...

9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...