热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

史上最烂的项目:苦撑12年,600多万行代码...

点击上方蓝色字体,选择“标星公众号”优质文章,第一时间送达编译:欧剃来源:projectfailures.wordpress

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

640?wx_fmt=jpeg

编译:欧剃

来源:projectfailures.wordpress.com

你见过最烂的项目,撑了多长时间才完蛋?六个月?一年?今天介绍的这个奇葩项目,不但一开始就烂得透透的,还硬撑了12年多,直到项目负责人被逮起来丢进监狱才完事。

到底有多烂?用下面这组触目惊心的数据告诉你↓↓

● 总共 600 多万行 C++ 代码

● 总共 50000 多个类

● 受编译器版本限制,用的 C++ 语法都是陈旧过时的,只能在某个(早就没有维护)的操作系统上部署

● 基于 CORBA

● 采用的数据库软件来自一家早就破产的公司

● 好几层互相叠加的层共同组成了用户界面,而且这些层没有一个是由原作者维护的

● 运行一个用户界面需要启动 40-50 个子线程

● 在 32 台并行的机器上需要 48 小时进行编译

● 没有采用运行库动态链接技术,一个可执行程序就有好几百兆那么大

● 启动这玩意大约需要 15 分钟

● 然后一般 30 秒到 30 分钟内会崩溃

你从未见过的“地狱级”烂项目

十年前的 2008 年,科技博客 projectfailures 爆料,博主那几年曾受雇于法国的一家大型科技企业,参与过一个政府机构委托的软件项目,职位是咨询顾问。在那里,他亲眼见证了登峰造极的愚蠢和疯狂,以及它们在软件开发工作中起到的可怕作用。

十年过去了,这个地狱般的项目又被人翻了出来,再次炒的沸沸扬扬,而 projectfailures 博客甚至还就此专门出了一篇回顾。

在文章中,他这样写到:“这已经不仅仅是什么缺乏专业能力的问题了,这个项目中对人类尊严的无情践踏,已经严重到有的时候让我感觉置身于监狱之中。”

啥啥啥?不过是写点代码而已,除了赔上头发,难道会连命都搭进去吗!?这个项目咋这么恐怖啊!

这项目到底啥情况?

大约是 1996 年,法国的一个政府机构请某个公司开发一款软件。总的来说这玩意应该不太复杂,只不过有一些不太寻常的小问题需要解决罢了。

甲方预付了几百万欧元,计划工期大概2~3年左右。于是公司招了几个程序员,开始干活。随着资金陆续到位,这公司开始疯狂招人,每隔三个月左右就把队伍扩大一倍。

结果,7年过去了,这个项目根本还不成型。因为延误造成的罚金每天都达几千欧元。于是管理层决定,要精简一下团队,减少项目开支 —— 具体做法是,把干活的人都开了,另外招一些对软件开发没啥经验的新手来上班。

项目开始10年后,整个项目已经深陷在灾难的泥潭中,完全是由纯粹的混乱所组成。于是项目的中层管理者终于决定要招一些具有软件工程开发经验的人,来把这个烂摊子从地狱里拖出来。

又过了两年,这项目居然还在苟延残喘。这公司通过给甲方发送金额不断提高的“设计变更”账单,来弥补每天产生的工期延误罚金。这都 2008 年了喂!

这项目怎么能烂成这样?

01

代码质量惨不忍睹

在语言选择方面,没人敢说 C++ 是种简明易懂的语言。事实上,在简洁方面,C++可能算是最糟糕的一种编程语言了吧。要知道,它可是复杂到连它的创造者 Bjarne Stroustrup 本人都不敢说自己完全掌握了这门语言。

当然,这不能全怪开发团队。要知道,在当时,像 C++ 这样拥有无尽复杂度的思维迷宫还是大有市场的。许多希望成为超级程序员的年轻人都对这门听起来超牛逼的语言趋之若鹜。而事实上,这些可怜的娃们,最后大部分都被 C++ 虐惨了,多少美好的青春,都耗费在反复调试一大段晦涩难懂的代码,耗费在探寻为啥这程序会毫无理由莫名崩溃这样的事情上了。

而脑子正常的人,则纷纷转向了其他语言和其他项目上去了。要知道,人生苦短啊。

不过,看起来,这家公司并没有跳出这个圈子,还是一个猛子扎进了 C++ 坑里。

退一步说,不管你用的是什么编程语言,维护一个巨大的代码库本身就不是一件容易的事情——而这个项目的代码库居然有 600 多万行之巨。

那,600 多万行代码是个什么概念?

