标签归档:必备技能

研发管理之基于代码的研发效能度量

在研发管理中,如何准确评估研发人员的效能一直以来都是一个挑战。传统的评估方式大多依赖于观察软性技能的表现,如问题的跟进实时性、反馈的有效性、推动事情的能力,以及解决技术问题的能力。然而,对于研发人员而言,他们的代码质量和效率往往是最直接、最硬性的评价标准。而代码很多时候是看不到的,特别是当团队规模到达一定数量的时候。

代码的质量和开发效率是研发同学工作的核心。好的代码不仅要能完成预设的任务,也要易于理解、修改和测试,以便其他开发者在未来能够维护和改进。代码的质量和开发效率可以直接反映开发人员的技术能力和专业知识。因此对于一个研发管理者来说,要想掌控一个团队的情况,从代码出发,从代码量和代码质量来度量是一个不可或缺的角度。

为何要度量代码?

代码是软件产品的基础,深入理解代码可以帮助我们更好地了解产品的健康状况、性能状况和维护情况。更重要的是,通过深入分析代码,我们可以发现代码中可能存在的问题和改进点,以便提前发现并解决问题,降低项目风险。基于代码的研发效能度量为我们提供了一个量化、可度量的评估标准,从而使我们能够更科学、更有效地管理和优化研发过程和研发分工。

基于代码的度量是什么?

基于代码的研发效能度量是一种通过对代码及代码提交进行深入分析和理解,从中洞察出可能存在的问题和改进点,以提高研发效率和产品质量的方法。这涉及到代码质量分析、代码性能分析、代码测试分析、代码维护性分析以及技术债务分析等多个方面。

从实际落地来说,基于代码的研发效能度量通常涉及到以下几个方面:

  1. 代码质量:这是衡量代码健康状况的重要指标。

    • 代码复杂度:例如,使用圈复杂度(Cyclomatic Complexity)或 Halstead 复杂度(Halstead Complexity)度量代码的逻辑复杂度。
    • 代码规范性:如代码是否遵循了 PEP 8(Python编程规范)或其他语言的编程规范。
    • 代码重复率:如通过工具(如 SonarQube 或 PMD )检测代码的重复部分,计算代码重复率。
    • 用例覆盖率:如使用工具(如 JUnit 和 Cobertura )运行单元测试和集成测试,计算用例覆盖率。
    • 注释覆盖率:SonarQube 等工具可以分析出代码覆盖度
  2. 开发活动:这是了解开发团队工作模式的重要度量。

    • 提交频率:如通过 Github 或其他版本控制系统统计每个开发人员的提交频率。
    • 代码修改频率:如统计某段代码或某个文件被修改的频率,以理解代码的稳定性。
  3. 问题和缺陷:这是评估代码质量问题和风险的关键度量。

    • 缺陷密度:例如,通过错误跟踪系统(如Jira或Bugzilla)统计缺陷数量,然后除以代码行数,计算缺陷密度。
    • 问题解决时间:例如,统计从发现问题到解决问题的平均时间,了解团队的响应效率。

以上就是基于代码的研发效能洞察的主要组成部分。这些度量有助于我们理解代码的健康状况、开发过程的效率,以及代码质量的问题和风险。需要注意的是,这些度量并不能全面反映研发效能,还需要结合具体的项目情况和团队情况进行分析。

基于代码的研发效能度量如何实施

将以上的这些组成部分、时间、人、项目、团队这些结合起来就是一个基本完整的基于代码的研发效能分析系统。

做基于代码的研发效能洞察无非是回答如下的 2 类问题:

  1. 做了什么,做了多少
    • 你的团队做了什么,做了多少
    • 你的团队成员做了什么,做了多少
    • 每个成员在团队中的水平处于什么样的水平,有没有特别突出的(多或少)
  2. 做得怎么样
    • 你的团队的代码质量如何
    • 有没有比较突出(好或坏)的成员
    • 有没有共性的质量问题

要想回答这些问题,基于代码层面,通过代码度量研发的研发效能,影响力产出,代码质量等,拿到客观的数据度量到人、团队、项目。

我们做代码的洞察实施简化后可以有 4 步:

1.引入工具或系统:将代码这个盒子打开,看到度量后的数据。这里当然会有一个问题分析、行业方案对比的过程。

  1. 机制化跟进:需要有一个组织来承接事项,无组织即无成果。结合管理人员的机制化跟进,根据度量的数据和系统的指标,以某个时间间隔来做洞察,发现问题。
  2. 整体洞察:从下往上,形成整体效能的洞察,根据发现的问题,明确代码产出的问题点和能衡量状态的指标。
  3. 复盘:以 3 个月以一个区间来盘点指标和问题,清晰团队/项目的变化。

基于代码的研发效能度量的优势与挑战

