万圣节很快就要到了!这个有趣、夸张的节日是思考我们每个人内心深处开发者所害怕的事物的好时机。在你的代码开始运行之前的安静时刻,什么最让你感到不安?
为了迎接万圣节的气氛,我询问了一些 Opensource.com 的作者:你见过或写过的最可怕的代码是什么?
错误的权限
我负责一台服务器,我通过 FTP 上传了一些东西。显示出一些奇怪的东西,所以我认为需要更改一些权限。
不用说,我愚蠢地关闭了读取模式,导致网站瘫痪。(当没有人可以访问网站时,网站就没什么用处了。)
我花了几个小时才修复好。这发生在多年前的一家代理公司,当时我是唯一的网站开发人员。
摇摇晃晃的 HTML
我搞垮了一个客户的网站,他当时是《华尔街日报》畅销书排行榜上的作者,因为原始的 WordPress 默认主题有可用的更新。
他的开发人员将 HTML 硬编码到主题中,而不是创建子主题。我运行了更新。
那时还没有人能轻松地进行夜间备份,所以我花了几个小时与托管服务提供商通电话。像暂存、子主题、夜间备份或手动备份之类的东西现在都很常见,以及自动更新和手动回滚的能力。在那个时代并非如此。
不太秘密的密钥
我认为我们很多人以前都在公共代码中见过密钥。或者另一个最受欢迎的例子:我的一个朋友从开发服务器向 10 万用户发送电子邮件。
Unix 混淆
这是一个 Unix 故事。今天在 Linux 中已修复。
在我要向管理层演示一个新组件的前一天,我必须刷新我的代码(这在 Git 出现之前很久)。我进入我的主目录,找到项目目录,并删除了所有内容。不幸的是,在该版本的 Unix 中,此命令跟随符号链接,我有一个指向最新版本代码的链接(并非所有内容都在源代码系统中,因为它仍处于测试阶段)。
一天后,大楼里出现了网络问题,因此演示被推迟了一天,我们设法恢复了。那是三十多年前的事了。即使现在我也不知道网络问题是巧合还是我们的系统管理员试图拯救我们(如果是这样,它奏效了!)
强制性
在 CSS 文件中到处看到 !important;
,而不是正确使用特异性。
我曾经不得不覆盖和自定义几乎所有 WordPress 主题的 CSS,因为网站所有者不愿更换更接近他想要的设计的新主题。
该主题上次由开发人员在 2018 年更新,而该网站仍在使用它。
错误引用
在之前的职位中,我的前任在代码注释中错误地引用了 Journey 的歌曲“Any Way You Want It”的歌词。
Algol68 的幽灵
早在 20 世纪 60 年代末和 70 年代初,Algol68 的复杂性吓跑了许多有影响力的人,包括 Niklaus Wirth。我当时最常听到的抱怨是“谁能为如此复杂的野兽编写编译器?”然而,许多人做到了。此外,许多在 Algol68 中开发或至少形式化的概念出现在后来的语言中,尤其是在 C 和 Bourne shell 中(感谢 Steve Bourne)。
Algol68 的一些概念已经过时了。处理“书籍”和“章节”等的 I/O 概念在今天看来有点奇怪。将字符集之类的事情留给实现似乎非常老式。
但是有些概念在今天非常重要或应该非常重要,例如产生值的表达式、强类型(Algol68 中的类型称为“模式”)、堆内存和垃圾回收、运算符的定义和重载等等。
坚持万圣节主题,既有惊喜也有惊吓。
Algol68 是一种值得研究的语言,即使只是为了了解现代计算的许多想法从何而来,以及有多少想法在发展过程中丢失了。
密码泄露
我正在为即将到来的支持客户进行技术审核,之前的开发人员将密码以纯文本形式放在整个主题中,并使用了可怕的方式连接到远程数据库。他们的 composer 文件也臃肿得令人毛骨悚然。每次我尝试在本地启动并运行站点时,都需要五分钟。过时的依赖项,我无法访问的存储库,等等。
迷宫
我见过的最可怕的代码是一段 PDP-11 汇编语言,它位于一个名为 RSTS 的操作系统的内核中,今天没有人记得它了。在那些日子里,源代码在缩微胶片上,我沿着这条代码路径经历了一些曲折,试图弄清楚发生了什么。然后,我遇到了这条指令
MOV R5,PC
我举起双手,哀嚎起来。我真的哀嚎了。办公室里的人以为我撞到了头,或者心脏病发作了。
在那些日子里,内存非常宝贵,MOV
指令使用的内存比 BR
(“分支”的缩写)指令少一点点。将寄存器 5 的内容复制到程序计数器实际上是一个廉价的无条件分支,跳转到寄存器 5 中存储的地址。但是,我不知道寄存器 5 中存储了什么,也不知道如何找到它。
直到今天,将近 40 年后,我仍然想知道谁会编写这样的代码,以及任何人如何调试它。
差一位
我在自动化行业工作,那里的 PLC 使用一些非常奇怪的语言进行编程。
一个让我难以忘怀的例子是,在语言 ST 中,你可以定义从索引 1 开始的数组。这意味着第一个元素位于位置 1,而不是 0。当我看到它时,我简直要疯了。
分歧
有一次在从暂存环境到生产环境的发布过程中,我导致 MongoDB 实例宕机 40 分钟。我们的暂存环境与生产环境存在分歧。这只是一个数据库配置差异——不是很令人兴奋。但这是一个很好的教训,要确保你的暂存环境和生产环境同步!
神秘的耳语
这来自一个仍在运行的项目,但我更改了代码以隐藏源代码。
for (int c = 0; y < yyy && c < ccc; y++, c++) {
// some code here
}
乍一看,这似乎是一个无辜的循环。但也许你会问为什么有两个变量,两个停止条件和两个增量。然后你意识到只有一个初始化器,第二个变量 (y
) 在此循环之前在不同的代码块中初始化。
当我意识到这一点时,我花了一个小时才弄明白这段代码为什么这样写,以及它是如何工作的。显然,没有 c
注释,变量名也没有意义(c
在代码中被称为 c
,y
有一个稍微有意义的名称,但意义不足以向我解释它的含义,即使在我理解它做什么的今天也是如此)。
关键数据
大约在 1980 年,我在大学毕业后找到了第一份工作。我是印第安纳州一所工程学院的助理计算中心主任。对于一个只有两个人的 IT 部门来说,这是一个响亮的头衔。我在一台 PDP-11/40 上处理行政计算,带有 RK05 可拆卸“披萨盘”磁盘驱动器(每个 2.5 MB)。每个行政办公室都有一个驱动器,我的部分工作是每周将它们备份,磁盘到磁盘。但是那个夏天我太忙了,连续四个星期跳过了注册办公室。然后我意识到了风险,所以我确保开始我的每月磁盘到磁带备份。
我从 11/40 上卸下了注册办公室的披萨盘,并将其安装在带有 9 轨磁带驱动器的 11/70 上,然后开始备份。几分钟后,我听到磁盘驱动器内部发出刮擦声。是的,磁头损坏了。在短短几分钟内,我销毁了注册办公室的所有数据,以及当时最新的备份,那是一盘四周前的 9 轨磁带。
当我不得不看着注册部门主管的眼睛,告诉他我销毁了他的所有数据时,那是一个,嗯,不舒服的时刻。
今天,我告诉新的 IT 人员,只有当你销毁了别人的关键数据,并且无法恢复时,你才算是一名专业人士。永远记住你胃里那种感觉。
愤怒的暴民
一个客户黑了 WordPress 核心,添加了一些后来在例行更新中出现的功能,并且不明白为什么每次他们尝试更新 LearnDash 时网站都会崩溃。(他们也不喜欢我们指出他们不良开发实践的报告。)他们基本上把我们赶出了门,说我们是骗子和不称职的人。直到今天,我仍然拥有他们域名的委托访问权限和两个域名的生产和开发 wp-admin 访问权限。
他们还,尽管我们分享了一个加密位置的链接用于共享访问凭据,但还是通过电子邮件发送了我们的登录信息。
不要忘记备份
我在公司网络方面工作不多,所以我没有搞垮任何服务器。但是,作为一个年轻人,我试图帮助一个人解决 IT 问题,并且不知何故导致 Windows 95 崩溃,并且不得不免费重新安装它。
作为一名非常年轻的 Amiga 用户,我最悲伤的时刻之一是我的保存磁盘,其中包含我的所有文件,由于某种机械故障而损坏。如今,我在备份更多重要的个人文件方面做得更好了。
万恶之源
我是 Linux 新手,我刚从使用 Norton Commander 的 DOS 转过来。然后 Midnight Commander 发布了,我对此感到非常高兴。它没有为我当时使用的 Linux 发行版 (Jurix) 打包,所以我像当时使用的其他软件一样,从源代码自己编译了它。它运行得非常好,突然我感觉在 Linux 上更像家了。
这不是恐怖故事。
我的同事告诉我不要以 root 身份运行 Midnight Commander,无论它多么令人感到舒适。但是 root 很容易,而且感觉更像 DOS,所以我忽略了他们的建议。长话短说:我不小心删除了整个 /etc
目录的内容。在那之前,我从未用过备份,但那天我了解到备份实际上很有用。
27 年后,我仍然记得这个故事,我定期进行备份。
幻觉
一家代理机构让我“制作”的最糟糕的项目是一个单页网站,起初看起来很简单。我说我可以用一些 HTML 和 CSS,也许还有一点 Javascript 来把它拼凑起来。但他们特别要求我不要这样做。他们希望我剪掉设计,并真正使用 CSS 将这些碎片定位在页面周围。他们还让我将所有 CSS 内联添加到 HTML 文件中,因为他们真的想要一个页面。
所有文本都不是真实文本。
除了定位这些图像所需的元素之外,没有真正的 HTML 元素。
我告诉他们,设计足够简单,我可以把它与实际代码放在一起,但他们不想要那样。他们只想让我花时间把碎片拼凑起来,然后继续进行另一个项目。他们让我制作了两个这样的小型单页网站。
这伤害了我的前端灵魂。做那个项目对我来说是身体上的痛苦。这是一份临时转正的工作,当他们向我提供全职职位时,我礼貌地拒绝了。
损坏
对我来说最可怕的事情是 ANSI C99 中可能发生的内存损坏。在一个截屏视频中,我捕捉到了这个(不太)超自然现象,在这个 YouTube 剪辑中。

