skip to content
usubeni fantasy logo Usubeni Fantasy

2025 年AI编程经验分享

/ 19 分钟阅读

范式转变

最开始,我们仅能使用 AI 做函数生成,tab 补全等非常基础的编程辅助。那时候,只有 VSCode Copilot,那时候,很多人还看不起 AI 编程。

Deepseek 带来的开源思维链也仅仅是今年春节才爆火起来。 时间没过多久,思维链、工具调用、Agent、超长上下文一个接一个出现,Claude 3.7 出现之后,AI 编程范式似乎一夜间就改变了。

本来他充其量只是个助手,现在起码是能干活的中级工程师。项目搭建、组件重构,指挥得当他都能完成。而且现在重构试错成本巨低,以前做一次重构发现效果不太好,代码都舍不得删,现在好了,半天够换着方法重构好几遍了。

Andrej Karpathy 创造了 Vibe Coding(氛围编程)这个词。他本人通过不断接受 AI 建议(“我总是接受所有建议,我不再阅读差异”),将错误信息复制粘贴给 AI,快速构建 Web 应用。在最近 AI IDE 井喷之后,大家应该或多或少都能意识到 Vibe Coding 是真的可行的。

Augment 是现在最好用的 AI IDE 插件,其中 Context Engine 和 Diagnostics 是两个非常强大的功能。

Context Engine Diagnostics

Claude Code

提示词工程

Garbage in, garbage out

AI 发展至今,提示词工程的效果逐渐弱化,AI IDE 和插件本身就自带好几千字甚至上万字的系统提示词,有时候自己附加提示词他甚至会无视(例如你很难让 Augment 不要写测试、文档,他总会自动写)。

角色扮演和思维链之类的提示词效果已经不明显,进入玄学的提升范畴。在 IDE 里现在比较好用的提示词应该基本只剩单样本和少样本提示词 (One-Shot & Few-Shot)。

还有一个流派是给 IDE 设定一堆 Rule 提示词

又或者 Kiro 搞的那套:

  • 阶段 1:需求澄清,将模糊想法转化为结构化需求文档
  • 阶段 2:设计与研究,基于需求开发综合设计方案
  • 阶段 3:任务规划,基于需求和设计创建可执行的实施计划
  • 阶段 4:任务执行,按照SPECS文档执行实施任务

https://github.com/heihuzicity-tech/ClaudeCode-Kiro-Workflow

我曾经做过一次完整的流程,检查需求文档耗费精力,做一堆任务耗费时间也耗费 Token,结果没有特别好。kiro 自动生成的 task,最后几步可能会搞些看起来很高级的优化,但实则不推荐,本着能用就行的原则,一路上只要你觉得代码符合你的审美,最后的优化可能是过度优化。

主动提供上下文

传统的提示词的功能弱化后,用户主动提供的上下文会更重要。未来上下文工程可能会发展得更完美,但现在还是处于比较初级的阶段,下面介绍一些我平时会用的上下文获取方法。

UI 实现

对于多模态模型,图片是上下文的一部分,使用图片实现 UI 是很基础的操作。

现阶段要做到像素级的还原度,是不可能的,不过有一些值得注意的点,可以稍微提高生成质量。

使用图片时,可以先让 AI 描述图片内元素的基本布局,甚至引导它描述部分细节,如果它一开始就描述不准确,那后面就不用期待它能写对了。

为自己的代码库生成一个组件列表,让 AI 在从图片实现页面时在里面挑组件,必要时还是要主动告诉它需要什么已经抽象过的组件,因为光看名字很可能看不出来。

v0 是一个超强的截图转代码工具,还原度比直接用 Claude 高非常多。

修复 problem

修复 lint 问题
[
{
"resource": "/d:/gpu/src/pages/ResourceManagement/TeamResourceManagement.tsx",
"owner": "_generated_diagnostic_collection_name_#4",
"code": {
"value": "lint/style/useImportType",
"target": {
"$mid": 1,
"path": "/linter/rules/use-import-type",
"scheme": "https",
"authority": "biomejs.dev"
}
},
"severity": 8,
"message": "All these imports are only used as types.",
"source": "biome",
"startLineNumber": 35,
"startColumn": 8,
"endLineNumber": 35,
"endColumn": 26,
"origin": "extHost1"
}
]

Apifox 复制

从 apifox 复制接口信息给大模型

可以在 Apifox 直接复制接口的 OpenAPI 规范,贴进去让 AI 加 api 十分方便且可靠。

