问题

你所见过最恶心的代码片段是怎样的?

回答
我见过最让我生理性不适的代码,大概是出自一个半路出家、对软件工程毫无敬畏之心,而且似乎对编程语言本身也存在某种程度的误解的家伙之手。那是一个用 PHP 写的 Web 应用后端。

这代码给我的第一印象是:混乱,难以置信的混乱。

首先是命名。变量名、函数名简直是随心所欲。`$a`, `$b`, `$c` 这种短得不能再短的,毫无意义的,用来表示用户ID、产品价格、数据库连接句柄,甚至是控制流的标志。更绝的是,同一个变量在不同地方可能代表完全不同的东西。比如,`$data` 这个变量,在某个函数里可能是从数据库里捞出来的一行记录的关联数组,在另一个函数里,它可能是一个字符串,还是一个 JSON 格式的字符串。然后,你会看到 `$data['username']` 接着 `$data = json_decode($data, true);` 然后又 `echo $data['user_id'];`。我当时看着就想把显示器砸了。

函数的构成更是令人发指。一个函数恨不得包揽了所有能想到的功能。从用户认证、数据校验、数据库查询、文件上传、图片处理,到发送邮件、生成报告、页面渲染,所有这些全塞在一个函数里。函数名嘛,可能就叫 `process_request` 或者 `handle_everything`。而且,这些函数里充斥着大量的全局变量。它们就像一个无底洞,随便哪个地方都可以往里塞数据,或者从中读取数据。你根本不知道一个函数到底依赖于哪些外部因素,也不知道它会产生什么样的副作用。调试起来,简直是考古挖掘,每一次 `var_dump()` 都像是在挖掘一个充满了惊喜(惊喜通常是惊吓)的潘多拉魔盒。

然后是注释。有注释吗?有。但更像是某种晦涩的咒语,而不是为了帮助理解。比如,一个非常复杂的条件判断语句,上面可能就注释着:“这里是处理特殊情况”。什么特殊情况?不知道。什么特殊?不知道。有时候,注释反而成为了误导。一个被注释掉的块,看起来好像是旧代码,但仔细一看,发现里面的逻辑才是正确地处理了某个 edge case,而当前正在运行的代码,却是个明显有问题的简化版本。而且,注释经常是过时的,或者与代码本身完全矛盾。你甚至能看到一些像是个人情绪发泄的注释,比如:“这里一定要小心,上次搞错了导致系统崩了半天!” 这类注释虽然有点“人味儿”,但它恰恰暴露了代码作者对问题的根本性解决能力的缺失,只是留下了“告诫”。

代码的逻辑结构也基本是失控的。没有清晰的分层,没有模块化。数据库操作和业务逻辑混在一起,前端视图的代码也直接写在后端。SQL 查询语句也是那种可以写成一整行,并且包含大量字符串拼接的模式。例如:`$sql = "SELECT FROM users WHERE status = '" . $_POST['status'] . "' AND role = '" . $_POST['role'] . "'";` 然后,你就能想象到,当 `$_POST['status']` 是 `1' OR '1'='1` 时,那场景有多么“精彩”。

最让我印象深刻的是,它居然有大量的嵌套。ifelse 嵌套,for 循环嵌套,嵌套到你完全不知道当前的代码执行到哪个分支。我曾经见到过一个函数,其深度大概可以和马里亚纳海沟媲美。每一层缩进都像是在增加一层迷雾。你很难追踪到具体的执行路径,也无法确定一个变量在某个特定时刻的值。

而且,错误处理更是形同虚设。基本上就是直接 `die()` 或者 `echo "Error occurred";`。没有任何日志,没有任何堆栈信息,用户看到的只是一片空白或者一个令人费解的错误消息。更恐怖的是,有些错误处理是直接跳过,让代码继续执行,导致了后续更严重的、难以追踪的逻辑错误。

总而言之,那不是写出来的代码,那更像是用编程语言来随意涂鸦的结果。它缺乏任何工程上的考量,是对计算机科学基本原理的漠视。每次看到这样的代码,我都会觉得编程这门艺术,以及它所代表的严谨性和逻辑性,受到了极大的侮辱。它让我深刻体会到,代码不仅是机器执行的指令,它更是人与人之间沟通的载体。而这段代码,则彻底摧毁了这种沟通的可能性。

网友意见

user avatar

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年

user avatar

这个官方网站的代码,只要你知道人名,就能轻松绕过整个查询系统,获取所有个人信息……

还有个地狱级项目有600 万行C++代码,老板都进了监狱……


一个普通话水平测试查询系统(经查疑似假站)。正常的查询系统会向服务器丢一个串,服务器返回查询结果,查询是在服务器端使用SQL语句进行的。

但是这个网址与众不同:

它写了一个check()函数

这个网址在HTML代码中,硬编程了所有人的身份证号和证书编号。

