嗨玩手游网

观点 | 20 个恐怖传说:在技术上犯过的最糟糕错误

一些系统管理员、网页设计师、工程师和程序员分享了他们在命令行上经历的最可怕的经历。

每个开发人员内心最害怕的事情是什么?在你的代码开始运行前的宁静时刻,什么最让你感到恐怖?你见过或写过最可怕的代码是什么?

错误的权限

我负责一台服务器,然后我通过 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 的幽灵

在上世纪 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

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

当我意识到这一点时,我花了大约一个小时的时间来理解为什么代码是这样编写的,以及它应该如何工作。显然,代码中没有 c的注释,并且变量名是无意义的(代码中被称为c,y有一个稍微具有意义的名称,但不足以解释它的意义,即使是今天我也不知道它的作用)。

— 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,之前我用的是 DOS,借助 Norton Commander 进行操作。后来,Midnight Commander 发布了,我非常喜欢它。当时我使用的 Linux 发行版(Jurix)没有打包 Midnight Commander,所以我自己从源代码编译了它,就像我那个时候使用的其他软件一样。它完美地运行了,突然间我在 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。)

— Joël Krähemann

Python 的恐怖之处

我见过的最可怕的编程特性是 Python 中对 dict的访问权限。在运行时改变对象的类型违背了我的编程行为准则。

Josh Salomon

缝合怪网络

在 2006 年,我用 Fedora 和一些脚本构建了一台防火墙,并说服了一家托管在合作数据中心的大型网站的客户,将其专有的防火墙替换为我的防火墙。我建立了系统并在一个清晨的 4 点到达现场进行安装。那时我才发现(饱受痛苦地)他在防火墙后面有一个带有公共 IP 地址的负载均衡器。客户经历了一个 5 分钟的停机时间,但我重新连接了一切恢复到原来的状态。

我发现了一种通过使用代理 ARP 来处理他复杂的网络配置的方法。这个想法是,当外部世界的任何人发出负载均衡器的 ARP 请求时,我会进行回应。几天后,我再次在凌晨 4 点出现并安装了我的系统。这次,我把整个数据中心的所有设备都给搞宕了。我设置了我的代理 ARP 来回应所有请求,因此局域网上的所有流量最终都找到了我并消失在黑洞中。

当我意识到我做了什么时,我把一切都恢复到原来的状态。但是损害已经造成。如果有人在 2006 年的一个清晨美国中部时间大约 4 点钟尝试浏览你最喜欢的网站,它没有响应,那可能是我的错。我通过在机架上安装并启动一个系统,让整个数据中心的网站都宕机了。

网站运营商愤怒地抗议,而我则黯然离开。他们再也没有邀请我回去再试。真是遗憾,我觉得再试试桥接可能会起作用。

— Greg Scott

你的恐怖故事

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

via: https://opensource/article/22/10/technology-horror-stories

作者:AmyJune Hineline选题:lkxed译者:ChatGPT 校对:wxy

本文由 LCTT原创编译,Linux中国荣誉推出

我的世界恐怖都市传说,恐怖月亮的故事,没想到竟然是个模组

在我的世界中,有很多灵异的事件,有些事件有着诡异的色彩。其中最让人诡异的属于him,11号唱片,还有实体303。这些都是令玩家非常毛骨悚然的事情,其实在我的世界中。诡异事件还有很多很多,今天我要给大家讲的是一个,都市传说是关于一个月亮,它叫做lunar moon。

刚开始我和普通玩家一样,对这个一lunar moon不太熟悉。比如我们刚刚建立一个新的游戏世界,在正常的游戏环境下玩游戏。然后会正常地度过到晚上,你盖了一个房子,想安全度过夜晚。当你看向窗外,太阳慢慢落下,不久太阳突然消失了一个长相,怪异的月亮升了上来毁掉任何他所看到的东西,这就是lunar moon的故事。