当我们引入某些工具或系统来做了基于代码的度量或洞察后,可以得到如下的一些东西:

  1. 全面的代码质量管理:通常能够全面地对代码质量进行管理,包括代码质量分析、代码审查等。
  2. 技术债务管理:通常提供了一种有效的方式来管理技术债务。
  3. 提高团队效率:通过对代码的持续分析和审查,可以帮助团队提高效率,减少错误和问题。
  4. 提供具有洞察力的数据和报告:通常能够提供具有洞察力的数据和报告,帮助团队更好地理解代码质量和研发效能。

以上是一些好的方面,但是也有一些不好的点:

  1. 需要一定的学习和适应:对于新的系统和工具,团队成员可能需要一段时间来学习和适应。
  2. 可能存在一定的成本:这类系统通常需要付费使用,这可能会增加公司的开支。
  3. 可能与现有的流程和工具不兼容:如果团队已经有了自己的流程和工具,那么使用新的系统可能会导致一些兼容性问题。
  4. 安全或隐私问题:如果系统是基于云的服务,这意味着代码需要上传到外部服务器进行分析。这可能会引发一些安全和隐私问题。一般我们选择通过私有化部署来解决,但是成本会更高一些。

最后,随着时间的推移,可能会出现「面向指标编程」的情况。这通常发生在过度重视某些度量标准并以此作为主要驱动开发的团队或组织中。这些度量标准可能包括代码行数、问题数、提交频率、测试覆盖率等。

这样可能会带来一些问题:

  1. 优化错误的指标: 有时,开发同学可能会在不影响或甚至损害总体产品质量的情况下优化这些指标。比如,如果过度关注代码行数,开发者可能会写出冗长和复杂的代码来增加代码行数。
  2. 忽视质量和实用性: 过度关注指标可能会导致开发者忽视代码质量、可读性、可维护性和实用性。例如,开发者可能编写无实际价值的测试,只是为了提高测试覆盖率。
  3. 鼓励短视行为: 如果某些指标被用作评估性能或提升的基准,开发者可能会采取短期行为来满足这些指标,而忽视了长期的技术健康状况。

为避免「面向指标编程」,作为团队的管理者应该谨慎选择和使用度量标准。应该选择那些能反映出代码质量、可维护性和实用性的指标,并且要注意平衡多个指标,避免过度优化某一个指标。同时,要培养一个开放的团队文化,鼓励开发同学关注长期的技术健康状况,而不仅仅是满足短期的指标。

研发管理之生产环境的变更管理

2017 年,Amazon S3 服务在美国东部区域发生了大规模的故障,影响了许多依赖于 S3 的服务和应用。这次故障的根本原因是维护人员在执行一个操作时,错误地将更多的服务器脱机,这超过了系统设计的冗余容量,导致了该区域S3的部分子系统开始备份,进一步扩大了故障的影响。

2018 年 10 月 31 日 GitHub 通过官方博客发布了 2018 年 10 月 21 日「挂掉」的事件分析。GitHub 指出此次事件发生的原因是在 10 月 21 日 22:52UTC 进行日常维护——更换发生故障的 100G 光学设备时导致美国东海岸网络中心与美国东海岸数据中心之间的连接断开。更具体地 GitHub 分析,虽然两地的连接在 43 秒内恢复,但这次短暂的中断引发了一系列事件,这才导致了长达 24 小时 11 分钟的服务降级。

2020 年 7 月,Cloudflare 的 DNS 服务遭受了大规模的中断,影响了许多依赖其服务的网站。该故障的原因是 Cloudflare 的路由器中的一个错误配置。

以上是在网上搜索各大平台的故障描述,可以看到这些故障都是由于生产环境的变更导致的,有些是网络设备变更,有些是配置变更,有些是维护人员在线上执行了某个操作…… 如此种种。

这些问题最终都是开发人员通过系统化的建设,一个坑一个坑的填完了,但是当我们带着一个团队急速前进时,可能来不及做这些系统化的建设,此时通过流程对生产环境的变更进行管理,快速解决或规避一些问题以控制线上故障的出现。流程能保证的是我们做事的下限

在做生产环境变更管理流程之前一定要明晰生产环境的概念和范围,在团队内达成共识,然后再去做流程,以规避因为对生产环境的概念和范围不一致,导致的误解和乌龙。

1 生产环境的概念

生产环境,也称为「产品环境」或「线上环境」,是指实际运行并对外提供服务的环境。这个环境中的软件版本、配置和数据都应该是最新的、经过充分测试的,以保证系统的稳定性和性能。线上环境需要提供24小时不间断的服务。

一个应用或环境是否属于线上环境,主要取决于它是否直接对外提供服务。例如,如果一个应用接收并处理来自最终用户的请求,那么它就是线上环境的一部分。同样,如果一个环境中的数据被用于生产服务,那么这个环境也应该被视为线上环境。

通常,生产环境包括以下 4 个部分:

  • 硬件资源:例如服务器、网络设备、云服务中的硬件部分等;
  • 软件资源:包括操作系统、数据库、中间件、云服务中的软件部分等;
  • 应用程序:实际运行的业务代码和与之相关联的部分,如 CI/CD 工具;
  • 数据:实际的用户数据和业务数据。

定义了生产环境,从生产环境衍生出生产环境的变更。

2 生产环境变更的概念和分类

