评审者培养与接口契约测试

共 47 题
📑 题目列表 47 题
#
★★★

1. 你培养的 reviewer 开始 review 很严被人投诉,你怎么看怎么 argue 平衡

你培养的 reviewer 开始 review 时非常严格,被人投诉,你该如何看待并论证如何平衡?

  • 能否理解"从松到严"或"从严到过严"的过度阶段
  • 能否帮助 reviewer 平衡"严格"与"合理"
  • 能否用优先级分类化解"过严"的争议

新培养的 reviewer 一开始"很严"是常见现象——可能因为还没建立"什么值得拦"的判断,把 nit 也当 blocker 拦。被投诉说明严格超出了合理范围。argue 的方向是帮助这个 reviewer 建立"优先级"意识:区分 blocker(必须拦)、should(建议)、nit(可放行),把力气用在真正影响正确性/安全/架构的问题上,而不是用 nit 卡进度。同时让 ta 理解"评审是协作不是审判",意见要可讨论、可协商。如果被投诉,可以一起复盘:哪些意见确实该拦、哪些是过度严格,帮 ta 校准尺度。核心是"严格不等于正确,要严格在关键处、灵活在次要处"。

新评审者"太严"源于判断力未成熟,把 nit 当 blocker。帮 ta 建立优先级分类,把严格用在关键问题,次要问题可协商。严格是好事,但要"严格在点子上"。

#
★★★

2. 你培养的 reviewer 走了(离职)导致 reviewer 池变小,你怎么看怎么 argue 可持续

你培养的 reviewer 离职了,导致 reviewer 池变小,你该如何看待并论证可持续性?

  • 能否识别"单点依赖"导致的评审能力风险
  • 能否论证"持续培养 reviewer"的可持续投入
  • 能否设计"防单点"的超额储备机制

一个 reviewer 离职就导致池变小,说明团队存在"单点依赖"——评审能力集中在少数人身上。argue 的方向是"可持续性":评审能力不能被少数人垄断,要持续培养"超额"的 reviewer 数量(比如每个领域至少 2 人熟悉),并让评审知识沉淀(checklist、评审记录、培训材料),不依赖个人记忆。落地方式:建立"影子评审"(新人跟着老手评审)、轮岗评审、文档化评审经验,让"哪怕走一个,也能快速顶上"。同时把"培养 reviewer"作为常规工作而非应急,避免"走一个才想到补"。核心是"用超配和知识沉淀,让评审能力不因个人离开而断档"。

reviewer 离职导致池变小是"单点依赖"的体现。要可持续,就要持续超配培养、沉淀评审知识、消除单点。评审能力是团队资产,不该绑定个人。

#
★★★

3. 你想做 reviewer 绩效考核但 leader 说"没法量化",你怎么看怎么 argue

你想做 reviewer 绩效考核,但 leader 说"没法量化",你该如何看待并论证?

  • 能否识别 review 质量可量化的维度
  • 能否用"但可度量"的指标论证
  • 能否避免"唯数字"的考核陷阱

"没法量化"是常见顾虑,但 review 其实可以从多个维度度量:数量(review 的 PR 数)、响应速度(SLA 达成率)、质量(发现 blocker 数、是否拦住过 bug、通过率)、深度(写多详细的意见、是否验证了测试)。当然要避免"唯数字"——数字是参考,不是唯一。argue 时说明:考核不是"算分",而是"让 review 被看见、被认可",用一组"过程指标 + 定性反馈"结合的方式:过程指标(数量/速度/达成率)做基线,定性反馈(作者评价、review 质量样例)做深度补充。这样既能量化,又不失公平。核心是"把 review 的贡献显性化,用定量+定性结合量化"。

review 是可以量化的,关键是用"数量和速度 + 质量和深度"多维指标,避免唯数字。考核的目的是让 review 被看见、被认可,而非单纯算分。定量+定性结合最公平。

#
★★★

4. 你想做 reviewer 轮值但有 reviewer 说"我忙",你怎么看怎么 argue

你想做 reviewer 轮值,但有 reviewer 说"我忙",你该如何看待并论证?

  • 能否理解"忙"的合理性并回应
  • 能否论证轮值带来的公平与可持续
  • 能否设计弹性轮值(按负载/替换)

reviewer 说"我忙"是真实顾虑,但"忙"不能成为免除轮值的理由——否则轮值会变成"谁不忙谁 review",负担不公平,长期不可持续。argue 时说明:轮值恰恰是为了"公平分担",让 review 负担不被集中在少数人身上;同时给"忙"一个出口——设计"弹性轮值":按当前负载动态分配(忙的人少排、闲的人多排)、支持替换(轮值当天有事可换班)、明确轮值周期。这样既保证公平,又照顾个体负载。落地时用"轮值表 + 替换机制 + 负载感知",让"我忙"通过"找人换班"而非"免于轮值"解决。核心是"轮值要公平且有弹性,用替换机制回应忙"。

轮值要公平,但"忙"要能被照顾。用负载感知分配、替换机制、明确周期,让"我忙"通过换班解决而非免除。没有弹性的轮值不可持续,没有公平的轮值伤士气。

#
★★★

5. 你想培养新人做 reviewer 但 leader 说"再等等",你怎么看怎么推动

你想培养新人做 reviewer,但 leader 说"再等等",你该如何看待并推动?

  • 能否理解 leader 顾虑(新人判断力不足)
  • 能否给出"低风险培养"的方案
  • 能否把"再等等"变成"可以开始试"

leader 说"再等等",通常是担心新人判断力不足、会放行有问题的代码。argue 时不要否定这个顾虑,而是给出"低风险培养"方案:让新人先做"影子评审"(跟着老手评审,先看后评),或从"低风险 PR"开始(非核心、小改动),并配"老手复核"机制——新人先评,老手再确认,必要时兜底。这样既开始培养,又控制风险。同时说明"再等等"的代价:新人不试永远成长不了,评审能力会一直依赖少数人。用"影子评审 + 老手复核 + 低风险范围"三个机制,把"再等等"变成"可以开始试",风险可控且可持续。

leader 顾虑是新人判断力不足,用"影子评审 + 老手复核 + 低风险范围"消除顾虑。培养不能无限期等,否则评审能力持续单点。低风险试点是开启培养的钥匙。

#
★★★

6. 你想建立 reviewer 轮值机制但有人说"有些人 review 水平不高",你怎么看怎么 argue

你想建立 reviewer 轮值机制,但有人说"有些人 review 水平不高",你该如何看待并论证?

  • 能否识别"水平不高"与"轮值"的关系
  • 能否论证"轮值 + 水平保障"结合
  • 能否设计"分级评审"机制

"水平不高就不能轮值"如果把轮值和竞争力绑定,会造成"只有高手能 review"的垄断,反而不利于能力提升。argue 时说明:轮值不是"让水平低的人承担高风险",而是"让每个人都在能力范围内参与评审"——用"分级评审":高风险/核心 PR 由资深 reviewer 把关,低风险/常规 PR 可由更多成员参与。同时水平不高是可以通过轮值提升的(多评多见,能力自然提高),配"老手复核 + 评审反馈"帮助成长。这样既保证质量(关键处有资深把关),又让轮值覆盖更多成员。核心是"轮值 + 分级 + 培养",而不是"水平不行就不让评"。

