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

基于芋道源码的rocketmq源码版本再次对核心功能实现进行详细的注解标识,一款低延迟、可靠、可扩展、易用的面向消息的中间件 Apache RocketMQ 是阿里巴巴海量消息业务诞生的一款低延迟、可靠、可扩展、易用的面向消息的中间件。Pub/Sub 和 P2P 消息传递模型,在同一队列中实现可靠的 FIFO 和严格的顺序消息传递,长拉队列模型,也支持推流消费风格,单队列百万消息累积能力,通过各种消息传递协议,如JMS,MQTT等。,分布式高可用部署架构,满足至少一次消息投递语义,用于隔离测试和云隔离群集的 Docker 映像,功能丰富的管理仪表板,用于配置、指标和监控 立即下载

来源:projectfailures.wordpress.com

  • 这项目到底啥情况?

  • 这项目怎么能烂成这样?

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

  • 不可避免的结局


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

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

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

● 总共 50000 多个类

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

● 基于 CORBA

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

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

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

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

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

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

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

img

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

十年前的 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 应该在烈焰中痛苦的死去;

● 那些愚蠢的产品经理,请参照上一条。

最后,如果你觉得你现在的工作很糟心很窝火,希望这个项目能让你开心一点

基于STM32L4XX、HAL库的Ra-01SC-P LoRa模块驱动程序设计 0x22) { // SX1276/SX1278版本号。// 发射功率(2-20)// 工作频率(Hz)// 编码率(5-8) 阅读详情

相关推荐

通过两个mark点确定某一个点的位置

read_image (Image0, '0.bmp') binary_threshold (Image0, Region, 'max_separability', 'dark', UsedThreshold) connection (Region, ConnectedRegions) fill_up (ConnectedRegions, RegionFillUp) select_shape_std (RegionFillUp, SelectedRegions, 'max_area', 70) red...

优快云博客 3889

一个update语句执行要10s,大厂的架构真垃圾!

点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 10:33更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析作业调度中间件 E...

芋艿V 1253

ThingsBoard 3.1.1版本在window本地运行之TB-Gateway服务搭建(三)

TB-gateway服务是TB不可或缺的部分,很多的协议都需要TB-gateway来做分类处理,今天我们就来做TB-Gateway服务搭建。

晚点遇见你,余生都是你! 2475

(2)SpringBoot学习——芋道源码

内容来自芋道源码(https://www.iocoder.cn/Spring-Boot/autoconfigure/?self)

猫脸码客的博客 2943

Linux下CUDA 11.8与vllm的完美搭配:从环境配置到避坑指南

本文详细介绍了在Linux系统中为CUDA 11.8环境部署vLLM的完整实战指南。针对cu118与vLLM的版本兼容性核心问题,提供了从Python、PyTorch版本选择,到关键依赖vllm-nccl-cu11的安装避坑,以及环境调优、生产级容器化部署的全面解决方案,帮助开发者高效构建稳定的大模型推理服务。

weixin_29095049的博客 310

H无穷控制学习笔记——加权灵敏度H无穷控制问题

一、加权灵敏度H无穷问题 系统结构如上图所示。被控对象P的状态空间方程为(Ap,Bp,Cp,DpA_p,B_p,C_p,D_pAp​,Bp​,Cp​,Dp​),加权函数W1的状态空间方程为(A1,B1,C1,D1A_1,B_1,C_1,D_1A1​,B1​,C1​,D1​),加权函数W2的状态空间方程为(A2,B2,C2,D2A_2,B_2,C_2,D_2A2​,B2​,C2​,D2​),加权函数W3的状态空间方程为(A3,B3,C3,D3A_3,B_3,C_3,D_3A3​,B3​,C3​,D3​)。

一饮丶一啄的博客 4351

你见过最垃圾的代码长什么样?(来长长见识)

点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 10:33更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~...

芋艿V 1054

别再手动查日志了!用Dify+Zabbix打造你的专属运维“嘴替”(保姆级配置流程)

本文详细介绍了如何利用Dify平台与Zabbix监控系统集成,构建智能运维对话系统,实现自然语言交互的运维管理。通过保姆级配置流程,帮助运维工程师提升查询效率、降低学习成本,打造企业级智能运维解决方案。

weixin_27298377的博客 457

国外程序员吐槽:永不再为 Oracle 工作了 !

(给技术最前线加星标,每天看技术热点)转自:开源中国社区近日,某网友在Hacker News 上发起了一个 “你见过的最糟糕的代码是什么?” 的问题,引起了广泛关注和讨...

redditnote的博客 1116

从点击图标到Activity亮屏:AMS、Zygote、ActivityThread的Binder协作之旅

Launcher通过Context调用 startActivity(),最终会通过 Activity.startActivity() 传递到 ActivityManager.getService(),获取AMS的Binder代理对象(IActivityManager)。这里的 attach() 方法通过Binder调用AMS的 attachApplication(),将新进程的 IApplicationThread 代理对象传递给AMS。这一步的Binder通信,是整个启动流程的关键转折点,值得细细品味。

大模型大数据攻城狮的专栏 1071

机器学习算法原理:详细介绍各种机器学习算法的原理、优缺点和适用场景

现在,我们将进入到机器学习的核心部分——算法原理。在本篇文章中,我们将详细探讨各种机器学习算法的原理、优缺点和适用场景。

a871923942的博客 2966

世界之最!史上最烂的开发项目:苦撑12年,600多万行代码…

你见过最烂的项目,撑了多长时间才完蛋?六个月?一年?今天介绍的这个奇葩项目,不但一开始就烂得透透的,还硬撑了12年多,直到项目负责人被逮起来丢进监狱才完事。 到底有多烂?用下面这组触目惊心的数据告诉你↓↓ ● 总共 600 多万行 C++ 代码 ● 总共 50000 多个类 ● 受编译器版本限制,用的 C++ 语法都是陈旧过时的,只能在某个(早就没有维护)的操作系统上部署 ● 基于 CORB...

weixin_45258969的博客 6529

如何创建 SAP ABAP CDS View 的 Association

所以本文我们虽然学习了如何创建 SAP CDS View 的 association,知道了 association 是用来在 CDS View 里将两张数据库表关联起来,但根本不知道怎么使用这个 association. 而且从 association 的写法来看,似乎和本教程之前介绍 inner join,left join 这些数据库表的连接操作没什么区别,都是根据两张表的 carrid 和 connid 字段相同进行的连接。只看到了我们在 CDS View 源代码实现里,放出来的四个字段。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 906

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

你见过最烂的项目,撑了多长时间才完蛋?六个月?一年?今天介绍的这个奇葩项目,不但一开始就烂得透透的,还硬撑了12年多,直到项目负责人被逮起来丢进监狱才完事。 到底有多烂?用下面这组触目惊心的数据告诉你↓↓ ● 总共 600 多万行 C++ 代码 ● 总共 50000 多个类 ● 受编译器版本限制,用的 C++ 语法都是陈旧过时的,只能在某个(早就没有维护)的操作系统上部署 ● 基于 CORBA ...

weixin_45273286的博客 340

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

关注“Java后端技术栈”回复“面试”获取最新资料回复“加群”邀您进技术交流群你见过最烂的项目,撑了多长时间才完蛋?六个月?一年?今天介绍的这个奇葩项目,不但一开始就烂得透透的,还硬撑了...

田维常 524

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

有一次,项目里的一个程序员被要求修复一个“右键点击界面会导致整个应用卡死”的 bug,经过连续几天的仔细检查,消耗无数耐心之后,他发现,这个右键响应事件其实工作的很正常,只不过这个“正常”过程需要程序花上 45 分钟,从某种巨大的(静态。而事实上,这些可怜的娃们,最后大部分都被 C++ 虐惨了,多少美好的青春,都耗费在反复调试一大段晦涩难懂的代码,耗费在探寻为啥这程序会毫无理由莫名崩溃这样的事情上了。按理说,任何一个脑筋正常的经理都会发现,对于这样一个纯软件工程的项目来说,人员开支必定是最主要的开支。

老黑程序说 288

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

上一篇: 分布式事务不理解?五种方案一次给你讲清楚!
下一篇: 网易开源分布式存储系统 Curve,性能彪悍!
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值