甲骨文 2500 万行的屎山代码有多“恐怖”?

Thingsboard本地源码部署教程 本章将介绍ThingsBoard的本地环境搭建,以及源码的编译安装。本机环境:jdk11、maven 3.6.2、node v12.18.2、idea 2023.1、redis 6.2。 阅读详情
AI摘要

这篇文章讲述了Oracle数据库12.2版本的庞大且混乱的C语言代码,开发和修复bug的艰辛过程,以及行业内对于复杂代码库的反思。,

【导读】:2018 年 Hacker News 上一篇对 Oracle 屎山代码的吐槽帖子,@宝玉XP 老师最近翻译了,转过来大家一起看看。

图片

Oracle 数据库 12.2 版本竟然包含了将近 2500 万行的 C 语言代码。

想想都觉得可怕!在这个产品里,改动哪怕一行代码,都有可能导致成千上万的测试失败。历经数代程序员在紧迫的截止日期中辛勤编写,结果却是代码变得杂乱无章。

Oracle 中复杂的逻辑、内存管理、上下文切换等功能,竟然是靠成千上万个标志 (flags) 来维系的。整个代码中充斥着神秘的宏,要理解这些宏的含义,常常需要亲手扩展、一天甚至两天的时间去研究。

有时候,为了预测代码在不同情境下的表现,你需要理解多达 20 个甚至 100 个不同的标志值及其影响。我这可不是夸张。

这个产品之所以还能运行,全靠着无数的测试!

图片

Oracle 数据库开发者的日常是这样的:

  • 开始修复一个新的 bug。

  • 花上两周时间去弄懂那 20 个相互作用神秘的标志,这些标志造成了 bug。

  • 为了应对新的特殊情况,增加一个新标志。再写几行代码,检查这个标志,尽量绕过问题,避免 bug。

  • 把修改提交到一个由 100 至 200 台服务器组成的测试农场。这些服务器会编译代码,构建新的 Oracle 数据库,并分布式地运行数百万个测试。

  • 回家,第二天再来处理其他事务。测试可能要跑 20 到 30 小时。

  • 回家,第二天再来查看测试结果。运气好的时候,大约有 100 个测试失败。运气差时,可能有 1000 个。随机挑选几个测试,试图理解你的假设出了什么错。可能还得考虑另外大约 10 个标志,才能真正弄明白 bug 的本质。

  • 为了解决问题,增加一些新的标志,再次提交测试。又等 20 到 30 小时。

  • 接下来的两周,不断重复这个过程,直到找到正确的标志组合。

  • 终于有一天,你成功了,没有一个测试失败。

  • 为你的更改新增上百个测试,以确保下一个不幸碰到这段代码的开发者不会破坏你的成果。

  • 为最终版本的测试提交工作,然后提交审查。审查过程可能又要花费 2 周到 2 个月。与此同时,继续修复下一个 bug。

  • 两周到两个月后,一切完成后,你的代码终于能合并到主分支了。

以上是 Oracle 程序员修复 bug 的真实写照。想象一下开发新功能得有多艰难。开发一个小功能,比如增加新的认证方式(例如对 AD 认证的支持),竟然需要半年到一年,有时甚至两年!

这个产品居然还能运行,真是个奇迹!

我已经不在 Oracle 工作了,以后也不会再回去了!

图片

网友评论

@Espressopaws: Oracle 原北京研究院的家伙就是天天这样修 bug 的。话说近千个 if-else,再快的 CPU 都快不起来,竟然还能运行。以前老板碰到 20 多个 if-else 嵌套在一起都受不了,在一次酒后吐言对这样的程序员 “绝望”,后来这哥们非常识趣地主动离职了。

@用户5400427920: 能测试和验证已经是业界顶流了,我们接手我司一个项目的工程化,从项目 25 万行里清理删除了 15 万行死代码,期间还有算法给死代码里加实验,发问,答复:“这块代码的 keyword 和他接到任务的 keyword 相同,所以就在这加了”。在我们接手前这个项目已经稀里糊涂迭代两年了

@tombkeeper: 我早年研究过一次 Oracle 的漏洞,后来再也不搞了。逆向 Oracle 的感觉就像在热带雨林里找一只青蛙,然后通过控制丢虫子的位置和节奏让青蛙跳桑巴舞。

@一切皆有可萌:更悲催的是,1900 年判定为闰年这个错误,甚至不是 Excel 的,而是更早的一款电子表格软件 lotus-1-2-3 的。但是微软为了占领电子表格软件的市场,必须要兼容 lotus-1-2-3 的文档格式,结果就必须把它的 bug 也兼容进来。