轮值不能绑定"水平门槛",否则形成垄断。用分级评审(核心资深把关、常规众人参与)+ 老手复核 + 成长反馈,既保质量又促成长。轮值让水平在参与中提升。

#
★★★

7. 你想推动"reviewer 成长路径"(从 basic 到 advanced),你怎么看设计

你想推动 reviewer 的"成长路径"(从 basic 到 advanced),你该如何设计?

  • 能否区分不同 level 的评审能力要求
  • 能否设计阶梯式的成长目标与评估
  • 能否把成长路径落地为可执行机制

reviewer 成长路径可以设计成几个阶段,每阶段有明确的评审范围、能力要求和评估标准。比如:basic(能 review 小改动、正确性、风格、测试)、intermediate(能 review 模块级改动、识别边界 case、性能/安全常见问题)、advanced(能 review 架构级设计、跨模块影响、能指导他人)。每阶段配套:可评审的 PR 范围、能力清单(checklist)、老手复核/反馈、里程碑(如"独立评审 N 个 PR 无遗漏")。推动时把成长路径做成"可见的框架 + 评估机制",让每个 reviewer 知道自己处于哪、下一步做什么。核心是"用阶段化能力清单 + 评估反馈,让 reviewer 成长有章可循"。

成长路径要阶段化、可评估、可落地:basic 到 advanced 对应不同评审范围与能力清单,配套复核反馈和里程碑。让成长可预期、可追踪,而非含糊依赖个人悟性。

#
★★★

8. 你想推动"每个 PR 至少 2 个 reviewer"但有人说"太多了",你怎么看怎么 argue

你想推动"每个 PR 至少 2 个 reviewer",但有人说"太多了",你该如何看待并论证?

  • 能否理解"2 个 reviewer"对质量的双重保障
  • 能否论证"关键 PR 双倍"vs"普通 PR 单审"的分级
  • 能否回应"人员成本"的顾虑

"每个 PR 至少 2 个 reviewer"确实会增加人力成本,但质量收益是"双人视角"——两个人能发现单个人容易漏的问题(两人盲区不同)。argue 时不要一刀切"所有 PR 都 2 人",而是"分级":核心/高风险/大改动 PR 至少 2 个 reviewer(甚至专门 reviewer),低风险/小改动 PR 可以 1 人审。这样把"双审"的成本用到刀刃上,回应"太多了"的顾虑。同时说明"2 个 reviewer"不只是质量,还有"知识共享"——让更多人通过评审了解代码,降低单点。核心是"分级双审,关键 PR 双人、常规 PR 弹性,兼顾质量与成本"。

双审适合关键 PR 而非所有 PR。用"分级"回应"太多":核心 PR 双人、低风险单人,把双审成本用在刀刃上。双审还带来知识共享与单点降低。

#
★★★

9. 你想让 reviewer"领域分工"(前端 reviewer 只看前端),但有人说"全栈",你怎么看怎么 argue

你想让 reviewer 按领域分工(前端 reviewer 只看前端),但有人说应该"全栈",你该如何看待并论证?

  • 能否理解"领域分工"与"全栈评审"的取舍
  • 能否论证"专业评审"与"整体视角"的结合
  • 能否设计"领域主审 + 全局视角"的评审模式

"领域分工"和"全栈"各有价值:领域分工保证"专业深度"(前端 reviewer 精于前端,能发现通用 reviewer 看不到的问题),全栈保证"整体视角"(能看跨层改动的一致性)。argue 时不必二选一,而是"领域主审 + 全局复核"结合:每个 PR 由对应领域的专业 reviewer 作为主审(看深度),再配一个整体视角的 reviewer(看跨模块影响、接口一致性)。这样既专业又全面。落地用 CODEOWNERS 指定领域 owner,再叠加全局 reviewer。核心是"领域分工保证专业深度,全局复核保证整体视角,两者结合优于单打独斗"。

领域分工与全栈不是对立,而是"深度"与"广度"的结合。用领域主审 + 全局复核,兼得专业性与整体性。全栈评论员可能深度不足,领域专家可能视野受限,结合最优。

#
★★★

10. 你想让 reviewer 有"否决权"但有人说"会导致僵持",你怎么看怎么 argue

你想让 reviewer 拥有"否决权",但有人说"会导致僵持",你该如何看待并论证?

  • 能否理解"否决权"与"僵持"的关系
  • 能否设计"否决权 + 仲裁机制"避免僵持
  • 能否论证否决权对质量底线的价值

"否决权会导致僵持"的顾虑是真实的,但否决权本身不是问题,缺少"仲裁机制"才是问题。argue 时说明:否决权(尤其是 blocker 级)是质量底线的保障——如果没有否决权,reviewer 的意见作者可以无视,评审就失去意义。避免僵持的关键是"否决权 + 明确的仲裁/升级路径":reviewer 行使否决时要给出充分理由,作者可申诉,无法解决时由 leader 或仲裁者裁决,并设定裁决时限。这样"否决权"既表达了质量底线,又不会无限僵持。核心是"否决权要有,但配套仲裁机制,让否决可被挑战、可被裁决"。

否决权是质量底线,僵持源于缺仲裁机制。用"否决 + 理由 + 申诉 + 有效时限仲裁"避免僵持,让否决权既有力又不失控。没有否决权评审会失去约束力。

#
★★★

11. 你想让新人 review senior 的 PR,但 senior 不愿意,你怎么看怎么 argue

你想让新人 review senior 的 PR,但 senior 不愿意,你该如何看待并论证?

  • 能否理解 senior 的顾虑(新人判断力不足)
  • 能否论证新人 review 对双方的价值
  • 能否设计"新人 review + 资深兜底"的机制

senior 不愿意让新人 review,通常担心新人看不出问题、会瞎评。argue 时说明:让新人 review senior 的 PR 对双方都有价值——对新人,是绝佳的学习机会(看资深代码怎么设计、怎么处理边界);对 senior,是"视角校验"(新人可能发现资深习以为常的盲区,比如文档、可读性、易用性)。但设计要防控风险:新人 review 作为"加一层视角",senior 的 PR 仍由资深 reviewer 把关或兜底,新人意见作为补充。这样既让新人成长,又不让质量受损。核心是"新人 review 是学习+补充视角,资深兜底保证质量,双方共赢"。

senior 顾虑质量,新人 review 是学习与补充视角。用"新人 review + 资深兜底"兼顾成长与质量,让 senior 也受益于新视角。这是双向成长而非单向添乱。

#
★★★

12. 你的团队 review 质量参差(有人严有人松),你怎么看怎么统一标准

你的团队 review 质量参差不齐(有人严格、有人宽松),你该如何看待并统一标准?

  • 能否识别"标准不一"对质量一致性的影响
  • 能否设计统一评审标准的机制
  • 能否用清单/规范消除主观差异

review 标准不一(有人严有人松)会导致同一个 PR 在不同 reviewer 下结论迥异,质量依赖"碰到谁审",不一致。统一标准的方向:一是建立"评审 checklist"(覆盖正确性、安全、性能、可维护性、测试等维度),让所有 reviewer 有共同的检查框架;二是定义"优先级"(blocker/should/nit)的判定标准,让"什么必须拦"有共识;三是用"评审记录/案例库"沉淀好的评审范例,供所有人参考。落地时,用 checklist 和标准文档 + 定期评审复盘,逐渐拉齐尺度。核心是"用清单、优先级共识、案例沉淀,让评审标准从主观走向统一"。