生产环境的变更是指在生产环境中对任何一部分进行的修改,包括应用程序的更新、配置的修改、硬件设施的更换等。而线上故障大多来源于生产环境的变更,对生产环境的变更进行管理和控制,在较大程度上可以减少对系统稳定性产生影响。

生产环境的变更从其组成出发,再加上外部流量,可以分为 5 类:

2.1 硬件资源变更

硬件资源变更主要包含所有与物理硬件和云服务硬件配置相关的更换、升级或维护。

  • 硬件规格调整:例如,升级处理器(CPU)、扩充内存(RAM)、更换硬盘等。
  • 网络设备更新:包括替换路由器、交换机或进行固件更新等。
  • 存储设备变动:磁盘扩容、存储设备更换等场景会包含在内。
  • 云服务硬件调整:如云计算服务中服务器规格的调整、增减虚拟机实例、增减 POD 数、网络设备变更等。

2.2 软件配置变更

软件配置变更涵盖了所有与操作系统、数据库、中间件以及云服务软件设置的修改。

  • 操作系统参数调整:比如,优化操作系统性能通过调整系统参数等。
  • 数据库设置变动:例如,数据库参数调整或修改索引,导致数据库负载提升甚至锁表导致的无法读写等线上事故。
  • 中间件配置更新:如修改消息队列的设置,调整缓存策略导致缓存穿越或者缓存雪崩等线上问题时有发生。
  • 云服务软件配置调整:包括了云服务的安全规则更新、网络配置变动等。

2.3 应用程序变更

应用程序变更主要包含了所有与业务代码和将业务代码发布到生产环境的 DevOps 工具的更改。

  • 代码变更:代码变更是我们最最常见的变更类型,主要是通过修改代码改变应用程序并通过发布系统发布到生产环境。这也是我们变更管理中风险最大的地方,因为变更的人,变更的位置和逻辑等都是不确定的。除了正常的发布变更,应用的回滚也是应用变更的回滚,因为其改动了线上的应用。实际中,代码变更在逻辑上包括了修复 bug、优化性能、增加新功能等,都需要对应用程序代码进行更新。
  • 配置变更:指应用系统的配置变更,一般是通过配置系统来变更,触发线上应用的热更新或滚动,配置如果是写死在代码中,会变为代码变更。
  • 依赖库更新:实际业务中需要对应用程序所依赖的库或框架进行更新,有些更新可能需要改代码,或者代码本身已经是这么个逻辑,在构建的时候就会带出去。
  • DevOps 工具变更:例如,升级工具版本,或者对某些功能进行调整。
  • DevOps 工具配置变更:如发布脚本中对于 dev 或 prod 环境的配置修改等等,都是高风险操作,线上有着血淋淋的故障。

2.4 数据变更

数据变更很少被人当作变更处理,因为很多时候就是正常的业务操作,如管理后台的批量操作这些,但是这些批量操作如果发生在高峰时期,可能会对线上业务带来较大的影响,轻则速度变慢,重则线上事故。数据变更可以分为线上数据的清理、迁移、更新等操作。

  • 数据清理:如定期删除过期数据,清理无效数据节省成本等等,基于不同的目的,将数据清除,除了可能会影响性能,如果清理错了,将会导致用户丢失,以至用户资产的损坏,这将会是很大的线上事故。
  • 数据迁移:如将数据从一个数据库迁移到另一个数据库,或者因为业务升级,数据需要从一种逻辑迁移到另一种逻辑,除了负载压力,更多的可能是数据错乱或者数据丢失,这两种情况都会引发用户投诉。
  • 数据更新:如前面说的管理后台批量更新,或者上线新模块在已有的数据库上初始化数据等等,这种最多的情况是其引发的 DB/ES 等存储类中间件的高负载导致服务的异常或引发线上事故。

2.5 流量变更

流量变更和上面四个类别不同,其是从外部来看的,主要包含了流量变化的情况。这里不考虑攻击类的流量。流量一般是带来高负载,或者由高负载引发的链路异常或雪崩,从而导致整体服务异常或线上事故。

  • 负载调整:如对调整负载均衡策略,更改流量路由等由于考虑不周引发某些节点过热或流量过大,引发级联反应,从而出现异常或事故。
  • 后台投放或大型促销活动:如没有提前通知的后台投放或大型促销活动、特殊事件导致的流量激增,可能需要进行负载调整或资源扩容等,如果某些链路存在容量上限,或者达到扩容的上限,就会引起线上异常或事故。

以上 5 种类型画成简单的脑图,如下:

图片

3 变更管理

变更管理是指以可控的方式对线上的服务、配置或基础设施进行变更,从而减少变更对业务和服务质量的影响,快速处理变更可能带来的问题,提升系统的稳定性。

变更管理,咱们从组织和流程机制两个方面来看。

3.1 组织

一个事情要想有力的执行下去,一定是有一个组织来保障事情的整体节奏和推进。