@老张评论:著名的化学工程模拟软件 aspenplus,核心代码是创业者当年读博士时熬夜的 fortran 代码。估计后来他自己也看不完全明白。谁也不敢动。再谁也不明白核心的基础上开发,可不是就是穷举一切可能。

原贴:https://weibo.com/1727858283/NuM5LyWWq

设计强大的甲骨文字体实践:从编程到套书 通过灵活运用编程和设计的方法,我们可以创造出多样化且富有创意的甲骨文字效果,展现古老文字的魅力与现代设计的融合。需要注意的是,以上示例代码仅仅是一个简单的演示,实际的甲骨文字字体设计和应用可能涉及更复杂的技术和工具。在实际应用中,我们可能需要使用专业的字体设计软件或库来创建更精细和复杂的甲骨文字字形,并进行更灵活的排版和布局。通过这种方式,我们可以使用编程技术设计和应用甲骨文字字体,从而实现套书设计中的甲骨文字效果。当我们成功地绘制了一个甲骨文字的字形后,我们可以使用类似的方法来定义其他甲骨文字的形状。 阅读详情

相关推荐

西门子1500T系列凸轮同步(CAMIN指令用法)

添加凸轮工艺对象(TO_CAM),也就是凸轮表。开始编程,先写2个轴的使能、回原点与主轴的定位。监控主轴与从轴的位置、速度关系是否满足实验要求。1.添加工艺对象(1个定位轴,1个同步轴)调用CAMIN指令 ,凸轮耦合。主轴为旋转轴且为模数轴。3.调用插补凸轮盘指令。4.仿真、监控、调试。

gyxgyx789的博客 1万+

能把队友气死的8种屎山代码(React版)

例如我们项目中,这个useEffect内部执行的是第一点中的内容,即每次都会绑定一个scroll事件的回调,而且页面中有实时轮询接口每隔5s刷新一次列表,用户在该页面稍加停留,就会有卡顿问题出现。这还只是一种比较简单的三元选择符的嵌套,因为当各个条件分支都为true时,就直接返回了,没有做更多的判断,如果再多做一层,都会直接把人的cpu的干爆炸了。单文件高达1600多行!这个示例代码还比较简单,拿对应的值去后台可以找到对应的含义,如果是写死的是枚举值,而且还没有类型定义,那代码就很难维护了。

IT界那些事儿 7778

CAPL编程入门:从零开始掌握汽车通信脚本语言

本文详细介绍了CAPL编程的基础知识,从开发环境搭建到核心语法精要,再到总线通信实战和高级调试技巧。CAPL作为汽车通信脚本语言,专为CAN、LIN等网络协议设计,帮助工程师高效完成车载网络测试。通过实战案例和性能优化建议,读者可以快速掌握CAPL编程技能。

s1t2u3的博客 978

何为屎山代码?

编程圈流传着这样一个有趣的小故事:一个哥们上班忽然怒气冲冲,大声质问:“这 TMD 谁写的代码,这么明显的 bug 都能写出来,还不写注释?屎山代码,也被称为"祖传代码",是历史遗留问题,是前人留给我们的"宝藏"。你一个人硬着头皮改,你必然疲惫不堪,身心俱疲,最后也必成拉屎之人,千万不要明知山有屎,偏向屎山行。通过良好的编程习惯,清晰的代码结构,充分的注释和文档,我们可以为后来者留下一个更加稳固的代码基础…但听我一句劝:屎山代码虽然看着难受,但一旦动手,山就可能塌了,将自己深埋于屎山之中,臭不可闻。

专注于全栈开发领域 1万+

用SPSS做信效度分析

对问卷进行Cronbach’s Alpha信度检验。如果此值高于0.8,则说明信度高;如果此值介于0.7-0.8之间,则说明信度较好;如果此值介于0.6~0.7,则说明信度可接受;如果此值小于0.6,说明信度不佳。下面利用SPSS进行分析,点击分析–标度–可靠性分析选项,选中所要分析的问卷数据或题目。得到结果,我们要看这个有用的结果,当克隆巴赫Alpha系数(也可以看标准化后的)大于0.8时候,说明问卷信度较高。

小高~的博客 1万+

基于PWM的汽车仪表步进电机微步驱动优化实践

本文深入探讨了基于PWM的微步驱动技术,用于优化汽车仪表步进电机的运行性能。通过将传统的分步驱动升级为PWM微步细分驱动,利用正弦/余弦查表法合成旋转磁场,有效消除了指针抖动与噪声,实现了指针的平滑、精准运动。文章以STM32和VID2905电机为例,提供了详细的硬件连接、代码实现及高级优化技巧,为提升汽车仪表体验提供了实用方案。