对比下 Linux 3.13 版内核的代码,在除去内核驱动和架构之外,在 kernel/ 里的源代码也不过就 13 万行左右;另一个例子是著名的编辑器 Emacs,它因为功能太多太庞大,常被人吐槽成“缺乏一个好编辑器的操作系统”,但即使如此,它的总源码规模也不过就是 165 万 9 千多行。

就算你特别厉害,一目十行,你大概也要在显示器前面不眠不休花上7天,才能把全部 600 万行代码全部过一遍。

于是我们可以想见,维护这么大一个代码库,可得逼疯多少程序员呢。看看下面这两个例子,我想,如果我是程序员的话,我也会先疯为敬吧。

有一次,项目里的一个程序员被要求修复一个“右键点击界面会导致整个应用卡死”的 bug,经过连续几天的仔细检查,消耗无数耐心之后,他发现,这个右键响应事件其实工作的很正常,只不过这个“正常”过程需要程序花上 45 分钟,从某种巨大的(静态!)内容库中动态生成每一个菜单项,然后才能把菜单给显示出来。如果这时候你不幸又点了一下右键,不好意思,咱再花 45 分钟重新生成一下菜单项吧…

还有一次,用户报了个“从 CD-ROM 载入数据失败”的 bug 。程序员们花了好几个星期来测试分析代码,最后却直接把这个 issue 标成了“已解决”。因为他们发现,从 CD-ROM 载入数据的功能其实是好的,问题在于,读取 700MB 的数据,这程序要花上大概 7 天时间罢了。

还真是特别考验耐心呀。

02

版本控制全都是乱来

令人难以置信的是,这团队在完全没有版本控制工具的情况下也搞了好几年,直到团队里一个脑子还算清醒的家伙突然想到该用个版本控制工具来管理代码。刚开始的尝试结果并没有让所有人满意,所以这个团队就换到了另外一个版本控制系统。就这么将就了一两年,然后这个版本控制系统不知怎么又抽了个风,把之前所有改动的记录都丢失了。

最后这个项目选定的版本控制工具,是一团带有图形用户界面的祸害,一坨从瑞典直接进口的数字化电子垃圾。他们不得不安排了4个人组成一个“版本控制团队”,全职负责维护这个版本控制系统的正常运行。而这直接导致下列情况的出现:

  • 首次从版本控制系统中检出文件需要向版本控制团队预约,一般来说在一周后才能获得授权。

  • 想修改文件必须经过中层管理人员审批。你需要提前列出需要修改的文件,把列表告诉你的经理,然后打报告给版本控制团队申请,后者大概两天左右会给你反馈。

  • 每次对文件的修改都会触发分支,这就意味着你得自己去合并这个文件收到的所有修改。也许你会觉得,项目里这么多文件,两个人改到同一个文件里的几率应该不大,然而实际上,绝大多数改动都集中在同样的大概100来个文件里,所以每次 merge 都保证让你痛不欲生。

  • 在提交修改(检入文件)之前,你还将经受一次精神折磨:你准备提交的代码将被交给一个所谓的自动 bug 探测程序进行审阅,通过之后还要拿给中层管理人员看过,才能成功提交。不用说,这根本无济于事,bug 还是如雨后春笋一样不停冒尖,比大家除 bug 的速度块多了。更有甚者,对发现的 bug 数量进行分析后发现,这种“缺陷修正”方式带来的新 bug 数量是它所修复的 bug 数量的两倍…

  • 版本管理过于简单。旧的版本是 1,今天的版本是 2,之后的版本是 3。没有人能确切地知道具体发给客户的是哪个版本。
