Unisys大机的OS2200操作系统里,为了方便新手学习,放了几个经典脚本当案例,其中有一个,是计算1964年以后一百年内任意日期是星期几,该脚本非常简短,算上注释,只有三十几行,核心代码只有十行,可谓是既经典又恶心。
为了方便大家阅读,同时以防万一,我用C 语言对核心代码进行了重写,并加上头尾,当然该程序可以运行,有兴趣的可以拿走试试:
int main(){
int year,month,day,hold,temp;
printf("Enter a date:(mm,dd,yy) ");
scanf("%d,%d,%d",&month,&day,&year);
int DayOfMonth[]={3,127,240,364,484,608,728,852,976,1096,1220,1340};
int DayOfWeek[]={6,7,1,2,3,4,5};
if(year >= 64){
year = year - 64;}
else{
year = year + 100 - 64;}
hold = year * 1461 + DayOfMonth[month-1];
hold = hold / 4 + day + 3;
temp = hold / 7 ;
hold = hold - temp * 7;
printf("%d",DayOfWeek[hold]);
return 0;}
造成该代码如此恶心的原因如下:
1、大机不支持小数
2、为了节省资源,降低复杂度,要求尽可能不使用循环
3、Unisys的该系统初版写于1964年
这个官方网站的代码,只要你知道人名,就能轻松绕过整个查询系统,获取所有个人信息……
还有个地狱级项目有600 万行C++代码,老板都进了监狱……
一个普通话水平测试查询系统(经查疑似假站)。正常的查询系统会向服务器丢一个串,服务器返回查询结果,查询是在服务器端使用SQL语句进行的。
但是这个网址与众不同:
它写了一个check()函数
这个网址在HTML代码中,硬编程了所有人的身份证号和证书编号。
手写了数百个if/else分支,然后网页跳转的重点是数百个互不相关的网页。
同时你还轻松获取了这几年里参与考试的所有人的身份证和姓名信息,可以说是精准打击。
最可怕的一点是,这样的人和网页,掌握着我们无比看重的隐私数据,我们别无选择。
此外还有一个可以说是史上最烂项目的:
其实这个项目发生在十年前,当时科技博主projectfailures发表过一篇博文,讲述自己亲身经历过的一项“地狱级”的项目
十年后,这件事突然在美国的社交媒体上再次被翻出来,projectfailures也发了一篇名为“地狱级项目”的后续的博客,下面我们一起来看看这个“地狱级项目”到底有多可怕
● 600 万行C++代码
● 50,000多个类
● 代码中使用的C++方法早已过时,而且受限于一个编译器版本,该编译器版本仅支持一个不再维护的操作系统。
● 基于CORBA
● 采用一家倒闭公司提供的数据库软件
● 多层的叠加共同组成了用户界面,但却没有一个是实际作者在维护的。
● 在32台并行的机器上编译需要48小时。
● 运行一个用户界面需要同步启动40~50个子进程
● 没有动态库链接:可执行的文件大小一个就有几百兆
● 启动时间需要耗费15分钟
● 平均崩溃时间:30秒到30分钟不等
大约在1996年,法国政府机构想要开发一款软件,复杂程度不高,然而过程却有些曲折:
当时,政府预付了几百万欧元,计划开发周期为2~3年。该公司立马就聘用了几个开发人员来开始这项工作,并且随着资金的不断流入,开发团队的规模每3个月左右就会扩大一倍。
7年过去了,这个项目竟然还没成型,由于工程延误,公司每天要缴交的罚金高达几千欧元。于是,管理层为了降低成本,决定把所有有经验的开发人员都开除了,然后雇佣一些压根没有编程经验的新手进来接盘
10年后,这个项目依然深陷泥潭,这时中层管理人员终于醒悟,决定再聘请一些具有软件工程经验的人员,让项目重回正轨;然而,招进来的工程师基本3个月就待不下去了(法国法定入职后最短可离职时间是3个月)。
12年后,该项目还在苟延残喘。该公司通过向政府提交越来越多的项目变更请求来弥补每天的处罚。一晃这都到2008年了
然后又过了几年,这个项目老板据说就因为欺诈而被关进监狱了,这个“地狱项目”总算结束了
一、项目采用C++开发
首先,这个项目采用C++开发,没有哪一个程序员敢和你说你C ++是一种简单的语言。实际上,C++可能是最复杂的计算机语言之一。复杂到什么程度呢?复杂到就连他的创造者都承认自己还没有完全掌握这门语言。
这个项目选择用C++开发,也不能说是团队的错,要怪就怪当时人们都听说过C ++,并且都自认为自己完全掌握它了(C++,从精通到不会)。于是毫不犹豫的选择了它,最后耗费了大量的时间不说,程序还无休止地崩溃。
聪明的人,在接触C++之后,果断就转向其他语言了,毕竟人生苦短呐~
再者,无论你选择何种语言开发,维护这么庞大的一个代码库本就是一项艰巨的任务,想象一下,一个团队必须维护600多万行代码,这在软件领域是多么疯狂的一件事。
600多万行的代码是什么概念?就算你以每秒一行的速度读取代码,需要不眠不休70天才能把这些代码读完
再来看看下面这两个例子,相信你会更加深有体会:
1.当时,一位开发人员负责修复一个“在界面单击右键单击会导致整个应用程序冻结”的Bug。
经过几天的耐心仔细的检查后,他发现右键单击并不会导致程序异常,只不过右键单击到弹出菜单栏这个过程需要45分钟。
每次右键单击主窗口时,菜单都是从一个庞大的内容库中动态生成
2.用户反映“从CD-ROM加载数据失败”。程序员花了好几个礼拜的时间测试这个Bug,最终啥也没做就直接把Bug标记为“已解决”,因为从CD-RO 载入数据的功能其实没毛病。
唯一问题就是加载这700M的数据,需要花7天的时间。不得不说,耐心真是一种美德。
难以想象,这个项目进行了好几年以后,团队中才有人提出了使用版本控制工具的想法。而且第一次的尝试并不是很满意,因此团队就切换到了另一个系统,然后在几年之后,这个版本控制系统不明原因地每次更改都会丢失所有历史记录,于是,团队又换到了另一个系统。
最终选择的版本控制系统简直就是个灾难,它从瑞典进口,带有图形用户界面,当时还专门组建了一个由四个人组成的团队负责在版本控制软件上处理大多数维护问题,其中包括如下内容:
● 首次提交需要与版本控制团队预约,通常在一周后批准。
● 首次checkout需要向版本控制团队申请,通常在一周后才能获得授权。
● 未经中层管理人员授权,不得编辑文件。你必须提前告知您的经理你要编辑哪些文件,然后发送请求给版本控制团队,该请求也需要几天时间才能得到反馈信息。
● 代码的每次修改都会触发分支,这意味着你必须合并所有修改。你可能会认为存储了这么多文件,两个人改到同一个文件里的几率应该不大,然而事实证明,大多数改动都集中在那100个左右的文件里。
● Checkin(提交修改)仍需要经历一个痛苦的过程,这个过程里,你的代码需要经过一个自动化的Bug检测软件的检测,最终还要由中层管理人员审查你的代码。毋庸置疑,这样做并不能减少程序的Bug数量。更夸张的是检查数据发现,每一个修复完一个Bug都会换来两个新的Bug。
● 版本控制太过简单。旧软件是版本1,今天的软件是版本2,未来的软件是版本3,没有人能够确切地知道哪个版本已经交付给客户。
虽然有时候也会制定一个交付计划,但是计划的这个时间点完全不考虑团队的工作进程。当交付的日子来临时,客户就会收到一张名为安装教程的空白CD,因为没有人能够在几周内构建软件。
等到客户发现自己收到的只是一张空白的CD,就会投诉,为了应付了事,团队就会再发送一个旧版的CD。
那客户又是怎么发现这张CD是旧版本的呢?因为关于软件介绍的日期显示的和去年那个版本一模一样。
团队中55人:20名开发人员,35名经理。是的,你没有看错,管理人员比开发人员还要多。
管理人员不断组织会议,不厌其烦地展示相同的PPT文件,而开发人员则在开放式的办公室里面打发时间,毕竟这35名经理里面没几个有软件工程方面的经验……
当时恰逢SCO起诉IBM滥用Linux版权。即使整个事情是虚张声势,但它确实对这些人起到一定的作用,他们都意识到可能需要为自由软件付费了。
他们都没有提到“自由软件”,但他们都知道“免费软件”。这个项目到处使用GNU库,并且完全没有意识到这会把整个项目变成一个巨大的、不兼容的GNU项目。但是,考虑到这个项目真的很糟糕,没有人会坚持要他们发布源代码。
还有一个很致命的问题就是技术知识相当薄弱,几乎没人知道互联网,少数几个知道的人,认为互联网就是为色情而生的东西。当问及在互联网上看到的东西时,他只会给你一个微笑,你自己体会。
如果这些最高管理层没有像纳粹一样,那么上面这整个经历可能会很有趣。举几个例子让你看看有多变态:
● 禁止超过九点打卡。有一天,经理早早就在大门后面等,当场解雇九点一分以后进来的人,包括一些经理和销售人员。
●管理者试图强制所有人停止吸烟,因吸烟的人在工作的时候,时不时可能就得来一根。
● 因为喝咖啡的人效率低于不喝咖啡一心敲代码的人,所以,每当领导前来视察的时候,咖啡机就会被关闭,给领导留一个每一个人都在努力工作的印象。
● 厕所绝对是你从未见过的那种恶心。想来这可能也是管理层为了避免员工在厕所蹲太久,从而多挤出一点工作的时间
你可能想知道为什么这样的工作环境竟然还有人为他们工作。最主要原因还是当时法国正经历着经济危机,当时的人们有工作有钱拿就不错了,谁还会考虑工作环境。
另一个原因是,对于许多人来说,这份工作可能是他们的第一份工作,没有对比,就没有伤害啊,初入社会的工作者甚至还以为九点过后打卡的人被开除是理所应当的。
至于政府如何会让这些事情发生呢?我们都清楚它的运作模式。负责预算的人很多都是公司的高层管理人员。在法国这样的国家,这种的腐败并不罕见,只是大多未被发现,很少被起诉。而且这样的情况也不只是法国才有。在欧洲和美国也有类似的事情。
不过,好在几年后,听说负责这个项目的负责人因为欺诈罪被捕,进了监狱,这个地狱般的项目,才终于宣告终止。
这位博主长篇大论说了这么多,主要是想告诉我们以下几点:
● C++有风险,选择需谨慎
● CORBA就应该被淘汰
● 采用面向对象的数据库是一个非常糟糕的做法
● 最后,远离贪得无厌的项目管理者
因为现在是人民当家作主的社会主义制度,所以现在不会
历史上是社会主义?
所以古代军队会,现代就不会
中国军队现在同吃同住,营长教导员多拿了几瓶牛奶被处分
连长家属来连里面食堂没交伙吃饭连长被撤职
排长和士兵住在一起,连长为什么不和士兵同住,因为他们有大量文件要处理,很多文件涉密的,普通士兵是无权翻越的,所以才分开住,团以下干部和士兵寝具必须一致,只不过因为文件问题才需要分开
现在通讯员不能帮连长指导员铺床,叠被子
战士休假回来不能给领导送特产,送了战士没事,领导处分
只有战士过生日这种分一块两块蛋糕,这是领导唯一敢从战士手上接的东西,而是直接领导,隔一级都不敢要
至于小灶?已经处分一批敢开小灶的人了,首长机关有自己的食堂,但首长敢和普通机关干部分开吃饭?哪个被你批评过想不开的,一个举报电话你前途就完了
现在我们还有规定,领导必须最后一个打饭
很多时候都是战士吃饱了,领导只能吃菜,没肉