admin管理员组

文章数量:1438930

我用AI+DDD开了一个包子铺

大家好呀,我是Louis,好久不见。

最近真的很忙,公众号断更了好久。我一直在攒一个大招,就是我的AI+DDD包子铺项目,忙活两个月总算有些眉目了。

今年年初DeepSeek横空出世,IT圈里突然开启了AI编程热潮,公司内也是自上而下让大家伙赶紧用上AI。我悄摸观察了一下,好几个项目都用上了AI。但怎么说呢,我觉得大部分人没有真正用好AI。 它写代码是很快,原来要3天干完的活,现在只要1天就写完了,然后再用额外的3天去看懂AI写了啥,再帮它修正。

我就觉得不!太!对!劲! 这不是AI的正确打开方式,于是乎我自己就干了一个小项目,来验证一下AI的能力。不干不知道,其实AI真的超出我的预期。但真要用好AI,还是得有一些技巧和方法论,碰巧我之前做过几年DDD,跟AI结合在一起,还产生了意想不到的火花

今天就把这几个月对AI+DDD的尝试给大家总结分享一下。

首先为什么是包子铺,而不是别的

  1. 这是个完整的业务项目,不大也不小,用来验证刚刚好(怎么还押上韵了)
  2. 这是贴近生活的例子,大家都好理解。可以认为包子铺就是个小型交易系统,有注册、登录、交易、积分管理、库存管理等功能
  3. 这不是公司的项目,就不涉及机密,方便我与大家做交流

AI编程效果咋样

先说结论:在写代码上,能帮我做80%的工作。基本上每个功能都只需微调甚至不调就可以直接用。编程效率有质的飞跃。

我把在写代码上省下来的时间用到了做更细致的系统设计和单元测试,也就是说在AI的帮助下,我可以更加专注于去做分析、设计和验证,coding是个琐碎的环节交给了AI。这已经很大程度上超出我的预期了。

此外,AI在写单元测试上也能发挥作用,这部分还在进一步探索。待后续有进展再与大家分享。

有没有源码

这个项目截止目前代码行数总共7800+行(含注释),还未全部完成,预计全部完成时总代码量在1.2w行左右。

包子铺代码行数统计

包子铺代码行数统计

包子铺代码

包子铺代码

不只代码,我还把完整的项目过程记录下来了。

包子铺部分文档

包子铺部分文档

我预计5月份这个包子铺系统就可以上线运行。到时再发出来给大家看看实际效果。

用AI编程的挑战点在哪

如前面所说,很多人在用AI,但用好的人不多。

从0到1的小游戏或者小工具之类的都不难,让AI写一个贪吃蛇小游戏,不到2分钟就写完了,还能跑起来玩一下。

但问题在于:怎样让AI写出准确符合预期可维护业务代码

我们的业务代码,不像贪吃蛇小游戏那样,写出来图个乐就完了,业务代码是要长期维护的,可维护性特别重要。

当前AI的“记忆力”(也就是上下文长度)是比较有限的,特别是在大型项目中,今天写过的代码,它明天就“忘”了。怎样让它记住所有的业务规则?怎样让它符合我的设计预期?怎样让它保持统一的编码风格和架构风格?

此外稍微有一些制约了AI编程的因素是:太贵了,大模型本来就不便宜(DeepSeek私有化部署也是要钱),AI编程工具如cursor还在大模型上套了一层,虽然方便但也更贵了。我简单算了一下,自己完成整个包子铺项目大约在AI工具上需要花费600美元,对于这样一个小项目来说显然无法接受,于是我不断优化和AI的协作机制,成功把费用降到了50美元。

因此,怎样节省算力,把AI编程能力用到刀刃上,也需要纳入考虑。

接下来讲讲我是怎么做的。

我的AI编程最佳实践

我在这个项目上前后投入了两个多月,都是用工作以外的业余时间完成,因此可投入时间比较有限,周期拉的很长。

为了能让AI理解我的意图,我花了巨大的精力进行需求分析和设计,时间大约占50%以上,又用了30%时间调教AI,教会它我想要一个什么样风格的架构和代码,真正用于编码的时间就很少了,只占20%,基本都是在微调。接下来我把代码写完后,还考虑教一下AI帮我写单元测试。