某些时候,管理层会定下一个所谓的官方交付时间,而这个时间安排跟团队中的任何一种工作计划都毫无关系。当预定的交付日期到来的时候,客户实际上收到的是一张带有安装教程的……空白CD,因为已经有好几个星期没有人能构建可执行程序了。于是,客户发现自己收到的是空白光盘,然后正式投诉,然后收到一个旧版的程序光盘作为应付。而客户之所以会发现程序是旧版的,是因为软件的“关于”页上还写着跟去年那个版本一模一样的日期…
03
团队组成更是莫名其妙
团队里充斥着这么一大群毫无任何软件工程经验的人,这软件里要是 bug 不多就还真没天理了吧?
还记得上面提到过,管理层曾经决定,要精简一下团队的事吧。
按理说,任何一个脑筋正常的经理都会发现,对于这样一个纯软件工程的项目来说,人员开支必定是最主要的开支。然而,这个发现,并不能阻止管理层把所有稍微有点经验的程序员都开了,换上对工资要求低得多的菜鸟。相对的,所有的经理们的饭碗倒是都捧得牢牢的,一点都没受影响。
这团队后来变成什么样了呢?55 个人里面,只有 20 个程序员,剩下 35 个都是经理。对,你没有看错,这个阵容真是豪华,给每个程序员配备了 1.75 个经理!
没几个经理有软件工程方面的经验。那时候,刚好出了 SCO 拿着 Unix 版权起诉 Linux 用户的事情,就算这整件事不过是虚张声势,但对许多人来说,当时这事还是挺可怕的 —— 要是突然有天你不得不为自由软件付费,那可如何是好啊。
技术知识也相当缺乏。都 200x 年了,这群人还没几个了解互联网的,少数几个熟悉互联网的,也不过就是拿互联网看看小电影而已。要是你提到你在网上看了些啥,得到的都只会是别人的窃笑而已。
04
行政管理模式变态的发指
上面的荒谬情况也许会让人捧腹大笑,但如果你知道管理层的那群法国佬对员工发起狠来就像是奥斯维辛集中营里的德国鬼子,那你估计就笑不出来了吧。来看看这些官僚到病态的规定吧:

  • 禁止迟到,所有人必须在上午9点前到岗。有一天,人事经理早早就守在公司大门口,把所有9点01分及之后才到公司的人都当场开除了,程序员、经理和销售,都不能幸免。
  • 咖啡机时不时就断供,一断就是好几天。理由当然是跑去喝咖啡的人效率不如坐着干活敲代码的人。不仅如此,每当有领导来开发部视察的时候,这台咖啡机还会被人关掉,免得让领导看到有人“没在干活”。

  • 厕所的脏乱差程度可以说是业内绝无仅有的恶心与恐怖。想来这也是管理层避免大家花时间蹲带薪厕的“高效”政策使然吧。
你可能要问了,这种变态公司,怎么还有人前仆后继的来上班?最主要的是,那段时间法国国内经济正在崩溃的边缘挣扎(直到现在,法国还没完全走出这个泥潭),能找到一份足以糊口的工作就已实属不易,工作条件苛刻点也就算了。

不可避免的结局

正如网友评论的那样,着整个项目陷入了死循环的链条之中:缺乏经验导致低效,低效导致开销太大,节省开销又裁掉有经验的人,进一步降低效率。
那么,为什么管理层还坐视这种情况的不断恶化呢?归根结底还是对失败的担心。如果你砍掉这个项目,就意味着这个项目失败了,而负有领导责任的人就是你。如果这项目还在苟延残喘,那等你升迁调任之后,这个烂摊子自然由继任者来收拾啦。
最终,负责这个项目的公司领导因为挪用资金等原因被捕,进了监狱,这个在地狱的烈焰中挣扎了十几年的项目,才终于宣告终止。
作为整件事情的亲历者,projectfailures 的博主给刚踏入编程世界的年轻人的建议是:
● 珍爱生命,没事别用 C++ 折腾自己;
● 宁愿接一些不那么稳定,但能自由发挥所长的小项目,也别贪图安逸去参加什么看起来很冠冕堂皇的工程;
● 面向对象的数据库并不是什么好东西;
● CORBA 应该在烈焰中痛苦的死去;
● 那些愚蠢的产品经理,请参照上一条。
最后,如果你觉得你现在的工作很糟心很窝火,希望这个项目能让你开心一点。

如果喜欢本篇文章,欢迎转发、点赞。关注订阅号「Web项目聚集地」,回复「进群」即可进入无广告技术交流。


推荐阅读

1. 

2. 
3. 
4. 
5. 
6. 
640?wx_fmt=jpeg
喜欢文章,点个在看 640?wx_fmt=jpeg


推荐阅读
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了自动化测试专家Elfriede Dustin在2008年的文章中讨论了自动化测试项目失败的原因。同时,引用了IDT在2007年进行的一次软件自动化测试的研究调查结果,调查显示很多公司认为自动化测试很有用,但很少有公司成功实施。调查结果表明,缺乏资源是导致自动化测试失败的主要原因,其中37%的人认为缺乏时间。 ... [详细]
  • 2022年的风口:你看不起的行业,真的很挣钱!
    本文介绍了2022年的风口,探讨了一份稳定的副业收入对于普通人增加收入的重要性,以及如何抓住风口来实现赚钱的目标。文章指出,拼命工作并不一定能让人有钱,而是需要顺应时代的方向。 ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
author-avatar
蘑菇宝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有