“一次性代码”与“可用软件”的鸿沟

长期以来,业界充斥着 "SaaS 已死" 的声音,人们倾向于让 AI Agent 自行构建工具以替代付费服务。然而,从能运行的“一次性代码”到真正愿意日常使用的“ polished 软件”,之间存在巨大的体验鸿沟。为了验证这一点,Railway 团队决定内部重构营销工具链。他们利用 AI Agent 构建了一个集成化平台,涵盖了内容管理(网站、博客、更新日志)、邮件发送、社交媒体同步发布、媒体资源管理,甚至包含了一个用于追踪外部创作者的微型 CRM 以及任务跟踪和发布日历。这一切都运行在 Railway 平台上,并随着 GPT-6 的推出实现了自动部署。这次实践的核心目的并非仅仅为了省钱,而是为了探索如何通过特定的工程原则,让 AI 生成的软件具备“令人愉悦”的打磨感。正如演讲者所言:"Software that sparks joy, that is polished... actually went on a journey to replace a bunch of SAS providers"。这种内部工具的构建过程,揭示了当前 AI 编程在用户体验细节上的缺失与突破方向。

技术栈选择:抽象结构优于具体语言

在构建供内部团队高频使用的工具时,技术栈的具体选择(如编程语言或框架)相对次要,关键在于代码库是否具备坚实的抽象结构和一致的规范。虽然很多人认为 AI 可以随意生成任何技术栈的代码,但在实际应用中,如果给 Agent 提供一个结构良好、抽象清晰的代码库,Agent 在添加新功能时会遵循既有的模式,从而保证结果的一致性。相反,缺乏结构的代码库会导致 Agent 每次都在“重新发明轮子”,引入混乱的模式。演讲者指出,对于 Web 开发,TanStack Stack 库是当前的首选方案;而对于内容相关应用,Payload CMS 提供了极佳的抽象体验。他提到自己曾深入比较过各种 CMSS(内容管理系统),认为不应从零开始构建,因为成熟的抽象能大幅降低维护成本。这种对现有模式的依赖是 AI 辅助开发中保证代码质量的关键,良好的抽象结构能让 Agent “follow existing patterns”,而非引入新的混乱。这种技术选型策略确保了工具在长期迭代中依然保持整洁和可维护性。

被忽视的产品细节:自动保存与乐观更新

当用户日常使用 SaaS 产品时,往往忽略了背后精心设计的交互流程。一旦尝试复刻这些体验,就会发现AI Agent 通常不会主动实现那些提升“手感”的细节模式。首先是自动保存(Autosave),这是文档编辑器的基础功能。Agent 往往需要被明确指示才能实现后台非阻塞的自动保存,并防止浏览器在存在未保存更改时关闭。更进一步,实时协作功能虽然消耗了大量 Token(演讲者幽默地提到 "700 million tokens later"),但 Agent 处理起来并不困难。其次是乐观更新(Optimistic Updates)。Agent 倾向于在操作后显示加载动画,而优秀的 UX 设计则是在后台同步数据的同时立即向用户展示成功状态。如果操作失败,再回滚并通知用户。这种模式让应用感觉显著更快、更即时(snappier)。演讲者强调,虽然并非所有场景都适用乐观更新,但在大多数日常操作中,它能极大提升用户体验的流畅度。这些细节是区分“能用的软件”和“好用的软件”的关键,也是当前 AI 编程需要重点补充的领域。

演讲背景与未来展望

本次分享于 2026 年 10 月(秋季)在苏格兰爱丁堡进行。演讲者特意选择在户外长椅上录制,以打破传统办公室讲座的沉闷感。他承认技术 landscape 变化极快,今天的观点可能在几个月内就会过时,因此将此视为一种基于当前技术节点的免责声明。尽管 AI 编程能力飞速进步,但从“能构建”到“精心打磨”的跨越仍需明确的原则指导。演讲者计划继续深入探讨其他被 Agent 忽略的产品模式,如错误处理、状态管理等。这一旅程不仅展示了 Railway 内部工具的重构成果,更为开发者提供了如何引导 AI Agent 构建高质量、高可用性软件的宝贵经验。核心观点在于:AI 是强大的执行者,但人类开发者必须提供清晰的架构约束和细致的 UX 指令,才能填补“一次性代码”与“卓越软件”之间的巨大缺口。

