第一次发布代码,就好比借了一笔钱。只要通过不断重写来偿还债务,小额负债可以加速开发。但久未偿还债务会引发危险。复用马马虎虎的代码,类似于负债的利息。整个部门有可能因为松散的实现,不完全的面向对象的设计或其他诸如此类的负债而陷入窘境。 ---维基百科

简介

技术负债(英语:Technical debt),又译技术债,也称为设计负债(design debt)、代码负债(code debt),是编程及软件工程中的一个比喻。指开发人员为了加速软件开发,在应该采用最佳方案时进行了妥协,改用了短期内能加速软件开发的方案,从而在未来给自己带来的额外开发负担。这种技术上的选择,就像一笔债务一样,虽然眼前看起来可以得到好处,但必须在未来偿还。软件工程师必须付出额外的时间和精力持续修复之前的妥协所造成的问题及副作用,或是进行重构,把架构改善为最佳实现方式。

1992年,沃德·坎宁安首次将技术的复杂比作为负债。 ---维基百科

通俗易懂的例子:

技术债务类似于金融债务。软件开发就像是去“贷款”,而技术债务就像是它的“利息”,“利息”是需要以未来额外的时间来还的。重构才相当于是支付“本金”。

技术负债的产生原因

  1. 业务压力:为了满足业务的快速要求,在必要的修改并没有完成时就匆匆发布,这些未完成的修改就形成了技术负债。
  2. 缺少过程和理解:业务人员不清楚不理解技术负债的概念,在决策时就不会考虑到其带来的影响。
  3. 模块之间解耦不够:功能没有模块化,软件柔性不够,不足适应业务变化的要求。
  4. 缺少配套的自动化测试:导致鼓励快速而风险很大的“创可贴”式的BUG修复。
  5. 缺少必要文档:需求和代码都没有必要的支撑性文档或注释。
  6. 缺少协作:组织中的知识共享和业务效率较低,或者初级开发者缺少必要的指导。
  7. 重构延迟:在开发的过程中,某些部分的代码会变得难以控制,这时候就需要进行重构,以适应将来的需求变化。重构越是推迟,这些已有的代码被使用的越多,形成的技术负债就越多,直到重构完成。
  8. 不遵循标准或最佳实践:忽略了已有的业界标准、框架、技术和最佳实践。
  9. 缺少相关技能:开发人员有时候技能缺失,并不知道如何编写优雅的代码。

技术债务的危害

技术负债的“利息”会越滚越多,甚至最后都无法计算其带来的影响。将有技术负债的代码发布到生产系统,就是提高了“利息”的“利率”。最终将会导致技术团队破产,质量无法保障。

技术债务衡量(SQALE & SonarQube)

SQALE (Software Quality Assessment based on Lifecycle Expectations) is a method to support the evaluation of a software application source code. It is a generic method, independent of the language and source code analysis tools. ---wikipedia

SQALE(基于生命周期期望的软件质量评估)是一种支持软件应用程序源代码评估的方法。它是一种通用方法,独立于语言和源代码分析工具。

SonarQube 中的技术债务就是基于SQALE方法,是通过代码规则和问题来实现的。

SonarQube 项目技术债务

SonarQube 代码技术债务详情

SonarQube 技术债务配置

SonarQube SQALE 商业插件提供更详细的报告

原图链接:https://www.bitegarden.com/img/sonarqube-sqale/sonarqube-sqale-dashboard.png

技术债务解决(SonarQube)

SonarQube 已经详细的列出了技术债务相关的所有指标和问题,也有很完善的管理和推荐解决方案。

SonarQube 问题中推荐的解决方法

我强烈推荐大家使用 SonarQube 来管理和解决技术债务。

后续我会写关于 SonarQube 的系列文章,大家敬请期待~

参考资料

