多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

程序员如何与海外产品经理对齐需求:别让一句“很简单”变成两周返工

程序员如何与海外产品经理对齐需求:别让一句“很简单”变成两周返工 程序员在开发过程中经常会收到这样的需求增加一个导出功能。支持多语言。优化一下性能。增加管理员权限。看起来每句话都能理解真正开始开发后却会发现大量细节没有确定导出什么格式数据量有多大多语言包含界面、内容还是实时语音性能需要提升到什么程度管理员能够查看哪些数据旧版本是否需要兼容功能失败后怎样处理谁来验收最终结果。如果产品经理与研发位于不同国家使用不同语言需求中的模糊空间会进一步扩大。很多返工并不是因为程序员写错代码而是团队从一开始就没有对“要做什么”形成共同理解。本文从开发者视角出发介绍如何与海外产品经理进行需求沟通把模糊描述转化为可以设计、开发、测试和验收的任务。一、听懂需求不等于理解需求产品经理说We need to support multiple languages.直译是我们需要支持多种语言。但“支持多语言”可能表示界面可以切换语言用户输入内容可以翻译系统邮件需要本地化帮助文档提供不同语言版本客服能够与不同语言用户沟通会议中提供实时翻译搜索能够跨语言匹配日期、货币和数字格式本地化。如果程序员根据第一印象开始开发最终交付的功能可能完全符合字面描述却没有解决产品真正的问题。因此需求沟通的第一步不是估时而是确认用户是谁 他在什么场景下遇到了什么问题 我们希望改变什么结果二、从“要做什么”追问到“为什么要做”收到需求后程序员往往立即进入实现思维需要加哪个接口 数据库增加什么字段 前端放在哪个页面但在讨论实现之前应该先了解业务动机。例如需求增加批量导出。可以继续询问谁需要导出 为什么现在的单条导出不够 一次大约导出多少条 导出后用于什么 是否包含敏感数据 用户愿意等待多久进一步了解后可能发现用户真正的问题不是缺少批量导出而是每周需要向管理层发送汇总报告。这时更好的方案可能是自动生成报告定时发送提供共享链接增加报表页面而不是简单增加一个下载按钮。程序员理解“为什么”才能在技术实现与业务目标冲突时提出更合理的建议。三、使用具体场景代替抽象描述抽象需求很容易让不同角色形成不同理解。例如系统需要支持团队协作。这句话几乎无法直接开发。可以要求产品经理提供一个具体场景团队管理员创建工作区 邀请五名成员加入。 普通成员可以创建任务和查看结果 但不能修改账单信息。 管理员可以查看所有成员的任务 也可以停用成员账号。场景中出现了角色操作权限数据范围状态变化。程序员可以据此继续识别需要设计的接口、数据结构和权限规则。四、用 User Story 仍然不够常见用户故事格式是作为某类用户 我希望完成某件事 从而获得某种价值。例如作为管理员 我希望导出成员使用记录 以便进行月度统计。这有助于理解目标但仍然缺少大量实现所需信息导出哪些字段时间范围如何选择数据量上限使用什么格式是否需要异步生成谁能下载链接多久失效是否记录审计日志。User Story 是沟通起点不是完整规格。五、把需求拆成“规则、流程和异常”一个可以进入开发的需求至少要理解三个部分。1. 业务规则例如只有组织管理员可以导出。 单次最多导出一万条。 导出内容不能包含已删除用户的邮箱。2. 正常流程管理员选择时间范围 ↓ 提交导出任务 ↓ 系统后台生成文件 ↓ 管理员收到通知 ↓ 下载文件3. 异常流程数据量超过限制怎么办 生成失败怎么办 任务重复提交怎么办 下载链接过期怎么办 用户在生成过程中失去权限怎么办很多线上 Bug 都藏在需求没有讨论的异常流程中。六、验收标准必须在开发前明确下面这种验收方式非常危险开发完成后 产品经理看一下是否符合预期。如果“符合预期”没有提前写明开发者和产品经理可能各自拥有一套标准。可以使用 Given-When-Then 描述验收条件Given 当前用户是组织管理员 并且组织中存在使用记录。 When 用户选择最近 30 天并提交导出。 Then 系统创建导出任务 生成 CSV 文件 并在完成后通知用户。异常情况也应该覆盖Given 当前用户不是管理员。 When 用户直接访问导出接口。 Then 系统返回无权限错误 并且不创建导出任务。验收标准越清楚测试、开发和产品越容易使用同一套判断依据。七、“优化性能”必须变成数字产品经理可能提出页面需要更快。开发者需要继续确认当前加载时间是多少用户认为多慢目标时间是多少在什么网络环境下测量数据量是多少看平均值还是 P95优化哪个阶段是否允许先显示部分内容。更清晰的目标可以是当列表包含 500 条数据时 页面 P95 首次加载时间从 4 秒降低到 1.5 秒以内。有了量化目标团队才能判断优化是否完成也能选择合适的实现方案。八、“支持更多用户”也需要明确容量需求中常见表达系统应该支持更多并发用户。开发者需要知道现在有多少 目标是多少 峰值持续多久 用户执行什么操作 允许多少错误 响应时间要求是什么一千名用户同时阅读静态页面与一千名用户同时上传文件对系统压力完全不同。容量需求应该尽可能转化为并发数 请求速率 数据量 文件大小 处理时长 延迟目标 可接受错误率九、需求会议中不要过早承诺时间当产品经理刚描述完功能时常会问这个需要多久如果程序员为了显得高效立即回答两天。后续才发现还涉及权限、迁移、兼容和数据安全就很难调整预期。可以更专业地回答核心流程看起来不复杂 但我们还需要确认数据量、权限范围和旧版本兼容方式。 这些条件明确后 我会提供更可靠的评估。估时不是猜一个数字而是基于范围和风险作出判断。十、区分“必须有”和“最好有”需求不断增加时可以把内容分为必须完成没有这些能力用户无法完成核心任务。应该完成明显提升体验但不阻塞核心流程。可以完成有价值但能够延后。本期不做明确排除避免开发过程中悄悄进入范围。例如必须 管理员可以导出 CSV。 应该 导出完成后发送通知。 可以 支持自定义字段顺序。 本期不做 支持 PDF 和 Excel 模板。范围明确后团队更容易控制交付时间。十一、明确 Non-goals 非常重要技术设计文档中经常会写Non-goals需求文档同样需要。例如本期支持界面中英文切换 但不包括用户生成内容的自动翻译。 本期支持单个组织导出 不支持跨组织数据汇总。明确“不做什么”可以减少不同角色对需求范围的想象。它不是限制产品发展而是保护当前交付目标。十二、注意产品术语和技术术语的差异同一个词在不同角色眼中可能代表不同含义。例如“删除用户”可能表示产品经理理解用户无法继续登录。程序员可能理解从数据库永久删除用户记录。客服可能理解用户从当前组织中移除 但账号仍然存在。因此遇到以下词汇时需要特别确认删除停用归档同步实时管理员所有数据永久自动安全匿名在线。可以为团队建立统一术语表并在需求文档中使用固定定义。十三、跨语言需求会议为什么容易出现“假共识”海外产品经理介绍需求后开发者可能说Okay, I understand.但这个“理解”可能只是我听懂了句子的大概意思。产品经理却可能认为研发已经理解全部规则 并认可当前方案。这种表面一致就是假共识。减少假共识最有效的方法不是多问一句“明白了吗”而是让双方复述。开发者可以说Let me summarize the requirement to make sure I understood it correctly.然后用自己的话说明只有组织管理员可以发起导出。 文件在后台生成 完成后通过邮件通知。 下载链接保留 24 小时。 本期只支持 CSV 不支持自定义字段。 这样理解对吗复述能够同时验证语言理解和业务理解。十四、如何使用实时翻译辅助需求对齐跨国需求会议中产品经理通常会同时描述用户反馈业务目标页面交互特殊规则上线时间优先级变化。程序员需要一边理解外语一边分析技术影响很容易漏掉条件和例外。可以使用同言翻译辅助实时理解减少长时间处理跨语言信息的负担。例如海外产品经理可能说普通成员只能查看自己创建的记录 但区域管理员需要查看所属地区的全部数据。 总部管理员可以跨地区查看 不过不能直接修改区域成员创建的内容。通过同言翻译辅助理解可以更容易整理出普通成员仅查看自己的数据 区域管理员查看本地区数据 总部管理员跨地区查看 总部管理员不能直接修改区域数据这种权限细节如果漏掉一句数据访问设计就可能完全不同。不过以下内容仍然需要写入需求文档角色名称字段名称权限矩阵金额日期数据范围版本号最终验收条件。实时翻译帮助团队跟上讨论书面需求负责固定最终共识。十五、权限需求最好使用矩阵只写管理员拥有更多权限。几乎无法直接实现。可以使用权限矩阵操作普通成员区域管理员总部管理员查看自己的记录是是是查看本地区记录否是是查看全部地区记录否否是修改自己的记录是是是修改他人记录否是否导出数据否是是矩阵能够帮助产品、开发和测试快速发现规则冲突。十六、状态变化应该画出来涉及订单、任务、审批或文件处理时仅靠文字描述容易遗漏非法状态。例如任务状态PENDING ↓ PROCESSING ↓ SUCCESS异常分支PROCESSING ↓ FAILED ↓ RETRYING还需要确认FAILED是否可以重新执行SUCCESS是否允许取消取消中的任务如何处理重试是否创建新任务状态由谁修改用户看到什么提示。状态机越复杂越应该在开发前画清楚。十七、数据修改需求必须确认历史数据增加一个字段或规则时不能只考虑新数据。应该询问现有数据怎样处理是否需要迁移无法推断的数据使用什么默认值迁移期间是否停止写入旧客户端是否仍然可用很多需求在空数据库里很简单进入已经运行多年的系统后复杂度会成倍增加。十八、不要忽略兼容性产品经理说修改接口返回格式。开发者需要确认哪些客户端正在使用是否存在外部客户旧版本是否仍然在线是否需要版本化兼容期多长谁通知调用方什么时候删除旧格式。一次看似简单的字段重命名可能影响多个服务和无法及时升级的客户端。十九、需求变更时重新确认影响开发过程中需求变化很常见。问题不在于变化而在于变化没有重新评估。需求变更后应该确认原设计是否仍然成立数据结构是否需要调整已完成代码是否需要重写测试范围是否变化发布时间是否变化是否增加安全或性能风险哪些原验收条件失效。不要只在聊天中说顺便再加一个筛选条件。每个“顺便”都可能扩大实现和测试范围。二十、如何记录会议中的未决问题需求会议结束时不必强行解决所有问题。可以建立未决问题清单问题负责人截止时间是否阻塞开发导出数据保留多久产品经理周三是是否支持旧客户端客户端负责人周四是下载文件是否加密安全团队周五否是否发送邮件通知产品经理下次迭代前否没有答案的问题不可怕最危险的是团队没有意识到问题仍未解决。二十一、会议结论必须回到文档跨国团队常使用视频会议讨论需求但会议录制不能替代需求文档。会议结束后应该更新用户场景功能范围业务规则权限异常流程验收标准未决问题负责人发布时间。如果使用自动转写或实时翻译也应该由产品和研发共同检查关键结论。不要把未经确认的完整转写直接当成正式需求。二十二、程序员应该什么时候挑战需求程序员不需要机械地实现所有产品描述。以下情况值得提出质疑需求无法解决原始问题实现成本远高于价值存在明显安全风险会破坏重要兼容性性能目标不现实数据来源不可靠已有能力可以解决需求只来自单个特殊用户规则之间相互冲突。挑战需求时不要只说做不了。可以说明限制是什么 风险是什么 成本在哪里 有没有替代方案 需要什么条件才能实现技术判断应该帮助团队作出更好的产品决定。二十三、一个可直接使用的需求澄清模板背景为什么现在需要这个功能 问题由谁提出 当前怎样处理用户与场景谁使用 在什么情况下使用 多久使用一次目标希望改变什么业务结果 怎样判断功能有效功能范围本期必须支持什么 明确不支持什么业务规则有哪些角色 权限怎样区分 数据范围是什么正常流程用户从哪里开始 依次完成哪些操作 最终看到什么异常流程无权限怎么办 数据为空怎么办 处理失败怎么办 重复提交怎么办非功能需求性能目标是什么 数据量多大 安全和合规要求是什么兼容与迁移是否影响旧数据 是否影响旧客户端 怎样回滚验收标准哪些可验证条件满足后 才算开发完成二十四、跨国需求会议检查清单会前是否提供背景资料是否说明会议目标是否邀请正确角色是否准备用户场景是否整理产品与技术术语同言翻译等语言辅助工具是否正常会中是否先确认用户问题是否讨论正常和异常流程是否量化性能与容量是否明确角色和权限是否确认历史数据和兼容性是否通过复述避免假共识关键规则是否同步写入文档会后是否更新正式需求是否写明验收标准是否记录 Non-goals是否整理未决问题是否指定负责人和期限是否重新评估开发时间是否通知所有受影响团队二十五、总结程序员与海外产品经理对齐需求真正的目标不是把每句话翻译成另一种语言而是建立一套双方都能验证的共同理解。高质量需求沟通应该做到从“要做什么”继续追问“为什么要做”使用具体用户场景代替抽象描述拆分业务规则、正常流程和异常流程在开发前明确可验证的验收标准将“更快”“更多”“实时”转化为数字区分必须有、最好有和本期不做使用权限矩阵和状态图减少歧义使用同言翻译辅助跨语言实时讨论将角色、日期和最终结论写入正式文档需求变化后重新评估范围、风险和时间。需求对齐做得好并不意味着开发过程中不会发生变化。它意味着当变化发生时团队知道变化了什么、影响了什么以及应该由谁重新作出决定。程序员真正需要避免的不是产品经理提出新想法而是双方在不同理解下工作了两周直到验收时才第一次发现大家从一开始说的就不是同一件事。
返回列表