“功能写好了,我本地测过,没问题。”
这句话听起来很熟悉。可项目上线后,用户发现导出的订单少了几条;客服发现普通账号也能导出别人的数据;运维发现一次导出就占满了服务器内存。
代码确实写完了,但需求没有真正交付。
对程序员来说,成长不只是写得更快。更重要的是:拿到一个需求后,能否想清边界、实现功能、发现风险,并让它在真实环境中稳定运行。
下面用“订单列表增加导出功能”这个常见需求,聊聊值得反复训练的五个步骤。
一、动手前,先把“完成”说清楚
产品说:“订单列表加个导出按钮。”
如果立刻开始写按钮和接口,至少还有这些问题没有答案:
1、导出当前页,还是导出符合筛选条件的全部订单?
2、普通用户能否导出?管理员能否导出所有人的订单?
3、导出的字段有哪些?手机号和地址是否需要脱敏?
4、一次最多导出多少条?十万条数据能否同步生成?
5、导出失败后,用户在哪里看到原因?能否重试?
这些问题不需要开一场长会。把不明确的地方列出来,和相关同事确认即可。
一个更清楚的交付标准可以写成:
“管理员可导出当前筛选条件下的订单;导出文件只包含约定字段;超过一定数量时转为后台任务;生成失败可重试;普通用户无法访问该功能及接口。”
完成标准越具体,开发和验收时的争议越少。
给读者的练习:下次接到需求,先不要打开编辑器。用五分钟写下“谁能用、输入是什么、输出是什么、失败怎么办、怎样算完成”。
二、把功能画成一条链路
很多问题不是某一行代码写错,而是开发时漏看了其中一个环节。
订单导出的链路可能是:
用户点击导出
→ 前端提交筛选条件
→ 后端验证身份和权限
→ 查询符合条件的订单
→ 生成文件
→ 保存文件或返回下载内容
→ 前端提示成功或失败
画完链路,再逐个检查:
前端显示了“无权限”按钮,不代表后端可以省略权限判断。别人仍可能直接调用接口。
列表页使用的筛选条件,不一定自动传给导出接口。条件没对齐,就会出现“页面显示 20 条,文件里却有几百条”。
查询 100 条数据时正常,不代表一次加载 10 万条到内存也正常。
文件生成成功,不代表下载链接长期有效;如果链接会过期,页面要给出合理提示。
这一步的价值,是把“做一个按钮”还原成“完成一次可靠的数据交付”。
三、成功路径只占测试的一小部分
本地点击一次,成功下载文件,这是必要测试,但还不够。
继续测试这些情况:
-
筛选结果为空时,导出空文件、显示提示,还是禁用按钮?
-
用户连续点击三次,会生成三个任务吗?
-
导出过程中关闭页面,任务是否仍会继续?
-
数据库暂时不可用时,任务会怎样失败?
-
普通用户绕过页面直接请求接口,会得到什么结果?
-
文件生成后,别人拿到下载地址能否访问?
处理这些问题,不一定意味着第一版要做出复杂系统。关键是明确每种情况的预期行为,并把高风险路径测到。
尤其要记住:前端限制主要改善体验,身份和数据权限必须由后端独立判断。
四、让问题能够被定位
一个功能上线后,总会遇到开发环境没有覆盖的情况。此时最让人头疼的不是报错,而是只看到一句“导出失败”,没人知道失败在哪一步。
至少要让下面的信息能够串起来:
-
哪个请求或任务失败了?
-
失败发生在权限校验、数据查询、文件生成,还是文件下载?
-
使用了哪些筛选条件?记录时要避免泄露敏感数据。
-
处理了多少条记录,耗时多久?
-
是否发生重试?重试后结果如何?
例如,给一次导出生成一个任务编号。用户反馈“导出失败”时,开发者可以用编号查到对应的状态和错误,而不是让用户反复截图。
日志不是写得越多越好。密码、完整身份凭证、未脱敏的私人信息,不应该为了排错随意写进日志。真正有用的是足以还原流程、同时符合数据保护要求的信息。
五、交付后,留下下一次能复用的经验
有些程序员一年做了许多需求,却觉得自己一直在重复工作。原因之一是每次解决问题后,没有把经验沉淀下来。
完成一个功能,可以花十分钟记录四件事:
1、这次最容易遗漏的边界是什么?
2、实际出现了什么问题,根因是什么?
3、下次遇到类似需求,哪段设计或检查可以复用?
4、有没有一项检查能放进测试、代码审查或发布流程?
以订单导出为例,可以留下一个简短模板:
“导出功能检查:筛选条件一致、后端权限校验、数据量上限、失败提示、重复点击、文件访问权限、敏感字段处理。”
下次团队再做用户列表导出、报表导出时,不必重新踩一遍相同的坑。
给正在成长的程序员,一份可执行的自查清单
下次拿到需求时,试着按这个顺序推进:
接需求前:写清使用者、输入、输出和完成标准。
写代码前:画出从页面到数据存储的完整链路。
开发中:先完成最小可用流程,再补权限、异常和大数据量场景。
提交前:至少验证正常、空数据、无权限、重复操作和失败重试。
上线后:观察错误、耗时和用户反馈,记录一项能复用的经验。
不需要每个小需求都写一份长文档。复杂度低时,一张简短清单就够了;影响用户数据或资金的功能,则值得投入更多验证。
写在最后
程序员的能力,最终会体现在交付的结果上:功能是否符合需求,异常是否被考虑,问题是否能定位,下一位维护它的人是否看得懂。
下次你准备说“代码写完了”时,可以多问自己一句:
“如果用户现在开始真实使用它,我最担心哪一种情况?”
能找到这个问题,并主动验证它,就是从“把功能写出来”走向“把功能交付好”的开始。



