Redis 数组类型的开发历程并非一蹴而就。从构想到最终合并入代码库,这条路走了将近四个月。对于一个拥有十五年历史的开源项目而言,新功能的引入往往伴随着复杂的工程权衡与取舍。本文不从技术实现角度展开分析,而是从 Redis 作者 antirez(Salvatore Sanfilippo)的视角,探讨在这段漫长开发过程中所做的非技术决策,以及这些决策背后的思考框架。
开发周期与时间投入的取舍
四个月的开发周期在 Redis 的历史上并不常见。antirez 本人在 Hacker News 的讨论中坦言,即便在没有大语言模型辅助的条件下,这个功能大约也能在四个月内完成。那么,四个月的开发周期究竟意味着什么?答案并非效率低下,而是精益求精的选择。
在这四个月里,开发工作并非持续高强度推进。antirez 描述这段经历时用了「部分时间投入」(part-time)与「密集开发」(intensive)交替出现的表述。这种节奏的选择本身就一种刻意为之的工程决策:对于涉及核心数据结构的重大功能,与其仓促上线,不如在时间维度上给予充分的空间,让设计思路在实践中不断沉淀与修正。看似缓慢的推进速度,实则避免了早期设计缺陷成为日后难以更改的「技术债务」。
从代码量来看,最终实现的数组功能包含约五千行核心代码:两千行稀疏数组实现、两千行 t_array 命令与上层架构、约五百行 AOF 与 RDB 持久化代码,其余为测试、JSON 命令描述与 TRE 正则库。这一数字表明,四个月的产出效率约为每日三十余行代码,这个数字看似不高,但考虑到系统级代码的复杂度以及需要反复推敲的边界情况,这个节奏恰恰反映了高质量系统编程工作的真实面貌。
大语言模型辅助下的开发范式转变
值得注意的是,这次开发过程是在大语言模型辅助下完成的。antirez 将这种工作方式命名为「自动编程」(Automatic Programming),以区别于「氛围编码」(Vibe Coding)。这一命名本身蕴含着重要的非技术决策:在承认 AI 辅助生产力的同时,明确界定人类开发者在其中的角色定位。
antirez 在其博客文章中阐述了自己的理念:自动编程产生的结果质量高度依赖于指导过程的人类开发者的直觉、设计能力与持续的方向把控。开发者需要提供清晰的想法、持续的方向调整以及对软件愿景的精确描述,而 AI 则在这种框架下承担代码生成、模式识别与初步检索等任务。这不是简单的「AI 写代码,人检查」的工作流,而是一种更深层次的人机协作模式,其中人类的职责从具体的代码编写转向更高维度的设计决策与质量把控。
在开发过程中,antirez 采用了一种独特的工作方法:他会让 AI 生成代码或提供建议,但始终保持对整体概念、算法与思想的完全掌控。他将这种方法形容为「拥有概念、拥有算法、拥有想法,特别是拥有产品」,而 AI 则作为执行层面的助手。这种分工使得开发者能够将精力集中于真正需要人类判断力的领域,例如架构设计、API 边界的划定以及与现有系统的兼容性问题。
设计妥协与社区反馈的平衡
Redis 的开发历史上,长期以来采用的都是一种相对集中式的决策模式。antirez 本人在 Hacker News 的讨论中明确表示:「我认为设计中的妥协是需要避免的。反馈很重要,但往往一个深入研究问题并具有设计品味的人,能够提出优秀的解决方案。在两个优秀的方案 A 与 B 之间进行调和,通常不会产生更好的方案 C,因为这种方案无法通过插值实现。更好的做法是保留 A 或 B 的核心优点。」
这种设计哲学在 Array 功能的开发中得到了充分体现。在四个月的时间里,antirez 基本上以独立开发的方式推进整个功能,唯一的外部输入来自有限的社区反馈与讨论。他明确表示,这种工作方式的弊端是可能会遗漏一些社区的好的想法,但优势在于能够保持设计的连贯性与完整性,避免因多方意见而导致的妥协产物。
值得注意的是,antirez 并不完全排斥社区反馈。他提到会发布开发过程中的「提示」(hints),接收社区反馈,并酌情纳入其中真正有价值的部分。这种「先独立思考,再选择性吸收」的模式,体现了对设计主导权的珍视,同时也保持了对优质想法的开放态度。
功能边界与产品定位的思考
在开发 Array 功能的过程中,一个重要的非技术决策是如何定义这一新数据类型的边界。Redis 本身被定位为「数据结构服务器」,其核心价值在于提供针对不同场景优化的数据结构实现。Array 的引入并非简单地将现有功能重新包装,而是要回答一个根本问题:Array 应该在 Redis 的生态中扮演什么角色?
antirez 在讨论中提到了一个关键的使用场景:将 Redis Array 用于文本文件处理。当意识到这一点后,许多原本受限的使用 case 变得可行,而这种洞察直接影响了后续功能的规划,例如 ARGREP(数组正则匹配)功能的加入。这种从实际使用场景出发、倒推功能设计的思路,体现了以产品价值为导向的开发决策模式。
另一个值得关注的决策点是与现有数据类型的区分。社区中曾有声音质疑:Sorted Set 是否已经能够满足类似的需求?antirez 的回应明确指出,两者在底层实现上有本质区别:Sorted Set 采用跳表与数组的组合,在范围查询与环形缓冲区场景下无法达到 Array 的效率。这种对底层实现差异的坚持,反映了 Redis 一贯的设计理念 —— 为每个使用 case 提供最优的底层实现,而非用一个通用但低效的方案敷衍了事。
工程质量与开发效率的再平衡
四个月的时间跨度带来了另一个层面的挑战:如何在长周期开发中保持工程质量,同时不陷入无限迭代的陷阱。antirez 在开发完成后进行了一项关键的「回溯审视」:逐行阅读所有代码,检查潜在的低效设计与错误。这一步骤虽然在时间成本上不可忽视,但确保了最终产出的代码质量符合 Redis 项目长期以来的标准。
这一决策背后的逻辑在于:系统级编程任务的代码质量要求极高,任何隐藏的设计缺陷都可能在未来成为维护噩梦。与其在后期通过 bug 修复来弥补,不如在开发阶段就投入足够的时间进行彻底的代码审视。这种「慢即是快」的思维方式,对于高可靠性系统的开发具有重要的借鉴意义。
与此同时,antirez 也承认,在某些场景下 AI 辅助确实带来了实质性的效率提升。例如处理三十二位支持、识别底层实现中的 bug 等边界情况时,AI 的模式识别能力能够快速定位问题所在。这些任务的特点是:问题明确、边界清晰,非常适合 AI 的介入。而涉及整体架构设计、API 语义定义的决策,则始终需要人类开发者的深度参与。
面向未来的开发模式思考
Redis Array 的开发历程,某种程度上预示了未来软件开发模式的一些可能性。antirez 在讨论中提出了一个前瞻性的观点:当 AI 能够更深入地理解系统整体架构与设计意图时,服务器软件的开发方式将会发生根本性变化程序员的角色将逐渐类似于 Linus Torvalds 在 Linux 内核开发中的定位 —— 更多是方向的把握者与质量的把关者,而非每一行代码的实际撰写者。
不过,antirez 也强调,这种转变的前提是人类开发者仍然保持对系统的深刻理解与掌控力。在他看来,「自动编程」与「氛围编码」的根本区别在于:前者是人类主导、AI 辅助的生产模式,后者则是人类将控制权完全交给 AI 的状态。前者能够产出高质量的系统软件,后者则可能导致代码质量的急剧下滑。
Redis Array 的四年开发历程,既是一个技术功能的实现过程,也是一份关于工程决策的深度案例分析。它提醒我们,在引入新技术工具的同时,保持对设计主导权的清醒认知,或许是比技术实现本身更为重要的课题。
资料来源:本文主要参考 antirez 本人在 Hacker News 上的讨论帖「Redis array: short story of a long development process」及其博客文章。