软市(www.iruanshi.com) - 正版软件商城_企服市场!
产品分类 自营

软件质量工程之COE

前言

1.1 背景

服务可靠性至关重要,服务不可用会导致极差的用户体验、可能引起资金损失,用户流失,从而降低客户信任度和商业价值。当然故障可以说是不可避免的发生,一个标准的事件复盘机制可以让我们可以在事件发生后对故障进行充分的分析,避免再次发生同样的事故。而且一个标准的事后复盘机制还可以帮助我们更多地了解我们的系统是如何工作的,进而提前发现还未暴露出来的潜在风险。COE(Correction Of Error)正是一个标准的事件复盘机制,源自亚马逊,是该公司作为质量工程的重要工具,本文浅略介绍COE的原理及实践方法。

1.2 读完本文你可以获得什么?

本文的目标读者是具有一定软件工程背景的软件开发工程师、软件工程管理人员、项目管理人员以及信息技术行业的从业者。读完本文你将对COE流程有个大致的了解,理解它是什么,为什么需要它,什么时候使用它,如何使用它。在日常工作中可以使用本文所提供的COE模板对问题复盘进行标准化分析、总结、沉淀及输出。

COE介绍

2.1 What: COE是什么?

  • 2.1.1 标准化文档&流程

COE(Correction Of Error)是一种通过记录和处理问题来提升软件工程质量的流程。所谓记录问题就是通过标准化的文档来记录造成问题的根本原因,这一部分也叫根本原因分析(Root Cause Analysis);所谓处理问题,就是通过标准化的流程来逐一消除造成问题的根本原因,从根本上解决问题。需要指出的是,COE即是一种文档的类型,也是一种流程。我们可以理解COE是一种“复盘”。复盘,围棋术语,指对局结束后,双方旗手把刚才的对局再复演一遍,这样可以有效地加深对这盘对弈的印象,也可以找出双方攻守的漏洞,是提高自己水平的好方法。当一个人精通复盘之后,他对于自己的工作就会有深刻的认识和体悟,具有一种惊人的直觉。就可以从纷繁复杂的现象中一眼抓住关键所在,找出解决问题的方法和路径。下表我们直奔主题,看看一个COE文档是如何构成的:

组成 详情
故障总结   这一段虽然是第一段,但也应该写在最后。本节提供整个事件的上下文。包括有关谁受到影响、何时、何地以及如何受到影响的详细信息。包括发现问题所用时间的详细信息,并总结您如何缓解问题以及您计划如何防止再次发生。不要试图在此处填写所有详细信息,而是在摘要中提供有关事件的基本信息。摘要应该是独立的,不需要读者参考其他部分。编写摘要就好像它将作为电子邮件更新发送给贵公司的主要利益相关者(例如 CEO)一样。
故障简述 发生了什么?
故障影响     收集及量化评估受影响用户数量以及他们如何受到影响的详细信息非常重要。描述影响面的大纲如下所示:

1. 有多少用户受到影响?持续了多长时间?

i. 对客户或业务的影响的描述

ii. 影响有多严重?

a. 是否有用户资损?(如用户被多收款)

b. 社交媒体统计(情绪)

c. 根据经济损失估计或实际数据对影响的描述

d. 对我们的用户是否有一些“次生”的影响。

(由于当前故障,用户的业务或日常活动受到了怎样的影响?)

e. 声誉:我们是否耽误了客户的交易?还是我们完全失去了客户?

 

2. 哪些非功能性需求受到影响?

安全性(机密性、完整性和可用性)、可靠性、性能效率、成本优化和运营影响

3. 事件的后果是什么?

i. 这起事件是否引发了其他事件?

ii. 这个事件的后果是否超出了工作负载的操作范围?例如:

a. 失去机会,例如,没有赢得一份有竞争力的合同,由于无法销售而损失了X美元

b. 无法满足SLA、合同要求或法规要求,导致处罚。

c. 客户情绪跟踪:名誉损失、失去客户的信任。

