《软件工程》第 3 章 -需求工程概论
在软件工程的开发流程中,需求工程是奠定项目成功基础的关键环节。它专注于获取、分析、定义和管理软件需求,确保开发出的软件能真正满足用户需求。接下来,我们将按照目录内容,结合 Java 代码和实际案例,深入讲解需求工程的核心知识。
3.1 软件需求的概念
3.1.1 软件需求的分类
软件需求主要分为功能需求、非功能需求和领域需求三类:
- 功能需求:定义软件必须实现的具体功能,例如一个在线购物系统的 “商品下单”“订单查询” 等功能。
- 非功能需求:描述软件的质量属性,如性能(响应时间、吞吐量)、安全性(用户认证、数据加密)、可用性(易用性、容错性)等。
- 领域需求:特定领域的需求,比如医疗软件需符合行业法规和数据标准。
以一个简单的 “学生成绩管理系统” 为例,用 Java 代码定义功能需求的接口:
// 学生成绩管理系统功能需求接口public interface StudentGradeManagement {// 添加学生成绩void addStudentGrade(String studentId, double grade);// 查询学生成绩double queryStudentGrade(String studentId);// 更新学生成绩void updateStudentGrade(String studentId, double newGrade);// 删除学生成绩void deleteStudentGrade(String studentId);}
3.1.2 软件需求的质量要素
高质量的软件需求应具备以下要素:
- 完整性:覆盖所有用户需求,无遗漏。
- 一致性:需求之间无矛盾冲突。
- 准确性:精确描述用户期望,避免歧义。
- 可行性:在现有技术和资源下可实现。
- 可验证性:需求可通过测试或评审进行验证。
以学生成绩管理系统的 “添加学生成绩” 需求为例,说明可验证性:
import org.junit.jupiter.api.Test;import static org.junit.jupiter.api.Assertions.*;// 测试学生成绩管理系统的添加成绩功能public class StudentGradeManagementTest {@Testpublic void testAddStudentGrade() {StudentGradeManagement management = new StudentGradeManagementImpl();management.addStudentGrade("001", 85.5);assertEquals(85.5, management.queryStudentGrade("001"));}}// 学生成绩管理系统功能实现类class StudentGradeManagementImpl implements StudentGradeManagement {private java.util.HashMap<String, Double> gradeMap = new java.util.HashMap<>();@Overridepublic void addStudentGrade(String studentId, double grade) {gradeMap.put(studentId, grade);}@Overridepublic double queryStudentGrade(String studentId) {return gradeMap.getOrDefault(studentId, -1.0);}@Overridepublic void updateStudentGrade(String studentId, double newGrade) {if (gradeMap.containsKey(studentId)) {gradeMap.put(studentId, newGrade);}}@Overridepublic void deleteStudentGrade(String studentId) {gradeMap.remove(studentId);}}
上述代码通过 JUnit 测试验证了 “添加学生成绩” 需求的正确性,体现了需求的可验证性。
3.2 需求工程的预备知识
3.2.1 与用户 / 客户交流的技巧
与用户交流时,可采用以下实用技巧:
- 提问技巧:使用开放式问题(如 “您希望系统实现什么功能?”)和封闭式问题(如 “系统是否需要支持批量导入数据?”)结合的方式获取信息。
- 倾听与反馈:认真倾听用户需求,重复和确认关键内容,确保理解一致。
- 避免技术术语:用通俗易懂的语言与用户沟通,防止产生误解。
3.2.2 需求调查的基本方法
常见的需求调查方法包括:
- 访谈:通过一对一或小组访谈获取用户需求,例如针对学生成绩管理系统,访谈教师、学生和教务管理人员。
- 问卷调查:适用于大量用户场景,设计问卷收集用户对系统功能和期望的反馈。
- 观察法:观察用户在实际工作中的操作流程,挖掘潜在需求。
3.2.3 需求建模的基本方法
需求建模用于以可视化方式表达需求,常见方法有:
- 数据流图(DFD):描述数据在系统中的流动和处理过程。
- 实体 - 关系图(ERD):展示数据实体及其关系,如学生、课程和成绩之间的关系。
- 用例图:从用户角度展示系统功能和参与者之间的关系。
以学生成绩管理系统的用例图为例:
3.3 需求工程的过程模型
3.3.1 需求工程中的活动
需求工程包含以下核心活动:
- 需求获取:通过访谈、问卷等方式收集用户需求。
- 需求分析:对获取的需求进行整理、分析和细化,识别矛盾和遗漏。
- 需求规格说明:编写详细的需求规格说明书,明确需求的内容、优先级和约束。
- 需求验证:通过评审、测试等方式确保需求的质量。
- 需求管理:对需求变更进行控制和跟踪,确保项目顺利进行。
3.3.2 迭代式过程模型
迭代式过程模型将需求工程划分为多个迭代周期,每个周期都包含需求获取、分析、规格说明、验证和管理等活动。随着迭代推进,需求不断细化和完善。
迭代式过程模型流程图:
3.3.3 过程模型的裁剪
根据项目规模、复杂度和团队能力,可对需求工程过程模型进行裁剪:
- 小型项目:简化需求规格说明,采用敏捷方式快速迭代。
- 大型复杂项目:加强需求验证和变更管理,确保需求的稳定性。
3. 4小结
本章围绕需求工程概论,从软件需求的概念出发,介绍了需求分类、质量要素,阐述了需求工程的预备知识和过程模型。通过学生成绩管理系统的 Java 代码案例和流程图,帮助大家理解和实践相关知识。需求工程是软件开发的基石,后续的设计、开发和测试都依赖于高质量的需求。在实际项目中,应根据具体情况灵活运用这些知识和方法,做好需求管理工作。
以上内容全面呈现了需求工程概论的要点。若你觉得某些部分需要更深入的案例或有其他修改意见,欢迎随时和我说。
相关文章:

《软件工程》第 3 章 -需求工程概论
在软件工程的开发流程中,需求工程是奠定项目成功基础的关键环节。它专注于获取、分析、定义和管理软件需求,确保开发出的软件能真正满足用户需求。接下来,我们将按照目录内容,结合 Java 代码和实际案例,深入讲解需求工…...

VMware-MySQL主从
MySQL主从 服务器信息 服务器类型角色主机地址主机名称虚拟机master192.168.40.128test-1虚拟机slave192.168.40.129test-2 Master 配置(192.168.40.128) 删除自动生成的配置 /var/lib/mysql/auto.cnf [roottest-1 ~]# rm -rf /var/lib/mysql/auto.…...
ArcGIS Pro 3.4 二次开发 - 几何
环境:ArcGIS Pro SDK 3.4 + .NET 8 文章目录 几何1 空间参考1.1 从已知ID构建空间参考1.2 从字符串构建空间参考1.3 使用 WGS84 空间参考1.4 使用已知ID构建带有垂直坐标系的空间参考1.5 使用垂直坐标系从字符串构建SpatialReference1.6 使用自定义投影坐标系(PCS)构建空间参…...

2023-ICLR-ReAct 首次结合Thought和Action提升大模型解决问题的能力
关于普林斯顿大学和Google Research, Brain Team合作的一篇文章, 在语言模型中协同Reasoning推理和Action行动。 论文地址:https://arxiv.org/abs/2210.03629 代码:https://github.com/ysymyth/ReAct.git 其他复现 langchain :https://pytho…...

Rust 开发的一些GUI库
最近考虑用Rust干点什么,于是搜集了下资料——根据2025年最新调研结果和社区实践,Rust GUI库生态已形成多个成熟度不同的解决方案。以下是当前主流的GUI库分类及特点分析,结合跨平台支持、开发体验和实际应用场景进行综合评估: 一…...

【第四十六周】文献阅读:从 RAG 到记忆:大型语言模型的非参数持续学习
目录 摘要Abstract从 RAG 到记忆:大型语言模型的非参数持续学习研究背景方法论1. 离线索引(Offline Indexing)2. 在线检索(Online Retrieval)具体细节 创新性实验结果局限性总结 摘要 本论文旨在解决当前检索增强生成…...

