在 DevOps 中,如何应对技术债务和系统复杂性,以确保可持续的研发效能和创新?

随着业务的快速迭代和人员更迭,项目过程中产生了大量的技术债务,这些技术债务给系统的稳定性、可靠性、扩展性和可维护性等带来了较大的影响,也给团队的运维带来了浪费和挑战。我们将结合自身实践对技术债务治理和复杂度管理分别进行介绍。

技术债务治理可以参考以下步骤和方法:

  1. 识别和量化技术债务:对应用、代码、调用链路进行全面的审查,识别技术债务并量化其影响程度。
  • 维护的应用数量与代码量:识别无迭代、无流量和已下线应用,直接废弃精简,参考数据包含发布与变更情况、服务访问日志、接口调用监控;识别有效接口少的应用,考虑应用的合并与代码精简,参考数据包含应用接口调用量和访问量、调用链路中的强弱依赖、定时任务执行情况与消息的发送与消费情况等;获取代码覆盖率,识别没有调用的代码,精简无用代码可以减少代码的维护成本。

  • 代码质量指标:代码复杂度,使用代码复杂度度量工具(例如 Cyclomatic Complexity)来衡量代码的复杂程度。较高的复杂度可能导致代码难以理解、维护和扩展。代码重复率,使用代码静态分析工具来检测代码中的重复部分,并计算代码的重复率。高重复率可能导致代码冗余和维护困难。代码规范违规,通过代码静态分析工具来检查代码是否符合规范,统计规范违规的数量和严重程度。

  • 缺陷指标:缺陷密度,统计在一定时间内发现的缺陷数量,以缺陷密度(Defect Density)来衡量。较高的缺陷密度可能表示代码质量较低或测试覆盖不足。缺陷修复时间,记录和跟踪缺陷的修复时间,即从缺陷报告到修复完成的时间。较长的修复时间可能导致缺陷积累和用户体验下降。

  • 性能指标:响应时间和吞吐量,衡量系统的响应时间和处理能力,通过监控系统和性能测试工具获取相关指标。较高的响应时间和较低的吞吐量可能会影响系统性能和用户满意度。

  • 安全指标:安全漏洞数量,使用安全扫描工具或代码审查来检测和计算系统中存在的安全漏洞数量。较多的安全漏洞可能导致系统面临安全风险。

  1. 制定优先级和计划:根据技术债务的影响程度和紧迫性,制定优先级和计划,确保重要的技术债务得到及时处理。

  2. 自动化和工具支持:利用代码瘦身工具、自动化测试、持续集成和部署等工具和实践,帮助解决现有技术债务,及时识别技术债务,减少技术债务的增加。

  3. 技术债务可视化与监控:通过系统复杂度模型来反映技术债务情况,对技术债务进行数字化度量和监控,并将自动识别的技术债务在项目管理工具中创建治理任务进行跟踪,防止技术债务的累积增加和系统腐化。

  4. 持续投入治理:除了进行组织级的技术债务专项治理外,需要将技术债务列入开发迭代计划,并分配足够的资源和时间来处理技术债务,防止其不断累积。

  5. 知识共享与团队合作:发掘技术债务治理中的优秀团队,并邀请优秀团队向其他团队进行经验分享,促进技术债务的共同解决和团队成员的技术成长。

系统复杂度管理方法:技术债务的增加,表现为系统复杂度的增高。为了确保可持续的研发效能和创新,我们需要对系统复杂度进行管理,而度量是管理的有效手段之一。系统复杂度的度量模型可以考虑以下维度和指标:

  • 代码总行数:代码行数是一种简单的度量方式,用于衡量系统中的代码量和复杂性。较多的代码行数通常意味着较高的复杂性。然而,仅仅依靠代码行数可能无法准确反映系统的实际复杂性,因为不同的编程语言和编码风格可能会导致不同的代码行数,为了避免其他因素的影响,我们可以采用代码当量进行度量。

  • 有效代码总行数:有效代码行数是线上服务运行实际覆盖的代码总行数,与代码总行数类似,较多的代码行数通常意味着较高的复杂性。

  • 圈复杂度(Cyclomatic Complexity):圈复杂度是一种静态度量指标,用于衡量程序中的控制流程的复杂性。它基于程序的控制流图,计算程序中独立路径的数量。较高的圈复杂度值表示较高的复杂性。

  • 系统链路复杂度:包含系统对外强弱依赖、内部链路复杂度,对外核心接口数量等,评估系统中的应用之间的依赖关系和耦合度可以提供有关系统复杂性的信息。较高/多的依赖关系和耦合度可能意味着较高的系统复杂性。可以使用工具分析代码的依赖关系图和模块之间的耦合程度。

另外,由于由于系统不同维度的数据量级差异较大,各项指标无法直接相加生成系统整体复杂度指标,我们需要在模型中对各项指标值进行归一化处理,并设置不同的权重,对各个指标的数值指定特定的系数,进行加权后叠加得出系统的综合复杂度。我们针对各系统的复杂度设置增长阈值,监控各系统复杂度的变化。当增长超出阈值时,自动进入技术债务治理流程,由技术团队进行治理。

本文整理自思码逸出品的《研发效能100问》,原作者: 陈靖贤 去哪儿网基础研发产品总监

相关推荐
仰泳的熊猫几秒前
LeetCode:51. N 皇后
数据结构·c++·算法·leetcode
独自破碎E2 分钟前
LeetCode 381: O(1) 时间插入、删除和获取随机元素 - 允许重复
java·算法·leetcode
Miraitowa_cheems26 分钟前
LeetCode算法日记 - Day 81: 最大子数组和
java·数据结构·算法·leetcode·决策树·职场和发展·深度优先
Jm_洋洋29 分钟前
【Linux系统编程】程序替换:execve(execl、execlp、execle、execv、execvp、execvpe)
linux·运维·c语言·开发语言·程序人生
冯诺依曼的锦鲤1 小时前
算法练习:前缀和专题
开发语言·c++·算法
闭着眼睛学算法1 小时前
【双机位A卷】华为OD笔试之【哈希表】双机位A-跳房子I【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解
java·c语言·c++·python·算法·华为od·散列表
自信150413057592 小时前
初学者小白复盘15之指针(4)
c语言·数据结构·算法
郝学胜-神的一滴2 小时前
Cesium绘制线:从基础到高级技巧
前端·javascript·程序人生·线性代数·算法·矩阵·图形渲染
橘颂TA2 小时前
【Linux】 层层递进,抽丝剥茧:调度队列、命令行参数、环境变量
linux·运维·服务器·c/c++
七夜zippoe2 小时前
压缩与缓存调优实战指南:从0到1根治性能瓶颈(四)
运维·docker·容器