weixin_29169505的博客 511

能把队友气死的几种屎山代码

前几天在技术群里聊起Code Review的事,大伙儿似乎都憋了一肚子气:我觉得这份难言之隐应该要让更多人看到,就约了个稿:整理(脱敏)出了这篇小小的屎山合集,供大家品鉴。可能存在下面一些问题直接来一个代码例子,这是一个获取背景颜色的方法,但是随着业务的不断变化,背景颜色的来源越来越多,在一些业务人员的处理下可能是这样的:相信你在读上面的代码的时候是极为痛苦的,想要一目了然的知道最终会进入哪个分支,基本不可能。于是基于下面两个原则有了一个基础版本的重构:依赖参数缺失。 这样的话,每次页面有重渲染,该us

qq_66627105的博客 2693

TCGA数据集介绍及数据下载指南(新手友好篇)

目录一、TCGA数据集介绍1.1 数据集介绍1.2 File介绍1.2.1 Data Category(数据类别)1.2.2 Data Type(数据类型)1.2.3 Experimental Strategy(实验策略)1.2.4 Workflow Type(工作流类型)1.2.5 Data Format(数据格式)1.2.6 Platform(平台)1.2.7 Access1.3 Cases介绍1.3.1 Case ID(案例编号)1.3.2 Primary Site(主要站点)1.3.3 Progra

Wendy的博客 6万+

7年无人敢动的「屎山」代码:if循环19.8亿次

你是不是也有这样的问题?????速戳看视频????黑马视频号你玩过“侠盗猎车手5”(简称GTA 5)这个游戏吗?这个游戏是由Rockstar Games游戏公司(被玩家称作R星)出版发...

传智播客的专栏 3万+

基于STM32F1XX 、HAL库的BH1745NUC-E2环境光传感器驱动应用C语言程序设计

printf("BH1745制造商ID: 0x%02X\r\n", BH1745_ReadManufacturerID(&hbh1745));#define BH1745_ADDR_HIGH 0x39 // ADDR引脚接VDD。#define BH1745_ADDR_LOW 0x38 // ADDR引脚接地。= 0xE0) // BH1745制造商ID为0xE0。// 清除RGBC测量使能位。printf("BH1745初始化失败\r\n");

PP_Cottage的博客 278

C#串口通信从入门到精通(7)——整数/浮点数与二进制、八进制、十六进制之间的转换与C#实现

本文详细介绍由博主开发的DataConvert串口通信帮助类的用法,该帮助类涵盖了串口通信领域所有的数据转换方法,帮助大家快速编写串口通信程序!

qq_34059233的博客 2879

甲骨文2500万行的屎山代码有多“恐怖”?

程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 3.5分钟。来自:程序员的那些事【导读】:2018 年 Hacker News 上一篇对 Oracle 屎山代码的吐槽帖子,@宝玉XP老师最近翻译了,转过来大家一起看看。Oracle 数据库 12.2 版本竟然包含了将近 2500 万行的 C 语言代码。想想都觉得可怕!在这个产品里,改动哪怕一行代码,都有可能导致成千上万的测...

良月柒 354

k8s infiniband 和 RoCE(RDMA over Converged Ethernet)

vendors 为设备厂商编号,注意这里不是 ibv_devinfo 命令看到的vendor_id 的值,而是 lspci -n |grep “网卡的bdf” 得到的。如上文所述,启动了两个测试 pod ,登录其中一个 pod(该 pod roce 设备 ip 为 10.56.217.79)如上文所述,启动了两个测试 pod ,登录其中一个 pod(该 pod ip 为 10.96.225.24)说明:文中用到的镜像是自定义的,文末有其Dockerfile 文件。修改该文件,增加污点容忍的内容,如下。

weixin_40548182的博客 1794

2500 万行代码的项目,你敢不敢动?

(给程序员的那些事加星标)转自:开源中国近日,网友在 Hacker News 上发起了一个 “你见过的最糟糕的代码是什么?” 的问题,引起了广泛关注和讨论,评论数已接近6...

程序员的那些事 2864

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

windos 为什么会突然服务停止了_挖掘了八十几年"三星堆"为什么突然停止?太诡异、太恐怖...

