AI时代的软件开发:提示驱动开发
神译局是36氪旗下编译团队,关注科技、商业、职场、生活等领域,重点介绍国外的新技术、新观点、新风向。
编者按:大模型的文生文能力正在引发软件开发的范式转移,下一代的软件开发将由提示驱动,开发者不会消失,但沟通能力与战略思维会变得更加重要。文章来自编译。
我在感恩节期间开发了一个应用,很快就收获了1000名用户,并在圣诞节前实现盈利。
但最疯狂的是……我本人一行代码都没写。那都是我一步步指导大模型(LLM)写的,我们一起开发了一个全栈的 NodeJS / React 应用,这个应用带有 PostgreSQL 数据库,实现了与 Stripe的 集成,托管在 Heroku 上,用 SendGrid 发送电子邮件,用CloudFlare进行 DNS 处理。
此后我一直都在思考提示驱动开发的事情,琢磨着该怎么做才好,思考其对行业发展的意义。以下就是我的想法。
概要
- 什么是提示驱动开发(PDD)?
- 工具与工作流
- 成功的心智模式
- 行业影响
什么是提示驱动开发(PDD)?
从本质上讲,PDD 是一种开发工作流程,开发人员主要促使 LLM 生成所有必要的代码。让我们将其与传统开发进行对比。
PDD本质上是这么一种开发范式:开发者主要通过向LLM提供提示(prompt)来生成所有的必要代码。我们来跟传统开发模式对比一下。
传统软件开发的高阶流程通常是这样的:
- 开发者收到需求
- 开发人员在 IDE 本地迭代代码变更
- 开发者提交代码变更以供审查
- 另一位开发者审查并合并变更
传统开发的高阶流程
相比之下,PDD 有几个关键区别。首先,LLM会参与并编写主要(甚至全部)代码。其次,开发者专注于提示工程和代码审查,而不是自己编写代码。除此之外,其余流程大致是相同的。
高阶提示驱动开发流程:
- 开发者收到需求
- 开发者将需求分解为一系列提示*
- LLM 针对每个提示生成代码
- 开发者审查 LLM 生成的代码*
- 开发者提交所有变更以供审核
- 另一位开发者审查并合并变更
提示驱动开发高阶流程
*我想强调几个步骤。
- “将需求分解为提示”是一项新技能,需要学习和练习。我会在“思维模式”章节讨论怎么做。
- “审查 LLM 生成的代码”至关重要。你不会不假思索就合并进人工编写的代码,所以对 LLM 编写的代码也别这样做!
给谁用?
简而言之,每个人。
我曾经跟一位资深工程师交流过,他们正在用这种做法开发极具创新性的技术。我的一位朋友甚至用PDD从头开始做出了自己的编程语言。我也接触过一些非技术人员,这些人能开发出功能完备的原型,甚至有人还部署到生产环境并吸引到用户了。LLM最惊人的特性之一就是大幅降低了编程门槛,让零技术经验的人也能生成可运行的代码。
但我认为有类人群特别适合这种技术:那就是具有技术背景但转型从事产品、战略或设计工作的人。这当中包括技术产品经理、技术设计师以及工程经理等。由于我的个人背景与此类似(开发者→用户体验→产品经理),所以我对PDD的热情可能有些偏颇。
这种技能组合之所以能够从 PDD 获益,是因为这些人可能对软件工作原理具备了架构上的理解,但对编程语法却不太熟悉。由于 LLM 可以帮忙处理语法,因此语法不熟练不再是制约因素。通过 PDD,他们可以高效、无拘束地进行开发。
工具和工作流
基础模型
以下是可编写代码的一些 LLM。随着新模型不断被训练并部署到市场上,这个领域会非常活跃,充满活力。就 PDD 而言,需关注:
- 我通常用 Claude 3.5 Sonnet、GPT 4o 和 GPT o1
- 对各种模型的编码能力进行测试的基准测试有很多。选择模型时请参考最新的基准测试
这些基准数据可能已过时
聊天工具
ChatGPT,Claude,Gemini
常规聊天工具可作为 PDD 的一个选项。就我个人而言,我更喜欢大模型原生IDE,但我访谈过的几位开发者都用了聊天工具,因为比较简单。因为要给 LLM 提供一切适当的上下文,然后还要将输出粘贴到代码库中,这种做法的人工操作更多,但用起来是没问题的。
其工作流如下:
- 给LLM写提示
- 从代码库中复制所有必要的代码上下文,并将其作为提示的一部分
- 复制 LLM 生成的代码
- 将代码输出粘贴到代码库中的正确位置
虽然我的主要工作流不是这样,但PDD过程中也会偶尔使用。如果要尝试这种方式,强烈推荐使用Claude Projects或ChatGPT Projects功能,你可用来组织文件和聊天记录,极大提升上下文管理效率。
ChatGPT Project
LLM 原生 IDE
Cursor、Windsurf、Bolt、v0、 Replit 工具
这些工具彻底改变了游戏规则。它们将LLM集成到IDE中,相比聊天模式有两大优势:
- 为 LLM 提供代码上下文非常容易
- LLM 能够直接在 IDE 中编辑你的文件
这显著加快了代码生成反馈循环,无需反复复制粘贴到IDE内。
此类工具层出不穷,我个人用的是Cursor。说实话,这些工具大同小异:Replit可自动部署代码库,Windsurf与GitHub集成等,但核心价值都在于简化PDD的用户体验。
我强烈建议选择个 LLM原生的 IDE 然后坚持用下去。在各种选项之间切换的成本非常低。关键要培养如何编写出色提示的技能,而不是记住特定 IDE 的所有功能。所以选好一个,坚持用下去,聚焦在提示上。
Cursor,注意右侧的“Composer”窗口
我的工作流
我在工作流结合了 ChatGPT 与 Cursor 的使用。大致分解如下:
- 80%时间与Cursor交互:通过Composer功能向Claude发送提示,审查接受/拒绝修改。重复此过程。如有错误,我们会一起解决。
- 15%时间把GPT4o当作技术思考伙伴:处理复杂变更或新功能开发时,要求其提供技术方案并创建任务工单,以此作为提示输入给Cursor,然后进入Cursor工作流
- 5% 的时间使用GPTo1进行深度规划:启动新项目或实施系列复杂变更时,GPTo1可生成更高质量、更长篇幅的输出(例如一次性生成十余个任务工单)
我对 PDD 工具使用的大致分布情况
成功的心智模式
更好的提示 == LLM 生成更好的代码。垃圾进,垃圾出,对吧?每个人的目标、环境和技能组合都不一样。所以这里不会告诉你究竟该怎么写提示,而是会提供一些思维模式,这些思维模式可提高提示质量,进而提高生成代码的质量。
LLM 是刚加入本项目的初级开发者
LLM 拥有令人难以置信的编码能力。但是,如果你是 PDD 新手,我强烈建议你先想到这一点。告诉自己,LLM 是刚接触该项目的初级开发者。在编写提示时,要考虑到如何指导这类人。错误示范:“给我写个可以让朋友们发布照片并互相关注的app。”这样绝对行不通。
别这样,你得给出很小、非常具体的变更。你可能还要提供各种相关的文件,并说明关于产品是什么以及别人会怎么用的一大堆信息。这是思考如何给LLM 提示来生成代码的正确方法。这样不仅会生成更好的结果,还会迫使你更好地给出提示,你的关注点应该在这里。
更好的提示 == LLM 生成更好的代码。垃圾进,垃圾出,对吧?
表现得像自己就是一整支产品团队一样
给 LLM 提供的东西不用局限在技术背景上。不妨设想自己是产品经理、设计师、开发主管以及 QA 工程师,你可以就工作范围提供意见。你要尽可能地模仿角色,但也不要用力过度。
除了技术指导之外,你还应提供:
- 用户故事
- 业务目标
- UI 描述
- UX 流程描述
- 测试计划
把这些类型的附注添加到提示中可以给 LLM 提供更全面的上下文,也能提高其实现预期目标的能力。
上下文、具体性及范围
这是调整提示时需要考虑的三个变量。这些变量跟代码质量的关系很简单。为了提高 LLM 生成代码的质量,你需要:
- 增加提供的上下文的信息量
- 提高请求的具体性
- 缩小变更范围
为了获得最佳输出,你需要上下文丰富、特别具体,范围很窄
以下是我对这些术语的定义……
上下文是提示提供的代码库片段或文件。
- 上下文不充分:“在后端进行这些变更”
- 上下文丰富:“调整backend/routes/user.js 文件的getMarker函数。文件在这儿,它一般会进行交互的另外 3 个文件在这儿... ...”
具体性是指请求定义得有多明确、多精确。
- 不够具体:“当用户单击提交时,将其提交添加到 feed 中。”
- 非常具体:“当用户单击提交时,调用saveSubmission端点将提交存储到数据库内。保存后,自动调用loadFeed函数刷新前端的 feed,让用户能够立即看到自己的提交,而无需重新加载页面。”
范围是要求 LLM 一次性变更多少东西。
范围很广:“添加一个设置页面,用户可以在该页面管理和更新账号。”
范围很窄:“在设置页面上添加一个切换按钮,用户可以将自己的帐户设置为私密或公开。”
请记住,要想得到最佳输出,上下文得丰富、请求要足够具体,范围不要太宽。是,写成这样需要时间,但写代码也一样。提示成什么样你得根据自己的技能组合来权衡。
LLM 写代码也会有 bug(就像人类一样)
知道不,LLM 并不完美。我和曾经尝试过 PDD 的人聊过,“因为AI产生了一个 bug,所以我就放弃了。”我建议你不要期望过高,只需知道 LLM 会时不时产生 bug 就行了。这是正常开发过程的一部分,那怕是人类写代码也会出错。
这也是为什么在接受 LLM 代码之前对其进行审查和测试如此重要的原因。不要盲目地合并它所做的变更。人写的代码你不会无脑合并,那为什么 LLM 写的代码你就会无脑合并呢?如果你遇到bug的概率超过 5%,请使用上述建议重新审视你的提示技术。
人写的代码你不会无脑合并,那为什么 LLM 写的代码你就会无脑合并呢?
行业影响
门槛提高了
常见误区认为LLM将取代开发者。更准确的认知是:对所有从业来说门槛提高了。
对于技术人员来说,熟练掌握一门编程语言已不再足够。因为这项技能可以 100% 外包给 LLM。现在,开发者需要对所用的代码库有深入的架构理解,并且需要具备强大的写作技能,以便能够准确地向 LLM 表达所需做出的变更。
对于非技术人员来说,能够给开发团队编写需求已经不够了。相反,他们还得会开发可在本地运行的功能齐全的原型。为此,他们需要具备足够的技术知识,好向 LLM 描述所需的内容,还得知道如何启动本地 Web 服务器。
低阶工作不会消失,但工作性质会改变
最近有很多关于入门级(甚至中级)开发者角色被AI取代的讨论。我知道他们想说什么,但我认为那是不对的。其实他们是想说LLM 现在已经能做我们目前认为需要入门级或中级开发者才能完成的工作了。这一点我大抵是同意的。但认为这些角色会消失的想法是只见树木不见森林。
消灭初级和中级岗位会导致开发者的人才断代。现在那些高级开发者总有一天会退休的,而由于没有人才储备,我们没法用足够快的速度去替换他们。
中级开发者的定义肯定会发生变化。他们需要完成的任务类型会变得更加复杂。他们可能会使用 LLM 来生成大量代码。而且,他们还需要对产品有深入的架构理解,并具备强大的书面沟通能力。
软件开发的学法不一样了
2010 年代我刚开始学习软件开发时,概念学习的顺序大致是像下面这样的:
- 基本概念(变量、数据结构等)
- 语言语法和特性(我学过 C++、Java、LISP、Ruby、JavaScript)
- 协作(Git)
- 架构模式(前端/后端、MVC)
- 之后我转行去做产品了
我预计现在对于学软件的人来说会发生一些变化了。首先,他们不会像我一样去学 5 种编程语言。没有理由去做这样的事情了。他们可能会学习一种语言,然后靠 LLM 去学习其他语言和框架。其次,他们会学习架构模式的时间会提前,可能学习基本概念的同时就开始学了。这是因为你必须掌握这些知识才能编写出高质量的提示。第三,他们从第一天开始就会学习使用 LLM,逐步练就非常强大的书面沟通技巧,从而写出高质量的提示。
整个过程大概是这样的:
- 学基本概念+架构模式
- 学一种编程语言 + 提示写作(语言可能是 python 或Javascript ,会通过提示来学习)
- 合作
- ......等等
小一点、新一点的公司会率先采用提示驱动开发
改变很难,组织惯性会妨碍成熟的大型科技公司大规模采用这些做法。他们需要更长的时间才能共同建立起对 LLM 代码质量的信任感,才能理解提示质量才是更重要的因素,才不会感到受到 LLM 的威胁,并最终接受这些工具。
小一点、新一点的公司有充分的理由从第一天开始就成为 AI 原生企业,没有理由不这样做。他们没有历史负担,很快就能学会如何将其融入自己的独特文化,并以业内前所未有的速度交付产品。这种情况正在上演, Headstart等公司就是典范。
结论
提示驱动开发 (PDD) 是一场软件开发变革,强调的是对架构的理解而非语法流畅。通过利用 LLM,开发者和非开发者都可以更快、更高效地开发出产品。不过,LLM 生成代码的质量在很大程度上要取决于提示够不够清晰,够不够具体,因此,沟通能力与战略思维至关重要。
译者:boxi。