首页 > 资讯 >

代码恐怖故事:揭秘形成复杂代码库的常见原因

2023-07-05 20:27:24 来源:CSDN

【编者按】本文主要分享一些开发者在软件开发行业中遇到的复杂代码库所带来的问题和挑战。本文列举了造成复杂代码库的常见原因:过分抽象、过度通用化、虚假的测试覆盖、对过时技术的过度热衷、缺乏架构设计、缺少代码版本控制等。文章还强调了管理层对复杂代码块问题重视的重要性,并指出这些复杂代码库会随着时间的推移变得越来越庞大,需要更多的开发人员来处理。

原文链接:https://digma.ai/blog/coding-horrors-complex-codebase/

未经允许,禁止转载!


(资料图片)

作者 | Roni Dover 译者 | 明明如月 责编 | 夏萌 出品 | CSDN(ID:CSDNnews)

图源:https://digma.ai/

如果你在软件开发行业工作过一段时间,那么你可能已经遭遇过一些使你心生恐惧、感到沮丧、甚至无法面对的复杂代码库。这些复杂的代码库可能是一团散乱的代码,也可能是一个充满复杂依赖关系、测试覆盖率低的庞大单体应用。本文我们将深入讨论造成难以维护的代码库的一些常见原因。

请准备好一杯咖啡,代码恐怖故事即将开讲。

过分抽象增加代码库的复杂性

你是否听过这句话,“没有什么问题是添加一层抽象解决不了的”?我们很容易就会觉得,将代码整理为清晰的层次结构,就能让所有东西看起来井然有序、清晰明了。理想很丰满但是现实很骨感,在实际应用中,情况往往很快就会失控。抽象层开始渗透、堆叠,隐藏了你实际需要关注的重要代码部分。不知不觉中,你会发现原本只是一个简单的调试任务,变成了在类和对象迷宫中追逐幽灵的疯狂之旅。Reddit 用户 Zoozla 分享了他在一款大型 Java 单体应用中的工作经历。这款应用是一家银行用于货币交易的外汇系统的组成部分。这个复杂的代码库中,有一个令人眼花缭乱的 8 层抽象类结构,底层只有一个实际的类。它还包含了一个几乎具备图灵完备性的 XML 语言,用于解析遗留的二进制文件。更为糟糕的是,运行单元测试会对开发数据库进行修改,每次运行后都需要手动重新填充数据。Zoozla 花了数月时间试图重构代码中最糟糕的部分,但收效甚微。

过度通用代码让代码库难以维护

有时候,即使出发点是好的,结果也可能带来意料之外的负面影响。当开发者试图创建一个完美且灵活的软件时,这种情况就会经常发生。他们一头扎进复杂的抽象和依赖关系中,自以为正在创建一种真正具有适应性的东西。但在他们察觉之前,他们已陷入了一团乱麻的代码中,哪怕只是最微小的变化也会令人感到极度困扰。

用户 Shnorkylutyun 分享了他在 Java 应用中处理嵌套泛型和众多基类型包装器的经历。这个应用中存在各种类型的包装器和包装器之间的映射,以及描述具有 10 多个字段的通用形式的泛型类,每个字段的类型都有单独的泛型。而最多含有 6 种泛型类型的表单向导更是增加了混乱程度。如果一个表单中两个字段的顺序成功地被重新排序,而且它们都是字符串,那么这将是个值得庆祝的小确幸。

对过时技术的过度热衷带来额外的复杂性

你可能听过这句话:“人往往会用自己熟悉的方法去处理问题”。在 90 年代末,有一群开发者如此迷恋 Smalltalk,以至于他们不惜将其概念强行适配到一个 C 语言应用程序中。结果,他们创造了一个令人眼花缭乱的复杂代码库,这个代码库依赖于文本字符串的发送处理,而不是传统的函数调用。再加上庞大的源文件和对 PostgreSQL 的奇特运用,你就得到了一份让人头痛不已的代码库。

