软件开发流程:如何从想法落地成工程
本文围绕软件开发的完整生命周期展开,从需求分析、系统设计、编码开发、软件测试,到项目部署、运行维护和版本迭代,梳理一个软件从想法到正式上线的完整过程。同时介绍常见开发模型、系统设计方法、测试方式、部署流程以及线上故障排查与维护思路,帮助建立完整的软件工程开发认知。
一、软件开发生命周期概述
1.什么是软件开发生命周期
软件开发生命周期(Soft Development Life Cycle,SDLC),指一个软件从想法,到设计,开发,测试,上线,再到后续迭代的完整过程
可以简单理解为:想做什么->怎么做->写代码->检查能不能正常运行->部署上线->持续维护和升级
完整流程:需求分析->系统设计->编码开发->软件测试->项目部署->运行维护->版本迭代
2.常见软件开发模型
软件开发模型指的是SDLC应该按照什么方式组织和推进
1.瀑布模型 Waterfall Model
核心思想:一个阶段开发完成后,再进入下一个阶段
开发流程:需求分析->系统设计->编码开发->软件测试->项目部署->运行维护
特点:阶段划分清晰,文档要求完整,前一个阶段完成后再进入下一个阶段,后期修改需求成本高
应用场景:需求非常明确,需求变化少,流程和文档要求严格的项目
缺陷:如果项目做到后面才发现需求理解错误,修改成本会非常高.
2.快速原型模型 Prototyping Model
核心思想:先做一个原型,让用户看到以后再确认需求
开发流程:初步需求->快速设计->用户体验/反馈->修改需求->确认需求->正式开发
应用场景:用户自己无法准确描述需求,UI和交互比较重要,新产品,新系统
常用工具:Figma,Axure,即时设计,HTML页面
3.增量模型 Incremental Model
核心思想:不一次完成整个系统,而是一部分一部分开发
开发流程:整体需求->拆分功能->开发第一部分->测试/发布->开发第二部分->循环
特点:可以较早得到可运行系统,风险比一次性开发整个系统低,方便持续扩展
4.迭代模型 Iterative Model
核心思想:先做出一份版本,然后一轮一轮改进
开发流程:需求->版本V1->反馈->改进->版本V2->反馈->改进->版本V3
特点:不断改进已有功能,并非是增量的不断增加新的功能
5.螺旋模型 Spiral Model
核心思想:每一轮开发之前都进行风险分析
开发流程:确定目标->风险分析->设计与开发->测试与评估->进入下一轮->循环
特点:把风险控制放在非常重要的位置
应用场景:大型项目,高风险项目,技术方案不确定,项目周期较长
缺陷:管理复杂,成本较高,不适合普通小项目
6 .V 模型 V-Model
核心思想:开发的每一个阶段,都对应一个测试阶段
开发流程:需求分析->系统设计->详细设计->编码实现<->单元测试->集成测试->系统测试->验收测试
特点:测试不是写代码写完以后才考虑,而是在设计阶段就开始考虑如何验证
应用场景:对质量要求较高,需求相对稳定,测试流程严格的项目
7 .敏捷开发 Agile
核心思想:把大型项目拆成很多短周期,小步开发,快速交付,持续反馈.严格来说不是单独一种固定流程,而是一类开发思想和方法
开发流程需求列表Product Backlog->选择本轮需求->短周期开发->测试->发布可用版本->用户反馈->调整需求0>下一轮开发:
特点:周期短,快速交付,接受需求变化,强调用户反馈,强调团队向协作
常见敏捷方法:Scrum,Kanban,Extreme Programing(XP)
8.开发模型对比
| 开发模型 | 核心思想 | 基本开发流程 | 需求稳定性要求 | 对需求变化的适应能力 | 用户参与程度 | 软件交付方式 | 风险控制能力 | 开发周期特点 | 主要优点 | 主要缺点 | 适合项目 | | ----------------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------ | -------------- | -------------------- | ------------ | ---------------------------- | ------------ | ---------------------------- | -------------------------------------- | ---------------------------------------------- | ----------------------------------------- | | 瀑布模型 Waterfall | 按阶段顺序完成开发 | 需求分析 → 系统设计 → 编码 → 测试 → 部署 → 运维 | 高 | 弱 | 较低 | 通常最后整体交付 | 较弱 | 前期规划完整,周期较长 | 流程清晰、文档完整、容易管理 | 后期需求变更成本高,问题可能到后期才暴露 | 需求明确、变化少、流程严格的项目 | | 快速原型模型 Prototyping | 先快速做原型,通过用户反馈明确需求 | 初步需求 → 快速设计 → 原型 → 用户反馈 → 修改需求 → 正式开发 | 低 | 强 | 很高 | 先交付原型,再正式开发 | 中等 | 前期反馈速度快 | 能快速发现需求理解偏差,降低沟通成本 | 原型可能被误认为正式系统,反复修改可能增加成本 | 需求不明确、UI/交互复杂、新产品 | | 增量模型 Incremental | 将系统拆成多个功能增量,逐步完成 | 总体需求 → 功能拆分 → 增量1开发/测试/发布 → 增量2 → …… | 中等 | 较强 | 较高 | 分批交付可运行功能 | 较强 | 可以较早发布核心功能 | 用户能较早使用系统,便于逐步扩展 | 前期需要合理划分模块,模块之间依赖可能复杂 | 功能较多、可以模块化拆分的项目 | | 迭代模型 Iterative | 先做出可用版本,再不断改进 | 初始需求 → V1 → 反馈 → 改进 → V2 → 反馈 → V3 | 较低 | 强 | 高 | 多版本持续交付 | 较强 | 多轮短周期改进 | 可以不断优化功能和设计,适应变化 | 如果缺乏整体规划,可能不断返工 | 需求持续变化、需要长期优化的项目 | | 螺旋模型 Spiral | 每轮开发都重点分析和控制风险 | 确定目标 → 风险分析 → 开发实现 → 测试评估 → 下一轮 | 较低 | 强 | 较高 | 多轮逐步交付 | 很强 | 周期较长,每轮都进行风险分析 | 非常重视风险,适合复杂大型项目 | 管理复杂、成本高、需要较强风险分析能力 | 大型、高成本、高风险、技术不确定项目 | | V 模型 V-Model | 每个开发阶段都有对应的测试阶段 | 需求 → 系统设计 → 详细设计 → 编码 → 单元测试 → 集成测试 → 系统测试 → 验收测试 | 高 | 较弱 | 较低 | 通常完整交付 | 较强 | 开发与测试计划紧密对应 | 测试体系清晰,质量控制严格 | 需求变化时调整成本较高,不够灵活 | 医疗、金融、工业控制等质量要求高的项目 | | 敏捷开发 Agile | 小步开发、快速交付、持续反馈、快速响应变化 | 产品需求列表 → 选择本轮需求 → 设计/开发 → 测试 → 发布 → 反馈 → 下一轮 | 低 | 很强 | 很高 | 高频、小批量持续交付 | 较强 | 多个短周期迭代 | 灵活、反馈快、能快速响应市场和用户变化 | 对团队沟通、自律和协作要求较高 | 互联网产品、Web 系统、App、快速变化的业务 | | Scrum | 通过固定长度 Sprint 推进敏捷开发 | Product Backlog → Sprint Planning → Sprint → Review → Retrospective → 下一轮 | 低 | 很强 | 很高 | 每个 Sprint 交付一个可用增量 | 较强 | 通常 1~4 周一个 Sprint | 分工和节奏明确,适合团队协作 | 会议和管理机制较多,小团队可能觉得繁琐 | 中小型敏捷软件团队 | | Kanban 看板 | 用可视化任务流控制工作数量和开发进度 | 待办 → 开发中 → 测试中 → 已完成 | 低 | 很强 | 较高 | 持续交付 | 中等 | 没有固定迭代周期 | 简单直观、灵活、容易看到任务状态 | 对长期规划和时间节点控制较弱 | 运维、维护、持续开发、需求不断进入的项目 | | XP 极限编程 Extreme Programming | 通过高频反馈和工程实践提高代码质量 | 小需求 → 编码 → 自动测试 → 重构 → 持续集成 → 小版本发布 | 低 | 很强 | 很高 | 小版本频繁发布 | 较强 | 开发周期短 | 强调测试、重构、持续集成,代码质量较高 | 对开发人员工程能力要求高 | 需求变化快、开发团队规模较小的项目 |
| 模型 | 最核心关键词 | | ------------ | -------------------------------------- | | 瀑布模型 | 按顺序做 | | 快速原型模型 | 先做出来给用户看 | | 增量模型 | 一点一点增加功能 | | 迭代模型 | 一个版本不断改进 | | 螺旋模型 | 围绕风险不断循环开发 | | V 模型 | 开发阶段和测试阶段一一对应 | | 敏捷开发 | 小步快跑、快速反馈 | | Scrum | 固定 Sprint 进行敏捷开发 | | Kanban | 通过看板持续推进任务 | | XP | 用测试、重构、持续集成保证代码质量 |
真实软件开发中,往往会混合使用多种思想,根据项目规模,需求文档程度,风险和团队情况,选择合适的开发方式.对于个人全栈项目,最常用的组合是:快速原型+增量开发+迭代开发+敏捷思想
二、需求分析
需求分析的核心,就是先搞清楚这个软件到底要解决什么问题,给谁用,需要具备什么能力.
可以回答下面的问题:为什么要做,给谁用,需要做什么,每个功能怎么运行,有哪些限制,出现异常怎么办
需求分析的结果可以直接决定后面的系统设计:数据库设计,API设计,页面设计,编码开发,软件测试
1.项目目标
项目目标需要说明:为什么开发这个系统,它要解决什么问题
2.用户与角色
一个系统通常会有不同类型的用户,不同角色拥有不同权限.这是后面进行权限设计,登录认证,接口权限控制的基础
3.功能需求
功能需求描述系统必须能够做什么
4.非功能需求
| 类型 | 含义 | | -------- | ------------------------ | | 性能 | 页面和接口响应速度 | | 安全性 | 登录、权限、密码保护 | | 可用性 | 系统是否容易使用 | | 可靠性 | 系统是否稳定 | | 可维护性 | 代码是否容易修改 | | 可扩展性 | 后续是否方便增加功能 | | 兼容性 | 是否支持不同浏览器、设备 |
5.业务流程
用户完成一个业务,需要经过哪些步骤
6.数据需求
系统需要管理哪些数据,明确系统需要保存什么信息.
7.异常与边界情况
考虑具体的业务流程中的异常情况
数据刚好处于临界位置时,系统是否还能正常工作
8.需求优先级
| 优先级 | 含义 | | ------ | -------------------------- | | P0 | 必须完成,否则系统无法使用 | | P1 | 重要功能 | | P2 | 可以后续增加 | | P3 | 优化功能 |
9.需求文档
项目需求文档
1. 项目介绍
2. 项目目标
3. 用户角色
4. 功能模块
5. 功能需求
6. 业务流程
7. 数据需求
8. 非功能需求
9. 异常与边界情况
10. 需求优先级
三、系统设计
1.技术选型
通常需要确定:前端技术,后端技术,数据库,项目构建工具,版本管理,部署环境
2.系统架构设计
确定系统各部分如何组成,以及它们之间如何通信
系统由哪些部分组成,每个部分负责什么,各部分如何通信,数据从哪里来,数据最终存到哪里
3.功能模块设计
把整个系统拆成多个职责明确的模块
4.数据库设计
确定系统需要哪些表,每张表有哪些字段,以及表之间是什么关系
有哪些实体,每个实体之间需要保存什么数据,实体之间是什么关系,哪些字段需要唯一,哪些字段需要索引
ER图,实体联系图,表示实体,属性,实体之间的关系
5.API 接口设计
确定前端和后端应该如何通信
明确URL,HTTP方法,请求参数,请求体,返回数据,状态码,异常情况
接口设计完成后可以形成API文档
常用工具:Apifox,Postman,Swagger/OpenAI
6.前端页面设计
确定用户看到什么,以及用户如何操作系统.通常包括页面结构,页面布局,导航,组件,交互方式,页面跳转,响应式设计.
通常流程:页面结构->线框图->原型->视觉设计->前端实现
常用工具:Figma,即时设计,Axure,Draw.io
页面设计需要考虑用户从哪里进入,用户下一步做什么,按钮放在哪里,错误信息显示在哪里,手机端如何显示,页面之间怎么跳转
最终输出通常有:页面清单,页面结构,页面原型,交互说明
7.UML 建模
UML(Unified Modeling Language,统一建模语言)是一套用图形描述软件系统的标准建模语言。
1.用例图Use Case Diagram
核心:描述谁可以使用系统的哪些功能
2.活动图Activity Diagram
核心:描述一个业务流程是怎么一步一步执行的
3.类图Class Diagram
核心:描述系统中的类以及类之间的关系
4.时序图Sequence Diagram
核心:描述多个对象之间按照时间顺序如何调用
8.系统设计阶段的输入与输出
| 内容 | 说明 | | ---------- | ---------------------------- | | 输入 | 需求文档 | | 技术选型 | 确定前端、后端、数据库等技术 | | 架构设计 | 确定系统整体结构 | | 模块设计 | 拆分系统功能 | | 数据库设计 | 表、字段、关系、ER 图 | | API 设计 | 前后端通信规则 | | 页面设计 | 页面、布局、交互 | | UML | 描述功能、流程、结构和调用 | | 输出 | 系统设计文档 |
四、编码开发
1.项目初始化
把前端,后端,数据库和基础工程环境搭建起来.需要完成创建前端项目,创建后端项目,创建数据库,配置项目依赖,配置开发环境,初始化Git仓库
2.前端开发
前端开发负责页面展示,用户交互,以及向后端发送请求
页面与组件
前端路由
3.后端开发
后端开发负责接收请求,处理业务逻辑,操作数据库并返回结果
4.数据库开发
吧数据库设计真正实现成表,字段,约束和SQL
5.前后端交互
前后端交互的核心,就是HTTP请求和HTTP响应
常见的求情方式
| HTTP 方法 | 含义 | 常见用途 | | --------- | -------- | -------- | | GET | 获取数据 | 查询 | | POST | 创建数据 | 新增 | | PUT | 修改数据 | 更新 | | DELETE | 删除数据 | 删除 |
常见的HTTP状态码
| 状态码 | 含义 | | ------ | -------------- | | 200 | 请求成功 | | 201 | 创建成功 | | 400 | 请求参数错误 | | 401 | 未登录 | | 403 | 没有权限 | | 404 | 资源不存在 | | 500 | 服务器内部错误 |
6.异常处理
系统出错时不能直接崩溃,而是要给出明确,统一的处理结果
7.Git 版本管理
记录代码变化,并管理项目版本
8.项目配置管理
把不同环境下可能变化的内容从代码中分离出来
数据库地址,数据库账号,数据库密码,服务器端口,API地址,文件路径,日志配置
分为开发环境,测试环境,生成环境
敏感信息不可直接提交到Git:数据库密码,服务器密码,API Key,Acess Token,Secret Key.应该使用环境变量,配置文件,服务器配置,Secret管理
9.编码阶段的完整开发链路
查看需求
↓
查看系统设计
↓
设计数据库
↓
编写后端接口
↓
编写 Service
↓
编写 Mapper
↓
测试接口
↓
编写前端页面
↓
调用后端 API
↓
处理正常情况
↓
处理异常情况
↓
本地测试
↓
Git Commit
10.编码开发阶段的输入与输出
| 内容 | 说明 | | ---------- | -------------------------------------------------- | | 输入 | 需求文档、系统设计、数据库设计、API 设计、页面设计 | | 项目初始化 | 建立前后端工程和数据库 | | 前端开发 | 页面、组件、路由、接口调用 | | 后端开发 | Controller、Service、Mapper | | 数据库开发 | 表、SQL、数据 | | 前后端交互 | HTTP + JSON | | 异常处理 | 参数、业务、系统异常 | | Git | 版本管理 | | 配置管理 | 开发、测试、生产环境 | | 输出 | 可以正常运行的软件系统 |
五、软件测试
1.功能测试
检查系统功能是否按照需求正常工作
2.单元测试
单促测试程序中的一个最小功能单元
流程:准备数据->调用方法->获得结果->断言结果
Java常用:JUnit,Mockito,Spring Boot Test
3.接口测试
直接测试后端API是否能够正确处理请求并返回结果.
常用工具:Apifox,Postman,Swagger / OpenAPI
4.集成测试
检查多个模块连接起来以后能不不能正常工作
5.系统测试
把整个软件作为一个完整系统进行测试
6.异常测试
主动制造错误情况,检查系统是否能够正确处理
常见异常场景:参数异常,数据异常,权限异常,系统异常
异常测试中还要特别关注边界值
7.回归测试Regression Test
修改代码后,再重新测试原理已经正常的功能
8.测试用例
| 内容 | 含义 | | -------- | ------------------ | | 测试目标 | 测什么 | | 前置条件 | 测试前需要满足什么 | | 输入数据 | 输入什么 | | 操作步骤 | 怎么操作 | | 预期结果 | 应该发生什么 | | 实际结果 | 实际发生什么 | | 测试结果 | 通过 / 失败 |
9.Bug处理流程
测试发现问题后,通常进入Bug修复流程
发现 Bug
↓
记录问题
↓
复现 Bug
↓
定位原因
↓
修改代码
↓
重新测试
↓
回归测试
↓
关闭 Bug
Bug至少应该记录:问题是什么,如何复现,预期结果,实际结果,错误日志,影响范围
六、项目部署
1.项目构建与打包
项目部署前,首先需要把开发代码构建成可以在服务器运行的产物
部署前需要确认:
后端可以正常打包前端可以正常构建配置文件正确数据库脚本准备完成生产环境参数正确
2.Linux 服务器环境
服务器就是项目真正运行的计算机,Java Web项目通常部署在Linux服务器上
常见Linux服务器:
Alibaba Cloud ECS
Tencent Cloud CVM
Huawei Cloud ECS
AWS EC2
服务器通常需要准备:
Linux
JDK
MySQL
Nginx
项目文件
3.JDK 与数据库部署
Spring Boot项目运行需要Java运行环境,下载安装jdk,配置环境变量
下载安装MySQL,配置数据库连接
4.前端部署
Vue项目构架完成后,本质上就是一组HTML,CSS,JavaScript静态文件
执行 num run build 得到dist/
5.Spring Boot 部署
让打包后的JAR在服务器上长期运行
6.Nginx
负责静态资源,反向代理和HTTPS.
7.域名与 DNS
域名就是用户访问网站时使用的地址,DNS负责域名解析到服务器IP
8.HTTPS
在HTTP基础上增加TLS加密
9.项目上线
让真实用户能够通过公网稳定访问系统.
完整上线流程:
开发完成
↓
测试通过
↓
前端构建
↓
后端打包
↓
上传服务器
↓
准备 JDK
↓
准备 MySQL
↓
启动 Spring Boot
↓
部署 Vue
↓
配置 Nginx
↓
配置 DNS
↓
配置 HTTPS
↓
公网测试
↓
正式上线
七、运行与维护
1.日志查看
日志就是程序运行过程中产生的记录,用来判断系统发生了什么
常见日志包括:
程序启动日志
请求日志
SQL 日志
异常日志
Nginx 日志
系统日志
2.服务状态检查
确认系统依赖的各个程序是否还在正常运行
3.CPU / 内存 / 磁盘
服务器资源不足,也会直接导致网站变慢甚至无法运行
4.故障排查
根据现象,一层一层找到真正出问题的位置
推荐排查顺序
1. 复现问题
2. 浏览器 Network
3. 查看 HTTP 状态码
4. 检查 Nginx
5. 检查 Spring Boot
6. 查看后端日志
7. 检查 MySQL
8. 定位代码
原则:出现问题不要直接修改代码,现确认问题到底发生在那一层
5.Bug 修复
标准流程:
发现 Bug
↓
复现 Bug
↓
确定原因
↓
修改代码
↓
本地测试
↓
回归测试
↓
Git 提交
↓
重新构建
↓
重新部署
↓
线上验证
6.数据备份
防止数据库,文件或服务器出现问题后无法恢复
需要备份的通常包括:
MySQL 数据库
用户上传文件
Markdown 文件
图片
关键配置
7.版本更新
把新功能或Bug修复后的程序重新发布到生产环境
8.用户反馈
系统中真正上线后,用户反馈会成为新的需求来源
反馈可能包括:
功能不好用
页面体验不好
发现 Bug
缺少功能
性能太慢
操作流程复杂
八、软件迭代
需求
↓
设计
↓
开发
↓
测试
↓
部署
↓
运行维护
↓
用户反馈 / Bug / 新需求
↓
重新进入需求分析