关于以惨痛教训为代价学习的 20 个技术恐怖故事

系统管理员、网页设计师、工程师和程序员分享了他们在命令行中最可怕的经历。
2 位读者喜欢这篇文章。
How to make a lighted, porch bag for Halloween

Jen Krieger,CC BY-SA 4.0

万圣节很快就要到了!这个充满乐趣、略显夸张的节日是思考我们每个人内心深处作为开发者的恐惧的好时机。在你的代码开始运行之前的安静时刻,最让你感到困扰的是什么?

为了迎接万圣节的气氛,我询问了一些 Opensource.com 的作者:你见过或写过的最可怕的代码是什么?

错误的权限

我负责一台服务器,并通过 FTP 上传了一些内容。显示出一些奇怪的东西,所以我认为需要更改一些权限。

不用说,我愚蠢地关闭了读取模式,导致网站瘫痪。(当没有人可以访问网站时,网站就没什么用处了。)

我花了几个小时才修复。这发生在多年前的一家代理机构,当时我是唯一的网页开发人员。

Miriam Goldman

蹒跚的 HTML

我搞垮了一位客户的网站,当时这位客户是《华尔街日报》畅销书排行榜上的作者,因为原始 WordPress 默认主题有可用更新。

他的开发人员将 HTML 硬编码到主题中,而不是创建子主题。我运行了更新。

那时还没有轻松的夜间备份,所以我花了好几个小时与托管服务提供商通电话。像暂存、子主题、夜间备份或手动备份这样的东西现在都很正常,以及自动更新和手动回滚的能力。但在那个时代并非如此。

Courtney Robertson

不太秘密的密钥

我认为我们很多人以前都见过公共代码中的密钥。或者另一个我最喜欢的例子:我的一个朋友从开发服务器向 100,000 名用户发送电子邮件。

John E. Picozzi

Unix 混淆

这是一个 Unix 故事。今天在 Linux 中已修复。

在我要向管理层演示一个新组件的前一天,我必须刷新我的代码(这远在 Git 出现之前。)我进入我的主目录,找到项目目录,并删除了所有内容。不幸的是,在那种 Unix 版本中,此命令跟随符号链接,并且我有一个指向最新代码版本的链接(并非所有内容都在源代码系统中,因为它仍处于测试阶段)。

一天后,大楼里出现了网络问题,因此演示推迟了一天,我们设法恢复了。那是三十多年前的事了。即使现在我也不知道网络问题是巧合还是我们的系统管理员试图拯救我们(如果是这样,它奏效了!)

Josh Salomon

强制性

在 CSS 文件中到处看到 !important;,而不是正确使用特异性。

我曾经不得不覆盖和自定义几乎所有 WordPress 主题的 CSS,因为网站所有者不肯在获得更接近他想要的设计的新主题上让步。

同一个主题上次由开发人员在 2018 年更新,而该网站仍在使用它。

Christi Nickerson

错误引用

在之前的职位中,我的前任在代码注释中错误引用了 Journey 的“Any Way You Want It”的歌词。

Ben Cotton

Algol68 的幽灵

Algol68 的复杂性在 1960 年代后期和 1970 年代初期吓退了许多有影响力的人,包括 Niklaus Wirth。我当时能回忆起的最常见的抱怨是“谁能为如此复杂的野兽编写编译器?”。然而,许多人做到了。此外,许多在 Algol68 中开发或至少形式化的概念出现在后来的语言中,尤其是在 C 和 Bourne shell 中(感谢 Steve Bourne)。

Algol68 的一些概念已经过时了。处理“书”和“章节”等的 I/O 概念在今天看来有点奇怪。将字符集之类的东西留给实现似乎非常老式。

但是有些概念在今天非常重要,或者应该非常重要,例如产生值的表达式、强类型(Algol68 中的类型称为“模式”)、堆内存和垃圾回收、运算符的定义和重载等等。

坚持万圣节主题,既有技巧也有款待。

Algol68 是一种值得研究的语言,即使仅仅是为了了解现代计算的许多思想来自哪里,以及有多少思想在途中丢失了。

Chris Hermansen

密码泄露

我正在为一位即将到来的支持客户进行技术审核,之前的一位开发人员将密码以纯文本形式放在整个主题中,并使用可怕的方式连接到远程数据库。他们的 composer 文件也臃肿得可怕。每次我尝试在本地启动并运行该网站时,都需要五分钟。过时的依赖项、我无法访问的仓库,不胜枚举。

Miriam Goldman

迷宫

我见过的最可怕的代码是一段 PDP-11 汇编语言,它位于一个名为 RSTS 的操作系统内核中,今天没有人记得这个操作系统了。在那些日子里,源代码在缩微胶片上,我沿着这条代码路径进行了一些曲折,试图弄清楚发生了什么。然后,我遇到了这条指令

MOV R5,PC

我举起双手,哀号起来。我真的哀号了。办公室里的人以为我撞到了头,或者心脏病发作了。

在那些日子里,内存非常宝贵,MOV 指令使用的内存比 BR(代表“分支”)指令少一点点。将寄存器 5 的内容复制到程序计数器实际上是一个廉价的无条件分支,跳转到寄存器 5 中存储的地址。但问题是,我不知道寄存器 5 中存储了什么,也不知道如何找到它。

