
不是鸡汤,不是危言耸听。这是我最近半年在几个项目中真实遇到的情况。
去年年底,我带了一个实习生做一个电商后台的商品管理系统。
我用的传统方式: 产品说:做一个商品列表页面,能过滤、能排序、无限滚动、记录用户行为。
我打开VSCode:
前后花了3-4天。
这个实习生用Prompt工程的方式: 直接问ChatGPT一个完整的需求描述(把产品文档复制进去,稍微整理一下),GPT给出了一个完整的React组件,包括所有逻辑。
他在我的代码基础上改了一些样式、调整了API接口,花了半天。
结果,他的代码反而没有我那些手工优化的小bug。
差别就在这里——不是谁的代码功底深,而是谁懂得怎么和AI对话。
我们做过一个报价表单,需要验证的字段有:
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)
}
}
这样写的问题:
我直接问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>
)
}
差异:
而且改需求时,只需要改schema,重新问AI一遍,不用手动debug。
我们做过一个内容列表(比如订单列表、文章列表),需要管理:
文件结构:
- actions.js (100行)
- types.js (30行)
- reducer.js (200行)
- selectors.js (80行)
- middleware.js (100行)
总计:500+行,而且逻辑分散在各处
改一个筛选逻辑?要改3-4个文件。 新人接手?需要理解整个Redux flow。
我问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' }
)
)
差异:
而且用起来超简单:
const { items, page, filters, fetchList, setFilter } = useListStore()
做一个内容流(类似新闻、商品列表),用户往下滑可能有几千条。直接render所有内容?页面会卡死。
需要学习:
花时间:少说2-3天研究 + 调试
我问Claude:
用React和react-window做一个虚拟滚动列表。
要求:
- 初始显示100条项目,用户滑到底部自动加载下一批
- 每条项目高度120px(固定)
- 列表容器高度600px
- 当用户滑过来时,异步加载该项的详细信息
- 用TypeScript
给出完整可用的代码。
Claude直接给出用FixedSizeList的完整代码,包括加载逻辑、边界处理等。
差异:
老方式:我需要知道虚拟滚动怎么实现,然后一步步写出来
新方式:我需要清楚地描述"我要什么",AI帮我实现
这是思维方式的转变。不是代码能力变弱了,而是沟通能力变成了主要竞争力。
同样的需求:
如果一年做50个这样的feature,传统方式需要200天,Prompt方式可能只需要30-40天。
因为AI生成的代码通常遵循最佳实践:
不要每次都从零开始。用Obsidian或Notion记录有效的Prompt,按场景分类:
📝 Prompt模板
├─ React组件
│ ├─ 表单组件
│ ├─ 列表组件
│ ├─ 模态框
│ └─ 数据表格
├─ 状态管理
│ ├─ Zustand store
│ ├─ Context API
│ └─ SWR配置
├─ 业务逻辑
│ ├─ 表单验证
│ ├─ API请求封装
│ └─ 错误处理
每个模板记录:
一个好的Prompt应该包括:
我需要用[技术栈]做[功能描述]。
具体需求:
1. [功能点1]
2. [功能点2]
3. [功能点3]
技术要求:
- 用[相关库]
- TypeScript类型要完整
- 代码要考虑[某某场景]
给出完整可用的代码。
比起"帮我写个React组件"这种模糊的要求,上面的Prompt能让AI生成的代码质量提升50%以上。
第一次生成的代码通常80%满意就不错了。
常见的反馈:
代码里有问题:[具体描述]
请修改[某个部分],改成[具体需求]。
或者:
生成的代码太复杂了,可以简化一下吗?
特别是[某个函数]部分。
经过2-3轮迭代,通常能达到90%满意。
AI生成的代码可能有问题:
你需要理解代码,而不是直接用。
Prompt工程很强大,但不能替代:
如果你完全不懂React,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倍。
这不是说传统的代码能力不重要了。相反,理解代码、评估代码质量、能改进AI生成的代码,这些能力现在变得更重要了。
Prompt工程不是替代品,而是放大器。
它放大了好工程师的能力(可以做更多的事),也放大了差工程师的问题(生成的代码更容易出bug)。
所以现在的问题不是"要不要用Prompt",而是"怎样用好Prompt"。
从今天开始,找一个小需求试试看。别想太多,就直接问AI一遍。
然后记录下来,下次改进。
反复几次,你就会明白这个东西的威力在哪里。