乐于分享
好东西不私藏

AI 编程助手能改代码,但项目跑不起来

AI 编程助手能改代码,但项目跑不起来

今天上午,我们把一个很小的需求交给 AI 编程助手:补两组单测,修一处 lint,再把接口返回字段同步到前端页面。

需求本身不难。真正卡住的是第一步。

它按 README 执行 npm test,提示 Node 版本不对;换到 Python 服务跑 pytest,又缺系统依赖;页面改完想跑 E2E,Playwright 浏览器依赖不完整;接口测试依赖 Postgres 和 Redis,但这两个服务一直是同事手工在本机开着。

看起来是 AI 没把任务做完,实际是项目环境先把它拦住了。

这件事很容易被低估。以前新人接项目,环境跑不起来还能问旁边同事一句:“这个库是不是要先装?”“Redis 端口是不是改过?”“第一次启动是不是要先 migrate?”但 AI 编程助手能看到的只有仓库、配置、命令和日志。

如果环境没有写给机器看,它就只能在错误里打转。

第一次误判:以为是模型不行

刚开始大家的反应很自然:是不是提示词写得不够清楚?是不是应该把任务拆得更细?是不是 AI 对业务上下文理解不够?

后来把日志摊开看,问题并不在业务代码。

现场现象
表面判断
真正断点
npm test
 失败
AI 改坏了测试
Node 版本和本机不一致
pytest
 报错
Python 依赖没装好
缺系统库和编译工具
E2E 跑不起来
页面逻辑有问题
Playwright 浏览器依赖缺失
接口测试连不上
服务代码异常
Postgres/Redis 没有稳定启动
CI 和本机结果不同
AI 修改不稳定
环境变量和启动顺序不一致

这张表里没有一个问题属于“模型不会写代码”。它们都是开发环境没有工程化。

AI 编程助手进入团队后,真正改变的是执行方式:它不只是给建议,而是会读代码、改文件、跑命令、根据测试结果继续修。只要它开始运行命令,团队里原本靠经验维持的环境细节就会变成硬门槛。

环境要从“人能理解”变成“机器能复现”

过去 README 写给人看,很多步骤可以含糊一点。

比如“安装依赖后启动项目”,人会知道先切 Node 版本;比如“启动数据库”,人会想起本机已经有一个 Postgres;比如“跑 E2E”,人会知道浏览器依赖之前装过。

但对 AI 来说,这些都不是信息。它只会按显式步骤执行。

所以团队要让 AI 编程助手稳定接任务,第一步不是研究更复杂的提示词模板,而是把最小开发环境固定下来:

要固定的东西
应该落到哪里
目的
语言版本
Dev Container / Dockerfile
不让本机版本影响结果
系统依赖
Dockerfile
避免 native module、浏览器依赖缺失
数据库和缓存
Docker Compose
不靠同事手工启动
环境变量
.env.example
新环境能按同一组变量启动
测试入口
package.json
 / Makefile
AI 能明确判断成功和失败
镜像入口
固定 tag + 预检
不让任务卡在拉镜像阶段

一句话:把“只有老同事知道”的步骤,写成机器能执行的配置。

先准备一个最小可用环境

这不是要把开发环境做得很重。真正需要的是“最小可复现”。

例如一个 Node 项目,可以先从这样的 devcontainer.json 开始:

{
  "name": "ai-ready-dev",
  "image": "docker.1ms.run/node:22-alpine",
  "forwardPorts": [3000],
  "postCreateCommand": "npm ci"
}

如果项目依赖数据库、缓存、对象存储,就不要只写在 README 里。直接用 Compose 把依赖服务声明出来:

services:
  app:
    image: docker.1ms.run/node:22-alpine
  postgres:
    image: docker.1ms.run/postgres:16
  redis:
    image: docker.1ms.run/redis:7

这段配置不是生产部署,也不是完整模板。它的意义是让开发者、AI 编程助手和 CI 至少站在同一套环境描述上。

给 AI 派任务前,先跑环境预检

我们后来把“让 AI 改代码”前置成两步:

第一步,先确认环境能起来。

第二步,再让它改业务逻辑。

环境预检可以很简单:

docker compose -f compose.dev.yaml pull
docker compose -f compose.dev.yaml up -d
npm run lint
npm test

如果这几步不过,就不要急着让 AI 继续改代码。先把错误归类:是镜像没拉下来,依赖没装上,服务没 healthy,还是测试本身失败。

在镜像供应链这一层,我会先把常用基础镜像固定 tag 后预拉一遍:

docker pull docker.1ms.run/node:22-alpine
docker pull docker.1ms.run/python:3.12-slim
docker pull docker.1ms.run/postgres:16
docker pull docker.1ms.run/redis:7

毫秒镜像(1ms.run)适合放在这里:它解决的是开发容器、依赖服务和测试运行时镜像能不能稳定拉下来。它不是 AI 编程工具,也不替代测试、代码审查和权限边界。

这个边界要讲清楚。否则文章很容易写偏,好像用了某个镜像入口,AI 就能自动交付。事实不是这样。镜像预检只是在任务开始前排掉基础设施噪音,让后续失败更容易定位到真正的代码问题。

一张给团队的检查表

如果团队准备让 AI 编程助手开始接小任务,可以先检查这 10 项:

检查项
合格标准
语言版本
仓库里能看出 Node/Python/Go/Java 版本
系统依赖
不依赖某台电脑上“刚好装过”
依赖服务
Postgres、Redis、MinIO 等能一键拉起
healthcheck
服务是否 ready 有明确判断
环境变量
.env.example
 覆盖必要变量
迁移命令
数据库 migrate / seed 有固定入口
测试命令
单测、集成测试、E2E 分层清楚
lint 命令
一条命令可执行,失败输出明确
镜像 tag
基础镜像不长期使用 latest
失败归因
能区分环境失败和业务失败

这张表比“提示词怎么写”更基础。

因为 AI 编程助手不是一个坐在你旁边的新同事。它没有你们团队的口头经验,也不知道哪台机器上曾经装过什么。你不给它可复现环境,它就会在第一步反复撞墙。

结论

AI 编程助手进入团队后,最先要标准化的不是提示词,而是开发环境。

让它能用同一套容器跑起项目、拉起依赖服务、执行测试和 lint,后面才谈得上让它改接口、补测试、修页面、提 PR。

环境越靠口口相传,AI 越像“不好用”;环境越能被配置、命令和日志表达,AI 越有机会真正参与工程交付。

这就是今天这篇文章想说的核心:AI 要先跑起来,才能谈写得好不好。

相关学习资料