从组织的角度,整个变更管理的组织成员角色可以分为以下几种:

  • 变更管理主导者:一般来说,这个角色通常由技术团队的高级管理者来担任,并且这个事情它本身是一个从上向下的事情,需要更上层的负责人来推进事项,一般是 CTO 或 VP,或质量的负责人。他们需要确保变更管理策略和流程的成功实施,对整个变更管理过程负责,并需要对所有的变更决策拥有最后的决定权。

  • 变更管理委员会:这是一个跨部门的团队,包括来自业务、开发、运维、质量保证等部门的代表。他们的任务是评审即将进行的变更,评估其对业务的影响,以及是否符合公司的战略目标。他们还负责改进变更管理流程,并对变更管理的效果进行监督和评估。在实际的实施过程中可能没有正式的名称叫委员会,可能叫 XXX 质量小组,或者就是某个研发中心的管理团队兼任。

  • 变更经理:这个角色负责确保变更管理流程的日常运行,是实际的变更控制推进者,他们需要协调变更的执行,确保所有的变更都通过了必要的评审,已经准备好了回滚计划,并且变更后的效果已经得到了验证。在实际的实施过程中,变更经理大概率是某个 Leader 或者质量的负责人,或者 PM。

  • 变更执行人:这个角色负责协调变更的具体实施,例如安排变更的时间,通知相关人员,收集反馈,等等,一般这种变更由一线的开发,SRE 来做,也有大一些的公司有专门的职位。

3.2 流程机制

变更管理有一个理想状态的标准流程,其大概如下:

  1. 变更申请:在我们的流程中可能是创建发布记录,或者申请紧急发布
  2. 变更评审:变更评审主要是检查变更过程是否完备,以降低变更的风险,其包括如下内容:
    1. 就绪分析:材料是否完备,人员、设备、软件、网络是否就绪,测试是否达到上线要求等。
    2. 风险分析:架构、性能、业务、合规等方面的风险评估,变更内容是否属于需求范围,变更是否可控。
    3. 重要程度:变更属于一般、重要、紧急、标准哪一种。
    4. 变更审查:内容是否满足业务需求,内容是否通过测试,测试是否全面、有效。
    5. 应急管理:变更步骤、应急方案、回滚方案、应急预案是否完备。
    6. 变更实施:变更计划时间如何安排,发布及回退操作步骤是否完备,自动化步骤情况。
    7. 变更验证:变更涉及的业务、技术验证方法与时间安排。
  3. 变更审批:相关负责人对于变更评审的结果进行确认,并审批通过。
  4. 变更执行
    1. 根据发布计划执行发布操作,一般应该有一个灰度的过程;
    2. 验证线上功能并回归主流程;
    3. 持续灰度,观察用户直到灰度完成。
  5. 变更验收
    1. 对发布的功能进行验收,对于影响范围内的功能进行验收,对业务主流程进行回归验收;
    2. 留守,并观察日志、监控服务负载等,这个操作是为了及时发现验收检查漏掉的问题,或者及时处理隐藏的问题,以减少变更后产生的问题对线上业务的影响。

我们做这个流程是形式上的安慰,还是僵化的惯性,还是能真正地解决问题,是我们在做这个流程以及执行这个流程中需要着重思考的问题。

在变更前,即我们变更线上环境前需要自己做 Code Review,以及交叉的检查,以尽量减少问题流转到后面的操作中,节省问题的处理成本。

在标准流程之外,另外还有两个特别重要的点,一个是周知,一个是盘点。

周知在形式上可以是邮件、群通知、群消息,通过这些方式,将研发自己做的前面所定义的线上变更周知给相关方:「我们做了 XXX 操作,可能会影响 XXX ,你们看下对你们自己有没有影响,如果有相关告警可以找我。」

变更虽然有流程,但是流程保证的是过程,对于过程中的问题通过变更盘点的方式,阶段性回顾问题和成果,在变更委员会中达成共识并继续迭代。在每次迭代的时候我们可以问自己如下的一些问题:

  • 与上次回顾相比,变更对线上的影响有更严重吗?有影响到稳定性吗?
  • 变更流程是否有什么问题,是否需要专项来解决?是否应该解决?
  • 上次回顾安排的事项落实了吗,对应的情况如何,是否有更新到流程或系统中?

以上的回顾操作我们建议以某个管理系统来承载,并且这个管理系统是带有通知等功能,以更好的将变更相关的信息周知出去。当然,也可能直接共享文档+群通知来搞。

4 小结

上面的变更管理只是流程方面的,对于实际中变更管理最好是能在类似于 DevOps 系统中的落地,最少也是在项目管理或流程系统中落地。

生产环境的变更管理是一项复杂而重要的任务。通过对生产环境的良好理解,结合有效的组织、流程和系统工具,我们可以实现对生产环境变更的有效管理,保证业务的稳定运行,提升用户的使用体验,同时也提升了我们自身的运维效率和质量。这也是我们做研发管理必须要完成的任务之一。

技术管理必备技能之管理好系统性风险

我们在平常工作中经常会听到有人说系统性风险,但系统性风险到底是个啥?

1 系统性风险是什么

1.1 定义

