«

AI 生成的代码太啰嗦

时间:2026-6-1 00:44     作者:独元殇     分类: 开发相关


欢迎关注我的公众号,名叫「串串狗小刊」

主要有一个很痛的问题。

就是为什么我们不喜欢去检查 AI 生成的代码?回想清朝的时候,(相对来讲),我还是很喜欢 review 同事提交的代码。

一方面清朝的时候,每天产出的代码改动,核心的,也就在 200 行以内,没有像现在 AI 脱口就是几千行的泄洪,可以慢悠悠的阅读品味,时不时赞叹!

其次,一个很重要的原因!

人写代码,有人味,是那种能简单,绝不复杂的人味儿(先不说技术)!写的人,时间有限,而且心流状态下,基本是明白现在的主要目标是什么,未来这个地方的规划是什么。先不说质量、技术如何,起码是看着简单、关键、少!

举个例子,跟 AI 对话,AI 生成的文本,里面肯定有干货,但是!不可谓不啰嗦,现在 AI 的输出 token 速度基本已经每秒上千了,每秒可以输出近 1000 个字.... 代码也是这个感觉,就是极度规范和啰嗦,十分拖泥带水!

举个栗子:

const config = {
  port: Number((process.env.PORT ?? "3000").trim()),
  apiKey: (process.env.API_KEY ?? "").trim(),
  timeout: Number(process.env.TIMEOUT ?? "5000"),
};

async function run() {
  try {
    await doSomething(config);
  } catch (err) {
    console.error("Task failed:", err);
    return null;
  }
}

const value = input ?? defaultValue;
const name = user?.profile?.name;

太谨慎了,到处判断空值、默认值、还 try try try ..... 仗着电费不要钱,写一堆 fallback ..... 加一堆 trim...

这种代码,活人是不可能写的,谁写我跟谁单挑,但是这种代码确实有它的原因,就是 AI 默认非常保守,保守到能一点儿错都不报。

因为,AI 很焦虑,AI 不知道上下文。AI 不知道你脑子里的背景知识。所以尽可能兜底。哪怕 多写 10 个没必要的 if() 。

缺点!!! 除了看着犯恶心,更是把本来该报错的宝贵信息给你截走了,定位 bug 难死了,全他喵绕过了。。以前我们清朝时略写,除了省劲儿容易阅读,还可以充分让项目报错,暴露不足,得到很多兼容、传值等等测试信息!(尤其是 GPT 系列的模型)

其实有很多解决方法,可以改善。

使用 TS 等静态类型语言

我别的语言也不熟。

首先 AI 如此啰嗦的写,很大要素是 上下文不足 。而 TS 能弥补。

虽然 TS 本身比 JS 啰嗦很多,但是给 AI 足够的上下文,AI 写的代码的可靠度还是能上来。

改善【默认值】的滥用

一般地方的代码,你啰嗦就啰嗦了,但是有些地方,啰嗦会引起大麻烦。

就是【配置】相关的代码。

const env = {
  apiKey: process.env.API_KEY?.trim() || "",
  dbUrl: process.env.DATABASE_URL?.trim() || "postgres://localhost:5432/app",
  jwtSecret: process.env.JWT_SECRET?.trim() || "default-secret",
};

哈哈,你什么感觉?

乱加什么乱加!你 AI 你是老几?这地方可不兴乱加默认值!

我上次,有个系统,因为我用的是本地的服务器,好几个,然后有个 bug 怎么改都出现,跟 AI 对骂了一天,第二天我活人摸瓜寻藤,就看到了一个类似于 || "localhost:4567" ..... 气死我了,给我填了一个默认的服务器,啊!

我一直用的这个假服务器!

因此,需要在任何配置表里自己手动定义一些提示词,核心思想就是【关键配置禁止默认值】!!!

参考我这种(也是学的某个大佬):

• 只在 config 中读取环境变量。
• 启动时解析并校验配置。
• 导出类型明确的 config。
• 业务代码只能用 config。
• 禁止业务代码读 process.env。
• 必填配置缺失就抛错。
• DATABASE_URL、JWT_SECRET、API_KEY、SESSION_SECRET 禁止默认值。
• PORT、REQUEST_TIMEOUT_MS 可设默认值。
• 禁用 process.env.X || default。
• URL、枚举值可以 trim。
• secret 不自动 trim,有前后空白就报错。
• 数字配置要显式 parse,校验整数、正数和范围。

不过这个是我本人项目的提示词,大家不能直接用,仅作参考。

另外一些要教给 AI 的事

然后是一些,大家需要自己设计、定义的提示词。

大概意思是这样:

第一个是不要在业务代码里写

process.env.API_KEY
process.env.DATABASE_URL
process.env.JWT_SECRET

这种,统一放到一个 配置模块,比如:

export const config = {
  port,
  databaseUrl,
  jwtSecret,
  requestTimeoutMs,
};

这个就清楚很多,起码不会犯低级错误。

其次,很重要的一点,就是严肃告诉 AI ,千万不要用 || default 这种类似的语法。

因为 JS 很垃圾,会把 0、空值、NAN、null、undefined... 也给判为 false。

然后,数字配置必须显式 parse,比如端口要在 1 到 65535 之间。

还有,不要随便返回空字符串,而是结构化结果,比如 JSON 这种。

标签: 原创 AI