乐观更新与撤销机制:提升操作安全感

在构建内部工具时,乐观更新(Optimistic Updates) 是提升用户体验的关键策略。与其让 AI Agent 仅生成一个带有确认对话框的删除按钮,不如设计更流畅的交互:用户点击删除后,UI 立即移除该项,并提示用户在几秒内可撤销操作。若用户无动作,则后台执行真正的删除;若点击“取消”,则恢复数据。这种延迟确认机制不仅减少了用户的认知负担,还避免了因误操作导致的不可逆损失。

"A much nicer experience is actually allowing the user to undo that action... you have like a couple of seconds where you could change your mind."

此外,归档功能(Archiving) 应作为标准模式存在。许多应用强迫用户在“删除”和“保留可见性”之间二选一,这并不合理。通过提供归档能力,用户可以完全隐藏某些记录或将其从搜索结果中移除,而无需彻底销毁数据。这种非破坏性的隐藏方式比直接删除更符合实际业务场景,确保了数据的完整性和可追溯性。

URL 状态持久化与无限滚动:细节决定体验

URL 状态管理(URL State) 是常被忽视但极具价值的功能。当用户需要对列表进行过滤或排序时,将这些条件持久化到 URL 中,使得分享特定视图变得极其简单。团队成员可以直接通过链接看到完全相同的筛选结果,无需重复配置。URL 中的状态同步不仅提升了协作效率,还让应用行为更加可预测和稳定。

在数据展示方面,无限滚动(Infinite Scroll) 应替代传统的“加载更多”或分页按钮。用户不应在每次滚动到底部时都手动点击加载,而是应自动获取新数据,直到列表末尾。虽然这看似是微小细节,但在日常高频使用中,无感知的数据加载能显著减少交互摩擦。同时,明确指示 AI Agent 参考现有页面作为 UI、数据获取和结构设计的模板,能确保新功能的视觉一致性。尽管模型偶尔会忽略指令,但坚持这一原则仍能大幅提高代码复用率和体验的统一性。

"Maintaining these things in the URL makes it trivial for you to give them to someone else... another team member is just going to be able to see exactly what you want them to see."

Agent Skills 封装与端到端验证:构建可靠工具链

将设计规范和工程习惯打包为 Agent Skills(技能包) 是保证输出质量的核心手段。在构建内部工具时,作者使用了三类关键技能:一是提升 UI、排版和错误提示的设计工程技能;二是优化动画和其他视觉效果的交互增强技能;三是针对 Railway 基础设施的部署与运维技能。通过将这些隐性知识显性化,Agent 能更严格地遵循既定标准,确保不同模块间逻辑和样式的高度一致性。例如,所有记录列表页的 CRUD 操作应保持完全相同的交互模式。

最后,验证环节(Verification) 是决定工具可用性的最终步骤。仅靠代码通过测试并不足以保证体验良好,必须建立端到端的验证循环。要求 Agent 在构建功能后,实际运行基础设施并进行真实测试。一旦发现错误,Agent 能自我修正并重新验证。计算机使用(Computer Use) 能力的提升使得这种自动化测试成为可能。通过“构建-验证-修复”的闭环,最终交付的工具不仅功能完整,而且经过充分测试且稳定可靠。这种严谨的流程是打造高质量、令人愉悦的内部 SaaS 层的关键。

"Once you have like a verification loop in place, it's like a night and day difference because the agent... tried it. It failed. I'm going to fix it."

结论

Railway的内部实践证实,AI Agent具备构建集成化SaaS工具链的能力,但“一次性代码”与“可用软件”之间存在显著鸿沟。优势在于Agent能高效实现自动保存、乐观更新及URL状态持久化等交互细节,并通过封装“Agent Skills”与端到端验证闭环提升代码一致性。短板在于缺乏结构约束时易引入混乱,且需人工明确指令以填补UX打磨空白。适用条件为:必须依赖TanStack等成熟抽象结构,并辅以清晰的架构约束与细致的UX指令。该路径并非单纯替代付费服务,而是通过工程原则引导AI产出具备“打磨感”的高质量软件。