直到今天,将近 40 年后,我仍然想知道谁会编写这样的代码,以及谁能调试它。

Greg Scott

差一

我在自动化行业工作,PLC 是用一些非常奇怪的语言编程的。

一个困扰我的例子是,在 ST 语言中,你可以定义从索引 1 开始的数组。这意味着第一个元素位于位置 1,而不是 0。当我看到它时,我简直要疯了。

Stephan Avenwedde

分歧

有一次,我在从暂存环境到生产环境的启动期间,让 MongoDB 实例宕机了 40 分钟。我们的暂存环境与生产环境出现了分歧。这只是数据库配置上的差异——不是很令人兴奋。但这是一个很好的教训,要确保您的暂存环境和生产环境同步!

Em Nouveau

神秘的低语

这来自一个仍在运行的项目,但我更改了代码以隐藏源代码。

for (int c = 0; y < yyy && c < ccc; y++, c++) {
 // some code here
}

乍一看,这似乎是一个无辜的循环。但也许你会问为什么有两个带有两个停止条件和两个增量的变量。然后你意识到只有一个初始化器,第二个变量 (y) 在此循环之前的不同代码块中初始化。

当我意识到这一点时,我花了一个小时才理解为什么代码以这种方式编写,以及它应该如何工作。显然,没有 c 注释,变量名也没有意义(在代码中 c 被称为 cy 有一个更有意义的名称,但不足以向我解释它的含义,即使在我理解它的作用的今天也是如此)。

Josh Salomon

关键数据

大约在 1980 年,我在大学毕业后找到了我的第一份工作。我是印第安纳州一所工程学院的助理计算中心主任。对于一个只有两人的 IT 部门的二把手来说,这是一个响亮的头衔。我在 PDP-11/40 上处理行政计算,使用 RK05 可移动“披萨盘”磁盘驱动器(每个 2.5 MB)。每个行政办公室都有一个驱动器,我的部分工作是每周将它们从磁盘备份到磁盘。但是那个夏天我变得很忙,连续四周跳过了注册办公室。然后我意识到了风险,所以我确保开始我的每月磁盘到磁带备份。

我从 11/40 上卸下了注册办公室的披萨盘,并将其安装在 11/70 上,后者有一个 9 轨磁带驱动器,并开始了我的备份。几分钟后,我听到磁盘驱动器内部发出刮擦声。是的,磁头损坏了。在短短几分钟内,我摧毁了注册办公室的所有数据,以及当时最新的备份,这是一个四周前的 9 轨磁带。

当我不得不看着注册部门主管的眼睛,告诉他我摧毁了他所有的数据时,这是一个,嗯,令人不舒服的时刻。

今天,我告诉新的 IT 人员,在你摧毁了别人的关键数据,并且无法恢复之前,你还不是专业人士。永远记住你胃里那种感觉。

Greg Scott

愤怒的暴民

一位客户破解了 WordPress 核心以添加稍后在例行更新中出现的功能,并且不明白为什么每次他们尝试更新 LearnDash 时网站都会崩溃。(他们也不喜欢我们指出他们糟糕的开发实践的报告。)他们基本上向我们下了逐客令,称我们为骗子和庸才。直到今天,我仍然拥有他们域名的委托访问权限,以及对两个域名的生产和开发的 wp-admin 访问权限。

他们还向我们发送了指向加密位置的链接以共享访问凭据,但仍然通过电子邮件发送了我们的登录名。

Laura Byrne

不要忘记备份

我没有在公司网络上工作太多,所以我没有搞垮任何服务器。但是,作为一个年轻人,我试图帮助一个人解决 IT 问题,但不知何故导致 Windows 95 崩溃,不得不免费重新安装。

作为一名非常年轻的 Amiga 用户,我最悲伤的时刻之一是我的保存磁盘,其中包含我的所有文件,由于某种机械故障而损坏。如今,我在备份更多重要的个人文件方面做得更好了。

Rikard Grossman-Nielsen

万恶之源

我刚接触 Linux 时,我刚从使用 Norton Commander 的 DOS 转过来。然后 Midnight Commander 发布了,我对此感到非常高兴。它没有为我当时使用的 Linux 发行版 (Jurix) 打包,所以我像当时使用的其他软件一样,自己从源代码编译了它。它运行得非常好,突然间我在 Linux 上感觉更像家了。

这不是恐怖故事。

我的同事告诉我不要以 root 身份运行 Midnight Commander,无论它多么令人感到舒适。但是 root 很简单,而且感觉更像 DOS,所以我忽略了他们的建议。长话短说:我不小心删除了整个 /etc 目录的内容。在那之前,我从未使用过备份,但那天我了解到备份实际上很有用。

27 年后,我仍然记得这个故事,并且我会定期备份。

Peter Czanik

幻觉