在我的世界中流传着这样一个故事,一个玩家盖完房子正准备睡觉的时候。出现了一条消息,说你不能在这个夜晚睡觉,否则你将会发生一件很严重的事情。当这个恐怖月亮出现的时候,所有的门都会被锁上。

如果你在房间里面不能出去,如果你在房间外面不能进去,如果是这样子,那对玩家非常的危险,因为在夜晚的时候在房间外面非常会容易受到怪物的攻击。随后。就听到了一声巨大的爆炸声。随后游戏就被结束了。这个故事我不知道是真是假,但是这个恐怖月亮给玩家造成的阴影,感觉是非常的大的。

还有一个恐怖代码还是跟这个恐怖月亮有关。比如在游戏的种子代码界面输入lunar这几个英文字母。玩家在晚上玩游戏的时候,就可能随机会出现这个恐怖的月亮。我们可以从图片看到这个恐怖月亮,在半空中用红红的眼睛,看着玩家是非常的诡异。这只是一个传说,不知道是一个模组还是一个插件,但是很多玩家尝试之后并没有遇到这种情况。

随后我在网站上搜索关于这件事情的资料,我在网站上看到三个主播有遇到过恐怖月亮的情况。有一个还录下了一个视频。当玩家进入晚上的时候。恐怖月亮在黑夜中缓缓升起就盯着玩家当时主播非常的害怕,不敢看天空。悄悄地出去看的时候也发现。恐怖月亮正盯着玩家。还有玩家说这个月亮会向你喷火球。

但是这个月亮它会消失在早上的时候。如果有真的有这样的情况,遇到的话,我建议还是不要在夜晚的时候出去,赶快睡一觉。第二天起来就不会看到这个恐怖的月亮,因为这个面貌看起来真的是比较吓人。

我的世界都市传说这篇主要讲的是关于一个恐怖月亮的事情,虽然这个月亮不会对玩家造成多大的伤害,但是在这个恐怖月亮的夜晚下玩游戏还是令人非常毛骨悚然呢。如果胆子大的玩家完全可以无视这个月亮的存在继续玩游戏,如果胆子小的玩家尽量不要在种子代码前尝试luunananan这几个字母。反正阿乐是不敢尝试,我胆子小,怕做噩梦如果是你,你愿意去长时间的种子代码吗?但是最后这个就是一个模组,如果你胆子大完全可以去尝试一下。

关注我不走丢,更多精彩内容绝不让你失望!

今天早上微信崩了,我感觉这还挺恐怖的

今天一大早,朋友发现电脑端微信怎么也登录不上去了,在重启了电脑数次,重装了微信软件数次之后,人也快崩溃了。

于是联系我这个懂点电脑的。

我给他的建议是换个电脑试试,换了两台电脑试试还是不行,很明显,微信服务器出问题了。

于是我告诉他等等吧,估计不是你自己的问题,应该很快就会修复的。

果然,微信崩溃瞬间上了热搜,经历了一个多小时之后,各地微信才断断续续的恢复。

大家都松了一口气,微信正常,恢复到正常的工作生活中。

可是大家不觉得这是一件很恐怖的事情么?微信不只是个工作的工具,他还是咱们的钱包呀,要是正在用钱的时候,微信付不了钱,耽误了一个小时,那是多恐怖的事情。

火车赶不上,飞机赶不上,地铁公交赶不上,因为付不了钱呀,你的汽车也可能在停车场里全都不出来。

世界肯定会产生大量的混乱,因为大家谁也不带现金了。

怎么办?所以呀,手机里不能只有微信,也得装个支付宝,装个银联什么的,一个付不了钱,总还有个替代的。

这也给咱们提个醒儿,出门在外,可以不用钱,但是还是要准备一些,以防止一些突况让你措手不及。

代码恐怖故事:隐藏在复杂代码库中的恐怖秘密

本文讲述了开发者们在复杂代码库中工作的经历和教训,包括代码复杂性带来的问题、架构决策、第三方库引发的意外问题以及令人恐慌的编程错误,以及如何处理这些挑战。