标记为 file
的 GtkEntry 显示了一些随机的字形。我已经仔细检查了代码,但没有发现任何问题。
ags_export_soundcard_open_response_callback()
函数是 GtkFileChooserDialog 的“response”事件的回调。(为了记录,解决此问题的工具是 valgrind。)

(Joël Krähemann,CC BY-SA 4.0)
Python 的担忧
我见过的最可怕的编程特性是 Python 允许访问其 dict
。在运行时更改对象的类型违反了我的编程行为准则。
弗兰肯网络
2006 年,我基于 Fedora 和一些脚本构建了防火墙,并说服了一位在数据中心内拥有大型网站的客户用我的防火墙替换专有防火墙。我构建了它,并在一个早晨凌晨 4 点出现安装它。那时我(痛苦地)了解到,他的防火墙后面有一个负载均衡器,但有一个公共 IP 地址。客户忍受了 5 分钟的停机,但我将所有内容重新连接到原始状态,一切都恢复了在线。
我找到了一种通过使用代理 ARP 来处理他的弗兰肯网络配置的方法。这个想法是,每当来自外部世界的任何人对负载均衡器执行 ARP 请求时,我都会回答。几天后,我再次在凌晨 4 点出现并安装了我的系统。这一次,我使整个数据中心的所有东西都离线了。我已将我的代理 ARP 设置为响应所有内容,因此 LAN 上的所有流量最终都找到了我并消失在一个黑洞中。
一旦我意识到我做了什么,我就把一切都恢复了原样。但是损害已经造成。如果你在 2006 年的某个早晨美国中部时间凌晨 4 点左右尝试浏览你最喜欢的网站但没有响应,那可能是我的错。我通过在一个机架中安装一个系统并打开它,使整个数据中心站点离线。
网站运营商尖叫起来,我溜出了门。他们再也没有邀请我回去尝试。那真是太可惜了,因为桥接可能有效。
你的恐怖故事
你最喜欢的与技术相关的恐怖故事是什么?在评论中告诉我们(但要友善,并更改项目名称以保护无辜者!
4 条评论