阅读视图

发现新文章,点击刷新页面。
🔲 ☆

薄驾驭,厚技能:YC 掌门人揭秘拉开 1000 倍效率差距的 AI 工程化心法

本文永久链接 – https://tonybai.com/2026/04/19/thin-harness-fat-skills

大家好,我是Tony Bai。

在过去一年,你有没有想过,为什么同样用着 GPT 或 Claude 等大模型以及Claude Code这样的Coding Agent,有的人生产力只提升了 2 倍,而有的人却能爆发出 100倍、甚至 1000倍 的惊人能量?

就在前几天,硅谷创投界的大佬、Y Combinator 的 CEO Garry Tan,发表了一篇阅读量高达 70万+ 的长文,极其犀利地揭开了这个“效率鸿沟”背后的残酷真相。

他引用了 Google 前员工 Steve Yegge 的一个惊人论断:

“使用 AI 智能体(Agent)的人,比现在用 Cursor 和聊天窗口的人效率高 10-100 倍,比 2005 年的 Google 工程师效率高 1000 倍。”

Garry Tan 写道:“这不是吹牛,我亲眼见过,我亲身经历过。”

他甚至爆出一个猛料:2026 年 3 月 31 日,Anthropic 意外地将 Claude Code 的全部 51.2 万行源码泄露到了 npm 仓库。他读完了。

“这次泄露证实了我在 YC 一直教导的东西:秘密根本不在大模型本身,而在那个包裹着模型的‘驾驭层(Harness)’!

今天,我们就来读读 Garry Tan 这篇文章,看看硅谷最顶尖的玩家,是如何通过 “薄驾驭,厚技能(Thin Harness, Fat Skills)” 的架构哲学,来榨干大模型的每一滴潜能的。

你的“胖驾驭”,正在杀死你的 AI

在文章的开头,Garry Tan 就毫不客气地指出了当下大多数 Agent 框架的“原罪”:臃肿的驾驭层,和孱弱的技能。

我们大多数人是怎么做的?我们给 AI 挂载了 40 多个 Tool Calls,每一个工具都对应一个外部 API。结果就是,光是这些工具的定义,就吃掉了上下文窗口(Context Window)的一半!

大模型每次行动前,都要在几十个工具中艰难地做选择题,不仅推理速度慢得像乌龟,出错率更是高得离谱。

Garry Tan 给出的架构哲学恰恰相反:

推崇“薄驾驭(Thin Harness)”:驾驭层(Harness)只做四件事——循环运行模型、读写文件、管理上下文、执行安全策略。代码量可能只有 200 行。
推崇“厚技能(Fat Skills)”:将所有复杂的业务逻辑、判断力、领域知识,全部封装成一个个可复用、可参数化的 Markdown 文件,即“技能(Skill)”。

“反面教材就是一个臃肿的驾驭层,配上一堆孱弱的技能。……你想要的是专为特定目的打造的、快速且狭窄的工具。”

五大心法:从“写 Prompt”到“编程 AI”

Garry Tan 认为,大模型的瓶颈从来不是智商。它天生就会推理、综合、写代码。它之所以频繁失败,是因为它不理解你的数据、你的规范、你问题的具体形态。

而下面这五个定义,正是修复这个问题的“架构级补丁”,也是“薄驾驭,厚技能”哲学的具体体现。

心法一:技能文件(Skill Files)—— 用 Markdown 写“方法调用”

这是最颠覆认知的一点。Garry Tan 认为,优秀的 Skill 文件,工作起来就像一个函数调用(Method Call)。它接受参数,并且根据不同的参数,产生完全不同的能力。

他举了一个名为 /investigate 的技能为例。这个 Skill 只有 7 个步骤:圈定数据集、构建时间线、标注文档、综合信息、正反方辩论、引用来源。

  • 当你把这个 Skill 指向一个安全科学家的 210 万封邮件,它就变成了一个医学研究分析师
  • 当你把它指向一家空壳公司和 FEC 的文件,它就变成了一个法务调查员

“这根本不是提示词工程。这是软件设计。你用 Markdown 作为编程语言,用人类的判断力作为运行时。”

心法二:解析器(Resolvers)—— AI 的“智能路由表”

技能文件告诉模型“怎么做”,而解析器告诉模型“在什么时候,加载什么上下文”。

Garry Tan 坦白,他自己曾经写过一个长达 20000 行的 CLAUDE.md 文件,里面塞满了各种他遇到过的奇技淫巧。结果导致模型注意力严重下降,甚至 Claude 自己都“告诉”他让他删掉点。