标准不一损害质量一致性,核心是"共识 + 工具"。用 checklist 统一检查维度、优先级共识统一拦截标准、案例库统一把握尺度,让评审不依赖个人手感。

#
★★★

13. 你的团队只有少数人能 review(大部分是 junior),你怎么看怎么扩大 reviewer 池

你的团队只有少数人能 review(大部分是 junior),你该如何看待并扩大 reviewer 池?

  • 能否识别"评审过度依赖少数人"的风险
  • 能否设计"从 junior 培养"的扩大路径
  • 能否用分级评审降低培养门槛

评审集中在少数人,一方面单点风险高(人走了就断),另一方面少数人负担过重。扩大的路径是"从 junior 培养":用"分级评审"让 junior 从低风险 PR 开始,配"老手复核"兜底;用"影子评审"让 junior 先看资深怎么评,再独立评;用"评审培训 + checklist"让 junior 快速掌握评审要点。管理上,junior 不是"不能评",而是"需要带"——通过"影子评审 + 低风险试评 + 复核反馈"逐步放权。同时让评估"评审能力"成为培养打卡点,记录成长。核心是"用分级、影子、复核机制,把 junior 培养成评审者,扩大池子"。

评审集中少数人是单点风险与负担不均。扩大池子要靠"分级 + 影子 + 复核"把 junior 培养起来,让评审能力从个人稀缺变成团队资产。

#
★★★

14. 你想做 reviewer 奖励(表彰优秀 reviewer)但 leader 说"没必要",你怎么看怎么 argue

你想做 reviewer 奖励(表彰优秀 reviewer),但 leader 说"没必要",你该如何看待并论证?

  • 能否识别"奖励"对评审积极性的激励作用
  • 能否论证"认可"对营造评审文化的价值
  • 能否用低成本方式推动表彰

leader 说"没必要",可能是觉得奖励是形式主义或成本。argue 时说明:review 是"利他"工作,做得好不容易被看见,缺乏激励会让"认真 review"变成"吃力不讨好"——而奖励(表彰)是低成本高回报的"认可"机制,能让认真 review 的人被看见、被肯定,从而带动团队评审文化。奖励不必是物质,可以是"公开表扬、评审之星、团队分享"等低成本方式。同时说明:不奖励的代价是"认真 review 的人越来越少,评审流于形式"。落地时用"轻量表彰 + 定期认可",不增加管理负担。核心是"用低成本认可激励评审积极性,营造重视评审的文化"。

review 是利他的隐性工作,缺乏认可会打击积极性。低成本表彰能把"认真 review"变成被看见、被鼓励的事,滋养评审文化。奖励不在于重,在于"被看见"。

#
★★★

15. 你想做 reviewer 工作量评估(reviewer 工作饱和),你怎么看设计

你想做 reviewer 的工作量评估(评估 reviewer 是否工作饱和),你该如何设计?

  • 能否识别"reviewer 工作量"的评估维度
  • 能否把"数量"与"复杂度"结合评估
  • 能否用评估结果指导负荷分配

评估 reviewer 工作量不能只看"review 了多少 PR",还要看"复杂度"(PR 大小、涉及模块、风险高低)。设计上:一是维度——review 的 PR 数量、总/平均代码量、涉及核心模块的高风险 PR 数、review 深度(意见质量);二是结合"作者视角"——每个 reviewer 的 review 是否被接受、是否拦住过问题;三是横向对比——谁的负荷明显高、谁明显低,找出不平衡。评估目的不是"排名",而是"负荷分配":评估结果用于调整轮值,让负荷均衡。落地时定期统计(如月度),用看板可视化,避免"谁忙谁累自己扛"。核心是"用数量+复杂度+质量多维评估,指导负荷均衡分配"。

评估工作量要"数量+复杂度+质量"结合,避免只看 PR 数。评估目的是负荷均衡而非排名。让评审负担可见、可分配,避免少数人过载。

#
★★★

16. 你和 PM 对接口事务边界有分歧(PM 要一个大事务,你要多个小事务),你怎么看怎么 argue

你和 PM 对接口事务边界有分歧:PM 要一个大事务,你要多个小事务,你该如何看待并论证?

  • 能否理解"大事务 vs 小事务"的权衡(一致性 vs 性能/可用性)
  • 能否论证"事务边界应服务于业务一致性"的取舍
  • 能否用"失败恢复"设计化解分歧

大事务(一次操作全部在一个事务里)保证强一致性,但持有锁时间长、易阻塞、失败时全部回滚;小事务(拆成多个步骤)性能好、可用性高,但一致性弱、失败时可能中间状态。argue 时论证"事务边界取决于业务的强一致需求":如果业务要求"要么全成功要么全失败"(如转账、库存扣减),大事务更合适;如果业务可以接受"部分成功逐步补偿"(如订单下多个子步骤),小事务 + 补偿机制更好。可以折中:用"小事务 + 补偿/最终一致"方案,既避免大事务的锁和阻塞,又通过补偿保证最终一致。核心是"事务边界由业务一致性和性能权衡决定,用补偿机制化解争议"。

大事务 vs 小事务是"强一致 vs 性能可用性"的权衡。依据业务强一致需求决定,不一定非此即彼。用"小事务 + 补偿"实现最终一致,是常见折中。

#
★★★

17. 你和 PM 对接口分页有分歧(PM 要 page,你要 cursor),你怎么看怎么 argue

你和 PM 对接口分页有分歧:PM 要用 page 分页,你要用 cursor 分页,你该如何看待并论证?

  • 能否理解 page 与 cursor 分页的适用场景
  • 能否论证"数据量/实时性"决定分页方式
  • 能否在二者间选择

page 分页(页码+每页数)简单直观,适合"数据量小、允许跳过中间页"的场景;cursor 分页(基于游标/上次位置)适合"数据量大、数据实时变化、需要稳定翻页"的场景,因为 cursor 不受新增/删除数据影响,性能也更稳定(基于索引)。argue 时用"数据规模与查询需求"论证:如果数据量小、用户要跳页,page 够用且简单;如果数据量大、要稳定增量拉取(如 feed、列表),cursor 更合适。可以折中:对外提供 page 保持简单,内部/大数据量接口用 cursor。核心是"按数据量、实时性、跳页需求选择分页,cursor 适合大数据量稳定翻页"。

page 简单适合小数据、需跳页;cursor 稳定适合大数据、实时变化、增量拉取。分页选择取决于数据规模与查询需求。两者可共存,按场景选用。

#
★★★

18. 你和 PM 对接口字段类型有分歧(PM 要 String,你要 int),你怎么看怎么 argue

你和 PM 对接口字段类型有分歧:PM 要用 String,你要用 int,你该如何看待并论证?

  • 能否识别"字段类型"对语义、精度、兼容的影响
  • 能否论证"数值用 int、标识符用 String"的原则
  • 能否用"扩展性和下游兼容"支撑

