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

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

这就是技术债!

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

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

技术债务

技术债务(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通过一个静态分析工具来获得。

    比方两者的代码量变化:



    两者的圈复杂度:

  2. 网络化处理 (Network Multiplication)

    通过网络化处理。能够得出变更成本,一阶密度,核心代码大小的数据。

    下图为Firefox&Chromium变更成本的比較:



    下图则是Core size的对照:

  3. DSM工具。

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

    下图就是作者提供的一张Firefox 16的DSM:



    左側为直接依赖。右側为间接依赖。

更具体的内容,參考:Technical Debt in Firefox and Chromium

数据能够在这里体验:http://www.almossawi.com/firefox/

完整的文档在Github上:Tools

其大致的处理流程例如以下图:

总结

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

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

关注微信公众号交流:

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

$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('

    ').addClass('pre-numbering').hide();
    $(this).addClass('has-numbering').parent().append($numbering);
    for (i = 1; i ').text(i));
    };
    $numbering.fadeIn(1700);
    });
    });

技术债务管理以及Firefox/Chromium的债务评价的更多相关文章

  1. IT技术团队管理-总结

    摘要:此文是书籍<行之有效:IT技术团队管理之道>的读书笔记. 主要是方便自己回顾. 您也可以通过此文简要了解此书的内容. 博客: http://www.cnblogs.com/jhzhu ...

  2. CTO俱乐部下午茶:技术团队管理中的那些事儿

    摘要:"CTO下午茶"是一种有效的集体对话的模式,参加活动的成员在真诚互动和共同学习的宗旨下齐聚一堂,在喝茶聊天氛围下交流工作心得.本期"CTO下午茶"的主题是 ...

  3. 2015年6月6日,杨学明老师《IT技术人才管理角色转型与实践》专题培训在苏宁云商成功举办!

    2015.6.6,在中国南京苏宁总部,研发资深顾问.资深讲师为苏宁易购IT事业部全体产品总监.研发总监进行了为期一天的<IT技术人才管理角色转型与实践>的内训服务. 杨学明老师分别从技术人 ...

  4. 怎样看待IT界业务,技术,管理的各自比重

    怎样看待IT界业务,技术,管理的各自比重   技术是根本,业务是个人能力的体现,管理一般随意,追求简单,眼光向IBM等有优秀管理经验的大公司看齐   重点从个人的喜好.性格方面来考虑分配比重,可以加上 ...

  5. Lyft高管的技术团队管理实战

    Lyft 的技术总监沈思维分享了他对于管理技术团队和打造工程文化的经验,也欢迎添加他的微信公众号"人家的屋顶"了解更多(微信公众号ID: othersroof).沈思维毕业于密歇根 ...

  6. IT技术团队管理之成长

    ------------------------------------------------------------------ 今天先到这儿,希望对您技术领导力, 企业管理,系统架构设计与评估, ...

  7. 职业规划:管理vs技术

    "每个人都身怀天赋,但如果用会不会爬树能力来评判一只鱼,那它这辈子都会觉得自己是条蠢鱼" - 阿尔伯特.爱因斯坦 我想我为这篇博客已经准备了很长时间.但是看起了我还一直挣扎我该往哪 ...

  8. 采用DBCP连接池技术管理连接

    DBCP的使用步骤步骤一:导包,使用第三方的道具,必须导入相应的jar包. 一般需要导入两个jar包: -commons-dbcp-1.x.jar包 -commons-pool-1.x.x.jar包 ...

  9. 技术路线 vs 技术管理路线

    最近因为要给刚毕业的学生做一次演讲,所以就职业发展这类话题先以写博客的形式做一些思考,希望届时能给同学们带来质量更高的内容.我在<驾驭你的"职场布朗运动">一文中谈了2 ...

随机推荐

  1. 30.Linux-RTC驱动分析及使用

    linux中的rtc驱动位于drivers/rtc下,里面包含了许多开发平台的RTC驱动,我们这里是以S3C24xx为主,所以它的RTC驱动为rtc-s3c.c 1.进入./drivers/rtc/r ...

  2. 高效sql2005分页存储过程

    高效分页存储过程 --分页存储过程示例 Alter PROCEDURE [dbo].[JH_PageDemo] @pageSize int = 9000000000, @pageIndex int = ...

  3. Android 之旅开始了!先自我了解下Android与Linux之间的关系

    Android是在Linux2.6的内核基础之上运行的,提供核心系统服务:安全.内存管理.进程管理.网络组.驱动模型.内核部分还相当于一个介于硬件层和系统中其他软件组之间的一个抽象层次.但是严格来说它 ...

  4. Linux系列教程(二十三)——Linux的服务管理

    前面我们讲解Linux软件包管理之源码包.脚本安装包时,我们介绍了rpm包和源码包由于安装位置的不同,会对服务的启动造成影响,具体是什么,本篇博客我们来详细介绍. 1.Linux服务管理总览 我们可以 ...

  5. TFboy养成记 tf.cast,tf.argmax,tf.reduce_sum

    referrence: 莫烦视频 先介绍几个函数 1.tf.cast() 英文解释: 也就是说cast的直译,类似于映射,映射到一个你制定的类型. 2.tf.argmax 原型: 含义:返回最大值所在 ...

  6. NullSafe基于Runtime的深度解析

    Objective-C是一门动态语言,一个函数是由一个selector(SEL),和一个implement(IML)组成的. 执行一个方法时如果系统找不到方法会给几次机会寻找方法,实在没有此方法就会抛 ...

  7. web离线应用--applicationCache

    applicationCache是html5新增的一个离线应用功能 离线浏览: 用户可以在离线状态下浏览网站内容. 更快的速度: 因为数据被存储在本地,所以速度会更快. 减轻服务器的负载: 浏览器只会 ...

  8. JavaScript学习笔记(十五)——对象之Date,RegExp

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

  9. Http简单思维导图

  10. Python资料汇总(建议收藏)

    整理汇总,内容包括长期必备.入门教程.练手项目.学习视频. 一.长期必备. 1. StackOverflow,是疑难解答.bug排除必备网站,任何编程问题请第一时间到此网站查找. https://st ...