时间线  时间线描述了事件期间发生的所有事件。它涵盖从与事件相关的第一个事件到系统恢复正常运行的那一刻。时间线清楚地显示了所发生的一切,以及事件期间可用的所有事件和信息。  时间线是一个列表,列出发生的事情和发生时间。编制详细的时间表很重要,这有助于COE编写和Review人员了解事件是如何处理的。制定时间表时,重要的是要考虑以下因素:1. 按时间顺序表示事件的顺序。

2. 与事件顺序的时区保持一致。

3. 时间表应该关注事件,包括开始和结束时间,而不仅仅是团队感知到时间发生的时间段。

4. 时间线应该从导致问题的第一个被触发的时间点开始(例如,错误的部署),而不仅仅是当您的团队收到通知时。

5. 确保在 COE 的后续部分中清楚地解释您的时间线中任何超过 10-15 分钟的间隔(对于大故障,我们需要及时在事故处理群众同步处理进度,必要的时候需要有人专门负责信息同步,详细可见《SRE Google运维解密》)。

6. 记录时间时,请务必包含时区,并确保您正确使用时区(例如,UTT 、 PST)。

7. 尽可能使用数据支持。尽可能链接到外部项目和图像或工件(仪表板或任何其他信息源)。

违规判断判断是否存在违反团队红线的行为,这些红线是团队制定的、达成共识的、深入人心的、可执行的规范,以下为一个简洁易行的标准:

软件质量工程之COE

指标    本部分包含定义影响的指标、您如何确定问题以及您如何设置以监控事件。如果这些指标不存在,那么这是一个危险信号——并且可能是一个很好的action,可以包含在后面的部分中。
疑问及解答    一旦我们有了时间表,就开始提出问题来分析事件并开始确定事件的关键方面。问题应集中在事件的关键方面,例如:1. 发现    i. 你什么时候知道有客户影响的?    ii. 你是怎么知道有客户影响的?        a. 客诉        b. 监控+告警发现    iii: 我们怎样才能将检测时间缩短一半呢?2. 定位     i. 用户影响的根本原因是什么?     ii. 事件期间是否发生了内部活动(维护窗口)?
iii. 我们怎样才能将定位时间缩短一半呢?3. 止损及恢复     i.客户影响何时恢复到事件发生前的水平?ii.系统所有者如何知道系统已正确恢复?iii.你是如何决定在哪里以及如何减轻问题的?iv.我们怎样才能将止损和恢复的时间缩短一半呢?
根本原因    5Whys分析法是一个行之有效的根本原因分析方法,它有助于克服我们的预设及成见。该过程易于学习和使用,无论是个人还是整个团队都值得加以运用。1. 抛出问题。2. (First Why)为什么会出现这个问题?3. (Second Why)问为什么是第 2 步中记录的第一个为什么的答案。4. (Third Why) 向步骤 3 中记录的第二个为什么的答案询问为什么。5. (Fourth Why)向步骤 4 中记录的第三个为什么的答案询问为什么。6. (Fifth Why)向第 5 步中记录的第四个为什么的答案询问为什么。7. 继续这个过程,直到你确信你已经发现了这个事件发生的完整事件链,不管它需要多少个为什么。8. 制定计划来补救每个“为什么”的答案。例子:1. 问题是X。2. 为什么 X 会发生?    i. X发生是因为发生了这个动作。3. 为什么要采取这种行动?    ii. 该操作发生是因为有一个错字。4. 为什么允许输入错误?    iii. 错字是允许的,因为没有验证。5. 为什么没有验证代码?    iv. 当前进程不验证代码。6. 为什么当前进程不验证代码?    v. 用于输入代码的 shell 没有该功能。      在回答了每个“为什么”之后,考虑以下问题以确定该过程是否必须继续。如有必要,将原因作为问题重复该过程。当您确信已找到根本原因时停止。1. 当前原因是根本原因吗?2. 能不能在事情发生之前就查出原因?3. 是人为错误的原因吗?如果是这样,为什么可能呢?在上面的示例中,必须解决五个要点:1. X Action 的影响必须得到修复2. 如果必须重新调用命令,则需要避免拼写错误。3. 必须实施代码验证。5. 应修改当前流程以确保代码的有效性6. 任何用于代码的 shell 都必须验证代码。
行动Action是 COE 过程的主要目的和结果,实施这些action以改进未来同一问题的预防、诊断过程或者彻底解决同一类问题。每个行动项目都必须说明其优先级、负责人以及完成日期。良好的action是具体的、有时间边界、可完成的。
关联项参考其他 COE 或与当前 COE 相关的文档。这有助于为相关资产以及我们发生一系列事件时提供背景信息。

 

 