最终的解决方案,是把这个巨大的文件,拆成了一个只有 200 行的“指针”文件,和一个解析器(Resolver)

“当一个开发者改了代码,没有解析器,他直接提交了。有了解析器,模型会先去读取 docs/EVALS.md,这个文件说:先跑评测套件,对比分数,如果准确率下降超过 2%,就回滚并调查。”

解析器就像一个智能的“路由表”,在不污染上下文的情况下,按需加载最精准的知识。

心法三:潜在空间 vs. 确定性—— 别让 AI 做数学题

这是 Agent 设计中最常见的错误:让 AI 去做它不擅长的事。

  • 潜在空间(Latent Space):这是 AI 的主场。它负责阅读、理解、判断、综合、模式识别。
  • 确定性(Deterministic):这是传统代码的主场。SQL 查询、代码编译、数学计算。

“一个 LLM 可以帮你安排 8 个人的晚宴座位,它会考虑每个人的性格和社交关系。但你让它去排 800 个人的座位,它会幻觉出一个看似合理、但完全错误的座位表。因为这是一个确定性的组合优化问题,应该交给传统算法。”

最牛逼的系统,对这条边界的划分是冷酷无情的。

心法四:倾向分析 —— 让 AI 拥有“判断力”

这是让 AI 从“数据库”进化为“分析师”的关键一步。

倾向分析,就是让模型读取关于一个主题的所有信息,然后写出一份结构化的、浓缩了判断力的简介。

Garry Tan 以 YC 内部正在构建的、管理 6000 名创始人的 AI 系统为例:

传统的关键词搜索,根本无法发现一个伪装成“可观测性”工具的 FinOps 项目。

但通过倾向分析,AI 读取了创始人的所有 GitHub 提交、访谈记录、公开帖子后,会给出一个惊人的洞察:

“创始人:Maria Santos。公司:Contrail。声称在做:‘给 AI Agent 用的 Datadog’。实际在做: 80% 的代码都在写账单模块。她其实在做一个伪装成可观测性的 FinOps 工具。”

这种“判断力”,是任何 RAG 管道都无法产生的。模型必须真正地去“阅读”和“思考”。

心法五:技能即永久升级

这是 Garry Tan 架构哲学的最终闭环。

他给自己团队的 AI Agent 下了一条铁命令:

“你绝不被允许做一次性的工作。如果我让你做一件事,而这件事未来可能需要再做一遍,你必须:第一次手动在 3-10 个样本上完成它,把结果给我看。如果我批准了,你就必须把这个过程固化成一个 Skill 文件。如果它应该自动运行,就把它加到定时任务里。测试标准:如果我需要为同一件事第二次开口,你就失败了。”

每一次你写下的 Skill,都是对你的 AI 系统的一次永久性升级。它永不衰退,永不遗忘。当下一代更强的模型发布时,你所有的 Skill 都会在一夜之间变得更聪明。

小结

Garry Tan 的这篇文章,为所有在 AI 时代感到迷茫的开发者,提供了一套极具实操性的架构蓝图。

它告诉我们,当大模型的能力趋于同质化时,真正的护城河,不在于你拥有哪个模型的 API 访问权限,而在于你为这个模型构建了怎样一个高效、智能、且能源源不断自我进化的“外部大脑”。

这个“大脑”,就是你沉淀下来的“厚技能(Fat Skills)”资产。

不要再沉迷于寻找那些能一键生成整个项目的“魔法按钮”了。慢下来,像一个真正的软件设计师一样,去思考你的流程、你的判断、你的领域知识。然后,把它们一一固化成 Markdown。

构建一次,它将永远为你运行。

资料链接:https://x.com/garrytan/status/2042925773300908103


今日互动探讨:

看完 YC 掌门人的这套“薄驾驭,厚技能”心法,你对自己目前开发 Agent 的方式有什么新的反思?你认为用 Markdown 来“编程”AI 的想法,是天才还是异端?

欢迎在评论区分享你的看法!


还在为“复制粘贴喂AI”而烦恼?我的新专栏 AI原生开发工作流实战 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


原「Gopher部落」已重装升级为「Go & AI 精进营」知识星球,快来加入星球,开启你的技术跃迁之旅吧!

