23 可视化:一种更为直观的沟通方式

作为一个程序员,在这个技术快速发展的时代,我们唯有不断学习,才能保证自己不为时代所抛弃。那你是怎么跟上技术发展步伐的呢?

就个人经验而言,我会关注一些技术网站,最典型的就是 InfoQ。

这样,我可以快速了解到技术发展的动向,比如,什么时候出了个新东西、哪个项目又有了重大的更新、某些技术有了哪些新的应用场景等等。

另外,我还有一种更系统地了解新知识的方式:ThoughtWorks 技术雷达。

之所以我很喜欢这种方式,因为它是“可视化”的。

什么是技术雷达?

ThoughtWorks 技术雷达是由 ThoughtWorks 技术咨询委员会(Technology Advisory Board)编写的一份技术趋势报告,每6个月发布一次。

ThoughtWorks 的项目多样性足够丰富,所以它能够发现诸多技术趋势。

因此,相比于行业中其它的预测报告,技术雷达更加具体,更具可操作性。

ThoughtWorks 是我的老东家,所以,我在接触技术雷达的时间很早。

我在2013年就已经开始与人讨论微服务,并在项目中尝试使用 Docker,而这一切信息的来源都是技术雷达。

不过,我这里想和你讨论并不是技术雷达到底有多优秀,而是带你看看技术雷达这种组织知识的可视化形式。-

lada

技术雷达用来追踪技术,在雷达图的术语里,每一项技术表示为一个 blip,也就是雷达上的一个光点。

然后用两个分类元素组织这些 blip:象限(quadrant)和圆环(ring),其中,象限表示一个 blip 的种类,目前有四个种类:技术、平台、工具,还有语言与框架。

圆环表示一个 blip 在技术采纳生命周期中所处的阶段,目前这个生命周期包含四个阶段:采用(Adopt)、试验(Trial)、评估(Assess)和暂缓(Hold)。

每次技术雷达发布之后,我会特别关注一下“采用” 和 “暂缓”两项。

“采用”表示强烈推荐,我会去对比一下自己在实际应用中是否用到了,比如,在2018年11月的技术雷达中,事件风暴(Event Storming)放到了“采用”中,如果你还不了解 事件风暴 是什么,强烈建议你点击链接了解一下。

“暂缓” 则表示新项目别再用这项技术了,这会给我提个醒,这项技术可能已经有了更优秀的替代品,比如,Java世界中最常见的构建工具 Maven 很早就放到了“暂缓”项中,但时至今日,很多人启动新项目依然会选择 Maven,多半这些人并不了解技术趋势。

从这几年的发展趋势来看,技术雷达在“采用”和“暂缓”这两项上给出的推荐,大部分是靠谱的。

至于“试验”和“评估”两项,有时间的时候,我会慢慢看,因为它们多半属于新兴技术的试验区,主要的作用是用来让我开拓视野的。

雷达图是一种很好的将知识分类组织的形式,它可以让你一目了然地看到并了解所有知识点,并根据自己的需要,决定是否深入了解。

所以,我的前同事们借鉴了这个形式,做出了一个程序员的读书雷达,将程序员的应该阅读的书籍做了一个整理。-

读书雷达

事实上,这种将内容通过可视化方式的组织起来的形式非常好用,ThoughtWorks 鼓励每个组织都建立自己的知识雷达,甚至提供了一个工具辅助你将雷达图构建出来。

在我看来,雷达图不仅仅适用于组织,也可以适用于团队

我也曾经按照雷达图的方式将自己的团队用到的技术组织起来。

把最需要了解的技术必须放在内环,比如:一个 Java 项目。我会要求程序员了解 Java,向外扩展的就是你在这个团队内工作会逐渐接触到的技术,比如,像 Docker 这种与部署相关的知识。

至于最外面一层,就是被我们放弃掉的技术,比如,Maven。

这样一来,团队成员可以更清晰地了解到团队中所用的技术。

当有新人加入团队时,这个雷达可以帮助新人迅速地抓住重点,他的学习路径就是从内环向外学习。

所以,我也推荐你打造自己团队的技术雷达。

构建技术雷达- 构建雷达的程序库

你是否想过,为什么雷达图的形式可以帮助你更好地理解知识呢?

因为人的大脑更擅长处理图像