2.1.2 COE不是什么?

COE不是找出谁应该为问题负责的过程:COE 的目的是促进优化和改进,这需要创造一种鼓励解决问题的文化而不只是问责的文化。

COE不是在发生事件后对员工进行惩罚的过程:很多时候,对一件事了解最多的人往往是其结果最有风险的人。为了激励对事件过程的最完整的理解,我们必须创造一种文化,奖励对事件的全面披露,否则这个对故障最为了解的COE文档编写者势必对了解的情况遮遮掩掩,以尽可能规避对自己不利的因素。

COE不是绩效管理工具:在某一家公司工作的时候,一个影响绩效的指标就是背了几个COE,即“COE==大故障”,大致有个COE就背差绩效,这家猛学亚马逊的公司,渐渐将一个软件质量工程管理的工具变为一个处理人的工具。

2.2 When:什么时候用COE?
我认为需要进行COE的故障应该具有代表性:当前影响面较大的问题,流程规范性的问题,管理上的问题,暴露潜在大风险的问题。

2.3 Why:为什么要用COE?

 

  • 2.3.1 标准化文档的好处

COE不仅对根本原因分析进行书面记录,同时以规范的格式进行书面记录。规范的格式也有至少有以下两个好处:便于阅读,和提取关键信息:想象一下,如果你从100篇错误分析文档中找出一共有多少文档是部门A发布的,一种情况是100篇文档格式不尽相同,发布部门信息散落各数,另一种情况是格式一致,发布部门信息都在前言里。必然是格式一致的文档能方便你提取你需要的关键信息—故障周期、影响面、原因、action等。便于自动化提取关键指标:文档规范化后,可以交由软件自动读取,分析出关键指标。比如从1000篇COE中发现123篇的根本原因都是X,那么管理层可以得知解决X的重要性,并且可以用这些指标来进行科学决策。

 

  • 2.3.2 标准化流程的好处

COE将根本原因分析的流程标准化,帮助我们快速,准确地深入研究导致事件发生的时序,找到问题的根本原因并确定补救措施,分析事件对业务和客户的影响,进而找出问题的根本原因。不仅如此,COE作为标准化的文档,可以帮助相关团队高效的Review,也可以帮助其他团队快速的提取出关键信息来学习。此外,由于文档使标准化的,公司可以通过统计方法得到丰富的指标,比如有多少错误的根本原因是由于“证书过期”引起的,进而能够作为预防故障发生的资料。

2.4 Who:谁来写COE?

在软件系统错误发生时,一般由当事人起草COE。当事人可以是导致错误发生的软件开发工程师,可以是在代码审核过程中遗漏该错误的工程师,也可以是该软件系统的负责人。选择他们是因为他们对出错误的系统最为熟悉。在亚马逊的企业文化里,由某一个人导致的软件系统错误也可能同样发生在其他任何人上,所以要改善流程而不是批评指责某个具体的人。

 

案例分析

  • 3.1 随便举的一个例子

 

