作者:Trey Huffine

  翻译:承香墨影

  技术债务是现在增加的任何代码,都将在以后,花费更多的时间,来处理它带来的问题。--通常是为了实现快速收益。

  但是,这是什么意思?

  


  技术债务就像任何其他类型的债务。和我们买房子有点类似。大多数人没有办法全款买房子。因此,人们从银行办理抵押贷款。买家必须在未来 15 至 30 年内偿还利息。如果买主没有及时支付抵押贷款给银行,他们将会失去房屋。

  技术债务也不例外。它使公司能够更快地创建软件的第一个版本,而这带来的后果是他们在不远的将来,再在此之上扩展功能将变的非常缓慢。公司最终将被迫花费更多的时间来解决债务,而不是一开始就制定最佳的解决方案。

  任何软件工程问题的最佳解决方案,通常都需要大量的投资。它需要花费更多的时间,但是却得不到我们想要的结果,并且这一些依然需要保证健壮和可扩展。

  技术债务可能会给开发人员带来严峻的考验,并会阻碍长期的可扩展性。但几乎所有初创公司都会存在技术性债务。许多人用它作为短期增长的催化剂。所以技术债务并不总是一件坏事。

  如何定义技术债务

  技术债务不仅仅是一些抽象的概念。它可以用具体的术语来解释,并用图形描述。一个伟大的比喻是"Big O"算法的复杂性。

  随着代码库大小的增加,我们可以测量添加新功能和/或代码所需的工作量。

  


  蓝色线性 O(n) 线之上的任何东西都是技术性债务,而任何低于它的东西都不是。这意味着技术债务使得编写代码越来越困难,因为它会增加更多的代码量。

  蓝线下方的可扩展解决方案通常是使构建软件更简单的抽象、库和工具。这方面的例子可以从构建通用于应用程序的功能到利用库和工具(如 React 或 Docker)(难以想象为每个项目重建它们将会多么痛苦)。正确的工具和抽象可以影响乘数,而技术债务则是影响的分频器。

  如图所示,技术债务最初可能是最佳的快捷路径,但如果应用程序最终想要获得成功,则需要快速重构这部分技术债务。这将实现 MVP 的历练,快速发起创意,并迅速迭代和改进。

  MVP=Minimum Viable Product,意思是最轻量级的可行性产品。

  首先,找出哪些创意是值得被实现的,然后以可扩展的方式迭代构建它们。一个功能,可以通过 O(n²) 复杂度的代码库来接入,但是随着时间的推移,需要被重构为 O(n)和O(log n)。在 O(log n) 阶段,可能只需要付出一个人或者一个小团队,就可以得到之前大团队努力之后的结果。

  当你的程序功能足够复杂的时候,你可能已经达到了我定义的程序的可伸缩性的阀值了(Scalability Threshold)。在这个点之前,你所付出的努力和获得的回报相比,需要比线性方法(O(n))更快实现。而越过这个阀值之后,你不应该再在此方法之上进行构建新功能,相反,应该投入代码重构你的项目,让它可以在减少人力和减少工作的同时,产出更多的结果,达到 O(log n)。

  理论上,线性 O(n) 解决方案不应该是技术性债务。这说明,每投入一个工时,你将收到相同的回报。但是,这并不总是在实际工作中起作用。时间,金钱和人力都是有限的资源。你最终会限制你可以雇佣的人员数量,而不会因为项目的迭代,继续扩张人员投入。你更倾向于把它定义为技术债务,然后解决它,达到 O(log n)。

  一个真实的例子

  想象一下,你正在建造一个名为 Citybrook 的革命性的新服务,为城市创建配置文件。确定你感兴趣的五个关键城市,比如旧金山,西雅图,奥斯汀,纽约和纳什维尔。使用纯 HTML 和 CSS 构建一些简单的网页,然后找到适合该产品的推广渠道。

  假设用户喜欢这些内容。美国的所有城市都请求你为他们建造网页。你也意识到你的亚马逊网络服务(AWS)账单将因为你收到的所有访问流量而急速上升。因此,你可以通过为不同城市的不同商家粘贴链接来在每个网页上放置广告。你很快意识到简单的 HTML 解决方案不能方便的扩展。这是一个O(n²)复杂的,因为你不可能为每个城市,单独建立和维护一个独特内容的 HTML 页面。

  为了解决这个问题,你可以使用 React 模板来渲染动态内容。此时,你已经减少了技术债务,并使你的公司规模更加可持续。你现在可以分配时间来生成内容,而不是为每个城市建立一个独特的页面。

  你与团队持续长时间的工作,目标是为了在几个月内为每个城市创建个人资料。但是,你已经成为你自己的受害者。其他国家的竞争对手开始启动他们的网站,但是你没有能力扩展并快速占领市场。

  相反,你试图尽快解决这个问题,但你无法跟上。有些城市要求改变他们的内容,而广告商不能随着流量的增加而支付费用,所以他们的广告需要被换掉。手动创建和更新每个城市的配置文件不再有意义。没有足够的人力来跟上这个发展规模。

  因此,你决定建立一个自动构建的处理程序,允许城市创建和更新自己的网页。网站的市场扩展,再开发阶段暂时停止增长,但基于你的知名度,你不会丢失任何客户。一旦完成,只需要很少的努力来添加一个新的城市。你的团队不需要花费大量时间来配置内容,而只需要维护和构建工具来为你的客户提供支持。

  你的团队规模越大,你就有更多的能力(和责任)来编写防御式代码,并偿还技术性债务,从而使你的规模达到你已经达到更大的规模。

  一旦技术债务不断累加,将会失控,通常会导致糟糕的代码呈指数增长。这意味着增加更多的功能使债务偿还日益困难。

  技术债务何时将可以接受?

  客户不关心你的代码是什么样的,他们只是想要你的产品。一个完美的功能,如果从来没有发布的话,就和失败是一样的。

  然后,蓬勃发展的创业公司可以迭代功能,获得发展力,并提高他们的可扩展性。一旦创业成功,他们就可以建立自己的技术团队,并偿还技术债务。将将为他们未来的成功奠定基础。

  技术债务的回报必须高于债务本身。也就是说,你通过获得债务能够实现的目标,它的影响力必须比债务本身更大。

  技术债务不是懒惰的借口。它应该在战术上使用,长远的眼光。创业公司应该迅速行动,并在市场上测试他们的想法。一旦他们验证一个想法,他们应该设法了解问题和适当的抽象来扩展它。然后公司应该偿还他们欠下的技术债务。

  与普遍的看法相反,在许多情况下,获取技术债务实际上可能是最佳决策。多年来,Facebook 的座右铭都是“move fast and break things.”。

  获取技术债务是 Facebook 成为今天的主宰地位的一个重要因素。但是这也带来了一个问题,即 Facebook 难以维持其规模。但他们如此工作的原因是,他们能够比他们获得的债务更快地扩张。

  不要因为技术债务可被接收而选择承担技术债务。这需要经验、试错和沟通才能使技术债务保持正轨。但是,要明白,正确地管理它可以成为一个强大的增长催化剂。很多时候,技术债务是最好的路径。

  在这一点上,它也可能成为进步的最大障碍。

  了解它,控制它,并将其用作工具,它将帮助你建立你的产品。

  技术债务,不是懒惰的接口,它应该在战术上使用。

  原文链接:

  https://medium.freecodecamp.org/what-is-technical-debt-and-why-do-most-startups-have-it-9a54458daabf