编程实在糟透了

我的朋友们,如果你在工作中需要每周至少两次搬动比笔记本更重工具,可以在聊天中这样来吐槽:“伙计[1],你工作太不努力了。刚过去的一周我工作了4700小时,用螺丝刀在魔多[2]下面挖了一条隧道呢。”

他们说的没错。魔多的确令人讨厌,而且很显然挖隧道也比拨弄键盘更耗费体力,除非你是一只蚂蚁。但是出于讨论的目的,我们是否能认同压力和疯狂是坏事呢?嘿,欢迎来到编程的世界。

所有的编程团队都是由疯子组成的

想象你加入了一个工程团队。你可能刚离开学校踏入社会,还未受尘世的侵染,心中满腔热血,创意层出不穷。那些优雅的设计以及他们对于目标、经济和力量在美学上的协调统一令你振奋不已。

一切从会见Mary开始,她是大都市中一个桥梁项目的主管。Mary又将你介绍给Fred,你需要通过Dave部署的15项安全检查,因为Dave的毛衣在他的桌上被偷走了一次,显然不会再发生了。Fred只和木头打交道,于是你很好奇他为什么也参与进来了,因为这座大桥需要在高峰期承受装满人类的车辆从上面通过,而脚下200英尺便是湍急的河流。Mary表示无须担心,Fred是来处理人行道的。啥人行道?好吧,Fred已经提交了一份优秀的人行道方案,并且他们准备将其添加到桥梁建造申请中。毫无疑问,他们是无法为人行道安装护栏的,因为被迫遵循一个严格的无护栏原则,这是Phil提出的,然而他并不是工程师。没有人清楚Phil到底是干什么的,但肯定全是和上层管理者协调应酬之类的活。任何一个工程师都不愿意去对付那些人,于是就由着Phil吧。同时,Sara发现了几个“最尖端”[3]的铺路技术,并且全部加到了大桥的设计中。

这也就意味着在整个工程进展中,需要为每一个技术单独建设实施,因为不同的技术意味着不同的底层支持和安全考量。Tom和Harry一起共事了多年,但是他们关于使用公制还是英制测量单位的争论却如夙怨一般从未停止,最后发展到“谁先拿到这部分的设计就以谁为准”的地步。这可令那些整合施工的人万分头痛,于是他们放弃了。无论实施、锤炼还是焊接,都只按各自手头处理的部分进行,以勉强应对。另外,这座桥被设计为一座悬索桥,然而并没有人知道到底如何建造悬索桥。因此工程进行到一半时,他们为其增加了额外的立柱来保证稳定性。但是还剩下悬索没有处理,它们依然是桥梁的一部分。可惜所有人都不知道到底该属于哪个组件,有一点是每个人都十分认同的:它们一定很重要。在入职介绍结束后,你被邀请发表一些新想法,可你一个点子都没有,因为你对桥梁一窍不通,你只是一个发动机工程师。

你敢驾车驶过这座大桥吗?我想不会。如果它真建造出来了,每个参与的人都会被处决的。这个故事的某些版本其实描绘了你用过的每个程序,银行软件、网站以及互联网上一个无所不在的程序,它号称能保护个人信息,然而没有做到[4]

所有的代码都很烂

独自在家时,每个程序员都偶尔会关掉刺眼的日光灯,小酌一杯苏格兰威士忌,放上几曲轻快的德国电子乐,然后打开电脑中的一份文件。对于每个程序员,都会有不一样的文件。他们有时编写,有时找寻并保存。他们对其字斟句酌,又为其美丽而落泪。但是泪水随即会变得苦涩,因为他们想到了那些漂泊在外的文件,想到这世界上的美好和真实终将不可避免地土崩瓦解。

这个文件中的代码是优雅的。它有着易读并且一致的函数和变量命名。它非常简洁。它没有包含任何明显的愚蠢语句。它从来没有被放逐野外,也无须应对销售团队。它完成了单一的工作,并且做得非常漂亮。它仅仅由一个人编写,从未被他人染指。它读起来像一篇而立之年的人撰写的诗歌。

每个程序员一开始都创造着这样完美的六边形小雪花。然后周五时他们被告知下周二之前需要再完成六百片,于是他们在这儿和那儿投机取巧。比如复制一点雪花,和另外一些粘起来,或者叫一个同事来处理那些他融化的雪花。结果所有程序员的代码都被倾倒在一起,变成难以捉摸的形状。这时会有人拿一副毕加索的画挡在前面,因为没人愿意看着湿漉漉的猫尿洒到你那破碎的雪花上,在日光之下慢慢融化。下周,每个人都会铲起更多的雪堆到上面,以防“毕加索”轰然倒塌。

有一个理论这么说,你可以通过遵循标准来治愈上述病症,如果“标准”的数量比计算机实际能处理的还要多,就无能为力了。这些标准全都在以各种方式改进着,或者恶化着,仅仅依赖编码者的个人喜好。因此现实中没有哪段代码能满足这些标准,除非能够以一些极其不同的方式做到一些完全相同的事情[5]。即使你对每种涉及到的语言、框架和标准都十分熟悉,任何工作最初的几周,都要耗费在弄清楚一个程序是如何运作的,因为标准是独角兽[6]

