AI News HubLIVE
站内改写3 分钟阅读

我们使用编码代理为RonDB添加RonSQL支持

本文分享了作者利用AI编程工具Claude和Codex,在五个月内将一个十年前的待办功能——为RonDB添加复杂SQL查询支持(CTE和并行连接聚合)——从计划推进到Beta发布的过程,并总结了AI编程的开发模式、测试方法和经验教训。

来源Hacker News AI作者: jamesblonde

在Hopsworks,我们最近利用新一代AI编程工具,成功为RonDB添加了复杂的SQL查询支持。这个名为RonSQL的功能,包括CTE(公用表表达式)和推送连接聚合,已经在RonDB 26.04.1中以Beta形式发布。

几年前,我们曾尝试使用ChatGPT进行编码,但那次尝试被证明是一个昂贵的错误——生成的代码花费了几个月的时间重写。因此,今年年初我再次尝试AI编程时,抱持着相当多的怀疑态度。

最初的转机来自一个意想不到的地方:我们的营销经理在大约两小时内构建了一个简单的RonDB客户端。这引起了我的兴趣,我接手代码后,又在几个小时内对其进行了显著扩展。受到鼓舞,我尝试了更接近真实工程的任务:扩展REST API服务器,使其不仅能处理批量键读取,还能处理批量键插入、写入和删除。原始代码编写耗费了大量精力,而扩展只用了两天。显然,Claude和Codex在扩展现有代码方面表现出色。

有了这些成功实验后,我意识到这些新工具可能对开发RonDB真正的新功能极为有用。客户长期以来一直渴望在实时AI推理中实现更复杂的查询。支持这一点需要CTE和并行连接聚合——这个功能在RonDB的待办清单上已经躺了十多年。它是一项非常复杂的开发工作;用传统编码,我估计至少需要两年时间。

实际上,这相当于在键值存储中添加复杂SQL子集的支持。RonDB与Redis和DynamoDB属于同一类别,这些存储传统上用于这种实时、低延迟的服务,但完全不支持复杂SQL查询。将CTE和并行连接聚合引入这个领域,使得这项工作既非比寻常又值得。

我决定看看AI编程是否能让它变得可行。本文分享了我在过去五个月中的经验。

开发模式从一开始就清晰:有效的开发模式依然适用。从高层次计划开始,转向详细实现计划,然后逐步实现。我们多次经历了这个循环。每个计划至少包含10到20个阶段,有时更多。

在Claude和Codex之间,我的结论是它们的优势互补。Claude更擅长跟踪计划和剩余工作。Codex通常更擅长解决难题,但它在维护计划方面较为马虎,可能会忘记下一步该做什么。因此,大部分时间我让Claude负责计划维护和较简单的任务,而将难题交给Codex。

AI编程的一个直接好处是能够生成大量的单元测试——即使是通常难以测试的分布式场景。RonSQL查询执行跨越RonDB的四个层:LDM(本地数据管理器)、TC(事务协调器)、NDB API和RonSQL。通常,你需要针对RonSQL编写测试程序,因为手动针对LDM、TC和NDB API层编写和维护程序非常困难。AI编程改变了这一点:变得可以先开发和测试LDM层,然后再接触TC层,最后是NDB API层。这大大加快了在所有四个层上快速实现工作版本的速度。

AI编程在模型训练中见过的顺序代码上效果很好。但RonDB使用异步编程模型,有时模型需要明确的指导才能理解实际工作方式。对我来说显而易见的事情,模型可能完全看不见——但通过提示通常很容易教会它。反过来也经常发生:模型生成新代码的速度远超人类思考。

如何验证生成的代码是否正确?我遵循以下模式:

第一阶段:按计划构建。遵循高层次计划,然后是实施计划,最后逐步实施。在这个阶段,你是架构师:告诉模型做什么,大部分情况下你作为操作者接受它的建议。我发现至关重要的一点是,不让模型在未明确说明更改内容和方式的情况下修改任何代码。Claude默认就是这样;而Codex需要严格约束,以防止它擅自生成代码而不检查正确性。查看每个差异能让你至少对新代码的作用有一个概念——这也是生成大量测试的阶段。关键的是,每一步都包括编写至少一个测试用例,并在进入下一步之前验证该步骤已成功执行。步骤只有在有通过测试证明时才视为“完成”。这保持了实现的基础,防止小错误在计划的多个阶段中累积。

第二阶段:审查。步骤完成后,审查所有新代码。我主要关注影响实际执行的代码,只浏览测试用例和计划。我使用模型生成文档——包括图片和信令图——以更好地理解新代码。这个阶段确保模型遵循RonDB的内存模型,并正确处理节点故障和其他查询执行中的故障。模型也倾向于生成大量重复代码,因此删除重复代码路径是必不可少的步骤——有些删除掉了数千行需要维护的生产代码。

第三阶段:用测试压力测试功能。我们编写了CTE测试用例,不考虑它们是否被支持。当一个功能不被支持时,我们要么修复它,要么将其标记为不支持。剩下的是尽可能减少查询延迟,并继续审查生成的代码。

最后一点观察:当模型思考时,有足够的时间做其他事情。大部分时间我同时运行两到四个项目。因此,在RonSQL之外,还出现了RonDB解释器的JIT编译器、在RonDB中使用纤程以及死锁检测的原型。目前只有死锁检测在源代码树中,且默认禁用。这三个都还在进行中。

回顾过去,一个在待办清单上超过十年的功能——我原本预估需要两年时间——在五个月内达到了Beta。工作并没有消失,而是改变了形态。我的角色从编写代码转变为架构设计、指导模型、审查结果,以及最重要的测试。这,远超原始代码生成,是新一代AI编程在我们构建RonDB中赢得一席之地的原因。

我们使用编码代理为RonDB添加RonSQL支持 | AI News Hub