一家代理机构让我“制作”的最糟糕的项目是一个单页网站,起初看起来很简单。我说我可以用一些 HTML 和 CSS,也许还有一点 Javascript 来把它拼凑起来。但他们特别要求我不要这样做。他们希望我剪掉设计,并真正使用 CSS 将这些碎片定位在页面周围。他们还让我将所有 CSS 内联添加到 HTML 文件中,因为他们真的想要一个页面

所有的文本都不是真正的文本。

除了定位这些图像所需的元素之外,没有真正的 HTML 元素。

我告诉他们,这个设计很简单,我可以把它和实际的代码放在一起,但他们不想要那样。他们只想让我花时间把碎片拼凑在一起,然后继续进行另一个项目。他们让我做了两个这样的小型单页网站。

这伤害了我的前端灵魂。做这个项目对我来说是身体上的痛苦。这是一份临时转正的合同工工作,当他们提供我全职工作时,我礼貌地拒绝了。

Rachel Vasquez

损坏

对我来说最可怕的事情是 ANSI C99 中可能发生的内存损坏。在一个截屏视频中,我捕捉到了这个(不太)超自然的现象,请参见此 YouTube 剪辑

标记为 file 的 GtkEntry 显示一些随机的字形。我已经仔细检查了 代码,但没有发现任何问题。

ags_export_soundcard_open_response_callback() 函数是 GtkFileChooserDialog 的“response”事件的回调。(为了记录,解决此问题的工具是 valgrind。)

Image of gsequencer after memory corruption.

(Joël Krähemann, CC BY-SA 4.0)

Joël Krähemann

Python 的恐惧

我见过的最可怕的编程功能是 Python 提供的对其 dict 的访问权限。在运行时更改对象的类型违反了我的编程行为准则。

Josh Salomon

弗兰肯网络

2006 年,我基于 Fedora 和大量脚本构建了防火墙,并说服一家在托管中心拥有大型网站的客户用我的防火墙替换专有防火墙。我构建了它,并在一个早晨凌晨 4 点出现来安装它。那时我(以惨痛的教训)了解到他有一个负载均衡器在他的防火墙后面,但具有公共 IP 地址。客户忍受了 5 分钟的停机时间,但我将所有内容重新连接到原始设备,一切都恢复了在线状态。

我找到了一种通过使用代理 ARP 来处理他的弗兰肯网络配置的方法。这个想法是,每当外部世界的任何人对负载均衡器执行 ARP 请求时,我都会响应。几天后,我再次在凌晨 4 点出现并安装了我的系统。这一次,我让整个托管中心的所有设备都脱机了。我将我的代理 ARP 设置为响应所有内容,因此 LAN 上的所有流量最终都找到了我,并消失在一个黑洞中。

一旦我意识到我做了什么,我就把一切都恢复了原样。但是损害已经造成。如果您在 2006 年某个早晨美国中部时间凌晨 4 点左右尝试浏览您最喜欢的网站,但它没有响应,那可能是我的错。我通过在一个机架中安装一个系统并将其打开,让整个托管站点脱机。

网站运营商尖叫起来,我溜出了门。他们再也没有邀请我回来尝试。这真是太可惜了,因为桥接可能会奏效。

Greg Scott

你的恐怖故事

你最喜欢哪个与技术相关的恐怖故事?在评论中告诉我们(但要友善,并更改项目名称以保护无辜者!)

AmyJune headshot
AmyJune 是一位经验丰富的社区经理、导师、公众演讲者和包容性倡导者。虽然她的根基在 Drupal 中,但她也定期为 Linux 和 Accessibility 社区做出贡献。

4 条评论

1995 年,新的 RAID5 阵列安装在我们的数据中心。产品经理正在向潜在客户参观。从阵列中拔出一个驱动器,以演示丢失一个驱动器不会导致服务器崩溃。然后他又拔出另一个驱动器,导致服务器崩溃,文件系统损坏。然后我们(系统管理员)演示了我们的灾难恢复程序。我不记得我们是否签下了客户。不用说,产品经理被拒绝访问数据中心,客户数据中心参观必须获得管理层批准。

大约在 1999 年,我为一家互联网创业公司工作。有一天,一位同事开发人员必须从我们的 SQL 数据库中删除一些数据。不幸的是,他使用了递归删除,导致服务器上的所有数据都被删除,包括论坛帖子、用户等。我们确实有备份... 有点陈旧,几个星期前的。由于没有适当的备份计划和使用一些愚蠢的 SQL 删除 GUI(默认情况下启用了递归),我们失去了几周的新用户、论坛条目等社交平台数据。

如果您正在使用 UNIX 或 Linux 系统,并且您肯定要重建它,或者擦除并重建它,那么这里有一种相当快速的方法可以使该系统在您重新安装或构建其他内容之前无法使用。

成为 root 用户,然后运行命令 rm -fr /

您将执行的操作是转到最顶层目录并删除其下的所有内容;从技术上讲,它不会执行“擦除”;但实际上,它使用单个命令删除了整个系统。

就像我说的那样,当您运行这个命令时,您最好是认真的,因为您必须在它的位置创建另一个系统!

我也曾在 HP-UX 11 服务器上做过一次,但该系统正在停机,我们只是想看看从根文件系统中删除所有内容会发生什么。

回复 作者 masinick

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.