史上最烂开发项目原来长这样?奇葩代码盘点
The following article is from AI研究所 Author 小智
本文授权转载自AI研究所,作者:小智
临近年末,小智身边的不少开发者忙碌了起来。
吃午饭的时候,研发组的鹏哥就在一旁大吐苦水。
“当初刚接手这个项目的时候就知道它是个坑,这都跟了大半年了,才稍微像样了些。现在加班加点,只希望不要拖到春节后······”
“淡定淡定,能圆满完成就算顺利的了。”
为了安慰鹏哥,小智给他讲述了一则在IT界流传多年的奇葩故事。如果屏幕前的你同样觉得手上的工作又糟心又窝火,听完这个故事应该会开心一些。
首先,整个项目总共600多万行C++代码,50000 多个类,基于CORBA。
600多万行是个什么概念?对比一下:Linux3.13 版内核的代码,在除去内核驱动和架构之外,在kernel/里的源代码有13万行左右;以功能庞杂著称的编辑器Emacs,总源码规模也不过165万多行。
启动这个软件要用时15分钟,启动之后平均30秒到30分钟会崩溃一次,这时候就只能再花15分钟重启。
受编译器版本限制,用的C++语法都非常旧,只能在某个(早就没人维护)的操作系统上部署。
每编译一次需要用48个小时,还是在32台并行的机器上。光用户界面就有40-50个进程同时操作,而且没有用到动态链接,因此运行库要先加载起来,一个可执行程序就有几百兆。
这个牛X的项目得追溯到1996年,法国的一个政府机构请某个公司开发一款软件,预计工期2~3年。
甲方预付了几百万欧元后,公司招了几个程序员开始干活。随着资金陆续到位,公司开始疯狂招人,每隔三个月左右就把队伍扩大一倍。
结果7年过去了,这个项目竟然还没成型。这时候,因为延误造成的罚金已高达每日几千欧元,于是管理层决定要精简团队,减少开支。具体做法是,把有经验的老员工解雇了,以低薪招了一批没啥经验的新手来上班。
一众毫无软件工程经验的人组成的队伍,这不就是个Bug生产工厂嘛!
而相反的,所有的经理们饭碗倒是都捧得牢牢的,一点都没受影响。以至后来,团队的55 个人里只有20个程序员,剩下35个都是经理,平均每个程序员配备1.75个经理······
第10年,管理层终于发现整个项目已经深陷泥淖,这才决定要招一些具有软件工程开发经验的人来弥补。
又苟延残喘了2年,最终,负责项目的公司领导因为挪用资金等原因被捕,进了监狱,这个在地狱烈焰中闹腾了十几年的项目才终于宣告终止。
当然,不是人人都有机会遇上这样的巨型糟糕项目,但项目里大大小小的糟心代码几乎每个开发者绕不过去的坑。
产品经理刁难,前辈离职抛盘,同组“猪队友”挖坑······没有最坑,只有更坑。
这不,网络上流传着众多网友PO出的让人抓狂的代码,每一秒你都能发现比你手上的工作还烂的项目,发现比你还惨的研发。
👇真·颠倒黑白👇
@雨蓝蓝蓝
写这个页面的已经被我砍死了。
@玻璃杯中的鱼
// 以下所有left代表右
// 以下所有right代表左
@ Sc千寻
······
👇取名是个技术活儿👇
@飞面神下一只猪
用户码
UserMa
@ Kun Andy
public enum ColorType
{
Green, // 绿色
Hong, // 红色
}
//......
this.curColortype= ColorType.Hong;
一开始愣是没读懂“Hong”是啥,看了注释才恍然大悟。更犀利的是应该是觉得绿的拼音(lv)有点像等级,为了防止歧义特地用了Green,真是心思细腻啊!(咦
@侯杰
看枚举名字不知道FiveLine是什么鬼,看了枚举内容恍然大悟,原来是五行(xing)……
@王德福
至今忘不了实习单位的代码里面有一个变量叫做“fanpage”,看了上下文之后发现这个变量是控制翻页的。翻page······
@南零落枕
当年一位学长用虚拟现实做过的一个展示飞机的安装过程的项目,变量名都是“poguanzi”(破罐子)“lanchibang”(烂翅膀)"zhuanbuqilaidelunzi"(转不起来的轮子)我看完感觉这飞机迟早得掉下来。
然后函数名都是“bufaqianlaoshi”(不发钱老师)“nengbunengfaqian”(能不能发钱)想象不出学长经历了什么······
类名都是“haoxihuangebinvhai”(好喜欢隔壁女孩)“gebinvhaichuanhongyifu”(隔壁女孩穿红衣服)“gebinvhaihaimeinanpengyou”(隔壁女孩没男朋友)对爱情的渴望是每个程序猿的本能!
不过我接手以后实在是理不出个头绪,最后直接重写了一遍。
@匿名用户
我校的选课系统,有人能看懂这些变量名算我输
👇缺乏安全感👇
@Cyandev
不知道谁写的,看哭了
@共产主义接盘侠
感觉很搞笑但是又说不出来哪里不对····
//拼写容错
#define ture true
#define flase false
#define viod void
#definemian main
👇贵公司是按代码行数发工资吗?👇
@myd7349
只是为了确认输入内容没有非法字符,出现了这样惊天地泣鬼神的操作:
······
哪怕不知道RE,也该知道FindOneOf啊!就是再不济,也写个循环吧!
@benliu
以前遇到一个做测试的,写脚本,我写了一个方法让对方调用,说调用100次看看结果。结果我看到了他的代码类似如下:
我就想说这次麻烦您再调用一百万次试试
@苏格
难道这就是传说中NASA代码的最后一页?
👇玄学👇
@孙传武
有次看一个项目的源码,注释里有个warning是这么写的
@CeleryL
@邓牧泽
代码review的时候发现一个888的全局数组,但看代码最多用20个,我就问作者为什么定这么大,他说“吉利”。
👇说吧你是不是针对我👇
@海大歌
手动混淆法······我刀呢
@淼淼
今天看到对数据库查询返回的列表进行冒泡排序,整个人都不好了。
👇时间都去哪儿了👇
@虎耳
曾经在一个家公司,有一次发现有个地方在执行每个请求时都会空等了一秒。后来问老大,他说,如果客户有新要求,随时可以把性能提高一倍以上······
@破军
Thread.sleep(5000); //等客户交钱优化后删掉
👇找呀找呀找亲戚👇
@青苔
看见这段代码的时候,我拍了很久的掌
@LegStrong
del_yeye();
一时看不出来这是要干嘛,查过去发现是
parent().parent().remove();
合着是要删除爷爷·····
👇神逻辑👇
@TypingW
“你把距离显示优化一下,超过1000米就显示公里,精确到小数点后2位。”“好的!”
然后在Code Review的时候,我看到了如下代码:
最后,我饱含热泪,心怀不忍地将他辛勤的工作成果改成了
小智注:对方的思路是将数字转化成字符串,如果其长度大于4(个十百千,超过1000米的字符串长度会大于4),然后往中间插入一个"."(小数点字符)。
@汤洌
要求程序的功能是输出明天的日期,然后他这么实现了:
休眠一天,然后输出当前的日期。真是个鬼才······
@小脆
证明1亿以内哥德巴赫猜想成立
#include <iostream>
#include<windows.h>using namespace std;
int main()
{
Sleep(2000);
cout<<“1亿以内哥德巴赫猜想成立”;
return 0;
}
不知道看完以上内容,屏幕前的你是否也像我身边的鹏哥一样焕发起了无穷的信心。
毕竟相比之下,他手上的项目真是再正常不过了。
互动话题
你见到过哪些奇葩的代码?