前方总有黑暗

我成长的那几年,卧室中有一个衣橱,它有着古怪的设计。乍看之下衣橱很普通,当你走进去想要拿取衣物时,发现右边的墙上有个凹槽,能做成方便的小搁板。然后你向上看,凹处的背后却让出一条路,通向了彻底虚无的绝命空间。没有光线可以抵达那里,你也立刻分辨出它们正是那些夜幕降临时只能依靠手电筒和毛绒玩具与之保持距离的饥饿的怪兽。

这其实就是学习编程的过程。你开始接触一些有用的工具,接着环顾四周,又发现一些更顺手的新工具,而在它们却展现了那些始终徘徊在你噩梦中的无尽的恐惧。

举例来说,假设你是一个水平一般的web开发者。你熟悉一打编程语言、大量的类库、标准、协议。你依然需要每周学习更多,并且有数百项检查要做来查看它们是否被更新或者已经失效,以保证它们整合到一起还能正常工作。还有某个周末你喝醉后飘飘然想出利用漏洞的坏点子,不知道是否有人已经修复了这个bug。现在你和你的代码们都已经处于最新状态,真是厉害,接着一切都弄砸了。

“什么鬼!”你吼了出来,随后开始追查问题。你发现有一天,有个白痴因为另一个白痴定义了1/0等于无穷大,而直接使用1/0作为无穷大的简写放到代码中。这时一个不那么白痴的人认定这是一个白痴的行为,其实最初的白痴就应该这么认定了,可惜他没有这么做。因此这个不那么白痴的人决定做一个混蛋,把直接使用1/0的行为作为错误添加到他的编译器中。并且他不打算告诉任何人这件事,因为他已经是混蛋了。于是你所有的雪花都被尿了一遍,甚至还找不到那只可恶的猫。

你在这些技术上都可以称得上是专家,这是件了不起的事。依靠丰富的经验,你只花了6个小时就找到出错的地方,如果不是这样,可能就被离职了。现在又多了一条真理需要收藏进你那已经铭记了百万条事实的脑袋中,因为太多你依赖的程序都是由混蛋和白痴编写的。

这仅仅是在你所选择的领域中发生的事,只能代表计算机科学中所有知识的很小一部分,其中可能有些你都完全没接触过。没有任何一个人能说清楚你那台服役了5年的MacBook中每件事是如何完成的。为什么我要你重启试试?[7]因为我们对于哪里出错了连一丁点线索都没有,而且让计算机陷入崩溃实在太容易,所以不如让系统内置的自动化医生帮我们找出问题所在。程序员的电脑比其他人的工作得更好的原因只有一个:他们知道计算机其实是患有精神分裂症和自体免疫性疾病的小孩,当它不好好工作时,不会以棍棒相见。

互联网完成了太多事,却使它成为了自身的炼狱

还记得有关疯子和烂代码的故事吗?互联网也是这样,只不过它还要糟糕无数倍。那些美化过的购物网站,可能由两三个动态页面组成,实际上背后有一个团队正不分昼夜地维护着。因为残酷的真相是这个网站每时每刻都会冒出新问题,在每段代码中都是,对于每个用户都是。就在此刻,某个Facebook的工程师被淹没在成千上万的错误信息中,他拼了老命追查问题所在,否则精心伪装的外表可能就此崩塌。目光转到Google的办公室,有个团队已经三天没合眼了。某处一位数据库程序员,已经被堆积如山的激浪[8]空瓶包围,她的丈夫心想她大概已经死了。如果这群人停止工作,那可是世界性的灾难。大多数人甚至不了解到底系统管理员(sysadmin)是做什么的,但是相信我,如果他们所有人都同时午休,即使你为了保护自己的罐头不被变种人[9]的巡回乐队抢走而打光所有子弹,他们也没空去熟食店买一份速食午餐。

你无法重启互联网。数万亿美元依赖着如摇摇欲坠的蜘蛛网般的非正式协议,还有那些“目前这样就行了”[10]的代码,其中你可以找到十年前添加的一句注释:“TODO: 修改这里实在太危险,但是我也不知道哪儿出错了”。我甚至还没提及那些攻击互联网各个部分的黑客军团,有的是间谍活动,有的为了赢利,还有的只是单纯无聊而已。听说过4chan吗?4chan可能毁了你的生活和工作,仅仅因为某天下午他们决定不再喜欢你了。但我们对此从不担心,已经进入核冬天了,再多一个核武器也没什么大不了的。[11]

在互联网上,这么说是没有问题的:“你知道,只要你用了合适的技术,在某些时候,某些事情能良好地运作。”随后,BAM!互联网就成了现在这个样子。任何怀揣几百美元并且拥有一台电脑的人,都可以抢占互联网中的一小块地盘,肆意上传那些糟糕的代码片段,然后将一条条支流汇入互联网的干流,于是这锅粥中又多了一颗老鼠屎。即使是好程序员,也懒得去学习那些晦涩难懂的说明文档,而这正是一些组织用于建立标准而创造的独角兽。因此人们花费一半的时间重复着毫无意义并且随时可能崩坏的代码,而我们只是努力掩盖这样的事实,祈祷不被发现。

