处理技术债务的5个技巧


听了最近的.Net Rocks show about Technical Debt我想我会分享一些关于处理技术债务的技巧。

我担心“技术债务”是否只是我们给事物贴上的标签,这样我们就不必去想它们。例如,“我们知道这将产生技术债务,我们可以在将来的某个时候再回来。”不过,这并不要求我们现在尽最大努力减轻债务的后果。

最简单地说,技术债务只是开发软件时(有意或无意地)做出的决策的后果或副作用的名称。因此,处理技术债务可以归结为处理过去决策的后果。幸运的是,有很多方法可以让软件开发更容易处理这些后果并减轻它们的影响。

  1. 对系统进行高水平的自动化测试。不管你怎么称呼它们,你都需要测试来验证应用程序/系统在高层次上工作,而不仅仅是在方法/类层次上。当有可能验证系统做了它应该做的事情时,它消除了与改变它的方式相关的风险,即改变代码以消除债务,但不破坏整体功能。这是避免解决债务问题出现倒退和负面副作用的关键。
  2. 记住童子军规则。(离开营地/代码比你发现的要好。)如果在进行某项工作时,您发现一些现有的代码需要改进,并且您可以做一些事情来改进它,而不会使它偏离您最初关注的任务,那么您应该进行这样的改进。当然,这取决于允许代码园艺的工作文化。
  3. 允许代码园艺。就像在一个真正的花园里,你可能会整理一些树叶,拔起一棵杂草,或者修剪树篱上的一根树枝,作为花园一般维护的一部分,还有一些一般的维护任务也可以通过代码来完成。这与童子军规则非常相似,但有一个重要的要求,即必须允许与你应该从事的工作无关的代码。假设你正在研究特性Y,它涉及到修改类X。使用童子军规则,你可以对类X进行其他修改来改进它。在代码园艺中,对完全不相关的类Z进行修改也是可以接受的。假设你只是碰巧浏览了一下类Z,注意到了一个你可以很容易做出的改进。如果代码园艺是允许的,那么你现在可以改进它。如果代码园艺不被允许,那么可能发生的最好的事情就是在将来的某个时候引发一个bug来改进Z类。然而现实是,这是一个低优先级的错误,因此永远不会出现在时间表上。错过了对软件进行增量改进的机会,因此整体质量的缓慢下降仍在继续。需要注意的是,要做到这一点,需要允许少量频繁的签入(而不是每个功能策略一次签入),并且使用分支策略,允许这样的小改进很容易单独进行。
  4. 对重要的变更实施代码审查。您可以通过使用代码评审来降低代码区域的总线系数低的风险,或者降低项目中没有人愿意冒险触及的风险。代码评审有很多好处,但这里重要的一点是,在评审上签字的人同意,如果原始作者不在,他们将来能够支持它。这不是分配责任或指责。这是为了确保原始代码足够清晰,以便另一个开发人员能够理解已经创建了什么。如果没有人愿意签署一个评论,因为他们不能支持维护它-改进代码,直到有人同意他们可以。
  5. 在代码中使用“为什么和”注释来解释故意债务。代码中的注释通常是一件坏事。所有东西都是平等的,代码应该是不言自明的。你不应该需要代码来解释一段代码在做什么或者它是如何做的。但是,如果一段代码为什么以这种方式编写还不清楚的话,那么就有了对注释的普遍需求。从商业角度来看,有时截止日期至关重要。你可能不得不进行一次卑鄙的黑客攻击,才能在最后期限前完成任务。这是一个注释有用的例子。仅仅添加一条评论来承认黑客攻击(或者其他形式的技术债务)可能有助于避免人们在将来对你有不好的想法,但这不足以真正帮助其他开发人员或者项目。在这种情况下,您应该添加注释,说明为什么存在故意债务,以及应该采取什么措施来解决它。解决债务问题可能意味着需要更多的时间,或者依赖他人。重要的是,当有人回来处理债务时,提供有帮助的信息。目的是避免有人看着代码问“为什么会这样?”并且还提供上下文和信息,这将有助于当有人不得不修改它时。

只有几点,但它们在过去的许多项目中帮助了我。让我知道你的想法,或者如果你有任何其他的技巧让处理技术债务变得更容易。