开工福利|免费学 2200+ 精品线上课,企业成员人人可得! 了解详情
写点什么

不做代码审查又怎样(二)

  • 2020-01-17
  • 本文字数:1645 字

    阅读完需:约 5 分钟

不做代码审查又怎样(二)

沟通的收益和成本

在我看来,代码审查所暴露出的问题本质上就是如何权衡沟通的成本和收益的问题。


在软件开发过程的发展中,无论是从一开始的瀑布,后来的敏捷,还是当下的精益。都有很大一部分篇幅是在强调沟通或者说是强调沟通方式的演进,都是为了解决已有沟通方式所带来的各种限制和问题。


例如在我们自己的项目中就采用以下的实践来促进团队内外的沟通,包括:迭代计划会(Iteration Planning Meeting),每日站会(Daily Standup),代码评审会(Code Review),回顾会议(Retrospective Meeting);还有 XP 中的结对编程(Pair programming),现场客户 ( On-site Customer )等。


而沟通的好处是可以得到快速的反馈,无论是 80 年之前就出现的 PDCA 环还是前两年大热的精益创业,都是在强调快速反馈和基于反馈的快速迭代,通过这种方式来消除生产和创业过程中造成的各种浪费。


但是(对,又是但是……),沟通也是有成本的,而且成本一般都还不低,相信这点也不需要多解释,大家肯定都经历过各种各样效率极低令人抓狂的讨论或是会议。


在沟通的成本和收益同时摆在我们面前,如何做出选择?如何才能设计一套刚刚好的沟通体系,平衡收益与成本,来满足团队和项目的需要呢?

沟通金字塔

在读《重构》的时候,我深深地体会到:


这个世界上没有什么是不变的,包括变化本身。所以要想得到解脱,我们就需要从简单的对与错,好与坏的漩涡中跳脱出来,用变化的眼光来看待周围的事物,并做好一直变化的准备。


而面对沟通成本与收益的选择困境时,我第一个想到的就是测试金字塔。了解测试金字塔的同学肯定都知道,测试金字塔是一个很好的工具,它帮助我们从单一的测试选择困境中跳脱出来,将各种不同类型的测试建立起关联、纳入一个统一的体系,从而让我们可以在一个更高的维度来系统的思考和审视每一种测试的策略,关注点也从简单的“该不该”变为了“如何变化”。



图 2. 测试金字塔


至于“如何变化”?我们可以通过在金字塔上添加一层新的测试种类来弥补整体测试策略中粒度太粗的问题;也可以根据项目情况通过移除一层测试种类,用其上层或是下层的测试来覆盖其测试用例,来减少成本;也可以通过将某个测试用例在金字塔中向上层或是向下层移动来寻找收益与成本的平衡。


举个实际点儿的例子,例如我可以将一些基于 UI 的集成测试用例下移,用成本更低的单元测试来覆盖从而减少成本,加快反馈速度;也可以将一个单元测试用例上移,用基于 UI 的测试来增加其稳定性的和体现的业务价值。


看,我们讨论的内容从简单的要不要写 UI 测试,需要写多少单元测试测试已经被转换到对于整体策略的变化和调整上来了。那对于代码审查的问题能否也通过金字塔这个工具转换到更大的空间上寻求突破呢?这就是沟通金字塔。



图 3. Iteration Planning Meeting


相比于测试金字塔中的“UI 、Service、UT”,“Iteration Planning Meeting、 Code Review、 Pair programming”就可以类比成沟通金字塔,和测试金字塔一样更靠近金字塔顶端的(例如迭代计划会)沟通频率越低,成本越高,但越接近业务;越靠近金字塔底端的(例如结对编程)沟通频率越高,成本越低,越接近实现。这几种不同的沟通方式所沟通的内容肯定也会有所重叠,通过将各个层次的沟通方式进行组合来保证我们团队的整体沟通质量,就像通过金字塔中的各种测试层次的组合来保证产品质量的一样。



图 4. Pair programming


如果可以这么类比的话,那我们对于沟通质量的管理也应该是动态的、系统的、从整体上出发的。例如就可以通过在沟通金字塔中添加一层新的沟通机制来弥补沟通粒度过粗的问题,例如 QA Team 现在在做的每周例会就是一个好的例子;也可以将一些沟通内容通过层次(上下)的调整,甚至是通过直接减少一层沟通方式来优化我们的整体沟通效率,例如我们可以通过增加结对编程的 Switch 频度来替换掉成本更高的代码审查。而目标就是通过不断地动态调整和优化沟通结构,试图寻求一个沟通成本,沟通收益,沟通效率平衡的沟通环境。



本文转载自健荐公众号。


原文链接:https://mp.weixin.qq.com/s/9l-549sddZ_JFMqdNC8CgQ


2020-01-17 11:23672

评论

发布
暂无评论
发现更多内容

一款dubbo服务可视化调试工具

程序员架构进阶

dubbo 工具 RPC 服务化 28天写作

OSPF的八大特点介绍

使用DevSecOps保护CI / CD管道

啸天

DevSecOps 应用安全 开发安全

绩效管理,上下同心者胜(一)

一笑

管理 绩效 28天写作

区块链交易所系统开发|区块链交易所软件APP开发

系统开发

python自学 第四章 python语言基础之变量

WEB前端修行日志

Python 编码格式

android进阶之光!双非渣本Android四年磨一剑,进阶学习资料!

欢喜学安卓

android 程序员 面试 移动开发

我做了回视频,告诉你需要用到哪些工具

和牛

工具

阿里P8大神分享的并发编程笔记,颠覆了我以往“正确“的认知

Java 程序员 面试 并发编程

python自学 第三章 python语言基础之保留字、标识符与内置函数

WEB前端修行日志

Python 编码格式

现成矿机挖矿软件系统APP开发案例

系统开发

android开发要学什么语言!掌握这些Android开发热门前沿知识,挥泪整理面经

欢喜学安卓

android 程序员 面试 移动开发

Redis布隆过滤器原理与实践

Java redis 面试

HDFS杂谈:ACL访问控制列表

罗小龙

hadoop hdfs acl 28天写作

C2C交易系统APP开发|C2C交易软件开发

系统开发

RocketMQ解析

石刻掌纹

写在开课前

5x

智能合约业务场景探索(一)

石君

智能合约 28天写作

基因编辑食品,能否端上我们的餐桌?

脑极体

Windows文件夹还能更改颜色?

程序员的时光

程序员 七日更 28天写作

精选算法面试-哈希表

李孟聊AI

面试 算法 哈希 28天写作

项目管理系列(4)-另类减肥法

Ian哥

28天写作

产品经理训练营笔记-认识产品经理(上)

.nil?

Android面试总结(一)

我就感觉到快

「架构师训练营 4 期」 第三周 - 001

凯迪

Lambda 和 Stream API

大海

Java Lambda Stream<T>

一篇让你彻底理解网关是什么的文章

Java架构师迁哥

如何实现CentOS服务器的扩容??

冰河

Linux centos 扩容 服务器

游戏夜读 | 游戏作品的生命力

game1night

「架构师训练营 4 期」 第三周 - 002

凯迪

日语复习 Day03【~あまり(に)】

IT蜗壳-Tango

程序员 七日更 日语语法

不做代码审查又怎样(二)_语言 & 开发_王健_InfoQ精选文章