InfoQ6 个实用的 Code Review 实践技巧( 二 )
显然 , 这里的问题在于目标不清晰 , 团队没有收集到足够的反馈就直接构建解决方案 。 如果在第一步后 , 我们先画一幅汽车的草图 , 并将其展示给用户 , 他们会问相同的问题 , 这样就可以进一步了解客户需求 。 如此 , 就为我们节省了 6 个月的工作量 。 软件也不例外 , 我们可能会犯同样的错误 , 在用户不需要的特性或模块上投入大量工作 。
在 Shopify , 一般用 Work In Progress (WIP) PRs 来获得早期反馈 , 其目标是验证方向(算法、设计、API 等等选择) 。 尽早变更可以避免在细节、修饰、文档等方面浪费精力 。
作为一名写代码的人 , 这意味着你要对变更工作方向持开放态度 。
在 Shopify , 我们信奉的原则是允许大家有自己的理解 , 但不固执己见 。 我们希望大家能在有充足理由的情况下自信地做出决定 , 但同时也能乐于学习其他更好的新方案 。 在实际工作中 , 我们使用 Github 的 Draft PRs , 它们明确表明这项工作仍在流程中流转 , Github 不允许你合并一个 Draft PR 。 其他工具可能有类似的功能 , 至少你创建正常 PR 时可以加上一个 WIP 标签 , 以明确表示该工作还处于前期阶段 。 这将帮助你的评审人专注于适当的领域 , 提出适当的反馈 。
One PR Per Concern除了行数外 , 需要考虑的另一个维度是你的工作单元试图解决的问题数量 。 一个关注点可以是一个特性、一个错误修复、一个依赖项升级、一个 API 变更等等 。 你是否在重构的同时引入一个新特性?一次修复了两个错误?同时引入了类库升级和新的服务?
把 PR 分解为一个个单独的关注点 , 它会产生下列影响:
- 更独立的评审单元 , 这意味着更好的审查质量;
- 受影响的人更少 , 因此可以聚集在更少的几个专业领域中;
- 原子性回滚 , 可以回滚小的 commit 或 PR 。 这是很有价值的 , 因为如果出了问题 , 就更容易确定错误是在哪里引入的 , 以及回滚哪些部分 。
- 将易事和难事分开 。 假设有一个新特性 , 需要重构一个频繁使用的 API 。 你可以更改这个 API , 升级十几个调用的站点 , 然后实现这个特性 。 你的变更中有 80% 不是功能上的变更 , 明显可以忽略掉 , 而 20% 是需要仔细注意测试覆盖率、预期行为、错误处理等等的新代码 , 并且可能要经过多次修订 。 对于每一个修订 , 评审人都需要浏览所有的修改以找到相关的部分 。 通过将其分成两个 PR , 很容易就可以快速完成大部分工作 , 并优化评审工作 , 将主要精力投入到难点上 。
本文插图
将 PR 分解成单独的关注点上例的 PR 包含三个不同的关注点 , 我们将其进行拆分 。 可以看到 , 每个评审人需要检查的上下文少了许多 。 最重要的是 , 只要其中任何一个部分的评审完成 , 代码作者就能一边等待其他评审反馈 , 一边着手处理已经反馈的问题 。 在最极端的情况下 , 代码作者会陆续收到各个部分的评审反馈 , 几乎可以不间断地处理完这一系列 PR , 而不是完成初稿后 , 等上几天(已经去忙其他的事) , 然后最后再返回头来处理反馈意见 。
专注代码 , 而不是人专注于代码 , 而不是人 , 这条实践谈的是人与人之间的沟通方式和关系 。 从根本上讲 , 这是提倡我们尝试把注意力集中在如何改进产品上 , 避免作者将评审意见当作对他个人的批评 。
推荐阅读
- 喜爱星座的小姐姐所有平台发稿工具、比较好用的新媒体平台同时管理小工具
- 喜爱星座的小姐姐 所有平台发稿工具、比较好用的新媒体平台同时管理小工具
- 「福特」价格在一二万元左右,可以通勤实用的跨骑摩托车推存
- 沈凯丽|李佳航给李晟化妆,谁注意他上妆工具用的啥?女生想死的心都有了
- 发布价5399元的它,Pro采用的是3D八曲面设计,网友,但到了6月份再入手就并不划算了
- 阿乐的小生活 mate30 2020年最适合父母使用的性价比最高的一款手机,华为
- 伪大神|近卫荣耀加双抗,却沦为备胎选择,王者荣耀:中看不中用的辅助装
- 北峰电讯|你知道几个?,警用对讲机全是PDT?警察常用的模拟对讲机频段
- 夜朦胧 一款好用的在线伪原创文章生成器软件工具
- 科技报道|不管和谁聊天,微信只删除聊天记录是没用的,教你彻底清空
