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

602743bb8cf6c84d3dd03dc1f0732ee7.gif

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

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

未经允许,禁止转载!

作者 | Roni Dover       译者 | 明明如月

责编 | 夏萌

出品 | CSDN(ID:CSDNnews)

037d3f35ef99212206aa1ded8986eceb.png

图源:https://digma.ai/

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

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


ebca00408772e38a9193cfa01ada5579.png

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

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


152bb6f2197ff3d85db1b622546df050.png

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

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

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


21ac018e77e1608d642774f084898997.png

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

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

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


18b33ce3f1a774edfb34937ede233ed2.png

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

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

a6efd117460a06c4b9bd5b5a37af92ac.png

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


d96f02804bfc0df76ea3cc674bf44b31.png

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

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

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


87df72e089258b059ee92d96848ee791.png

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

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

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


b7a6601e56c18aac86d76b596f4664b1.png

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

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

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

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

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

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

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

推荐阅读:

▶腾讯回应与Meta VR头显合作传闻;美国考虑限制中国用户使用美国云计算服务;ChatGPT暂停联网测试|极客头条

▶“盗窃”而来的 3000 亿单词?ChatGPT 摊上事了,遭索赔 30 亿美元!

▶QQ 用 Electron 重构后,终实现 Linux、macOS、Windows 三端架构统一!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/70864.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端使用后端回传的url,显示图片的使用方法

前言 在开发过程中,有时需要动态的添加后端回传的指定url图片。但如果直接使用图片路径充当url,这时就会存在这样一个问题:后端的图片已经变了,但是前端的图片还是原来的。 原因 这是因为浏览器有缓存的功能。如果后端回传的ur…

图片转base64的几种场景(网络图片,本地图片,用户上传图片)

转载于博客园 https://www.cnblogs.com/zhangdiIT/p/7895903.html 写的很棒 推荐给大家 场景一&#xff1a;将用户本地上传的资源转化&#xff0c;即用户通过浏览器点击文件上传时&#xff0c;将图片资源转化成base64&#xff1a; <input type"file" id"im…

C实现响应浏览器HTTP GET请求上传图片

参考链接&#xff1a; 1.C 实现一个简易的Http服务器 https://www.cnblogs.com/life2refuel/p/5277111.html 2.C&#xff1a;C语言实现HTTP的GET和POST请求 https://www.cnblogs.com/diligenceday/p/6255788.html 因为工作需要&#xff0c;需要实现在嵌入式设备上响应浏览器的…

input file 实现上传预览图片,以base64上传,兼容IE8+,firefox,chrome

前言 最近在公司开发一个项目&#xff0c;其中涉及到一个公能&#xff0c;主要是上传一些小图片&#xff0c;而且在网站上需要大量引用这个小图片的&#xff0c;对于上传一些小的头像等。一开始觉得直接上传就好了&#xff0c;但是发现这样子的话&#xff0c;一个小图片就会发…

关于微信内置浏览器,打开图片上传功能,调用的问题

关于微信内置浏览器&#xff0c;打开图片上传功能&#xff0c;调用的问题 前段时间&#xff0c;项目完结测试的时候&#xff0c;同事打开魅族手机测试&#xff0c;无意中发现一个奇葩的问题&#xff01; 描述&#xff1a; 显示的是文件系统&#xff0c;列表式的&#xff0c;没有…

A-Level化学例题解析及练习

今日知识点&#xff1a;Ionisation energy and valence electrons 例题 The table gives the successive ionisation energies for an element X. What could be the formula of the chloride of X A XCl B XCl2 C XCl3 D XCl4 解析 Answer: C Definition of…

一枚Android 短信小偷 病毒的分析

一、样本简介 样本来自于吾爱破解论坛链接地址为http://www.52pojie.cn/thread-410238-1-1.html&#xff0c;样本不是很复杂有空就分析了一下。Android病毒样本还是很有意思的&#xff0c;有需要分析的样本发到论坛分析分析。 二、样本信息 文件名称&#xff1a;10086.apk …

编程确定小偷

已知A、B、C、D四个人中有一人是小偷&#xff0c;并且&#xff0c;这四个人中每人要么说真话&#xff0c;要么说假话。在审问过程中&#xff0c;这四个人分别回答如下&#xff1a; A说&#xff1a;B没有偷&#xff0c;是D偷的。 B说&#xff1a;我没有偷&#xff0c;是C偷的。 …

【笔记】根据公交卡出行记录识别小偷

案例来源&#xff1a;Bowen Du 案例地址&#xff1a;http://www.kdd.org/kdd2016/papers/files/adf0629-duA.pdf &#xff08;以下为案例的简要概述&#xff0c;便于之后能快速检索到相关内容。部分文字与图片可能直接来自原文&#xff0c;如有侵权请告知&#xff0c;谢谢&…

小偷-守卫博弈:“诡异”的纳什均衡

