[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fKzV0LuLmgGN-tNMeLTSnUsIz9YG5WWRMcdm8ypWAniA":3,"$fJU-4tot_gC5fDkujNeoE-cGsdMy5V_KcdUXLuAnTFgw":16,"$fN8Yp2eTtOgiN72t3OY0Y2O_W5ccDl7ZAweCvv05WNFw":423},{"slug":4,"title":5,"description":6,"content":7,"content_html":8,"pub_date":9,"tags":10,"draft":15},"karpathy-claude-code-guidelines","Karpathy 的 LLM 编码批评与 CLAUDE.md 最佳实践","基于 Andrej Karpathy 对 LLM 编程助手的观察，forrestchang 提炼出一个 CLAUDE.md 文件，4 条原则解决 AI 编码的典型失控问题：乱猜假设、过度设计、乱改代码、目标不清","# Karpathy 的 LLM 编码批评与 CLAUDE.md 最佳实践\n\nAndrej Karpathy 在 X（前 Twitter）上的一条帖子，催生了一个 107k stars 的 GitHub 仓库。\n\n[forrestchang\u002Fandrej-karpathy-skills](https:\u002F\u002Fgithub.com\u002Fforrestchang\u002Fandrej-karpathy-skills) 由 Jiayuan（forrestchang，同时是 Multica 项目作者）创建，将 Karpathy 对 AI 编程工具的犀利批评提炼成了四条 CLAUDE.md 规则。这个仓库的核心问题是：**为什么现在的 AI 编程助手总是让人抓狂？怎么修？**\n\n## Karpathy 为什么批评现在的 AI 编程工具\n\nKarpathy 不是在无脑批评，他本人就是 AI 领域最顶尖的工程师之一，曾在 OpenAI 担任研究科学家，也是特斯拉 Autopilot 的前负责人。他的批评来自真实的使用体验，每一条都戳在痛点上。\n\n他的原始帖子（@karpathy，推文 ID：2015883857489522876）中写道：\n\n> \"The models make wrong assumptions on your behalf and just run along with them without checking. They don't manage their confusion, don't seek clarifications, don't surface inconsistencies, don't present tradeoffs, don't push back when they should.\"\n\n翻译过来是：模型会替你做错误的假设，然后一路往下跑，也不检查。它们不管理自己的困惑，不主动寻求澄清，不指出矛盾，不呈现权衡，不在该抵抗的时候抵抗。\n\n这句话精准描述了我们都遇到过的场景：你给了一个模糊的需求，AI 没问你就开始写代码，写了一大堆，但方向错了。\n\n## 四个典型问题\n\nKarpathy 归纳了 AI 编程助手的几个核心问题：\n\n### 问题一：乱猜假设，不求确认\n\n> \"The models make wrong assumptions on your behalf and just run along with them without checking.\"\n\nLLM 非常擅长\"看起来在执行任务\"。当需求不清晰时，它不会停下来问，而是选择一个看起来合理的解释，然后全速运行。这种\"自信执行\"的风格在需求明确时是优点，在需求模糊时是灾难。\n\n### 问题二：过度设计，代码膨胀\n\n> \"They really like to overcomplicate code and APIs, bloat abstractions, don't clean up dead code... implement a bloated construction over 1000 lines when 100 would do.\"\n\nAI 有一种奇怪的本能：把简单的事情做复杂。100 行能解决的问题，它可能给你写 1000 行，附带一堆你没要求的抽象层、工厂模式、策略模式。这不是能力的体现，是认知过载的副产品——LLM 见过太多\"企业级代码\"，把复杂度当作质量的代理指标。\n\n### 问题三：误伤无关代码\n\n> \"They still sometimes change\u002Fremove comments and code they don't sufficiently understand as side effects, even if orthogonal to the task.\"\n\n这是最让开发者头疼的问题之一。你叫 AI 修一个 bug，它顺手删了几行注释、改了几个变量名，理由是\"优化了可读性\"。在代码库中这是极其危险的行为——你不知道哪些看起来无关的改动会引发连锁反应。\n\n### 问题四：目标不清，循环失控\n\nKarpathy 也看到了 LLM 的潜力所在：\n\n> \"LLMs are exceptionally good at looping until they meet specific goals... Don't tell it what to do, give it success criteria and watch it go.\"\n\nLLM 特别擅长\"为了达成目标反复迭代\"。但如果你给的是模糊的操作指令而不是清晰的成功标准，这个循环能力反而会变成失控的来源。\n\n## CLAUDE.md 四条原则逐一解析\n\nforrestchang 将 Karpathy 的观察提炼为四条可操作的规则，写进了一个 `CLAUDE.md` 文件。\n\n### 原则一：Think Before Coding（先想后写）\n\n**对应问题**：乱猜假设，不求确认\n\n**核心内容**：\n- 在写代码之前，显式声明你对任务的理解和假设\n- 如果存在歧义，**主动问清楚**，不要自己脑补\n- 列出多个可能的实现方案及其权衡，再决定用哪个\n\n这条规则改变了 LLM 的默认行为模式——从\"接到任务立刻执行\"变成\"先理解，再执行\"。\n\n实际上，这也是好的软件工程师的习惯：在键盘上敲第一行代码之前，先在脑子里（或者白板上）把问题想清楚。\n\n**效果**：让 AI 暴露它的假设，你可以在它走错之前纠正。\n\n### 原则二：Simplicity First（简单优先）\n\n**对应问题**：过度设计，代码膨胀\n\n**核心内容**：\n- 写最简单的能解决问题的代码\n- 不要实现没有被明确要求的功能\n- 不要添加未被要求的抽象层\n- 不要\"顺手\"重构\n\n这条规则直接对抗 LLM 的\"复杂化冲动\"。它的哲学来源是 YAGNI（You Aren't Gonna Need It）和 UNIX 哲学：每个模块只做一件事，做好这一件事。\n\n**效果**：得到更短、更直接的代码，更容易 review，更容易维护。\n\n### 原则三：Surgical Changes（外科手术式修改）\n\n**对应问题**：误伤无关代码\n\n**核心内容**：\n- 只修改任务直接要求修改的代码\n- 不要\"顺便\"修改看起来不相关的东西\n- 不要删除你没有完全理解的注释或代码\n- 如果发现了其他需要修改的地方，报告出来，不要自行修改\n\n\"外科手术式\"这个比喻很精准：外科医生做手术，只处理目标部位，绝对不会因为\"发现旁边有个不好看的地方\"就顺手切掉。\n\n**效果**：代码库的意外变动大幅减少，diff 更干净，review 更容易。\n\n### 原则四：Goal-Driven Execution（目标驱动执行）\n\n**对应问题**：目标不清，循环失控（以及正向利用 LLM 的循环能力）\n\n**核心内容**：\n- 把任务转化为**可验证的成功标准**\n- 给 LLM 目标，而不是步骤\n- 让它自主决定如何达成目标\n- 通过测试用例、断言、具体的输出格式来定义\"完成\"\n\n这条规则是四条中最反直觉的，也是最有力量的。\n\nKarpathy 说得很清楚：\"Don't tell it what to do, give it success criteria and watch it go.\"（不要告诉它做什么，给它成功标准，然后看它运行。）\n\n比较两种指令方式：\n\n**指令式（不推荐）**：\n> \"先读取 users 表，然后过滤出 active=true 的用户，然后按 created_at 排序，然后取前 10 条，然后格式化成 JSON...\"\n\n**目标式（推荐）**：\n> \"返回最近注册的 10 个活跃用户，格式为 JSON 数组，每个元素包含 id、name、email 字段。用 pytest 测试：给定测试数据库有 20 个用户（15 活跃），函数应返回长度为 10 的数组，且所有元素的 active 字段为 true。\"\n\n第二种方式利用了 LLM 的循环能力：它会不断尝试，直到写出通过测试的代码。\n\n**效果**：释放 LLM 的 agent 能力，同时用可验证的目标约束其行为。\n\n## 如何安装和使用\n\n### 方式一：Claude Code Plugin\n\n```bash\n\u002Fplugin marketplace add forrestchang\u002Fandrej-karpathy-skills\n```\n\n安装后，这些规则会自动注入到 Claude Code 的系统 prompt 中。\n\n### 方式二：单项目 CLAUDE.md\n\n在项目根目录添加 `CLAUDE.md` 文件：\n\n```bash\ncurl -o CLAUDE.md https:\u002F\u002Fraw.githubusercontent.com\u002Fforrestchang\u002Fandrej-karpathy-skills\u002Fmain\u002FCLAUDE.md\n```\n\nClaude Code 会自动读取项目根目录的 `CLAUDE.md`，将其内容作为额外的系统指令。\n\n### 方式三：Cursor 规则文件\n\n对于 Cursor 用户：\n\n```bash\nmkdir -p .cursor\u002Frules\ncurl -o .cursor\u002Frules\u002Fkarpathy-guidelines.mdc https:\u002F\u002Fraw.githubusercontent.com\u002Fforrestchang\u002Fandrej-karpathy-skills\u002Fmain\u002FCLAUDE.md\n```\n\nCursor 的 `.mdc` 规则文件和 CLAUDE.md 在功能上是等价的——都是\"给 AI 看的行为约束文件\"。\n\n## 和 anthropics\u002Fskills 的关系\n\n理解这两个仓库的关系，有助于更清晰地认识\"给 Claude 的指令文件\"这个生态：\n\n| | anthropics\u002Fskills | forrestchang\u002Fandrej-karpathy-skills |\n|--|--|--|\n| **目标** | 能力增强 | 行为约束 |\n| **内容** | 教 Claude 怎么做特定任务 | 规范 Claude 的编码行为模式 |\n| **类比** | 技能培训课程 | 职业道德准则 |\n| **适用范围** | 特定任务场景 | 所有编码任务 |\n\n两者都是\"给 Claude 的指令文件\"，但层次不同：\n- anthropics\u002Fskills 是**领域知识**：我要做 Web 测试，加载 `webapp-testing` skill\n- karpathy-skills 是**行为规范**：我在做任何编码任务，都应该遵守这四条原则\n\n两者可以叠加使用，互不冲突。\n\n## 为什么\"给成功标准\"比\"给指令\"更有效\n\nGoal-Driven Execution 是这套规则中最值得深入思考的部分。\n\n**指令式指导的问题**在于：它要求人类提前想好所有细节，然后把思维过程翻译成 AI 能理解的步骤序列。这既耗时，又容易出错——你的步骤描述一旦有歧义，AI 会按照它自己的理解执行，而不是你的意图。\n\n**目标式指导的优势**在于：\n1. **降低认知负担**：你只需要想清楚\"什么算完成\"，不需要想清楚\"怎么完成\"\n2. **利用 LLM 的规划能力**：LLM 其实很擅长把目标分解成步骤，这是它的强项\n3. **可验证性**：成功标准是客观的，测试要么通过要么不通过，没有\"差不多完成\"\n\n这和 OKR 的思路很像：定义关键结果（Key Results），而不是指定行动步骤（Action Items）。\n\n## 踩坑提醒\n\n这套规则非常有用，但有几个需要注意的地方：\n\n**1. 偏保守，简单任务不必全套用**\n\n\"Think Before Coding\"要求 AI 先列出假设和方案，对于简单任务会显得冗余。如果你只是要它写一个格式化日期的工具函数，直接要结果更高效。\n\n**2. \"Surgical Changes\"可能让 AI 错过明显问题**\n\n有时候你叫 AI 修 bug，顺路发现了一个明显的代码质量问题，但\"Surgical Changes\"原则会让它保持沉默。解决办法是：在任务描述中加一句\"如果你发现其他潜在问题，请报告但不要自行修改\"。\n\n**3. 目标式指导需要你能描述\"成功\"**\n\nGoal-Driven Execution 的前提是你知道什么是成功。如果你自己也不确定想要什么结果（探索性任务），这条原则就不太适用。\n\n**4. 不同工具的支持程度不同**\n\n这套规则最适合 Claude Code，因为 Claude Code 原生支持 `CLAUDE.md`。在 ChatGPT、Gemini 等工具中使用，需要手动复制粘贴规则内容到 system prompt。\n\n---\n\nKarpathy 的批评和 forrestchang 的 CLAUDE.md 提醒我们：**工具的能力和工具的行为是两回事**。LLM 已经具备了强大的编码能力，但如果没有正确的行为约束，这个能力就像一辆没有方向盘的赛车——跑得很快，但不知道会撞到哪里。\n\n四条原则的本质是：**把 AI 从\"急于完成任务的执行者\"变成\"谨慎推理的协作者\"**。这不是限制 AI 的能力，而是让能力发挥在正确的方向上。","\u003Ch1>Karpathy 的 LLM 编码批评与 \u003Ca href=\"http:\u002F\u002FCLAUDE.md\">CLAUDE.md\u003C\u002Fa> 最佳实践\u003C\u002Fh1>\n\u003Cp>Andrej Karpathy 在 X（前 Twitter）上的一条帖子，催生了一个 107k stars 的 GitHub 仓库。\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fforrestchang\u002Fandrej-karpathy-skills\">forrestchang\u002Fandrej-karpathy-skills\u003C\u002Fa> 由 Jiayuan（forrestchang，同时是 Multica 项目作者）创建，将 Karpathy 对 AI 编程工具的犀利批评提炼成了四条 \u003Ca href=\"http:\u002F\u002FCLAUDE.md\">CLAUDE.md\u003C\u002Fa> 规则。这个仓库的核心问题是：\u003Cstrong>为什么现在的 AI 编程助手总是让人抓狂？怎么修？\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Ch2 id=\"karpathy-为什么批评现在的-ai-编程工具\">Karpathy 为什么批评现在的 AI 编程工具\u003C\u002Fh2>\n\u003Cp>Karpathy 不是在无脑批评，他本人就是 AI 领域最顶尖的工程师之一，曾在 OpenAI 担任研究科学家，也是特斯拉 Autopilot 的前负责人。他的批评来自真实的使用体验，每一条都戳在痛点上。\u003C\u002Fp>\n\u003Cp>他的原始帖子（@karpathy，推文 ID：2015883857489522876）中写道：\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>“The models make wrong assumptions on your behalf and just run along with them without checking. They don’t manage their confusion, don’t seek clarifications, don’t surface inconsistencies, don’t present tradeoffs, don’t push back when they should.”\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>翻译过来是：模型会替你做错误的假设，然后一路往下跑，也不检查。它们不管理自己的困惑，不主动寻求澄清，不指出矛盾，不呈现权衡，不在该抵抗的时候抵抗。\u003C\u002Fp>\n\u003Cp>这句话精准描述了我们都遇到过的场景：你给了一个模糊的需求，AI 没问你就开始写代码，写了一大堆，但方向错了。\u003C\u002Fp>\n\u003Ch2 id=\"四个典型问题\">四个典型问题\u003C\u002Fh2>\n\u003Cp>Karpathy 归纳了 AI 编程助手的几个核心问题：\u003C\u002Fp>\n\u003Ch3 id=\"问题一-乱猜假设-不求确认\">问题一：乱猜假设，不求确认\u003C\u002Fh3>\n\u003Cblockquote>\n\u003Cp>“The models make wrong assumptions on your behalf and just run along with them without checking.”\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>LLM 非常擅长&quot;看起来在执行任务&quot;。当需求不清晰时，它不会停下来问，而是选择一个看起来合理的解释，然后全速运行。这种&quot;自信执行&quot;的风格在需求明确时是优点，在需求模糊时是灾难。\u003C\u002Fp>\n\u003Ch3 id=\"问题二-过度设计-代码膨胀\">问题二：过度设计，代码膨胀\u003C\u002Fh3>\n\u003Cblockquote>\n\u003Cp>“They really like to overcomplicate code and APIs, bloat abstractions, don’t clean up dead code… implement a bloated construction over 1000 lines when 100 would do.”\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>AI 有一种奇怪的本能：把简单的事情做复杂。100 行能解决的问题，它可能给你写 1000 行，附带一堆你没要求的抽象层、工厂模式、策略模式。这不是能力的体现，是认知过载的副产品——LLM 见过太多&quot;企业级代码&quot;，把复杂度当作质量的代理指标。\u003C\u002Fp>\n\u003Ch3 id=\"问题三-误伤无关代码\">问题三：误伤无关代码\u003C\u002Fh3>\n\u003Cblockquote>\n\u003Cp>“They still sometimes change\u002Fremove comments and code they don’t sufficiently understand as side effects, even if orthogonal to the task.”\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>这是最让开发者头疼的问题之一。你叫 AI 修一个 bug，它顺手删了几行注释、改了几个变量名，理由是&quot;优化了可读性&quot;。在代码库中这是极其危险的行为——你不知道哪些看起来无关的改动会引发连锁反应。\u003C\u002Fp>\n\u003Ch3 id=\"问题四-目标不清-循环失控\">问题四：目标不清，循环失控\u003C\u002Fh3>\n\u003Cp>Karpathy 也看到了 LLM 的潜力所在：\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>“LLMs are exceptionally good at looping until they meet specific goals… Don’t tell it what to do, give it success criteria and watch it go.”\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>LLM 特别擅长&quot;为了达成目标反复迭代&quot;。但如果你给的是模糊的操作指令而不是清晰的成功标准，这个循环能力反而会变成失控的来源。\u003C\u002Fp>\n\u003Ch2 id=\"claude-md-四条原则逐一解析\">\u003Ca href=\"http:\u002F\u002FCLAUDE.md\">CLAUDE.md\u003C\u002Fa> 四条原则逐一解析\u003C\u002Fh2>\n\u003Cp>forrestchang 将 Karpathy 的观察提炼为四条可操作的规则，写进了一个 \u003Ccode>CLAUDE.md\u003C\u002Fcode> 文件。\u003C\u002Fp>\n\u003Ch3 id=\"原则一-think-before-coding-先想后写\">原则一：Think Before Coding（先想后写）\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>对应问题\u003C\u002Fstrong>：乱猜假设，不求确认\u003C\u002Fp>\n\u003Cp>\u003Cstrong>核心内容\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>在写代码之前，显式声明你对任务的理解和假设\u003C\u002Fli>\n\u003Cli>如果存在歧义，\u003Cstrong>主动问清楚\u003C\u002Fstrong>，不要自己脑补\u003C\u002Fli>\n\u003Cli>列出多个可能的实现方案及其权衡，再决定用哪个\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>这条规则改变了 LLM 的默认行为模式——从&quot;接到任务立刻执行&quot;变成&quot;先理解，再执行&quot;。\u003C\u002Fp>\n\u003Cp>实际上，这也是好的软件工程师的习惯：在键盘上敲第一行代码之前，先在脑子里（或者白板上）把问题想清楚。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>效果\u003C\u002Fstrong>：让 AI 暴露它的假设，你可以在它走错之前纠正。\u003C\u002Fp>\n\u003Ch3 id=\"原则二-simplicity-first-简单优先\">原则二：Simplicity First（简单优先）\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>对应问题\u003C\u002Fstrong>：过度设计，代码膨胀\u003C\u002Fp>\n\u003Cp>\u003Cstrong>核心内容\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>写最简单的能解决问题的代码\u003C\u002Fli>\n\u003Cli>不要实现没有被明确要求的功能\u003C\u002Fli>\n\u003Cli>不要添加未被要求的抽象层\u003C\u002Fli>\n\u003Cli>不要&quot;顺手&quot;重构\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>这条规则直接对抗 LLM 的&quot;复杂化冲动&quot;。它的哲学来源是 YAGNI（You Aren’t Gonna Need It）和 UNIX 哲学：每个模块只做一件事，做好这一件事。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>效果\u003C\u002Fstrong>：得到更短、更直接的代码，更容易 review，更容易维护。\u003C\u002Fp>\n\u003Ch3 id=\"原则三-surgical-changes-外科手术式修改\">原则三：Surgical Changes（外科手术式修改）\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>对应问题\u003C\u002Fstrong>：误伤无关代码\u003C\u002Fp>\n\u003Cp>\u003Cstrong>核心内容\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>只修改任务直接要求修改的代码\u003C\u002Fli>\n\u003Cli>不要&quot;顺便&quot;修改看起来不相关的东西\u003C\u002Fli>\n\u003Cli>不要删除你没有完全理解的注释或代码\u003C\u002Fli>\n\u003Cli>如果发现了其他需要修改的地方，报告出来，不要自行修改\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>&quot;外科手术式&quot;这个比喻很精准：外科医生做手术，只处理目标部位，绝对不会因为&quot;发现旁边有个不好看的地方&quot;就顺手切掉。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>效果\u003C\u002Fstrong>：代码库的意外变动大幅减少，diff 更干净，review 更容易。\u003C\u002Fp>\n\u003Ch3 id=\"原则四-goal-driven-execution-目标驱动执行\">原则四：Goal-Driven Execution（目标驱动执行）\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>对应问题\u003C\u002Fstrong>：目标不清，循环失控（以及正向利用 LLM 的循环能力）\u003C\u002Fp>\n\u003Cp>\u003Cstrong>核心内容\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>把任务转化为\u003Cstrong>可验证的成功标准\u003C\u002Fstrong>\u003C\u002Fli>\n\u003Cli>给 LLM 目标，而不是步骤\u003C\u002Fli>\n\u003Cli>让它自主决定如何达成目标\u003C\u002Fli>\n\u003Cli>通过测试用例、断言、具体的输出格式来定义&quot;完成&quot;\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>这条规则是四条中最反直觉的，也是最有力量的。\u003C\u002Fp>\n\u003Cp>Karpathy 说得很清楚：“Don’t tell it what to do, give it success criteria and watch it go.”（不要告诉它做什么，给它成功标准，然后看它运行。）\u003C\u002Fp>\n\u003Cp>比较两种指令方式：\u003C\u002Fp>\n\u003Cp>\u003Cstrong>指令式（不推荐）\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>“先读取 users 表，然后过滤出 active=true 的用户，然后按 created_at 排序，然后取前 10 条，然后格式化成 JSON…”\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>\u003Cstrong>目标式（推荐）\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>“返回最近注册的 10 个活跃用户，格式为 JSON 数组，每个元素包含 id、name、email 字段。用 pytest 测试：给定测试数据库有 20 个用户（15 活跃），函数应返回长度为 10 的数组，且所有元素的 active 字段为 true。”\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>第二种方式利用了 LLM 的循环能力：它会不断尝试，直到写出通过测试的代码。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>效果\u003C\u002Fstrong>：释放 LLM 的 agent 能力，同时用可验证的目标约束其行为。\u003C\u002Fp>\n\u003Ch2 id=\"如何安装和使用\">如何安装和使用\u003C\u002Fh2>\n\u003Ch3 id=\"方式一-claude-code-plugin\">方式一：Claude Code Plugin\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">\u002Fplugin marketplace add forrestchang\u002Fandrej-karpathy-skills\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>安装后，这些规则会自动注入到 Claude Code 的系统 prompt 中。\u003C\u002Fp>\n\u003Ch3 id=\"方式二-单项目-claude-md\">方式二：单项目 \u003Ca href=\"http:\u002F\u002FCLAUDE.md\">CLAUDE.md\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>在项目根目录添加 \u003Ccode>CLAUDE.md\u003C\u002Fcode> 文件：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">curl -o CLAUDE.md https:\u002F\u002Fraw.githubusercontent.com\u002Fforrestchang\u002Fandrej-karpathy-skills\u002Fmain\u002FCLAUDE.md\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Claude Code 会自动读取项目根目录的 \u003Ccode>CLAUDE.md\u003C\u002Fcode>，将其内容作为额外的系统指令。\u003C\u002Fp>\n\u003Ch3 id=\"方式三-cursor-规则文件\">方式三：Cursor 规则文件\u003C\u002Fh3>\n\u003Cp>对于 Cursor 用户：\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">mkdir -p .cursor\u002Frules\ncurl -o .cursor\u002Frules\u002Fkarpathy-guidelines.mdc https:\u002F\u002Fraw.githubusercontent.com\u002Fforrestchang\u002Fandrej-karpathy-skills\u002Fmain\u002FCLAUDE.md\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Cursor 的 \u003Ccode>.mdc\u003C\u002Fcode> 规则文件和 \u003Ca href=\"http:\u002F\u002FCLAUDE.md\">CLAUDE.md\u003C\u002Fa> 在功能上是等价的——都是&quot;给 AI 看的行为约束文件&quot;。\u003C\u002Fp>\n\u003Ch2 id=\"和-anthropics-skills-的关系\">和 anthropics\u002Fskills 的关系\u003C\u002Fh2>\n\u003Cp>理解这两个仓库的关系，有助于更清晰地认识&quot;给 Claude 的指令文件&quot;这个生态：\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>\u003C\u002Fth>\n\u003Cth>anthropics\u002Fskills\u003C\u002Fth>\n\u003Cth>forrestchang\u002Fandrej-karpathy-skills\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>目标\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>能力增强\u003C\u002Ftd>\n\u003Ctd>行为约束\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>内容\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>教 Claude 怎么做特定任务\u003C\u002Ftd>\n\u003Ctd>规范 Claude 的编码行为模式\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>类比\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>技能培训课程\u003C\u002Ftd>\n\u003Ctd>职业道德准则\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>适用范围\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>特定任务场景\u003C\u002Ftd>\n\u003Ctd>所有编码任务\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>两者都是&quot;给 Claude 的指令文件&quot;，但层次不同：\u003C\u002Fp>\n\u003Cul>\n\u003Cli>anthropics\u002Fskills 是\u003Cstrong>领域知识\u003C\u002Fstrong>：我要做 Web 测试，加载 \u003Ccode>webapp-testing\u003C\u002Fcode> skill\u003C\u002Fli>\n\u003Cli>karpathy-skills 是\u003Cstrong>行为规范\u003C\u002Fstrong>：我在做任何编码任务，都应该遵守这四条原则\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>两者可以叠加使用，互不冲突。\u003C\u002Fp>\n\u003Ch2 id=\"为什么-给成功标准-比-给指令-更有效\">为什么&quot;给成功标准&quot;比&quot;给指令&quot;更有效\u003C\u002Fh2>\n\u003Cp>Goal-Driven Execution 是这套规则中最值得深入思考的部分。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>指令式指导的问题\u003C\u002Fstrong>在于：它要求人类提前想好所有细节，然后把思维过程翻译成 AI 能理解的步骤序列。这既耗时，又容易出错——你的步骤描述一旦有歧义，AI 会按照它自己的理解执行，而不是你的意图。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>目标式指导的优势\u003C\u002Fstrong>在于：\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>降低认知负担\u003C\u002Fstrong>：你只需要想清楚&quot;什么算完成&quot;，不需要想清楚&quot;怎么完成&quot;\u003C\u002Fli>\n\u003Cli>\u003Cstrong>利用 LLM 的规划能力\u003C\u002Fstrong>：LLM 其实很擅长把目标分解成步骤，这是它的强项\u003C\u002Fli>\n\u003Cli>\u003Cstrong>可验证性\u003C\u002Fstrong>：成功标准是客观的，测试要么通过要么不通过，没有&quot;差不多完成&quot;\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>这和 OKR 的思路很像：定义关键结果（Key Results），而不是指定行动步骤（Action Items）。\u003C\u002Fp>\n\u003Ch2 id=\"踩坑提醒\">踩坑提醒\u003C\u002Fh2>\n\u003Cp>这套规则非常有用，但有几个需要注意的地方：\u003C\u002Fp>\n\u003Cp>\u003Cstrong>1. 偏保守，简单任务不必全套用\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>&quot;Think Before Coding&quot;要求 AI 先列出假设和方案，对于简单任务会显得冗余。如果你只是要它写一个格式化日期的工具函数，直接要结果更高效。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>2. &quot;Surgical Changes&quot;可能让 AI 错过明显问题\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>有时候你叫 AI 修 bug，顺路发现了一个明显的代码质量问题，但&quot;Surgical Changes&quot;原则会让它保持沉默。解决办法是：在任务描述中加一句&quot;如果你发现其他潜在问题，请报告但不要自行修改&quot;。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>3. 目标式指导需要你能描述&quot;成功&quot;\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>Goal-Driven Execution 的前提是你知道什么是成功。如果你自己也不确定想要什么结果（探索性任务），这条原则就不太适用。\u003C\u002Fp>\n\u003Cp>\u003Cstrong>4. 不同工具的支持程度不同\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>这套规则最适合 Claude Code，因为 Claude Code 原生支持 \u003Ccode>CLAUDE.md\u003C\u002Fcode>。在 ChatGPT、Gemini 等工具中使用，需要手动复制粘贴规则内容到 system prompt。\u003C\u002Fp>\n\u003Chr>\n\u003Cp>Karpathy 的批评和 forrestchang 的 \u003Ca href=\"http:\u002F\u002FCLAUDE.md\">CLAUDE.md\u003C\u002Fa> 提醒我们：\u003Cstrong>工具的能力和工具的行为是两回事\u003C\u002Fstrong>。LLM 已经具备了强大的编码能力，但如果没有正确的行为约束，这个能力就像一辆没有方向盘的赛车——跑得很快，但不知道会撞到哪里。\u003C\u002Fp>\n\u003Cp>四条原则的本质是：\u003Cstrong>把 AI 从&quot;急于完成任务的执行者&quot;变成&quot;谨慎推理的协作者&quot;\u003C\u002Fstrong>。这不是限制 AI 的能力，而是让能力发挥在正确的方向上。\u003C\u002Fp>\n","2026-05-03",[11,12,13,14],"ai","Claude","Claude Code","工程实践",false,[17,30,41,53,60,67,74,81,87,90,100,109,119,128,136,144,153,162,171,181,188,198,204,211,217,226,233,240,248,258,267,276,286,296,306,314,324,335,345,354,362,368,376,384,392,400,408,415],{"slug":18,"title":19,"description":20,"pub_date":21,"tags":22,"draft":15,"word_count":29},"ide-skills-guide","Agent Skills 完全指南：21 款第三方 Skill 深度评测与使用心得","全面评测 21 款第三方 Agent Skills，涵盖 Vue 生态、前端设计、构建工具、实用工具四大分类。从安装配置到实际使用场景，带你了解每个 Skill 的功能特点、最佳实践与使用心得。","2026-06-15",[23,24,25,26,27,28],"agent","skills","AI","效率工具","前端","Vue",4169,{"slug":31,"title":32,"description":33,"pub_date":34,"tags":35,"draft":15,"word_count":40},"linux-kernel-skeleton-struct-funcptr-container_of","Linux 内核骨架：struct、函数指针与 container_of","读懂 Linux 内核源码的三件套：巨大的 struct 组合代替继承、函数指针表实现虚派发、container_of 宏从嵌入成员找回完整对象。","2026-05-09",[36,37,38,39],"linux","kernel","C","container_of",1369,{"slug":42,"title":43,"description":44,"pub_date":45,"tags":46,"draft":15,"word_count":52},"astro-complete-guide-2025","Astro 5 深度剖析：Islands 架构原理、构建优化与 Cloudflare Workers 边缘部署","从编译器视角解析 Astro 5 的 Islands 架构实现原理，Content Layer API 的 Vite 插件机制，Server Islands 的流式渲染，以及如何在 Cloudflare Workers + D1 边缘环境下榨干性能。","2026-05-08",[47,48,49,50,51],"astro","frontend","cloudflare","performance","architecture",3663,{"slug":54,"title":55,"description":56,"pub_date":9,"tags":57,"draft":15,"word_count":59},"llm-prompt-engineering","Prompt Engineering 实战：让 LLM 真正听话的技巧","System prompt 怎么写、Few-shot 怎么设计、Chain-of-Thought 原理，以及常见失败模式和调试方法。",[11,58,14],"llm",1723,{"slug":61,"title":62,"description":63,"pub_date":9,"tags":64,"draft":15,"word_count":66},"rag-system-design","RAG 系统设计：从 naive 到 production-ready","Retrieval-Augmented Generation 不只是「向量数据库 + LLM」，分块策略、召回质量、重排序、缓存才是工程核心。",[11,65,58,14],"rag",1613,{"slug":68,"title":69,"description":70,"pub_date":9,"tags":71,"draft":15,"word_count":73},"git-advanced-workflow","Git 进阶工作流：rebase、cherry-pick、bisect 的正确使用","merge 会了，但 rebase 总搞错？bisect 找 bug 提交？interactive rebase 整理历史？这篇一次说清楚。",[72,14],"git",1396,{"slug":75,"title":76,"description":77,"pub_date":9,"tags":78,"draft":15,"word_count":80},"docker-practical-guide","Docker 实战：从会用到用好","会 docker run 不够，Dockerfile 最佳实践、多阶段构建、Compose 编排、镜像瘦身才是日常真正需要的。",[79,36,14],"docker",1268,{"slug":82,"title":83,"description":84,"pub_date":9,"tags":85,"draft":15,"word_count":86},"anthropics-skills-guide","anthropics\u002Fskills：Anthropic 官方 Agent Skills 仓库解析","Anthropic 官方开源的 Agent Skills 标准仓库，127k stars，解析 SKILL.md 规范、17 个示例 skill 的设计模式，以及如何在 Claude Code \u002F Claude.ai \u002F API 中使用",[11,12,23,24],2090,{"slug":4,"title":5,"description":6,"pub_date":9,"tags":88,"draft":15,"word_count":89},[11,12,13,14],2699,{"slug":91,"title":92,"description":93,"pub_date":9,"tags":94,"draft":15,"word_count":99},"typescript-advanced-patterns","TypeScript 高级模式：让类型系统为你工作","基础 TS 会了但类型总是 any？条件类型、映射类型、模板字面量类型、infer 关键字才是 TS 的真正威力。",[95,96,97,98],"typescript","类型系统","前端工程","高级模式",1419,{"slug":101,"title":102,"description":103,"pub_date":9,"tags":104,"draft":15,"word_count":108},"linux-performance-tuning","Linux 性能调优实战：从 top 到 perf 的完整工具链","遇到性能问题不知道从哪下手？这篇建立系统化的排查思路，从 CPU\u002F内存\u002FIO\u002F网络逐层分析。",[36,105,106,107],"性能","运维","系统编程",1524,{"slug":110,"title":111,"description":112,"pub_date":9,"tags":113,"draft":15,"word_count":118},"python-functional-programming","Python 函数式编程：map\u002Ffilter\u002Freduce 之外","Python 不是纯函数式语言，但 functools、itertools、偏函数、闭包这些工具用好了能让代码简洁一个量级。",[114,115,116,117],"python","函数式","闭包","装饰器",1867,{"slug":120,"title":121,"description":122,"pub_date":9,"tags":123,"draft":15,"word_count":127},"python-oop-guide","Python 面向对象：__init__ 之外你需要知道的","Python OOP 不只是 class + __init__，魔术方法、描述符、元类才是真正的武器。",[114,124,125,126],"OOP","面向对象","魔术方法",1792,{"slug":129,"title":130,"description":131,"pub_date":9,"tags":132,"draft":15,"word_count":135},"python-data-structures","Python 内置数据结构深度解析","list、dict、set、tuple 不只是数据容器，搞懂它们的底层实现和时间复杂度，才能写出高性能 Python。",[114,133,105,134],"数据结构","算法",1517,{"slug":137,"title":138,"description":139,"pub_date":9,"tags":140,"draft":15,"word_count":143},"python-basics-quick-start","Python 快速上手：写给有编程基础的人","已经会其他语言，想快速掌握 Python 的语法特性和思维方式，这篇是捷径。",[114,141,142],"入门","基础",1607,{"slug":145,"title":146,"description":147,"pub_date":9,"tags":148,"draft":15,"word_count":152},"python-dataclass-pydantic","Python dataclass vs Pydantic：数据类选型指南","dataclass 是标准库的轻量选择，Pydantic v2 是带验证的重武器，什么时候用哪个，这篇说清楚。",[114,149,150,151],"dataclass","pydantic","数据验证",1323,{"slug":154,"title":155,"description":156,"pub_date":9,"tags":157,"draft":15,"word_count":161},"python-asyncio-practical","Python asyncio 实战：从回调地狱到协程优雅","asyncio 是 Python 异步编程的核心，搞懂 event loop、Task、gather 这些概念才能写出真正高效的异步代码。",[114,158,159,160],"asyncio","并发","网络编程",1258,{"slug":163,"title":164,"description":165,"pub_date":9,"tags":166,"draft":15,"word_count":170},"python-type-hints-guide","Python 类型注解完全指南：从入门到实践","Python 3.5+ 引入类型注解，配合 mypy\u002Fpyright 让 Python 也能享受静态类型检查的好处。",[114,167,168,169],"typescript-style","type-hints","工具链",1102,{"slug":172,"title":173,"description":174,"pub_date":175,"tags":176,"draft":15,"word_count":180},"pwa-install-update-button","PWA 踩坑：为什么安装按钮从来不出现","从 beforeinstallprompt 到 Service Worker waiting，把 PWA 的安装与更新提示真正做对","2026-05-02",[177,178,179],"pwa","javascript","web",1683,{"slug":182,"title":183,"description":184,"pub_date":185,"tags":186,"draft":15,"word_count":187},"openclaw-vs-hermes-agent","OpenClaw vs Hermes Agent：两个本地优先 Agent 的设计差异","OpenClaw（Novita AI）和 Hermes Agent（Nous Research）都是本地运行的个人 AI Agent，但在记忆系统、技能学习、运行环境和模型生态上走了不同的路。深入对比两种架构的核心差异。","2026-05-01",[11,23,58],1679,{"slug":189,"title":190,"description":191,"pub_date":185,"tags":192,"draft":15,"word_count":197},"cpp-random-design-patterns","C++ 设计模式实战：RAII、观察者、工厂","用现代 C++（C++17\u002F20）实现三种高频设计模式：RAII 资源管理、观察者模式事件系统、工厂模式插件架构。每种模式给出问题场景、实现代码和真实工程案例。",[193,194,195,196],"cpp","设计模式","c++17","工程",2613,{"slug":199,"title":200,"description":201,"pub_date":185,"tags":202,"draft":15,"word_count":203},"data-structures-fundamentals","数据结构基础：从数组到红黑树","系统梳理常用数据结构的核心原理、时间复杂度和适用场景。数组、链表、栈、队列、哈希表、二叉树、堆、图，每种结构附实现要点和 C++ 代码片段。",[133,134,193,142],3004,{"slug":205,"title":206,"description":207,"pub_date":208,"tags":209,"draft":15,"word_count":210},"ai-agent-what-is","什么是 AI Agent？从 LLM 到自主执行","LLM 本身是无状态问答机，Agent 是什么让它’动’起来的？本文深入解析 Agent 的四个核心能力、ReAct 框架、工具调用原理，以及主流框架横向对比。","2026-04-30",[11,23,58],2116,{"slug":212,"title":213,"description":214,"pub_date":208,"tags":215,"draft":15,"word_count":216},"ai-agent-memory","AI Agent 的记忆系统：从上下文窗口到长期记忆","深入拆解 AI Agent 的四种记忆类型、上下文窗口压缩策略、RAG 向量检索原理，以及三种典型失败模式和工程选型建议。",[11,23,65],2052,{"slug":218,"title":219,"description":220,"pub_date":208,"tags":221,"draft":15,"word_count":225},"network-proxy-vpn-guide","代理与翻墙技术原理：从 HTTP 代理到现代协议","深入解析代理与 VPN 的本质区别，梳理从 SOCKS5 到 Shadowsocks、V2Ray\u002FXray、Hysteria2 的协议演进，以及机场订阅的技术本质。",[222,223,224],"网络","代理","协议",2148,{"slug":227,"title":228,"description":229,"pub_date":208,"tags":230,"draft":15,"word_count":143},"algorithm-binary-search","二分查找：永远写不对？记住这个模板","彻底搞清楚二分查找的边界问题：闭区间和左闭右开两套模板、三道经典 LeetCode 题目完整 C++ 实现，以及二分答案的进阶思路。",[134,231,232,193],"二分查找","leetcode",{"slug":234,"title":235,"description":236,"pub_date":208,"tags":237,"draft":15,"word_count":239},"algorithm-sliding-window","滑动窗口算法：从暴力到 O(n) 的思维跃迁","系统讲解滑动窗口算法的核心模板、适用题型，配合三道经典 LeetCode 题目的完整 C++ 实现，彻底理解双指针收缩思路。",[134,238,232,193],"滑动窗口",1943,{"slug":241,"title":242,"description":243,"pub_date":208,"tags":244,"draft":15,"word_count":247},"network-clash-config","Clash \u002F Mihomo 配置详解：规则、策略组与分流","深入解析 Clash\u002FMihomo 的核心配置结构，包括代理节点、策略组类型、规则优先级、DNS fake-ip 模式，以及一份实用的完整配置模板。",[222,245,223,246],"clash","配置",1292,{"slug":249,"title":250,"description":251,"pub_date":252,"tags":253,"draft":15,"word_count":257},"hid-hotplug","HID 设备热插拔检测：从 udev 到 node-hid","在 Linux 上用 node-hid + usb 库实现可靠的 USB HID 设备热插拔检测，踩坑记录","2026-04-28",[193,254,36,255,256],"hid","nodejs","electron",2039,{"slug":259,"title":260,"description":261,"pub_date":262,"tags":263,"draft":15,"word_count":266},"electron-ipc-types","Electron IPC 类型安全：从 any 到完全类型化","用 TypeScript 泛型封装 Electron IPC，彻底消灭 any，preload 契约集中管理","2026-04-25",[256,95,264,265],"ipc","vue",1446,{"slug":268,"title":269,"description":270,"pub_date":271,"tags":272,"draft":15,"word_count":275},"element-plus-popover-hide","手动关闭多个 el-popover（不用 v-model:visible）","通过 ref + Reflect.get 调用 hide() 方法手动关闭 Element Plus Popover，解释 Vue3 Proxy 导致无法直接调用实例方法的原因。","2024-10-25",[265,273,274],"element-plus","vue3",1321,{"slug":277,"title":278,"description":279,"pub_date":280,"tags":281,"draft":15,"word_count":285},"vite-vue3-ts-elementplus-pinia","用 Vite+（vp）从零搭建 Vue3 + TypeScript + Element Plus + Pinia + Vue Router","使用 Vite+ 统一工具链（vp）一条命令搭建 Vue3 全家桶，涵盖按需导入、Pinia store、路由配置，以及常见坑的解决方案。","2024-08-27",[265,282,95,273,283,284],"vite","pinia","vite-plus",1960,{"slug":287,"title":288,"description":289,"pub_date":290,"tags":291,"draft":15,"word_count":295},"cef-lnk2038-iterator-debug-level","CEF LNK2038：解决 _ITERATOR_DEBUG_LEVEL 不匹配错误","分析 CEF（Chromium Embedded Framework）集成时出现的 LNK2038 _ITERATOR_DEBUG_LEVEL 链接错误，从根本原因到解决方案的完整指南。","2024-05-07",[193,292,293,294],"CEF","Visual Studio","链接错误",1509,{"slug":297,"title":298,"description":299,"pub_date":300,"tags":301,"draft":15,"word_count":305},"npm-electron-install-fix","彻底解决 npm 安装 Electron 失败的问题","分析 npm install electron 失败的根本原因（下载二进制超时\u002F被墙），通过国内镜像（npmmirror）彻底解决，并介绍多种备选方案和常见错误排查。","2024-03-01",[256,302,303,304],"npm","前端工具链","国内镜像",1494,{"slug":307,"title":308,"description":309,"pub_date":310,"tags":311,"draft":15,"word_count":313},"git-out-of-memory","解决 git 报错：Fatal: Out of memory, malloc failed","分析 git 大仓库操作时出现 Out of memory malloc failed 的根本原因，通过调整 pack.windowMemory、http.postBuffer 和 git repack 彻底解决。","2024-01-31",[72,36,312],"工具",2244,{"slug":315,"title":316,"description":317,"pub_date":318,"tags":319,"draft":15,"word_count":323},"vmware-tools-install","在 VMware 虚拟机中安装 open-vm-tools 完整指南","详解 VMware Tools 的作用、open-vm-tools 与官方 VMware Tools 的区别，以及在 Ubuntu 虚拟机中安装并生效的完整步骤和常见问题排查。","2023-11-21",[320,36,321,322],"VMware","Ubuntu","虚拟机",2523,{"slug":325,"title":326,"description":327,"pub_date":328,"tags":329,"draft":15,"word_count":334},"load-balancing-algorithms","负载均衡算法完全指南：从轮询到一致性哈希","系统梳理静态与动态负载均衡算法，涵盖轮询、随机、权重、IP Hash、一致性 Hash、最少连接、最快响应等，并对比 Nginx、Dubbo、Spring Cloud LoadBalancer 的实现差异。","2023-11-15",[330,331,332,333],"分布式","负载均衡","Nginx","微服务",1764,{"slug":336,"title":337,"description":338,"pub_date":339,"tags":340,"draft":15,"word_count":344},"win-cw2a-ca2w","ATL 字符串转换：CW2A 与 CA2W 完全指南","详解 ATL 宏 CW2A\u002FCA2W 在 Unicode 与 ANSI 之间的字符串转换用法、头文件依赖、USES_CONVERSION 宏的作用与常见陷阱。","2023-06-09",[193,341,342,343],"windows","ATL","字符串",1665,{"slug":346,"title":347,"description":348,"pub_date":339,"tags":349,"draft":15,"word_count":353},"csharp-sendmessage-cpp","C# 通过 SendMessage 向 C++ 窗口发送消息与字符串","使用 P\u002FInvoke 调用 user32.dll 的 SendMessage，从 C# 发送自定义 WM_USER 消息及字符串指针给 C++ 原生窗口，并在 C++ 侧正确接收和转换。",[350,193,341,351,352],"C#","互操作","PInvoke",1554,{"slug":355,"title":356,"description":357,"pub_date":358,"tags":359,"draft":15,"word_count":361},"win-postmessage-vector","Windows PostMessage 跨线程传递 std::vector 指针","通过 PostMessage 在 Windows 消息队列中传递 std::vector 指针，使用 reinterpret_cast 将指针装入 LPARAM，并在接收方正确释放内存。","2023-05-26",[193,341,360],"WinAPI",1823,{"slug":363,"title":364,"description":365,"pub_date":358,"tags":366,"draft":15,"word_count":367},"exe-dll-single-package","将 EXE 和 DLL 打包成单一可执行文件","介绍两种将 exe 和依赖 dll 打包成单文件的方案：Enigma Virtual Box 和 WinRAR 自解压，适合发布 Windows 桌面程序时简化分发流程。",[341,193,312],1619,{"slug":369,"title":370,"description":371,"pub_date":358,"tags":372,"draft":15,"word_count":375},"cpp-random-mt19937","C++ 现代随机数生成：用 mt19937 彻底告别 rand()","深入讲解为什么 rand() 不够用，以及如何用 C++11 的 \u003Crandom> 库正确生成高质量随机数，涵盖 mt19937、各种分布和线程安全。",[193,373,374],"c++11","random",1549,{"slug":377,"title":378,"description":379,"pub_date":380,"tags":381,"draft":15,"word_count":383},"win-startup-registry","C++ 实现程序开机自启动：注册表方式详解","通过操作 Windows 注册表 Run 键实现程序开机自启动，包括 HKCU 与 HKLM 区别、完整封装代码、工作目录问题和 UAC 权限处理。","2022-12-26",[341,193,382],"registry",1201,{"slug":385,"title":386,"description":387,"pub_date":388,"tags":389,"draft":15,"word_count":391},"mfc-cstring-wparam","MFC 中 CString 与 WPARAM 之间的转换","详解 MFC 消息传递中 CString 无法直接强转为 WPARAM 的原因，以及两种正确的转换方案，并介绍结构体指针传递的正确姿势。","2022-11-25",[390,193,341],"mfc",1546,{"slug":393,"title":394,"description":395,"pub_date":396,"tags":397,"draft":15,"word_count":399},"duilib-static-build","正确编译 Duilib 静态库：避免 ATL 依赖和链接错误","详解如何用 DuiLib_Static.vcxproj 编译 Duilib 静态库，解决 VARIANT 未定义、Unicode 配置不匹配和 ATL 依赖等常见问题。","2022-08-24",[193,398,341,390],"duilib",2639,{"slug":401,"title":402,"description":403,"pub_date":404,"tags":405,"draft":15,"word_count":407},"mfc-dpi-adaptive","MFC 界面自适应不同分辨率","MFC 对话框程序实现控件和字体随分辨率自动缩放的完整方案，附 DPI Awareness 配置说明","2022-08-17",[390,193,341,406],"dpi",1414,{"slug":409,"title":410,"description":411,"pub_date":412,"tags":413,"draft":15,"word_count":414},"mfc-drag-window","MFC 无标题栏窗口客户区拖动：三种方法对比","MFC 对话框去掉标题栏后如何实现拖动移动窗口，三种方案完整实现与适用场景分析","2022-08-16",[390,193,341],1633,{"slug":416,"title":417,"description":418,"pub_date":419,"tags":420,"draft":15,"word_count":422},"algorithm-number-complement","整数的补数：位运算掩码解法","LeetCode 476 题，用掩码 XOR 实现整数补数，附 C++\u002FPython\u002FJava 三种实现及补数与补码的区别","2021-03-08",[134,421,232],"位运算",1374,[]]