「系统性风险」是一个经济术语,主要指的是一种可能导致整个金融系统或市场瘫痪的风险或概率。它是从系统性风险的整体性出发,而不是单一机构或者单一行业的危机。这通常是由于金融体系中一个重要组成部分的失败,例如一个大银行或一系列银行的破产,这可能引发一种连锁反应,影响整个系统。

当突发性事件导致金融机构或市场失灵时,资金无法在市场中有效输送和配置,从而引起整个市场的崩溃。系统性风险不仅仅是经济价值损失,还会对实体经济造成严重影响,并导致大部分金融体系的信心丧失。

如 2008 年的全球金融危机。在这个危机中,许多大型金融机构由于负债过重和资产质量下降而陷入困境,这引发了对全球金融系统稳定性的广泛担忧。

系统性风险是监管机构、政策制定者和经济学家关注的主要问题,因为如果这种风险实现,可能会导致重大的经济损失和社会动荡。因此,他们会尝试制定和执行各种政策和法规,以减少系统性风险的可能性。

1.2 系统性风险和非系统性风险的差别

系统性风险作为一种具有更大影响面的风险,和非系统性风险有以下几个方面的区别:

1. 影响范围:系统性风险具有广泛的影响范围,不仅仅局限于特定个体或组织,而是可能波及整个系统、市场或行业。非系统性风险则相对较局部化,通常只对特定个体、组织或项目产生影响。

2. 相互关联性:系统性风险与系统中各个组成部分相互关联,其中一个部分的风险可能会传播、扩大或影响其他部分。非系统性风险通常是单个因素或事件的结果,并不涉及系统的相互依赖关系。

3. 复杂性和不确定性:系统性风险往往更加复杂和不确定,因为它们涉及到多个变量、因素和相互作用。非系统性风险可能更加可控和可预测,因为它们通常涉及特定事件或条件。

4. 长期影响:系统性风险可能具有长期影响,并可能导致持续的连锁反应和不良后果。非系统性风险通常具有较短期的影响,并且其影响通常更容易限定和控制。

5. 解决方法:由于系统性风险的复杂性和广泛影响,解决它们通常需要跨部门、跨组织或跨行业的合作和综合性措施。非系统性风险通常可以通过特定个体或组织的行动来解决。

系统性风险与非系统性风险在影响范围、相互关联性、复杂性和不确定性、长期影响以及解决方法等方面存在明显的区别。

2 技术上的系统性风险

类比经济上的系统性风险,对于一家企业的技术负责人来说,技术上的系统性风险也是一个需要重点关注的点。

2.1 定义

在技术上,系统性风险指的是一个技术系统或者一个技术生态系统中,某个关键组件或者某些关键组件出现故障、漏洞、安全问题等,导致整个系统或者生态系统无法正常运行,进而引发连锁反应和影响。

例如,在云计算生态系统中,某个云服务提供商的故障可能会影响到众多企业和用户的业务运营;在物联网领域,某个智能设备的漏洞可能会导致整个物联网网络遭受攻击和瘫痪。因此,在技术领域中,识别和防范系统性风险也是非常重要的。

2.2 系统性风险和非系统性风险的不同

和经济上的系统性风险一样,技术上的系统性风险和非系统性风险也有 5 个不同点:

1. 影响范围和规模:系统性风险通常具有广泛的影响范围和规模,涉及整个技术系统或架构。它可能涉及多个组件、子系统或关键基础设施,甚至可能跨越多个应用程序或服务。非系统性风险更倾向于局部范围,通常仅影响特定的组件、功能或子系统。

2. 相互关联和依赖:系统性风险涉及到技术系统中各个组件和环节之间的相互关联和依赖关系。它们可能因为一个组件或环节的故障或问题而影响其他组件或环节的正常运行。非系统性风险更倾向于独立存在,其影响相对较为局限,不会对其他组件或环节造成波及效应。

3. 复杂性和不确定性:系统性风险通常更加复杂和不确定,因为它们涉及到多个技术组件、系统交互、数据流和相关的外部因素。这使得系统性风险的评估、预测和解决变得更加困难。非系统性风险通常更容易辨识、评估和控制,因为其范围和影响相对较小。

4. 长期影响和连锁反应:系统性风险可能导致长期的影响和连锁反应,其中一个问题可能触发多个级联故障或影响多个关键业务流程。非系统性风险的影响通常更为短期和局限,不会引起大规模的系统级问题。

5. 解决方法和复杂度:由于系统性风险的复杂性和广泛影响,解决它们通常需要跨部门、跨团队的协作,涉及多个技术专长和领域的知识。这可能需要综合性的技术改进、架构调整或系统重构。非系统性风险通常可以通过单个组件或功能的修复或改进来解决,其处理相对较为简单和局部化。

3 系统性风险的传播

