
做研发外包,到底怎么定里程碑和验收标准才不被坑?
说真的,每次一提到IT外包项目,无论是甲方还是乙方,脑子里第一反应可能都是“扯皮”。甲方担心:钱花了,做出来的东西是一坨屎怎么办?按时交不了货怎么办?乙方也担心:需求变来变去,最后结款还要被扣一大笔钱怎么办?这种拉扯的核心,其实就卡在两个点上:里程碑(Milestone)和质量验收标准(Quality Acceptance Criteria)。
这两个东西如果定不好,后期就是一场灾难。它不仅仅是合同里的几行字,而是项目能不能顺利交付、双方能不能好聚好散的生命线。很多人以为找个模板套一套就行了,完全不是那么回事。外包项目千差万别,有的是定制开发,有的是人力外包,有的是整套系统交付。怎么定,得有套路,更得有经验。今天就抛开那些教科书式的废话,聊聊怎么用最接地气的方法,把这两根“定海神针”给立住。
先搞懂一个核心逻辑:里程碑不是“进度条”,而是“结算点”和“验证点”
很多人对里程碑有误解,以为它就是项目进度条上的一个标记,表示“我们干到这儿了”。这太表面了。
在真实的研发外包场景里,里程碑的核心作用有两个:
- 资金的控制阀:绝大多数外包合同,付款方式都是按里程碑节点来付的。比如“合同签订付30%,UI设计确认付20%,开发完成付40%,上线稳定运行一个月付10%”。如果里程碑定义模糊,甲方可以说“你这个还没做完”,拒绝付款;乙方可以说“这个已经达到了阶段目标”,要求付款。这就是扯皮的根源。
- 风险的防火墙:软件开发最大的风险是“最后一天交付”。如果一个项目开发周期是3个月,如果你只在第90天去验收,发现功能根本跑不通,那一切都晚了。里程碑就是把一个大项目切碎,切成一个个小阶段。每个阶段结束,你都要确认“这一块没问题了”,再往下走。这样即使后面出问题,也只是局部问题,不会全盘崩塌。
所以,设定里程碑的思路,绝对不能是按时间分,比如“第一个月做这个,第二个月做那个”。必须按“可交付成果”(Deliverables)来分。

举个最简单的例子。假设你要外包开发一个类似“钉钉”的企业通讯工具,工期6个月。一个经典的错误里程碑划分可能是:
- 1-2月:完成需求分析和UI设计
- 3-4月:完成核心代码开发
- 5月:进行测试
- 6月:上线部署
这种划分方式,甲方可不傻。到了2月底,你给他一份几十页的需求文档和一堆PNG图片,他心里会犯嘀咕:“这东西还没经过验证,我怎么知道你们设计的是对的?万一开发到一半发现逻辑不通,那不是白费了?”
所以,一个更专业、更让人安心的里程碑划分应该是这样的,我把它称为“功能闭环式”划分:
- 里程碑1:需求规格说明书(SRS)双方签字确认。(交付物:文档)
- 里程碑2:高保真UI/UX设计演示通过验收。(交付物:可点击的原型或设计稿)
- 里程碑3:核心登录及用户管理模块Demo可演示。(交付物:可运行的软件模块)
- 里程碑4:单聊、群聊功能开发完成,通过内部测试。(交付物:安装包或测试环境地址)
- 里程碑5:全部功能开发完成,集成测试通过,UAT(用户验收测试)环境部署。(交付物:可在生产环境测试的完整系统)
- 里程碑6:正式上线,稳定运行15天,完成最终交付。(交付物:源代码、文档、服务器权限等)