可视化的优势

在远古时代,人脑处理的内容大多是图像,比如,哪里有新的果实,哪里猛兽出没,文字则是很久之后才产生的。

现在普遍的一种说法是,大约在公元前3500年左右,许多文明才刚刚发展出书写系统,相比于人类的历史来说,这几乎是微不足道的。

就人脑的进化而言,处理图像的速度远远快于处理文字,所以,有“一图胜千言”的说法。

通过创建图像、图标或动画等进行信息交流的形式,就是可视化(Visualization)。可视化有很多种不同的分类,我们最常用的应该是数据可视化和信息可视化。

我在“你的工作可以用数字衡量吗”这篇文章里说过,我上班第一件事是“看”数字,这就是典型的数据可视化,而上面介绍的技术雷达,就属于信息可视化。

很多做软件的人习惯于用文字进行沟通,一般在软件开发过程中,需要编写各种文档,但并不是所有的场景,文字都是好的沟通方式,所以,也会有很多人尝试着将可视化应用在软件开发过程中。

估计大多数程序员最熟悉的表达方式应该是流程图,如果你做过软件设计,可能还听说过 UML(统一建模语言,Unified Modeling Language)。如果使用得当,这种方式会极大地提高表达的准确性,降低其他人理解的门槛。

在日常工作中,你最熟悉的可视化方式,大概就是在纸上或白板上画的图。以我的经验看,很多人画这个图太随意,如果你也是这样,我给你一个建议,先写字后画框,这样图会显得整洁一些。

什么是看板?

我们再来看一个实践,这就是将“可视化”应用在工作中的典型案例:看板。

看板,是一种项目管理工具,它将我们正在进行的工作变得可视化。

这个实践来自精益生产,前面讲精益创业时,我给介绍了“精益”这个来自丰田公司的管理理念。

精益的理念在软件行业已经非常流行了,很多软件开发实践都是从“精益”而来,看板就是其中之一。

看板

看板属于那种几乎是看一眼就知道怎么用的实践。

它将工作分成几个不同的阶段,然后,把分解出来的工作做成一张卡片,根据当前状态放置到不同的阶段中。

如果你采用了我们专栏之前讲过的用户故事,那么每个用户故事就是一张卡片。

在实际工作中,每当一个工作完成之后,它就可以挪到下一个阶段,工作怎么算完成就是由我们前面提到的 DoD 来决定的。

当然,要用好看板,还可以使用一些小技巧。

比如,用不同颜色的卡表示不同类型的工作,给每个人一个头像,增添一些乐趣。

看板可以帮助你一眼看出许多问题,比如,你的团队中有5个人,却有8个正在进行的任务,那一定是有问题的。

因为一个人多线程工作,效果不会好。

用“精益”的术语来说,我们应该限制 WIP(Work-In-Progress);再有,如果待开发的卡最多,那就证明现在的瓶颈在于开发,而不是其它阶段

运用看板的方式,还有一个有趣的细节:使用实体墙还是电子墙。

实体墙不难理解,就是找一面墙把看板做出来。现在有很多公司专门在做协同办公软件,其中的项目管理部分用到的就是看板理念,这就是电子墙的由来。

关于这点,顺便说一下我的建议,如果你的团队是在一起工作的,请考虑使用实体墙,除非你的办公空间实在太小。

因为它可以方便地调整,也可以当作站会的集合地点,还可以让别人看见你们的工作或是问题,这样做的最大优势在于增强了人与人的互动。

电子墙的优势在于,随处可访问、数据不会丢失、便于统计等等,但每次访问它,都需要专门打开电脑,还是比较麻烦的。

一种将二者结合的办法是,使用一个大电视,专门用来展示电子墙。

总之,看板就是要让工作在大家面前展现出来。

总结时刻

我给你介绍了一种结构化学习新知识的方式:技术雷达

技术雷达就是一种将技术信息组织起来的方式。

它通过将技术按照“象限”和“圆环”两个维度进行分类,让人可以直观地看到并理解不同的技术所处的发展阶段。

雷达图是一种很好的形式,不仅可以用在组织技术,还可以用来组织其它信息,比如,读书雷达。