技术债务(Technical debt)的产生原因及衡量解决的更多相关文章

  1. 技术债务管理以及Firefox/Chromium的债务评价

    如今的软件开发是在遍地敏捷,人人讲唯快不破的时代,哪有人有时间思考代码质量,设计的质量? 哪个又不是从一堆代码中杀出血路来实现还有一个功能?一个产品都存活不了几年,何必考虑什么可维护性? 我们追求进度 ...

  2. [Android]使用MVP解决技术债务(翻译)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5892671.html 使用MVP解决技术债务 原文:https ...

  3. DevOps 和技术债务偿还自动化

    当企业想要迁移到一个 DevOps 模型时,经常需要偿还高等级的技术债务 说得更明确一点,机构往往陷入「技术债务的恶性循环」中,以至于任何迅速.敏捷的迁移方式都无法使用.这是技术债务中的希腊债务危机水 ...

  4. Technical debt

    What is Technial debt? Technical debt is not bug. It is that the feature can work, but it is not a p ...

  5. JavaScript中的ParseInt("08")和“09”返回0的原因分析及解决办法

    今天在程序中出现一个bugger ,调试了好久,最后才发现,原来是这个问题. 做了一个实验: alert(parseInt("01")),当这个里面的值为01====>07时 ...

  6. (转)MySQL出现同步延迟有哪些原因?如何解决?

    http://oldboy.blog.51cto.com/2561410/1682147----MySQL出现同步延迟有哪些原因?如何解决? 原文:http://www.zjian.me/mysql/ ...

  7. Code:Blocks 中文乱码问题原因分析和解决方法

    下面说说修改的地方. 1.修改源文件保存编码在:settings->Editor->gernal settings 看到右边的Encoding group Box了吗?如下图所示: Use ...

  8. 一次接口压力测试qps极低原因分析及解决过程

    一次接口压力测试qps极低原因分析及解决过程 9-2日在做内部的性能测试相关培训时,发现注册接口压力测试qps极低(20左右),这个性能指标远不能达到上线标准 ,经过一系列调试,最后定位 98%的时间 ...

  9. External Libraries中没有Maven的jar包的原因(已解决)

    **深坑!** ## External Libraries中没有Maven的jar包的原因(已解决) 2021年3月1日 --- 搭建一个新项目 IDEA 从 Git 上拉 拉去Maven项目然后 m ...

随机推荐

  1. Kubernetes中Pod健康检查

    目录 1.何为健康检查 2.探针分类 2.1.LivenessProbe探针(存活性探测) 2.2.ReadinessProbe探针(就绪型探测) 3.探针实现方法 3.1.Container Exe ...

  2. HTML节点操作

    HTML节点操作 HTML节点的基本操作,添加节点,替换节点,删除节点,绑定事件,访问子节点,访问父节点,访问兄弟节点. 文档对象模型Document Object Model,简称DOM,是W3C组 ...

  3. Django-jwt token生成源码分析

    一. 认证的发展历程简介 这里真的很简单的提一下认证的发展历程.以前大都是采用cookie.session的形式来进行客户端的认证,带来的结果就是在数据库上大量存储session导致数据库压力增大,大 ...

  4. Selenium系列(六) - 强制等待、隐式等待、显式等待

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...

  5. TPYBoard v202开发板通过I2C协议驱动oled

    最近无聊的时候研究了一下TPYBoard v202开发板,发现网上TPYBoard开发驱动oled的这块资料比较少,本人测试成功后给大家分享一下经验 下面通过代码讲解一下 1.首先需要导包, 在网上下 ...

  6. 2020面试整理【java】

    spring面试题 1.你对spring的理解 Spring 是个Java企业级应用的开源开发框架. Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用. Sprin ...

  7. ArcGIS Desktop的安装

    1.双击ArcGIS Desktop安装目录下的Setup.exe. 2.点击“下一步”. 3.选择“我接受许可协议(A)”,点击“下一步”. 4.选择“完全安装”,点击“下一步”. 5.点击“更改” ...

  8. 访问修饰符public,private,protected,以及不写(默认)时的区别?

    private: 1.在当前类开发中,main方法之外可以直接借助名字使用,当前类的main方法中可以使用对象打点的方式直接使用成员. 2.在当前类之外,使用对象(或是类名,针对静态的)打点调用都是被 ...

  9. Python turtle库的应用——蛇

    turtle库介绍 1.Turtle中的turtle.setup()函数用于启动一个图形窗口,它有四个参数 turtle.setup(width, height, startx, starty) 分别 ...

  10. 原生js判断手机端页面滚动停止

    var topValue = 0,// 上次滚动条到顶部的距离 interval = null;// 定时器 contactsList = document.getElementById(" ...