在技术系统中,系统性风险通过多种方式传播,包括以下几种:

  • 级联传播:级联传播是指一个组件的故障导致其他相关组件的故障,从而在整个系统中形成一种连锁反应。这种传播方式可能导致整个系统的瘫痪,影响业务的正常运行。例如,在一个分布式计算环境中,如果某个关键任务执行节点发生故障,可能导致其他依赖于该节点的任务无法正常执行,从而引发其他节点的过载或故障。这种风险传播会在整个分布式系统内形成级联效应,可能导致整个系统瘫痪。

  • 传染传播:传染传播是指一个系统的风险通过某种途径传播给其他系统,从而导致多个系统受到相同类型风险的影响。例如,WannaCry 勒索病毒,它通过网络传播,利用 Windows 系统的一个漏洞进行攻击。当某个系统被感染后,病毒会自动搜索其他具有相同漏洞的系统,并尝试感染它们。这种风险传播方式导致了全球范围内大量系统受到勒索病毒的影响。

  • 共同暴露:共同暴露是指多个系统由于共享相同的风险因素,而同时受到该风险因素的影响。例如,多个在线服务都依赖于一个第三方身份验证服务。如果这个第三方身份验证服务出现故障或者安全漏洞,那么所有依赖它的在线服务都将面临安全风险或者无法正常运行,因为它们共同暴露在同一个风险因素下。

  • 放大效应:放大效应是指一个较小的初始风险经过多次传播和叠加,最终导致整个系统面临较大的风险。例如,在社交网络中,一个虚假信息可能经过多次转发和传播,形成恶性舆论,对整个社会产生较大的负面影响。

在技术系统中,了解这些传播方式和机制对于有效管理技术风险至关重要。

4 系统性风险的来源

系统性风险的由来可以追溯到技术系统的复杂性和相互依赖性。当一个技术系统由多个组件、流程和环节组成时,它们之间存在着相互依赖和相互作用。这种相互依赖性使得一个组件或环节的故障或问题可能会影响整个系统的运行和稳定性。

以下是一些常见的系统性风险的来源:

  • 复杂性和交互作用:技术系统的复杂性和各组件之间的交互作用可能导致系统性风险的出现。当系统变得越来越复杂,组件之间的相互依赖性增加,可能出现不可预见的问题和故障。例如,一个庞大的分布式系统可能由多个模块和子系统组成,彼此之间的相互作用可能导致系统范围的故障,如性能下降或数据不一致。

  • 外部环境因素:外部环境因素也是技术系统性风险的重要来源。例如,技术系统可能受到恶劣天气、自然灾害(如山洪地震等导致光纤断了)、供应链中断或恶意攻击等外部因素的影响。这些因素可能导致系统中断、数据丢失、安全漏洞暴露等问题。例如,一家电子商务平台可能受到网络攻击,导致用户信息泄露或交易中断。

  • 人为错误和疏忽:技术系统性风险也可能源自人为错误和疏忽。人员的操作失误、编码错误、配置错误或安全意识薄弱等问题都可能导致系统故障或数据泄露。例如,一个开发人员可能在代码中引入漏洞,导致系统容易受到攻击。

  • 技术演进和更新:技术的演进和系统的更新也可能引入系统性风险。当引入新的技术、框架或库时,可能存在兼容性问题或未知的缺陷。例如,将系统从一个版本升级到另一个版本时,可能出现功能不兼容、新增的安全漏洞或数据不一致的问题等。

  • 依赖供应商和第三方:技术系统通常会依赖外部供应商或第三方服务。这种依赖性可能带来风险。例如,如果一个关键供应商无法按时提供所需的硬件设备,可能导致项目延期或无法正常运作。另外,如果一个 CDN 第三方服务提供商的服务出现故障,可能会影响到技术系统的正常运行。

以上是一些常见的技术系统性风险的来源示例。在技术管理中,了解和识别这些来源是非常重要的,以便采取相应的措施来减轻和管理系统性风险的影响。

5 管理好系统性风险的意义

聊了这么多术语类的东西,看一下对于一个技术管理者来说,管理好系统性风险到底有什么用,有什么收益。这里我们从技术管理和技术团队,以及业务的角度来看。

5.1 技术管理上的意义

从技术管理和技术团队的角度来看,管理好技术上的系统性风险具有以下意义:

1. 保障系统的稳定性和可靠性:系统性风险管理可以帮助确保技术系统的稳定性和可靠性,减少系统故障和服务中断的可能性。这有助于降低业务中断的风险,提高技术系统的可用性和持续性,保障业务的正常运行。

2. 提高技术投资的回报率:有效管理系统性风险可以降低技术投资的风险并提高回报率。通过规避潜在的系统性风险,可以减少因系统故障或不稳定性而造成的额外成本和资源浪费,提高技术投资的效益和投资回报。

3. 增强技术管理者决策能力:系统性风险管理使技术管理者能够更全面地了解和评估技术系统的风险情况。这有助于他们做出明智的决策,选择合适的措施来降低风险,并确定优先级,以使资源和精力能够最大程度地应对最重要的风险。

4. 提高团队效率:通过管理系统性风险,技术管理者可以减少系统故障和问题的发生,从而减少紧急修复和事后处理的工作量。这使团队能够更加专注于战略性的工作,提高工作效率和生产力。

