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

2023-12-28 10:30

本文主要是介绍技术债务管理以及Firefox/Chromium的债务评价,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

我们追求进度的时候,总是要牺牲些东西。或是破坏了一些东西等着后面补。

这就是技术债!

管理不好,债台高筑,即使不破产,也是要拆东墙。补西墙的玩平衡。

现实是残酷的。但不影响我们抬头看看这个世界。

技术债务

技术债务(Technical Debt)这个词,我最早是从InfoQ关于Uber的一个訪谈中了解到的,正好也在思考持续重构的问题,发现它是推动持续重构的有效工具。

所以花了点时间做些学习,在这里做个分享,主要来自这篇文章的学习,有时间的直接看原文就好了:
Technical Debt in Firefox and Chromium

关于技术债务。并非新名词,就不考据它的历史了。事实上非常多团队都有相似的工具,比方:问题记录。优化点,TODO List等等。可是一般是比較松散。大杂烩式的,不系统。

我总结之前没有管理好有两点:

  1. 范围太大
    在一篇IEEE 2012一期的文章(Technical Debt:From metaphor to Theory and Practice)里也强调了一个重要的观点,Technical Debt不要同需求和Bug搞在一起, 应当聚焦在对未来有负作用的设计和实现,通常都是无法直接感知的。比方性能优化到多少多少,这不是技术债务。

    回忆曾经做的优化点,太过于聚焦于功能,更像为了未来开发工作安排的參考。

  2. 缺少到位的管理
    假设一件事仅仅是追求锦上添花。它自然就会被排到低优先级。然后。太天真了,事实上没有然后了。

对策就不说了,这是一个管理问题,见仁见智。假设没有意识。或者正如开头说的。假设认为没有必要的话,确实不须要做什么,由于大家都几乎相同。

假设想要做。我们怎样定义和评估技术债务呢? 向率先者学习!

FireFox和Chromium都算是比較大的开源项目了。各自是280万行和470万行的规模。看看他们的总结就是非常好的学习了。核心是以量化的方式评价和管理代码,工具是基于SciTools Understand。(事实上以发现&记录的方式也非常好,这里仅仅是作为參考的方式。

)

技术债务的量化 (即代码质量的评价)

主要来自How maintainable is the Firefox codebase?

要优化,就要先定义问题和评价的标准。
下面代码质量评价的维度:

  1. LOC (代码行数)
    代表了代码的规模。能够用这个:cloc
    代码量越大。系统的复杂越高,可是相对的Bug率反而越低。

    评估的对象没有说明。显然是针对设计良好的系统。

    假设架构设计良好。而且大家都遵守,这样新增的功能都会集中以组件的形式实现。并不会改变接口,这是Bug没有扩散的原因。

  2. 圈复杂度
    不多说了。不知道的看这里:圈复杂度评价及工具。假设要严谨的定义,以软件project类书中的定义为准。

  3. 一阶密度 (First-Order Density)
    用于评估文件间的直接依赖程度,由于是直接依赖。所以是一阶。里面仅仅有A和B的关系。相应的工具是DSM, Design Structure Matrix。Github上能够找到一个工具,我没有试过。

  4. 变更成本 (Propagation Cost)
    评估任意的改一个文件,平均会影响到多少文件。

    它能够反应直接依赖的一阶关系,也能够随着间接依赖层次上升的高阶关系。
    这也是一个衡量架构设计的重要指标。欢迎推荐相关的工具。

  5. 核心代码大小 (Core size)
    所以核心代码,是从依赖关系上定义的。假设文件间有着环形依赖形式的高度依赖就是所谓的核心代码。非常多研究已经证明,这类的代码量越小,Bug就越少。

工具

  1. 代码静态分析工具
    LOC, 圈复杂度,以及依赖关系这些都easy通过一个静态分析工具来获得。


    比方两者的代码量变化:
    loc
    两者的圈复杂度:
    mccabe

  2. 网络化处理 (Network Multiplication)
    通过网络化处理。能够得出变更成本,一阶密度,核心代码大小的数据。
    下图为Firefox&Chromium变更成本的比較:
    progation cost
    下图则是Core size的对照:
    core size

  3. DSM工具。
    DSM事实上非常easy。就是描写叙述系统中各个元素的有无关系。横轴和纵轴都是系统各个元素,假设i,j有关联。则矩阵中(i,j)就是为true,或者作个标记。


    下图就是作者提供的一张Firefox 16的DSM:
    Firefox16 DSM
    左側为直接依赖。右側为间接依赖。

更具体的内容,參考:Technical Debt in Firefox and Chromium
数据能够在这里体验:http://www.almossawi.com/firefox/
完整的文档在Github上:Tools
其大致的处理流程例如以下图:
processing

总结

技术债务的定义仅仅是參考。更重要的还是意识和运行。

有了基本概念和意愿。运行的工具就非常灵活,全然一个技术管理的行为。

关注微信公众号交流:
20150705201941850

转载请注明出处: http://blog.csdn.net/horkychen

这篇关于技术债务管理以及Firefox/Chromium的债务评价的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/545637

相关文章

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

Qt如何实现文本编辑器光标高亮技术

《Qt如何实现文本编辑器光标高亮技术》这篇文章主要为大家详细介绍了Qt如何实现文本编辑器光标高亮技术,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录实现代码函数作用概述代码详解 + 注释使用 QTextEdit 的高亮技术(重点)总结用到的关键技术点应用场景举例示例优化建议

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

Java中的登录技术保姆级详细教程

《Java中的登录技术保姆级详细教程》:本文主要介绍Java中登录技术保姆级详细教程的相关资料,在Java中我们可以使用各种技术和框架来实现这些功能,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录1.登录思路2.登录标记1.会话技术2.会话跟踪1.Cookie技术2.Session技术3.令牌技

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

基于Python+PyQt5打造一个跨平台Emoji表情管理神器

《基于Python+PyQt5打造一个跨平台Emoji表情管理神器》在当今数字化社交时代,Emoji已成为全球通用的视觉语言,本文主要为大家详细介绍了如何使用Python和PyQt5开发一个功能全面的... 目录概述功能特性1. 全量Emoji集合2. 智能搜索系统3. 高效交互设计4. 现代化UI展示效果

Mysql中的用户管理实践

《Mysql中的用户管理实践》:本文主要介绍Mysql中的用户管理实践,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录13. 用户管理13.1 用户 13.1.1 用户信息 13.1.2 创建用户 13.1.3 删除用户 13.1.4 修改用户

Web技术与Nginx网站环境部署教程

《Web技术与Nginx网站环境部署教程》:本文主要介绍Web技术与Nginx网站环境部署教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Web基础1.域名系统DNS2.Hosts文件3.DNS4.域名注册二.网页与html1.网页概述2.HTML概述3.

linux服务之NIS账户管理服务方式

《linux服务之NIS账户管理服务方式》:本文主要介绍linux服务之NIS账户管理服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、所需要的软件二、服务器配置1、安装 NIS 服务2、设定 NIS 的域名 (NIS domain name)3、修改主