胖胖的枫叶
主页
博客
产品设计
企业架构
全栈开发
效率工具
数据分析
项目管理
方法论
面试
  • openJdk-docs
  • spring-projects-docs
  • mysql-docs
  • redis-commands
  • redis-projects
  • apache-rocketmq
  • docker-docs
  • mybatis-docs
  • netty-docs
  • journaldev
  • geeksforgeeks
  • 后端进阶
  • 并发编程网
  • 英语肌肉记忆锻炼软件
  • 墨菲安全
  • Redisson-docs
  • jmh-Visual
  • 美团技术
  • MavenSearch
主页
博客
产品设计
企业架构
全栈开发
效率工具
数据分析
项目管理
方法论
面试
  • openJdk-docs
  • spring-projects-docs
  • mysql-docs
  • redis-commands
  • redis-projects
  • apache-rocketmq
  • docker-docs
  • mybatis-docs
  • netty-docs
  • journaldev
  • geeksforgeeks
  • 后端进阶
  • 并发编程网
  • 英语肌肉记忆锻炼软件
  • 墨菲安全
  • Redisson-docs
  • jmh-Visual
  • 美团技术
  • MavenSearch
  • 标签索引
  • 2024年

    • 配置Mac环境
    • 业务知识会计管理
    • 业务知识会计基础
    • 业务知识什么是财务
  • 2023年

    • 项目 Boi
  • 2022年

    • 企业架构故障管理
    • 企业架构开发债务
  • 2021年

    • Python3.8 Matplotlib员工数据分析
    • Python3.8 Matplotlib IP折线图
    • Python3.8 词云 IP地址
    • Redis RediSearch
    • Rust第一个CLI程序
    • Rust所有权
    • Rust函数与控制流
    • Rust变量与数据类型
    • Rust入门
    • 企业架构分布式系统
    • 编程式权限设计
    • Java JVM优化
    • SpringBoot MyBatis 批量
    • SpringBoot 测试Mock
    • SpringBoot Redis布隆过滤器
    • CentOS7 Jenkins 部署
    • SpringBoot WebClient
    • Docker Drone 部署
    • SpringBoot MyBatis
    • SpringBoot Redisson
    • SpringBoot MyBatis 雪花算法
    • Java Netty
    • Redis 扫描
    • CentOS7 Jenkins本地部署分级
    • Mac 安装 Neo4j Jupyter
    • Mac OpenJDK11 JavaFX 环境
    • Mac 安装 Jenv
    • SpringBoot Redis 延时队列
    • SpringBoot MDC日志
    • SpringBoot 定时任务
    • CentOS7 Nginx GoAccess
    • SpringBoot MyBatis 分析
    • SpringBoot Lucene
    • 企业架构分布式锁
    • 学习技巧减少学习排斥心理
    • SpringBoot 动态数据源
    • Docker Compose SpringBoot MySQL Redis
    • SpringBoot 阻塞队列
    • Docker Compose Redis 哨兵
    • Docker Compose Redis 主从
    • 网络通信
  • 2020年

    • SpringBoot 延时队列
    • MySQL基础(四)
    • Java 雪花算法
    • Redis Geo
    • 网络通信 Tcpdump
    • Spring SPI
    • Java Zookeeper
    • SpringBoot JMH
    • 网络通信 Wireshark
    • Docker Compose Redis MySQL
    • CentOS7 Docker 部署
    • Netty 源码环境搭建
    • MySQL基础(三)
    • CentOS7 Selenium运行环境
    • CentOS7 Nginx HTTPS
    • Java JMH
    • SpringBoot 修改Tomcat版本
    • Java Eureka 钉钉通知
    • SpringBoot 错误钉钉通知
    • Java JVM
    • Git 合并提交
    • CentOS7 OpenResty 部署
  • 2019年

    • Redis CLI
    • CentOS7 Nginx 日志
    • 编程式代码风格
    • IDEA 插件
    • Skywalking 源码环境搭建
    • SpringBoot Redis 超时错误
    • 编程式 gRPC
    • Java Arthas
    • Docker Compose Redis 缓存击穿
    • Docker ElasticSearch5.6.8 部署
    • Docker Mysql5.7 部署
    • Spring Redis 字符串
    • Docker Zookeeper 部署
    • Docker Redis 部署
    • SpringBoot Dubbo
    • CentOS7 CMake 部署
    • 应用程序性能指标
    • Java Code 递归
    • CentOS7 ELK 部署
    • CentOS7 Sonarqube 部署
    • Java Selenium
    • Java JJWT JUnit4
    • Spring 源码环境搭建
    • Java JUnit4
    • Java Web JSON Token
    • 编程式 FastDFS
    • Java XPath
    • Redis基础(二)
    • Redis基础(一)
    • Java MyBatis JUnit4
    • Java MyBatis H2 JUnit4
    • MyBatis 源码环境搭建
    • Git 配置
    • Java 核心
    • Java Dubbo
    • Java JavaCollecionsFramework
    • Java Maven
    • Java MyBatis
    • Java Spring
    • Java SpringMVC
    • MySQL
    • Redis
  • 2018年

    • Java HashMap
    • Java HashSet
    • Java Code 交换值
    • Spring Upgrade SpringBoot
    • Mac 编程环境
    • Java Log4j
    • 网络通信 Modbus
    • MySQL基础(二)
    • MySQL基础(一)
    • Java Stack
    • Java Vector
    • CentOS7 RabbitMQ 部署
    • CentOS7 Redis 部署
    • CentOS7 MongoDB 部署
    • CentOS7 基础命令
    • Java Eureka Zookeeper
    • CentOS7 MySQL 部署
    • Git 分支
    • CentOS7 Java环境配置
    • Java LinkedList
    • Java ArrayList
    • Spring Annotation Aop