Reddit 用户 Json-123 分享了他在 90 年代末为 Solaris 编写的一个 500 万行 C 语言应用程序的经历。原开发者试图通过发送文本字符串进行处理来在 C 中模拟 Smalltalk。这个复杂的代码库中,有一个超过 15 万行代码的庞大源文件,这使得许多 IDE 难以承受。更令人头疼的是,该应用程序将 PostgreSQL 当做一种复杂的文件锁定机制来处理 flat 文件(一种没有对应的关系结构的文件),而并非把数据迁移到数据表中。

交付压力导致虚假测试覆盖率

在压力、挫败感不断累积,以及对误导管理层的怨恨加剧的情况下,开发者可能会对代码库进行一些出乎意料的改动。相比精心设计的解决方案,交付压力可能导致了一些不寻常甚至怪诞的结果。

以 Reddit 用户 Aceluby 的经历为例,他曾经维护过一个 Java 应用程序,虽然在测试中达到了惊人的 99% 代码覆盖率,但是竟然一个断言也没有!测试仅仅检查代码是否会抛出异常,对代码的正确性几乎没有任何保障。维护这样的代码库是一项具有挑战性的任务。但,正是因为这种挫败感和压力,才会促使开发人员去解决问题并改进代码质量。

缺乏架构设计造成野蛮生长

你是否有过这样的经历,走进一个房间,东西堆满了每一个角落,你却找不到自己需要的东西。这就是深入一个多年来无人管理、任其发展的代码库所带来的感觉。没有人驾驶这艘船,它就变成了一个充满曲折小径的迷宫,所有的路径看起来都一模一样。

Reddit 用户 Zasch 描述了一个包含大约 570 个模块的项目,甚至有一些“测试模块”仅用于测试其他模块。这个单体代码库在没有架构师的情况下已经发展了 20 年,每个在项目上工作的人都在努力理解它。调试这个项目的代码如同噩梦一样,将整个代码库导入 IDE 会导致 IDE 卡死。唯一值得庆祝的进步就是项目成功升级到 Maven 3 和 Java 8。

在没有版本控制的情况下狂奔

有时,有些开发者的行为让人难以理解。他们的有些行为似乎让人怀疑他们是否适合编程。

Reddit 用户 fuseboy 分享了一个关于使用 Java Swing 构建复杂触摸屏应用的故事,其中的代码可谓是面条代码的经典示例。代码库中缺乏封装、分层和接口设计,变量被设置为公开状态,以便更方便地在类之间共享数据。更为惊人的是,竟然没有构建流程。开发者在命令行中私自构建他们的类,然后通过电子邮件将结果发送给技术负责人。

面对复杂的代码库,我们的未来充满了挑战

这些令人恐怖的复杂代码库比我们想象得要常见的多。当开发者被派去维护它们时,就如同被交到一张没有出口的迷宫地图。

我们当然有一些工具和方法论可以提供帮助,如静态代码分析器和重构工具,但面对如此复杂和庞大的代码库,它们往往力不从心。

更糟糕的是,当管理层未能认识到问题的严重性,或者简单地将短期目标置于长期可维护性之上时,对于那些已经在努力处理这些复杂代码库的开发者来说,这无疑是灾难性的。

并且,这些企业级的代码库随着时间的推移,只会变得越来越庞大。这些复杂的代码库需要更多的开发人员来处理,重写代码并不能轻易解决问题,反而可能导致更多的问题产生。

本文是“代码恐怖故事”系列第一篇。该系列的第二篇文章:《代码恐怖故事:解密隐藏在复杂代码库中的恐怖秘密》也将会在不久发布,敬请关注。

大多数开发者都有自己独特的故事。你是否也曾亲历过一些“代码恐怖故事”?欢迎在留言区分享讨论。

上一篇:

世界实时:服务机器人有哪些种类?

下一篇:

最后一页

x
推荐阅读

