在编辑的Soapbox on Edit中,我最近遇到了我第一份企业工作中的一位老同事。2007年,我受雇支持一个即将过时的应用程序,因为我们最终会用一个新的ERP来取代它。2019年9月,它终于退役了。
这个应用程序名为Total Inventory Process";,它是我的WTF起源故事。这个应用程序和组织的元素已经渗透到我在这个网站上的许多文章中。天哪,它的WTF是不是超过了它的份额。
";总库存流程";。一开始,你就知道这是一个过于雄心勃勃的内部团队试图做出一个能解决所有问题的万能应用程序的案例。它的核心是库存管理和发票,但它有自己的数据驱动的屏幕呈现/模板引擎(几乎不起作用),自己的国际化引擎(对于从未本地化的应用程序),Web、COM+、客户端VB6的混合,以及与Oracle后端和大型机的挂钩。
TIP也是关于技术债务的力量、它的真正成本以及为什么技术解决方案几乎永远不足以解决技术债务的教训。
TIP被用来跟踪几家客户工厂的库存消耗,以确定如何为他们开具发票。我们把他们小配件上的油漆卖给了他们,但这并不像你用了这么多油漆那么简单,我们给你开了这么多账单。我们处理了他们油漆生产线上所有东西的库存,从油漆到卫生间的卫生纸。顾客不想为消费买单,他们想为小玩意儿买单。应用程序需要能够说,如果客户生产300件小配件,那么价值10美元的卫生纸。
该应用程序每年为数十家客户设施处理数百万美元的发票。当我被聘用时,我是第二个全职从事支持提示工作的开发人员。我不是被雇来修复虫子的。我不是被雇来添加新功能的。我之所以被聘用,是因为我花了两名开发人员,每周工作40个小时,只是为了防止应用程序在生产过程中崩溃。
我的主要工作职责是登录到生产数据库并手动调整记录,因为该应用程序错误太多,使用起来非常困难,而且被锁定,以至于用户无法改正自己的错误。无论我剩下什么时间,我都会响应用户对新功能或错误修复的请求。
通常很难准确量化技术债务的成本。我们经常谈论这个问题,但它往往以“我一看到就知道”的形式出现,技术债务是其他人的准则。在这里,我们有一个非常具体的数字:技术债务是两份全职工资,仅仅是为了维持基本的运营就可以了。
我的第一个开发任务是在一个屏幕上添加一个文本框。因为其他开发人员过去也尝试过这样做,所以我得到的估计是两周的开发时间。为一个新的文本框花费80小时的努力。
有一次,用户希望能够按降序对屏幕进行排序。该应用程序有一个复杂的排序/分页系统,旨在防止出于性能原因一次提取超过一页的数据。虽然它这样做了,但它没有按降序排序的能力,添加该功能将需要完全重写。我的解决办法是在后端完全禁用分页和排序,然后在客户端使用JavaScript重新实现该屏幕。用户喜欢它,因为应用程序中的一个屏幕突然变得很快。
哦,实际上,在后端进行排序实际上就是将ORDER-BY子句放入URL,然后SQL注入它。
这笔技术债务的数量是有副作用的。因为我们在生产中手动更改数据,所以我们与少数涉众用户密切合作。具体地说,有三个人是小费的三巨头。这三个人是开发商的直接联络点。他们是管理层的直接联络点。他们设定优先顺序。他们输入了错误报告。他们提出了数据更改请求。他们统治着整个系统。
他们对这个系统有很大的权力,这是一个处理数百万美元的系统。我想他们喜欢这种力量。直到今天,他们中的一个人仍然认为TIP的概念是无与伦比的,它的替代系统是廉价的和垃圾的。现在,从技术角度来看,你不可能真的比TIP更糟糕,但从超级用户的角度来看,我可以理解TIP的感觉有多棒。
我是一个年轻的开发人员,并不是很喜欢这个工作环境。哦,我很喜欢三人组,他们是很好共事的人,但我不喜欢把我的日子当作他们的延伸。他们会给我发送包含UPDATE语句的电子邮件,并要求我在生产中执行这些语句。作为一个有权更改数据的人,没有多少工作满足感。
沮丧之余,我立即开始寻找还清技术债务的方法。出于几个原因,我能做的只有这么多。最明显的是软件。如果添加一个文本框可能需要合理的两周时间,那么重新构建数据访问以便您可以对按降序排序的数据进行分页是不可能的。即使是简单的变化也可能引发混乱,因为它们引发了一些没有人知道的边缘案件。
不过,老实说,技术障碍很小。最大的挑战是文化和政治方面的挑战。
首先,该公司知道在生产中运行的许多代码都是错误的。因此,他们创建了设置检查点的策略来确认代码质量,从而使部署新代码变得更加困难。难度要大得多,时间也长得多:在有权威的人签字之前,你不能发布到生产中,而这可能需要几天的时间。这并没有产生更好的代码,相反,这意味着旧的、坏的代码仍然是坏的,而新的、坏的代码匆忙地完成了这个过程。我们有一个艰难的上线日期,我们将在那之后改进代码。&34;或者人们找到了其他解决办法:您的Web代码必须通过这些检查点,但存储过程没有,因此,如果您像我一样有权修改生产中的内容,您可以将存储过程更改为您的核心内容。
其次,该组织作为一个整体是厌恶风险的。这个应用程序正在处理数百万美元的发票,虽然它需要大量的人工照看,但当发票发出时,它们是准确的。公司拿到了工资。没有人想要做出可能影响这一点的全面改革。
第三,业务规则复杂。你每个小工具开多少卷厕纸的账单?这是一个很难回答的问题。公平地说,没有人完全理解这个系统。在商业方面,三巨头可能对此处理得最好,但即使是他们也可能被它的行为弄得措手不及。这是一个复杂的系统,需要保持运行,因为它是业务关键型的,但没有人确切地知道所有这些功能是什么。
第四,该组织查看支持和增强功能的方式与其他公司查看运营预算和资本预算的方式相同。它们是不同的资金池,你不应该用支持资金来支付新功能的费用,也不能用增强资金来修复错误。
最令人沮丧的是,我有时会受到三人组的回击。哦,他们喜欢我给他们一个按钮,让他们自助服务一些需要人工干预的功能,只要界面足够笨重,只有他们才能使用。他们讨厌工作流程变得如此精简,以至于任何用户都可以这么做。对他们来说,更糟糕的是,随着技术债务的还清,我们开始将越来越多的生产数据转换为低级承包商。现在,三巨头不再有开发人员能够随心所欲地更改代码。他们不得不交出权力。
幸运的是,管理层对TIP周围的支持成本很敏感。一旦我们开始建立降低成本的记录,管理层就开始清除一些障碍。这里面有很多政治因素。我怀疑一些管理层对三巨头的权力有多大持谨慎态度,当权力能够减少时,他们会感到高兴。在为TIP工作了几年之后,我大部分时间都把它转移到了其他项目上。通常,我只是为了月底账单支持而突然出现,或者成为了解一些奇怪的技术复杂性的专家。显然,这个应用程序在没有我的情况下多年来一直工作得很好,我不能说我怀念它。
TIP积累技术债务的速度比大多数系统都要快得多。其中一些来自雄心壮志:它试图成为一切,包括重新发明与其核心业务无关的功能。这导致了一个痛苦的开发过程,伴随着死亡行军、团队重组,让开发人员投入开发,直到它重回正轨,还有几个最后通牒,比如如果我们在月底之前没有什么东西投入生产,每个人都会被解雇。它诞生于严重的债务中,所在的组织没有良好的债务管理机制。偿还这笔债务的主要障碍不是技术上的,而是社会和政治的。
我很幸运。我得到了处理这笔债务的自由(或者,如果我们完全诚实的话,根据寻求原谅比请求许可更容易的原则,我也获得了一些自由)。在许多系统中,技术债务不断累积,直到偿债成本难以为继。你最终支付了如此多的利息,以至于你实际上什么都做不了。对于许多项目来说,这是一种失败模式,通常在重新编写时才会出现这种情况。然而,重写的记录好坏参半:TIP本身实际上是对旧系统的重写,并承诺这一次会把它做好。
技术性债务一直在我的脑海中浮现,因为我最近一直在思考更广泛的系统性债务。人类建造的任何系统--软件系统、机械系统,甚至是社会系统--都会产生债务。该体系历史上做出的决定将在未来制造问题,无论这些决定从一开始就是错误的,还是产生了不可预见的后果,或者只是世界改变了,它们不再可行。
美国现在正在经历一场我有生以来从未见过的抗议浪潮。我认为,公平地说,这些抗议活动植根于历史上的不平等和不公正,这构成了一种社会债务形式。我们的社会制度,特别是围绕警察行动的社会制度,但广泛地讲,在种族领域,都背负着过去的债务。
我在偿还债务的障碍上看到了相似之处。试图通过政策进行改变,最终会造成改变的障碍,或者干脆无法实现他们的目标。抵制改变,因为改变会带来风险,管理或减轻这些风险比实际解决问题更重要。我们正在谈论的系统是复杂的,甚至很难就更好的版本是什么样子达成共识,因为甚至很难理解它们目前是什么样子。最后,还有一些拥有权力的团体,在偿还社会债务时,他们将不得不放弃一些权力。
这是一笔庞大的、难以对付的债务。它与一套难以拆卸的联锁系统相连。正确的做法非常重要,令人毛骨悚然。
所有系统都会累积系统性债务。软件系统会累积债务。社会制度会累积债务。即使是你的个人心理系统,你的心理健康,也会累积债务。如果不采取行动,债务将会增长,债务的利息会增加,更多的能源最终会用来偿还债务。当累积的债务变得太高时,系统失败的方式之一就是。破产就会发生。在所有这些类型的系统中,软件债务往往是微不足道的。软件产品变得不受支持,并被取代。心理债务可能会导致抑郁或其他心理健康问题。社会债务可能导致动乱或不公正的延续。
从根本上讲,系统性债务可能是一个技术问题,但其解决方案始终需要政治。如果不克服政治挑战,TIP就无法改进。如果没有重大的政治变革,美国的社会债务就不可能得到解决。
我希望人们从这个故事中学到的是对系统性债务的认识,以及对债务的一些长期成本的理解。我鼓励你环顾四周,看看你与之互动的系统。有哪些债务来源?让系统和依赖它的人付出代价的债务是什么?偿还这笔债务的障碍是什么?让我们使用的系统变得更好的挑战是什么?
系统性债务不会自行消失,如果放任不管,它只会增长。如果你不注意它,坏掉的系统最终会在生产中停留太长时间。TIP已经使用了近18年。请不要使用破碎的东西那么长时间。
[广告]ProGet可以集中您组织的软件应用程序和组件,为开发人员和服务器提供统一的访问权限。快看啊!
Steve_the_cynic(Nodebb)本文的其余提示部分(正确地)是本文的扩展。关键是,虽然减少债务需要技术解决方案,但它的存在是由于非技术问题,而这些问题是建立技术解决方案的主要障碍。
科尼利厄斯(未注册)我绝对喜欢这个网站,阅读所有的WTF总是让我微笑,同时也让我畏缩。在我个人看来,这篇文章是我读过的最好的技术/非技术文章。技术债务与现实生活的比较是完全正确的,不仅适用于美国,也适用于德国和全球所有其他国家。
坚持伟大的工作,希望你的技术债务尽可能少。
亚历克斯(未注册)我确实认为,技术债务和我听到的所谓的“显露出的偏好”之间应该有所区别。技术债务是可怕的,我们都同意这是可怕的;唯一的分歧是我们应该付出多大的努力来解决它。相反,当利益相关者的阻挠暴露了他们对更不透明的体系的潜在偏好,从而赋予他们个人权力时,问题及其补救措施都是完全不同的。您不能像对待渲染/模板引擎那样对待三人组。
在当前的社会混乱的情况下,虽然肯定有技术债务的因素,使得个别不良行为者能够制造骚乱*,但这更像是揭示了一些关键人口统计数据的偏好:
普通非黑人选民不愿考虑这些废话。
如果抗议活动没有取得其他任何成果,他们至少已经让最后一个群体注意到,当前的体系是不可持续的,潜在的错误通常不是活动人士的错,让抗议活动从我们的电视上消失的真正方法是开始偿还该死的资本。
我的名字不见了(未注册)修复技术债务最困难的事情是决定改变;这在软件和社会中都是如此。如果你完全致力于改变,那么你可以修复任何事情;如果你半途而废,它就会四舍五入。
sibtrag(Nodebb)这一系统性债务有多个组成部分。一种类似于基于计算机的系统中的技术债务……这是我们从小成长的社会所接受的编程。不幸的是,马克斯·普朗克的观察与此相关:一个新的……。真理通常不会通过说服它的对手并让他们承认自己的错误而获胜,而是通过它的对手逐渐消亡,让位于在它上面长大的新一代。我们其余的人最多只能学会认识到自己和他人身上的这些编程错误&积极努力抵制这种编程。努力把下一代培养成比我们更好的人。
另一个是社会成员在初始条件上的严重不平等。很明显,奴隶的孩子和种植园主的孩子不会有同等的结果,无论个人的努力如何。几十年来的政策和项目产生了不平等的效果,这些不平等加剧了这些不平等……社会保障、退伍军人福利法案、抵押贷款保险、警务等。人们可以争论这种不平等是故意的还是无意的,但其影响是显而易见的。
内森·斯皮策(未注册)+1-也许最后提示在坟墓里又多了一堂课!如果这篇文章能让我们中的一些技术人员意识到,我们必须走出舒适区,开始参与政治,开始在当今的问题上大声疾呼,那么即使在最后一台服务器关闭、最后一块磁盘消磁之后,这篇文章也会起到很有价值的作用。