你看,这样划分的好处是,每一个里程碑都有一个明确的、双方都能看到的、可触摸的“东西”。而且后一个里程碑是建立在前一个里程碑确认无误的基础上的,风险逐层释放。
如何科学地切分里程碑?两个实用的“小工具”
光有概念还不够,实际操作中怎么切分才合理?这里分享两个方法,一个是像切蛋糕一样,一个是像搭积木一样。
1. 像素蛋糕法:按功能模块切
对于大部分定制开发项目,最稳妥的办法就是按功能模块来划分。这就像切蛋糕,把一个完整的蛋糕切成几大块。
比如做一个电商APP。你可以按照客户端(用户端)、商家端、管理后台这三个大块来切。也可以按照功能流程来切:
- 商品展示模块
- 购物车和下单模块
- 支付集成模块
- 订单管理模块
每个模块内部,再要求完成“设计-开发-自测”闭环。但是定里程碑的时候,不要把所有模块都设计成一个里程碑,那样就又回到了大验收的老路。正确的做法是,选择一个“最小可用功能集”作为第一个重要里程碑。
比如,你可以先定:
- 里程碑1:商品展示模块(功能最简单,最容易看效果)
- 里程碑2:购物车+下单模块(核心业务流程)
- 里程碑3:支付+订单管理模块(完善闭环)
这样做的好处是能让甲方尽快看到实实在在的东西,建立信任。如果在第一模块就发现合作有问题,还能及时止损。
2. 瀑布流+敏捷法:按研发流程切
如果项目非常大,工期很长,动辄一年以上,那完全按功能模块切也不行,因为技术架构和设计必须先行。这时可以结合瀑布流和敏捷开发的思想。
可以把项目分成几个大的阶段(Phase),每个阶段包含若干里程碑(Milestone)。
第一阶段:设计与架构(比如4周)
- 里程碑1.1:产品原型确认。
- 里程碑1.2:技术架构方案评审通过。
- 里程碑1.3:UI视觉规范和核心页面设计稿确认。
第二阶段:核心功能开发(比如12周)
在这个阶段,可以引入敏捷的冲刺(Sprint)概念,但对外包来说,你不能让甲方每个Sprint都来验收一次,太累了。可以设定双周或月度的验收点。
- 里程碑2.1:第一期增量版本(比如只有登录和基础信息流)Demo,主要验证技术架构的可行性。
- 里程碑2.2:第二期增量版本(核心业务流程)Demo,进入UAT环境。
- 里程碑2.3:第三期增量版本(辅助功能完善),完成所有开发。
第三阶段:测试与上线(比如4周)
- 里程碑3.1:Bug修复率达标(比如P1、P2级Bug清零)。
- 里程碑3.2:性能测试报告出具,核心指标达标。
- 里程碑3.3:生产环境部署成功,正式上线。
(小声说一句:别被“敏捷”这个词搞晕,对外包项目来说,核心是“小步快跑,快速验证”。即使合同里写的是“V模型”或者大瀑布,实际执行中也可以跟乙方商量,让他们内部用敏捷迭代,但对外的里程碑交付物必须清晰。)
最难啃的骨头:质量验收标准到底怎么定?
如果说里程碑是骨架,那质量验收标准就是血肉。这是最考验双方智商和情商的地方,也是最容易产生分歧的地方。
“好用”是个伪命题
甲方最爱提的一个要求是:“这系统得好用”。乙方最爱回的一句是:“我们测了,好用”。结果上线后,甲方说:“这根本不好用,这里点击不方便,那里加载太慢!”
为什么?因为“好用”是主观的。你必须把主观感受,拆解成客观的、可测量的指标。这就是质量验收标准的核心。永远不要用形容词,要用数字和事实。
我们可以把质量标准拆分成几个维度来看:
- 功能性(Functionality)
- 性能(Performance)
- 安全性(Security)
- 易用性(Usability)
- 文档(Documentation)
- 非功能性要求(代码规范、可维护性等)
1. 功能性——不掉链子就行吗?
功能上,最基本的要求当然是“按照需求文档实现”。但这还不够,你需要定义清楚Bug的级别。这是避免扯皮的关键。
通常会分为三级或四级(可根据项目调整):
- 致命(Critical/P1): 导致系统崩溃、数据丢失、核心功能无法使用的Bug。比如支付时程序崩溃、用户无法登录。标准是:上线前必须100%解决,不允许存在。
- 严重(Major/P2): 主要功能点实现了,但有重大缺陷,影响用户正常使用。比如查询结果一直转圈、无法正常接收消息。标准是:上线前必须100%解决,不允许存在。(有时候为了赶进度,可能会协商遗留少量,但必须在验收报告里写清楚,并且有临时规避方案)
- 一般(Minor/P3): 界面显示问题、文案错误、逻辑不严谨但不影响主流程。比如某个按钮颜色偏了一点、错别字。标准是:允许在首次上线前少量存在,但必须在上线后xx天内解决。
- 建议(Trivial/P4): 用户体验优化建议。比如“这里能不能换个图标”。标准是:不在本次合同范围内,列入后续优化。
在合同里附上一张Bug级别定义表,非常有必要。这能让甲方明白,一个像素的偏差,和一个数据崩溃的错误,验收标准是天差地别的。
2. 性能——到底多快才算快?
性能是另一个重灾区。“系统不能卡”这句话等于没说。必须量化。对于外包项目,性能指标通常关注这几个点:
需要定制的场景:- 并发量: 能同时支持多少人在线?多少人操作?例如:“在1000用户并发登录的情况下,95%的响应时间小于2秒,CPU占用率低于70%。”
- 响应时间: 关键接口的响应时间。例如:“列表查询接口,数据量1000条以内,返回时间不超过500毫秒。”
- 稳定性: 比如“7x24小时连续运行,无内存泄漏,无死锁”。
别忘了,测试环境的机器配置和生产环境可能差很远。所以验收标准里要明确:使用什么配置的服务器(比如4核8G的云主机),在什么样的网络环境下,达到什么样的性能指标。 如果甲方要求生产环境更好配置下的性能,那价格也得跟着涨。
3. 安全性——底线中的底线
安全这事儿,普通研发外包项目可能不会做得很极致,但基本的底线要有。尤其涉及到用户信息、交易数据的项目。
最低限度的验收标准应该包括:
- 规避OWASP Top 10(国际公认的Web应用十大安全风险):不能有SQL注入、XSS跨站脚本攻击这类基础漏洞。 这个可以找第三方工具扫一下出份报告。这钱不能省。
- 密码存储: 必须加盐(Salt)哈希处理,不能明文存储。
- 权限控制: 普通用户不能访问管理员接口。
在验收标准里写清楚:“代码上线前,需通过XX安全扫描工具检测无高危漏洞(Critical)和严重漏洞(High)”。
4. 易用性与UI——减少主观扯皮
UI的主观性太强。如何避免甲方老板说“这个颜色我不喜欢,换一个”?
最有效的方法是:前期锁定设计稿。
在里程碑里已经提到了,UI设计稿必须在早期敲定,设计稿里要注明交互逻辑。验收时:
- 开发出来的界面,必须和设计稿像素级还原(Pixel Perfect)。这个可以量,用肉眼看,或者用工具对比。
- 交互逻辑,必须遵循设计稿里的原型说明。
如果甲方中途想改UI,那好,这是需求变更(Change Request),需要另外排期和付费。这是保护乙方开发人员不被无休止改稿折磨的救命稻草。
5. 文档与源码——交付的不仅是程序
很多项目验收时,乙方只给一个网址或者一个安装包,源码、文档丢过来一个压缩包就完事了。这不行。
验收标准里必须明确列出需要交付的文档清单和质量要求,我列个简单的列表参考一下:
| 交付物类型 | 具体要求 | 验收标准 |
|---|---|---|
| 技术文档 | 数据库设计文档(PDM/ER图)、API接口文档(Swagger/OpenAPI)、部署文档、架构设计文档 | 内容准确,更新及时,与实际代码逻辑一致,关键节点有注释 |
| 用户手册 | 管理员操作手册、用户使用指南 | 截图清晰,步骤完整,新手能看懂 |
| 源代码 | 完整工程代码,包含依赖库说明(package.json/pom.xml等) | 代码注释率不低于20%(核心逻辑必须有注释),无大段复制粘贴代码,符合约定的代码规范 |
| 版本说明 | 发布说明(Release Notes) | 明确列出本次发布包含的功能、修复的Bug、已知问题 |
特别是代码注释和规范,很多外包团队代码写得像天书,接手维护简直是噩梦。在合同里约定“代码规范符合XX标准”或者“关键逻辑每10行代码至少有一行有效注释”,虽然是软指标,但至少表明了态度,也能在事后作为不通过验收的依据。
执行中的“潜规则”与“脏活累活”
定好了规则,执行过程依然充满陷阱。这里有几个非技术性的“坑”,必须要注意。
1. 验收流程不能省
达到里程碑了,乙方说“好了,你付钱吧”。甲方说“我还没测呢”。这不行。
必须建立一个规范的验收流程。我的建议是“ATDD”(验收测试驱动开发)的简化版:
- 乙方自测: 乙方必须提供详细的自测报告和测试用例通过截图。
- 甲方内部测试(Beta测试): 甲方指定几名内部员工,按照“用户验收测试用例”进行真实操作,并记录问题。
- Bug修复与回归: 乙方修复甲方提出的问题(必须界定什么算Bug,什么算需求变更)。
- 签字确认: 甲方负责人在验收报告上签字。这个签字版本,通常作为付款的依据。
这里有一个小心机:验收测试用例最好在开发前就双方确认。 这份用例就是验收的“考卷”,乙方照着做,甲方照着考,公开透明,没有惊喜。
2. 需求变更永远是痛点
项目进行中,甲方突然说:“这个注册流程能不能加个手机验证码?”。乙方心里一万头羊驼奔过,因为这不仅涉及前端改代码,后端还得接短信接口,数据库还得加字段。
应对方法只有一个:变更控制委员会(CCB)形式的口头约定。
不需要真的成立一个委员会,但必须口头或邮件约定好:
- 任何涉及页面逻辑变动、字段增减、新增功能点的请求,都算变更。
- 变更要有书面的变更申请单。
- 乙方必须给出变更的影响评估:需要多少人天?延期多久?费用增加多少?
- 甲方书面(邮件或签字)确认同意后,乙方才能执行。
没有这个流程,项目就会变成“无底洞”,最后双方互相埋怨。
3. 人天陷阱
有些外包是按人天(Man-Day)结算的。这时候监管难度更大。
如果是按人天结算,里程碑按功能点定的意义就弱化了。这时候,质量验收标准就是唯一的救命稻草。你必须要求乙方派出的人员,产出的东西符合约定的质量标准。如果一个人天天来上班,写出的东西全是Bug,或者根本做不完当初承诺的功能,那这个人天就是浪费钱。
所以,按人天结算时,验收标准要更严苛,要频繁检查代码质量(Code Review)。
写在最后的几句心里话
写了这么多具体的技巧,其实最核心的一点,还是“信任但要验证”(Trust but verify)。
好的外包项目经理,不是天天盯着代码敲的人,而是懂一点技术、懂一点法律、懂一点人情世故的“润滑剂”。他要能站在甲方的角度,帮他把模糊的需求想清楚,把验收标准定量化;也要能站在乙方的角度,保护他们少受无谓的需求变更骚扰。
里程碑和验收标准,本质上是双方对“交付”这个词的共同定义。它不需要写得像法典一样复杂,但一定要清晰、无歧义、可执行。把丑话说在前面,把规矩立在明处,看似严格,实则是对项目双方最大的保护。毕竟,谁都想项目顺顺利利做完,钱安安稳稳落袋,大家都能早点下班回家陪家人,不是吗?
企业人员外包