每个公司都可以利用雷达图的形式组织自己所有的技术,每个团队也可以利用雷达图的形式组织自己团队用到的技术,这样,方便团队成员结构化地理解用到技术,也方便新人的学习。

雷达图实际上是一种可视化的方法,人脑对于图像处理速度更快,因此,可视化是改善沟通的一种方式。大多数软件过程习惯采用文字的方式进行表达,对于“可视化”利用的还不够。当然,还是有一些利用“可视化”的方法,比如,流程图、UML 等。

最后,我给你介绍了一个利用可视化进行信息沟通的实践:看板。看板把工作分成了几个不同的阶段,在看板上对应不同的列,然后,每个任务作为一张卡贴在上面。每完成一张卡,就把这张卡挪到下一个阶段。

看板可以帮你发现许多问题,比如,当前进展是否合适,是否有人同时在做很多的事,发现当前工作的瓶颈等等。

如果今天的内容你只能记住一件事,那请记住:多尝试用可视化的方式进行沟通。

最后,我想请你思考一下,你在工作中,有哪些用到可视化方法解决沟通问题的场景?欢迎留言区写下你的想法。

24 快速反馈:为什么你们公司总是做不好持续集成?

在“以终为始”那个模块,我们留下了一个巨大的尾巴。

在“持续集成:集成本身就是写代码的一个环节”这篇文章中,我们是站在“以终为始”的角度阐述了集成,尤其是持续集成的重要性。

但怎么做好持续集成,才是很多人真正关心的内容。今天,我们就来谈谈如何做好持续集成。

既然我们打算讨论持续集成,不妨停下来先思考一个问题:你对持续集成的第一印象是什么。

持续集成?Jenkins?没错,很多人对持续集成第一印象都是持续集成服务器,也就是 CI 服务器,当年是 CruiseControl,今天换成了 Jenkins。

也正是因为如此,很多人就把 CI 服务器理解成了持续集成。

我就曾经接触过这样的团队,他们恨不得把所有的事情都放在 CI 服务器上做:在 CI 服务器上做了编译,跑了代码检查,运行了单元测试,做了测试覆盖率的统计等等。

或许你会疑问,这有什么不对的吗?

在做软件这件事上,我们不会用对与错去衡量,我只能说,这种做法是可行的,但它不是最佳实践。

希望你去思考,有没有比这更好的做法呢

想要回答这个问题,我们还是要回到持续集成的本质上去。

持续集成的诞生,就是人们尝试缩短集成周期的结果。为什么要缩短周期呢?因为我们希望尽早得到反馈,知道自己的工作结果是否有效。

所以,想要做好持续集成,就需要顺应持续集成的本质:尽快得到工作反馈

由此,我们便得到持续集成的关键点,你只要记住一句话,快速反馈。

快速反馈,这句分成两个部分,快速和反馈,这也就引出了持续集成的两个重要目标:

怎样快速地得到反馈,以及什么样的反馈是有效的。

快速得到反馈

我们回到前面的例子上,把各种检查放到 CI 服务器上执行,它可以让我们知道代码是不是有问题,这是一个有效的反馈,但它的反馈够快速吗?

虽然比起没有持续集成的状态,它是好很多。但是,我们需要问一个问题,能不能更快地得到反馈呢?

显然,我们还可以做得更快。在自己的开发机上执行这些检查,就会比在 CI 服务器快。也就是说,执行同样的操作,本地环境会快于 CI 服务器环境。

为什么会这样呢?我们先来看看所有检查在 CI 服务器上执行,每个程序员的动作是什么样的。

我们写好代码,然后需要提交代码,等待 CI 服务器运行检查结果,然后,用 CI 监视器查看执行结果。

如果没问题,继续做下一个任务,如果有错误,修复错误,再执行同样的过程。

flow

再来看看本地执行的动作。运行构建脚本,如果一切正确,你可以选择提交代码或是继续下一个任务,如果失败,立即修复。

local

对比之下,在本地运行这些检查,你不需要提交,不需要等 CI 服务器开始执行,不需要跑到额外的地方查看检查结果。所以,这个操作比提交到服务器上会快很多。

另外,这里还有一个关键点,我们的操作是连续的。

一旦检查结果出错了,我们立刻进入修复环节。作为程序员,我们太了解连续操作的重要性了。这就像打游戏时,我们感觉不到时间流逝一般,有人把这种状态称之为“心流”。