项目 详情
事故简述 2007年1月1日,时间下午14:00,公司A电商网站预计举行抽奖活动B。当日下午13:00。负责为抽奖活动提供技术支持的团队C的某软件工程师(注意不要出现姓名)发现一个会妨碍抽奖活动的bug,在巨大的时间压力下,修复该bug的代码未经测试便直接上线。导致公司网站的购物车功能从14:00瘫痪,直到14:30,该问题才由运营技术团队D发现并紧急回滚包含错误的代码。
事故影响

错误对于用户,业务造成的影响,最好列举相关的指标

该错误导致抽奖活动B取消,此外,由于购物车功能收到影响,45分钟内,网站的所有用户均无法把商品放入购物车中。根据历史数据,此时用户数量为X,活动B预计增加Q%的客流量,购物车转化率为Y%,平均每单收入为W元人民币。这次事故对于公司A的收益影响是

时间线1. 2007-1-1 13:00:00 (CST) 团队C的某软件工程师发现了一个会妨碍抽奖活动的bug。2. 2007-1-1 13:15:00 (CST) 该软件工程师把码未经测试修复代码直接部署到生产环境中。3. 2007-1-1 14:00:00 (CST) 电商网站的购物车功能开始瘫痪,用户无法把商品放入购物车中。4. 2007-1-1 14:30:00 (CST) 运营技术团队D,通过每秒放入购物车物品件数指标的断崖式下跌发现购物车异常问题。5. 2007-1-1 14:45:00 (CST) 运营技术团队D通过紧急回滚包含错误的代码恢复了购物车功能,网站购物车功能自此正常工作。
违规判断违反六要两不要:违法要测试、要观察。
指标通过每秒放入购物车物品件数指标同比下降90%.
疑问及解答1. 发现    i. 你什么时候知道有客户影响的?       答:2007-1-1 14:00:00(CST)    ii. 你是怎么知道有客户影响的?       答: 监控+告警发现(附上监控截图)    iii: 我们怎样才能将发现时间缩短一半呢?       答:2. 定位     i. 用户影响的根本原因是什么?        答:     ii. 事件期间是否发生了内部活动(维护窗口)?        答:不在维护封禁期     iii. 我们怎样才能将定位时间缩短一半呢?3. 止损及恢复     i.客户影响何时恢复到事件发生前的水平?

答: 2007-1-1 14:45:00 (CST)

ii.系统所有者如何知道系统已正确恢复?

答: 2007-1-1 14:45:00 (CST) 附上故障处理群周知公告。

iii.你是如何决定在哪里以及如何减轻问题的?

iv.我们怎样才能将止损和恢复的时间缩短一半呢?

根本原因分析

刨根问底,顺藤摸瓜,造成错误的最根本原因是什么

  1. 为什么公司A购物车功能瘫痪了?因为团队C的工程师把码未经测试修复代码直接部署到生产环境中
  2. 为什么团队C的工程师把码未经测试修复代码直接部署到生产环境中?为了紧急修复会妨碍抽奖活动的bug
  3. 为什么修复妨碍抽奖活动的bug会影响网站A购物车功能?因为抽奖活动代码和购物车功能代码过于耦合
  4. 为什么抽奖活动B代码和购物车功能代码过于耦合?因为负责购物车功能的团队E没有提供相应的API,抽奖活动B的功能代码直接在购物车功能中实现了。
  5. 为什么要购物车功能中实现抽奖活动B的功能,为何不先重构购物车功能并且先实现API?因为抽奖活动B过于紧急,需要在2007-1-1上线。
行动

为了避免重蹈覆辙,都有那些短期或者长期的纠正措施

  1. 短期措施: 修复妨碍抽奖活动B的bug,对于抽奖活动重新排期。预计新的抽奖活动B时间:2007-1-7
  2. 短期措施: 出台紧急修复流程,紧急修复至少需要通过同行代码评审和自动化测试。
  3. 中期措施: 对购物车功能进行重构,向抽奖活动B的技术团队提供API,通过API解耦。预计完成时间:2007-2-1
  4. 长期措施: 团队B和团队E负责审核他们项目中的所有代码,通过API逐步解耦其他地方的不合理耦合。预计完成时间:2008-1-1
