Oracle数据库代码的疯狂与成功

本周,Hacker News用户决定讨论以下问题: “您看到的最大坏代码-仍然有效的代码是多少?” (后来Reddit用户加入了他们)。 在评论中,我们讲述了很多不时发生的有趣故事。 但是有关“大多数财富100强公司使用的先进DBMS”代码的故事吸引了最多的关注。

Lovecraft Horror提名的获胜者当之无愧地是一个前Oracle开发人员在版本12.2的开发过程中致力于Oracle Database的故事 。 当时,DBMS的代码库是用C语言编写的2500万行-一旦您仅更改了其中一行, 编写了成千上万的测试。

多年以来,几代程序员一直在编写代码,这些程序员经常受到苛刻的截止日期的追捧-因此,代码可能变成一场真正的噩梦。 今天,它由负责逻辑,内存管理,上下文切换等等的复杂“代码”组成。 它们使用成千上万个不同的标志相互连接。 所有代码都是由一个神秘的宏互连的,如果不依靠笔记本,就无法解密该宏,您必须在其中写下宏相关部分的工作。 结果,开发人员可能需要一两天的时间才能弄清楚宏实际上在做什么。

为了预测一种或另一种情况下代码的行为,您必须了解并记住20个(甚至一百个)标志的值和结果。 由于各种开发人员使用他们自己的类型(实际上是同一件事)(例如int32),并且几乎没有人会冒这样的遗产风险(我们可以肯定地说这就是这种情况),使情况更加恶化。 Oracle 8i代码库)。

随之而来的问题是:尽管如此,Oracle数据库如何仍然能够站得住脚? 秘密在于数百万次测试。 它们的完整实施可能需要20到30个小时(同时在100-200台服务器的测试集群上进行分布式执行)。

在90年代后期致力于产品并遵循TDD(测试驱动开发)思想的团队有以下意见:“自动化测试意味着您不需要编写可以理解的代码-相反,您应该思考测试。” 将来,开发人员被迫遵守他们制定的原则,现在我们正在实践中目睹这种想法从长远来看变成了什么-包括其优点和缺点。

今天,修复Oracle数据库中的新错误的过程需要数周到数月的时间。 首先,开发人员只需要花几天时间就可以弄清楚自己需要的标志(标志的神秘交互会导致错误),然后他通常不得不添加自己的标志,该标志将负责处理导致该错误的特定脚本。

然后,他发送代码进行测试,第二天他冷静地切换到另一个任务,等待测试集群组装一个新的Oracle DB程序集并在其上运行所有测试。 如果开发人员幸运的话,大约有100个测试会“脸红”。 如果不是(这个选项经常发生)-大约1000,那么他将不得不检查他对现有代码操作的哪些假设被证明是不正确的; 他很有可能会发现他需要研究十二种不同的标志,这些标志以明显的方式参与了他所更改的代码的工作。

在运气最终对他微笑并且所有测试最终通过之前,他将不得不重复此过程几周。 之后,他将不得不编写几十个测试-以确保将来会打扰他的代码的开发人员不会破坏他的“修正”。 然后,将改进意见发送给审核,这可能需要数周到几个月的时间,之后,该错误最终将被合并到主要的工作分支中。

由于事实是至少需要一天的时间来构建DBMS并运行测试,因此,每个开发人员都可以同时处理2-3个错误,并在等待测试结果的同时在它们之间进行切换。

如果您认为开发人员向DBMS添加新功能的工作变得更轻松,那么您将徒劳无功。 甚至添加一个小的新功能(如新的身份验证模式)也可能需要6个月到一年的时间,在高级情况下,则可能长达两年。

在描述的情况下,TDD不允许破坏“意大利面”代码,在该代码中已经很难理解某些东西,并且在输出端具有有效的产品。 同时,成本继续增长,并且新代码的质量常常有很多不足之处。 不仅有来自美国的开发人员团队,而且有来自印度的团队都在研究DBMS,因此,按照既定的传统,一些Oracle开发人员将代码质量归咎于他们。 其他人则不同意它们,并基于变更日志,他们说代码的质量并不取决于团队的地理位置,不良代码会定期“飞离”两个团队。 对于产品而言,一个真正严重的问题是开发人员将项目视为“进入行业”,并且从事DBMS的工作不超过1-2年。 在这段时间里,不可能充分理解该项目的复杂性。

根据另一位在90年代后期将Oracle 8i代码库移植到Unix版本中的开发人员的说法,当时的代码已经是一团“意大利面”,这是完全不可能完全理解的。 另一位在80年代后期使用DBMS代码的开发人员声称,该代码库是大量C源代码和一组用于汇编的makefile-其中许多文件比内核代码本身复杂得多。 当然,这是现实的-在行业领先的同类产品中,情况已经好几十年了,几乎没有比这更好的了。

Source: https://habr.com/ru/post/zh-CN429946/


All Articles