iris-pgwire:借助AI与规范,理性构建软件
陷入困境
直到今年年初,我几乎没怎么做过编程工作——我已经厌倦了它。
在担任多年一线软件工程师和数据科学家后,我在2015年左右陷入了职业倦怠。我转而从事以“外部创新”为主的业务拓展角色,并于2019年加入InterSystems担任产品经理。我怀念编程的创造性,但并不怀念其中的枯燥乏味。无休止的样板代码编写、调试和上下文切换让我创意枯竭。就像电影《好好先生》(Yes Man)中金·凯瑞饰演的角色一样,我发现自己对新项目总是说“不”——以至于我换了职业!
然后,AI编程助手出现了。而我,成了对机器人说“好”的“好好先生”。
第一幕:狂热(“对一切都说好!”)
当我刚开始使用AI编程助手(先是Windsurf,然后是Cline,接着是Roo Code,现在是Claude Code,还尝试过opencode)时,感觉就像变魔术一样。自然语言 → 可运行的代码。我对每个建议、每个重构、几乎每个疯狂的想法都说“好”。
我第一个主要的AI辅助项目是几个月前启动的一个内部项目——为IRIS开发的一系列Python脚本和管道。我兴奋不已,让机器人尽情发挥: “添加这个功能!”——好!“重构那个模块!”——好!“让它可配置!”——好!“添加更多集成!”——好!
创意的能量回来了。代码如泉涌。我又感到自己高效了起来。
然后,我的实习生——一名软件工程专业的学生——查看了代码库。
他并不满意。
虽然我实现了几个完整的模块和管道,但只有部分“真正能工作”——测试通过了,但它们用了很多模拟数据,而不是真实的数据库查询。在很多情况下,“快速迭代”实际上是“AI垃圾”——模式不一致、逻辑重复、架构决策可疑。机器人对我要求的每件事都说“好”,但没有人对坏主意说“不”,也没有人说“等等,我们先想想”。
第二幕:现实的低谷
那次实习生的审查给我敲响了警钟。就像金·凯瑞饰演的角色发现对一切都说“好”会带来混乱一样,我不得不面对其负面影响:
- 幻觉:机器人自信地为不存在的API生成代码——这很容易发现,但调试起来频繁且耗时。
- 上下文偏离:长时间的会话会偏离最初的架构决策。
- 质量参差不齐:有些输出非常出色;有些则需要完全重写。
- “好,但不要……”的循环:每个提示都变成了“好,添加这个功能……但不要破坏我们昨天做的……还有不要忘记我三小时前提到的……”以及很多感叹号和全大写字母,我试图传达问题的严重性。
我不得不承认,我在管理机器人上花的时间超过了它带来的价值。狂热阶段结束了,失望的不止我一个人。我需要一种不同的方法,一个纠正方向的机会。
第三幕:引入specify-kit(“驯服野兽”)
我意识到:我需要一个系统,而不仅仅是一个机器人。
那时,我发现了spec-kit——一种与AI助手无关的工作流程,它改变了与AI助手的交互方式。(AWS的Kiro是另一种基于规范的AI辅助开发方式——这种模式正在整个行业中兴起。)我不再自由发挥地说“好”,而是有了结构化的规范:
工作流程 每一步都会生成能在上下文窗口中留存的产物:
改变之前: “添加Open Exchange支持……不,不要自动启动服务器……实际上,先检查module.xml是否存在……并确保测试通过……”
改变之后:
/specify make this an Open Exchange package
系统会提出澄清问题,记录决策,并生成实施计划。当我在/clarify过程中选择“手动启动”而非“自动启动”时,该决策会被编码到规范中,并贯穿到实施阶段。
证明:IRIS PGWire
IRIS PGWire是我给InterSystems开发者社区的一份(稍微迟到的)圣诞礼物。它是一个PostgreSQL线协议服务器,允许你将几乎任何PostgreSQL客户端连接到IRIS。
别误会——InterSystems有出色的、生产级的驱动:高性能的xDBC、原生DB-API,以及即将官方支持的SQLAlchemy适配器。对于你能控制堆栈并能确保应用安全、高性能和可靠的生产系统来说,这些是正确的选择。
但iris-pgwire不是为了取代它们。它是关于可能性。它是关于你的团队想尝试的那个只支持PostgreSQL连接字符串的BI工具。它是关于在不等待官方支持的情况下尝试新的ORM。它是关于对没有IRIS驱动的工具说“好”——并且让它正常工作。
而且,它非常有趣:
- psql、DBeaver、Superset、Metabase、Grafana——零配置
- psycopg3、asyncpg、node-postgres、Npgsql——8种语言共171个测试
- pgvector语法——使用
<=>表示余弦相似度,<#>表示点积
# Quick Start (Option 1: Docker) git clone https://github.com/intersystems-community/iris-pgwire.git cd iris-pgwire docker-compose up -d # Quick Start (Option 2: PyPI) pip install iris-pgwire iris-pgwire # Start the server # Connect with any PostgreSQL client psql -h localhost -p 5432 -U _SYSTEM -d USER
快速演示:从零到分析
一旦你的容器启动,你不仅连接到了一个数据库——你还连接到了一个生态系统。
- 经典握手
psql -h localhost -p 5432 -U _SYSTEM -d USER -c "SELECT 'Hello from IRIS!' as message"
2. 创建示例数据
-- 创建表并插入一些数据
CREATE TABLE public.Patients (
id INTEGER PRIMARY KEY,
name VARCHAR(100),
category VARCHAR(50)
);
INSERT INTO public.Patients VALUES(1, 'John Doe', 'Follow-up');
INSERT INTO public.Patients VALUES(2, 'Jane Smith', 'New Patient');
INSERT INTO public.Patients VALUES(3, 'Bob Johnson', 'Follow-up');
- 标准SQL,IRIS的力量
-- This runs on IRIS, but feels like PostgreSQL
SELECT COUNT(*) FROM public.Patients WHERE category = 'Follow-up';
-- Returns: 2
- “杀手级功能”:向量搜索 IRIS PGWire将PostgreSQL的pgvector语法转换为原生IRIS向量函数:
-- 创建带有向量嵌入的表
CREATE TABLE documents (
id INTEGER PRIMARY KEY,
content VARCHAR(500),
embedding VECTOR(DOUBLE, 3)
);
-- 使用pgvector操作符查询(自动转换为IRIS)
SELECT id, content FROM documents
ORDER BY embedding <=> TO_VECTOR('[0.1, 0.2, 0.3]', DOUBLE)
LIMIT 5;
不可能的连接:没有IRIS驱动?没问题。
这不仅仅是为了让事情变得更容易——这是为了让事情成为可能。
以Metabase Cloud或Prisma ORM为例。
-
Metabase Cloud是一个漂亮、托管的BI工具。你无法将IRIS JDBC驱动上传到他们的云服务器。你只能使用他们预装的列表。
-
Prisma是现代TypeScript开发者的标准ORM。它使用一个自定义引擎,目前还不支持IRIS。
没有线协议适配器,这些工具就无法访问你的IRIS数据。有了IRIS PGWire,它们看到的只是一个高性能的PostgreSQL数据库。
演示:Prisma与InterSystems IRIS 只需将你的schema.prisma指向PGWire端口:
datasource db {
provider = "postgresql"
url = "postgresql://_SYSTEM:SYS@localhost:5432/USER"
}
现在你可以使用Prisma的世界级CLI和类型安全:
npx prisma db pull
npx prisma generate
构建于结构化AI协作之上
这个项目有趣的地方不仅仅是代码——还有它是如何构建的。specs/目录包含31个功能规范,记录了整个开发历程:
specs/
├── 001-postgresql-wire-protocol/ # 一切的开始
├── 002-sql-query-processing/ # 查询转换层
├── 003-iris-integration-layer/ # IRIS后端连接
├── ...
├── 006-vector-operations-pgvector/ # AI/ML向量支持
├── ...
├── 012-client-compatibility-testing/ # 8语言测试矩阵
├── ...
├── 019-async-sqlalchemy-based/ # FastAPI集成
├── ...
├── 027-open-exchange/ # 包发布
├── 030-pg-schema-mapping/ # PostgreSQL模式兼容性
└── 031-prisma-catalog-support/ # ORM内省支持
├── spec.md # 功能需求
├── plan.md # 实施策略
└── tasks.md # 任务分解
每个功能都从一个自然语言描述开始,比如:
“PostgreSQL线协议基础——SSL/TLS握手、认证、会话管理和基本协议合规性”
然后变成一个结构化规范,包含用户故事、验收标准和[需要澄清]标记,用于需要人类判断的决策。
演变过程:
- 规范001:“我们能让PostgreSQL客户端与IRIS通信吗?”
- 规范006:“向量搜索和AI工作负载呢?”
- 规范019:“FastAPI开发者需要异步支持”
- 规范027:“让我们与世界分享它”
- 规范031:“Prisma ORM能内省IRIS模式吗?”
结果:超过100个测试在8种编程语言中通过。随时可用。
注意:关于AI“垃圾”和幻觉
我能保证你在这个仓库(甚至这篇文章)中找不到“AI垃圾”吗?当然不能——大型语言模型(LLM)的有趣之处在于,幻觉和不准确性几乎是其工作原理的一部分!
研究表明大型语言模型中的幻觉源于其基本架构——变压器根据子序列关联预测下一个标记的方式。正如OpenAI 最近的论文所解释的,语言模型之所以会产生幻觉,是因为训练过程奖励猜测而非承认不确定性。
所以,就目前而言,无论你多么努力地“驯服野兽”,你都只是在与它偏离事实的自然倾向作斗争。这种生成性的创造能力是现代AI力量的一部分,而且有些讽刺的是,LLM的第一个“杀手级应用”在我看来是编程助手。
为什么?因为通过可以迭代验证生成内容正确性的“代理”循环,你可以得到有用、可运行的代码。正如Factory AI 的Eno Reyes Reyes在AI工程师代码峰会上所强调的:“验证优于规范”——停止告诉代理如何解决问题,而是告诉它们什么是正确的。
Anthropic团队的Agent Skills 方法通过渐进式披露进一步推进了这一点——构建带有内置验证的可重用技能,而不是试图事先指定每个细节。
底线:规范帮助极大,但它们不是魔法。测试、验证和迭代改进在与AI助手合作时仍然至关重要。
如果你对软件开发领域发生的所有变化感到有些不知所措,你并不孤单——即使是特斯拉自动驾驶小组的前负责人、杰出的AI专家Andrej Karpathy也跟不上!
我学到了什么
- 规范是力量倍增器
投入30分钟在
/specify和/clarify上可以节省数小时的调试和返工时间。当意图被记录下来时,机器人就不必猜测你的意图。 - 澄清问题揭示差距 当specify-kit问“ZPM安装后服务器应该自动启动吗?”时,我意识到自己还没有决定。这个问题防止了一个会影响每个用户的设计错误。
- 规范是真相的来源 当上下文窗口溢出或会话重启时,规范仍然存在。机器人可以读取spec.md并继续工作,而无需重新解释一切。
- 测试优先仍然重要 规范中的每个用户故事都映射到验收标准。每个验收标准都映射到一个测试。机器人不会“忘记”写测试,因为规范要求它们这样做。
亲自尝试
IRIS PGWire
- GitHub: https://github.com/intersystems-community/iris-pgwire
- PyPI: https://pypi.org/project/iris-pgwire/ -
pip install iris-pgwire - Open Exchange: 即将推出! 快速入门:60秒使用Docker
specify-kit
- GitHub: https://github.com/github/spec-kit
- 用法:在命令行中将其添加到你的Claude Code项目中,使用
specify init --here,然后在Claude Code中运行/specify <你想构建的内容> - 替代方案:AWS的Kiro——在完整IDE中采用类似的基于规范的方法
平衡之道
我不再是对机器人说“好”的“好好先生”。我也不说“不”。
我是说:“好,但要有结构。”
创意的能量回来了。枯燥乏味的工作由机器人处理。但规范确保我们以正确的方式构建正确的东西。
InterSystems祝大家节日快乐。愿你的提示清晰,测试绿色。
资源推荐
- IRIS PGWire GitHub Repository - The "after" (31 specs, 100+ tests)
- specify-kit Claude Code Workflow
- Kiro - AWS Spec-Driven Development
- Claude Code Documentation
- InterSystems Open Exchange