AI与人的关系

先聊一聊AI与人的关系,好多人在讨论说AI会不会代替程序员?程序员与AI是一种怎样的协作关系?我的看法是:

  • AI会替代人,会替代那些不懂得做系统设计的人。如果现在让我来组建一个团队,我会尽量选择设计能力强的人,coding能力已经不那么重要了,我验证了这部分工作确实可以被替代
  • 我与AI的关系?我把AI当做一个编程能力很强的实习生,但它完全不懂业务,也不懂怎样的代码叫好代码,更不懂什么是可维护性。我要做的是把它不懂的东西通过输入规则不断训练它,让它更听我的话,按我的指令来coding
  • 错误的关系:把AI当成什么都懂的专家。例如你只输入一个5000多字的需求文档,其他啥也不干,指望着让AI自动运行两个小时,就写出一个能用的支付系统,在现阶段是完全不可能的。

很多人犯的错误就是把AI当成专家,把自己当成小白,企图通过简单的自然语言对话与AI沟通,把大多数的思考和自由发挥空间给了AI,这样即便没什么编程基础,或许短期内能做一些意想不到的创意。但是代码的可维护性成了灾难,第一个版本交付以后,再就难以迭代升级。

另一种错误就是:自己先写出一个范例,然后告诉AI,其他的功能就照着这个模式抄。这种模式的问题在于:范例代码的质量高度,决定了AI编程的质量高度。如果恰好这个范例写得不够好,后面AI抄出来的代码也都是一个水平,万一有bug就更糟,要错就全错。其次,这种模式会带来很大的代码重复率,重复率上来了,可维护性就下降了。

让AI写好代码的四大要素

经过我两个多月的摸索,下面四个要素缺一不可

1. 大模型及其衍生工具

AI编程首要的当然是AI大模型,基本上需要了解每一个模型(或衍生工具)的特性和能力。

我自己尝试了Claude、GPT-4o、Deepseek等几个主流大模型,开发工具上有Windsurf、Cursor、Trae、Copilot。

我个人感觉,在编程能力上最强的模型还是Claude-3.7-sonnet,主要在跨文件上下文理解上比较出色。

开发工具Windsurf、Cursor平分秋色,就是贵。

Trae是免费的,但国内版只能用Deepseek,国际版可以用Claude模型但需要排队,一个指令排队长度在100-700不等,最长时间要等待2小时。

从效率上来说,我更愿意选择Windsurf、Cursor,在局部代码补全使用Copilot做为补充。

为了更省钱,我的接口定义、领域模型、数据模型、关键的一些通用值对象就用手写代码+Copilot补全,Copilot的局部补全能力还是挺强的,这部分也能省下不少时间。我更多会把涉及“业务逻辑”的部分交给Windsurf、Cursor。

2. 全局提示词

有一套完善的全局提示词,是让AI编码成功的关键。每个项目都需要根据自身的特性,形成一套完整的全局提示词(或更准确说是编程约束规则),这套提示词大约在3k-6k字左右,做为全局规则输入给大模型,让其“听命于我”(Windsurf、Cursor都支持输入这样的全局规则)

提示词里应该包含哪些东西?包括但不限于

  • 项目概述、技术栈等
  • 项目工程结构
  • 统一语言-最好有词汇表
  • 必要的领域知识
  • 模块划分
  • 代码规范要求

这里不应包括:xxx代码样例,请照着这个写!也不应包括过于具体的业务规则描述,这是详细设计要做的事情,不要放在全局提示词里。

这个全局的提示词最好单独一个文件,放在工程里面,在多人协同开发的时候,可以尽量让每个人生成的代码风格保持一致。

我的包子铺系统就有一套几千字的提示词模板,篇幅原因暂不做展示。但我可能在04.23会有一场直播,届时可以简单演示一下AI编程的实战。可以关注下周的直播公告。

3. 系统设计、架构设计方法论

如果说功能的正确性可以通过不断增加新的测试用例来保证,那代码的可维护性和架构合理性通过加什么来保证?增加code review的次数?