代码恐怖故事:揭秘形成复杂代码库的常见原因

世界实时:服务机器人有哪些种类?

2023年宁波慈城毕业生优惠活动时间持续多久_全球热点

信息:中南建设:上半年累计合同销售246.8亿元,同比减少25.2%

【焦点热闻】大立光6月营收26.96亿元新台币,同比减少20.5%

热消息:洪荒之太上天尊 洪荒之太上道尊

中国生物启动全球首个诺如病毒疫苗Ⅲ期临床试验 天天最资讯

速看:阿雅方晒毛发及尿液检测报告:清者自清

儿童纽崔莱蛋白粉的作用和功效(纽崔莱蛋白粉的功效与作用)

90后“小张书记”要走了,全村村民按下红手印 环球聚看点

周口有什么好玩的景点推荐? 环球热资讯

环球微动态丨香港航天科技涨超14% ASPACE香港卫星制造中心即将于7月25日正式开幕

「英超」芒特在个人网页宣布,将离开切尔西 每日速讯

全球快资讯:隋文帝子王俊着翻译_隋文帝子秦王俊为并州总管阅读答案

一本有魔法的书作文400字想象作文_一本有魔法的书可以怎么写

皇氏集团:公司目前暂无冰淇淋或者冰棍相关产品线_天天观察

运动数据有助提早发现帕金森病

青山湖区上半年累计完成投资221.53亿元_天天观点

世界快报:信用社贷款需要什么条件,利息多少?

帮付退款返给谁_淘宝退款多久到账 当前速读

假面骑士22年冬季剧场版:龙骑三位原班演员确定回归出演开 全球观天下

环球头条:共享科普盛宴 流动科技馆走进四川甘孜

【卡拉彼丘同人】月满天心,稻禾香夏 Chapter3.安身,然后立命-全球快讯

焦点关注:男子故意1次取1元逼哭柜员,冲上热搜!银行回应

每日观点:中国儒意(00136)拟折让约17.53%发行25亿股认购股份 净筹约40亿港元 7月5日复牌

三明公交机位整理

环球今热点:总裁的秘密甜宠(总裁的秘密bl自愿为奴)

金盾网广州_广东金盾网官网网吧

天天新动态:小叶紫檀玻璃底包浆图_小叶紫檀怎么包浆最快

率先出线!华东医药利拉鲁肽减重适应症获批,GLP-1产品再度领先 环球视点

要闻:错失1255亿美元!欧洲为何缺席动力电池盛宴?

天天热资讯!2023款“大众途锐”末代版官宣,58.78万元起,2.0T动力提升!

每日视讯:远洋集团地产债现临停潮 数只跌超20%触发临停

广州市5月网约车数据公布 哈啰出行 招招出行等违章数量名列前茅-快播报

环球今日报丨范飞_关于范飞的简介

联合国安理会将就人工智能对世界和平的潜在威胁举行首次会议 焦点资讯

智动力(300686):该股换手率大于8%(07-04)

防冻液多久换一次合适_2017款明锐防冻液多久换?_全球快资讯

短讯!航空工业发展中心举办青年创新创效大赛

文艺汇演点燃盛夏激情,擦亮武昌古城“文化名片”

环球新动态:午评:A股三大指数低开高走翻红,科创50指数涨超1%,汽车产业链爆发

7月4日焦作增氟氢氟酸价格暂稳

恶灵骑士1在线观看_恶灵骑士1漫画

【世界播资讯】光遇兑换码领取免费2022 光遇兑换码领取免费2022六月七号

韩国代购官网都有哪些 有了这14个韩国购物网站

最新快讯!港铁启动“机场快线25周年”庆祝活动

快资讯:V观财报|宁德时代回应投资者:不造车

复星医药:7月3日融资买入2575.5万元,融资融券余额33.64亿元

晋城中考一分一段表(每年更新)

即时看!国产汽水新势力崛起:汽水泡沫