而提交代码,等待 CI 服务器的检查结果,就等于强迫你停下来,你的心流就被打断了。

如果你对心流的概念感兴趣,可以去读米哈里·契克森米哈赖的著作《心流》,这位作者就是心流概念的提出者。

前面我们只是在说,你作为程序员个体,使用持续集成的效果,这只是为了简化讨论。

接下来,我们向更真实的世界靠拢,引入另一个重要的因素:团队协作

假设你的团队就是在 CI 服务器上执行检查。你兴高采烈地写完一段代码准备提交,结果,此时你隔壁的同事手快一筹,先提交了,你不得不停下来等他。如果很不幸,你同事的检查失败的话,那么他又要把它修复好,你等的时间就更长了。

一个小问题也就罢了,如果是个大问题,他可能要修很长一段时间。这个时候,你除了等待,也没有更好的选择。如此一来,大把的时间就被浪费掉了。

这里我们要“插播”持续集成中重要的一个提交纪律:只有 CI 服务器处于绿色的状态才能提交代码。

有检查在运行不能提交,有错误不能提交。原因很简单,如果这个时候多个人提交了代码,检查失败了,那问题到底算谁的呢?

反之,如果一次只有一个人提交代码,责任是明确的。如果团队不大,这个纪律相对还好执行,提交之前看一眼,或是喊一声就可以了。

如果团队稍微有一点规模,可以用一个小东西当作令牌,谁拿到了谁来提交。如果真的有人在 CI 服务器还在运行的时候,提交了代码怎么办?很简单,谁提交谁负责,错了就他修,谁让他违反纪律了。

好,你已经理解了我说的重点:不能把检查只放到 CI 服务器上执行。那该怎么做呢?答案已经呼之欲出了,那就是在本地开发环境上执行

想做好持续集成的一个关键点是,用好本地构建脚本(build script),保证各种各样的检查都可以在本地环境执行。

一旦有了构建脚本,你在 CI 服务器上的动作也简单了,就是调用这个脚本。

也就是说,本地检查和 CI 服务器上的动作是一致的。

至于什么样的内容适合放在构建脚本里,这个话题我们先放一放,把它留到后续“自动化”模块再做讨论。

在“任务分解”模块中,我与你讨论了“小”动作在工作中的重要性,“小”动作完成得越快,工作反馈得到也越快,所以说,也只有坚持不懈地做“小”动作,才能缩短反馈周期。

现在我们把这个道理与持续集成结合起来理解,我们的工作流程就变成了这样:

每完成一个任务,在本地运行构建脚本,如果有问题,就修复;没问题,则可以同步代码。如果 CI 服务器上没有正在运行的服务,就可以提交代码了。

ci

提交代码中最麻烦的动作,其实是合并代码。

不过,因为我们做的是小任务,改动的代码量并不大,所以,即便有需要合并的代码,量也不会很大,所需的脑力以及工作时间都会少很多。

如此一来,我们的开发效率才可能能真正得到提高。

当团队真正地实施起持续集成,你会发现随着时间增加,本地检查的时间会越来越长。原因有很多,比如,代码越来越多,测试也越来越多。

总之,检查的时间长了,就会对集成的速度造成影响。

这个时候,本着快速反馈的理念,我们就必须想办法。

比如,有的团队做了分布式测试运行,有的团队将测试分类,就是我们在测试金字塔中讲到的分类,在本地执行单元测试和集成测试,而把更复杂的系统测试放到 CI 服务器上运行。

简单来说,我们的目的就是快速地得到反馈。

得到有效的反馈

说完了“快速”,我们再来看看做好持续集成的第二个重点:反馈,也就是怎么得到有效的反馈。

为什么需要反馈,道理很简单,我们得知道自己做得对不对。

你可能会问,根据前面的说法,如果本地和 CI 服务器上执行的是一样的脚本,我在本地通过了,还用关心 CI 服务器的反馈吗?

当然要。因为还会出现很多其他问题,比如说最简单的一种情况是,你漏提交了一个文件。

好,既然我们要关注CI 服务器的反馈,下一个问题就是,它怎么反馈给我们呢?

我们还是从一种常见的错误入手。有些团队做持续集成用的反馈方式是什么呢?答案是邮件。