企业架构开发债务

近期在处理公司项目历史债务问题,由于客观历史原因导致。为了快速收益初期不知情况下产生。定期不清理债务导致。

综合债务偿还规划

根据当前情况,除重写策略以外,其他策略同时进行。按阶段将债务问题逐步偿还。根据阶段性成果适当调整下个阶段的重点工作。

  • 达成共识 > 债务可见 > 及时止损 > 不断改善。

债务的体现

  • 代码在不同项目中复制迁移,并随着时间增加。
  • 代码虽然运行稳定,但是回归测试成本在增加。
  • 迭代维护越来越困难。
  • 新的feature开发周期越来越长,ROI降低。
  • 影响开发人员心态。

技术债务的组成

  • 代码债务:代码重复、坏味道、代码风格混乱、魔法值、条件太多、异常处理、代码风险、安全风险、严重耦合。
  • 设计债务:缺少设计、对非功能性认知不足,系统性风险。
  • 测试债务:缺乏测试、测试覆盖率不足和不使用测试。
  • 质量债务:缺乏稳定和健壮性的技术验证,版本控制模糊,环境参数混乱。
  • 文档债务:无技术文档、设计文档或者文档过期。

技术债务利息

技术债务和贷款买房的思维模式一样,如果借技术债务的收益大于利息的时候,大胆借!

  • **开发速度降低:**通常项目正常情况下,在相同的时间间隔下,完成的任务是接近的。随着项目的迭代,项目单位时间内能完成的任务数明显下降,那很可能是技术债务太多导致的。
  • **单元测试代码覆盖率低:**现在大部分语言都有单元测试覆盖率的检测工具,通过工具可以很容易知道当前项目单元测试覆盖率如何,如果覆盖率太低或者下降厉害,就说明存在技术债务了。
  • **代码规范检查的错误率高:**静态代码分析工具提示的代码债务太多,存在大量历史代码就需要处理。
  • **在线bug越来越多:**正常情况下,如果没有新功能开发,Bug 数量会越来越少。但是如果 Bug 数量下降很慢,甚至有增多的迹象,额外增加研发成本、不稳定的产品质量、难以维护的代码。
  • **业务共识问题:**理解需求需要时间,加入一个新功能需要写 100 行代码,只要花 20 分钟。但是搞清楚这 100 行代码,应该加到哪个文件里,关联那些系统需要超长时间。

