AI编程实战:从飞书PRD到代码生成的高效工作流设计
1. 从文档到代码:一个AI辅助开发者的日常
如果你和我一样,是个经常在飞书里写产品需求文档(PRD),然后转头就要去编辑器里敲代码的开发者,那你肯定也幻想过:要是PRD能自己变成代码该多好。这听起来像是天方夜谭,但过去一年,我通过将飞书、AI编程助手(比如Cursor、Codex)和一些自动化工具串联起来,还真摸索出了一套能极大提升效率的“AI编程workflow”。它不是一个全自动的“许愿机”,而是一个将需求澄清、原型设计、代码生成和审查验证流程化的“增强回路”。核心价值不在于替代思考,而在于将开发者从重复、琐碎的信息搬运和基础代码编写中解放出来,让你能更专注于架构设计和核心逻辑。这套流程特别适合独立开发者、创业团队的小步快跑,或者任何需要快速将想法落地的场景。
简单来说,我的工作流始于飞书文档,终于可运行的代码仓库,中间由AI作为核心的“翻译官”和“初级工程师”。接下来,我会拆解这个工作流的每一个环节,包括工具选型背后的“为什么”、具体的操作步骤、以及我踩过无数坑才总结出的“避坑指南”。你会发现,真正提升效率的,往往不是某个单一的“神器”,而是一套贴合你习惯的、顺畅的协作机制。
2. 工作流基石:为什么是飞书+AI编程助手?
在构建任何自动化流程前,工具选型是地基。我选择“飞书”作为需求起点,“AI编程助手”作为核心引擎,是经过深思熟虑和反复对比的,绝非随意跟风。
2.1 飞书文档:不止于PRD的“活”知识库
很多人把飞书文档仅仅当作一个在线Word来用,那就大材小用了。在我的工作流里,飞书文档扮演着唯一可信源的角色。
首先,飞书文档强大的多维表格、流程图、思维导图嵌入能力,能让PRD变得极其结构化。我不再写大段的、模糊的自然语言描述,而是用表格定义API接口字段,用流程图描述核心业务流程,用思维导图梳理功能模块。这种结构化的表达,本身就是对需求的第一次“编译”,它极大地消除了歧义,也为后续AI的理解提供了高质量的、格式清晰的输入。
其次,飞书的“云文档”属性至关重要。无论是产品经理的修改,还是我自己补充的技术设计思考,所有迭代都实时同步、版本清晰。我不需要再处理“PRD_v1.2_final_真的最终版.docx”这种令人头疼的文件。更重要的是,飞书开放平台提供了完善的API,这意味着文档内容可以被程序化地读取和加工,这是实现自动化的前提。
最后,飞书与代码仓库(如GitHub)、项目管理工具(如Jira)的集成能力,让信息流转成为可能。虽然在我的核心工作流中不直接依赖这些集成,但它们为工作流的扩展提供了无限可能。
2.2 AI编程助手:从Cursor到Codex的选型逻辑
AI编程助手是工作流的核心引擎。市面上选择很多,我主要深度使用过Cursor和基于OpenAI Codex的各类工具(包括早期的GitHub Copilot)。我的选择逻辑基于以下几个维度:
1. 代码生成与理解的“对话感”Cursor在这方面做得非常出色。它不仅仅是一个代码补全工具,更是一个可以针对整个项目上下文进行“对话”的编程伙伴。你可以直接打开一个飞书文档链接(或粘贴文档内容),然后对它说:“根据这个PRD,为UserService实现一个用户注册方法,需要密码加盐哈希,并处理用户名重复的情况。” Cursor能够结合你已有的项目代码,生成非常贴合上下文的代码片段,甚至附带简要的注释。这种基于项目级上下文的“对话式开发”,是它区别于传统补全工具的核心优势。
2. 对项目全局的感知能力这也是我偏爱Cursor的原因之一。它能分析你打开的所有项目文件,在生成代码、回答问题时,会综合考虑项目结构、已有的类定义、依赖库等信息。比如你问“怎么在这里集成Redis缓存?”,它会参考你项目里已有的pom.xml或package.json,给出适配你当前技术栈的代码建议,而不是通用的模板代码。
3. Codex类工具:特定场景的利刃以OpenAI Codex为模型的工具(包括某些定制化部署的版本),在代码生成的“原始能力”上非常强大。对于一些非常明确、模式固定的代码块生成,比如根据JSON Schema生成对应的数据模型类(POJO/Entity),或者根据SQL语句生成CRUD操作代码,它们速度极快且准确率高。我的工作流中,有时会用一些调用Codex API的脚本工具来处理这类高度结构化的转换任务。
选型结论:我的主力是Cursor,因为它提供了最接近“与资深同事结对编程”的体验。而对于一些批量的、模板化的代码生成任务,我会准备一些调用Codex API的脚本作为补充。这并不是说Copilot不好,而是在深度项目理解和交互式对话这个特定场景下,Cursor的形态更贴合我的需求。
注意:AI编程助手会消耗Token,产生费用。Cursor有免费额度,但对于重度使用,需要考虑订阅成本。自行调用OpenAI API则更需要精细控制Token用量,避免意外账单。
3. 核心工作流四步法:从PRD到Pull Request
我的工作流可以概括为四个步骤:需求结构化、AI辅助设计、迭代式开发、审查与集成。每一步都离不开人与AI的协作。
3.1 第一步:需求结构化与澄清
这是所有后续工作的基础,也是最容易被忽视的一步。AI不是神,给它一堆模糊、矛盾的需求,它只能生成一堆模糊、矛盾的代码。
操作流程:
- 撰写PRD:在飞书中,使用“用户故事”或“用例”的格式描述功能。例如:“作为一个用户,我希望能够通过邮箱和密码注册账号,以便使用系统服务。” 紧接着,使用多维表格来定义“用户”对象的字段:
username(字符串,唯一),email(字符串,唯一),password_hash(字符串)等。 - 绘制流程图:使用飞书自带的流程图工具,画出核心业务的时序图或活动图。比如“用户注册流程图”,包括前端提交、后端验证、查重、密码加密、数据入库、发送验证邮件等节点。这个图形化的表达,能帮你和AI理清逻辑脉络。
- 定义API契约:在文档中用一个独立的章节,使用类似OpenAPI的格式(即使不写YAML,也用清晰的列表)定义接口。包括端点URL、HTTP方法、请求体格式(JSON示例)、响应体格式、可能的错误码。
- 与AI进行“需求评审”:将这份结构化的PRD内容(或分享文档链接)在Cursor中打开,然后对它进行提问。我会问:“请总结一下这个PRD要实现的三个核心功能点。” “这个注册流程中,你认为有哪些边界情况需要处理?(比如邮箱格式、密码强度、网络超时)” AI的回答能帮你发现自己遗漏的细节。这个过程本质上是一个强制性的自我澄清,能暴露出PRD中不明确的地方。
避坑经验:
- 切忌大段粘贴:不要将几十页的PRD直接扔给AI。先自己做好摘要和结构化,或者分模块、分功能地与之交互。
- 明确专业术语:如果你的项目里有“租户”、“SKU”、“溯源链”等特定领域术语,先在文档里给出简短定义,并在与AI对话时再次明确,避免它用通用含义来理解。
- 设定技术栈上下文:在第一次就新项目与Cursor对话时,先用一句话明确技术栈:“本项目是一个基于Spring Boot 3的Java后端项目,使用MySQL数据库,MyBatis-Plus作为ORM框架。” 这能确保后续生成的代码在技术选型上是正确的。
3.2 第二步:AI辅助设计与原型生成
需求清晰后,并不直接开始写业务代码,而是先进行高层设计和生成基础代码结构。
操作流程:
- 生成系统设计:在Cursor中,基于PRD提问:“基于上述需求,请为一个微服务架构的后台管理系统设计用户模块的代码目录结构(package structure),并说明每个目录的职责。” AI会给出类似
com.example.user.controller,.service,.mapper,.entity,.dto等的建议,你可以在此基础上调整。 - 创建基础文件:根据AI建议的目录结构,在项目中手动创建这些空的包和文件。然后,可以开始让AI填充内容。
- 生成数据模型(Entity):将PRD中定义字段的多维表格内容复制给Cursor,并指令:“根据以下字段定义,生成对应的Java Entity类,使用Lombok注解,并包含JPA注解(
@Entity,@Table)。” 它就能快速生成近乎完美的User.java。 - 生成API接口骨架(Controller/DTO):将API契约部分复制给Cursor,指令:“根据这个API定义,生成Spring Boot的Controller类和对应的请求/响应DTO类。” AI会生成带有
@RestController,@PostMapping等注解的骨架代码,以及UserRegisterRequest、UserResponse等DTO类。 - 生成数据库访问层(Mapper/Repository):指令:“为
User实体生成一个MyBatis-Plus的Mapper接口。” 这通常是一个简单的接口,继承自BaseMapper<User>。
至此,一个包含Controller、Service接口、Entity、DTO、Mapper的空项目骨架就搭建好了。整个过程可能只需要十几分钟,而手动创建这些文件并确保注解正确,可能需要更长时间且容易出错。
3.3 第三步:迭代式开发与“对话调试”
这是工作流的核心循环,也是最体现“增强”而非“替代”的环节。AI负责生成代码草案和提供建议,我负责决策、修改和整合。
操作流程:
- 实现Service层逻辑:打开之前生成的
UserService接口,在Cursor中定位到需要实现的方法,然后使用Cmd+K(Mac)或Ctrl+K(Windows)打开Chat面板,输入具体的实现要求:“请实现这个register方法,需要检查邮箱和用户名是否已存在,密码使用BCrypt加密,将用户信息保存到数据库,并返回用户ID。注入UserMapper和PasswordEncoder。” AI会生成完整的Service方法代码。 - 代码审查与修改:绝对不要直接接受AI生成的代码。把它当作一个初级工程师提交的代码,进行仔细审查。我会检查:逻辑是否正确(特别是边界条件)、异常处理是否完备(是否捕获了可能的数据层异常)、性能是否有问题(比如在循环里查询数据库)、是否符合项目编码规范(比如日志打印格式、常量定义)。发现问题后,可以直接在Chat里指出:“这里密码加密前应该先做非空校验。”或者“重复性检查应该放在一个事务里,避免并发注册问题。” AI会根据你的反馈修改代码。
- “对话调试”与逻辑补全:当遇到复杂逻辑时,可以和AI进行多轮对话。例如:“我需要在用户注册成功后,异步发送一个欢迎邮件。请帮我修改代码,引入一个
MailService,并使用Spring的@Async实现异步发送。同时,需要考虑邮件发送失败后的补偿机制(比如记录日志,稍后重试)。” AI不仅能修改代码,还能解释它为什么这样改,这本身就是一个学习过程。 - 生成单元测试:这是AI非常擅长的领域。在写完一个Service方法后,可以指令:“为这个
UserService.register方法生成JUnit 5的单元测试,使用Mockito模拟UserMapper和PasswordEncoder,并覆盖成功、用户名重复、邮箱重复等场景。” AI生成的测试用例通常结构良好,能覆盖主要分支,你只需要稍作调整即可。
核心心法:在这个阶段,我的角色是架构师和审查者,AI的角色是快速的执行者和想法的碰撞者。我提出“做什么”和“做到什么标准”,AI提供“怎么做”的多个选项,我来选择和优化。
3.4 第四步:自动化集成与知识沉淀
当功能开发完成后,工作流并未结束,还需要将代码整合到团队协作流程中,并沉淀经验。
操作流程:
- 运行与测试:在本地运行生成的单元测试和集成测试,确保功能正常。AI生成的代码有时会遗漏一些Spring上下文依赖或配置,需要手动补全(比如在测试类上加
@SpringBootTest)。 - 提交代码:使用Git命令行或IDE工具提交代码。提交信息(Commit Message)也可以让AI帮忙润色,使其更规范。
- (可选)自动化流水线:如果团队有CI/CD,这一步是自动的。但我个人会配置一个简单的Git钩子(pre-commit),在提交前自动运行代码格式化工具(如Spotless)和静态检查(如SonarLint),确保代码风格统一。
- 知识沉淀回飞书:这是一个非常重要的闭环。在飞书的PRD文档末尾,我会新增一个“技术实现纪要”章节。记录下:
- 本次开发中,AI生成的哪些代码模式特别好用(例如,一种优雅的异常处理方式)。
- 遇到了哪些典型的“AI坑”(例如,AI可能会生成过时的API用法)。
- 针对某个复杂逻辑,与AI进行了几轮对话才最终厘清。
- 本次开发中手动修改最多的部分是哪里(这往往是业务逻辑最复杂或AI最不擅长的部分)。 这份纪要,会成为未来类似需求开发的宝贵经验,也能帮助团队其他成员更快上手这套工作流。
4. 实战避坑:那些只有踩过才知道的“坑”
这套工作流听起来很美好,但在实际落地中,我遇到了无数挑战。下面分享几个最具代表性的“坑”及其解决方案。
4.1 坑一:AI的“幻觉”与逻辑缺失
AI,特别是大型语言模型,存在“幻觉”问题,即它会生成看似合理但完全错误或不符合事实的代码。
典型案例:让AI生成一个“根据用户ID分页查询订单”的SQL语句。它可能会生成语法完全正确的SQL,但却使用了项目中不存在的表名或字段名。或者,在生成Java代码时,使用了一个不存在的方法或类,而且这个方法的命名看起来非常“合理”。
我的应对策略:
- 永远保持怀疑:对AI生成的每一行代码,尤其是涉及核心逻辑、第三方库API调用、数据库操作的部分,必须进行验证。不要假设它是正确的。
- 要求AI提供解释或出处:在Cursor中,可以追问:“你生成的这个
@Cacheable注解的keyGenerator参数,具体指向哪个Bean?请在我现有的项目代码中找出来,或者告诉我需要如何配置。” 如果AI无法在上下文中找到,它通常会承认并给出更正建议。 - 小步快跑,即时验证:不要让它一次性生成一个几百行的复杂类。应该分模块、分方法地生成,生成一个方法,就立刻在IDE里检查是否有编译错误,逻辑是否符合预期。
- 建立“安全清单”:对于你已知的、AI容易出错的点(比如特定的日期处理、复杂的多线程同步),在开发时格外警惕,甚至预先写好注释或TODO,提醒自己这里需要手动重点检查。
4.2 坑二:上下文丢失与“失忆”
AI工具有上下文窗口限制。在开发一个大型功能时,你可能会和AI进行长达几十轮对话。有时它会“忘记”很早之前约定的技术栈、项目结构或业务规则。
典型案例:在讨论了半小时如何用Redis缓存用户会话后,你让它生成一个工具类,它可能会忽略之前约定的Jackson序列化方式,而使用默认的Java序列化,导致缓存读取失败。
我的应对策略:
- 重要的上下文反复重申:在开始一个新的、相对独立的子任务时,即使在同一对话中,也重新用一两句话声明核心前提。例如:“我们继续在之前的Spring Boot用户项目里工作,现在需要实现一个登录日志功能,请记住我们使用MySQL和MyBatis-Plus。”
- 使用“项目知识库”功能:像Cursor允许你上传项目文件作为永久上下文。将项目的关键配置文件(如
application.yml、pom.xml)、核心的架构说明文档上传,能有效减少“失忆”。 - 分会话进行:对于逻辑上相对独立的大模块,可以开启新的Chat会话。在新的会话中,首先通过“/”命令将相关文件设置为上下文,然后开始工作。这样能保证该会话内的上下文纯净且充足。
4.3 坑三:代码风格与项目规范冲突
AI基于海量公开代码训练,其默认代码风格可能与你所在团队的规范冲突。
典型案例:AI可能生成使用java.util.Date的代码,而你的团队规范要求必须使用java.time包下的新API。或者,AI生成的日志语句是System.out.println,而你们要求用SLF4J。
我的应对策略:
- 在指令中明确规范:在第一次对话或生成重要代码前,明确给出规范。例如:“请使用
java.time.LocalDateTime处理时间。” “所有日志请使用log.info(),并确保log是org.slf4j.Logger的实例。” - 利用IDE的格式化工具:在代码生成后,统一使用项目配置的代码格式化工具(如IntelliJ IDEA的
Reformat Code,或Spotless、Prettier)进行格式化,可以快速解决缩进、空格、换行等基础风格问题。 - 创建代码模板或片段:对于项目中反复出现的、有固定模式的代码(如Controller的通用响应包装、统一异常处理),可以自己写好模板,或者让AI学习这些模板。在Cursor中,你可以选中一段符合规范的代码,然后告诉AI:“以后生成类似功能的代码时,请参考这种风格和模式。”
4.4 坑四:对业务复杂性的理解不足
AI擅长处理模式化的、技术性的任务,但对于深度的、充满例外和特殊规则的业务逻辑,它往往力不从心。
典型案例:一个电商的优惠券计算规则,可能包含“商品品类限制”、“用户等级叠加”、“限时折扣并行计算”、“满减门槛”等一系列复杂且互斥的规则。AI很难一次性理解所有这些规则并生成正确的代码。
我的应对策略:
- 人类负责业务规则拆解:这是必须由人来完成的工作。你需要将复杂的业务规则,拆解成一个个清晰的、可执行的步骤或决策树。这个拆解过程本身也是对业务的再理解。
- 让AI实现“零件”:将拆解后的规则,变成一个个独立的方法或函数描述,让AI去实现这些“零件”。例如:“请写一个方法,输入商品ID列表,返回这些商品是否都属于‘电子产品’品类。” “请写一个方法,根据用户历史订单金额计算其当前等级。”
- 人类负责“组装”与“协调”:由你来编写主流程代码,调用这些由AI生成的“零件”方法,并处理它们之间的协调关系、异常传递和事务边界。业务复杂性的核心在于“组装逻辑”,这部分目前必须由人来掌控。
5. 进阶技巧:让工作流更智能高效
在熟练运用基础工作流后,可以通过一些进阶技巧,进一步释放生产力。
5.1 构建可复用的“提示词(Prompt)库”
你会发现,很多指令是重复的。比如“生成Spring Boot Entity”、“生成MyBatis-Plus Mapper”、“生成单元测试”。你可以将这些高频、有效的指令保存下来,形成一个你自己的“提示词库”。
我的做法:在飞书或任何笔记软件里,建立一个“AI开发提示词”文档。分类存放,例如:
- 项目初始化类:“初始化一个Spring Boot Web项目结构,包含controller, service, mapper, entity, dto包。”
- 代码生成类:“根据以下JSON示例,生成对应的Java DTO类,使用Lombok的
@Data注解。” - 代码审查类:“审查以下代码,找出可能的空指针异常、资源未关闭问题,并提供修改建议。”
- 调试求助类:“我遇到了一个
TransactionRollbackException,以下是相关代码和错误堆栈,请分析可能的原因。”
下次需要时,直接复制粘贴,稍作修改即可,省去了重新组织语言的时间。
5.2 利用飞书机器人实现轻度自动化
飞书开放平台能力强大,可以实现一些轻量级的自动化,将工作流串联得更紧密。
一个简单场景:自动将PRD中的API定义转换成Markdown格式的接口文档。
- 写一个简单的脚本(Python或Node.js),调用飞书API读取文档指定区块的内容。
- 使用正则表达式或解析库,提取出接口定义(URL, Method, Request, Response)。
- 调用OpenAI的Chat Completion API(使用
gpt-3.5-turbo即可),提示它:“将以下文本格式的API描述,转化为标准的Markdown表格形式。” 然后将结果写入一个api.md文件,或直接发布到团队的Wiki。 这个脚本可以配置在本地,通过一个命令触发,实现“一键生成接口文档草稿”。
更进阶的想法:你可以创建一个飞书机器人,当你在PRD文档中@这个机器人并输入“生成项目骨架”时,机器人自动读取文档,调用AI服务生成基础代码,并提交到一个新的Git分支,然后在飞书群里通知你。这需要更多的开发工作量,但代表了未来AI工作流的方向:无缝、自然的人机交互。
5.3 将AI作为“学习伙伴”与“技术雷达”
除了写代码,我经常用AI来快速学习新技术或评估技术选型。
学习新技术:当需要在项目中使用一个我不太熟悉的库(比如Apache Kafka),我会在Cursor中问:“用简单的例子解释一下Kafka的Producer和Consumer在Spring Boot中如何配置和使用。” 然后让它基于我当前的项目依赖,生成一个可运行的配置示例和代码片段。这比漫无目的地搜索文档要高效得多。
技术选型咨询:“为了做一个实时通知功能,在WebSocket和Server-Sent Events(SSE)之间,从实现复杂度、浏览器兼容性、消息模型的角度,我该如何选择?” AI能提供一个结构化的对比,帮助我快速做出初步判断。当然,最终决策还需要查阅官方文档和社区反馈,但AI提供了一个高质量的起点。
6. 心态调整:与AI协作的正确姿势
最后,也是最重要的一点,是开发者自身心态的转变。拥抱AI编程,不是交出控制权,而是升级你的武器库。
1. 从“编写者”到“设计者与审查者”你的核心价值不再是逐行敲出for循环和if-else语句,而是定义清晰的问题边界、设计优雅的架构、制定严谨的规范,并对最终产出的代码质量负全责。AI是强大的执行工具,但方向盘和刹车始终在你手里。
2. 接受“不完美”,追求“快速迭代”AI生成的代码很少是100%完美、可直接交付的。接受这一点,把第一版AI代码看作一个“可运行的草稿”。你的目标不是一次得到终极代码,而是快速得到一个可以讨论、可以测试、可以迭代的基础。开发周期从“长时间编写”变为“短时间生成+审查+修改”,整体迭代速度反而更快。
3. 培养“提问的能力”与AI协作的效率,极大程度上取决于你“提问”的质量。模糊的问题得到模糊的答案,精确的问题得到精确的代码。学会如何将复杂问题拆解成AI能理解的、结构化的指令,是一项新的核心技能。这本质上锻炼的是你的逻辑思维和沟通能力。
4. 保持学习,保持批判AI工具迭代速度极快,新的模型、新的功能层出不穷。需要保持关注和学习。同时,对AI生成的内容要保持技术人的批判性思维。它给出的方案不一定是最优解,它推荐的库可能有更现代的替代品。你的经验和判断力,是AI无法替代的护城河。
这套“从飞书PRD到代码实现”的AI编程工作流,已经深度融入我的日常开发。它没有让我失业,而是让我能更专注于那些真正需要创造力、深度思考和复杂决策的部分。它处理了那些我“知道怎么做,但懒得写”的模板代码,让我有更多时间去思考系统扩展性、业务瓶颈和用户体验。如果你也厌倦了在文档和代码间反复横跳,不妨尝试构建属于你自己的AI增强工作流,它很可能成为你职业生涯中一次重要的效率革命。