以邮件进行反馈,问题出在哪里呢?很明显,邮件不是一种即时反馈的工具

我不知道有多少人会把邮件客户端当作日常的工具,就我个人习惯而言,一天查看几次邮件就算不错了,如果以邮件作为反馈方式,很有可能是出错了很长时间,我都无知无觉。

我们前面一直在强调快速,需要的是即时反馈,一旦邮件成了持续集成链条中的一环,无论如何都快不起来。

那你可以怎么做呢?在前面各种讨论中,我其实已经透露了答案:持续集成监视器,也是 CI 监视器。

monitor

CI 监视器的原理很简单,CI 服务器在构建完之后,会把结果以API的方式暴露出来,早期有RSS和ATOM格式,后来有JSON的格式。

得到的结果就可以用不同的方式进行展现了。市面上有很多CI 监视器的软件,有的是拿到结果之后,做一个视觉呈现,有的是做桌面通知。

现在,我们终于要讲到这个部分的重点了:怎么呈现是有效的?

答案很简单:怎么引人注目,怎么呈现。

比如,很多团队的做法是,用一个大屏幕将持续集成的结果展示出来,这样一来,持续集成的结果所有人都能看到,一旦出错了,即便你一时疏忽,也会有人来提醒你。

还有一些感官刺激的做法,比如,有人用上了红绿灯,测试失败则红灯闪烁;还有人甚至配上了语音,用喇叭高喊:“测试失败了,请赶紧修复。”

我在一个视频里见过一个更夸张的做法:有人用玩具枪,出错了,就瞄准提交者开上一枪。

你是聪明的程序员,你应该能想到更多有趣的玩法。

为什么要这么做呢?这里的重点是,想做好持续集成,需要整个团队都关注持续集成。

这些引人注目的做法,就是要提高持续集成的关注度。否则,即便持续集成的技术环节做得再出色,人的注意力不在,持续集成也很难起到作用。

所以,你看到了,持续集成的反馈,尤其是出错之后的反馈方式,几乎是所有实践中最为高调的,它的目的就是要引人注目。

这里再插播一条持续集成的纪律:CI 服务器一旦检查出错,要立即修复。原因很简单,你不修,别人就不能提交,很多人的工作就会因此停顿下来,团队的工作流就会被打断,耽误的是整个团队的工作。

如果你一时半会修不好怎么办,撤销你的提交。

更关键的原因是,团队对于持续集成的重视度,长时间不修复,持续集成就失去了意义,人们就会放弃它,持续集成在你的项目中,也就发挥不出任何作用了。

总结时刻

持续集成是软件开发中的重要实践,做好持续集成的关键在于,快速反馈。这里面有两个目标,怎样快速地得到反馈,以及什么样的反馈是有效的。

做好快速反馈,要把本地能做好的事情,在本地做好;也要通过小步提交的方式,加快代码开发的节奏。

什么是有效的反馈?

一是即时的反馈,二是引人注目的反馈

有很多种持续集成相关的工具可以帮助我们达成有效的反馈。

想要做好持续集成,还要有一些纪律要遵循:

  • 只有 CI 服务器处于绿色的状态才能提交代码;

  • CI 服务器一旦检查出错,要立即修复。

如果今天的内容你只能记住一件事,那请记住:做好持续集成的关键在于,快速反馈。

最后,我想请你分享一下,你的团队做持续集成吗?遇到过哪些困难呢?欢迎留言与我们分享。

25 开发中的问题一再出现,应该怎么办?

看过《圣斗士星矢》的同学大多会对其中的一个说法印象颇深:圣斗士不会被同样的招数击败两次。

我们多希望自己的研发水平也和圣斗士一样强大,可现实却总不遂人愿:同样的线上故障反复出现,类似的 Bug 在不同的地方一再地惹祸,能力强的同学每天就在“灭火”中消耗人生。

我们难道就不能稍微有所改善吗?

如果在开发过程中,同样的问题反复出现,说明你的团队没有做好复盘。

什么是复盘?

复盘,原本是一个围棋术语,就是对弈者下完一盘棋之后,重新把对弈过程摆一遍,看看哪些地方下得好,哪些下得不好,哪些地方可以有不同甚至是更好的下法等等。