我们致力于打造一个高品质的 Go 语言深度学习AI 应用探索 平台。在这里,你将获得:

  • 体系化 Go 核心进阶内容: 深入「Go原理课」、「Go进阶课」、「Go避坑课」等独家深度专栏,夯实你的 Go 内功。
  • 前沿 Go+AI 实战赋能: 紧跟时代步伐,学习「Go+AI应用实战」、「Agent开发实战课」、「Agentic软件工程课」、「Claude Code开发工作流实战课」、「OpenClaw实战分享」等,掌握 AI 时代新技能。
  • 星主 Tony Bai 亲自答疑: 遇到难题?星主第一时间为你深度解析,扫清学习障碍。
  • 高活跃 Gopher 交流圈: 与众多优秀 Gopher 分享心得、讨论技术,碰撞思想火花。
  • 独家资源与内容首发: 技术文章、课程更新、精选资源,第一时间触达。

衷心希望「Go & AI 精进营」能成为你学习、进步、交流的港湾。让我们在此相聚,享受技术精进的快乐!欢迎你的加入!

img{512x368}


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。

© 2026, bigwhite. 版权所有.

🔲 ☆

Promise.try()和Promise.withResolvers()作用速览

by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=12048
本文可全文转载,但需要保留原作者、出处以及文中链接,AI抓取保留原文地址,任何网站均可摘要聚合,商用请联系授权。

本文介绍两个Promise相关的新特性。

一、Promise.try()的作用

之前我们运行一段代码,或者一个函数,想要捕获错误的时候,往往使用的是try...catch(),对吧。

但是try...catch()呢有个小问题,那就是如果里面有异步操作,如 setTimeout、Promise 内部,那么这个错误就捕获不了。

Promise.try()的作用之一就是统一同步与异步错误处理。

例如:

try {
  new Promise(resolve => resolve(callback());
} catch (e) {
  // 错误提示
}

如果这里的callback是异步的,那么上面的实现是无法捕获错误的。

但是下面的可以:

Promise.try(callback)
  .then(result => console.log(result))
  .catch(error => console.log(error))
  .finally(() => console.log("All settled."));

//zxx: 如果使用 async/await 语法,请不要使用 Promise.try,而应改用 try/catch/finally 块

更新于2026年1月26日

Promise.try()也不能捕获setTimeout内部的错误,除非在 setTimeout 内部返回 Promise

Promise.try() 只能捕获同步执行或返回 Promise 的异步错误,但 setTimeout 会创建一个新的执行上下文。

// ❌ 无法捕获
Promise.try(() => {
  setTimeout(() => {
    throw new Error('这个错误无法被捕获');
  }, 1000);
}).catch(err => {
  console.log('永远不会执行', err);
});

// setTimeout 的回调在 Promise 已经 resolve 之后才执行

具体见下表:

场景 Promise.try() 能否捕获
同步错误 ✅ 可以
返回的 Promise 错误 ✅ 可以
setTimeout 内部错误 ❌ 不可以
setInterval 内部错误 ❌ 不可以
事件回调内部错误 ❌ 不可以

二、Promise.try()的语法

语法使用示意如下:

Promise.try(func)
Promise.try(func, arg1)
Promise.try(func, arg1, arg2)
Promise.try(func, arg1, arg2, /* …, */ argN)

会返回一个 Promise,其状态可以是:

  • 已兑现的,如果 func 同步地返回一个值。
  • 已拒绝的,如果 func 同步地抛出一个错误。
  • 异步兑现或拒绝的,如果 func 返回一个 promise。

如果回调函数有参数,该怎么办?您可以通过以下两种方式之一来处理此问题:

// 创建了额外的闭包,但是也是可以运行的
Promise.try(() => callback(param1, param2));

// 不创建闭包,同样可以运行
Promise.try(callback, param1, param2);

更推荐使用后面的用法。

兼容性

目前所有现代浏览器都已经支持了,兼容性还是不错的,不支持的浏览器也可以引入polyfill进行兼容。

Promise.try()兼容性

三、Promise.withResolvers()的作用

Promise.withResolvers() 是 ECMAScript 2024 中新增的一个静态方法,其核心作用是将 Promise 的创建与其状态控制(resolve 和 reject)解耦,允许开发者同时获得一个新的 Promise 实例以及与其绑定的、用于控制其状态的函数。

使用示意:

function createControllablePromise() {
  // 返回 { promise, resolve, reject }
  return Promise.withResolvers();
}

const { promise, resolve, reject } = createControllablePromise();

// 2秒后手动 resolve
setTimeout(() => {
  resolve('成功了!');
}, 2000);

promise.then(result => {
  console.log(result); // 应该输出: 成功了!
});

对比案例

传统实现:

function withTimeout(asyncOperation, timeoutMs) {
  // 必须预先声明变量,用于在外部存储控制函数
  let resolveRef, rejectRef;

  // 创建控制超时的Promise
  const timeoutPromise = new Promise((resolve, reject) => {
    // 在构造函数内部,将内部的resolve和reject赋值给外部变量
    resolveRef = resolve;
    rejectRef = reject;

    // 设置超时定时器
    setTimeout(() => {
      reject(new Error(`操作超时,超过 ${timeoutMs}ms`));
    }, timeoutMs);
  });

  // 执行实际的异步操作
  asyncOperation()
    .then((result) => {
      // 异步操作成功,手动解决超时Promise
      resolveRef(result);
    })
    .catch((error) => {
      // 异步操作失败,手动拒绝超时Promise
      rejectRef(error);
    });

  // 返回这个受超时控制的Promise
  return timeoutPromise;
}

改为使用Promise.withResolvers()方法后:

function withTimeout(asyncOperation, timeoutMs) {
  // 一行代码同时获得Promise实例及其控制函数
  const { promise, resolve, reject } = Promise.withResolvers();

  // 设置超时定时器
  setTimeout(() => {
    reject(new Error(`操作超时,超过 ${timeoutMs}ms`));
  }, timeoutMs);

  // 执行实际的异步操作
  asyncOperation()
    .then((result) => {
      // 异步操作成功,解决Promise
      resolve(result);
    })
    .catch((error) => {
      // 异步操作失败,拒绝Promise
      reject(error);
    });

  // 返回Promise
  return promise;
}

可以看到Promise.withResolvers()的实现代码更加简洁,此API特别适用于事件监听、流处理、队列管理、超时控制等高级异步场景。

兼容性

Promise.withResolvers()方法的的兼容性要比Promise.try()更好一些,支持更早一些,如下截图所示。

兼容性

已经快要可以放心使用了。

四、结语说明

本文介绍的两个特性都属于语法层面增强的特性,通过提供更优雅的语法,显著提升了代码的可读性、可维护性。它代表了 JavaScript 异步编程向更简洁、更直观方向演进的重要一步。

实际上,在我看来,目前很多前端特性是过盛的。

每年前端领域的新特性没有100也有80,但是在生产环境使用的,寥寥无几。

等以后AI盛行之后,更回事如此,因为AI所使用的技术实现,一定是传统的,稳健的实现方式。

所谓的更高效更简洁,很难反应到真实生产环境中。

所以,目前来看,个体的学习还是不能停止的。

好啦,就这样吧。

感谢阅读,欢迎交流!

感谢

本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址:https://www.zhangxinxu.com/wordpress/?p=12048

(本篇完)

🔲 ☆

Promise.try()和Promise.withResolvers()作用速览

by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=12048
本文可全文转载,但需要保留原作者、出处以及文中链接,AI抓取保留原文地址,任何网站均可摘要聚合,商用请联系授权。

本文介绍两个Promise相关的新特性。

一、Promise.try()的作用

之前我们运行一段代码,或者一个函数,想要捕获错误的时候,往往使用的是try...catch(),对吧。

但是try...catch()呢有个小问题,那就是如果里面有异步操作,如 setTimeout、Promise 内部,那么这个错误就捕获不了。

Promise.try()的作用之一就是统一同步与异步错误处理。

例如:

try {
  new Promise(resolve => resolve(callback());
} catch (e) {
  // 错误提示
}

如果这里的callback是异步的,那么上面的实现是无法捕获错误的。

但是下面的可以:

Promise.try(callback)
  .then(result => console.log(result))
  .catch(error => console.log(error))
  .finally(() => console.log("All settled."));

//zxx: 如果使用 async/await 语法,请不要使用 Promise.try,而应改用 try/catch/finally 块

更新于2026年1月26日

Promise.try()也不能捕获setTimeout内部的错误,除非在 setTimeout 内部返回 Promise

Promise.try() 只能捕获同步执行或返回 Promise 的异步错误,但 setTimeout 会创建一个新的执行上下文。

// ❌ 无法捕获
Promise.try(() => {
  setTimeout(() => {
    throw new Error('这个错误无法被捕获');
  }, 1000);
}).catch(err => {
  console.log('永远不会执行', err);
});

// setTimeout 的回调在 Promise 已经 resolve 之后才执行

具体见下表:

场景 Promise.try() 能否捕获
同步错误 ✅ 可以
返回的 Promise 错误 ✅ 可以
setTimeout 内部错误 ❌ 不可以
setInterval 内部错误 ❌ 不可以
事件回调内部错误 ❌ 不可以

二、Promise.try()的语法

语法使用示意如下:

Promise.try(func)
Promise.try(func, arg1)
Promise.try(func, arg1, arg2)
Promise.try(func, arg1, arg2, /* …, */ argN)

会返回一个 Promise,其状态可以是:

  • 已兑现的,如果 func 同步地返回一个值。
  • 已拒绝的,如果 func 同步地抛出一个错误。
  • 异步兑现或拒绝的,如果 func 返回一个 promise。

如果回调函数有参数,该怎么办?您可以通过以下两种方式之一来处理此问题:

// 创建了额外的闭包,但是也是可以运行的
Promise.try(() => callback(param1, param2));

// 不创建闭包,同样可以运行
Promise.try(callback, param1, param2);

更推荐使用后面的用法。

兼容性

目前所有现代浏览器都已经支持了,兼容性还是不错的,不支持的浏览器也可以引入polyfill进行兼容。

Promise.try()兼容性

三、Promise.withResolvers()的作用

Promise.withResolvers() 是 ECMAScript 2024 中新增的一个静态方法,其核心作用是将 Promise 的创建与其状态控制(resolve 和 reject)解耦,允许开发者同时获得一个新的 Promise 实例以及与其绑定的、用于控制其状态的函数。

使用示意:

function createControllablePromise() {
  // 返回 { promise, resolve, reject }
  return Promise.withResolvers();
}

const { promise, resolve, reject } = createControllablePromise();

// 2秒后手动 resolve
setTimeout(() => {
  resolve('成功了!');
}, 2000);

promise.then(result => {
  console.log(result); // 应该输出: 成功了!
});

对比案例

传统实现:

function withTimeout(asyncOperation, timeoutMs) {
  // 必须预先声明变量,用于在外部存储控制函数
  let resolveRef, rejectRef;

  // 创建控制超时的Promise
  const timeoutPromise = new Promise((resolve, reject) => {
    // 在构造函数内部,将内部的resolve和reject赋值给外部变量
    resolveRef = resolve;
    rejectRef = reject;

    // 设置超时定时器
    setTimeout(() => {
      reject(new Error(`操作超时,超过 ${timeoutMs}ms`));
    }, timeoutMs);
  });

  // 执行实际的异步操作
  asyncOperation()
    .then((result) => {
      // 异步操作成功,手动解决超时Promise
      resolveRef(result);
    })
    .catch((error) => {
      // 异步操作失败,手动拒绝超时Promise
      rejectRef(error);
    });

  // 返回这个受超时控制的Promise
  return timeoutPromise;
}

改为使用Promise.withResolvers()方法后:

function withTimeout(asyncOperation, timeoutMs) {
  // 一行代码同时获得Promise实例及其控制函数
  const { promise, resolve, reject } = Promise.withResolvers();

  // 设置超时定时器
  setTimeout(() => {
    reject(new Error(`操作超时,超过 ${timeoutMs}ms`));
  }, timeoutMs);

  // 执行实际的异步操作
  asyncOperation()
    .then((result) => {
      // 异步操作成功,解决Promise
      resolve(result);
    })
    .catch((error) => {
      // 异步操作失败,拒绝Promise
      reject(error);
    });

  // 返回Promise
  return promise;
}

可以看到Promise.withResolvers()的实现代码更加简洁,此API特别适用于事件监听、流处理、队列管理、超时控制等高级异步场景。

兼容性

Promise.withResolvers()方法的的兼容性要比Promise.try()更好一些,支持更早一些,如下截图所示。

兼容性

已经快要可以放心使用了。

四、结语说明

本文介绍的两个特性都属于语法层面增强的特性,通过提供更优雅的语法,显著提升了代码的可读性、可维护性。它代表了 JavaScript 异步编程向更简洁、更直观方向演进的重要一步。

实际上,在我看来,目前很多前端特性是过盛的。

每年前端领域的新特性没有100也有80,但是在生产环境使用的,寥寥无几。

等以后AI盛行之后,更回事如此,因为AI所使用的技术实现,一定是传统的,稳健的实现方式。

所谓的更高效更简洁,很难反应到真实生产环境中。

所以,目前来看,个体的学习还是不能停止的。

好啦,就这样吧。

感谢阅读,欢迎交流!

感谢

本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址:https://www.zhangxinxu.com/wordpress/?p=12048

(本篇完)

❌