ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

软件工程开发流程全解析:从需求到上线的关键步骤

软件工程开发流程全解析:从需求到上线的关键步骤 聊到软件工程很多人第一反应是写代码但真正完整跟过一个项目的人会告诉你开发流程才是决定项目生死的那条线。我见过太多团队代码写得不算差最后却死在需求没对齐、接口改来改去、测试不知道测什么、上线前才发现数据库字段对不上这些“流程问题”上。这篇东西就是想把软件工程里那条“从想法到上线”的开发大致流程完整拆开讲清楚每个阶段到底要做什么、交付什么、为什么非做不可以及最容易在哪个环节翻车。如果你是刚开始接触软件工程的学生、在做课程设计或毕业设计、或者刚进团队准备带第一个项目这篇文章会非常有用。它不会教你怎么写某段代码而是告诉你在一段代码诞生之前和之后有哪些事必须有人做。1. 软件工程的流程不是走形式而是对抗“混乱”的武器1.1 没有流程的时候项目是怎么乱掉的先讲一个我常举的例子。三个人一起做饭一个切菜、一个炒菜、一个装盘。如果没有约定切菜的把土豆切成了条炒菜的想做薯条装盘的却按宴席冷盘摆。最后端上来的东西谁都不认识。软件开发比做饭复杂得多参与的人更多依赖关系更隐蔽而且“菜谱”本身还在不断变化。没有开发流程的项目典型症状就那几个需求靠口头传递做到一半发现老板要的和产品经理说的不是一回事。后端接口设计随心情来前端联调时才发现字段对不上。代码各写各的合并时冲突能解一天。测试人员不知道这版改了啥只能全量瞎点。上线日期永远是“下周”但没人能说清还差多少工作量。这些问题的根源不是某个人能力不行而是系统性的混乱。软件工程里的“开发流程”本质上是一套降低混乱度的约定它把不可控的事情切成一段段可控的小事每一段都有明确的输入、动作和输出。流程不是用来束缚人的是用来让大家对“现在在干什么、下一步干什么”有一致的认知。1.2 流程的粒度由风险决定不是越重越好一说要上流程有人就喜欢把瀑布模型、敏捷开发、CMMI、RUP全搬出来搞一堆文档和评审会结果项目一大半时间都在写没有读者看的材料。这其实是把流程当成了目的。我的经验是流程的粒度应该由“事情搞砸的代价”决定。你自己写个玩具项目搞砸了删掉重来那流程可以几乎没有。你在做一个给学校用的课程设计搞砸了影响学分至少要有需求、设计、测试三个阶段的痕迹。你在公司做一个客户项目搞砸了赔钱丢口碑那需求评审、设计评审、代码评审、测试用例评审一个都不能省。你在做一个有大量用户、涉及资金交易的系统那还要加上发布评审、监控告警、回滚预案、故障复盘。一句话流程不是成本是保险。买多少保险取决于你承受多大风险。这篇文章接下来讲的是一套完整流程你完全可以按自己的项目规模做裁剪但裁剪之前得先知道完整形态长什么样。2. 需求阶段一切错误的源头都在这也是修正代价最低的阶段2.1 需求调研别急着问“你要什么”先问“你要解决什么问题”很多人做需求调研上来就问用户“你想要什么功能”用户就会给你列一堆表面需求。比如“我要一个登录页”“我要一个数据报表”“我要一个消息推送”。这些听起来都很具体但如果你直接照着做大概率做到一半会发现根本不是那么回事。我习惯的做法是反复追问“为什么”。用户说要登录页你就问“登录之后要干什么不登录行不行哪些人需要登录他们现在是怎么登录的”用户说要数据报表你就问“谁要看这个报表他拿报表做什么决策现在没有报表的时候他是怎么判断的”多问几轮之后你会发现很多需求背后真正的东西可能是权限管理可能是数据可视化也可能只是一个Excel模板。需求调研阶段常用的手段包括用户访谈、现场观察、问卷调查、竞品分析、旧系统数据分析。不用全上挑适合项目规模的一两种就行。关键是把收集到的信息整理成需求清单每一条都要能回答清楚目标用户是谁、使用场景是什么、解决什么问题、怎么判断做成功了。2.2 需求分析把“一句话需求”拆到能落地这里就用登录功能举例特别适合课程设计和刚入行的朋友理解。产品经理拿来一句话“做一个登录功能。”如果直接进开发就会出现经典的“我以为”后端以为只要手机号加密码前端却接了微信登录。开发以为登录成功就直接进首页产品却要求连续输错5次锁定账号。测试以为注册和登录是同一个流程实际注册还要填邀请码。所以需求分析阶段要做的事就是把一句话拆成一个明确的功能列表。比如登录功能至少涉及账号密码登录手机验证码登录第三方授权登录记住登录状态 / 自动登录注销登录密码找回与重置登录失败次数限制与账号锁定登录日志记录每一条还要继续定细节验证码有效期多久密码最少几位锁定之后怎么解锁这些细节就是需求的颗粒度。颗粒度不够细开发靠猜测试靠蒙上线了才会爆雷。在这个阶段我会用两类工具帮助对齐一是原型图哪怕是手画线框图也行让用户看到“长什么样”二是用例图或用户故事描述“谁在什么场景下做什么事”。原型解决视觉问题用例解决逻辑问题两者结合才能把需求从抽象变具体。另外强烈建议在需求阶段就把验收标准草拟出来。每个功能对应一个可验证的“完成定义”比如“用户输入正确手机号和密码点击登录按钮后3秒内进入首页并在数据库和日志中留下记录”。有了这种描述开发和测试才知道终点线在哪里。2.3 需求评审会前发材料会上只做确认和拍板需求评审会是我见过最容易被开成“读文档大会”的会。大家坐在一起产品经理照着需求文档从第一页念到最后一页底下人昏昏欲睡最后主持人问一句“有没有问题”所有人摇头散会。结果需求文档里一个明显的错误直到开发阶段才被发现。有效的评审会应该是这样开的会前至少提前一天把需求文档、原型图发给所有参与人要求各自看完并提交问题。会上只讨论有争议的部分产品经理逐条解答技术负责人评估可行性测试负责人评估可测性。关键决策当场确认形成需求评审记录包括每条结论的负责人和截止时间。会后同步所有相关人需求变更必须走流程不能又变成口头交流。在这个阶段引入RACI矩阵会很有帮助谁是最终拍板的Accountable谁要干活Responsible谁要被征询意见Consulted谁只需要知道结果Informed。很多项目后期扯皮都是因为责任没提前说清。需求阶段最大的坑是你永远等不到需求完全锁定的那天。所以别追求完美追求“当前信息的最大公约数”然后用原型和验收标准把共识固化下来。3. 设计阶段架构和详细设计决定开发期是搭积木还是糊泥巴3.1 架构设计先拆模块、定边界再谈技术选型需求理清楚之后下一步是设计。很多人直接打开IDE开始建项目这是错误的做法。就好比盖楼图纸都没画就浇筑地基后面一定会返工。架构设计第一件事是拆模块。把系统按业务能力或功能域拆成几个相对独立的模块比如“用户模块”“订单模块”“支付模块”“消息模块”。模块之间通过接口通信不能随意跨模块调用。拆模块的核心衡量标准是模块内部高内聚、模块之间低耦合。用大白话说改订单模块的东西不应该影响用户模块的代码除非接口发生了变化。第二件事是定接口。每个模块对外暴露什么接口、参数和返回值长什么样、调用是同步还是异步、失败怎么处理这些要在设计阶段就说清楚。我见过最痛的情况是前后端并行开发联调当天才发现接口字段全是各想各的前端要的是user_name后端给的是username一行代码就能解决却要浪费一天沟通。第三件事是技术选型。编程语言、数据库、消息队列、部署方式等要根据业务场景选而不是听风就是雨。高并发实时系统要引入消息队列但你做一个内部管理后台单机加数据库就足够了引入Kafka只是给自己增加运维负担。技术选型的原则是先满足业务需求再考虑团队熟悉度最后才追新技术优先级千万别反了。架构设计通常还需要交付一份架构说明文档包含逻辑视图和部署视图。逻辑视图讲清楚系统分为哪些部分部署视图讲清楚运行时各部分跑在哪台机器上、怎么通信。画图用uml组件图、部署图或者简单的框图都可以关键是让团队一目了然。3.2 详细设计让一个不太了解业务的人也能照着开发架构设计解决“系统有哪些大零件”详细设计解决“零件内部怎么造”。详细设计要具体到数据库表结构设计每张表的字段、类型、索引、外键关系。接口详细定义路径、请求方法、请求参数、响应体、错误码。关键业务流程的时序图或状态机比如订单从创建到支付到发货经历了哪几个状态哪些操作会触发状态流转。异常处理与边界条件参数为空怎么办、超时怎么办、重复请求怎么办。很多人到了详细设计阶段会犯拖延症觉得“反正代码里会写注释文档就没必要了”。但详细设计文档最大的价值不是给机器看是给人类评审和后期维护用的。它能让你在代码写出来之前就发现逻辑里的漏洞。比如你设计订单表的时候把状态字段的类型定成int后来才发现业务里需要一个“已取消”状态数值范围得重新规划这时候改设计的成本远低于改代码。数据库设计是详细设计里最需要谨慎的部分。以电商下单为例库存扣减放在下单时扣还是支付时扣订单表和订单明细表要不要拆金额用什么类型存储这些决策一旦错了以后的数据迁移会非常痛苦。金额一定要用高精度类型绝对不能直接用浮点数这种教训都已经成了行业经典笑话了。3.3 设计评审与预研越早暴露风险越省钱设计阶段也必须有评审而且评审的重点不是“你这个设计对不对”而是“这个设计有没有遗漏场景、有没有严重风险、有没有不可实现的假设”。参会人至少要有架构师或资深开发、主要开发人员、测试负责人。如果你是第一次做一个新技术方向比如团队从没用过某个数据库或框架我建议先做一轮技术预研Spike就是写一个最小的实验代码验证这个技术能跑通、性能和稳定性符合预期再把它放进正式设计里。把技术风险留在设计阶段暴露比在开发阶段崩溃要划算得多。最后提醒一点详细设计文档的详细程度要随时调整。给长期维护的企业项目写可以写到伪代码级别给你课程设计的项目写只需要覆盖核心流程和数据模型。过度的详细设计文档比没有文档更可怕因为没人看、也没人维护很快会变成一份误导人的废纸。4. 开发阶段任务拆分、版本管理和代码评审让团队并行不打架4.1 任务拆分与估时把“还差两周”变成精确到天的计划设计完成开发正式开始。但如果你把“开发”理解成“大家打开IDE各写各的写完再合起来”那后面一定会被现实教育。开发阶段的第一步是把设计成果拆成可执行的任务清单。任务拆解的常用工具叫WBS工作分解结构就是把一个大的里程碑一层层拆到每个任务不超过1-3天的工作量。比如“实现登录模块”这个大任务拆成“设计数据库表”“写登录接口”“写验证码接口”“写前端登录页”“联调登录流程”“补充单元测试”等等。拆到这个粒度进度才可控谁做哪块也讲得清。任务拆分的同时要估算工时。这里我踩过一次大坑团队估工时时都比较乐观总觉得这个小功能很快就能写完结果每个任务都超期两三天项目硬生生推迟了一个月。后来我要求估完时统一加20%-30%的缓冲用来应付沟通成本、意外问题和联调时间。估时不是承诺是对不确定性的诚实评估。拆分和估时做完建议用看板Kanban管理无论是Trello、Jira、飞书还是最简单的Excel都行。任务状态至少要有待开发、开发中、待测试、测试中、已完成。每天站会问三件事昨天做了什么、今天打算做什么、有没有被卡住。有这个机制进度风险会提前暴露而不是最后一周集中爆发。4.2 分支管理与代码评审让多个人的代码能和平共处多人同时开发一个项目没有版本管理就是灾难。Git没得说行业标准。但Git只是工具分支管理策略才是重点。对于大多数中小型项目我推荐GitFlow的简化版main分支始终保持可发布状态。develop分支作为集成分支。每个功能从develop拉出feature/xxx分支开发完成后合回develop。发布时从develop拉到release/x.y.z分支测试通过后合并到main并打上版本标签。线上bug从main拉hotfix/xxx分支修复修完同时合并回main和develop。这个策略听着复杂但每一条规则都是踩坑换来的。比如“main必须始终可发布”就是防止你周五晚上上线前才发现main上有一段没测完的代码。有了分支管理代码评审Code Review就顺理成章。每个功能分支要合并到develop之前必须通过合并请求Merge Request / Pull Request至少要有另一个开发看过代码、CI检查通过才能合入。代码评审不是为了挑刺而是为了发现测试测不出来的问题逻辑漏洞、安全隐患、性能隐患、可维护性问题。4.3 Definition of Done怎么证明这个功能“真的做完了”开发阶段最模糊的词就是“做完了”。开发说做完了测试一测发现流程根本走不通。为什么因为大家对“完成”的定义不一样。所以团队必须约定一个Definition of DoneDOD所有任务只有满足以下条件才算完成代码已按规范编写命名清晰无明显的坏味道。核心逻辑有单元测试覆盖测试通过。本地或开发环境完成了冒烟核心流程能跑通。接口文档和相关注释已更新。代码已提交并推送通过了CI中的自动化检查和代码评审。任务看板状态已更新为待测试。DOD最大的作用是强行把“写代码”和“交付可运行的软件”区分开。很多新人觉得写完代码就结束了但在软件工程里写完代码只完成了开发阶段的一半。这就像做菜炒熟只是中间过程装盘、调味、擦干净灶台才算上桌。关于单元测试这里多说一句很多人觉得写测试浪费时间但测试其实是给开发自己省时间的。写一个函数时顺手写几个断言成本很低等项目上线后出了bug再回来定位问题的时间成本往往是写测试的好几倍。尤其是重构的时候没有测试兜底你根本不敢改代码。5. 测试阶段质量不是测出来的但没测一定出事5.1 测试计划与用例设计测试不是开发完了才想测试最忌讳的是“开发交付后测试才打开系统随便点点”。测试应该在需求阶段就开始参与在设计阶段就编写测试计划。测试计划至少要包括测试范围测哪些功能、不测哪些、测试类型功能、接口、性能、兼容、安全、测试环境、测试数据、时间安排、准入准出标准。用例设计是测试阶段的核心工作。常用的设计方法有几个等价类划分把输入分为有效等价类和无效等价类每个等价类取一个代表值测试。比如手机号字段有效的格式是一类无效格式是一类。边界值分析重点测边界附近的值。比如密码最长为16位那16位、17位、0位、1位都要测。场景法按业务主流程设计用户操作路径。比如下单成功后库存减少、支付成功后订单状态变更。一条用例至少要包含编号、所属模块、前置条件、操作步骤、测试数据、预期结果。不用写得多花哨但预期结果必须明确否则测完不知道是对是错。这里我想强调测试用例和需求的双向跟踪。一条需求至少要有一条对应的测试用例否则就说明这个需求没法验证。反向也一样一条测试用例如果找不到对应的需求就说明开发做了需求之外的东西这要么是额外亮点要么是范围蔓延得有人确认。5.2 缺陷管理Bug的生命周期和该有的信息测试的目的不是证明程序没问题而是尽可能找出问题。找到一个Bug不算本事能把Bug有效传递出去、让人快速修复才是本事。一份合格的Bug报告至少包含标题能定位问题的简短描述比如“安卓端登录页在输入11位手机号后点击登录无响应”。环境信息系统版本、浏览器或设备型号、网络环境。前置条件例如必须已登录另一个账号。复现步骤一步一步写清楚。实际结果和预期结果。日志、截图或录屏辅助定位。Bug本身也有生命周期新建New- 确认Open- 修复Fixed- 验证关闭Closed如果在验证时仍然复现就重新打开Reopened。每个Bug还要标注严重程度致命的、严重的、一般的、轻微的和优先级紧急、高、中、低。优先级由项目负责人结合业务影响来判断严重程度提供参考但不等同于优先级。开发人员对待Bug的习惯我建议遵循一个原则先复现再修复。不能复现的Bug要么提供更多日志要么暂时挂起千万别靠猜改代码大概率会引发新的问题。修复完还要补一条对应的回归用例防止下次改别的东西时把这里改坏了。5.3 测试准入与准出测试不是无限期也不是一次就完测试阶段最容易出现的情况是开发不断塞新功能进来测试不断返工测试周期一延再延。这背后的原因就是没有准入标准。所谓进测试的标准至少要求开发自测通过核心流程能跑通。代码已合入集成环境构建成功。P0、P1级功能已开发完成没有被标记为“没法测”的状态。满足准入条件测试才开始。否则就退回去让开发补齐。准出标准则是上线前的最后一道闸门通常包括所有P0致命、P1严重级别的Bug全部关闭。P2级别的遗留Bug有明确的解决方案和计划。回归测试通过核心流程无阻断性错误。通过了用户的验收测试或UATUser Acceptance Testing。在很多团队里测试的最后一道关是用户验收测试。让真正的用户或产品代表按真实业务场景走一遍核心流程确认系统满足业务预期。这一步越早安排越好因为用户的理解永远和你不一样。6. 上线与运维发布不是终局是一个新循环的起点6.1 发布准备回滚方案和数据库迁移是上线前必须想好的开发测试都完成了最后一步是上线。但上线远不是点个按钮把代码扔到服务器上那么简单。一个严肃团队的上线前检查清单至少包含发布内容说明这一版包含哪些功能、修复哪些Bug、影响哪些模块。发布计划发布时间窗口建议选低峰期、操作步骤、负责人、回滚条件。回滚方案如果发布后出现严重问题怎么快速恢复到上一个版本。代码回滚容易数据库迁移回滚难。这里专门说一下数据库迁移。代码可以回滚但数据库一旦执行了删除或修改字段的脚本恢复数据往往相当困难。解决办法是一是建表、加字段的脚本要向下兼容旧代码和新代码可以同时运行二是发布过程尽量采用灰度发布的思路先切一部分流量、验证稳定后再全量切换。灰度发布能让问题只影响一小部分用户而不是一出事就是全员事故。6.2 监控与告警没有监控的上线就是摸着石头过河系统上线之后它到底是活的还是死的不能等用户投诉才发现。必须有监控。最基础的三层监控日志监控程序运行的错误日志、WARN日志是否异常增多。指标监控CPU、内存、磁盘、网络IO、QPS、平均响应时间、错误率。告警规则当错误率连续5分钟超过阈值或响应时间超过某值时通知到责任人。告警阈值怎么定很有讲究。定得太敏感半夜全是骚扰短信慢慢你就会忽略所有告警定得太迟钝系统挂了几个小时没人知道。我的经验是开始定得保守一些运行一两周后根据真实数据调整并且告警一定要分级P0只放最关键的系统级故障其他问题发到群里定期处理就行。上线后前24小时是观察期建议安排专人盯着监控面板快速处理突发问题。同时准备好一套问题定位工具日志平台、链路追踪、数据库慢查询分析缺一不可。否则出问题了你连从哪下手都不知道。6.3 反馈闭环和迭代回顾流程越用越顺的关键流程不是设计完就固定的它是活的。每次迭代和交付之后应该安排一次回顾会Retrospective团队坐下来聊三个问题这次做得好的是哪些要保留。这次做得不好的是哪些要改进。下一轮怎么改谁来负责。这里我见过一个很有价值的方式把迭代中出现的所有问题按“需求、设计、开发、测试、上线”环节归类然后追问最浪费时间的三个问题分别出在哪个环节。比如联调的时候发现接口字段对不上那问题出在设计阶段而不是测试不认真。把这类问题反馈到流程源头下一轮就不会再犯同样的错。再加上故障复盘Postmortem机制。线上出了重大故障不追责个人但必须把根因分析、处理过程、改进措施都写成文档并且落实。流程存在的意义之一就是让同一块石头不要绊倒团队两次。7. 按项目规模裁剪流程课程设计、小团队、大项目该各取所需7.1 软件工程课程设计和毕设场景轻流程也要有完整足迹正在做软件工程课程设计或毕业设计的同学最容易犯的错是不留流程证据。做了个挺完整的系统最后写报告或者答辩时发现拿不出需求分析、设计文档、测试记录只能临场编。这个阶段我不建议你搞一堆复杂的敏捷仪式但至少要有这样几条痕迹需求分析5-10条功能需求每条附上验收标准。数据库/详细设计表结构说明、核心流程描述。开发过程Git提交记录能看出增量开发的过程。测试记录核心功能的测试用例和测试结果。部署说明别人怎么运行你的系统。这些痕迹不仅是给老师看的更是给自己理清思路的。一个系统如果连设计文档都没有你写着写着很容易迷失在代码里最后交上去的东西只是“能运行”但一被问设计思路就露馅。7.2 小团队和创业项目场景轻流程不等于没流程小团队资源有限如果照搬大公司流程光开会就能把人累死。我的建议是把流程压到最薄但保住三件事——需求清单、任务看板、自动化的CI。小团队开发最怕的不是乱而是“没人记得当时为什么这么决定”。所以哪怕只用一张共享表格也把需求、决策、进度记录下来。CI系统用GitHub Actions或类似的工具每次提交自动跑单元测试和构建检查能拦截掉一大半低级错误。代码评审也必须保留哪怕只是另一个同事看一眼提个问题。对于三到五人的团队这几个动作加起来每天占不了多少时间却能避免大量返工。7.3 大型项目或To B交付场景流程是合同的一部分如果你在做一个金额大、周期长、客户还排了驻场人员的项目那流程就不再是内部管理工具而是合同合规性的一部分。需求要签字确认、变更要走正式的变更控制、每个版本都要有测试报告和验收记录。这种场景下文档繁琐是必须的因为一旦双方发生争议只有白纸黑字的记录能当依据。我在这种项目里学到的最重要一课是所有变更都走流程哪怕是口头听起来很小的改动。比如客户今天说加一个导出按钮你顺手就做了没走变更流程那后面客户可能反咬一口说这个功能不在范围内你免费多干了几天的活。流程在这里不是官僚主义是保护你的武器。最后分享一点个人体会这些年在不同团队里走完过好多轮开发流程最大的体会是流程的“度”比流程本身更重要。流程太薄项目失控大家互相甩锅流程太厚团队被文档和会议拖死照样拿不出东西。真正好的流程是在每一个容易出错的地方都设了一个检查点让错误在最早、最便宜的阶段被发现而不是等它滚到最后才爆炸。我自己的习惯是每到一个阶段末尾花十分钟问自己三个问题这个阶段的输入是否清楚输出是否可验证下一阶段能不能顺利接得住三个问题答案都是“是”流程基本就顺了。这套完整流程看起来很长但真正跑熟练之后你会发现每个环节都是在给之后省时间。软件开发从来没有一蹴而就的捷径所谓高效不过是把每一步都走得扎实一点。
返回列表