25,000,000行的代码就问你敢不敢动?!
你经历过绝望吗?
近日,Hacker News 上发起了一个名为“你见过最糟糕的代码是什么?”(https://news.ycombinator.com/item?id=18442637)的话题,引发了无数网友回忆讨论,甚至还再次让软件巨头 Oracle 登上头条。
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 小时! 我绝对不会接受这份工作, 因为光听起来,就像是地狱。
rm -rf 的怨念
那如果说在 2500 万行的代码上动刀,光是测试就已经如此复杂了,除了之外,是否还有比这更可怕的代码?
必须有!
让很多程序员后悔到想剁手的“rm -rf”绝对要算一个,糟糕的不是命令行本身,而是它带来的后果。此前,不仅有顺丰程序员的删库跑路事件,就连前MegaEase 创始人&CTO 陈浩(微博@左耳朵耗子)也未能逃脱该命令行带来的魔咒。
那年写 Unix Shell 脚本,本想删除一些临时的子目录,如:rm -rf ${mydir}/ ,结果呢,我没检查 ${mydir} 这个变量是否为空,于是呢,在某种情况下,这变量真的为空了,于是,我成了团队的千古罪人。
那些年,我们见过和创造的“渣渣”代码
论起是否遇到过糟糕的代码时,天下的程序员似乎有着极高的相似性,在此,更有知乎网友(https://www.zhihu.com/question/30776912)吐槽:
@小猪:
if (b == true) {...}
我不常写 C,不知道 C 程序员是不是觉得这种写法是理所当然的,但当我在 Java 代码中频繁的看到这种代码的时候,我真的很无力。
@周越:
(a != b) ? b : a
@侯杰:
enum FiveLine
{
Gold,
Wood,
Water,
Fire,
Earth,
};看枚举名字不知道五行(hang)是什么鬼,看了枚举内容恍然大雾,原来是五行(xing)……
@玻璃杯中的鱼:
// 以下所有left代表右
// 以下所有right代表左
写在最后
在程序员的日常生活中,面对参差不齐的代码,Debug 成功了叫创新,改 Bug 失败叫掉坑,但是,如今的大牛哪一个又不是在写 Bug 与 Debug 中博弈过来的呢,也正是有了这些糟糕的代码才能让彼时的菜鸟们真正得以历练,而对于历练过程中需要注意什么,对此,CSDN 也曾发文从代码的基本规范和约束、编程思想、版本迭代与重构、设计模式等角度,为大家一一讲清如何才能成长为优雅的大牛程序员。
你曾经又写过哪些让你后来捂脸的糟糕代码?欢迎下方留言,分享那些年的菜鸟岁月。
点击“阅读原文”,打开APP 阅读更顺畅
【完】
公开课预告
◆
文本分类
◆
文本分类问题是企业在NLP领域中处理文本数据时经常会遇到的一个问题,很多时候,我们需要将文本信息进行分类,或提相关的接口以供外部进行文本上传,在针对于用户所上传的文档信息就需要进行文档内容的分类,那么针对于这个需求我们就需要使用到文本分类的相关模型和算法进行处理。在文本分类领域中的模型和算法有很多。本次演讲就是从这个角度入手,通过对比来阐述不同的算法、模型在实际的应用过程中的区别,以及在文本分类实践中所遇到的各种坑。
推荐阅读
免费报名 | WPS专家教你文本分类在企业中的应用实践
如何自学CS?
招聘 | 年薪百万, 超多职位等你选! 技术为王的时代, We Want You !
漫画:如何实现大整数相加?
程序员沉迷 Bug 可以有多疯?
调查 20500 名开发者发现,最流行的编程语言不是 Python 和 Java
Python的崛起,影响了80万程序员?真相...
相关文章:

c语言规定预处理命令必须以什么开头,C语言规定预处理命令必须以___________开头...
在定温定容下,语言规开反应NH4Cl (s) NH3 (g) HCl (g)达平衡,加入惰性气体平衡不移动05580041:定预若a、b均为int型变量,且a100,则for (b100;a!b;a,b) printf(----\n)是死循环。()处理05710012:以下正确的描述是( )。命令成年早期…

MySQL 微秒慢查询补丁
作/译者:叶金荣(Email: ),来源:http://imysql.cn,转载请注明作/译者和出处,并且不能用于商业用途,违者必究。原文出自:The new cool MySQL patch has landed! Check your…

Win10 15063 开始运行不保存历史记录原因和解决方法
在Win10 1703的时候你也许会发现开始运行以后,再次打开就没有任何历史记录了,常规方法是桌面-右键-个性化-开始-显示最常用的应用..可是打开是灰色的不可选.. 其实这个问题很好解决,在win10 15063隐私里面有一个设置的原因,请跟随…

CCNA培训课总结笔记--交换机的基本配置(十三)
实验目的:熟悉交换机的基本配置,学会在交换机上划分VLAN及如何将接口划分到指定的VLAN.本实验主要是用模拟器DynamipsGUI及3640的IOS文件做的实验,所以配置的命令有些会有出入.实验设备:3640交换机系列实验内容:其实交换机的基本操作包括设置特权登陆密码,设置控制台的密码等都…

TensorFlow 2.0发布在即,高级API变化抢先看
作者 | Sandeep Gupta, Josh Gordon, and Karmel Allison整理 | 非主流、Jane出品 | AI科技大本营【导语】早在今年 8 月的时候,谷歌开源战略师 Edd Wilder-James 在一封公开邮件中表示正在研发 TensorFlow 2.0,并将于今年晚些时候发布预览版。在 2018 年…

mp4 android自动播放,Android 使用VideoView播放MP4的简单实现
使用VideoView播放MP4播放示例实现简单的播放功能,播放手机本地的MP4文件。不依赖任何第三方框架,不添加任何防腐剂。添加一个系统自带的控制条。申请权限读取存储中的MP4文件准备布局文件在frag_video_view.xml中放置VideoView;为了让内容居…

Sublime-text theme 颜色主题
主题文件下载:Monokai.rar 替换办法: Preferences -> Browser packages -> Color Scheme - DefalutPreferences -> Browser packages -> Color Scheme - Defalut 覆盖 文件物理位置(win7): C:\Users\用户名\AppData\Roaming\S…
android 自定义radiobutton 样式,RadioButton自定义点击时的背景颜色
一、应用场景:在使用 RadioButton 时,有时我们会需要自定义点击时改变背景颜色的效果。效果图:RadioButton自定义背景颜色.jpg二、实现步骤:1、新建一组 RadioButton :android:layout_width"match_parent"an…

如何让网页不受电信114劫持
每当出现输入网页错误时,电信总会把你劫持到他所在的网页下,如下:[url]http://game1.zj.vnet.cn/url1.php?MTwww.dsdsddsds.com[/url]看了这张老脸就觉得浑身不舒服。能不能想个办法不让他出现呢?嘿嘿,其实很简单&…

“男医生,女护士?”消除偏见,Google有大招
编译整理 | 若奇出品 | AI科技大本营如何消除 AI 带来的性别偏见是个令人头疼的问题,那究竟有没有方法去解决?12 月 6 日,Google 宣布他们迈出了减少 Google 翻译中性别偏见的第一步,并且还详细介绍了如何为 Google 翻译上的性别中…

Web Developer中文版下载
Web Developer是一款非常优秀的网页调试工具。Web Developer有IE和Firefox两个版本,主要功能表现在几个重要的方面:对页面中的文本、图像、媒体文件进行控制,对网页所应用的CSS文件的id与class辅助查看,表格辅助查看,可…

位置服务与地图应用
位置服务与地图应用: 位置服务(Location Based Services,LBS)又称为服务或基于位置的服务。Andorid平台支持提供位置服务的API,在开发过程中主要用到LocationManager 和LocationProviders对象。 为开发能够提供位置服务,首先需要得…

20分钟教你搞懂Git!
Git 是最流行的版本管理工具,也是程序员必备的技能之一。本文就来教你 20 分钟搞懂 Git!以下为译文:尽管每天你都会用到Git,但也有可能搞不懂它的工作原理。为什么Git可以管理版本?基本命令git add和git commit到底在干…

android 长按赋值功能,android实现WebView中长按选中复制文本操作
啥都不说了,老司机直接移步GITHUB看源码吧:https://github.com/deaboway/AndroidWebViewTextSelect万一不work,一定不是代码的问题,你可以自查链接中的如下情况CSS控制页面文字不能被选中user-select:none;body{-moz-user-select:…

如何找回丢失的Vista系统“休眠”菜单
如何让Vista系统“休眠”菜单重见天日一些使用Windows Vista的朋友为了节省磁盘空间,在命令提示符下使用命令关闭休眠功能。但是如果再用相同的方法打开休眠功能时,就会发现,即使恢复了功能,“休眠”菜单还是看不见,这…

go3--常量和类型转换
/* Go中不存在隐式转换,所有类型转换必须显式声明 转换只能发生在两种相互兼容的类型之间 类型转换的格式:<ValueA> [:] <TypeOfValueA>(<ValueB>)全局变量可以使用var()的形式,局部变量不可以使用v…

android倒计时实现方法,Android实现倒计时方法汇总
Android开发中经常会有倒计时的功能,下面将总结出常见的集中实现方式。1.直接使用Handler的消息机制来实现xml布局中文件如下:android:layout_width"match_parent"android:layout_height"match_parent"android:orientation"hor…

今晚8点直播 | 详讲NLP的经典应用实践——文本分类
文本分类问题是企业在 NLP 领域中处理文本数据时经常会遇到的一个问题,很多时候,我们需要将文本信息进行分类,或提相关的接口以供外部进行文本上传,在针对于用户所上传的文档信息就需要进行文档内容的分类,那么针对于这…

谈论 嵌入式系统
引用 嵌入式系统嵌入式系统http://www.lumit.org/index.htm嵌入式相关的网站http://www.mcu123.com/news/Article/web/uc/200611/3939.html转载于:https://www.cnblogs.com/stoneresearch/archive/2008/10/21/4336381.html

SharePoint Server 2013 之四:部署SharePoint企业版
在上篇文章我们完成了SharePointServer 2013 必备的组件,用户可根据自己需求联网安装或离线安装。接下来我们进入SharePoint 企业版的部署。 运行SharePointServer 2013 SP1 安装程序,点击“安装SharePoint Server”如下图: 企业版安装是需要…

android 监测内存泄漏工具,LeakCanary:Android内存泄漏检测工具
LeakCanaryA memory leak detection library for Android and Java.“A small leak will sink a great ship.” - Benjamin FranklinGetting startedIn your build.gradle:dependencies {debugImplementation com.squareup.leakcanary:leakcanary-android:1.6.1releaseImplemen…

为什么说可视化编程是糟糕的想法?
可视化编程语言可以让程序员通过操纵图形元素来创建程序,而无需键入文本命令。众所周知的例子是 Scratch,这是一种麻省理工学院开发的可视化编程语言,用来教孩子们学编程。该语言的优势在于新手和普通用户可以更容易接触编程。二十世纪九十年…

7年增长16倍,清华AI+ML课程学生数暴增 | AI Index 2018
整理 | 非主流出品 | AI科技大本营用数据解读 AI。昨日,来自斯坦福大学、MIT、哈佛、OpenAI 等高校与企业的多位专家正式发布了 2018 年度 AI Index 报告,用一系列数据全面回顾了过去几年里 AI 领域的全球发展。营长挑了一些重点内容,为大家解…

RunTime的使用-Category改变整个项目全部字体
在项目比较成熟的基础上,遇到了这样一个需求,应用中需要引入新的字体,需要更换所有Label的默认字体,但是同时,对于一些特殊设置了字体的label又不需要更换。乍看起来,这个问题确实十分棘手,首先…

android 耳机红外线,红外线耳机制作方法
本文介绍的语音红外转发器具有结构简单、易于制作、无干扰、低噪声的特点。工作原理:转发器由发射和接收两部分组成。见附图1。鉴频后的伴音(音频)信号经三极管V放大后推动红外发射管。由于发射管的发光强度与通过的电流成正比,所以D1、D2所发出的红外光…

解决load cycle count的一个偏方,告别硬盘卡卡响
load cycle count猛增,笔记本电脑硬盘喀嚓喀嚓响,我倒不担心硬盘寿命,但是实在烦人那声音,系统也时常被卡一下。我曾使用了hdparm -B 254 /dev/sda 的方法,但是硬盘升温太明显,右掌托烫得忍无可忍。苦寻方法…

AI工程的实践者:普元积极将场景落地,为企业提供智能化解决方案
作者 | Jane出品 | AI科技大本营11 月 8-9 日,CSDN 和 AICamp 联合举办的 AI 开发者大会在北京顺利举行。普元移动产品线总经理郝振明发表了《基于机器学习的工程实践》的主题演讲,并接受了 AI科技大本营的专访。以下内容为郝振明的演讲与采访总结&#…

android用户界面设计:基本按钮,Android用戶界面設計:基本按鈕
本文向你展示了在你的android應用程序中創建一個簡單的Button或ImageButton控件的步驟。首先,你會學到如何向你的布局文件中添加按鈕控件。然後你會學習如何用兩種方法處理用戶對按鈕的點擊。最後,我們討論android中按鈕控件一些其它的可用特性。第1步&a…

快速浏览Silverlight3 Beta:当HLSL遇上Silverlight
HLSL高级着色器语言(High Level Shader Language,简称HLSL),由微软拥 有及开发的一种语言,只能供微软的Direct3D使用。 HLSL是微软抗衡GLSL的产品,同时不能与OpenGL标准兼容。他跟Nvidia的Cg非常相似。 看…

“80后”财富新贵创业秘诀
"80后"财富新贵创业秘诀:具有冒险和创新精神 不论是文化市场,还是经济市场,当许多人还认为还是“60后”或“70后”的天下时,“80后”财富新贵已在不知不觉中浮出水面,并试图用自己的实力证明新一代的崛起。李想、戴志康…