5. 增加业务可信度:有效管理系统性风险可以提高技术系统的可靠性和稳定性,增加业务的可信度。这有助于提高内部和外部利益相关者对技术部门的信任,加强与其他部门的合作和协调,为企业的可持续发展和成长奠定基础。

6. 促进技术创新和发展:管理好系统性风险有助于为技术管理者提供稳定的技术基础,支持技术创新和发展。他们可以更好地专注于推动新技术的应用、优化现有技术架构和流程,为业务增长提供技术支持和竞争优势。

5.2 业务价值上的意义

从业务价值的角度来看,管理好技术上的系统性风险具有以下意义:

1. 提高效率和生产力:通过管理系统性风险,技术系统可以更加稳定和可靠地运行,减少系统故障和问题的发生,从而减少因为系统问题导致的客诉、修复、沟通等成本。这有助于提高业务的效率和生产力,节省时间和资源,并降低运营成本。

2. 支持业务增长和扩展:有效的系统性风险管理可以为业务提供可靠的技术基础,支持业务的增长和扩展。通过降低系统故障和数据泄露的风险,技术管理者可以为业务提供稳定的平台,支持业务的创新、市场拓展和新产品的推出。

3. 支持业务创新和竞争优势:系统性风险管理为技术团队提供稳定的技术基础,支持业务的创新和发展。通过降低系统性风险,技术团队能够更好地专注于业务创新、新产品开发和市场敏捷性,从而获得竞争优势。

4. 提升用户体验和满意度:系统性风险管理有助于提供稳定、安全和高性能的技术系统,提升用户体验和满意度。用户倾向于选择那些能够提供稳定服务、快速响应和数据安全的产品或服务,有效的系统性风险管理可以增强用户对技术产品或服务的信任和满意度。

5. 降低损失和风险:有效的系统性风险管理有助于降低业务面临的潜在损失和风险。通过识别和管理系统中的风险,可以减少数据泄露、安全漏洞和技术故障所带来的损失,并降低法律诉讼和声誉损害的风险。

6. 提升客户信任和忠诚度:通过管理系统性风险,技术管理者可以建立客户信任和忠诚度。稳定、安全和可靠的技术系统能够增强客户对企业的信心,提高客户满意度和保持客户的长期合作关系。

可以看到如果能管理好系统性的风险,对于技术组织,对于技术管理者,对于业务和业务价值来说,都是一件非常好的事情。从生产效率的提升,到业务稳定性,到对成本的减少以及客户成功都是极好的。

那么如何管理系统性风险呢?

6 如何管理系统性风险

6.1 风险模型

风险模型是风险管理的第一步:理解系统中已有的风险,识别、标记并对已知的风险排列优先级,最终形成一张包含了系统所有已知风险的当前状态的表格。这就是我们所说的风险模型。

建立风险模型的过程是识别风险的过程,在这个过程中我们需要识别出系统中已有的风险,并对其进行分析,标记出优先级、梳理当前状态和历史情况。

风险模型构建过程中需要考虑模型的作用范围,是公司级的,团队级的,项目组的,还是服务级的。

对于一个小公司,可以是公司级的,对于大型一些的公司,可以考虑团队或项目级的。

风险模型至少包括以下一些方面:

  • 严重性/可能性:高中低,先评估严重性,再评估可能性
  • 风险缓和计划:可以使用的或者正在使用的用来降低该风险严重性或者可能性的风险缓和措施。
  • 监控:对该风险的发生是否进行了监控,如果监控了说明监控的指标,如果没有监控,说明原因,以及达成监控目标的原因,最终所有的风险应该是要监控起来的。
  • 状态:活跃 / 已缓和 /  正在修复 / 已解决
  • 历史风险情况:该风险在历史上有没有发生过,什么时候,发生频率等
  • 风险缓和计划:当我们制定风险缓和计划的时候,需要从严重性最高的项开始,缓和风险不是为了消除,而是为了降低风险的严重性和可能性。并不是每一个风险都要制订风险缓和计划。
  • 风险预案:当风险发生的时候,我们可以采取的措施

除此之外,还包括一些常规的添加时间,ID,负责人之类的

6.2 识别和评估系统性风险