openapi: 3.0.1
info:
title: ""
description: ""
version: 1.0.0
paths:
/api/v1/team/app/list:
get:
summary: list team app
deprecated: false
description: ""
tags:
- Team
parameters:
- name: teamId
in: query
description: ""
required: true
schema:
format: int
type: integer
- name: page
in: query
description: ""
required: false
schema:
default: 1
format: int
type: integer
- name: size
in: query
description: ""
required: false
schema:
default: 10
format: int
type: integer
- name: Authorization
in: header
description: ""
example: Bearer {{Authorization}}
schema:
type: string
default: Bearer {{Authorization}}
responses:
"200":
description: ""
content:
application/json:
schema:
$ref: "#/components/schemas/mlops.api.team.v1.ListTeamAppRes"
description: ""
headers: {}
x-apifox-name: 成功
security: []
x-apifox-folder: Team
x-apifox-status: released
x-run-in-apifox: https://app.apifox.com/web/project/6423715/apis/api-326223640-run
components:
schemas:
mlops.api.team.v1.ListTeamAppRes:
properties:
apps:
format: "[]*dto.App"
items:
$ref: "#/components/schemas/mlops.internal.model.dto.App"
description: ""
type: array
type: object
x-apifox-orders:
- apps
x-apifox-ignore-properties: []
x-apifox-folder: ""
mlops.internal.model.dto.App:
properties:
id:
format: int
type: integer
name:
format: string
type: string
cmdbId:
format: string
type: string
type: object
x-apifox-orders:
- id
- name
- cmdbId
x-apifox-ignore-properties: []
x-apifox-folder: ""
securitySchemes: {}
security: []

附带最佳实践

多数解现象是指 AI 模型倾向于生成训练素材中最常见、最直接的解决方案。换言之,训练素材只能反映那个语言的平均编码能力。尤其是 react,react 的思维负担是非常重的,这是框架本身的问题,夹不住素材实在多,所以它总能写出“能跑”的代码,事实上一看很多严格的规则都会标红,很多实现不是最优解。

这可能导致 AI 的代码在通用场景下正确,但在特定项目背景下并非最优,甚至,只是能用而完全不优雅,而且放任 AI 多数解也可能造成代码膨胀。

因为多数解现象,开发者必须识别这些潜在的假设和非最优选择,并根据实际需求进行调整。

在前端开发领域,由于门槛低,谁都能写,可能会导致一些代码质量问题,这些有问题的代码如果作为训练数据就会加重上述的多数解问题。所以作为前端开发,可能需要在上下文附加 React 最佳实践。

写 ChangeLog

获取上次发版的 git 提交哈希,跟 AI 说从根据这个哈希的提交开始到最新的提交生成 ChangeLog。他就会自动通过 git 命令收集需要的信息给你输出。

给一个模板可以保证 ChangeLog 格式统一。

## v1.0.0 (2025-01-15)
**功能描述 - 简短的版本亮点描述**
**代号: 项目代号**
### ✨ 新功能
- **核心功能增强** - 改进了应用程序的整体性能和稳定性
- **更好的文件格式化** - 保存的文件现在具有适当的缩进以提高可读性
### 🔧 改进
- **更新的macOS图标** - 刷新应用程序图标以更好地集成macOS
- **增强的性能** - 各种底层改进以获得更好的用户体验
### 🐛 修复
- **修复了登录问题** - 解决了某些情况下用户无法登录的问题
- **修复了数据同步** - 改进了数据在设备间的同步稳定性
### 🚀 性能优化
- **启动速度提升** - 应用程序启动时间减少了30%
- **内存使用优化** - 降低了内存占用,提高了运行效率
### 📚 文档更新
- **更新了用户手册** - 添加了新功能的详细说明
- **API文档完善** - 补充了缺失的API接口文档
### ⚠️ 重大变更
- **API变更** - 某些API接口进行了重构,请查看迁移指南
- **配置文件格式** - 配置文件格式有所变更,需要手动更新
---
**升级说明:**
- 建议在升级前备份重要数据
- 详细的升级指南请参考官方文档

当然,前提是你的 commit message 要写得很标准。

DeepWiki

DeepWiki 是一个超赞的仓库 wiki 生成工具,只要你提供 GitHub 地址,它就能给这个仓库生成一个颇为完整的 wiki 页面。

同时,DeepWiki 提供 MCP 能力

{
"mcpServers": {
"deepwiki": {
"serverUrl": "https://mcp.deepwiki.com/sse"
}
}
}

通过 ask_question 工具可以让你的 AI 工具向 Deepwiki 提问,如果你使用的某个冷门库文档没写好,或许可以直接用这个工具得到解决方案。

对于你自己写的项目,也可以 AI 生成文档,你审阅后没问题,这就能成为下次提问的上下文。

AI 编程模式

无限流

