毕设开发中的典型痛点
每年 3 月,实验室的空气里都飘着同一种焦虑:选题。
大家嘴上挂着“校园服务”“智能推荐”“区块链+”这些热词,真到写开题报告时却集体卡壳——需求像雾,技术栈像迷宫,导师一问“核心创新点在哪”,只能尴尬地重复“就是更方便”。我去年带过的 8 组同学,有 5 组在期中检查前把原型推翻重来,原因高度一致:
- 需求拍脑袋:想到啥写啥,没有用户故事,也没有用例图,结果做到一半发现“二手交易”和“拍卖”逻辑打架。
- 技术选型盲盒:听说 Flutter 酷炫就 Flutter,听说 Vue 好找工作就 Vue,真到调用硬件传感器时才发现生态断层。
- 重复造轮子:登录、注册、图片上传、即时通讯,80% 时间耗在样板代码,留给核心业务不到 20%。
痛点总结成一句话——“写毕设像徒手挖运河,既缺地图,也缺铲子。”
主流 AI 开发工具对比
把铲子换成 AI,先挑一把顺手的。我把去年用过的 3 把“智能铲子”拉到同一条赛道:让它们在 30 分钟内,把一句话需求“做一个校园二手交易平台”拆成可执行的 RESTful 接口清单。
| 维度 | GitHub Copilot | Cursor | Amazon CodeWhisperer |
|---|---|---|---|
| 触发方式 | 行内补全 | 对话侧栏+行内补全 | 行内补全 |
| 上下文长度 | 1 文件+临近 20 行 | 全项目索引+手动@文件 | 1 文件 |
| 语言支持 | Python/JS/Go 等 | 同上 | Python/JS/Java |
| 价格 | 10$ / 月 | 20$ / 月 | 免费 |
| 亮点 | 写注释就能出代码 | 可追问、可回溯 | 内置安全扫描 |
| 槽点 | 容易“幻觉”写废代码 | 中文 Prompt 偶现乱码 | 提示存在感弱 |
实测结论:
- 验证阶段(拆需求、画时序)用 Cursor 最爽,能把自然语言直接转成 PlantUML。
- 骨架阶段(写 CRUD、DTO)用 Copilot 最快,tab 键按到飞起。
- 上线前再用 CodeWhisperer 跑一遍安全扫描,把硬编码密钥、SQL 注入扫出来,免费又安心。
一条需求到 API 骨架的完整演练
下面用“校园二手交易平台”走一遍工程化流程,语言选 Python 3.11 + FastAPI,AI 工具选 Cursor + Copilot 组合拳。
1. 需求澄清:用 Cursor 生成用户故事
Prompt:
“我是计算机大四学生,想做一个校园二手交易小程序,请输出 5 条最核心、可落地的用户故事,用‘作为…想要…以便…’格式,并给出验收条件。”
Cursor 返回:
- 作为卖家,想要发布闲置图书,以便快速回血。
- 验收:填写书名、价格、上传 1-9 张图片,点击发布后可在列表页立即看到。
- 作为买家,想要按书名搜索,以便找到最低价的教材。
- 验收:搜索框实时响应,结果在 500 ms 内返回,支持拼音模糊匹配。
- ……
把故事贴进 README.md,Copilot 会自动识别,并在后续代码里提示对应字段,需求与代码双向绑定,比纯文档靠谱。
2. 架构草图:让 AI 画 C4 容器图
继续问 Cursor:
“把上面故事转成 C4 容器图,用 PlantUML 语法输出,包含小程序、API、MySQL、Redis。”
30 秒后得到 plantuml 源码,粘进 VS Code 插件瞬间生成图,答辩 PPT 素材直接白嫖。
3. 代码骨架:一键生成 RESTful 模板
在main.py里写一行注释:
# TODO: RESTful skeleton for second-hand book: CRUD, pydantic model, async sqlalchemyCopilot 立刻给出:
from fastapi import FastAPI, HTTPException, Depends from sqlalchemy.ext.asyncio import AsyncSession from pydantic import BaseModel, Field from datetime import datetime import uuid app = FastAPI() class BookCreate(BaseModel): title: str = Field(..., min_length=1, max_length=128) price: float = Field(..., gt=0, le=9999) images: list[str] = Field([], max_items=9) class BookDB(BookCreate): id: str created_at: datetime # 依赖注入 async def get_db() -> AsyncSession: async with AsyncSessionLocal() as session: yield session @app.post("/books", response_model=BookDB, status_code=201) async def create_book(payload: BookCreate, db: AsyncSession = Depends(get_db)): book = BookDB(id=str(uuid.uuid4()), created_at=datetime.utcnow(), **payload.dict()) db.add(book) await db.commit() return book要点解释
- 用 Pydantic 做字段校验,前端传脏数据直接 422。
- 依赖注入把数据库会话和路由解耦,后续单测 mock 极方便。
- 返回模型与数据库模型分离,DTO 变动不影响库表,毕设后期加字段不翻车。
再让 Cursor 补一条“搜索”接口:
@app.get("/books", response_model=list[BookDB]) async def search_books(q: str = "", db: AsyncSession = Depends(get_db)): stmt = select(BookDB).where(BookDB.title.contains(q)).limit(20) return (await db.execute(stmt)).scalars().all()全程 10 分钟,CRUD + 搜索骨架到位,剩下就是业务润色。
AI 生成代码的三道坎
1. 幂等性保障
AI 喜欢随手uuid.uuid4(),但订单支付这类接口必须幂等。解决:让 Cursor 生成前先写注释“# 幂等键由调用方传 order_sn”,Copilot 就会用外部单号做主键,把随机生成代码转成确定性逻辑。
2. 安全边界
Copilot 曾自动补全:
STRIPE_KEY = "sk_live_xxxxxxxxxxxxx"一旦提交到 GitHub 公开库,秒变“慈善捐款”。强制本地 pre-commit 钩子 + CodeWhisperer 扫描,把含 live_、sk_、password 的正则拦住,AI 背锅前先让机器自检。
3. 冷启动延迟
FastAPI 首次启动时,Copilot 注入的from transformers import pipeline会拖 3 s 启动时间。策略:把重模型放独立微服务,主服务只保留接口调用,用 Docker-Compose 的depends_on控制顺序,毕设演示不卡壳。
生产环境避坑指南
模型幻觉校验
让 AI 写复杂 SQL 时,先用 explain 跑一遍,成本由数据库而不是答辩老师指出。版本回溯策略
每生成一个模块即刻git add -p,把 AI 产出和人类修改分提交,回滚时精准到行。提交规范
在.gitmessage里加模板:[AI] <scope>:简述 - Prompt:xxx - Model:cursor-v1 - Human-Review:passed方便导师查记录,也逼自己二次 Review。
结语:把 AI 当搭档,不是当枪手
走完上面的流程,我把原本 6 周的骨架编码压到 4 晚,省下的时间全花在用户访谈与压测上,最后答辩时现场搜书 300 ms 返回,老师点头“能落地”。AI 不是来替你毕业,而是把挖运河的铲子换成挖掘机,让你把精力花在真正的“坡度设计”上。
如果你也在选题期挣扎,不妨打开 Cursor,把最头疼的一句需求扔进去,让 AI 先跑 30 分钟,你再决定要不要重构。人机协作的软件工程新范式,就从你的毕设开始。