资深开发者总结:这3招让AI开发产品的效率提升10倍(附案例)
2025年4月5日
本文作者:ManuelKiessling(25 年软件开发经验)。
核心观点:AI就像技术精湛但架构经验不足的开发者,需要正确引导才能发挥最大价值。开发人员资深开发者通过给出结构清晰的需求、用工具控制质量、预设文件结构和规则三大策略,能最大化利用AI编程工具。
文章以一个 Python 项目为例,展示了如何通过详细的需求文档和 AI 代理实现代码生成。
如果你在做AI开发,希望本文对你有所启发。
过去几个月里,我在个人和工作项目中尝试了AI编程工具。不论是对我个人还是团队而言,这些体验都异常积极。
我们不仅节省了时间,产出质量显著提升10倍。
有趣的是,我的这种体验与一些同行的反馈截然不同 —— 他们认为AI工具并不好用。
如今,我深信AI辅助开发能将我们的生产力提升到全新水平。
正因如此,我认为开发社区应当尽早拥抱这项技术:当然,需要正确的心态和合理的方法,就像对待任何工具和实践一样。
分享这些经验和最佳实践,是希望能推动AI在更广泛的软件开发社区中得到应用 —— 哪怕只是微小的进步。
AI编程的现状
从我的Twitter动态看,AI编程工具已在特定群体中引起轰动:非专业开发者正乐在其中地构建软件产品。
对他们来说,这些工具主要是赋能器,让他们敢于尝试在没有这种辅助的情况下可能永远不会考虑的项目。
很高兴能见证他们在这个过程中经历的挣扎与突破。
然而,这只是潜在用户中的一小部分,绝非唯一能从这些工具中获益的群体。
资深开发者的优势
尽管这一领域发展迅速,我目前的结论是:不仅资深开发者能从这项技术中获益 —— 他们实际上处于最有利的位置来驾驭它的力量。
关键在于:软件工程和项目管理方面的经验与积累的专业知识 —— 在AI时代看似过时的东西 —— 恰恰是有效利用这些工具的关键所在。
因为虽然我还没找到完美的比喻来描述这些基于LLM的编程助手在AI辅助编程中的角色。
但我目前认为它们是"在编程知识方面非常资深,但在你特定环境下的架构把控方面却十分初级。"
这意味着想让它们真正节省你大量工作,需要一些战略性的努力。
还有谁比资深软件工程师更适合做这种恰到好处的投入呢?
接下来会看到,尽管我们在使用尖端技术,但让我们能最有效地运用这种新能力的,恰恰是那些经过时间检验的传统实践和工具。
提升AI开发效率的三大方法
我总结了与AI协作编程时的三个关键要素:
- • 给出结构清晰的需求
- • 用工具控制质量
- • 预设文件结构和规则
在深入解析这些概念前,让我分享一些实际项目中使用AI的案例。
我会提供两类项目的示例:全新开发(绿地)项目和已有系统改造(棕地)项目。
对于这两类项目,我将重点展示AI几乎完全负责实现的案例。
虽然我有时也把AI当作"增强版自动补全"或仅用于一般性讨论的聊天伙伴,但本文聚焦于"真正的合作"——AI工具以代理模式运行并承担主要工作的场景。
为此,我目前选择的工具是Cursor。
Cursor提供了关键能力:直接编辑项目中所有需要修改的文件,并执行软件开发过程中的各种命令。
先来看两个案例。
案例1:平台问题监控
借助Cursor和Claude,结合下面将讨论的专业领域,我创建并完整实现了一个全新应用:平台问题监控。
该应用每小时连接到我们的ELK堆栈的Elasticsearch服务器,读取最新错误信息,然后发送格式精美的邮件,总结我们网络平台上的当前问题状态:
' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
平台问题监控邮件报告
在这个项目中,所有实现逻辑都由Cursor/Claude编写,我不需要手动干预代码。
这一点尤为值得注意,因为我其实不懂Python。
没错,凭借25年多的软件开发经验,如果必要,我可能能写出几行能用的Python代码——但我并不真正_了解_这门语言。我缺乏使用它的肌肉记忆和对其惯例与最佳实践的深入理解。
然而,我在软件架构、工程最佳实践、系统运维以及什么构成优秀软件项目方面的广泛理解,使开发过程变得异常顺畅。
关于代码质量的说明: HackerNews讨论中有人对这个Python项目示例的代码质量提出了合理批评(如日志配置、自定义配置解析、潜在的竞态条件等)。这是公平的,尤其考虑到我不是Python专家。
对这个特定的绿地项目,我的主要目标是在不熟悉的技术栈中快速构建可用的解决方案,在这种情况下,我优先考虑功能实现而非完美的惯用代码或长期可维护性。
这是一个实验,用来探索AI能在多大程度上弥合知识差距。在我擅长的领域内的棕地项目,或需要更高长期可维护性的项目中,人工审查、改进和测试过程(使用后面讨论的防护机制)自然会严格得多。
案例2:流程管理UI集成
虽然无法分享这个棕地项目的源代码,但它展示了另一个同样有价值的用例:
我有一个遗留的PHP/Symfony应用,其中包含一个"纯后端"的流程协调功能——包括服务类、枚举、Doctrine实体和通过cron运行的CLI命令。
虽然功能正常,但它缺少用户界面。
虽然不是刚需,但为这个流程协调功能提供基于网页的界面会非常有用:用户可以监控当前操作、调查失败情况并管理流程执行。
出于战略考虑,我希望将这个UI放在我们较新的应用中——那个代码结构更优、框架版本更新、测试能力更强、前端架构更出色且拥有完整设计规范的应用。
任务包括:
- • 通过HTTP API连接遗留系统和新系统
- • 实现系统间的数据传输
- • 创建符合我们设计系统的直观UI
- • 在共享的Symfony包中构建通用API客户端
**再一次,AI代理完成了整个功能的实现,我无需手动编写代码,**除了接下来会提到的文件规则。
给出结构清晰的需求
任何成功的AI编程会话都以全面的需求为基础。对于平台问题监控项目,我在开始前创建了这份文档:REQUIREMENTS.md。
这份371行的文档内容丰富,更重要的是,它遵循了清晰的层次结构:
- • 顶层:简明扼要的核心需求
- • 高层:使用场景和动机
- • 中层:流程和工作机制
- • 中层:架构、技术栈和约束
- • 底层:详细的流程步骤
底层部分将应用的运作分解为12个明确的步骤,每步都有清晰定义的输入、输出和副作用。
正如这种结构能有效指导人类开发者,它也为AI助手提供了交付优质结果所需的框架。
你可能会想,创建这样的文档需要不少工作。没错。但这是获得成功结果的必要投入。
在这方面,我最喜欢的软件开发格言之一是:"六周的开发可以轻松节省两小时的规划"
这种反讽突显了一个基本事实:实现阶段是弥补规划不足的最昂贵环节。
这就是为什么我总是鼓励团队与产品经理在白板前而非键盘前开始项目。这一原则同样适用于AI协作。
关于需求的另一个重要做法:我在"询问"模式下开始每个Cursor会话,要求AI:
- 1. 用自己的话概括需求
- 2. 制定行动计划
- 3. 提出澄清问题
只有完成这个验证步骤后,我才会切换到"代理"模式让它开始实现。
用工具控制质量
需求定义了目标,而用工具控制质量则确保我们走最直接的路径。
想想我们如何重视开发中的实时反馈系统。没什么比发布几周后才通过客户投诉发现缺少空值检查更糟糕的了。
在开发阶段捕获问题的静态分析工具无比宝贵——对AI代理同样如此。
这就是为什么我在开始AI会话前优先配置全面的质量工具。
我们Python项目的Makefile展示了这种方法:
- • 用black和isort格式化代码
- • 用ruff进行代码检查
- • 用mypy进行类型检查
- • 用bandit进行安全分析
- • 完整的测试套件
AI理解这些工具并能有效使用它们。当变更破坏了类型检查时,它会自动调整实现以保持合规。
我还确保AI能验证其工作的功能方面。对于API实现,我提供curl命令让它直接测试端点。观察AI使用并改进自己的代码是一种奇妙的体验。
预设文件结构和规则
虽然AI代理擅长创造性解决问题,但有时我们需要限制这种创造力,特别是在代码组织方面。这就是预设文件结构和规则的作用所在。
这个技术借鉴了动画工作室的工作流程,主要动画师创建关键帧——动画序列中的关键时刻——而初级动画师填充中间帧。这种方法在优化资源使用的同时保证了质量。
' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)
这就是为什么在与AI协作时,我会在开始编辑前在代码库中创建"框架文件"。例如,在棕地项目中,AI需要实现各种组件:
- • API端点
- • API客户端
- • 控制器类
- • Twig模板
等等。
我没有让AI决定文件位置和名称,也没有在提示中指定这些细节,而是创建了最小化的骨架文件:
对于控制器,我可能会包含少量必要信息,如路由名称:
这些骨架文件看似简单,却异常有效。它们为AI提供了关键上下文:
- • 文件组织方式
- • 命名空间结构
- • 命名规范
- • 代码模式
这种方法突显了AI时代仍然至关重要的另一项永恒实践:命名。
毕竟,Cursor这类工具核心的AI模型本质上是大语言模型——它们处理文本,而有意义、有意图的文本对卓越的编码体验至关重要。
真实案例
为了展示这些原则如何协同工作,我分享一个最近的项目,在其中应用了全部三个关键技术:给出结构清晰的需求、用工具控制质量和预设文件结构和规则。
任务类似于前面提到的棕地项目:实现一个UI仪表盘,展示我们平台的订阅合同信息。
以下是我用来启动这个项目的实际提示。阅读时注意它如何融合了给出结构清晰的需求、用工具控制质量和预设文件结构和规则这三个关键原则:
我需要你实现一个只读的基于网页的用户界面,以表格式概览的形式展示一些现有的数据库持久化数据。
相关数据称为"合同",涉及我们平台中保存的一些订阅合同信息。
该功能需要在包含多个代码库的单体仓库中实现。对于这个功能,四个代码库起着关键作用:
一个位于"backend-app"中的Symfony 5应用程序
一个位于"janus-christophorus"中的Symfony 7应用程序
一个被"janus-christophorus"使用的Symfony包,在"janus-shared-bundle"文件夹中
另一个被"janus-christophorus"使用的Symfony包,在"janus-webui-bundle"文件夹中
各代码库的角色如下:
backend-app目前持有相关数据,但不提供展示数据的用户界面
janus-christophorus将提供展示数据的用户界面
janus-shared-bundle托管(除其他内容外)由backend-app提供的API端点的API客户端实现;janus-christophorus使用这些客户端从backend-app拉取数据
janus-webui-bundle包含适用于janus-christophorus的UI的Tailwind设置、CSS和活动样式指南的Twig模板。
你的任务是:
在backend-app中实现所需的API端点,为janus-christophorus中的网页UI提供要显示的数据;这个API还将支持集成API的"演示模式"功能,该功能需要backend-app实现的测试工具层中的演示数据服务,以便在API客户端请求时提供虚假数据
实现一个匹配的API客户端,用于从这些新API端点读取数据
在janus-christophorus中实现一个展示层服务类,该类将使用新的API客户端
实现一个展示层控制器和Twig模板,使用展示服务显示通过API集成收集的信息
为准备这个实现,我已经在不同的代码库中创建了一些"空壳"文件。
考虑提供的合同、用户和工作提供者资料实体,以确定你需要从MariaDB数据库中提取(或通过演示服务模拟)哪些数据,以便为UI的API提供有用的信息。
此外,我还提供了其他文件,如样式指南、UI导航服务等文件。还请考虑我提供的其他现有功能的文件作为指南和灵感。
该功能的目标是提供一个UI,允许快速概览系统中可用的合同。
重要说明:你可以且应该使用多种工具来检查你自己的工作。
每个代码库都允许你运行质量工具,其中包含PHPStan检查和其他工具。你可以这样运行它们:
cd ~/Projects/website/backend-app && /usr/bin/env bash .dxcli/dxcli.sh quality
cd ~/Projects/website/janus-shared-bundle && /usr/bin/env bash .dxcli/dxcli.sh quality
cd ~/Projects/website/janus-christophorus && /usr/bin/env bash .dxcli/dxcli.sh quality
你可以像这样请求你将实现的API端点:
curl -H "Accept: application/json" -H "Content-Type: application/json" "http://127.0.0.1/_/janus-integration-api/membership/contracts/"
你可以像这样请求你将实现的网页UI:
curl http://127.0.0.1/_jc/mitgliedschaftsverwaltung/verträge/
请创建一个实现计划,并提出你需要回答的任何问题。
@Contract.php @User.php @Profile.php @JoboffererProfile.php @MembershipContractsApiController.php @DemoDataService.php @AbstractJanusIntegrationApiController.php @MainNavigationPresentationService.php @ContractsDashboardController.php @contracts_list.html.twig @ContractsDashboardPresentationService.php @services.yaml @AbstractBackendAppApiClient.php @BackendAppMembershipContractsApiClient.php @ContractApiDto.php @BackendAppMembershipContractsApiClientInterface.php @ContractsApiDto.php @NothingApiDto.php @janus-webui.css @living_styleguide.html.twig
结 论
通过提供结构清晰的需求,建立适当的防护机制(借助AI代理可以使用的工具),并使用文件级"关键帧",我们能够驾驭AI的力量,同时保持代码质量和架构完整性。
这些经过时间检验的实践,以及最重要的是,在这些实践中积累的人类经验,在AI辅助开发时代比以往任何时候都更为宝贵——远非过时。