互联网上有这样一个秘密:在你第一次打开浏览器的5分钟之后,俄罗斯的小孩就获取了你的社会安全号[12]。你是否已经在某个网站注册了?那么NSA现在开始就能自动追踪你的地理位置,直到你生命的尽头。你是否发送了一封电子邮件?那么你的邮件地址马上会出现在尼日利亚的某个广告牌上。

这些事情并不真切,因为我们从不关心,也不会试图阻止,而它们又是真实发生的,因为每件事都在出错,因为所有的代码都很烂并且每个人都仅仅只想维持它的运转。如果你在互联网上工作,将会有这样的经历:祈求你写下的最后一段代码足够好,才能偷得几小时的空闲,来享受一顿安心的晚餐或者躺下小憩片刻。

我们并不想疯,都是被逼的

[13]很可笑是吗?不是吗?如果换成下面这样:

[14]这哥们帮上忙了吗?靠骆驼?这看起来是一个合适的回答吗?不是吧?很好,你至少还知道耶稣在哪[15]。你还没有花费过多的生命在阅读代码上,以至于说话都变成了代码。人类的大脑并没有特别善于应对基本逻辑,但是现在有一个工种除了处理犬牙交错的逻辑,什么也不干。大量抽象的条件链和语法要求都需要仔细检查,确保没有放过遗漏逗号这种错误。没日没夜地做类似的事情使你处于一个精神失语的状态,当你盯着别人,都无法分辨他是否已经说完了一句话,因为他脸上并没有打出分号。你沉浸在这样一个无意义的世界里,唯一重要的事是一串数字飘入由符号和另一串数字组成的巨大迷宫,或许从另一端冒出来的是张猫咪的图片。

人们创造的编程语言已经展现了一种对大脑毁灭性的冲击。下面是一个程序:

上面的程序和下面这个做了完全相同的事情[16]

还有这段程序[17]

还有这个[18]

结果某天有人创造了一门编程语言,最终让程序员写出了这样的代码[19]

根据作者的意思,这个程序的作用是:用两行代码解析了上下两行注释,读取其中的玛雅数字,转换为ACSII用于组成杂志的标题,并且渲染出旋转90度的ASCII艺术字。

此程序获得了编程比赛的冠军,毫无疑问它做到了。你愿意生活在这样的世界之中吗?不。这是一个你每天抽掉一盒烟,也不会有人来询问原因的世界。”他当然每天一盒烟,谁不是呢?“最后每个程序员在睡梦结束睁开眼,又完全清醒之前,他们发现整个世界和其中每一份感情都变成了代码片段。他们彼此交换着生活的故事,仿佛开启一天艰辛旅程的困倦已经稀松平常。这是一个避性不谈的世界,他们更愿意为猩猩编写一门语言。所有的程序员都强迫他们的大脑做着一些本不该做,也无法做得更好的事情,每天10到15小时,每周5到7天,他们中的每一员都正缓缓坠入疯狂的深渊。

[20]的确,我不需要具备举起50磅重物件的能力。而是以此换来了一个机会:在撒旦离开我大敞的颅骨出来就餐时,精心修剪他的毛发,确保互联网中的一小段代码能够继续工作几天。


  1. 他们总是要以”伙计“开头 ↩
  2. 译注:指环王中黑魔王索伦管辖的区域 ↩
  3. 译注:hemorrhaging-edge,直译出血边缘,形容过于前沿而伴有高风险的事物 ↩
  4. 译注:记得OpenSSL的故事吗? ↩
  5. 译注:此句中作者可能打掉了一个in,有兴趣的可以参看原文 ↩
  6. 译注:西方神话中独角兽难于驯服。旧约·约伯记中也有类似描述:Will the unicorn be willing to serve thee, or abide by thy crib? ↩
  7. 译注:turn it off and on again出自英剧 – IT狂人 ↩
  8. 译注:Mountain Dew,一种功能饮料 ↩
  9. 译注:电影Mutants中人类感染病毒变成的僵尸 ↩
  10. 译注:2012年Hacker News上一个很火爆的讨论 – There's no shame in code that is simply "good enough" ↩
  11. 译注:4chan中有很多极端分子,热衷于核武器 ↩
  12. 译注:类似国内的身份证号 ↩
  13. 译注:Cthulhu是克苏鲁神话中的邪神 ↩
  14. 译注:sed或者perl中的替换,意为将驼峰写法换成下划线 ↩
  15. 译注:形容你还没迷失自己 ↩
  16. 译注:Unlambda语言 ↩
  17. 译注:Brainfuck语言 ↩
  18. 译注:Ook!语言 ↩
  19. 译注:这代码是The Fifth Obfuscated Perl Contest中,The Old Standby类别的冠军 ↩
  20. 译注:结尾的咆哮,作者已经沉迷了 ↩
2 2 收藏 评论

关于作者:蒋生武

Coding for love, coding for fun. 个人主页 · 我的文章 · 26 ·   

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部