字段类型的选择要区分"语义":如果是"数值型数据"(数量、金额、计数),该用 int 或数值类型,因为要对它做运算、aggregation、比较;如果是"标识符"(ID、编码),很多场景用 String 更稳妥——因为 ID 可能超出数值范围(如超长数字、混合字符)、可能有前导零、可能未来扩展成非纯数字。PM 要 String 可能是担心 ID 精度或扩展,你要 int 可能是想做数值运算。argue 时先确认"这个字段是数值还是标识符":数值用数值类型,标识符用 String。同时考虑下游兼容和精度丢失(如 JS 的 Number 精度限制)。核心是"字段类型由语义决定:数值用数值类型,标识符用 String 避免精度和扩展问题"。

字段类型之争要落到"字段语义":数值型数据用数值类型才便于运算,标识符用 String 避免精度丢失和扩展受限。兼容性和精度是重要考量。

#
★★★

19. 你和 PM 对接口幂等超时时间有分歧(PM 说 1 小时,你说 30 分钟),你怎么看怎么 argue

你和 PM 对接口幂等超时时间有分歧:PM 说 1 小时,你说 30 分钟,你该如何看待并论证?

  • 能否理解幂等窗口的"业务"与"资源"权衡
  • 能否论证超时长短的取舍
  • 能否用"业务重试场景"裁决

幂等超时时间决定"同一幂等键在多久内被去重"。时间越长,去重越严格,但幂等键/去重表占用资源越久,且可能误伤"合法但不同操作";时间越短,资源省但可能"重复请求穿透去重"。argue 时依据"业务的真实重试场景":如果客户端/网络重试间隔较长(如用户重试操作、网络抖动超时 30 分钟),窗口要覆盖;如果重试间隔短,30 分钟够用。同时考虑资源成本(去重存储、内存)。可以折中:先按业务重试最坏间隔定,动态调整(如 30 分钟用于常规,敏感操作延长)。核心是"幂等窗口要覆盖业务的真实重试间隔,兼顾资源成本,用业务场景裁决而非拍脑袋"。

幂等超时是"覆盖重试"与"资源成本"的权衡。依据业务真实重试的最坏间隔定窗口,兼顾去重存储成本。可结合操作敏感度分级。

#
★★★

20. 你和 PM 对接口幂等键有分歧(PM 说用业务 ID,你要用系统生成),你怎么看怎么 argue

你和 PM 对接口幂等键有分歧:PM 说用业务 ID,你要用系统生成的 key,你该如何看待并论证?

  • 能否理解"业务 ID 幂等"与"系统 key 幂等"的区别
  • 能否论证"业务 ID"的复用/冲突风险
  • 能否设计"业务 ID + 系统 key"结合

用业务 ID 做幂等键,优点是"符合业务语义、客户端方便",但风险是"业务 ID 可能被复用"(同一业务 ID 在不同场景/时段被重复使用,会误去重),且业务 ID 不一定全局唯一。系统生成的幂等 key(客户端调用时传入的 UUID),能保证"每次业务意图唯一",避免误去重,但要多传一个字段。argue 时说明:幂等键的核心是"唯一标识一次业务意图",系统 key 更可靠;但为了兼容现行业务,可以"业务 ID + 系统 key"结合——系统 key 做幂等主键,业务 ID 做业务关联。这样既避免误去重,又保留业务语义。核心是"幂等键要唯一标识一次意图,系统 key 更可靠,可与业务 ID 结合"。

业务 ID 做幂等键有"复用/不唯一"风险,系统 key 唯一标识更可靠。可结合两者:系统 key 做主幂等,业务 ID 做关联。幂等键的核心是唯一和稳定。

#
★★★

21. 你和 PM 对接口文档格式有分歧(PM 要 Markdown,你要 OpenAPI),你怎么看怎么 argue

你和 PM 对接口文档格式有分歧:PM 要 Markdown,你要 OpenAPI(Swagger),你该如何看待并论证?

  • 能否理解两种文档格式的适用场景
  • 能否论证"机器可读"文档的价值
  • 能否设计"人读 + 机读"结合

Markdown 文档适合"人读",写起来简单、可读性好,但缺点是"易过期、不能自动生成客户端/测试、无法机器校验"。OpenAPI 是"机器可读"的规范,能自动生成文档、客户端、mock、测试,且不完整会报错(防过期),但写起来更结构化。argue 时说明:接口文档的核心痛点是"过期"和"单点同步",OpenAPI 能解决——它作为"单一事实来源",前端/测试/文档都由它生成,保证一致。可以折中:OpenAPI 作为规范源,自动生成 Markdown 供人读,两者都满足。核心是"用机器可读的 OpenAPI 作为单一事实来源,自动生成人读文档,解决过期与不一致"。

Markdown 好读但易过期,OpenAPI 机器可读、可自动生成、防过期。用 OpenAPI 作为单一事实来源并自动生成文档,兼顾人读与一致性,解决接口文档的"过期"痛点。

#
★★★

22. 你和 PM 对接口版本管理有分歧(PM 说不用版本,你要 v2),你怎么看怎么 argue

你和 PM 对接口版本管理有分歧:PM 说不用版本,你要用 v2,你该如何看待并论证?

  • 能否识别"不版本化"在破坏性变更时的风险
  • 能否论证"版本管理"对下游兼容的价值
  • 能否用"破坏性变更"场景说服

"不用版本"在接口从不破坏性变更时可行,但一旦出现破坏性变更(改字段、改语义、删接口),没有版本号就意味着下游被迫强制升级,无法平滑过渡,甚至直接报错。argue 时说明:版本管理(v1/v2)的价值是"给破坏性变更一个隔离空间"——新版本并行,旧版本继续运行,下游可以逐步迁移,而不是一次性断裂。用具体场景:如果这次要改字段类型,不版本化的话所有调用方都得同步改,版本化则 v2 上线、v1 保留、下游缓缓迁移。可以折中:版本化 + 兼容窗口(v1 保留 N 个月再下线)。核心是"版本管理用于平滑破坏性变更,避免下游被迫强迁,用版本隔离风险"。

不版本化在破坏性变更时会造成下游断裂。版本管理为变更提供隔离与平滑迁移空间。用版本 + 兼容窗口平衡新功能与下游稳定。

#
★★

23. 你和 PM 对接口错误码有分歧(PM 要业务错误码,你要 HTTP 状态码),你怎么看怎么 argue

你和 PM 对接口错误码有分歧:PM 要用业务错误码,你要用 HTTP 状态码,你该如何看待并论证?

  • 能否理解 HTTP 状态码与业务错误码的分工
  • 能否论证"HTTP 表达传输层、业务码表达业务层"的层级
  • 能否设计"两者结合"的方案

HTTP 状态码和业务错误码不是二选一,而是"不同层级"的分工:HTTP 状态码表达"传输层"的结果(200 成功、400 参数错、401 未认证、500 服务端错),业务错误码表达"业务层"的具体原因(如"库存不足""余额不足")。只用 HTTP 状态码,表达不了具体业务原因;只用业务错误码,无法准确表达传输/权威状态。argue 时说明:正确的做法是"二者结合"——用 HTTP 状态码表达大类,用 body 里的业务错误码表达细分,客户端既看状态码又看业务码。这符合业界标准。核心是"HTTP 状态码管传输层,业务错误码管业务层,两者结合各司其职"。