这种把过程还原,进行研讨与分析的方式,就是复盘。

现如今,复盘的概念已经被人用到了很多方面,比如,股市的复盘、企业管理的复盘,它也成为了许多人最重要的工具,帮助个体和企业不断地提升。

这其中最有名的当属联想的创始人柳传志老爷子,他甚至把“复盘”写到了联想的核心价值观里。

为什么复盘这么好用呢?在我看来有一个重要的原因,在于客体化。

俗话说,当局者迷,旁观者清。以我们的软件开发作为例子,在解决问题的时候,我们的注意力更多是在解决问题本身上,而很少会想这个问题是怎么引起的。

当你复盘时,你会站在另外一个视角,去思考引起这个问题的原因。这个时候,你不再是当事者,而变成了旁观者。你观察原来那件事的发生过程,就好像是别人在做的一样。你由一个主观的视角,变成了一个客观的视角。

用别人的视角看问题,这就是客体化

在软件开发领域,复盘也是一个重要的做法,用来解决开头提到那些反复出现的问题,只不过,它会以不同的方式呈现出来。

回顾会议

回顾会议是一个常见的复盘实践,定期回顾是一个团队自我改善的前提。

回顾会议怎么开呢?我给你分享我通常的做法。

作为组织者,我会先在白板上给出一个主题分类。

我常用的是分成三类:“做得好的、做得欠佳的、问题或建议”。

还有不同的主题分类方式,比如海星图,分成了五大类:“继续保持、开始做、停止做、多做一些、少做一些”五类。

分类方式可以根据自己团队的喜好进行选择。

我之所以选用了三类的分类方式,因为它简单直观,几乎不需要对各个分类进行更多的解释。

然后,我会给与会者五分钟时间,针对这个开发周期内团队的表现,按照分类在便签上写下一些事实。

比如,你认为做得好的是按时交付了,做得不好的是 Bug 太多。

这里面有两个重点。

一个是写事实,不要写感受。

因为事实就是明摆在那里的东西,而感受无法衡量,你感觉好的东西,也许别人感觉很糟糕。

另外,每张便签只写一条,因为后面我要对便签归类。

因为大家是分头写的,有可能很多内容是重复的,所以,要进行归类。

五分钟之后,我会号召大家把自己写的便签贴到白板上。等大家把便签都贴好了,我会一张一张地念过去。

这样做是为了让大家了解一下其他人都写了些什么,知道不同人的关注点是什么。一旦有哪一项不清楚,我会请这张便签的作者出来解释一下,保证大家对这个问题的理解是一致的。在念便签的同时,我就顺便完成了便签归类的工作。

等到所有的便签都归好类,这就会成为后续讨论的主题,与会者也对于大家的关注点和看到的问题有了整体的了解。

做得好的部分,是大家值得自我鼓励的部分,需要继续保持。而我们开回顾会议的主要目的是改善和提升,所以,我们的重点在于解决做得不好的部分和有问题出现的地方。

在开始更有针对性的讨论之前,我会先让大家投个票,从这些分类中选出自己认为最重要的几项。我通常是给每人三票,投给自己认为重要的主题。每个人需要在诸多内容中做出取舍,你如果认为哪一项极其重要,可以把所有的票都投给这个主题。

根据大家的投票结果,我就会对所有的主题排出一个顺序来,而这就是我们要讨论的顺序。

我们不会无限制的开会,所以,通常来说,只有最重要的几个主题才会得到讨论。

无论是个人选择希望讨论的主题,还是团队选择最终讨论的主题,所有人都要有“优先级”的概念在心里。然后,我们就会根据主题的顺序,一个一个地进行讨论。

讨论一个具体的主题时,我们会先关注现状。我会先让写下反馈意见的人稍微详细地介绍他看到的现象。比如,测试人员会说,最近的 Bug 比较多,相比于上一个开发周期,Bug 增加了50%。

然后,我会让大家分析造成这个现象的原因。比如,有人会说,最近的任务量很重,没有时间写测试。

再下来,我们会尝试着找到一个解决方案,给出行动项。

比如,任务重,我们可以让项目经理更有效地控制一下需求的输入,再把非必要的需求减少一下;测试被忽略了,我们考虑把测试覆盖率加入构建脚本,当测试覆盖率不足时,就不允许提交代码。