从智能提效到产品赋能的架构实践
摘要 本文深入探讨了企业级系统从智能化提效阶段向产品赋能阶段演进的架构实践路径。通过分析传统架构的局限性,提出了以用户价值为导向的现代化架构设计理念,并结合实际案例展示了如何构建可扩展、高可用、智能化的产品架构体系。 1. 引言 在数字化转型的浪潮中,企业技术…...
《Python 虚拟环境完全指南:如何管理项目依赖,避免版本冲突》
《Python 虚拟环境完全指南:如何管理项目依赖,避免版本冲突》 1. 引言 在 Python 开发中,依赖管理是至关重要的环节。不同项目可能需要不同的库版本,而全局安装库可能导致版本冲突或环境污染。为解决这一问题,Python 提供了虚拟环境(venv、virtualenv),帮助开发者隔离…...
微信小程序带数组参数跳转页面,微信小程序跳转页面带数组参数
在微信小程序中,带数组参数跳转页面需要通过JSON序列化和URL编码处理,以下是具体实现方法 传递数组参数(发送页面) wx.navigateTo({url: /pages/targetPage?arr encodeURIComponent(JSON.stringify(yourArray)) });接收数组参…...
服务器开机自启动服务
前言: 将服务器中脚本开启自启动执行 步骤: 1.创建一个 systemd 服务文件: /etc/systemd/system/ 目录下创建一个新的服务文件。例如,命名为 myapp.service: sudo nano /etc/systemd/system/myapp.service2.编写 [Unit] Descri…...

关于OT IIOT系统远程访问的零信任安全
什么是OT & IIOT?—— 工业领域的“操作基石”与“智能升级” 在工业数字化转型的浪潮中,OT(运营技术)与IIoT(工业物联网)是两个核心概念。前者是工业生产的“神经中枢”,后者是驱动智能升…...

【Doris基础】Apache Doris vs 传统数据仓库:架构与性能的全面对比
目录 1 引言 1.1 传统数据仓库的发展 1.2 现代分析型数据库的崛起 2 核心架构对比 2.1 传统数据仓库的架构 2.2 Doris的架构设计 3 关键技术差异 3.1 存储引擎对比 3.2 查询执行对比 3.3 数据摄入方式对比 4 性能与扩展性对比 4.1 性能基准对比 4.2 扩展性对比 5…...

【VScode】python初学者的有力工具
还记得23年11月,我还在欣喜Spyder像Rstudio一样方便。 但苦于打开软件打开太卡、太耗时(初始化-再加载一些东西),一度耗费了我学习的热情。 就在24年5月份,别人推荐下发现了一个更加轻量级、方便又快速的ID࿰…...
Linux系统中为Qt项目封装一个udp客户端类
Linux系统中为Qt项目封装一个udp客户端类 一、场景 在日常的Qt项目中,我们常用的就是网络通信协议是TCP/UDP, 对于网络协议,Qt都已经封装好了自己的TCP/UDP类,QTcpSocket/QUdpSocket,这些类非常的好用,也非常的易用。 这些类继承自QAbstractSocket,而QAbstractSocket类…...