原文链接:https://digma.ai/blog/coding-horrors-tales-of-codebase-complexity/

未经允许,禁止转载!

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

无论你是软件开发领域的老兵,或者刚刚踏上这个领域的新人,你可能都对在复杂的分布式软件环境中工作所带来的压力和那些让人瞠目结舌的惊魂时刻有着深深的认识。我们深信,你一定曾面临过代码库复杂性所引发的问题,也在调试的过程中历尽艰辛,或者因为错误的设计决策而有过自己的“代码恐怖故事”。

毕竟,许多开发者都有类似的故事可以分享。我们决定每次邀请一位知名的开发者,分享他们的代码恐怖故事。这一次,我们请来了 Daniel Beck——一位拥有丰富软件开发经验的专家、产品开发的用户体验顾问,由他和我们分享他的代码恐怖故事。

Daniel 在软件开发领域的经验相当丰富!他从业的时间甚至可以追溯到该行业的早期阶段。他开始工作时使用的浏览器还是 NCSA Mosaic。在那个时代,只需要掌握五个 HTML 标签,你就可以开始投入工作了。在他的职业生涯中,Daniel 积累了独特的见解,我们坚信你们可以从中受益。

大家如果感兴趣可以访问他的博客,大家的访问能给他带来更大的创作动力!danielbeck/blog

处理代码库的复杂性:教训和建议

直观且易读的代码,无论其是否精巧,都优于那些晦涩难解的“聪明”代码。

不应轻易接受厂商将问题归咎于硬件并推荐高价的服务器升级。

认识到快速解决问题可能带来的隐患,理解代码底层工作原理的重要性。

开启和关闭数据库连接是一个缓慢且开销大的操作。

在安装新的 npm 模块或引入他人的代码时,必须深入考虑其潜在的风险和影响。

警惕那些基于个人审美重构代码,却没有提供适当文档或确保代码完整性的团队成员。

确保对代码的更改有充分的文档记录。

对于那些进行无文档变更,为他人设置隐蔽陷阱的同事,应保持警惕。

优化代码审查流程,以解决现有的问题。

要认识到即使像 Facebook 这样的大公司也会犯错误,以免过分迷信他们,比如他们在 2021 年10月4日的 DNS 故障。

避免在生产环境中由于不小心而导致的破坏。

有 BUG 的代码总是可以修复的,而人的关系,那就要复杂得多,需要更加谨慎对待。

关于代码库复杂性,你是否有过令人惊恐的糟糕经历?是什么引发了这场恶梦?

Daniel:这个问题真的只有在回首过去的时候才显得恐怖;当时,我倒是自认为这是我最得意的一次创作。(没错,这是我自己犯下的错误。)

这个项目的目标是设计一个内容管理系统,用于批量生成特殊类型的网站变体。我负责搭建前端系统,输入网站数据,通过一系列精心设计的模板,生成最终的网站。

那是在 20 世纪 90 年代末,那时整个行业都认为 XML 是行业标准,应当遵循。因此,我理所当然地决定使用 XSLT 来构建模板系统。

如果你对 XSLT 不熟悉,它是一种非常纯净的语言,用于将 XML 结构转换为其他 XML 结构,因为 XML 被认为是标准,所以 XSLT 也是用 XML 编写的。

其中一些有趣的挑战包括:XSLT 是严格的幂等的,从哲学的角度来看,这是很好的,但从实践的角度来看,这意味着所有的循环操作都必须通过递归完成,因为增加一个用于迭代循环的变量会被视为一个副作用,因此是不允许的。流程控制最好通过数据的分解而不是分支逻辑来完成。对于习惯了脚本语言和标记的人来说,这真的是一个大挑战。

我却很喜欢它。我不再需要从后端的团队那里获取我需要的具体数据,所有的数据都会以一个巨大的 XML 块的形式传给我,我可以通过我日渐庞大的 XSL 模板块生成我想要的任何东西。我觉得我有了超能力!我可以做任何事情!