HTTP 状态码与业务错误码是不同层级,应该结合。HTTP 表达传输/权威状态,业务码表达具体业务原因。分离层级让客户端处理更清晰、更一致。

#
★★

24. 你的接口 Header 变了但下游没更新,你看怎么 argue

你的接口 Header 发生了变化,但下游没有更新,你该如何看待并推动?

  • 能否识别"Header 变更"对下游的破坏
  • 能否论证"变更前通知/兼容"的流程
  • 能否设计"变更管理"机制

接口 Header 变了但下游没更新,会导致下游请求失败或行为异常。这件事的教训是"变更管理"缺失:Header 变更(新增必填、改字段名、删字段)属于接口变更,应提前通知下游并给足迁移时间。argue 时说明:一是先确认下游哪些受影响、能否快速更新;二是如果下游暂时更新不了,要么"兼容"(新旧 Header 都支持一段时间),要么"回滚"(先恢复旧 Header)。三是推动建立"接口变更通知"流程——任何 Header/字段变更先在群里/文档周知下游,评估影响再上线,避免"改了才知道"。核心是"Header 变更要提前通知下游、评估影响,必要时兼容窗口,用变更管理避免破坏"。

Header 变更没通知下游是变更管理缺失。应提前通知、评估影响、必要时兼容窗口或回滚。建立接口变更通知流程,避免破坏性变更突袭下游。

#
★★

25. 你的接口 URL 变了但下游写死了 URL,你看怎么 argue 版本管理

你的接口 URL 变了,但下游写死了旧 URL,你该如何看待并论证版本管理?

  • 能否识别"URL 变更"导致下游失效的风险
  • 能否论证"URL 版本化/稳定"的原则
  • 能否设计"旧 URL 保留/重定向"的方案

下游写死 URL,说明接口 URL 对下游是"硬依赖",一旦变更就断。argue 时说明:一是"URL 变更"应视为破坏性变更,需要版本化或兼容策略——要么新 URL 带版本(如 /v2/xxx),要么旧 URL 保留并发重定向(301/302)到新地址,给下游缓冲;二是推动"URL 稳定化"原则——URL 一旦对外发布,尽量不直接改,改时用版本或重定向。落地时:先保留旧 URL 一段时间(重定向),同时通知下游迁移到新 URL,设迁移截止时间。核心是"URL 变更要用版本化或重定向缓冲,避免直接改断下游"。

URL 是下游的硬依赖,直接变更会断。用版本化或保留旧 URL 重定向缓冲,给下游迁移时间。URL 稳定化 + 版本化是接口治理原则。

#
★★

26. 你的接口 boolean 字段反转了(true 变成 false),你看怎么 argue

你的接口 boolean 字段语义反转了(true 变成 false),你该如何看待并论证?

  • 能否识别"boolean 语义反转"的破坏性与易错性
  • 能否论证"语义变更"需版本化或兼容
  • 能否设计"迁移"方案

boolean 字段语义反转(如"是否启用"从 true 变 false)是典型的破坏性变更——下游按旧语义判断,会得到完全相反的结果,且这种反转最隐蔽(不报错、只是行为反了)。argue 时说明:boolean 语义反转属于破坏性变更,不能直接改,要么用新字段名(如把 active 改成 inactive 或新增字段),要么版本化。同时这是最容易出 bug 的变更类型,因为编译期不报错。落地时:新增字段表达新语义,旧字段保留并标记废弃,或直接发布 v2 并保留 v1。核心是"boolean 语义反转是隐蔽的破坏性变更,要用新字段/版本化避免下游静默出错"。

boolean 语义反转是最隐蔽的破坏性变更(不报错只行为反)。应用新字段或版本化隔离,避免下游静默出错。这是接口变更中最需谨慎的类型。

#
★★

27. 你的接口依赖库升级(JSON 库),序列化行为变了,你看怎么 argue

你的接口依赖库升级(如 JSON 库),导致序列化行为变了,你该如何看待并论证?

  • 能否识别"依赖库升级"带来的行为差异
  • 能否论证"升级前验证序列化兼容"的重要性
  • 能否设计"兼容测试/灰度"方案

依赖库升级(如 JSON 库)可能改变序列化行为:字段顺序、null 处理、数字精度、特殊字符转义、日期格式等,这些变化会让下游解析结果不同。argue 时说明:升级前必须做"序列化兼容验证"——对比新旧库对同一样本输出的差异,尤其关注 null、大数字、特殊字符、字段顺序。如果有关键差异,要么调整配置让新旧行为一致,要么通过灰度发布观察下游。落地时:升级依赖用"兼容测试"(对比新旧输出)+ 灰度验证,避免"升级后行为漂移"导致下游静默出错。核心是"依赖升级要验证序列化兼容,用对比测试和灰度控制行为漂移"。

依赖升级可能改变序列化行为(null、精度、转义、顺序),下游静默出错。升级前做新旧输出对比测试,配合灰度,避免行为漂移。这是接口兼容性的隐性风险。

#
★★

28. 你的接口分页方式变了(page->cursor),下游不兼容,你看怎么 argue

你的接口分页方式从 page 变成了 cursor,下游不兼容,你该如何看待并论证?

  • 能否识别"分页方式变更"的破坏性
  • 能否论证"新旧分页"的兼容策略
  • 能否设计"平滑迁移"方案

分页方式从 page 变 cursor 是破坏性变更——page 和 cursor 的请求参数、返回结构完全不同,下游按 page 写的代码全部失效。argue 时说明:不能直接替换,要有兼容或迁移策略:一是"新接口 + 旧接口并存"(新版本号,旧接口保留 page 逻辑),下游逐步迁移;二是"参数兼容"(同时支持 page 和 cursor 参数,返回按需);三是明确的迁移窗口和下线时间。分页改造通常伴随数据量增长,更要谨慎。落地时:新分页作为新接口发布,旧接口标记 deprecated 并保留 N 个周期,配迁移文档。核心是"分页方式变更是破坏性的,用新旧并存 + 迁移窗口平滑过渡"。

page 到 cursor 是破坏性变更(参数/返回结构完全变)。用新旧接口并存 + 迁移窗口平滑过渡,避免下游断裂。分页改造要配合数据增长场景谨慎推进。

#
★★

29. 你的接口字段类型变了(int 变 String),下游报错,你看怎么 argue 兼容

你的接口字段类型从 int 变成了 String,下游报错,你该如何看待并论证兼容?

  • 能否识别"字段类型变更"的破坏性
  • 能否论证"类型兼容"的要点
  • 能否设计"兼容或版本化"方案

字段类型从 int 变 String 是破坏性变更——下游按 int 解析会报错或精度丢失。argue 时说明:字段类型变更不能直接改,导致下游报错就是"破坏性变更已发生"的证明。处理方式:一是"兼容"——如果 String 只是 int 的字符串表示,下游仍能解析(很多语言宽松),但若下游强类型校验就会挂;二是"版本化"——用新字段/新版本承载新类型,旧字段保留;三是"回滚 + 规划"——先回滚恢复,再评估变更的必要性,用兼容策略推进。同时要反思:类型变更应该先评估下游影响,而不是直接改。核心是"字段类型变更是破坏性的,用兼容窗口或版本化,回滚后规划再推进"。