目录 1.什么是小偷-守卫博弈&#xff1f; 2.用数学刻画博弈信息 3.我是小偷&#xff01; 4.我是守卫&#xff01; 5.尬住了。。。 6.一个感性的认识&#xff08;给参数赋些值&#xff09; 7.纯策略&#xff1f;混合策略&#xff01; 8.混合策略纳什均衡求解 9.结论&am…

C++实现U盘小偷(超详细版)

文章目录 前言一、程序演示二、项目下载三、源代码四、代码解析1.main函数2.RegisterGlobalKey与UnRegistreGlobalKey函数3.DealMsg函数4.FindDriver函数5.ThrToSearch线程搜索函数6.ThrToCopy线程拷贝函数7.FindAllFile函数 前言 对于C/C学习感兴趣的小伙伴&#xff0c;可以看…

一个简单的动态规划问题---小偷案例

Java算法训练—小偷案例 文章目录 Java算法训练---小偷案例 前言一、案例描述二、问题分析三、代码示例总结 前言 动态规划是一种算法技巧&#xff0c;先举一个例子&#xff1a;   如何让一个四岁的小孩理解动态规划的思路&#xff1f;国外友人有这样一个例子&#xff1a;列…

Python编程判断谁是小偷

谁是小偷 ‎小区发生盗窃案&#xff0c;有四个人嫌疑最大&#xff0c;警察找来讯问。‌ ‎A说&#xff1a;不是我。‌ ‎B说&#xff1a;是C。‌ ‎C说&#xff1a;是D。‌ ‎D说&#xff1a;他冤枉人。‌ ‎四人中有一人说了假话&#xff0c;编程分析谁是小偷。 此题主要…

焦耳小偷工作原理分析

当开关闭合&#xff0c;Q1获得基极电流导通&#xff0c;右侧线圈流过电流&#xff0c;由于同名端的关系其在左侧线圈产生的互感电动势上负下正&#xff0c;正反馈使得Q1迅速饱和导通。右侧电流处于饱和状态&#xff0c;感应电动势消失&#xff0c;互感电动势也消失。互感电动势…

c语言四个人中有一个人是小偷,、甲,乙,丙,丁四个人中有一个人是小偷,请根据四个人的谈话判断谁是小偷?已知四个人中有一个人说假话...

、甲,乙,丙,丁四个人中有一个人是小偷,请根据四个人的谈话判断谁是小偷?已知四个人中有一个人说假话 关注:65 答案:5 mip版 解决时间 2021-01-31 07:52 提问者酒瘾渼亽兒 2021-01-30 16:58 、甲,乙,丙,丁四个人中有一个人是小偷,请根据四个人的谈话判断谁是小偷?已…

推理题-谁是小偷?

警察抓住了A、B、C、D四名盗窃嫌疑犯&#xff0c;其中只有一人是小偷。在审问时&#xff0c; A说&#xff1a;“我不是小偷”&#xff1b; B说&#xff1a;“C是小偷”&#xff1b; C说&#xff1a;“小偷肯定是D”&#xff1b; D说&#xff1a;“C在冤枉好人”。 现在已经…

饥荒联机版专用服务器怎么修改小偷包,饥荒联机小偷背包代码 | 手游网游页游攻略大全...

发布时间&#xff1a;2016-08-14 饥荒海难小偷背包获得方法?饥荒失落之船刷小偷背包图文教程,饥荒海难里的小偷背包是格子最多的背包了,相信很多玩家都想拥有,但是小偷背包却不是那么好拿的,今天小编就为大家带来一套饥荒海难刷小偷背包图文教程,希望对大家有所帮助 ... 标签&…

【Multisim仿真】焦耳小偷电路仿真实验

【Multisim仿真】焦耳小偷电路仿真实验 Multisim仿真 本实验仿真平台&#xff1a;Multisim14 基本电路 仿真前的相关设置选项 变压器参数设置主副线圈绕组比例调整比例&#xff1a;10:10 铁芯设置选项&#xff1a; ###对变压器输出绕组端的电压进行瞬态电压进行捕捉 设置…

深度优先遍历算法-01小偷偷东西问题

小偷偷东西问题 前言 深度优先遍历是经典的图论算法&#xff0c;深度优先遍历算法的搜索逻辑和它的名字一样&#xff0c;只要有可能&#xff0c;就尽量深入搜索&#xff0c;直到找到答案&#xff0c;或者尝试了所有可能后确定没有解。简单来说&#xff0c;深度优先遍历就是按照…

百家云在人工智能领域再有新动作,发布应用于多个行业的AIGC解决方案

4月17日消息&#xff0c;音视频SaaS上市公司百家云&#xff08;股票代码&#xff1a;RTC&#xff09;今日宣布&#xff0c;公司将正式推出应用于多个垂直行业及场景的人工智能生成内容及视频解决方案。 百家云总裁马义表示&#xff0c;此次发布的解决方案&#xff0c;将在极短…