
在最近的业务迭代里我对 AI Coding 的态度发生了明显变化过去它更像“高级自动补全”现在很多场景下它已经能承担“编码助手 自动化工程师”的双重角色。不过我也发现真正拉开效率差距的不是工具本身而是使用者有没有一套稳定的工作方法。这篇文章我会整理一套面向真实工程师的 AI Coding 实战打法也就是标题里提到的 Do Work Skill Solution并用手把手的方式带大家完成一个带数据库、接口和前端页面的任务管理系统。无论你是刚接触 AI 编程的新手还是已经在用 Cursor、Copilot、GLM Coding Plan 等工具的开发者都能从这套流程里找到可以复用的套路。1. 重新理解 AI Coding从“代码补全”到“自动干活”1.1 什么是 AI Coding Agent早期我们说的 AI Coding更多是指 IDE 里的代码补全写一个函数名AI 帮你补完剩余几行。这个阶段解决的是“少打字”的问题。现在热起来的 AI Coding Agent则往前跨了一大步。它不再只是基于光标当前位置做局部预测而是可以做到读取项目目录结构理解当前代码上下文根据自然语言描述生成多个文件的修改方案自动执行命令比如安装依赖、运行测试、查看报错根据报错信息自我修正再重新尝试。简单说AI Coding Agent 的目标是“完成一个任务”而不是“补全一段代码”。这也正是像 Cursor、GitHub Copilot、Claude Code、GLM Coding Plan 这类工具在 2025 年后频繁出现在技术社区的原因。你会发现很多团队开始用“数小时内跑通过去需要数周开发的工作”来描述 AI Coding 带来的效率变化虽然这句话有一定夸张成分但确实反映了工作模式的改变。1.2 为什么说“工作方法”比“工具”更重要接触 AI Coding 一段时间后你会遇到一个现象同一个工具有人用得像是“高级问答”有人却能让它连续输出一整个模块的代码。差别在哪差别在上下文构建和任务拆解。举一个很常见的反面例子帮我写一个任务管理系统。工具大概率会给出一个看似完整、但非常泛化的示例代码。这个示例能跑但不一定符合你的数据库、你的接口风格、你的前端框架、你的权限模型。于是你仍然要花大量时间去改。如果换一种提交方式我们是一个 FastAPI SQLAlchemy SQLite 的项目任务表目前有 id/title/description/completed/created_at 五个字段。 请帮我创建一个 router路径前缀是 /api/tasks实现 1. 查询任务列表按创建时间倒序 2. 创建任务 3. 根据 id 更新任务 4. 根据 id 删除任务。 返回格式统一使用 Pydantic 的 TaskOut。两种写法产出的代码质量完全不同。这就是 Do Work Skill Solution 想解决的问题把“会用 AI 写代码”升级成“能稳定交付功能”。1.3 真实工程师的新角色过去写业务功能工程师的核心动作是“写代码”。但在 AI Coding 时代核心动作变成了把模糊需求拆成可执行的小任务把项目背景、约束、技术栈信息完整告诉 AI对 AI 生成的代码做审查和验证把出现的问题再反馈给 AI形成修复闭环。这个转变并不容易尤其是对刚入门的新人。因为你需要具备一定的代码阅读能力、调试能力和架构判断力才能真正判断 AI 输出的代码是否可靠。所以我的建议是AI Coding 不是让你不学基础而是让你把更多精力放在更高层次的工程设计上。2. Do Work Skill Solution 方法拆解先把这套方法的名字拆开看。“Do Work”意思是“把活干完”不光是“生成代码”“Skill Solution”强调它是一套可复用的技能方案。整套方法可以浓缩成一个公式清晰上下文 小步任务拆解 自动验证闭环 人工审查 可交付代码下面展开每一步。2.1 第一步构建清晰上下文AI 没有读心术它的输出质量严重依赖你给出的上下文。在向 AI 提需求前先检查自己是否包含以下信息项目技术栈语言、框架、数据库、ORM。已有代码结构文件路径、模块划分、命名风格。约束条件安全要求、性能要求、兼容性要求。验收标准正常情况返回什么异常情况怎么处理。如果你正在用对话式 AI建议把项目的 README、依赖文件、核心模块代码粘贴给它。如果你用的是 Cursor 这类支持项目上下文的工具可以直接通过引用文件让它自动读取仓库内容。2.2 第二步小步任务拆解不要一次性让 AI“生成整个系统”而要拆成可验证的小任务。比如开发一个任务管理 API拆解顺序可以是创建 SQLAlchemy 数据模型创建 Pydantic 请求和响应模型实现列表和创建接口实现更新和删除接口补充前端页面运行测试并修复错误。每个小任务的产出都能被快速验证。这样一旦出现错误你能很快定位是模型问题、路由问题还是前端调用问题。2.3 第三步验证闭环AI 生成的代码第一版很难保证 100% 正确。最常见的问题是方法名拼错Pydantic 版本 API 变化SQLAlchemy 查询语法不对前后端字段对不上。正确做法是把报错反馈给 AI并附上关键代码片段。例如运行 uvicorn app.main:app 后报错 TypeError: Task() got an unexpected keyword argument description 这是我的 models.py 代码... 请检查模型字段和路由传参是否一致。AI 会根据报错和代码片段修正。循环几次后代码基本能跑通。2.4 第四步人工审查这一步不能省。AI 可以帮你写代码但最终要上线的代码必须经过人工审查。重点检查有没有 SQL 注入风险有没有越权访问有没有硬编码的生产环境密钥事务是否完整提交或回滚异常分支是否覆盖。把这套方法固定成习惯后你会发现 AI Coding 的产出越来越稳定。3. 环境准备与 AI Coding 工具选型3.1 本地运行环境本文实战示例采用 Python FastAPI。做这个选择的原因很简单代码量少、环境依赖轻、新手容易跑通。需要准备的环境如下Python 3.10 及以上版本pip 包管理工具支持 Python 的 IDE推荐 VS Code 或 PyCharm一个可用的 AI Coding 工具具体选型见下一节。版本不要求完全一致重点演示工程思路。如果你的项目是 Java Spring Boot 或 Node.js NestJS方法论同样适用只是代码语法不同。3.2 AI Coding 工具怎么选目前市面上的 AI Coding 工具很多功能各有侧重。以下是我的日常选型建议工具主要使用场景备注Cursor多文件编辑、项目级上下文适合做完整功能开发GitHub CopilotIDE 内补全、单文件生成老牌工具稳定Claude Code命令行交互、自动执行命令适合喜欢终端工作流的人GLM Coding Plan中文场景、对话式编程对中文需求理解友好Vercel v0前端页面生成适合快速把页面原型做出来需要注意工具的价格、免费额度、模型能力变化非常快具体以官方最新信息为准。对于企业项目还要额外关注代码是否会上传到第三方服务器避免把未脱敏的业务代码发送给外部 AI 服务。很多公司现在已经有内部私有化部署的代码大模型如果所在团队提供了优先使用内部渠道。3.3 示例项目结构为了让后面的实战代码更清晰先规划好目录结构ai-task-manager/ ├── app/ │ ├── __init__.py │ ├── main.py │ ├── database.py │ ├── models.py │ ├── schemas.py │ ├── routers/ │ │ ├── __init__.py │ │ └── tasks.py │ └── static/ │ └── index.html ├── requirements.txt └── README.md这是一个典型的 FastAPI 分层结构路由、模型、数据库配置和静态页面分离。相比把所有代码塞进一个 main.py这样的结构更容易维护也更容易让你借助 AI Coding 工具逐模块开发。4. 实战用 AI Coding 从零落地一个任务管理系统这一节是全文核心。我会按照 Do Work Skill Solution 的流程一步一步完成一个“任务管理系统”。下面展示的代码已经是经过人工审查、补充注释、修复边界问题后的最终版本。4.1 需求定义目标功能用户可以创建任务任务包含标题、描述、完成状态用户可以查看任务列表用户可以修改任务标题、描述、完成状态用户可以删除任务提供浏览器页面不引入重型前端框架。技术栈FastAPISQLAlchemy SQLite原生 HTML JavaScript4.2 创建项目结构和虚拟环境首先创建目录和虚拟环境mkdir ai-task-manager cd ai-task-manager python -m venv venv激活虚拟环境# macOS / Linux source venv/bin/activate # Windows venv\Scripts\activate创建文件结构mkdir -p app/routers app/static接着在requirements.txt中写入依赖fastapi0.110,1.0 uvicorn0.30,1.0 sqlalchemy2.0,3.0 pydantic2.7,3.0安装依赖pip install -r requirements.txt4.3 让 AI 生成数据库模型面向 AI 的提示词可以这样写项目技术栈FastAPI SQLAlchemy 2.0 SQLite。 请创建文件 app/database.py 和 app/models.py。 database.py 负责创建 engine、SessionLocal 和 Base。 models.py 定义一个 Task 模型字段包括 id 整数主键、title 字符串、description 字符串、completed 布尔、created_at 时间。 请使用 SQLAlchemy 2.0 的风格代码不用太长但要完整可运行。最终代码app/database.pyfrom sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker, declarative_base SQLALCHEMY_DATABASE_URL sqlite:///./ai_task_manager.db engine create_engine( SQLALCHEMY_DATABASE_URL, connect_args{check_same_thread: False} ) SessionLocal sessionmaker(autocommitFalse, autoflushFalse, bindengine) Base declarative_base()这里解释几个关键点sqlite:///./ai_task_manager.db表示数据库文件生成在当前工作目录下。check_same_threadFalse是 SQLite 配合 FastAPI 多线程时常用的配置允许不同线程使用同一个连接。SessionLocal是数据库会话工厂每个接口通过它获取 session。Base是所有 ORM 模型的基类。最终代码app/models.pyfrom sqlalchemy import Column, Integer, String, Boolean, DateTime, func from database import Base class Task(Base): __tablename__ tasks id Column(Integer, primary_keyTrue, indexTrue) title Column(String(200), nullableFalse) description Column(String(500), default) completed Column(Boolean, defaultFalse) created_at Column(DateTime(timezoneTrue), server_defaultfunc.now())需要说明的是server_defaultfunc.now()会在数据库层面写入当前时间比在 Python 里手动赋值更可靠。实际项目中如果还需要更新时间字段可以额外增加updated_at。4.4 定义 Pydantic 请求与响应模型为了让接口参数有类型约束也为了让 FastAPI 自动生成接口文档需要创建app/schemas.py。面向 AI 的提示词可以这样写请创建 app/schemas.py基于 Pydantic v2 定义三个模型 TaskCreate创建任务title 必填最长 200 字符description 可选最长 500 字符 TaskUpdate更新任务所有字段可选completed 为布尔 TaskOut返回任务包含 id/title/description/completed/created_at并开启 from_attributes 配置。最终代码from typing import Optional from datetime import datetime from pydantic import BaseModel, Field class TaskCreate(BaseModel): title: str Field(..., min_length1, max_length200, description任务标题) description: Optional[str] Field(, max_length500, description任务描述) class TaskUpdate(BaseModel): title: Optional[str] Field(None, min_length1, max_length200) description: Optional[str] Field(None, max_length500) completed: Optional[bool] None class TaskOut(BaseModel): id: int title: str description: str completed: bool created_at: datetime class Config: from_attributes True这里的关键是from_attributes True在 Pydantic v2 中表示允许从 ORM 对象直接转换等价于旧版的orm_mode True。如果你用的是 Pydantic v1则需要写成class Config: orm_mode True。这是最容易踩版本坑的地方。4.5 实现 API 路由创建app/routers/__init__.py内容可以为空。然后创建app/routers/tasks.py。面向 AI 的提示词请基于 database.py 的 SessionLocal、models.py 的 Task、schemas.py 的 TaskCreate/TaskUpdate/TaskOut 实现文件 app/routers/tasks.py - router 前缀 /api/tasks - get_db 依赖负责打开和关闭 session - 列表接口查询所有任务按创建时间倒序 - 创建接口接收 TaskCreate创建任务 - 更新接口根据 id 更新任务不存在时返回 404 - 删除接口根据 id 删除任务不存在时返回 404最终代码from typing import List from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from database import SessionLocal from models import Task from schemas import TaskCreate, TaskUpdate, TaskOut router APIRouter(prefix/api/tasks, tags[tasks]) def get_db(): db SessionLocal() try: yield db finally: db.close() router.get(, response_modelList[TaskOut]) def list_tasks(db: Session Depends(get_db)): return db.query(Task).order_by(Task.created_at.desc()).all() router.post(, response_modelTaskOut) def create_task(payload: TaskCreate, db: Session Depends(get_db)): task Task(**payload.model_dump()) db.add(task) db.commit() db.refresh(task) return task router.put(/{task_id}, response_modelTaskOut) def update_task(task_id: int, payload: TaskUpdate, db: Session Depends(get_db)): task db.get(Task, task_id) if not task: raise HTTPException(status_code404, detail任务不存在) for field, value in payload.model_dump(exclude_unsetTrue).items(): setattr(task, field, value) db.commit() db.refresh(task) return task router.delete(/{task_id}, status_code204) def delete_task(task_id: int, db: Session Depends(get_db)): task db.get(Task, task_id) if not task: raise HTTPException(status_code404, detail任务不存在) db.delete(task) db.commit()这里有几个工程细节值得注意payload.model_dump()在 Pydantic v2 中用于把请求对象转成字典v1 中对应dict()payload.model_dump(exclude_unsetTrue)表示只更新前端传过来的字段避免把没有传的字段覆盖成None删除接口使用status_code204语义是“删除成功但无返回内容”。4.6 创建 FastAPI 入口创建app/main.pyfrom fastapi import FastAPI from fastapi.staticfiles import StaticFiles from fastapi.responses import FileResponse from database import Base, engine from routers import tasks Base.metadata.create_all(bindengine) app FastAPI(titleAI Coding Task Manager, version0.1.0) app.include_router(tasks.router) app.mount(/static, StaticFiles(directoryapp/static), namestatic) app.get(/) def index(): return FileResponse(app/static/index.html)Base.metadata.create_all(bindengine)的作用是启动时自动建表。它适合快速原型但如果后续涉及表结构变更建议改用 Alembic 做迁移管理这一点在后面的最佳实践部分还会提到。app.mount(/static, StaticFiles(directoryapp/static), namestatic)是让 FastAPI 能托管静态目录前端页面可以放在这里。4.7 生成前端页面创建app/static/index.html这是任务系统的浏览器交互界面。为了降低环境依赖这个页面不引入任何前端框架直接使用原生 JavaScript 的fetch调用接口。!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 titleAI 任务管理/title style body { font-family: system-ui, -apple-system, sans-serif; max-width: 720px; margin: 40px auto; padding: 0 16px; color: #333; } h1 { border-bottom: 2px solid #2563eb; padding-bottom: 8px; } form { display: flex; gap: 8px; margin-bottom: 16px; } input { padding: 8px 12px; border: 1px solid #ccc; border-radius: 6px; font-size: 14px; } #task-title { flex: 1; } #task-desc { flex: 1; } button { background: #2563eb; color: #fff; border: none; padding: 8px 16px; border-radius: 6px; cursor: pointer; } ul { list-style: none; padding: 0; } li { display: flex; align-items: center; gap: 8px; padding: 12px; border: 1px solid #eee; border-radius: 8px; margin-bottom: 8px; } li.completed .task-content { text-decoration: line-through; color: #999; } .task-content { flex: 1; } .delete-btn { background: #ef4444; color: #fff; border: none; border-radius: 6px; padding: 4px 10px; cursor: pointer; } /style /head body h1任务管理/h1 form idtask-form input idtask-title typetext placeholder任务标题 required / input idtask-desc typetext placeholder任务描述 / button typesubmit添加/button /form ul idtask-list/ul script const API /api/tasks; async function loadTasks() { const res await fetch(API); const tasks await res.json(); const list document.getElementById(task-list); list.innerHTML ; tasks.forEach(task { const li document.createElement(li); if (task.completed) li.classList.add(completed); const checkbox document.createElement(input); checkbox.type checkbox; checkbox.checked task.completed; checkbox.addEventListener(change, () toggleTask(task.id, checkbox.checked)); const content document.createElement(span); content.className task-content; content.textContent task.title (task.description ? — task.description : ); const deleteBtn document.createElement(button); deleteBtn.className delete-btn; deleteBtn.textContent 删除; deleteBtn.addEventListener(click, () deleteTask(task.id)); li.appendChild(checkbox); li.appendChild(content); li.appendChild(deleteBtn); list.appendChild(li); }); } async function addTask(title, description) { const res await fetch(API, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ title, description }) }); if (!res.ok) { alert(添加失败); } } async function toggleTask(id, completed) { await fetch(${API}/${id}, { method: PUT, headers: { Content-Type: application/json }, body: JSON.stringify({ completed }) }); } async function deleteTask(id) { await fetch(${API}/${id}, { method: DELETE }); loadTasks(); } document.getElementById(task-form).addEventListener(submit, async (e) { e.preventDefault(); const title document.getElementById(task-title).value; const description document.getElementById(task-desc).value; await addTask(title, description); document.getElementById(task-title).value ; document.getElementById(task-desc).value ; loadTasks(); }); loadTasks(); /script /body /html这个前端页面虽然简单但完整覆盖了增删改查功能。在实际项目中你可以让 Vercel v0 这类工具生成更富交互的页面再替换掉这里的静态页面。对于学习阶段原生 HTML 的好处是零依赖、容易排查问题。4.8 运行与验证现在项目已经完整启动服务uvicorn app.main:app --reload启动后浏览器访问http://127.0.0.1:8000 打开前端页面http://127.0.0.1:8000/docs 打开 FastAPI 自动生成的接口文档。也可以用 curl 验证接口curl -X POST http://127.0.0.1:8000/api/tasks \ -H Content-Type: application/json \ -d {title: 学习 AI Coding, description: 完成一个实战项目}预期返回{ id: 1, title: 学习 AI Coding, description: 完成一个实战项目, completed: false, created_at: 2026-08-01T12:00:00 }再调用列表接口curl http://127.0.0.1:8000/api/tasks可以看到刚刚创建的任务。到这里一个基于 FastAPI 的任务管理系统就跑通了。整个过程如果使用 AI Coding 工具辅助核心代码的生成时间可能在几分钟内完成但人工审查和调试仍是不可缺少的环节。5. 常见问题与排查思路AI Coding 在实际使用中会遇到不少问题下面整理一份高频问题清单。问题现象常见原因解决思路AI 生成代码运行时报“unexpected keyword argument”Pydantic 版本 API 不一致或模型字段与传参不一致对比 v1 的dict()和 v2 的model_dump()差异数据库表没有自动创建没有执行create_all或连接了不正确的数据库路径检查Base.metadata.create_all(bindengine)是否在启动时执行接口返回 422 校验错误请求体字段类型不匹配打开/docs查看参数定义调整前端传参格式更新接口把未传字段覆盖为 nullmodel_dump()没有加exclude_unsetTrue更新操作必须使用exclude_unsetTrue前端跨域调用失败FastAPI 没有配置 CORS对项目增加CORSMiddleware允许目标域名访问AI 反复生成同一段错误代码上下文不够AI 没有找到真正报错的文件把报错堆栈和关键代码直接贴给 AI项目敏感代码被上传到外部 AI团队没有统一使用私有化 AI 服务遵守公司数据安全规范代码脱敏后再调用公网 AI除了这些具体报错更重要的是养成“把问题结构化描述给 AI”的习惯。一个高效的排错请求通常包含你做了什么操作期望得到什么结果实际得到什么结果完整报错信息相关代码文件路径和关键片段。比如我调用了 PUT /api/tasks/1请求体是 {completed: true} 但返回 422 错误报错信息显示 title 字段必填。 我的 TaskUpdate 中 title 是 Optional为什么还会校验这种情况下AI 往往能快速定位到是因为你在 Pydantic 模型中把title写成了必填或者前端传了空字符串。6. 工程化落地与团队推广建议单个项目跑通只是第一步把 AI Coding 引入团队日常开发还需要一套工程化约束。6.1 代码审查不能省略AI 生成的代码必须进入正常的 Code Review 流程。建议从这几个维度审查数据安全是否存在 SQL 注入、敏感信息泄露权限控制接口是否有越权风险异常处理数据库连接失败、外部服务超时是否有兜底事务完整性多步写入操作是否在一个事务内。另外不经过测试的 AI 代码不能直接合并到主干分支。即使是小项目也要至少保证接口能被调用、数据能正确持久化。6.2 用提示词模板沉淀团队经验AI Coding 工具可以沉淀提示词模板。团队可以把常用开发规范写成模板每次生成代码时带入。例如后端接口模板技术栈FastAPI SQLAlchemy 2.0。 命名风格PEP 8。 接口路径RESTful 风格动词功能用 PUT/POST/DELETE。 错误处理资源不存在返回 404参数错误返回 422。 日志使用标准 logging关键操作输出 INFO 日志。模板的好处是可以统一风格减少 AI 生成代码和现有代码风格不一致的问题。6.3 敏感信息与环境隔离不要让 AI 生成包含真实密码、Token、密钥的代码。生产环境的配置信息要放到环境变量或配置中心而不是硬编码在代码里。如果你使用公开的 AI 工具粘贴代码前先确认里面没有内部 IP、手机号、身份证号等敏感数据。6.4 数据库变更要走迁移脚本像上面的实战项目直接用create_all建表是没问题的。但项目上线后表结构总会调整这时就建议引入 Alembic 或类似迁移工具。AI 可以帮助生成迁移脚本但执行迁移前必须先在测试库验证并做好备份。6.5 设定合理的效率指标很多团队会问“AI Coding 提升了多少效率”但盲目统计代码行数很片面。更推荐跟踪这些指标需求从拆分到联调通过的时间单个需求产生的 Bug 数量代码 Review 中需要修改 AI 代码的轮次团队成员从“不会用 AI”到“能独立交付”的周期。这些指标比单纯对比“AI 写了多少行代码”更能反映真实产出。7. 下一步可以怎么练如果你刚开始接触 AI Coding不建议一上来就搭复杂系统。可以从一个小工具开始比如用 FastAPI 或 Spring Boot 做一个个人博客后台用 Python 写一个批量文件重命名工具用前端框架生成一个数据报表页面给自己项目写一套自动化测试用例。练习的时候始终用 Do Work Skill Solution 的四步流程构建上下文、拆解任务、验证闭环、人工审查。你会发现同一个 AI 工具在使用者具备这套方法后产出代码的可用率会有明显提升。AI Coding 的生态还在快速变化几乎每个月都有新工具和新玩法出现。今天文章里的工具选型和版本信息可能过几个月就需要更新但“清晰描述问题、小步验证、严格审查”这套底层方法短期内不会过时。真正值得投入的不是追逐每一个新工具而是把 AI Coding 变成自己稳定的工程技能。如果这篇文章对你有帮助建议收藏备用按文中的实战流程自己动手跑一遍。遇到问题也欢迎在评论区把报错贴出来一起分析。