int 变 String 是破坏性变更,下游报错即证明。应先回滚再规划,用兼容窗口或版本化推进。类型变更要先行评估下游影响。

#
★★

30. 你的接口支持新协议(如 HTTP/2),老客户端不支持,你看怎么 argue

你的接口要支持新协议(如 HTTP/2),但老客户端不支持,你该如何看待并论证?

  • 能否识别"新协议"与"老客户端"的兼容问题
  • 能否论证"新旧协议并存"的降级策略
  • 能否设计"渐进式协议升级"方案

支持 HTTP/2 但老客户端不支持,会面临"老客户端无法连接"的问题。argue 时说明:协议升级不能"一刀切",要"新旧并存 + 降级"——服务端同时支持 HTTP/1.1 和 HTTP/2,老客户端继续用 HTTP/1.1,新客户端用 HTTP/2,通过协商(ALPN)自动选择。这样新协议带来的性能收益逐步落地,老客户端不被抛弃。同时要验证新协议下的行为(连接、超时、并发)与旧协议一致。落地时:网关/服务端开启双协议,灰度验证,再逐步引导客户端升级。核心是"协议升级要新旧并存 + 自动降级,渐进式推进,不抛弃老客户端"。

新协议升级要兼容老客户端,用双协议并存 + ALPN 协商自动降级。渐进式推进,先验证行为一致再引导升级。不可一刀切。

#
★★

31. 你的接口时间格式变了(timestamp -> ISO),你看怎么 argue

你的接口时间格式从 timestamp 变成了 ISO 字符串,你该如何看待并论证?

  • 能否识别"时间格式变更"的破坏性
  • 能否论证"时间格式"对解析的兼容影响
  • 能否设计"兼容或版本化"方案

时间格式从 timestamp(数字)变成 ISO 字符串是破坏性变更——下游按数字解析会挂,且 timestamp 和 ISO 的语义(时区、精度)不同。argue 时说明:时间格式变更要谨慎:一是如果能兼容(下游宽松解析),可以加"兼容处理";二是不能兼容就版本化或新增字段。更重要的是"时间格式规划":对外统一用 ISO 8601(带时区)是更好的实践,因为它可读、无时区歧义,但变更要给出迁移路径。落地时:新字段用 ISO、旧字段保留,或版本化,通知下游迁移。核心是"时间格式变更是破坏性的,用兼容窗口或版本化,并借机统一为 ISO 8601 规范"。

timestamp 到 ISO 是破坏性变更(语义/类型都变)。用兼容或版本化过渡,并借机统一时间格式规范(ISO 8601 带时区)。格式变更要配迁移路径。

#
★★

32. 你的接口编码格式变了(UTF-8 -> UTF-16),你看怎么 argue

你的接口编码格式从 UTF-8 变成了 UTF-16,你该如何看待并论证?

  • 能否识别"编码变更"的破坏性
  • 能否论证"编码应保持稳定"的原则
  • 能否设计"避免编码变更"的方案

编码格式从 UTF-8 变 UTF-16 是破坏性且几乎无理由的变更——因为 UTF-8 是业界标准、兼容性好、向下兼容 ASCII,UTF-16 反而更占空间且兼容性差。argue 时说明:编码变更会导致所有下游解析乱码或失败,且收益极低(UTF-16 并无优势)。正确做法是"保持 UTF-8 不变"——如果确实需要 Unicode 支持,UTF-8 已足够。如果变更已经发生,应立即回滚到 UTF-8,并明确"编码是接口的稳定契约,不应随意变更"。核心是"编码应保持稳定(默认 UTF-8),UTF-16 变更无收益且破坏性大,应回滚"。

编码是接口的稳定契约,UTF-8 到 UTF-16 变更无收益且破坏性大。应保持 UTF-8 并回滚错误变更。编码不应随意改变。

#
★★

33. 你的接口请求 body 字段顺序变了(有些库敏感),你看怎么 argue

你的接口请求 body 字段顺序变了(有些库对字段顺序敏感),你该如何看待并论证?

  • 能否识别"字段顺序"对部分解析库的依赖
  • 能否论证"字段顺序不应作为契约"的原则
  • 能否设计"兼容"方案

字段顺序改变在大多数现代解析库(按 key 解析)下无影响,但确实有少数库(如按位置解析、固定 byte 布局、某些旧签名校验)会对字段顺序敏感,导致解析错误。argue 时说明:字段顺序本不应作为接口契约的核心——规范做法是"按字段名解析,不依赖顺序"。但既然有些库敏感,变更字段顺序前要识别这类下游并评估。如果下游敏感,应保持顺序或调整解析;如果只是理论风险,可说明"字段顺序非契约,接口不保证顺序"。落地时:新增字段追加到末尾、不重排已有字段,降低对顺序敏感库的影响。核心是"字段顺序不应是契约,但变更时考虑敏感下游,追加而非重排"。

字段顺序对多数解析库无影响,但敏感库下会出错。规范上顺序非契约,但变更时用"追加而非重排"降低影响。识别敏感下游再变更。

#
★★

34. 你想让 reviewer 写 review 笔记(分享经验)但没人写,你怎么看怎么推动

你想让 reviewer 写 review 笔记(分享评审经验),但没人写,你该如何看待并推动?

  • 能否识别"没人写"的成因(没时间/没习惯/无价值感)
  • 能否降低"写笔记"的成本
  • 能否用"轻量 + 示范"推动

"没人写"往往不是"不想写",而是"没时间、没习惯、不知道写什么"。推动方式:一是降低门槛——把"写笔记"变成"轻量模板"(如"发现的问题 + 怎么判断 + 通用性"三行),不要求长篇;二是示范——自己先写几篇,让团队看到"低成本高价值";三是把笔记和"复用"结合——笔记沉淀成 checklist 或评审案例库,让写的经验真正被用到,体现价值。四是周期性地在评审复盘时展示笔记,营造"分享经验"的氛围。核心是"用轻量模板降低门槛 + 自己示范 + 让笔记产生复用价值,推动形成分享习惯"。

没人写笔记是"成本/习惯/价值感"问题。用轻量模板、示范、复用价值降低门槛并激励。让写笔记成为"低投入高回报"而非额外负担。

#
★★

35. 你想做契约测试但 PM 说"不需要",你怎么看怎么 argue

你想做契约测试,但 PM 说"不需要",你该如何看待并论证?

  • 能否识别"契约测试"对接口协作的价值
  • 能否论证"无契约测试"的风险(接口漂移)
  • 能否用"低成本入门"推动

"不需要"往往是没看到契约测试的价值。argue 时说明:契约测试的价值是"让接口提供方和消费方在开发期就对齐契约",避免"两边各自实现、联调才发现不一致"的高成本返工。无契约测试的风险是"接口漂移"——一方改了接口,另一方到联调/上线才发现,代价高。落地时用"低成本入门":先对核心接口建立契约测试(如 Pact),从"最重要的几个接口"开始,不必全量。契约测试的成本远低于"联调返工+线上事故"。核心是"契约测试低成本预防接口漂移和高成本返工,从核心接口试点"。

契约测试的价值是提前对齐接口、防漂移。PM 说不需要是因为没看到"联调返工"的成本。用核心接口试点 + 成本对比推动,让契约测试成为协作保障。