AI的编程风格,很大程度上就来自用它的人。程序员自己写的代码都不保证可维护性(不然那么多屎山代码是怎么来的?),通过code review就能识别AI的代码质量问题吗?

如我前面所说,将来程序员的工作,将会越来越多的从coding转向designing。而designing的结果将直接影响AI编程的质量、风格、可维护性,因此需要有一套良好的设计方法论来支撑,并且相较于传统的人工编程需要code review,AI编程则更多需要design review来保障设计质量

我在实践过程中,发现DDD(领域驱动设计)其实提供了一套非常好的,系统的设计思路。我认为DDD最大的作用,就是让设计有迹可循。以前程序员专注于写代码,有一部分人就做出了编程规范。DDD就是要解决设计这个阶段的规范问题。特别在与AI结合以后,更能发挥其巨大价值。以往被大家所诟病的,DDD层数好多、代码很啰嗦的问题,在引入AI编程以后都不存在了。

当然,DDD不是唯一的选项,特别是对于那些已经习惯了面向过程思维的程序员,要转变思维方式是比较困难的。只要能找到一套与DDD对等的设计理论,也可以同样用于AI编程。

而我只不过在DDD这个关卡已经跑通了,我将会在下一期文章做重点分享,聊一下DDD在包子铺项目中的实战应用

4. 开发框架

这里所说的开发框架,不是指Spring这样的框架,也不是RPC之类的技术框架。而是一个与DDD配套的业务代码框架。

这个框架应包含什么?

  • 一个工程脚手架
  • 统一的异常处理机制
  • 统一的领域事件定义(事件的实现可以不包含在内)
  • 统一的Repository规范
  • 统一的请求、响应格式
  • 一些常用的组件定义:缓存、鉴权、ID生成器、定时任务等(更多也是指定义规范,不一定要包含实现)
  • 框架应尽可能提供扩展能力,便于替换不同实现或进行增强

可以看到这个框架的作用是最大程度保证代码的全局风格统一、分层架构统一、组件接口统一,特别是在大型团队中,如果缺少这样一种框架约束,会导致AI生成代码时没有落脚点,容易自由发挥,导致维护成本剧增。

举一个例子,领域事件的定义,我设计了一套通用的接口,并且默认提供了一个基于DB的实现。包子铺系统在接入过程中,使用的是这一套标准接口,如果将来基于DB的实现不满足需求,可以自行替换成其他的实现(例如基于MQ)。业务代码始终感知到的是这一套接口定义,对于AI生成代码来说,也只需使用这一套接口,这样能做到最大程度的业务和技术代码解耦。

领域事件定义

领域事件定义

这个框架我正在开发中,且用在了包子铺项目中,命名为Sugar。我会在包子铺项目正式完结后,把这个框架开源。

框架的开发和业务代码开发模式又不同,需要考虑更多易用性、可扩展性,我在设计框架时使用到很多设计模式和代码抽象,这部分AI还无法很好胜任,因此框架代码更多是我自己手写。后续我会专门用一期分享一下开发框架过程中用到的设计模式

完整的AI+DDD研发生命周期

随便总结了一些,就写了这么多,这一期先写到这吧。下一期我专门分享一下AI+DDD编程实战、提示词编写技巧、怎样把设计图转化为代码。感兴趣欢迎订阅我的公众号

关于包子铺源码和文档

在AI编程时代,AI的上限取决于程序员自身的上限,我在包子铺项目中编写了一套可以提升上限的“武功秘籍”。

这一套“秘籍”含金量太高了,我留了一点小私心,实在没舍得全部免费公开。如果对这一套“秘籍”感兴趣的同学,可以通过下面的链接购买,今天我准备了50份限时折扣优惠,只限今天!

但是做包子铺项目的初衷,是想跟大家能更好交流一下编程实践。我依然不会偏离初衷,我会把实践中的一些成果逐步拿出来分享,这篇文章就是成果的一部分。我也会选择一个合适的时机把包子铺代码开源,但不是现在,几个月的辛苦虽然有了阶段性进展,但还不够完美,仍需打磨。感谢大家的理解和支持~~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-04-19,如有侵权请联系 cloudcommunity@tencent 删除设计ddd编程框架模型

本文标签: 我用AIDDD开了一个包子铺