现在,需要明确的是,整个过程我都乐在其中,我完全清楚我正在使用的是一门注定要失败的语言。这是在现代前端框架诞生之前很久的事情了,那个时候,“前端”技能通常意味着你熟悉 Photoshop、HTML、CSS,以及可能从其他网站“查看源代码”功能获取的一小部分 JavaScript 代码。相比之下,这里有一种非常复杂,看起来很奇怪的“前端”语言,它需要一些比当时的网络开发者所习惯的计算机科学概念更为高级。

但我却很喜欢它,而且正在学习这些高级概念,并因为能做到这一点而。在大约一年的时间里,我构建了一个相当大的模板集,随着我对我正在做的事情的理解逐渐深入,它们变得越来越不那么糟糕。到最后,我在编写高度解耦的,符合最佳实践的代码,我觉得它们聪明,甚至有时候会觉得有些“优雅”。我按照计划发布了产品,收取了我的合同费用,然后带着满满的信心投入到了下一份工作。

我得到的消息是,在接下来的五年里,他们一直没对这些 XSL 模板做过维护,直到产品被全部淘汰并替换,因为在公司里真的没有其他人能理解它们是如何运行的。显然,那些我自认为聪明、优雅的代码是多么糟糕。我的早期,简单直接的代码反而更易于理解和维护。

这是一个重要的教训。直观、易读的代码,无论其是否精巧,都优于那些聪明且复杂的代码。

请描述一个在项目中遇到的可怕的架构决策。您是如何处理的?

这是我作为自由职业开发者的岁月中的一次经历。一家经常将大部分开发工作外包的中等规模公司,也是我的长期客户,有些惶恐地找到我:他们将一个小型项目托付给了一个新的供应商,工作已经接近尾声,即将达到上线的时刻。然而,一旦他们开始使用实际数据替代测试数据,他们便开始遇到严重的性能问题:当网站需要处理超出小数据量时,整个网站就会显著地变慢。供应商将问题归因于硬件,并建议升级到更强大、更昂贵的服务器。在掏出这笔钱之前,客户让我来对此进行实地考察。

长话短说,问题最后被定位到是供应商编写的一个函数导致的,这个函数使得他们与数据库的交互变得更加便捷:你只需要将 SQL 查询语句输入给它,它会打开数据库连接,执行查询,返回结果,然后清理并关闭连接。

这的确使他们的代码非常易读。然而,问题在于——我相信许多读者可能已经意识到——开启和关闭数据库连接是一个缓慢且耗资源的过程。理想情况下,你应当在开始时打开一次,执行所有查询,然后在全部完成后再关闭。但是,由于这些人的编程方式是对每一个独立的操作都开启和关闭连接,这就意味着有时需要打开和关闭数百次甚至数千次:一次是为了加载数据列表,然后每一项列表数据都需要再次开启和关闭。难怪服务器会变得如此慢!

最后,问题得到了简单的解决——只需将 'open' 和 'close' 操作从实用程序中移除,将它们移到程序的起始和终止部分,而非在循环中重复执行。然而,这是一个极好的例证,展示了快捷方式的潜在危险,以及使事情运行起来和理解为何它能运行以及它在后台做了什么之间的差别。如果他们每次开启和关闭数据库都必须编写代码,他们可能就不会遇到这个问题了,但事实却是,这个操作被隐藏在辅助函数里,所以人们很容易忽略。

我每次安装一个新的 npm 模块或者以其他方式引入别人的代码时,都会想起这个故事……这个模块在做什么看似合理的事情,有可能会给我的工作带来困扰吗?

重构之殇——如何走向失败?

我们拥有两个独立却相关的网络产品,由各自的团队分别使用不同的编程风格在各自的代码库中进行开发。我们的目标是将这两者整合成一个产品。

