18年的一条对 Oracle 屎山代码的吐槽:
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工作了,以后也不会再回去了!
http://t.cn/E2z8frt