债务偿还策略

策略并没有绝对好坏,需要根据当前项目场景灵活选择。有个简单原则可以帮助你选择,那就是看哪一种策略投入产出ROI更好。

  • 重写:推翻重来,一次还清。
  • 维持:修修补补,只还利息。
  • 重构:新旧交替,分期付款。
  • 投资:好的架构设计、高质量代码就像一种技术投资,能有效减少技术债务的发生。
  • 测试:日常能做好代码审查、保障单元测试代码覆盖率,预防技术债务。
  • 还债:因为进度时间紧等客观原因,导致不得不走捷径,那么就应该把欠下的技术债务记下来,放到任务跟踪系统中,安排在后续的开发任务中,及时还债及时解决,就可以避免债务越来越多。

规划共识

防止技术债务产生的主要方法是了解开发团队存在的技术债务。开发团队必须全面了解技术债务,以及债务对项目的影响。合适的流程可以帮助开发团队避免技术债务积累,例如代码、设计、架构和测试的审查等。而且,这些流程必须是务实的,否则事与愿违。

  • PDCA(Plan-Do-Check-Act)它最早来⾃于质量管理领域,意思是做任何事情,都要经过规划(Plan)、执⾏(Do)、检查 (Check) 和⾏动 (Act) 这四个步骤。这四个步骤提供了⼀个简易的思考和做事框架。这个循环并不是运⾏⼀次就结束了,⽽是周⽽复始、螺旋上升的。
  • WBS(Work Breakdown Structure)任务分解。识别依赖及各环节关键路径,定义完成标准,达成共识并公开透明,变更即时调整。
  • MVP(Minimum Viable Product)最⼩化可实⾏产品。来自产品开发,不要⼀下⼦做⼀个「尽善尽美」的产品,⽽是先花费最⼩的代价做⼀个「可⽤」的产品原型,去验证这个产品是否有价值、是否可⾏,再通过迭代来完善细节。
  • ROI(Return on Investment)投资回报率,通常在广告业务作为重要的衡量标准。因为它是衡量广告投放花费的资金是否对于公司业务产生良好的实际影响,例如产生潜在客户、增加销售额、提升品牌知名度或者推动其他有价值的客户活动。
  • 效率先行。开发过程越快越好,越快越有竞争力。这的确是软件开发,尤其是互联网行业软件开发的不二法则。

实施步骤

  1. 团队内债务认知建立,技术债务会直接影响到公司业务的成长,间接影响个人的成长。
    • 技术债务产生的负作用,将直接影响相关业务线的发展。
  2. 采用低成本的方式进行预防。
    • 强化开发人员时间管理认知,帮助开发人员更好的安排时间高效完成工作。
  3. 识别债务并标记。
    • 服务、组件依赖混乱;文件、函数、包内容太多职责不清晰。
    • 魔法值、炫技、复杂设计、无设计。函数、接口、参数过多。
  4. 采用PDCA的方式循环迭代。
    • 标记出存在的负债问题。集中汇总到bug池。关联相关业务线。
    • 梳理业务边界,统一代码风格、完善开发文档、接口文档、接口单元测试。降低开发人员协调共识周期长的问题。
  5. 采用WBS方式标记、处理、公开相关问题。
    • 优先处理服务稳定性问题、线上紧急bug问题。
    • 根据bug与业务的关系程度划分处理级别。
  6. 采用MVP方式逐步迭代项目。
    • 落地持续改进能力;快速的增量交付。
    • 提早集成与测试;让问题得以及时暴露,带来了更快的反馈及应对。
    • 及时规避⻛险;意外仍然会有,但⼤多数情况下,急早发现问题,避免更⼤的影响。
    • 降低发布周期;降低修复试错成本。
最近更新: 2025/12/27 18:51
Contributors: 庆峰
Prev
企业架构故障管理
Next
Python3.8 Matplotlib员工数据分析