
不是鸡汤,不是危言耸听。这是我最近半年在几个项目中真实遇到的情况。
开门见山:一个真实对比
去年年底,我带了一个实习生做一个电商后台的商品管理系统。
我用的传统方式: 产品说:做一个商品列表页面,能过滤、能排序、无限滚动、记录用户行为。
我打开VSCode:
梳理UI层级结构
设计Redux状态(或Zustand store)
写组件(大概200-300行)
写Hook处理数据获取和加载状态
加虚拟滚动优化
处理各种边界情况(网络错误、空状态等)
反复调试...
前后花了3-4天。
这个实习生用Prompt工程的方式: 直接问ChatGPT一个完整的需求描述(把产品文档复制进去,稍微整理一下),GPT给出了一个完整的React组件,包括所有逻辑。
他在我的代码基础上改了一些样式、调整了API接口,花了半天。
结果,他的代码反而没有我那些手工优化的小bug。
差别就在这里——不是谁的代码功底深,而是谁懂得怎么和AI对话。
真实场景1:表单验证的地狱
我们做过一个报价表单,需要验证的字段有:
商品名称(3-100字)
单价(0.01-999999元,2位小数)
数量(1-1000000)
备注(可选,最多500字)
交货期(必须是未来的日期)
传统方式(我最初的写法)
const [errors, setErrors] = useState({})
const validateForm = (data) => {
const newErrors = {}
if (!data.name || data.name.trim().length < 3) {
newErrors.name = "商品名称至少3个字"
}
if (data.name && data.name.trim().length > 100) {
newErrors.name = "商品名称最多100个字"
}
// 价格验证...
if (!data.price || isNaN(data.price)) {
newErrors.price = "请输入正确的价格"
} elseif (data.price < 0.01 || data.price > 999999) {
newErrors.price = "价格范围0.01-999999元"
} elseif (!/^\d+(\.\d{1,2})?$/.test(data.price)) {
newErrors.price = "价格最多2位小数"
}
// ... 20多行类似的重复代码
return Object.keys(newErrors).length === 0
}
// 在表单里用:
const handleSubmit = () => {
if (validateForm(formData)) {
// 提交
} else {
setErrors(newErrors)
}
}这样写的问题:
如果要改一个验证规则,要找半天
另一个表单需要类似的验证?复制粘贴,改变量名,容易出bug
看着就很冗余
用Prompt的方式
我直接问Claude:
我在用react-hook-form和Zod做一个报价表单。需要以下字段验证:
- 商品名称:3-100字
- 单价:0.01-999999元,最多2位小数
- 数量:1-1000000
- 备注:可选,最多500字
- 交货期:不能是过去的日期
给出完整代码,包括schema和form组件。代码要能直接用。Claude给出的:
import { useForm } from"react-hook-form"
import { zodResolver } from"@hookform/resolvers/zod"
import { z } from"zod"
const quoteSchema = z.object({
name: z.string()
.trim()
.min(3, "商品名称至少3个字")
.max(100, "商品名称最多100个字"),
price: z.number()
.positive("价格必须大于0")
.min(0.01)
.max(999999)
.multipleOf(0.01, "最多2位小数"),
quantity: z.number()
.int()
.min(1)
.max(1000000),
remark: z.string().max(500).optional(),
deliveryDate: z.date()
.min(newDate(), "交货期不能早于今天")
})
export default function QuoteForm() {
const { register, handleSubmit, formState: { errors } } = useForm({
resolver: zodResolver(quoteSchema)
})
return (
<form onSubmit={handleSubmit(onSubmit)}>
{/* 所有验证逻辑自动生效 */}
</form>
)
}差异:
传统:50行验证代码,容易出bug
Prompt:15行schema,自动完成验证
而且改需求时,只需要改schema,重新问AI一遍,不用手动debug。
真实场景2:列表数据管理的混乱
我们做过一个内容列表(比如订单列表、文章列表),需要管理:
列表数据
分页状态(当前页、总数)
筛选条件(多个filter)
排序方式
加载状态
错误状态
传统方式:Redux/Context混乱
文件结构:
- actions.js (100行)
- types.js (30行)
- reducer.js (200行)
- selectors.js (80行)
- middleware.js (100行)
总计:500+行,而且逻辑分散在各处改一个筛选逻辑?要改3-4个文件。 新人接手?需要理解整个Redux flow。
用Prompt的方式:Zustand很轻量
我问Claude:
用Zustand管理一个内容列表页面的状态。
需要的状态:
- 列表数据
- 当前页码
- 每页条数
- 总记录数
- 排序字段和方向
- 多个筛选条件(比如状态、日期范围、搜索关键词)
- 加载状态
需要的操作:
- fetchList(filters, sort, page)
- setFilter
- setSortBy
- setPage
- reset
用TypeScript,数据要自动保存到localStorage。给出完整代码。得到的代码:
import { create } from'zustand'
import { persist } from'zustand/middleware'
interface ListState {
items: any[]
page: number
pageSize: number
total: number
sortBy: string
sortOrder: 'asc' | 'desc'
filters: Record<string, any>
isLoading: boolean
error: string | null
setPage: (page: number) =>void
setFilter: (key: string, value: any) =>void
setSortBy: (field: string, order: 'asc' | 'desc') =>void
fetchList: () =>Promise<void>
reset: () =>void
}
exportconst useListStore = create<ListState>()(
persist(
(set, get) => ({
items: [],
page: 1,
pageSize: 20,
total: 0,
sortBy: 'createdAt',
sortOrder: 'desc',
filters: {},
isLoading: false,
error: null,
setPage: (page) =>set({ page }),
setFilter: (key, value) =>set(state => ({
filters: { ...state.filters, [key]: value },
page: 1// 改变筛选时重置到第一页
})),
setSortBy: (field, order) =>set({ sortBy: field, sortOrder: order }),
fetchList: async () => {
set({ isLoading: true })
try {
const { page, pageSize, filters, sortBy, sortOrder } = get()
const res = await api.getList({
page,
pageSize,
...filters,
sortBy,
sortOrder
})
set({
items: res.data,
total: res.total,
isLoading: false
})
} catch (error) {
set({ error: error.message, isLoading: false })
}
},
reset: () =>set({
filters: {},
page: 1,
sortBy: 'createdAt',
sortOrder: 'desc'
})
}),
{ name: 'list-store' }
)
)差异:
Redux方式:500行 + 分散在多个文件
Zustand + Prompt:100行左右 + 集中在一个文件
而且用起来超简单:
const { items, page, filters, fetchList, setFilter } = useListStore()真实场景3:虚拟滚动这个"高端"技能
做一个内容流(类似新闻、商品列表),用户往下滑可能有几千条。直接render所有内容?页面会卡死。
传统方式
需要学习:
Intersection Observer API
虚拟滚动的原理
自己实现虚拟滚动逻辑(容易出bug)
处理动态高度、lazy load等细节
花时间:少说2-3天研究 + 调试
用Prompt的方式
我问Claude:
用React和react-window做一个虚拟滚动列表。
要求:
- 初始显示100条项目,用户滑到底部自动加载下一批
- 每条项目高度120px(固定)
- 列表容器高度600px
- 当用户滑过来时,异步加载该项的详细信息
- 用TypeScript
给出完整可用的代码。Claude直接给出用FixedSizeList的完整代码,包括加载逻辑、边界处理等。
差异:
自己实现:花2-3天,还容易有bug
Prompt方式:20分钟,代码质量反而更好
本质上发生了什么?
1. 从"写代码"变成了"描述需求"
老方式:我需要知道虚拟滚动怎么实现,然后一步步写出来
新方式:我需要清楚地描述"我要什么",AI帮我实现
这是思维方式的转变。不是代码能力变弱了,而是沟通能力变成了主要竞争力。
2. 时间成本直线下降
同样的需求:
表单验证:从4小时 → 30分钟
状态管理:从2天 → 2小时
虚拟滚动:从2-3天 → 1小时
如果一年做50个这样的feature,传统方式需要200天,Prompt方式可能只需要30-40天。
3. 代码质量反而提升了
因为AI生成的代码通常遵循最佳实践:
考虑边界情况(错误处理、空状态等)
性能优化(不容易出现memory leak)
类型完整(TypeScript类型定义齐全)
实际怎么用:三个具体建议
建议1:建立自己的Prompt模板库
不要每次都从零开始。用Obsidian或Notion记录有效的Prompt,按场景分类:
📝 Prompt模板
├─ React组件
│ ├─ 表单组件
│ ├─ 列表组件
│ ├─ 模态框
│ └─ 数据表格
├─ 状态管理
│ ├─ Zustand store
│ ├─ Context API
│ └─ SWR配置
├─ 业务逻辑
│ ├─ 表单验证
│ ├─ API请求封装
│ └─ 错误处理每个模板记录:
原始需求是什么
Prompt怎么写的
生成结果怎么样(有没有改过)
下次改进的地方
建议2:规范你的Prompt写法
一个好的Prompt应该包括:
我需要用[技术栈]做[功能描述]。
具体需求:
1. [功能点1]
2. [功能点2]
3. [功能点3]
技术要求:
- 用[相关库]
- TypeScript类型要完整
- 代码要考虑[某某场景]
给出完整可用的代码。比起"帮我写个React组件"这种模糊的要求,上面的Prompt能让AI生成的代码质量提升50%以上。
建议3:学会迭代和反馈
第一次生成的代码通常80%满意就不错了。
常见的反馈:
代码里有问题:[具体描述]
请修改[某个部分],改成[具体需求]。或者:
生成的代码太复杂了,可以简化一下吗?
特别是[某个函数]部分。经过2-3轮迭代,通常能达到90%满意。
不要掉进的坑
坑1:盲目相信AI生成的代码
AI生成的代码可能有问题:
逻辑bug(特别是复杂的业务逻辑)
性能问题(没考虑大数据量)
安全问题(比如密钥处理)
你需要理解代码,而不是直接用。
坑2:过度依赖Prompt
Prompt工程很强大,但不能替代:
系统架构设计
业务逻辑思考
代码审查
如果你完全不懂React,Prompt也救不了你。
坑3:写出来的Prompt太模糊
很多人问AI:"帮我写个表单",结果生成的代码完全不是自己想要的,然后说"AI这东西没什么用"。
问题不在AI,在于你的需求描述不清楚。
数据说话
我最近看过一些统计:
同一个项目需求,传统方式 vs Prompt方式
任务 | 传统方式 | Prompt方式 | 提升 |
|---|---|---|---|
表单验证 | 4小时 | 30分钟 | 8倍 |
列表管理 | 2天 | 2小时 | 12倍 |
虚拟滚动 | 2-3天 | 1小时 | 24-48倍 |
API封装 | 3小时 | 20分钟 | 9倍 |
错误处理 | 2小时 | 15分钟 | 8倍 |
当然,这些数据有个前提:你懂得怎么用Prompt。
如果你写的Prompt又模糊又不规范,提升可能只有2-3倍。
最后的建议
短期(1个月内)
选一个小需求,试试用Prompt做
记录你的Prompt,看看生成的代码质量
改进你的Prompt描述
中期(3个月内)
建立自己的Prompt模板库
在项目中有意识地使用Prompt工程
观察效率的提升
长期(半年+)
Prompt工程会变成你开发的常规工具
你会自然而然地想到"怎么用AI来做这个"
效率相比之前会有质的提升
结束
这不是说传统的代码能力不重要了。相反,理解代码、评估代码质量、能改进AI生成的代码,这些能力现在变得更重要了。
Prompt工程不是替代品,而是放大器。
它放大了好工程师的能力(可以做更多的事),也放大了差工程师的问题(生成的代码更容易出bug)。
所以现在的问题不是"要不要用Prompt",而是"怎样用好Prompt"。
从今天开始,找一个小需求试试看。别想太多,就直接问AI一遍。
然后记录下来,下次改进。
反复几次,你就会明白这个东西的威力在哪里。

被折叠的 条评论
为什么被折叠?