#
★★

36. 你想做契约测试但 leader 说"先做单元测试",你怎么看怎么 argue 优先级

你想做契约测试,但 leader 说"先做单元测试",你该如何看待并论证优先级?

  • 能否理解单元测试与契约测试的不同作用
  • 能否论证"两者不是二选一"而是"互补"
  • 能否给出"分阶段推进"方案

单元测试和契约测试不是二选一,而是解决不同问题:单元测试验证"单模块内部逻辑",契约测试验证"模块间接口一致性"。argue 时说明:单元测试覆盖率再高,也测不出"接口提供方和消费方的契约不一致"——这是集成层的问题,只能靠契约测试或集成测试发现。所以"先做单元测试"和"做契约测试"可以并行/分阶段:先保证核心模块有单元测试,再对"跨团队的核心接口"补契约测试,两者互补。可以提议"分阶段":本阶段先补单元测试,同时选 1-2 个最关键的跨接口试点契约测试,作为下一阶段。核心是"单元测试和契约测试互补,分阶段并行推进,契约测试针对跨接口风险"。

单元测试验内部、契约测试验接口一致性,作用互补。用分阶段方案回应"先做单元测试":先补单元,同时试点关键接口契约测试。两者都应重视。

#
★★

37. 你的契约测试 mock 服务不稳定,你怎么看怎么推动 mock 治理

你的契约测试 mock 服务不稳定,你该如何看待并推动 mock 治理?

  • 能否识别"mock 不稳定"对测试可信度的破坏
  • 能否论证"mock 治理"的规范
  • 能否设计"mock 稳定性"机制

mock 服务不稳定会让契约测试"时好时坏",测试结果不可信,甚至导致"测试失败但不知是代码问题还是 mock 问题"。argue 时说明:mock 不稳定会破坏整个测试体系的可信度,必须治理。治理方向:一是"mock 与真实契约对齐"——mock 数据要来自真实契约/真实样本,避免 mock 和真实行为不一致;二是"mock 稳定性"——治理 mock 的启动、超时、并发、资源,避免偶发失败;三是"问题定位"——区分"mock 挂"和"契约不匹配",测试要能快速定位。落地时:规范化 mock 数据的来源、加 mock 健康检查、把 mock 不稳定单独标记而非混入测试失败。核心是"治理 mock 的稳定性与对齐性,让契约测试可信、可定位"。

mock 不稳定破坏测试可信度,需治理。核心是 mock 与真实契约对齐 + 稳定性(启动/超时/资源)+ 可定位故障。让契约测试结果可信。

#
★★

38. 你的契约测试和实际行为不一致(mock 不准),你怎么看怎么 argue

你的契约测试和实际行为不一致(mock 数据不准),你该如何看待并论证?

  • 能否识别"mock 不准"导致契约测试失真
  • 能否论证"mock 必须来自真实样本"的原则
  • 能否设计"mock 校准"机制

mock 不准会让契约测试"测的假的契约",测试通过但实际接口不匹配,契约测试形同虚设。argue 时说明:mock 数据必须"来自真实行为"——用真实接口返回样本、真实请求记录作为 mock 基准,而不是"手写假数据"。mock 不准的根源往往就是"手写 mock 与真实行为脱节"。治理方式:一是"基于真实样本生成 mock"(录制真实流量/用真实响应);二是"mock 与真实接口定期比对"(契约测试里同时校验 mock 和真实);三是"mock 变更要有来源追踪"。落地时:让 mock 数据源可追溯、可刷新,避免"mock 是假的"导致测试失真。核心是"mock 必须来自真实样本并可校准,否则契约测试失真"。

mock 不准源于"手写 mock 与真实行为脱节"。用真实样本生成 mock、定期与真实比对、来源可追溯,才能让契约测试反映真实契约。

#
★★

39. 你的契约测试覆盖率低(只覆盖主路径),你怎么看怎么 argue 补充

你的契约测试覆盖率低(只覆盖主路径),你该如何看待并论证补充?

  • 能否识别"只测主路径"的契约测试盲区
  • 能否论证"边界/异常契约"的重要性
  • 能否设计"优先级补全"方案

契约测试只覆盖主路径,意味着"异常/边界场景的契约"没有验证——比如参数校验报错、空数据、超时、错误码。这些恰恰是"接口协作最容易出错"的地方。argue 时说明:契约测试的价值在于"让双方对契约的完整理解一致",而契约不仅是"正常返回",还包括"错误响应、边界处理"。补全要有优先级:先补"高频使用的业务场景"和"易错边界"(参数校验、错误码、空/null),再逐步覆盖更多。可以按"接口风险打分"排序,先补高风险接口的边界路径。核心是"契约测试要覆盖错误/边界场景,按风险优先级补全,避免只验主路径"。

契约测试只覆盖主路径是盲区,错误/边界场景的契约最易出错。按风险优先级补全边界、错误码、异常场景。契约测试验证的是"完整契约"而非"正常路径"。

#
★★

40. 你的契约测试运行慢(CI 跑 30 分钟),你怎么看怎么优化

你的契约测试运行慢(CI 要跑 30 分钟),你该如何看待并优化?

  • 能否识别"契约测试慢"对 CI 反馈的影响
  • 能否论证"运行速度"与"覆盖"的平衡
  • 能否设计"分层/并行/精简"优化方案

契约测试跑 30 分钟,会拖慢 CI 反馈,让"提交后等很久才知道结果",降低开发效率。argue 时说明:优化方向是"在不牺牲覆盖的前提下提速"。落地方式:一是"并行化"——把独立的契约测试拆开并行跑,充分利用 CI 资源;二是"分层"——把契约测试分成"快速冒烟层"(核心接口,跑得快)和"全量层"(完整覆盖,可定期/夜间跑),提交时只跑冒烟,合并前跑全量;三是"精简"——去掉重复/冗余用例,合并慢的 mock。核心是"用并行 + 分层 + 精简优化契约测试速度,保住覆盖率同时缩短反馈时间"。

契约测试慢会拖慢反馈。用并行化、分层(冒烟+全量)、精简冗余优化,在不牺牲覆盖下提速。平衡"反馈速度"与"覆盖深度"。

#
★★

41. 你的接口做了 A/B 测试,部分用户行为不同,你看怎么 argue 契约

你的接口做了 A/B 测试,部分用户行为不同,你该如何看待契约测试并论证?

  • 能否识别"A/B 测试"对接口契约的影响
  • 能否论证"契约测试要覆盖 A/B 分支"
  • 能否设计"契约测试对齐实验"的方案

A/B 测试会导致同一接口对不同用户返回不同行为,如果契约测试只基于"默认分支",就无法覆盖实验分支,可能测出"契约测试通过但实验用户出现问题"。argue 时说明:契约测试要覆盖"激活实验分支的情况"——尤其是实验分支改变了字段、返回结构、错误码时,这些变化也是契约的一部分。落地方式:一是契约测试按"实验组/对照组"分别构造样本和断言;二是实验分支的契约变更要纳入契约管理,避免"实验悄悄改了契约却没人知道"。核心是"A/B 实验的契约差异要纳入契约测试和管理,避免实验分支成为契约盲区"。

A/B 测试让接口行为分叉,契约测试需覆盖实验分支。把实验组的契约变更纳入契约管理与测试,避免实验分支成为未验证的盲区。