由于两个代码库的复杂性和庞大规模,要将它们重构成一个整洁、统一的代码库无疑是一个长期的项目;与此同时,我们急需一个短期的解决方案。

我们原本应该保持原有的代码不变,只需在统一的用户界面上添加各个产品间的导航链接。

然而,我们实际上做的是将产品 A 的所有代码复制到产品 B 的代码库的子目录中,希望能够逐步重构两个产品的代码,使之互相匹配,并在此过程中找出并消除重复功能。

这个方法可能会取得好的结果!然而,一个事实打破了这种可能性,那就是那位负责复制代码的工程师认为在此过程中进行部分重构是个好主意。他根据自己的编程风格,对两边的代码进行了大量的重大改动,完成程度各不相同。

在这个过程中,他大部分时间都在设法避免对代码产生明显的破坏,然而他同事们并不知道他已经做了一些未记录的改动,这些改动也留下了难以察觉的陷阱。然后,他立即辞职,加入了一家竞争公司。

此事件确实反映了该组织在管理和代码审查流程方面的重大缺陷。

所以,我们最终以原本预计的两倍时间投入完成了那个艰难的重构,同时也进行了代码审查。我们最终完成了,但整个过程非常痛苦,是我至今为止最令人后悔的一次经历之一。

最后我听说,那家公司正在“拆分单体应用”,并开始将那个统一的前端分解为独立却相关的产品。

你是否曾被第三方库或框架带来的意料之外问题或复杂性困扰?

在 2021 年 10 月 4 日,Facebook 因 DNS 故障导致自身以及其相关 API 大部分时间不可用。这也使得我们的应用程序由于过度依赖这些 Facebook 的 API(我们默认它们永远在线)而被迫下线。毕竟,这是我们都信任的 Facebook,没人会预料到 Facebook 的服务会出现这样的问题。

为了修复这个问题,我们紧急进行了大量代码重写。然而,就在我们几乎完成部署并让应用程序在没有那个 API 的情况下也可以正常运行的瞬间,他们的 API 服务恢复了。

好吧,至少我们为下次问题做好了准备。

你是否经历过令人恐慌的惊魂时刻,或者犯了令你心惊胆战的编程错误?

我一直严格确保自己不去访问生产服务器,因为我不想成为那个无意间在生产环境中破坏某些东西的人。

然而,我还是犯了错误:“这里还有一些未合并的代码,让我登录服务器来处理一下。”结果造成了意外!那天在 Slack 上的情况,我都截图保存了下来:

但这还只是代码问题,代码问题比较好解决,人就难搞定了。

我职业生涯中真正的恐怖瞬间,则要追溯到 Slack 和 Hipchat 之前,回到电子邮件的时代。

那是在一家小而成熟的初创公司。我们的一位客户支持人员在深夜向团队的一部分人发送了一条消息,寻求处理一个特别苛刻的客户问题的建议。我已经不记得具体的问题是什么了,但那个问题演变成了一场工作时间之外的抱怨会,我们大家都在电子邮件中抱怨这些客户多么难以应对,他们的一些要求多么不合理。名单越来越长,从销售到工程到首席执行官,每个人都对此进行了抨击。最后,客服代表得到了她需要的答案,并将其发送给了客户。

然后这个消息回到了列表中:“呃...伙计们?我想我可能不小心把整个电子邮件线程都转发给了客户。”

接下来的十分钟内,所有人都陷入了沉默,心跳加速地翻阅整个回复链,寻找自己可能需要道歉的言论。最后结果证明是虚惊一场,她实际上并没有将整个电子邮件线程发送给客户。但那确实是一个我希望再也不要经历的惊魂时刻。有 BUG 的代码很容易修复,但人的关系破坏了就很难修复了。

本文是“代码恐怖故事”系列第二篇,第一篇《代码恐怖故事:揭秘形成复杂代码库的常见原因》欢迎大家回顾。

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

更多资讯
游戏推荐
更多+