失败后,直接找到他的错误,然后直接更新提示词整个重试。例如你知道他会把问题复杂化,那就一开始就把简单的思路告诉他。

好处是不浪费上下文。另外,你可以知道 AI 的能力边界后补充上下文,例如你让他用一个库实现功能,但是他并不会用,那就需要补充文档链接。

Copy And Paste Great Again

类似的组件复制粘贴在前 AI 时代是一个大问题。当两个组件或函数有一点差异时,一般倾向于直接复制一份,而不是做抽象。但是后续修改时,要一一修改每一个地方,这不难,但是个体力活。

AI 时代来临后可以更放心地在初始开发时用复制粘贴这个模式。AI 可以找出类似内容批量修改,再也不需要做体力活。在后面如果真的有更多的使用情况,也可以后续再用 AI 做抽象。

毕竟过早优化是万恶之源,封装方法和组件越早,后面业务变更需要修改时就越畏手畏脚。

双向奔赴

在遇到你预感到 AI 不能或难以解决的难题时,交下任务同时可以自己再在 ChatGPT 上尝试寻找解决方案。这样也方便 AI 写完之后看懂它的实现方案。

上面提到的多数解现象出现时,我们就必须近一步指引 AI 重构,例如不要啥都写 useEffect,优先事件驱动之类的。

启动模板

使用 AI 需要有选型能力,仅从前端角度来说,AI 擅长这个技术栈:

  • 最新版 React
  • 最新版 Tailwind
  • Vite 用于高速构建
  • Zustand 用于简化状态管理
  • Shadcn/UI 用于美观的组件
  • React Query 用于数据获取
  • TypeScript 用于类型安全
  • ESLint 用于代码质量
  • Prettier 用于代码格式化

候选 Biome,eslint 和 prettier 二合一的存在。处理速度很快,而且有更多代码优化规则(例如 if 提早 return 了就不用 else 了,AI 写出来还是基本带 else 的)

React、Tailwind 几乎是标配市面上众多 App 生成网站(Lovable、Bolt等)默认输出都是用这个组合。

上面提到的 V0 图生组件,它生成的结果就是 react 组件,用 react 就能拿来即用。

以后开源库的用户量也是变得越来越“赢家通吃”。AI 越懂的库,用户越多,用户越多,训练材料越多,AI 越容易写好,然后循环了。

前后端融合

如果一个人同时管理前后端代码,那么强烈建议前后端仓库放到一起。又或者直接回到前后端不分离的时代,潮流果然是个圈。

实际效率提升

实际效率提升可能没有那么明显,一些对照实现显示效率提升可能在 20% 左右,甚至有的实验结果是负提升。

最后 30% 的耗时

70% 问题: 许多开发者发现AI能完成约70%的初始解决方案,但剩下的30%令人沮丧,可能导致“一步进两步退”的问题。非工程师尤为如此,他们缺乏理解代码的底层心智模型,难以修复 AI 引入的新 bug。

对于 70% 问题,现阶段对于完全 Vibe Coding(不理解代码)的使用者应该是无解的。但是作为程序员,我们必须在每次提交前初步理解代码,懂个大概即可,遇到错误再细看。我会更习惯直接用 git 检查 AI 更新的代码,而不是用 AI 工具自带的那个采纳或拒绝,直接全部采纳然后在 git 工具用 diff 检查会比较符合我原来的习惯。

对时间的错觉

开发者花费额外时间验证、调试和调整AI的输出。AI可能产生切线或不正确的代码,然后需要人工纠正。本质上,“幻觉”和错误步骤引入了额外的循环。

开发者可能过于容易接受 AI 输出,然后在错误时调试更长时间,而不是编写更简单的正确解决方案。研究指出,即使在经历减速后,开发者仍然感觉 AI 帮助了——一种认知偏见,因为 AI 让事情感觉更容易,即使它实际上并不更快。

更碎片的思维

尽管可以并行的任务更多,但这对人类本身大概不是好事

这彻底打破原来有可能产生的心流,你不可能盯着 AI 编码,即使你不嫌盯着它浪费时间,你的眼睛也很难跟上它的实现。但你不盯着就意味着你打断了当前任务去干别的事了。

这会产生一个很恐怖的效果。现代人碎片化的注意力更稀碎了。

编码之外

  • 无法缩短跨团队合作时间
  • 无法缩短会议时间

该学什么

  • 学会提问
  • 精进调试策略
  • 测试边界条件
  • 熟悉性能优化原理
  • 成为架构师,运维也参一脚
  • 创意 UI/UX 设计(就我看来现在即使提示词鼓励它把界面做的有创意,结果还是逃不出很普通的页面结构)
评论组件加载中……