作为计算机大类专业的学生,软件开发无论是在之后的竞赛项目和毕业设计选题中都会涉及到。软件工程是一门课程,是介绍软件开发的方法、工具和过程的,但是我们目前只有计科、软工两个本科专业会开该课程,并且开设学期靠后,可能那时大家已经没有心思和精力去学好这门课;而物联、大数据、智能专业的同学可能也会选择软件开发方向的毕设题目。所以,希望大家尽早接触,学习并用好这门课很有必要。这个系列的文章我会写得尽可能简单明了,尽可能让大一或者我校学生群体中的初学者能读明白。
本篇文章主要介绍软件开发的流程阶段和相关术语,同学们需要先了解熟悉概念,理解流程和各阶段的任务。抛砖引玉,自学的能力很重要,很需要。我们的学习资源和工具非常多,在阅读过程中,如果遇到不理解的术语,可以多查资料、询问大模型,也可以和我一起交流。一定要把概念弄清楚。本篇创作是查阅资料,结合个人理解一起完成,如果有表述不清楚或不严谨的地方,欢迎不吝指正。
一、什么是软件工程
在讲具体流程之前,先理解两个核心概念。
软件不仅仅是“代码”。软件 = 程序 + 数据 + 相关文档的统称。文档和代码同样重要——没有文档的软件就像没有图纸的建筑。
软件工程是研究和应用如何以系统化的、规范的、可度量的方法去开发、运行和维护软件,即把工程化的思想应用到软件上。软件工程包含三个基本要素:方法、工具和过程。
二、软件生命周期概述
软件从开始构思到最终退役,经历的全部阶段称为软件生命周期(Software Life Cycle)。
概括来说,软件生命周期由软件定义、软件开发和运行维护三个时期组成。每个阶段都有确定的任务,并产生一定规格的文档,提交给下一个阶段作为继续工作的依据。前一阶段的输出文档,就是后一阶段的输入文档。
💡 给初学者同学的一句话:软件开发不是“拿到需求就开始写代码”。它像盖房子——先画图纸、打地基、砌墙、装修,每一步都有先后顺序和验收标准。
三、详细阶段划分
以下按照经典的瀑布模型(Waterfall Model)展开讲解。瀑布模型是最经典、最易于理解的开发模型,适合初学者建立整体认知。
3.0 阶段0:问题定义(Problem Definition)
目标:明确“要解决什么问题”。如果你是自己设计开发给某个场景应用,你需要面向用户进行调研;如果你在公司,向客户交付软件产品,则需要产品经理与客户详细沟通,然后向技术人员反馈。
主要活动:
•与需求方(客户/用户)初步沟通
•确定软件的开发目标和大致范围
•回答核心问题:这个软件要做什么?为谁做?
关键术语:
涉众(Stakeholder):所有与软件系统有利害关系的人,包括用户、客户、开发者、管理者等
系统目标(System Goal):软件最终要达成的业务目的
产出文档:问题定义报告(简要)
💡 给初学者同学的例子:想做“校园失物招领小程序”——问题定义就是“帮助同学快速找到丢失的物品和发布捡到的物品”。
3.1 阶段1:可行性研究(Feasibility Study)
目标:判断这个项目“值不值得做、能不能做成”。
主要活动:
•技术可行性:现有技术能否实现?
•经济可行性:成本是否在合理范围内?能带来什么效益?
•操作可行性:用户是否会用?组织是否支持?
导出系统的高层逻辑模型(通常用数据流图DFD表示)
关键术语:
•可行性研究:在问题定义基础上,分析实现该软件的技术、经济、操作等方面的可行性
•成本/效益分析:估算开发成本和预期收益,判断是否值得投资
产出文档:可行性研究报告
💡给初学者同学的例子:技术上微信小程序能实现;经济上只需服务器费用;操作上同学都会用微信——结论:可行。
3.2 阶段2:需求分析(Requirements Analysis)
目标:搞清楚软件到底要做什么(而不是“怎么做”)。
这是整个开发过程中最重要的阶段之一。需求分析做得好,项目就成功了一半。
主要活动:
1.需求获取:通过访谈、问卷、观察等方式收集用户需求
2.需求分析:整理、分类、理解收集到的需求
3.功能需求:系统必须提供的功能(如“用户可以发布失物信息”)
4.非功能需求:性能、安全、可用性等质量属性(如“页面加载不超过2秒”)
5.需求验证:与用户确认需求理解是否正确
关键术语:
•软件需求规格说明书(SRS,Software Requirements Specification):需求分析的核心产出文档,详细描述软件“做什么”
•用例(Use Case):描述系统与外部参与者之间的交互,是表达功能需求的常用方式
•用例规约(Use Case Specification):对用例的详细文字描述
产出文档:软件需求规格说明书(SRS)
💡 给初学者同学的例子:需求不是“做个失物招领小程序”,而是——用户故事:“作为丢失物品的同学,我希望发布失物信息,这样别人捡到后可以联系我。”
3.3 阶段3:软件设计(Software Design)
目标:回答“怎么做”的问题——把需求转化为设计方案。
软件设计一般分为两个层次:
3.3.1 概要设计(Preliminary / Architectural Design)
目标:确定系统的整体架构和模块划分。
主要活动:
•确定系统的总体结构【总体结构图】
•划分功能模块,定义模块之间的关系【功能模块图】
•设计数据库的初步结构
•确定技术选型(用什么语言、框架、数据库)
•设计系统接口和通信方式
关键术语:
•软件架构(Software Architecture):系统的整体结构和各部件之间的关系
•模块(Module):一个可独立命名和编译的程序单元
•耦合(Coupling)与内聚(Cohesion):模块间联系紧密程度(耦合越低越好)和模块内部功能关联程度(内聚越高越好)
产出文档:概要设计说明书
3.3.2 详细设计(Detailed Design)
目标:对每个模块进行细化设计,达到可以直接编码的详细程度。
主要活动:
•每个模块的算法设计
•每个函数的输入/输出定义
•数据结构的详细定义
•界面的详细设计(UI原型)
•设计类图、时序图等
关键术语:
统一建模语言(UML,Unified Modeling Language):一种标准化的建模语言,用于可视化、描述和记录软件系统的设计
类图(Class Diagram):描述系统中的类及其关系的UML图
时序图(Sequence Diagram):描述对象之间按时间顺序的交互
产出文档:详细设计说明书
💡 给初学者同学的例子:概要设计决定“用微信小程序+云开发,分首页、发布页、个人中心三个模块”;详细设计决定“首页列表用卡片展示,每条显示标题、时间、地点、图片”。
3.4 阶段4:编码与实现(Coding & Implementation)
目标:把设计文档“翻译”成计算机能运行的程序代码。
主要活动:
•搭建开发环境(Idea+数据库;Hbuilder X +数据库)
•按照详细设计编写代码
•进行单元测试(Unit Testing)——测试每个最小代码单元是否正确
•代码审查(Code Review):团队成员互相检查代码
关键术语:
•编码(Coding):将设计结果转换为计算机可运行的程序代码的过程
•单元测试(Unit Testing):对软件中的最小可测试单元进行验证
•代码规范(Coding Standard):统一的编码风格和规则,保证代码可读性和可维护性
•版本控制(Version Control):管理代码变更(版本控制)的系统(如Git、Gitee等)
产出文档:源代码、单元测试报告
💡给初学者同学的提醒:写代码时一定要遵守团队约定的代码规范(命名规则、缩进、注释等)。代码是写给人看的,顺便让机器运行。
3.5 阶段5:测试(Testing)
目标:发现并修复软件中的缺陷(Bug)。
测试通常分三个层次进行:
3.5.1 单元测试(Unit Testing)
•测试每个独立的模块/函数
•由开发人员完成
3.5.2 集成测试(Integration Testing)
•将各模块组合在一起,测试它们之间的接口和交互
•检查模块组合后是否能正常工作
3.5.3 系统测试(System Testing)
•对整个系统进行完整测试
•检查系统是否满足需求规格说明书中的所有要求
3.5.4 验收测试(Acceptance Testing)
•让用户来测试,确认软件是否符合预期
•用户满意后才正式交付
关键术语:
•白盒测试(White-box Testing):关注代码内部逻辑结构的测试方法
•黑盒测试(Black-box Testing):只关注输入输出,不关心内部实现的测试方法
•测试用例(Test Case):一组输入、执行条件和预期结果的集合
•缺陷(Bug/Defect):软件中的错误
产出文档:测试计划、测试用例、缺陷报告、测试报告
💡 给初学者同学的例子:单元测试测“发布按钮点击后能否保存数据”;集成测试测“发布后首页能否显示”;系统测试测整个流程;验收测试让同学试用并反馈。
3.6 阶段6:部署与交付(Deployment & Delivery)
目标:让软件在真实环境中上线运行。
主要活动:
•配置服务器/云环境
•部署数据库
•上传代码并启动服务
•进行上线验证
•对用户进行培训(如有需要)
关键术语:
•部署(Deployment):将软件安装到目标运行环境的过程
•交付(Delivery):将软件产品正式交给用户
•持续集成/持续部署(CI/CD):自动化构建、测试和部署的实践
产出文档:部署手册、用户手册
3.7 阶段7:运行与维护(Operation & Maintenance)
目标:保证软件在运行期间持续满足用户需求。
这是软件生命周期中持续时间最长的阶段。
维护分为两类:
1.纠错性维护(Corrective Maintenance):修复用户发现的Bug
2.改进性维护(Perfective Maintenance):增加新功能、优化性能
关键术语:
•软件维护(Software Maintenance):软件交付后为修正错误、提升性能或适应环境变化而进行的修改
•退役(Retirement):软件停止使用、彻底下线
产出文档:维护记录、变更日志
四、开发模型补充说明
除了瀑布模型,还有几种常见的开发模型,感兴趣的同学可以查阅资料了解:
模型 | 特点 | 适用场景 |
瀑布模型 | 线性顺序,阶段分明,文档驱动 | 需求明确、变化少的项目 |
快速原型模型 | 先快速做出可运行的雏形,根据反馈迭代完善 | 需求不明确,需要用户确认 |
增量模型 | 分多个版本逐步交付功能 | 大型项目,需要分批上线 |
敏捷开发(Agile) | 迭代式开发,快速响应变化 | 需求变化快、需要快速交付的项目 |
💡 给初学者同学的建议:第一次做项目,建议采用瀑布模型——阶段清晰,便于管理和理解。等熟悉了流程后,可以尝试敏捷开发。
五、各阶段核心文档清单
软件工程强调“文档驱动”——每个阶段都要产出相应的文档:
阶段 | 核心文档 |
问题定义 | 问题定义报告 |
可行性研究 | 可行性研究报告 |
需求分析 | 软件需求规格说明书(SRS) |
概要设计 | 概要设计说明书 |
详细设计 | 详细设计说明书 |
编码 | 源代码(+代码注释) |
测试 | 测试计划、测试用例、测试报告 |
部署 | 部署手册、用户手册 |
维护 | 维护记录、变更日志 |
💡 给初学者同学的话:写文档不是“额外的负担”,而是帮你理清思路的工具。很多同学一上来就写代码,写到一半发现设计有漏洞,返工重来——这就是文档没写好的代价。
六、给带队老师和学生的实践建议
1.先理解概念,再做项目:查阅资料将上述流程和术语理解清楚,建立整体认知。
2.文档先行:要求每组在写代码之前,先提交需求分析和设计文档。哪怕只写一页纸,也要养成“先想后做”的习惯。
3.分阶段验收:每个阶段设置明确的里程碑(Milestone),验收通过才能进入下一阶段。
4.角色分工:让同学们体验不同的角色——产品经理(负责需求)、设计师(负责设计)、开发工程师(负责编码)、测试工程师(负责测试)。
5.工具引入:尽早让同学接触版本控制工具(Git)、项目管理工具(如TAPD、飞书)、原型设计工具(如Figma、墨刀)。
6.强调团队协作:软件开发是团队工程,沟通和协作能力与编码能力同等重要。
7.推荐教材:可供参考的经典教材包括《软件工程》(清华大学出版社“101计划”教材)、《软件工程基础(第4版)》(清华大学出版社)等。
七、核心术语速查表
术语 | 英文 | 简要解释 |
软件生命周期 | Software Life Cycle | 软件从概念到退役的全过程 |
瀑布模型 | Waterfall Model | 线性顺序的经典开发模型 |
可行性研究 | Feasibility Study | 判断项目是否值得做 |
需求分析 | Requirements Analysis | 确定软件“做什么” |
软件需求规格说明书 | SRS | 需求分析的核心文档 |
概要设计 | Preliminary Design | 确定系统整体架构 |
详细设计 | Detailed Design | 细化到可编码的程度 |
编码 | Coding | 将设计转换为代码 |
测试 | Testing | 发现并修复缺陷 |
单元测试 | Unit Testing | 测试最小代码单元 |
集成测试 | Integration Testing | 测试模块间的配合 |
系统测试 | System Testing | 测试整个系统 |
维护 | Maintenance | 软件上线后的持续改进 |
涉众 | Stakeholder | 与系统有利害关系的人 |
用例 | Use Case | 系统与外部交互的场景 |
UML | Unified Modeling Language | 统一建模语言 |
敏捷开发 | Agile Development | 迭代式、快速响应的开发方法 |
记住:好的软件不是“写”出来的,而是“设计”和“管理”出来的。
夜雨聆风