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

不太秘密的密钥

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

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 的幽灵

早在 20 世纪 60 年代末和 70 年代初,Algol68 的复杂性吓跑了许多有影响力的人,包括 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 上卸下了注册办公室的披萨盘,并将其安装在带有 9 轨磁带驱动器的 11/70 上,然后开始备份。几分钟后,我听到磁盘驱动器内部发出刮擦声。是的,磁头损坏了。在短短几分钟内,我销毁了注册办公室的所有数据,以及当时最新的备份,那是一盘四周前的 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 和辅助功能社区做出贡献。

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.