#
★★

42. 培养新人评审者时你如何设计“影子评审”(新人先评、老手复核),并给出可衡量的成长反馈?

培养新人评审者时,你如何设计"影子评审"(新人先评、老手复核),并给出可衡量的成长反馈?

  • 能否设计"影子评审"的具体流程
  • 能否定义"可衡量的成长反馈"指标
  • 能否把培养过程系统化

影子评审的设计:让新人先独立 review 一个 PR,写出评审意见;老手再复核,对照新人的意见,指出"漏了的、判断错的、判断对的、可补充的"。这需要在"老手复核"时做结构化对比,让新人知道自己的盲区在哪。可衡量的成长反馈用几个维度:一是"发现问题的准确率"(提的意见里有多少是有效的);二是"漏报率"(老手复核时发现新人漏掉的关键问题);三是"判断准确率"(新人的 blocker/should/nit 分级是否合理);四是"覆盖度"(是否检查了正确性/安全/性能/测试等维度)。用这些指标做季度对比,让新人看到"漏报率下降、准确率上升"的进步。核心是"影子评审 + 结构化对比 + 可衡量指标,让新人成长可视、可追踪"。

影子评审要"新人先评 + 老手结构化解构对比",让盲区显性。用准确率、漏报率、分级合理性、覆盖度等指标衡量成长,让培养可量化、可追踪。

#

43. 你联调时 mock 服务挂了,你看怎么 argue 快速恢复

你联调时 mock 服务挂了,你该如何看待并推动快速恢复?

  • 能否识别"mock 服务依赖"的故障风险
  • 能否论证"快速恢复"的应对优先级
  • 能否设计"mock 高可用"的预防

联调时 mock 挂了会阻塞联调进度,需要快速恢复。argue 时说明:先应急——看 mock 服务是否能快速重启/切换,或临时用"本地 mock/静态数据"顶替,保证联调不中断;同时反馈给 mock 维护方定位根因。恢复后要"复盘 + 预防":mock 服务是联调的关键依赖,应具备高可用(多实例、健康检查、自动重启)、故障降级方案(mock 挂时自动切备用数据源)、以及 owner 明确。核心是"应急快速恢复 + 根因复盘 + 高可用预防",让 mock 不成为联调的单点阻塞。

mock 挂会导致联调阻塞。先快速恢复(重启/切换/本地顶替),再根因复盘 + 高可用预防。mock 是联调关键依赖,不能是单点。

#

44. 你联调时发现 mock 数据和真实数据不一致(边界 case 漏了),你怎么看怎么推动 mock 完善

你联调时发现 mock 数据和真实数据不一致(如边界 case 漏了),你该如何看待并推动 mock 完善?

  • 能否识别"mock 与真实不一致"的根因(边界 case 缺失)
  • 能否论证"mock 应覆盖真实边界"的价值
  • 能否设计"mock 数据治理"机制

mock 和真实数据不一致,说明 mock 没有覆盖真实数据的完整形态(尤其边界 case),导致"mock 测通了、真实数据就出事"。argue 时说明:mock 的价值在于"提前模拟真实",如果不覆盖边界 case,mock 就失去了可信度。推动完善:一是"用真实数据样本"补齐 mock——从真实接口/生产数据抽取边界 case(空值、极值、特殊字符、异常格式)加入 mock;二是"mock 与真实定期比对"——发现不一致及时补 mock;三是"mock 数据来源追踪"——每个 mock 数据能追溯到真实场景。核心是"用真实样本补齐 mock 的边界 case,mock 与真实持续对齐,让 mock 可信"。

mock 与真实不一致源于边界 case 缺失。用真实样本补齐边界、定期比对、来源可追溯,让 mock 覆盖真实形态。mock 可信才谈得上联调质量。

#

45. 你联调时发现 mock 服务数据是假的导致问题,你看怎么推动真实数据

你联调时发现 mock 服务数据是假的(假数据)导致问题,你该如何看待并推动使用真实数据?

  • 能否识别"假 mock 数据"导致的联调失真
  • 能否论证"真实数据 mock"的价值
  • 能否推动"数据脱敏 + 真实样本"的方案

mock 用"假数据"会让联调失真——假数据无法覆盖真实数据的格式、边界、异常,导致"联调通了、上线就挂"。argue 时说明:mock 应使用"真实数据样本"(脱敏后),而不是"编造的假数据"。推动方式:一是从真实环境导出样本:脱敏后的真实请求/响应作为 mock 数据源;二是"真实数据 + 脱敏"——既保留真实形态,又保护隐私;三是建立"真实样本库"让 mock 数据可复用。核心是"用脱敏后的真实数据样本替代假数据,让 mock 反映真实形态,减少联调失真"。

假 mock 数据导致联调失真。用脱敏后的真实样本替代假数据,才能让 mock 反映真实格式与边界。数据脱敏 + 真实样本库是正解。

#

46. 你联调时环境里的数据库和测试环境不一致(schema 不同),你怎么看怎么推动

你联调时发现环境里的数据库和测试环境不一致(schema 不同),你该如何看待并推动?

  • 能否识别"环境 schema 不一致"的联调风险
  • 能否论证"环境一致性"的价值
  • 能否设计"环境治理"机制

环境 schema 不一致(测试库和联调库结构不同)会导致联调测的"不是真实交付的形态",上线才暴露问题。argue 时说明:环境一致性的价值是"让联调环境尽可能接近生产",减少"环境差异"导致的返工。推动方式:一是"统一 schema 管理"——用 migration 脚本统一管理所有环境的 schema,确保测试/联调/生产一致;二是"环境自动同步"——CI 建环境时自动应用最新 migration;三是"环境基线"——明确各环境应有的 schema 版本,定期校验。核心是"用 migration 统一管理 schema、自动同步环境,保证联调环境与生产一致"。

环境 schema 不一致让联调失真。用 migration 统一管理、环境自动同步、基线校验,保证各环境一致。环境一致性是联调质量的前提。

#

47. 接口契约变更时你如何让“契约测试与实现代码同步更新”,避免契约成为第二份过期文档?

接口契约变更时,你如何让"契约测试与实现代码同步更新",避免契约成为第二份过期文档?

  • 能否识别"契约与实现脱节"的风险
  • 能否设计"契约先行/同步"的机制
  • 能否论证"契约作为单一事实来源"

避免契约成为过期文档,核心是"让契约成为实现的一部分,而不是单独的文件"。常见做法:一是"契约先行"——先写/改契约(OpenAPI/契约文件),再由契约生成代码桩或校验,实现必须满足契约,否则测试失败;二是"契约测试与实现同 PR"——任何接口变更必须同时更新契约定义和契约测试,放到同一个 PR 里,让"改实现不带契约"无法通过;三是"CI 强制校验"——契约与实现不一致时 CI 直接失败。这样契约的更新和实现绑定,不会"只改实现忘改契约"。核心是"契约先行 + 同 PR 更新 + CI 强制,让契约与实现天然同步,不做第二份过期文档"。

契约过期源于"契约与实现分离"。用契约先行、同 PR 更新、CI 强制校验,让契约绑定实现,从机制上杜绝"只改实现忘改契约"。契约是单一事实来源。