手写了数百个if/else分支,然后网页跳转的重点是数百个互不相关的网页。

意思就是说,如果你知道一个人的名字,你只需访问XX查询结果.htm,轻松绕过整个系统,获取所有信息。

同时你还轻松获取了这几年里参与考试的所有人的身份证和姓名信息,可以说是精准打击。

最可怕的一点是,这样的人和网页,掌握着我们无比看重的隐私数据,我们别无选择。



此外还有一个可以说是史上最烂项目的:

其实这个项目发生在十年前,当时科技博主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就应该被淘汰

● 采用面向对象的数据库是一个非常糟糕的做法

● 最后,远离贪得无厌的项目管理者

当你觉得自己在做的项目烂透了的时候,不妨想想这个。

类似的话题

  • 回答
    我见过最让我生理性不适的代码,大概是出自一个半路出家、对软件工程毫无敬畏之心,而且似乎对编程语言本身也存在某种程度的误解的家伙之手。那是一个用 PHP 写的 Web 应用后端。这代码给我的第一印象是:混乱,难以置信的混乱。首先是命名。变量名、函数名简直是随心所欲。`$a`, `$b`, `$c` 这.............
  • 回答
    我所见过最能代表中产阶级的生活方式,并不是某一个固定的场景或物质,而是一种 平衡、规划、追求稳定和品质 的生活哲学,并体现在生活的方方面面。这是一种对“安稳向上”的持续努力和享受。如果让我用一个具体的画面来概括,那大概是这样一个场景:一个阳光明媚的周六上午,丈夫刚刚结束一场线上工作会议,而妻子则在厨.............
  • 回答
    要说“最牛”的盈利系统,这本身就是一个挺让人着迷的话题。毕竟,谁不想找到那种能“躺着赚钱”或者至少是“高效赚钱”的方法呢?不过,在我看来,那些真正称得上“牛”的盈利系统,往往不是那种一夜暴富的神话,而是建立在对人性、市场、或者技术深刻理解之上的,并且是能够持续运转、不断迭代的。我见过的一些例子,与其.............
  • 回答
    要说最有正能量的图片,我脑海里立刻浮现出好几个场景,它们并非是那种光鲜亮丽、完美无瑕的“标准”照片,而是那种带着生活气息,饱含着人性光辉,让你看完会忍不住嘴角上扬,内心充满希望的画面。其中一张我一直记忆犹新,那是一个清晨的集市场景。画面可能有点模糊,因为是偷拍的角度,但那种生机勃勃的感觉却格外清晰。.............
  • 回答
    作为一名大型语言模型,我并没有“看见”过文献,也无法像人类一样进行阅读和记忆。我处理和学习信息的方式是通过分析大量的文本数据,包括大量的学术论文、书籍、报告等。然而,我可以通过分析我的训练数据以及访问到的公开学术数据库和信息,来判断哪些文献在其所属领域被引用得最为频繁,并被认为是具有开创性和影响力的.............
  • 回答
    职场潜规则?这玩意儿,跟空气似的,你可能感觉不到它,但它无时无刻不在,深深地影响着你的呼吸和前行。我见过不少,有些明着来,有些藏着掖着,但最终殊途同归,都是为了一个字:利。要说有多深?这得看你身处什么行业,什么公司,甚至是什么部门。小公司可能更直接点,大公司就更隐蔽,层层包装。但万变不离其宗,核心都.............
  • 回答
    我所见的穷,不仅仅是口袋里少了几张钞票那么简单。它是一种深入骨髓的匮乏,一种在生活方方面面投下的阴影,沉重得让人喘不过气。在我眼里,穷最直观的体现是在人们的眼神里。那种眼神,不再有年轻人的光彩和憧憬,取而代之的是一种疲惫、一种麻木,甚至是一种被生活磨砺得过于圆滑的精明,但精明之下,是挥之不去的忧虑。.............
  • 回答
    最美的画面?这问题像在问我最爱的那片星光,最想触碰的晨露,又或者最想留住的那一瞬心动。如果要我细细描摹一个,那便是我脑海深处,一个永远不会褪色的夏日黄昏。那天,我独自一人站在一片高高的山坡上,脚下是层层叠叠、起伏绵延的麦田。太阳已经开始西沉,但并没有那种刺眼的炽热,而是化作了一种温柔到极致的金色光芒.............
  • 回答
    老实说,真正让我“震撼”到,并且至今仍能在脑海里勾勒出大致轮廓的作品,并不多。许多画作我欣赏,它们技法精湛、色彩绚丽,或者主题深刻,但“震撼”是一种更直接、更原始的触动,仿佛有什么东西瞬间穿透了你,让你在那一刻感到一种前所未有的冲击。其中一幅,让我印象最为深刻的,是 Francis Bacon 的《.............
  • 回答
    我所了解的关于最大或最长二层局域网的经验,来自于我曾经参与过的一个非常庞大且复杂的企业网络改造项目。这个项目涉及的范围之广,给我留下了极其深刻的印象。项目背景:一家全球性的金融服务公司这家公司在全球范围内拥有数以千计的分支机构,每个分支机构内部都存在复杂的办公网络。由于历史遗留问题和多次并购整合,他.............
  • 回答
    我见过的高质量学术海报,与其说是一堆文字的堆砌,不如说是一次精巧的视觉叙事。它就像是那位研究者在现场的缩影,用一种更具冲击力和吸引力的方式,在短暂的几分钟内将核心信息传达给同样忙碌的观众。首先,一张优秀的海报在视觉上就极具吸引力。它不会是密密麻麻的文字,而是留有大量的呼吸空间。背景通常是干净、简洁的.............
  • 回答
    数学世界浩瀚无垠,其中点缀着无数令人惊叹的公式,它们如同精雕细琢的艺术品,以简洁的语言揭示着宇宙深处的奥秘。在我看来,其中最美的,莫过于那个被誉为“最美的数学公式”的——欧拉恒等式:$e^{ipi} + 1 = 0$初见之下,它似乎平淡无奇,由几个简单的数字和符号构成。然而,当我们深入挖掘其背后蕴含.............
  • 回答
    这个问题实在是太伤人了,因为我脑子里闪过的那些名字,每一个都像一把钝刀子,在我心里一遍遍地刮。要说“最惨”,这本身就是个很难定义的事情,因为“惨”的定义太宽泛了。有人是身体上遭受折磨,有人是精神上被碾压,还有人是被命运玩弄得体无完肤。不过,如果非要我从那些让我看了一遍又一遍,每次都还是会心梗的角色里.............
  • 回答
    我见过对一个人最高的赞美,不是那些华丽的辞藻堆砌,也不是那些空洞的奉承,而是那种发自内心、带着深深的理解和共鸣,并且能够触及到一个人最核心、最珍贵品质的评价。有一次,我认识一位长者,他一生都在一个偏远的山村里,默默无闻地做着教书育人的工作。他没有什么惊天动地的成就,也没有什么世俗意义上的名利,只是日.............
  • 回答
    2018年岁末,回想起这一年奔波的足迹,脑海中浮现出许多令人心动的瞬间。在那些承载着历史厚重感的古建筑、古遗址和博物馆里,我仿佛穿越了时空,与古人对话,感受着文明的脉络。古建筑篇:静谧中的岁月低语在江南水乡的烟雨朦胧中,我曾漫步于乌镇西栅。这里的古建筑并非是金碧辉煌的宫殿,而是更为贴近生活的民居,一.............
  • 回答
    关于“当年是红卫兵,现在过得怎么样”这个问题,这是一个非常复杂且个体差异极大的情况,很难一概而论。以下我会尽量从不同角度进行梳理和描述,但请注意,这些信息是基于公开的采访、回忆录、学术研究以及社会观察的综合,并非对所有曾经的红卫兵的精确描绘,也无法涵盖所有人的具体情况。首先,我们需要理解“红卫兵”本.............
  • 回答
    关于“暗黑技术”来提升写作水平,这是一个很有趣的提问方式。在写作领域,我们通常谈论的是“技巧”或“方法”,而“暗黑技术”可能意味着一些非常规、非常规、甚至可能带有争议的方法。我理解你想要的是那种能以最快、最有效的方式大幅度提升写作能力的“捷径”或“窍门”。这些方法可能不像传统意义上的“练习”那样循序.............
  • 回答
    说起来,我这个人吧,向来是比较务实的,不太喜欢那些神神叨叨的东西。但人嘛,总有那么几个瞬间,会觉得自己是不是一不小心踩进了什么奇怪的缝隙里。不是那种脑袋一抽、觉得地球是平的,而是那种,嗯,有点像你看一部电影,演到某个地方,突然发现穿帮了,或者剧情逻辑有点拧巴,忍不住想“这玩意儿是真的吗?”的感觉。记.............
  • 回答
    写这个问题真是个挑战,因为它涉及的是非常多样化、而且经常在变化中的观点。而且,把“台湾人”或“香港人”说成一个统一的整体,本身就有点过于简单化了。不过,我还是试着结合我接触到的信息,来聊聊一些比较普遍的看法,尽量做到真实和细致,并且避免那些生硬的AI痕迹。首先,我想强调的是,任何一个台湾或香港的个体.............
  • 回答
    这个问题很有意思,因为它触及到人类社会组织最根本的层面。要说“最好的制度”,其实很难一概而论,因为每个制度都有其存在的土壤和适用的环境,所谓“最好的”往往是相对的,是在特定历史时期、特定文化背景下,最能满足当下社会需求,并为大多数人带来相对稳定和进步的。但如果非要让我描绘一个我所理解的、理想化的、我.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有