识别系统性风险是一个关键的步骤,它需要深入分析和理解组织或项目所面临的技术环境和相关因素。以下是一些常见的技术上的系统性风险示例:

  • 依赖单点故障:系统中存在关键组件、设备或服务的单点故障,一旦出现故障,将导致整个系统或业务的中断。例如,网络设备的故障、云服务提供商的服务中断等。

  • 服务间的强弱依赖:如果系统中的服务之间存在强依赖关系,一旦其中一个服务发生故障或不可用,可能会导致整个系统的故障或性能下降。

  • 内部和外部/离线和在线业务的相互影响:系统中的离线和在线业务之间存在相互依赖关系,如果其中一个业务出现问题,可能会影响其他业务的正常运行。

  • 安全漏洞和数据泄露:系统存在安全漏洞或不当的安全措施,可能导致黑客攻击、数据泄露或信息安全问题。这可能对组织的声誉、客户信任和合规性产生严重影响。

  • 技术过时和不可维护:系统采用的技术或架构已过时,不再受支持或难以维护。这可能导致系统难以升级、演进和修复漏洞,增加系统故障和风险的概率。

  • 第三方供应商问题:系统依赖于第三方供应商提供的技术、服务或组件,但供应商出现问题,无法提供所需的支持、维护或升级。这可能导致系统中断、服务质量下降或业务受阻。

  • 文档或流程的问题,如没有文档,没有沉淀,只在某些人的脑袋里面:如果系统或流程存在缺乏文档、知识沉淀或依赖于个别人员的情况,可能会造成知识孤立和团队合作的问题,影响系统的可维护性和可扩展性。

  • 数据完整性和一致性问题:数据在系统内部或与其他系统之间的传输和处理过程中,可能遭受损坏、丢失或篡改,导致数据完整性和一致性问题。这可能对决策和业务流程产生负面影响。

  • 大规模系统故障:系统由多个组件、服务或子系统组成,如果其中一个组件出现故障,可能导致整个系统的大规模故障。例如,云服务提供商的故障、硬件故障等。

  • 法规和合规风险:系统必须符合特定的法规要求和合规标准,如果系统无法满足这些要求,将面临法律风险、罚款或业务停摆的风险。

  • 服务容量的不足:系统中的某些服务容量可能不足以应对高负载或峰值流量,这可能导致性能下降、响应时间延迟或系统崩溃。

  • 基建发布或扩容等发布操作会影响业务的情况:系统基础设施的发布操作,如服务器扩容、网络配置变更等,可能会对业务产生影响,例如服务中断或性能下降。

  • 线上配置/环境/网络等的变更:对线上系统的配置、环境或网络进行变更时,可能会引入风险,如配置错误、网络中断等,导致系统故障或不稳定。

  • 安全问题:系统面临的安全漏洞、攻击风险或数据泄露等问题可能对业务运行和用户数据安全产生重大影响。

要识别系统性风险,可以采取以下方法:

  • 审查历史数据和经验教训,了解以前的系统故障和问题。
  • 进行风险评估和风险工作坊,与团队一起识别潜在的系统性风险。
  • 与各个部门和团队合作,收集反馈和洞察,了解系统的弱点和关键风险点。
  • 借鉴行业标准和最佳实践,了解常见的系统性风险和应对方法。
  • 定期进行系统评估和安全审查,以发现潜在的系统性风险。
  • 通过识别系统性风险,组织可以有针对性地采取措施来降低风险,并确保系统的稳定性、安全性和可靠性。

6.3 风险治理

风险治理不是一个一蹴而就的事情,需要持续的来做,需要从组织,流程机制,系统工具和文化层面进行治理。

  • 组织层面:一个事情或方案想要比较好的落地,一定是有一个完整的组织来承接,至少需要有 PACE 的逻辑来支撑,明确分工。
  • 流程层面:流程层面至少要建立明确的沟通机制,如周报、例会等,同时还需要建议风险控制流程,明确制定风险识别、评估、控制和监测的标准流程,确保风险管理工作的有序进行。
  • 系统工具:理想中是希望有建立统一的风险管理信息系统,用于收集、整理和分析风险相关信息。甚至可以利用数据分析和人工智能,对潜在风险进行预测和预警,提高风险应对的时效性。简化版可以通过群、Jira 系统等项目管理工具来达到前期的系统工具落地的程度。
  • 文化层面:通过宣导、洞察、关注、固化、奖励等方式引导大家对于风险的关注,将风险意识融入日常工作中,提高大家对风险的认知,强化风险意识。

以上的组织、流程、系统工具和文化层面的治理都是为了更好的管理风险而存在。在这个过程中,风险模型是抓手,通过不停的识别风险,消除风险,缓和风险,不断提高系统变好的可能,以最终达到治理系统性风险的目标。

风险评估和应对规划是一个反复重复的过程,不停的迭代风险模型,识别出新的风险。

当风险模型构建完成后,我们需要定期逐个风险拉出来 review 一次,我们可以问我们自己如下的一些问题:

  • 与上次回顾相比,风险有更严重吗?可能性有更高吗?
  • 接下来会排专人来解决某些风险吗?是否应该安排?
  • 上次回顾安排的事项落实了,对应的风险情况如何,是否有更新到风险模型中?

问完问题,我们可能需要有一些实际的行动:

  • 评估是否有新的风险;
  • 删除旧的风险:如果风险已经解决了,可以归档;
  • 评估原有风险模型中的每一项风险,评估其严重性和可能性,如果有变动,对其进行更新;
  • 对于不同的优先级的风险区别对待。

以上的回顾操作我们在上面建设的某个管理系统来承载,并且这个管理系统是带有通知等功能,以更好的将风险相关的信息周知出去,如 Jira 系统。

7 小结

系统性风险是一个动态的概念,持续反复的监测和评估至关重要。定期审查系统的运行情况、漏洞和潜在风险,确保及时发现和解决问题,以减少系统性风险。