25,000,000 行的代码就问你敢不敢动?!
导读:你经历过绝望吗?
前一段时间,Hacker News 上发起了一个名为“你见过最糟糕的代码是什么?”的话题,引发了无数网友回忆讨论,甚至还再次让软件巨头 Oracle 登上头条。
链接:
https://news.ycombinator.com/item?id=18442637
本文经授权转自公众号CSDN(ID:CSDNnews),作者:屠敏
01 25,000,000 行的代码就问你敢不敢动?!
日前,我们还在说如今的 Oracle 惨遭亚马逊、Salesforce 弃用,究其根本原因,不是因为亚马逊等企业为了省钱,而是因为 Oracle 数据库逐渐满足不了他们业务的发展需求。
在 Oracle 内部,相比每隔六个月就更新一次的 Java,Oracle 数据库版本的更新频率可以用 2-3 年甚至更久来表示。就在上文所述的 Hacker News 话题中,来自 Oracle 的程序员为我们解释了其中的缘由,庞大的 Oracle 数据库并不像外人看得那么简单,修复 Bug 可以分分钟让人奔溃。
该程序员以 Oracle 数据库 12.2 版本为例,它拥有了近 2500 万行的 C 代码。
每次更新,你需要在不破坏现有测试 1000 次的情况下更改产品中的单行代码。就 Oracle 数据库产品而言,是好几代程序员在有限的期限内编写的这些代码,但与此同时,这些代码中也充斥着大量的垃圾代码。
非常复杂的逻辑、内存管理、上下文切换等都与数千个 flag 一起保存。整个代码都带有神秘的宏命令,如果没有使用笔记本而是手动扩展相关的宏,那么你就无法清楚地明白这些宏。甚至可能需要一天到两天才能真正理解某个宏的作用。
有时你需要了解 20 个不同 flag 的值和效果来预测代码在不同情况下的行为方式。有时多达数百个 flag!“我并不夸张。”该程序员表示道。
Oracle 这个产品仍然存活并且可以供企业和开发者使用的唯一原因是数百万次测试!
接下来,该程序员分享了 Oracle 数据库开发人员的日常:
- 开始处理一个新的 Bug。
- 花两周的时间试图了解 20 种不同的 flag,这些 flag 以神秘的方式相互作用,造成了这个困境。
- 再添加一个 flag 来处理新的特殊情况。添加几行代码来检查此 flag 并解决有问题的情况,避免该 Bug。
- 将更改提交到包含大约 100 到 200 台服务器的测试服务器集群,这些服务器将编译代码,构建新的 Oracle 数据库,并以分布式方式运行数百万个测试。
- 下班回家。第二天来上来,继续做其他事情。测试可能需要 20 小时到 30 小时才能完成。
- 一天结束,下班回家。再来上班时,检查前天的集成测试结果。如果幸运的话,将会大约有 100 个失败的测试。如果运气不好,将大约会有 1000 个失败的测试。随机选择一些测试并尝试了解你的假设出了什么问题。也许还有 10 多个 flag 要考虑才能真正理解 Bug 的本质。
- 添加一些 flag 来尝试解决问题。再次提交更改以进行测试。再等 20 到 30 个小时。
- 另外,重复以上步骤大概两周左右,直到你能得到将这些 flag 组合起来的“神秘咒语”(没有错误发生)。
- 终有一天,你会成功,带来测试失败为零的结果。
- 针对你新更改的部分添加 100 多个测试,以确保下一个不幸接触这段新代码的开发人员永远不会破坏你的修复程序。
- 完成最后一轮的测试提交工作。然后提交以供审核。审查本身可能还需要 2 周到 2 个月。所以现在继续讨论下一个 Bug。
- 在 2 周到 2 个月之后,当一切都完成后,代码将最终合并到主分支中。
以上是在 Oracle 修复 Bug 的程序员日常的非夸张描述。现在想象一下开发新功能会有多么恐怖。开发一个小功能需要 6 个月到一年(有时是两年!比如添加一种新的身份验证模式,比如支持 AD 身份验证),现在也可以理解为什么 Oracle 数据库的更新速度永远追不上 Java 了。
而对于这款产品可以商用也真的是一个奇迹。到了最后,这名程序员崩溃地说:我不再为 Oracle 工作了。永远不会再为 Oracle 工作了!
对于这一现状,更有不少网友表示了同情:
@nathan_f77:这绝对是疯了。 我甚至无法想象代码库的复杂性。我认为我的 Rails 测试套件已经很慢了,因为它需要 4 分钟。如果我用 C 或 C ++ 编写它可能是 10 秒。
我无法想象一个 C / C ++ 的应用程序,其中测试套件在具有 100-200 台服务器上需要 20-30 小时。如果你仅更改一次之后突破 100-1000 次测试,那么它就不像独立的模块化那样了。
测试运行间隔 30 小时! 我绝对不会接受这份工作, 因为光听起来,就像是地狱。
02 rm -rf 的怨念
那如果说在 2500 万行的代码上动刀,光是测试就已经如此复杂了,除了之外,是否还有比这更可怕的代码?
必须有!
让很多程序员后悔到想剁手的“rm -rf”绝对要算一个,糟糕的不是命令行本身,而是它带来的后果。此前,不仅有顺丰程序员的删库跑路事件,就连前MegaEase 创始人&CTO 陈浩(微博@左耳朵耗子)也未能逃脱该命令行带来的魔咒。
那年写 Unix Shell 脚本,本想删除一些临时的子目录,如:rm -rf ${mydir}/ ,结果呢,我没检查 ${mydir} 这个变量是否为空,于是呢,在某种情况下,这变量真的为空了,于是,我成了团队的千古罪人。
03 那些年,我们见过和创造的“渣渣”代码
论起是否遇到过糟糕的代码时,天下的程序员似乎有着极高的相似性,在此,更有知乎网友吐槽:
@小猪:
if (b == true) {...}
我不常写 C,不知道 C 程序员是不是觉得这种写法是理所当然的,但当我在 Java 代码中频繁的看到这种代码的时候,我真的很无力。
@周越:
(a != b) ? b : a
@侯杰:
enum FiveLine
{
Gold,
Wood,
Water,
Fire,
Earth,
};看枚举名字不知道五行(hang)是什么鬼,看了枚举内容恍然大雾,原来是五行(xing)……
@玻璃杯中的鱼:
// 以下所有left代表右
// 以下所有right代表左
链接:
https://www.zhihu.com/question/30776912
04 写在最后
在程序员的日常生活中,面对参差不齐的代码,Debug 成功了叫创新,失败了叫掉坑。但是,如今的大牛哪一个又不是在写 Bug 与 Debug 中博弈过来的呢,也正是有了这些糟糕的代码才能让彼时的菜鸟们真正得以历练。
你曾经又写过哪些让你后来捂脸的糟糕代码?欢迎下方留言,分享那些年的菜鸟岁月。
本文经授权转自公众号CSDN(ID:CSDNnews),作者:屠敏
据统计,99%的大咖都完成了这个神操作
▼
更多精彩
在公众号后台对话框输入以下关键词
查看更多优质内容!
PPT | 报告 | 读书 | 书单
大数据 | 揭秘 | 人工智能 | AI
Python | 机器学习 | 深度学习 | 神经网络
可视化 | 区块链 | 干货 | 数学
猜你想看
烧脑科普:从亚里士多德到牛顿,7位大佬都被这个问题搞懵了
干货:4个小技巧助你搞定缺失、混乱的数据(附实例代码)
NumPy入门攻略:手把手带你玩转这款强大的数据分析和计算工具
谷歌最新开源前端框架了解一下?前端小白都能看懂的8本书
Q: 你都遇到过哪些让你抓狂的代码?
欢迎留言与大家分享
觉得不错,请把这篇文章分享给你的朋友
转载 / 投稿请联系:baiyu@hzbook.com
更多精彩,请在后台点击“历史文章”查看
25,000,000 行的代码就问你敢不敢动?!相关推荐
- 25,000,000行的代码就问你敢不敢动?!
你经历过绝望吗? 近日,Hacker News 上发起了一个名为"你见过最糟糕的代码是什么?"(https://news.ycombinator.com/item?id=18442 ...
- 2500 万行的代码就问你敢不敢动?!
全世界只有3.14 % 的人关注了 数据与算法之美 近日,某网友在 Hacker News 上发起了一个 "你见过的最糟糕的代码是什么?" 的问题,引起了广泛关注和讨论,评论数已接 ...
- python好学吗 小木虫-25行Python代码完成人脸识别
以下是Shantnu Tiwari的客座文章,作者有着在底层编程和嵌入式领域十年的工作经验.在发现Python语言之前的几年时间里,Shantnu Tiwari一直忍受着C/C++语言编程的不便,但P ...
- python人脸检测代码_如何用不到25行Python代码实现人脸检测
本文我们会讲讲怎样利用不到 25 行 Python 代码和开源库 OpenCV,以很简单的方式实现人脸识别. 在正式开始前,先提以下两点小小的建议:先别急着跳到代码部分,最好在前文理解一下代码是干什么 ...
- 25行AS3代码编程大赛的第一名!25行代码构造的AS3游戏
叫做Marius Heil的AS开发者使用AS3构造了一个25行代码的AS3游戏,并且获得了25行AS3代码编程大赛的第一名! /** * 25-Line ActionScript Contest E ...
- c语言将图像转换成字符画,25行Java代码将普通图片转换为字符画图片和文本的实现...
本文主要介绍了25行Java代码将普通图片转换为字符画图片和文本的实现,分享给大家,具体如下: 原图 生成字符画文本(像素转换字符显示后,打开字符画显示相当于原图的好几倍大,不要用记事本打开,建议用n ...
- 【全网最精简】一行代码解决千万位以上的数字格式化为银行金额数字格式(如:¥1,000,000,000.00)
parseFloat(123456789.123456.toFixed(2)).toLocaleString(); //"123,456,789.12"(注意输出的是字符串)par ...
- 10亿行C ++代码使用3万元/个的电脑处理器AMD Threadripper 3990X:在64核CPU处理器256GB内存电脑上编译需要多长时间?
作者:Eli M.(Delphi MVP) RAD Studio由Delphi和C ++ Builder组成.在Delphi方面,Object Pascal编译器是单行编译器,并且编译器本身不是并行 ...
- haproxy ssl_我们如何微调HAProxy以实现2,000,000个并发SSL连接
haproxy ssl by Sachin Malhotra 由Sachin Malhotra 我们如何微调HAProxy以实现2,000,000个并发SSL连接 (How we fine-tuned ...
最新文章
- 微信扫码登陆/微信公交号 登录PHP 自适应 UnionID统一用户
- c语言快速排序案例,什么是快速排序?C语言数组快速排序例子
- 开始抽时间学习swift
- Spring Cloud微服务系列-Eureka Client源码解析(一)
- android中的多渠道打包,Android 多渠道打包简析
- 02函数极限存在条件
- Pycharm使用---Black代码格式化工具
- python xlwt_Python xlwt导出excel完整版
- 浅谈如何根治慢性扁桃体炎-个人经验总结
- 【AI】CV开山之作:《AlexNet》论文解读与代码实现
- 存储器的概述——DRAM动态存储器
- 小程序源码:AI微信小程序源码下载人脸照片AI转换动漫照片全新源码安装简单无需服务器域名-多玩法安装简单
- 试算平衡表两种方法比较
- 浅谈2023年Android开发技术趋势,什么值得学?
- 社区计算机知识,社区公共基础知识备考指导——计算机知识
- 迅睿CMS 程序安装教程
- https://www.atlassian.com
- C#读取QQWry.Dat文件实现IP查询
- 银联在线支付对接流程以及签名算法
- 大数据第一阶段学习笔记
热门文章
- OllyDbg笔记-修改Messagebox的标题
- Java笔记-使用RabbitMQ的Java接口实现Fair dispatch(公平分发)
- Python文件类型
- Qt工作笔记-进程间的通信(通过QSharedMemory)
- Qt工作笔记-对QItemDelegate自定义委托的理解
- 7.2图的存储结构(邻接矩阵)
- mysql 安装telnat_yum安装telnet服务
- linux nohup 后台运行
- matlab调用c函数语言,MATLAB调用C/C++函数的方法
- python环境搭建什么意思_如何搭建Python环境