请注意,所有给出的行动项应该都是可检查的,而不是一些无法验证的内容。

比如,如果行动项是让每个程序员都“更仔细一些”,这是做不到的。因为“仔细”这件事很主观,你说程序员不仔细,程序员说我仔细了,这就是扯皮的开始。

而我们上面给出的行动项就是可检查的,项目经理控制输入的需求,我们可以用工作量衡量,还记得我们在讨论用户故事中提到的工作量评估的方式吗?

控制工作量怎么衡量?就是看每个阶段开发的总点数是不是比上一个阶段少了。而测试覆盖率更直接,直接写到构建脚本中,跑不过,不允许提交代码。

好,列好了一个个的行动项,接下来就是找责任人了,责任人要对行动项负责。

比如,项目经理负责需求控制,技术负责人负责将覆盖率加入构建脚本。有了责任人,我们就可以保障这个任务不是一个无头公案。

下一次做回顾的时候,我们就可以拿着一个个的检查项询问负责人任务的完成情况了。

5个为什么

无论你是否采取回顾会议的方式进行复盘,分析问题,找到根因都是重要的一环。

你的团队如果能一下洞见到根因固然好,如果不能,那么最好多问一些为什么。具体怎么问,有一个常见的做法是:5个为什么(5 Whys)。这种做法是丰田集团的创始人丰田佐吉提出的,后来随着丰田生产方式而广为人知。

为什么要多问几个为什么?因为初始的提问,你能得到的只是表面原因,只有多问几个为什么,你才有可能找到根本原因。

我给你举个例子。服务器经常返回504,那我们可以采用“5个为什么”的方式来问一下。

  • 为什么会出现504呢?因为服务器处理时间比较长,超时了。

  • 为什么会超时呢?因为服务器查询后面的 Redis 卡住了。

  • 为什么访问 Redis 会卡住呢?因为另外一个更新 Redis 的服务删除了大批量的数据,然后,重新插入,服务器阻塞了。

  • 为什么它要大批量的删除数据重新插入呢?因为更新算法设计得不合理。

  • 为什么一个设计得不合理的算法就能上线呢?因为这个设计没有按照流程进行评审。

问到这里,你就发现问题的根本原因了:设计没有经过评审。

找到了问题的原因,解决之道自然就浮出水面了:一个核心算法一定要经过相关人员的评审。

当然,这只是一个例子。有时候,这个答案还不足以解决问题,我们还可以继续追问下去,比如,为什么没有按流程评审等等。

所以,“5个为什么”中的“5”只是一个参考数字,不是目标。

“5个为什么”是一个简单易上手的工具,你可能听了名字就知道该怎么用它。

有一点需要注意的是,问题是顺着一条主线追问,不能问5个无关的问题

无论是“回顾会议”也好,“5个为什么”也罢,其中最需要注意的点在于,不要用这些方法责备某个人。

我们的目标是想要解决问题,不断地改进,而不是针对某个人发起情感批判。

总结时刻

在软件研发中,许多问题是反复出现的,很多开发团队会因此陷入无限“救火”中,解决这种问题一个好的办法就是复盘。

复盘,就是过程还原,进行研讨与分析,找到自我改进方法的一个方式

这种方式使我们拥有了客体化的视角,能够更客观地看待曾经发生过的一切。

这种方法在很多领域中都得到了广泛的应用,比如股市和企业管理。

在软件开发中,也有一些复盘的实践。我给你详细介绍了“回顾会议”这种形式。

无论哪种做法,分析问题,找到根因是一个重要的环节。“5个为什么”就是一个常用的找到根因的方式。

如果今天的内容你只能记住一件事,那请记住:定期复盘,找准问题根因,不断改善。

参考资料

http://learn.lianglianglee.com/%e4%b8%93%e6%a0%8f/10x%e7%a8%8b%e5%ba%8f%e5%91%98%e5%b7%a5%e4%bd%9c%e6%b3%95/23%20%e5%8f%af%e8%a7%86%e5%8c%96%ef%bc%9a%e4%b8%80%e7%a7%8d%e6%9b%b4%e4%b8%ba%e7%9b%b4%e8%a7%82%e7%9a%84%e6%b2%9f%e9%80%9a%e6%96%b9%e5%bc%8f.md