经验反省

吃一堑长一智,从错误中学习到的宝贵经验

  1. 要进行合理的项目排期,不能因小失大。技术团队要及时向上级反映情况,不能因为满足眼前的功能而放弃项目的长期规划。
  2. 各个技术团队负责的产品要通过API定义的合同进行沟通,不能瞎耦合代码。
  3. 紧急修复也要有相关流程,至少要通过同行代码评审和自动化测试。
关联项 2007-1-15 xxx故障COE

3.2  几个公开的COE案例

对外公开的COE其格式有所变化,其侧重点在于错误分析,但是也可以看到具体的纠正措施:

NO 文档
链接
1 2020年11月25日,最近一次,发生于US-EAST-1地区的Amazon Kinesis Event事故总结。 https://aws.amazon.com/cn/message/11201/
2 2017年2月28日,使Quora,Trello等网站停运数小时的著名的Amazon S3事故总结 https://aws.amazon.com/cn/message/41926/
3 2012年12月24日,发生于圣诞节前夜,把Netflix也拉下水的Amazon ELB事故总结 https://aws.amazon.com/cn/message/680587/

COE Review

    在编写完COE文档后,我们需要在团队内或者跨团队进行Review,当然在Review的过程中,COE相关当事人应该对参与Review人员的问题进行解答,对Review过程中的问题、结论进行记录。在这个过程中不仅审核根本原因分析,而且要审核为了消除根本问题所制定的纠正措施。有些纠正措施致力解决眼前的问题,比如紧急修复一个错误。有些纠正措施则目标长远,目的是改善相关流程。解决短期和长期的纠正措施所需要的时间不同,所以纠正措施的预计交付日期也不尽相同,审核也包括评估纠正措施的预计交付日期,比如预计的交付日期是否合理。

在Review的时候我们应该主动避免将Review过程变成扯皮甩锅的过程,曾经参加一次COE Review时其中一个QA的TL对着研发一顿喷,大致就是“这种问题也能出还配是个研发?”,明显先甩掉QA测试不充分的锅且有人身攻击,这种行为在COE Review时是应该被制止的。

一些思考

    COE的终极目标是避免重蹈覆辙,而不是把错误归咎于某个人,因此对造成错误的软件开发工程师不会,也不应该有任何的责罚。COE不是软件开发工程师的”检讨书”,而是软件开发工程师对抗来自项目经理不合理要求的“武器”,同时也是保护软件工程师的“防弹衣”。在COE审核结束后,COE里的纠正措施通常比实现软件的某个新功能有更高的优先级,如果此时有项目经理提出与COE相悖的优先级排期,比如得把COE的纠正措施搁置一旁去实现某个新功能。此时软件开发工程师可以援引COE的纠正措施来质疑不合理的要求。    通常,起草COE的作者是对出错误的系统最为熟悉的工程师,并不一定是直接导致问题发生的工程师。软件系统不可能不出错,世界上最稳定的服务也无法达到100%的可用性。但是一篇一篇的COE,是工程师们学习的源泉,成年累月地从错误中汲取经验,使得服务的稳定性能逐渐提高。

总结

    在工作中,标准化的流程、标准化的文档可以大大提高工作的效率同时也会大大降低因为流程不规范等带来的故障风险。任何一个优秀的工具也应该不被越界使用和滥用,就COE而言如果被用成“检讨书”,其真正存在的意义将不复存在,而成为研发人员避之不及的不祥之物。在今天的团队开发模式下,一次故障的发生被归结到某一个人的身上是一件不太公平的事情,相对于“解决人”,我认为更合理的方式是优化流程。

参考资料

[1] https://wa.aws.amazon.com/wat.concept.coe.en.html

[2] https://aws.amazon.com/cn/blogs/mt/why-you-should-develop-a-correction-of-error-coe/

 

发表回复

登录后才能评论
客服