问题描述
我们希望我们的 post-mortem/retrospective 是无过错的。最近在一份 post-mortem 报告中,有人在其中包含了以下陈述:
On DATE, PERSONMAME did code a fix (link), but forgot to merge it to master
有人建议为了”无过错”,我们不应该包含 PERSONNAME。建议的替代方案是:
On DATE, the code fix (link) was created but the engineer failed to merge it to master.
在一个无过错的文化中,没有人应该担心自己的名字出现在报告中。在第一个例子中,指出他们的名字似乎是有过错的。
另一方面,在第二个例子中,有人可以通过链接查看工程师是谁。这似乎是在隐藏某人的名字,但实际上并没有真正隐藏。这感觉像是在一个有责备/羞耻问题的组织中会做的事情。
我们应该怎么办?
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
在 blameless 的 post-mortem/retrospective 中,最好的做法是超越人为错误,并通过 5 Whys 和 5 Hows 来完善分析。
对于这个特定案例的 blameless post-mortem/retrospective,我会进一步进行以下几个步骤的迭代(以示例为例):
1. 这个修复在创建后为什么没有合并?(没有经过审查,没有按照通常的路径进行合并)
2. 为什么会错过审查?(这是紧急且直接的,不需要审查,并且决定进行部署)
3. 这个过程是如何定义的?(没有定义)
4. 为什么在没有合并的情况下关闭了 bug 报告(没有验证/没有为这种情况定义的过程)
5. 如何防止问题再次发生?(定义过程,并为快速修补程序设置验证/审查)
现在,你不再有一个忘记合并东西的人,你有一个分析为什么会发生这种情况的过程,更重要的是,你有一些可行的改进措施,这是进行 post-mortem/retrospective 的主要原因。
关于 5 Whys 的更详细批评(正如你所展示的,最终往往是一个 Who 而不是一个 Why),可以在 O’reilly 的博客文章 “The infinite hows” 中找到。
为了解决分析中的具体问题,我认为既不需要提到名字,也不需要提到修复本身,只需在报告中将步骤描述为 “一个工程师编写了一个修复程序,但没有合并” 即可。
方案2
使用脚本或工具来管理容器的启动顺序可能会增加复杂性,并且需要确保容器A和容器B之间的依赖关系正确设置。
另一种方法是编写脚本或使用工具来控制容器的运行顺序。你可以使用docker run
命令来手动控制容器的启动顺序,或者使用一些第三方工具来管理容器的依赖关系。
以下是一个简单的bash脚本示例,可以在容器A启动后启动容器B:
#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b
在这个示例中,我们首先使用docker run
命令启动容器A,并将其命名为container_a
。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo
命令来测试)。一旦容器A就绪,我们再使用docker run
命令启动容器B,并将其命名为container_b
。