我见过的最糟糕的程序代码

水果

大多数的客户项目在任务完成之后都会很快的从记忆里消退,但有些,你一辈子都不会忘记。我要说的这个属于后者。

这事发生在很多年前,在一个相当大的公司里,公司名我就不说了。那个软件有一大堆程序,是一个商业系统的核心模块,由一个、单独的一个的小伙维护着,这个家伙不久前被炒了。

像这样的事情其实都很正常,一些公司通常会发现他们的一些关键性技术自始至终都保存在一个人的头脑里,当有事情发生时,就像现在这个人,你通常会经历一阵痛苦阶段去阅读他留下的东西,之后生活慢慢趋于正常。

这次有点不一样。

这个程序出了点问题,公司派了一个去修复这个问题,等他回来后发现精神有点反常,不是哭就是笑,嘴里嘟囔着什么“匹萨调用汉堡并且传入了包子”。

程序员的代码里通常体现着自己对幽默的理解以及对‘工作保密’这个词的认识。我们都听说过一些难以置信的故事,比如说公司辞退了某个搞技术的家伙后,结果被告知如不在48小时内向某个海外账户打入多少钱,会计软件将会自动删除所有客户记录。像这种的小伎俩相对而言还好处理 —— 假设这些传说的故事大多数都是真的,我还是很难相信,我从来没有在现实生活中遇到过这种事情。

这个家伙留下来的软件里没有任何的逻辑炸弹或下流的阴谋,编译很正常,除了有一个bug外,一切都工作的很好。但是,你需要想像一下:程序中的所有函数、变量名都是以食物命名的。匹萨,西红柿,泡菜,各种味道的奶酪,水果,蔬菜,酒,等等,一篇一篇,全是这样。里面唯一能让你马上知道意义的地方只有‘main’函数名和C标准类库的调用。

就这样,我接手了这个费力不讨好的烂摊子,努力的把程序恢复到一个可维护的状态。

说实话,这是一个极好的加密形式,只有拿到密钥你才能让这些“代码沙拉“变得有意义。一点一点的,我把这些函数名和变量名改成具有意义的命名,开始很麻烦,之后慢慢的变得容易些。

把已知的函数和源代码进行恢复要比对未知的代码进行反向解析容易的多,因为首先你要分清代码里哪些是程序,哪些是数据,而放在我前面的这些程序显然都是明文,所有这活儿并不是不可能完成,或者说是格外的困难,只是这活儿太乏味太无趣了。一旦你发现了某个变量可能应该给个什么样有意义的名字,余下的就是查找和替换。

另外一个问题是,代码写的太烂,事实上,这意大利面条式的代码比这些毫无意义的符号更让人困惑,等我把函数名和变量名都改回有意义的名称后,我开始把一大堆的代码重写,让它们易于理解、效率更高。

我始终没有弄明白他是否还有一套没有加密混淆过的代码,他可以使用一些‘混淆’脚本通过替换的方法把原始变量名混淆成这样。我很难相信一个人会在最初时就把代码写成这样,因为这对他自己也是一个巨大的挑战,这里肯定有一些高超的技术。

当然,如果你的脑子里还在想:你不能因为我的变量名没有什么意义就把我开除了(或应该招我回来改程序),那你是在妄想,不管这个家伙的用意是什么,他的做法十分的错误(我很难想象他的前任老板还会推荐他),不管怎样,这事儿让我乐了好几周。

[英文原文:The worst program I ever worked on ]
分享这篇文章:

35 Responses to 我见过的最糟糕的程序代码

  1. zen says:

    那个程序员真是神人啊!他编程的时候能知道蔬菜是什么意义的变量,函数。强大的人啊!

  2. 陈少举 says:

    我们公司对于这种无法用通俗语言阅读的代码叫“人渣代码”。
    Twitter@chenshaoju

  3. Yuest says:

    我觉得挺可爱的。这家伙真有想象力。

  4. haitao says:

    所以要善待程序员啊

  5. bingo says:

    个性毛,公司雇你,你写出不可维护的代码,这就是失职。而且这是故意犯错,完全就是讹诈。

  6. gcyy0106 says:

    真有想象力,不过就是手段太肮脏了

  7. 风随影尘 says:

    搞笑?搞笑!这样的程序员真是让人无语了。。。

  8. zgy says:

    应该是临走前做了一次find/replace

  9. 测试 says:

    没办法啊,很多黑老板,逼得手无寸铁的程序员只能这样防御了

  10. 毕达哥拉斯半圆 says:

    如果是中国程序员的代码,丫死定了,蒸羊羔,蒸熊掌,蒸鹿尾儿,烧花鸭,烧雏鸡儿,烧子鹅,卤煮咸鸭,酱鸡,腊肉,松花,小肚儿,晾肉,香肠,什锦苏盘,熏鸡,白肚儿,清蒸八宝猪,江米酿鸭子,罐儿野鸡,罐儿鹌鹑,卤什锦,卤子鹅,卤虾,烩虾,炝虾仁儿,山鸡,兔脯,菜蟒,银鱼,…貌似是来自德云社的程序员…

  11. aaaaa says:

    程序员要有坏心眼,什么都当不住.
    最简单的是替换一下就可以了.
    不过,以前的笑话里都说程序员最喜欢的是用随机字母组合.

    • Currahee says:

      随机字母还不够,要用数字“1”、大写字母“I”、小写字母“l”来随机排列组合,保证让阅读者生不如死。

  12. seeeyou says:

    一个技术人员的公司,连个review的人都没有,你怎么指望他写出来的代码可保证呢?

  13. vinbin says:

    他不是在编程,他是在炒菜~~不去做厨师可惜了,记得那么多食物的名字。。。

  14. 驰哥 says:

    我以前学网页开发的时候,看过一个必胜客每天一款半价的网站。我查看了他的Javascript源代码,一开始还挺好理解,但是往下面翻,就开始出现“fuck_pizza()”这样的函数。。。寇总懂的。。哈哈哈哈哈

  15. Nervecell says:

    我们这边有个php代码中的一个函数叫function nimei()

  16. officeants says:

    就没有版本记录?log/history一类的?

  17. fyb says:

    就没有版本管理?git, svn 什么的。

  18. newmewo says:

    水果命名也没什么不好。关键是一个团队要有一个相对统一的方法。

  19. cheery says:

    从来不知道还有这种事情

    • newmewo says:

      以下这些与本文内容无关。
      水果命名。这只是相对于 针对 实现目标命名的一种 另类 命名方式。
      如果一个团队需要做一个项目, 具体到每个小部分,大家都用代号。
      比如成员 甲乙丙丁, 看似无关,其实有关。 程序当中各个部件都被抽象为一种工具。 原材料,加工器具,半成品,作料,次品,回收再利用。 这些都是很抽象的概念。 团队里在进行之前已经做过抽象化的,比如建筑模型样的谈论。最终确定了一套方案,然后实施。 任何部分都是对整个功能的抽象。没有比这个更能帮助实现者更快的定位代码了。

      抛开开发,就以应用为例, 产品在做仓库管理以及物流的时候。对内部人员,我们通常不以产品名称命名,我们都以编号命名。 “红果71出炉”“红果71定7出4。”“红果71空”。
      填内部流通单子的时候,整个单子都是圈圈和数字,外部来人根本像天书,同事看到一目了然。 这些叫习惯。是很难改变的。 某些都已经是传统了, 属于一些内部文化。当了解过,会更清晰明了。缺乏的只是一个字典。这个字典比任何技术文章都清晰易懂。只需要一个指点。

  20. Phil says:

    只要能理解都无伤大雅的

  21. DSWhale says:

    水果蔬菜什么食物名还好,万一写成数量不一的下划线,打眼一看全是下划线,这工作就难做了。。

  22. Adam says:

    以后可以试试这种方式

  23. Dragon says:

    我有个问题,难道写完程序就没人REVIEW了吗?

  24. nydfcq says:

    我晕。我也是才刚开始学写网页,水平也超低的,大家不要笑我啊,我以后慢慢会越来越好

  25. 1 对这篇文章的反应是笑死了
  26. gulusi 对这篇文章的反应是赞一个
  27. Jassor 对这篇文章的反应是笑死了
  28. 廖杰 says:

    最糟糕的是我同事,拒绝提交代码,项目经理一直说也不也不提交代码,只提供类库。

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据