在快速迭代的大模型开发领域,有时推倒重来才是通往成功的唯一途径。本文将深入探讨作者从一个 “成功原型综合症” 中挣脱,最终踏上 “伟大重建” 之路的历程,并着重分析他在其中学到的经验教训,以及 领域驱动设计 (Domain-Driven Design)、双环境开发、意图驱动架构 和 持续学习 在项目重建中的关键作用。
成功的原型综合症与大模型架构评估
许多项目都经历过这样的阶段:一个功能初具雏形的原型诞生了,但它距离一个健壮、可扩展的平台还有十万八千里。作者称之为“成功的原型综合症”,指的是原型“刚好够用”,让你忍不住想在其基础上构建,但实际上却无法支撑未来的发展。这就像搭积木,如果地基不稳,盖得越高风险越大。作者的 “Piper Morgan” 项目最初就是一个典型的例子。为了摆脱这种困境,他求助于大模型,将原型生成的规范投入到多个LLM中,扮演资深技术架构师的角色,评估原型架构并提出改进建议。
作者巧妙地利用了当时最先进的大模型,例如 Claude Opus,来担任架构师的角色。他将原型项目的技术文档输入到这些模型中,并赋予它们 “您是一位卓越的技术架构师” 的身份,要求它们评估原型架构的优劣并提出改进方案。令人惊讶的是,所有的大模型都给出了相同的建议:放弃基于原型的迭代,从头开始构建一个更健壮的平台。
大模型的评估并非简单的“一锤定音”,而是提供了一个更客观、更全面的视角。它们可以快速分析代码结构、识别潜在的性能瓶颈、并提供行业最佳实践建议。这不仅节省了大量的人工评估时间,也避免了因为主观偏见而导致的错误决策。
领域驱动设计:从 GitHub 到产品管理
在重建 Piper Morgan 时,作者意识到他最初的思路是错误的。他之前的代码只是简单地模仿了 GitHub 的数据结构,例如 GitHubIssue 类,包含了 title、body 和 labels 等属性。这种做法虽然简单直接,但却将项目深深地限制在了 GitHub 的框架之内。
为了真正理解项目的核心需求,作者开始采用领域驱动设计 (Domain-Driven Design) 的方法。他不再关注具体的工具和技术细节,而是专注于对项目所涉及的业务领域进行建模。他创建了 WorkItem 类,包含了 title、description、acceptance_criteria 等属性,以及 Product 和 Stakeholder 类,分别用于描述产品和干系人的信息。这种以业务领域为中心的建模方式,使得 Piper Morgan 能够更加灵活地适应不同的应用场景,而不仅仅局限于 GitHub。
以 WorkItem 类为例,它抽象了各种工作项的通用属性,例如需求、缺陷、任务等。通过引入 item_type 和 priority 属性,可以对工作项进行分类和优先级排序,从而更好地管理项目的开发进度。而 Product 类则定义了产品的名称、愿景和功能,帮助团队明确产品的目标和方向。Stakeholder 类则用于记录干系人的姓名、角色和利益相关,方便团队进行沟通和协作。
通过领域驱动设计,作者将 Piper Morgan 从一个简单的 GitHub 辅助工具,转变为一个真正的产品管理平台。
意图驱动架构:用户的需求至上
作者在文章中强调,在架构设计中,最重要的是用户的意图,而不是技术实现的便利性。他创建了 IntentCategory 枚举,包含了 EXECUTION、ANALYSIS、SYNTHESIS、STRATEGY 和 LEARNING 等类别,分别对应不同的用户需求。这种意图驱动架构 的设计理念,使得 Piper Morgan 能够更好地满足用户的实际需求,而不是仅仅提供一些通用的功能。
IntentCategory 枚举的每个类别都代表着用户的一种核心意图。例如,EXECUTION 类别对应着创建、更新和实现等操作,ANALYSIS 类别对应着调查、测量和评估等操作,SYNTHESIS 类别对应着总结、整合和报告等操作,STRATEGY 类别对应着计划、优先级排序和决策等操作,LEARNING 类别对应着改进、适应和进化等操作。
通过将用户的意图作为架构设计的核心,作者可以更好地理解用户的需求,并设计出更加符合用户期望的功能。例如,如果用户希望创建一个新的工作项,那么系统就会自动将其归类到 EXECUTION 类别下,并提供相应的操作界面和工具。如果用户希望分析项目的进展情况,那么系统就会自动将其归类到 ANALYSIS 类别下,并提供相应的报表和图表。
这种意图驱动架构 的设计理念,使得 Piper Morgan 能够更加智能化地响应用户的需求,并提供更加个性化的服务。
双环境开发:保证代码的通用性
作者在两台不同的电脑上进行开发,一台是个人电脑,一台是工作电脑。这种双环境开发 的方式,可以有效地避免代码对特定环境的依赖,从而保证代码的通用性和可移植性。如果一段代码只能在特定的环境下运行,那么它就无法在其他环境下部署和使用。
作者将双环境开发 视为一种 “强制函数”。他认为,如果你的开发环境只能在某一台特殊的机器上运行,并且需要特定的配置,那么你构建的就不是一个系统,而是一个 “纸牌屋”。这种纸牌屋非常脆弱,一旦环境发生变化,就很容易崩溃。
为了避免这种情况,作者在两台不同的电脑上进行开发。他确保代码能够在两台电脑上都能够正常运行,并且不需要进行任何特殊的配置。这种双环境开发 的方式,使得 Piper Morgan 能够更加轻松地部署到不同的环境中,例如开发环境、测试环境和生产环境。
持续学习:从 TextEdit 到 Docker 的进化
作者坦言,他在项目重建的过程中,不断地学习新的技术和工具。他从最初使用 TextEdit 编写代码,到后来使用 VS Code 和 Cursor 等更加强大的 IDE;他从最初手动管理依赖,到后来使用 Docker 进行容器化部署;他从最初没有进行任何测试,到后来开始学习测试驱动开发。这种持续学习 的精神,使得他能够不断地提升自己的技术水平,并构建出更加健壮和可维护的系统。
作者将自己的学习过程描述为一种 “进化”。他认为,只有不断地学习新的技术和工具,才能跟上时代的步伐,并构建出更加先进的系统。他鼓励开发者们不要害怕学习新的东西,而是要保持一颗好奇心,并不断地探索新的领域。
通过持续学习,作者不仅提升了自己的技术水平,也更加深刻地理解了软件开发的本质。他认识到,软件开发不仅仅是编写代码,更重要的是理解用户的需求,并构建出能够满足用户需求的系统。
重建的价值:超越速度的长期收益
作者在文章中强调,重建虽然慢,但却能够带来长期的收益。原型虽然能够快速地实现一些基本的功能,但它的架构往往不够健壮,难以维护和扩展。而通过重建,可以构建出一个更加健壮和可维护的平台,从而更好地支持未来的发展。
作者将原型比作一个 “鲁布·戈德堡机械”,它虽然看起来很酷炫,但却非常脆弱,一旦发生任何变化,就很容易崩溃。而平台则更加稳定和可靠,能够更好地应对各种突发情况。
作者认为,重建的价值不仅仅在于构建出一个更加健壮的平台,更在于学习和成长。通过重建,可以更加深入地理解项目的需求,并学习到新的技术和工具。这些经验和知识将会在未来的项目中发挥重要的作用。
从 “伟大重建” 中获得的经验教训
作者从 “伟大重建” 中获得了许多宝贵的经验教训:
- 领域模型优先,集成次之:首先对问题空间进行建模,而不是工具。
- 双环境开发:确保代码在不同的环境中都能够正常运行。
- 意图驱动架构:用户的需求比技术实现的便利性更重要。
- 持续学习:不断地学习新的技术和工具。
- 工具很重要:但在痛苦地经历过没有它们的阶段之后,你才能体会到它们的价值。
结语:慢即是快
在快速变化的大模型领域,快速迭代固然重要,但有时慢下来,认真地思考和设计,才能构建出真正有价值的系统。正如作者所说:“有时候最快的路,就是慢下来,把事情做对。三思而后行。慢即是快。” 这次 “伟大重建” 不仅是一个项目上的重启,更是一次深刻的学习之旅,为未来的大模型应用开发奠定了坚实的基础。