当前位置: 首页 > news >正文

架构技能(四):需求分析

需求分析,即分析需求,分析软件用户需要解决的问题。

需求分析的下一环节是软件的整体架构设计,需求是输入,架构是输出,需求决定了架构。

决定架构的是软件的所有需求吗?肯定不是,真正决定架构设计的是关键需求或用户要解决的关键问题,其余非关键性的需求或非关键性的问题,可以用来验证软件架构设计的合理性。

需求分析,是在谈什么?谈识别关键需求。

如何识别关键需求呢?

关键需求具有决定性的意义和价值,根据笔者所参与研发过软件,总结为:关键需求往往是基础需求、核心需求和高风险需求。

  • 基础需求:基础需求体现在软件上是基础功能,往往具有 “稳定” 和 “原子化” 特征;基础功能很稳定,很少受到需求变动的影响;而且,基础功能往往不会再拆分;基于基础功能,软件往往会衍生出更多的扩展功能;在电商系统中,像 “商品”、“订单”、“支付” 等属于软件的基础功能,以此为基础进行扩展的 “营销”、“评论”、“客服” 则属于软件的扩展功能。

  • 核心需求:核心需求很容易理解,往往是软件必须要提供的能力,失去了核心需求,软件则没有意义;比如,移动手机系统的电话功能、智能汽车的驾驶功能、微信软件的聊天功能等等;识别关键需求,往往从识别用户必须要解决的关键问题入手来确认核心需求。

  • 高风险需求:高风险需求往往会影响软件研发的成败,必须在软件架构设计时充分考虑其高风险性,提出解决方案,降低或消除其风险;高风险需求更多体现在非功能需求方面,比如:在电商系统中用户搜索任何一类商品必须在 0.5 秒内看到结果,在水利监测系统中任意1~3台服务器宕机都不会影响水情警报的告警。

所以,架构师在接触到纷繁复杂的一堆需求时,切忌眉毛胡子一把抓地逐一分析,而应该将精力放在识别关键需求上面。

关键需求 = 基础需求 || 核心需求 || 高风险需求。

普适需求分析模型

这里,以 IM 系统为例,总结一个普适性的需求分析模型,见下图。

首先对所有需求点进行筛选,区分出 “功能需求” 和 “非功能需求”;然后对 “功能需求” 进行分析,识别出 “基础功能需求” 和 “扩展功能需求”,这样则将一团需求点从同一视角出发,拆分成了同类要素,整体化繁为简。

  • 基础功能需求:基础功能需求是整个系统的核心,往往体现关键需求中的 “基础需求” 和 “核心需求”; IM 系统的基础功能需求包括三部分: “用户”、“联系人” 和 “消息”,“用户” 描述的是当前登录者, “联系人” 描述的是当前登录用户的好友,“消息” 是 IM 系统最最核心的功能,包括 “私信消息”、“系统消息”、“云消息” 和 “离线消息”。

  • 扩展功能需求:是对基础功能需求的扩展,扩展功能需求的典型特征就是 “变动” 和 “扩展”,需求最不稳定;在实现扩展功能需求时往往基于基础功能进行。IM 系统的基础功能需求决定了 整个 IM 的业务框架,IM 系统的扩展功能需求,如: “群消息”、“多媒体消息”、“子母号”、 “红包” 等都是基于 IM的 “基础功能需求” 实现的;据说,微信的 “摇一摇” 功能,是由三个实习生用了不到一周时间就上线的功能。

  • 非功能需求:非功能需求更多体现的是关键需求中的 “高风险需求”;软件的非功能需求很多,我们对其进行归类和抽象,总结为高扩展需求、高吞吐需求和稳定性需求。

    • 高扩展—高扩展包括功能的高扩展和容量的高扩展; 功能的高扩展是指基于现有功能和代码,通过简单改造就可以轻松实现新的功能,这要求系统的基础功能的实现做到合适粒度的 “高内聚” 和 “低耦合”(在《架构技能(三):扩展性》一文中有详细分析); 容量的高扩展是指可以轻松地对集群进行线性横向扩容,以处理更高流量规模的访问请求。

    • 高吞吐—是互联网系统一直孜孜不倦的所追求的目标,如何提高系统的吞吐量呢?需要从两个方面着手,一是提高系统的并发量,一是提高系统的处理性能;也就是 “高吞吐” 依赖 “高并发” 和 “高性能”,这里需要注意,严格地说,在系统资源未耗尽之前提高并发量可以在一定程度上提高吞吐量;高吞吐、高并发、高性能是系统在同一维度三个不同视角的描述,一体三面,相互关联。

    • 稳定性—稳定性包括两个方面,分别是可用性和可靠性; 可用性是指系统持续工作的能力,比如系统可以 7 * 24 连续工作; 可靠性是指系统对于正确的输入一定会有正确的输出。可用性通常依赖于系统的整体架构设计,而可靠性通常更多的依赖于合理地程序编写。

直播答题案例

需求分析时,需要识别关键需求,对关键需求进行重点剖析,从而由关键需求导出系统的架构设计。下面以百万直播答题系统为例,演示整个过程。

百万直播答题系统需求描述如下:

直播答题是在视频直播的基础上增加了答题的玩法,每场12道题,每次下发一道题,答题时间10s,作答时间结束几秒后下发答案和统计数据,全部答对者平分奖金,答错或者超时未作答不可继续答题。

对上述文字描述进行分析,画出直播答题系统的客户端与服务端之间的交互流程,时序图如下:

综合文字描述和时序图,可以确定系统模块边界,业务范围框图如下:

明确了直播答题系统的业务流程、模块边界、功能需求和非功能需求后,可以进一步分析出其关键需求。

  • 百万用户同时在线答题,集中在10秒内提交答案,对系统的并发访问和造成的瞬时负载是非常高的,这是首当其冲最不能忽视的一点,所以 “高并发访问” 作为非功能需求,体现了关键需求的高风险需求类型;

  • 直播答题是在视频直播的基础上增加的答题的玩法,视频直播是整个系统的基座,体现了关键需求的基础需求类型;

  • 直播答题系统解决的是多个用户在线集中答题的问题,用户答题是系统必不可少的功能,体现了关键需求的核心需求类型;另外,“平分奖金” 的诱惑肯定会吸引 “黑客用户” 的蜂拥而至,因此 “防用户作弊” 也是系统的关键需求。

根据上述分析,百万直播答题系统的关键需求包括:

  • 高并发访问

  • 视频直播

  • 用户答题

  • 防用户作弊

在充分考虑上述四项关键需求后,可以推导出系统的架构设计,见下图。

如何根据关键需求,推导出系统的架构设计?系统的架构是如何实现上述关键需求的?以及怎样用非关键需求验证架构设计的合理性?在后续的文章中逐步进行分析。

最后,总结文中关键:

  1. 真正决定架构设计的是关键需求,非关键性需求用来验证软件架构设计的合理性;

  2. 关键需求往往是基础需求、核心需求和高风险需求;

  3. 普适性的需求分析模型中,将需求划分为功能需求和非功能需求,功能需求可划分为基础功能需求和扩展功能需求;

  4. 百万直播答题案例中,关键需求包括:高并发访问、视频直播、用户答题、防用户作弊。

相关文章:

架构技能(四):需求分析

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

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的客户端和服务器软件。它能让计算机保持系统时钟与时钟服务器&#xff08…...

力扣 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.事务的操作演示 验证事务的回滚 事务异常…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...