"三星堆遗址",位于四川省广汉市西北鸭子河南岸。距今已有3000~5000年历史,是至今发现最大,历史最久远的古蜀文化遗址。被称为"世界最伟大发现之一""世界第九大奇迹"。所出土很多青铜文物,包括"黄金仗"堪称稀世珍宝,前所未见。更重要的是,它颠覆了我们曾经很多认知。从1929年发现到1934年正式开始挖掘,已挖掘了80多年,又进行不下去了,又是为何?三星堆遗址从1929年发现,1934年开始挖掘...

weixin_33628316的博客 1670

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

用电视入侵R星!泄露GTA6源代码的十八岁天才黑客,被判终身住院

程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 2.8 分钟。来自:网络R星工作室旗下的GTA5、荒野大镖客2,基本是全世界玩家耳熟能详的作品了。自GTA5发布后,已经过去了差不多10个年头,无数玩家对GTA6翘首以盼。然而就在去年9月,堪称游戏史上最恶劣的一次泄露事件发生了。一位ID为teapotuberhacker的黑客,在GTA玩家论坛发帖称,自己搞到了GTA6 的源代...

良月柒 634

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

如何“暴力破解”Oracle性能优化的极端问题(附精彩案例解读)

云和恩墨大咖系列报道2019数据技术嘉年华于11月16日在京落下了帷幕。大会历时两天,来自全国各地上千名学术精英、数据库领袖人物、数据库专家、技术爱好者在这里汇聚一堂,围绕“开源 • 智...

Enmotech的博客 648

终于弄明白了防御式编程,却感到一丝心酸

这几天上网,经常看到一个名词:防御式编程。开始没在意,但看到次数多了,不禁感到好奇。一个编程常识,怎么这么多人在说。仔细一看,原来是旧词新解:35岁以上的程序员,为了不被公司优化掉,故意将代码写的只有自己能看到的懂,别人想改都不知如何下手。 真的是很无奈,一个好好的词又被毁掉了。防御式编程的含义本意是宽进严出,也就是通常说的程序健壮性:在输入有错误的情况下,也能得到较好的结果。HTML 就是这样一...

云水木石 582

ThingsBoard初始化数据库Postgres

本章将介绍的本地环境搭建,以及源码的编译安装。本机环境:centos7,docker,postgres。

可乐要加冰!!! 2493

Vue2屎山代码大盘点

危害程度:⭐️⭐️⭐️⭐️⭐️写个注释是举手之劳,花不了多少时间,而且前面所有的屎山堆起来,如果有注释的话还是可以快速理解其含义的,但是如果再加上不写注释,那就是天坑了,谁也救不了这个屎山;罗马的道路不是一日铺成的,屎山的代码也不是一天写成的,而是在每个开发者无所谓的心态下堆成的,如果平时多注意注意至少也能保证自己写的代码”留有余香“。建议读完本文之后再读一读参考文章,最后是严格地执行!如果以时间不够为借口而不执行那么看再多的文章也没有用!堆屎山没有终点,持续更新中......

BASK2311的博客 1930

什么是屎山代码?

如果你也想学习:黑客&网络安全的零基础攻防教程为什么说再厉害的程序员,也怕屎山代码?首先,屎山代码不是指的一种开发语言,而是对庞大项目的一个别称。常言道,屎山传万代,代代不吱声。每次传承都会遗留大量问题,接手的人一般都不敢动代码,只要项目能跑动就行了。有一些初生牛犊不怕虎的新人自认为能力很强,决定重构或者修改屎山,但往往都是搬着石头砸自己脚—自讨苦吃。究其原因,还是因为老程序员很多不喜欢写备注,语法比较随性,导致代码冗余,但后面项目大起来,改又不好改了,屎山只能越堆越多。

资深程序员,曾自学JAVA,C#,如今从业于网安行业 4037

何为屎山代码,如何避免

今天我们来聊聊前端界的屎山代码。所谓的“屎山代码”,通常指那些难以维护、逻辑混乱或违反最佳实践的代码。想象一下这个场景:同事:“帮我改个按钮颜色,5分钟搞定!你打开代码,发现:按钮样式被写死在20个地方全局样式表里有3个冲突的 .btnJS 里居然用定时器强制覆盖颜色…这需求,老子不做了!(然后默默按下了Ctrl+S)”遇到这种代码,真的是要人老命!这里我给大家总结了一些常见的前端屎山代码,大家看看有没有中过招、踩过坑。

h_TVT的博客 2141
上一篇: Redis数据已经删除了,为什么内存占用还是很高?
下一篇: 微软Win12即将驾到,英特尔AMD提前开卷!
IT界那些事儿
博客等级 码龄6年 2万+粉丝 22原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值