443端口:HTTPS通信的安全基石
在互联网通信中,端口是数据传输的虚拟通道,每个端口对应特定的服务或协议。其中,443端口 作为 HTTPS协议 的默认端口,在现代网络安全中扮演着至关重要的角色。 一、443端口的核心作用 HTTPS加密通信 443端口是HTTPS(…...

宝塔安装WordPress程序
宝塔安装WordPress程序 一、提前准备1,下载WordPress2,在宝塔创建站点 二、部署项目1,上传下载的wordpress压缩包至创建的项目根目录下并解压 三、wordpress安装1,在浏览器打开创建的网站2,开始按照流程安装配置数据库…...

Agent 的7 中设计模式
这里写自定义目录标题 建立有效的Agent什么是Agent?何时(以及何时不使用)使用代理何时以及如何使用框架构建块、工作流和Agent构建模块:增强型LLM(The augmented LLM)工作流程:提示链接(Prompt chaining)工作流程&…...

OpenGAN:基于开放数据生成的开放集识别
简介 简介:这次学习的OpenGAN主要学习一个思路,跳出传统GAN对于判断真假的识别到判断是已知种类还是未知种类。重点内容不在于代码而是思路,会简要给出一个设计的代码。 论文题目:OpenGAN: Open-Set Recognition via Open Data …...

【node】Express创建服务器
Express是基于Node.js平台,快速、开放、极简的Web开发框架。基于http的express是专门用来创建web服务器的,可以极大的提高开发效率。 Express的创建的服务器 1 web网站服务器 专门对外提供web网页资源的服务器 2 Api接口服务器 专门对外提供Api接口的服…...

使用 OpenCV 实现哈哈镜效果
在计算机视觉和图像处理领域,OpenCV 提供了非常强大的图像几何变换能力,不仅可以用于纠正图像,还能制造各种“有趣”的视觉效果。今天,我们就来实现一个经典的“哈哈镜”效果,让图像像在游乐园里一样被拉伸、压缩、扭曲…...
DeepSeek-R1-0528 模型最新发布:编程推理能力跃升
2025年5月28日,深度求索(DeepSeek)通过Hugging Face平台悄然发布推理模型DeepSeek-R1-0528 Hugging Face Deepseek-R1-0528模型地址。尽管官方称其为"minor update",但社区实测显示,该版本在编程能力、复杂推…...
git仓库服务gogs详解
Gogs(Go Git Service)是一个使用 Go 编写的自助 Git 服务,旨在提供一个轻量级、易部署、高效的 Git 代码托管平台。它类似于 GitHub、GitLab,但更轻量,非常适合私有化部署、小型团队和嵌入式环境。下面是对 Gogs 的详细…...
PaddleNLP 的文本分类项目
以下是一个基于 PaddleNLP 的文本分类项目,按照标准工程结构组织,并包含测试数据集和完整流程。这个示例使用ERNIE模型处理IMDB电影评论情感分析任务。 项目工程结构 ernie_sentiment_analysis/ ├── data/ # 数据集目录 │ ├─…...
git 一台电脑一个git账户,对应多个仓库ssh
生成ssh # 为账户A生成SSH密钥 ssh-keygen -t rsa -b 4096 -C "your_email_for_account_Aexample.com" -f ~/.ssh/id_ed25519 # 为账户B生成SSH密钥 ssh-keygen -t rsa -b 4096 -C "your_email_for_account_Bexample.com" -f ~/.ssh/id_rsa_yswq进入文件…...

node-DeepResearch开源ai程序用于深入调查查询,继续搜索、阅读网页、推理,直到找到答案
一、软件介绍 文末提供程序和源码下载 node-DeepResearch开源ai程序用于深入调查查询,继续搜索、阅读网页、推理,直到找到答案。 重要提示 与 OpenAI/Gemini/Perfasciity 的“深度研究”不同,我们只专注于通过迭代过程找到正确的答案 。我…...
Asp.Net Core 托管服务
文章目录 前言一、说明二、使用步骤1.创建托管服务方式一:继承 BackgroundService方式二:直接实现 IHostedService 2.注册托管服务3.处理作用域服务4.使用定时器(System.Threading.Timer)5.结合 Quartz.NET 实现复杂调度 三、. 注…...
Dockerfile 编写经验:优化大小与效率
文章目录 Dockerfile 通用的技巧总结1. 使用多阶段构建2. 最小化层数3. 彻底清理4. 选择合适的基镜像5. 仅安装必要的依赖6. 利用构建缓存 常见陷阱总结 Dockerfile 通用的技巧总结 1. 使用多阶段构建 利用多阶段构建分离构建和运行时环境,仅将必要的产物ÿ…...
JMeter 是什么
JMeter 是一款由 Apache 基金会开发的 开源性能测试工具,主要用于对 Web 应用、API、数据库、消息队列等系统进行 压力测试、负载测试和功能测试。它通过模拟大量用户并发操作,帮助开发者评估系统的性能、稳定性和扩展能力。以下是其核心特性和使用详解&…...
压测服务器和线上环境的区别
在进行服务器压测时,测试环境与线上环境的差异会直接影响测试结果的可靠性。以下是两者的关键区别及注意事项: 1. 压测服务器的常见类型 本地开发机:低配虚拟机(如4核8GB),仅用于功能验证…...

C#、C++、Java、Python 选择哪个好
选择哪种语言取决于具体需求:若关注性能和底层控制选C、若开发企业级应用选Java、若偏好快速开发和丰富生态选Python、若构建Windows生态应用选C#。 以Python为例,它因语法简洁、开发效率高、应用广泛而在AI、数据分析、Web开发等领域大放异彩。根据TIOB…...