技术负债与破产

2017-02-04  本文已影响0人  爪哇

技术负债(Technical Debt),也叫设计负债(Code debt)代码负债(code debt) 是用来描述,在软件开发过程中,为了满足超量的开发需求,使用临时简便的解决方法,取代全面解决方案,所带来的问题

与金融负债一样,技术负债也会产生和积累利息,导致后继的开发和变更更加困难。没有偿还的技术负载会增加“软件熵(Software entorpy)"

技术负载的产生

技术负债产生的原因包括以下方面(看看我们中几枪):

  1. 业务压力
    为了满足业务的快速要求,在必要的修改并没有完成时就匆匆发布,这些未完成的修改形成技术负债。
  2. 缺少过程和理解
    业务人员不清楚不理解技术负债的概念,在决策时不考虑其带来的影响。
  3. 模块之间解耦不够
    功能没有模块化,软件柔性不够,不足适应业务变化的要求。
  4. 缺少配套的测试
    导致鼓励快速而风险很大的“创可贴”式的BUG修复。
  5. 缺少文档
    只有代码没有必要的支撑文档。
  6. 缺少协作
    组织中的知识共享和业务效率低,或者初级开发者缺少必要的指导
  7. 并行开发
    同时在并行的多个分支最终需要进行合并,如果过多的修改在独立进行,可能会形成技术负债。
  8. 重构延迟
    在开发的过程中,某些部分的代码会变得难以控制,这时候就需要进行重构,以适应将来的需求变化。重构越是推迟,这些已有的代码被使用的越多,形成的技术负债就越多,直到重构完成。
  9. 不遵循标准
    忽略已有的业界标准、框架和技术。最终都会需要与现有的系统进行整合,越早做,影响越小。
  10. 缺少技能
    有时,开发者确实只是不知道如何编写优雅的代码。
  11. 缺失所有者(Lack of ownership)
    在软件外包时会发生,有时需要对外包出去的代码重构。
  12. 技术领导能力差
    糟糕的命令传达下去只会增加技术负载,而不是减少。
  13. 最后时刻的变更(Last minute specification changes)
    这些变更有可能影响到整个项目,但却没有时间或预算进行确认。

技术负债的类型

FolwerTechnicalDebtQuadrant 一文中,根据“鲁莽-谨慎”和“故意-无意”两个维度对技术负载进行了分类:

  1. 鲁莽而故意的技术负债
    团队没有时间做设计,仅给出一个匆忙做出的方案,缺乏对质量的预见;
  2. 谨慎而故意的技术负债
    尽管有很多已知的缺陷,但团队必须现在就交付,同时对造成的后果心中有数;
  3. 鲁莽而无意的技术负债
    团队压根就不知道基本的设计原则,更不用说故意引入了;
  4. 谨慎而无意的技术负债
    那些拥有优秀设计师的团队很容易遇到这种情况。他们交付的方案具有商业价值,但在完成方案后才明白什么才是最好的方案。

技术负债的偿还

技术负债必须及时偿还。一个有能力的技术团队应该承担更多的第二种(谨慎而故意)类型的技术负载,并且非常清楚自己的偿还能力。这些行动包括:

  1. 对技术架构重新的梳理
    对于没有及时进行模块划分的功能进行梳理,使之符合整体的设计原则;
  2. 对关键代码的重构
    对即将失去控制的模块代码重构,以适应未来需求的变化;
  3. 新技术的引入
    采用更加适合的技术取代临时的解决方案
  4. 补充文档
    对缺失的必要的支持文档进行补充完善
  5. 加强测试
    对于未能覆盖的功能补充测试
  6. 加强人员培训
    提升人员的开发能力,包括补充人员。注意,给一个交付压力巨大的团队增加新人,是在火上浇油,是在增加技术负债而不是减少技术负债。
  7. 提升技术管理能力
    对有问题的技术决策和管理流程进行优化,提升开发的纪律

技术负债的后果

技术负载并不是一件坏事,事实上,适度的技术负债是快速推动业务发展的保障。就如同金融行业鼓励大家使用信用卡一样,适度的技术负债是信誉和技术能力的体现。一个成熟的团队能够非常清楚自己的技术负债,并且具有很强的偿还能力,可以很快从巨大的交付压力中恢复。但一个新的团队,盲目的增加技术负债是非常危险的一件事情。缺少经验和能力,无法准确评估自己的债务和偿还能力,很容易导致失控。

如同金融负债一样,技术负债会产生利息,并且这个利息会越滚越多,甚至最后都无法计算其带来的影响。将承担着技术负债的代码发布到生产系统,就是提升负债的利率。

技术负债是造成发布延期,项目进度失控的一个重要原因。当发现延期越来越多,质量越来越不可控,就意味着技术负债已经带来很大影响。开发人员花的大量工作是在偿还技术负债带来的利息,而不是有效生产。

一味要求技术团队赶进度,都是2,3天之后就要求功能上线,是在透支使用技术团队。长此以往,将会导致技术团队破产。轻则系统失控,任何一点小的功能都会导致无可预知的问题,质量无法保障,运营成本剧增。重则丧失品牌信誉,甚至导致法律纠纷,错失市场机会。

上一篇下一篇

猜你喜欢

热点阅读