<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>jiechen</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://blog.becase.top/</id>
  <link href="https://blog.becase.top/" rel="alternate"/>
  <link href="https://blog.becase.top/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, jiechen</rights>
  <subtitle>the world is quiet here</subtitle>
  <title>Blog</title>
  <updated>2026-08-04T09:27:28.568Z</updated>
  <entry>
    <author>
      <name>jiechen</name>
    </author>
    <category term="tech" scheme="https://blog.becase.top/categories/tech/"/>
    <category term="AI" scheme="https://blog.becase.top/tags/AI/"/>
    <category term="Multi-Agent" scheme="https://blog.becase.top/tags/Multi-Agent/"/>
    <category term="Distributed Systems" scheme="https://blog.becase.top/tags/Distributed-Systems/"/>
    <category term="CAP" scheme="https://blog.becase.top/tags/CAP/"/>
    <category term="Raft" scheme="https://blog.becase.top/tags/Raft/"/>
    <category term="Byzantine Fault Tolerance" scheme="https://blog.becase.top/tags/Byzantine-Fault-Tolerance/"/>
    <content>
      <![CDATA[<h2 id="当团队里出现多个“真相”">当团队里出现多个“真相”<a title="#当团队里出现多个“真相”" href="#当团队里出现多个“真相”"></a></h2><p>把同一个任务交给三个 Agent，通常不会自然得到一支配合默契的团队。<br>更常见的情况是：它们各自掌握一部分上下文，各自维护一份状态，还可能在不同时间得出互相冲突的结论。</p><p>单个 Agent 犯错，我们会追问模型能力、提示词或工具调用。<br>多个 Agent 协作失灵，还要多问一层：信息有没有送达，大家看到的是不是同一版状态，某个成员的话又凭什么可信？</p><p>分布式系统几十年来一直在处理类似的麻烦。<br>CAP、Raft 和拜占庭容错因此常被拿来解释多 Agent 协作。<br>这组类比很有启发，但三个概念分别处理不同层次的问题，混在一起反而容易误判：</p><div class="φbq"><div class="φbs"><table><thead><tr><th>问题</th><th>关心什么</th><th>放到 Agent 团队里</th></tr></thead><tbody><tr><td>CAP</td><td>通信中断时，一致性与可用性如何取舍</td><td>成员失联后，是继续工作，还是暂停关键操作</td></tr><tr><td>Raft</td><td>基本可信的节点如何确认唯一的权威状态</td><td>谁来协调，以及什么结果算正式生效</td></tr><tr><td>拜占庭容错</td><td>节点可能任意出错时，系统如何维持可信</td><td>成员会不会伪造、隐瞒或传播互相矛盾的结果</td></tr></tbody></table></div></div><p>可以把它们记成三句话：联系不上，看 CAP；意见要落成一个决定，看共识；连发言者都不能完全相信，看拜占庭故障。</p><p><img src="/image/cap-raft-byzantine-agent-teams/failure-layers.svg" alt="多 Agent 协作的三层失效模型" loading="lazy" class="φbp"></p><p>图中的三层是递进关系。<br>通信恢复只能解决消息能否到达；状态达成一致之后，系统仍要继续判断参与者和证据是否可信。</p><h2 id="从一次发布说起">从一次发布说起<a title="#从一次发布说起" href="#从一次发布说起"></a></h2><p>假设三个 Agent 合作发布一个新版本。</p><ul><li>Agent A 核对需求与改动范围</li><li>Agent B 运行测试并检查构建产物</li><li>Agent C 汇总结论，在条件满足后执行发布</li></ul><p>理想流程很简单：A 和 B 完成检查，C 收到证据，版本发布。<br>但只要协作跨越多个执行单元，问题就会一层层出现。</p><p>第一层是通信问题。<br>A 已经完成检查，消息却没有传到 C；C 无法判断 A 是尚未完成、已经宕机，还是单纯网络延迟。</p><p>第二层是状态问题。<br>A 检查的是提交 <code>v2</code>，B 跑测试时拿到的却是 <code>v1</code>，两份“通过”放在一起也不能证明 <code>v2</code> 可以发布。</p><p>第三层是信任问题。<br>B 可能被恶意网页中的提示注入影响，没有真正运行测试，却向 C 返回“全部通过”。<br>这时通信完全正常，团队也达成了共识，结论仍然可能是错的。</p><p>这三个失败场景表面上都叫“协作不顺”，根因却分别是消息不可达、状态不一致和参与者不可信。<br>CAP、Raft 与拜占庭容错的价值，正在于把这三层问题拆开。</p><h2 id="cap：失联之后，停下来还是继续走">CAP：失联之后，停下来还是继续走<a title="#cap：失联之后，停下来还是继续走" href="#cap：失联之后，停下来还是继续走"></a></h2><p>CAP 中的三个字母分别是 Consistency、Availability 和 Partition tolerance。</p><ul><li><strong>一致性（Consistency）</strong>：一次成功写入之后，后续读取不会再看到更旧、互相冲突的权威状态</li><li><strong>可用性（Availability）</strong>：每个到达正常节点的请求都能在有限时间内得到响应，不会因其他节点失联而一直挂起或直接拒绝</li><li><strong>分区容错（Partition tolerance）</strong>：节点之间出现丢包、断网或长时间延迟时，系统仍有明确的处理方式</li></ul><p>CAP 经常被压缩成“C、A、P 三选二”，这个说法太容易让人误会。<br>选择发生在网络分区已经出现、节点无法确认彼此状态的时候。<br>此时系统无法同时保证强一致和持续可用，只能决定哪一边优先。</p><p>回到发布场景。<br>如果 C 联系不上 A，它有两种基本选择。</p><p>一种选择是暂停发布，直到重新取得 A 的确认。<br>团队损失了可用性，却守住了“未经完整检查不得发布”这一条一致规则，这更接近 CP 的取向。</p><p>另一种选择是让 C 根据已有信息继续发布，待连接恢复后再补齐记录。<br>流程没有停，但不同成员可能暂时对“这个版本是否已经获批”持有不同答案，这更接近 AP 的取向。</p><p>这里没有脱离业务的最优解。<br>资料搜集、候选方案生成通常可以容忍暂时分叉；支付、删除、正式发布则往往宁可等待，也不能制造两个都声称有效的结果。<br>合适的一致性强度，取决于动作是否可逆以及出错成本有多高。</p><h2 id="git、crdt-与-raft：三种不同的协作思路">Git、CRDT 与 Raft：三种不同的协作思路<a title="#git、crdt-与-raft：三种不同的协作思路" href="#git、crdt-与-raft：三种不同的协作思路"></a></h2><p>Git、CRDT 和 Raft 常被放在一起讨论，因为它们都处理“多个副本”的问题。<br>三者对冲突的态度并不相同。</p><h3 id="git：先允许分叉，再由人解决语义冲突">Git：先允许分叉，再由人解决语义冲突<a title="#git：先允许分叉，再由人解决语义冲突" href="#git：先允许分叉，再由人解决语义冲突"></a></h3><p>两名开发者断网后都可以继续提交。<br>网络恢复时，Git 能找到历史分叉的位置，也能合并互不冲突的文本改动，但它不知道两个修改在业务上能否同时成立。</p><p>所以，把 Git 类比为 AP，只是在强调“离线也能继续工作”，并非对 Git 进行严格的 CAP 分类。<br>Git 提供了保存分歧和重新汇合的机制，最后的语义裁决仍由人或更高层系统完成。</p><h3 id="crdt：提前限制操作，使副本可以自动收敛">CRDT：提前限制操作，使副本可以自动收敛<a title="#crdt：提前限制操作，使副本可以自动收敛" href="#crdt：提前限制操作，使副本可以自动收敛"></a></h3><p>CRDT 是一类为自动收敛而专门设计的数据结构，能力范围受数据模型约束。<br>它通过让并发操作满足交换、结合或幂等等性质，使不同副本即使以不同顺序收到更新，最终也能收敛到同一个结果。</p><p>例如，甲离线时向共享集合加入 <code>A</code>，乙同时加入 <code>B</code>。<br>如果这个集合采用合适的 CRDT，重连后双方都能得到 <code>{A, B}</code>，不需要判断谁覆盖谁。</p><p>代价也很明确：业务状态必须能被表达为这种可合并的数据结构。<br>“是否批准发布”包含责任、时序和约束，不能简单套用集合并集；自动收敛解决的是数据冲突，不等于解决了业务决策。</p><h3 id="raft：用多数派确定唯一的提交顺序">Raft：用多数派确定唯一的提交顺序<a title="#raft：用多数派确定唯一的提交顺序" href="#raft：用多数派确定唯一的提交顺序"></a></h3><p>Raft 处理的是另一类需求：系统不能接受多个并存的权威历史，必须让节点对日志顺序达成一致。</p><p>它通常会选出一个 Leader，由 Leader 接收变更并复制给其他节点。<br>以五节点集群为例，一条日志至少得到三个节点确认，才可能被视为已提交。<br>网络分区后，拥有多数节点的一侧可以继续推进；少数派无法独立确认新的权威状态。</p><p>多数派的意义不只是“票多者胜”。<br>任意两个多数派必然至少共享一个节点，这种重叠让已经提交的历史不容易被另一套历史取代。<br>Raft 用分区期间的部分不可用，换取了单一、连续的权威日志。</p><p>放到 Agent 团队里，Raft 提供的是一种组织协作的思路：明确协调者、记录决策顺序、规定提交门槛，并让少数失联成员无法单独改变最终状态。<br>这种机制针对日志复制与提交顺序，既不等同于汇总几个 Agent 的自然语言投票，也不会判断投票依据是否真实。</p><h2 id="raft-的边界：多数派可能整齐地做错事">Raft 的边界：多数派可能整齐地做错事<a title="#raft-的边界：多数派可能整齐地做错事" href="#raft-的边界：多数派可能整齐地做错事"></a></h2><p>标准 Raft 解决的是崩溃故障容错（Crash Fault Tolerance，CFT）。<br>它假设节点可能宕机、重启、延迟或失联，但节点一旦发送消息，就会遵守协议，不会伪造日志，也不会故意对不同成员讲不同版本的故事。</p><p>拜占庭故障放宽了这条假设。<br>一个故障节点不仅可以沉默，还可以任意行动：</p><ul><li>对 A 声称“发布已经获得批准”，对 C 又声称“仍在等待确认”</li><li>把没有执行过的测试包装成通过结果</li><li>选择性隐瞒失败日志，只转发有利片段</li><li>冒用其他成员身份，伪造一条看似完整的证据链</li></ul><p>经典的拜占庭将军问题之所以困难，正是因为正常参与者无法仅凭收到消息，就判断消息是事实、误传还是蓄意欺骗。</p><p>Agent 的幻觉未必带有恶意，提示注入也未必意味着模型本身“叛变”。<br>但从接收方看，两者都可能产生不受协议约束的任意输出。<br>因此在安全设计上，把这类输出当作拜占庭式故障处理，比猜测 Agent 的主观意图更有用。</p><p>经典 BFT 模型中，容忍 <code>f</code> 个拜占庭节点通常至少需要 <code>3f + 1</code> 个节点。<br>这个数字依赖网络同步性、身份认证方式和具体协议，不能直接当作 Agent 产品的节点配置公式。<br>对 Agent 产品更重要的提醒是：只增加节点数量，并不会自动增加可信度。</p><h2 id="为什么“三个-agent-都同意”仍然不够">为什么“三个 Agent 都同意”仍然不够<a title="#为什么“三个-agent-都同意”仍然不够" href="#为什么“三个-agent-都同意”仍然不够"></a></h2><p>多数机制能够抵御独立故障，前提是各个判断真的足够独立。<br>现实中的 Agent 团队往往共享同一个基础模型、系统提示、检索源和工具链，这会制造高度相关的错误。</p><p>如果三个 Agent 都从同一篇错误文章取证，三票赞成仍然只有一个信息源。<br>如果三个 Agent 都会被同一种提示注入攻击，增加副本只是在复制同一处薄弱点。<br>如果所谓“复核 Agent”只阅读执行 Agent 的摘要，它最多能检查措辞是否自洽，无法确认任务是否真的完成。</p><p>因此，多 Agent 系统里的“独立验证”至少应拆成三个维度：</p><ul><li><strong>来源独立</strong>：关键事实由不同的原始来源互相印证，避免多次转述同一材料</li><li><strong>方法独立</strong>：结论由不同机制验证，例如静态检查、自动测试和运行时观测互相补充</li><li><strong>权限独立</strong>：提出操作、批准操作和执行操作不由同一个身份包办</li></ul><p>有价值的冗余会刻意增加验证路径的差异，让同一个错误难以同时穿透所有检查。</p><h2 id="工程上先守住证据门禁">工程上先守住证据门禁<a title="#工程上先守住证据门禁" href="#工程上先守住证据门禁"></a></h2><p>大多数 Agent 产品并不需要直接实现 PBFT 一类完整的拜占庭共识协议。<br>它们通常运行在中心化编排器上，成员数量有限，关键状态也可以落在可信数据库中。<br>此时更有效的做法，是把分布式系统的原则翻译成具体的产品约束。</p><p><img src="/image/cap-raft-byzantine-agent-teams/evidence-gate.svg" alt="从 Agent 结论到可信动作的证据门禁" loading="lazy" class="φbp"></p><p>这条链路中最关键的断点，位于“Agent 自述”和“可验证事实”之间。<br>只要发布门禁读取的是原始证据，单个 Agent 的错误就不容易直接变成外部副作用。</p><h2 id="什么时候该用这套视角">什么时候该用这套视角<a title="#什么时候该用这套视角" href="#什么时候该用这套视角"></a></h2><p>“多 Agent”这个名称本身，并不足以构成分布式系统问题。<br>如果几个 Agent 由同一个进程顺序调用，共享一份数据库，也没有独立权限，首要矛盾通常是任务拆分、上下文传递和验收标准。</p><p>当系统出现以下特征时，分布式系统的视角才开始变得关键：</p><ul><li>成员拥有独立、可持续的本地状态</li><li>通信可能延迟、丢失、重复或乱序</li><li>多个成员可以并发修改同一业务事实</li><li>部分成员失联后，其他成员仍被允许继续工作</li><li>输入、工具或参与者不能被完全信任</li></ul><p>这组判断也给出了一个实用顺序。<br>先问通信中断后是否允许继续，再问哪个状态需要唯一权威，最后问参与者和证据是否可信。<br>只有前一层的边界说清楚，后一层的机制才不会沦为术语堆砌。</p><h2 id="结语：共识保证一致，不保证正确">结语：共识保证一致，不保证正确<a title="#结语：共识保证一致，不保证正确" href="#结语：共识保证一致，不保证正确"></a></h2><p>CAP 告诉我们，通信分区会迫使系统在一致性和可用性之间做选择。<br>Raft 告诉我们，一群遵守协议的节点可以通过 Leader、日志和多数派形成唯一的决定。<br>拜占庭问题则提醒我们：如果参与者可能任意出错，形式上的一致仍然可能建立在假消息之上。</p><p>对多 Agent 系统来说，可靠协作来自清晰的状态边界和证据链。<br>哪些状态可以分叉、哪些动作必须串行，哪些结论可以讨论、哪些事实必须拿证据说话，都要在系统里得到明确表达。</p><p>共识解决的是“大家最终认哪一个结果”。<br>可信系统还必须回答另一件事：这个结果为什么值得相信。</p>]]>
    </content>
    <id>https://blog.becase.top/post/24586</id>
    <link href="https://blog.becase.top/post/24586"/>
    <published>2026-08-04T00:00:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="当团队里出现多个“真相”">当团队里出现多个“真相”<a title="#当团队里出现多个“真相”" href="#当团队里出现多个“真相”"></a></h2>
<p>把同一个任务交给三个 Agent，通常不会自然得到一支配合默契的团队。<br>
更常见的情况是]]>
    </summary>
    <title>多 Agent 如何可靠协作：从 CAP、Raft 到拜占庭故障</title>
    <updated>2026-08-04T09:27:28.568Z</updated>
  </entry>
  <entry>
    <author>
      <name>jiechen</name>
    </author>
    <category term="tech" scheme="https://blog.becase.top/categories/tech/"/>
    <category term="AI" scheme="https://blog.becase.top/tags/AI/"/>
    <category term="Coding Agent" scheme="https://blog.becase.top/tags/Coding-Agent/"/>
    <category term="Harness Engineering" scheme="https://blog.becase.top/tags/Harness-Engineering/"/>
    <category term="Workflow" scheme="https://blog.becase.top/tags/Workflow/"/>
    <category term="Context Engineering" scheme="https://blog.becase.top/tags/Context-Engineering/"/>
    <content>
      <![CDATA[<p>2025 年下半年开始，Coding Agent 的能力边界快速扩张</p><ul><li>Claude Code、Codex、Cursor、Windsurf 等工具让长时运行、多文件修改、子代理派发和 MCP 调用成为常见能力。</li><li>社区的讨论随之出现一种层级错位：有人在讨论 Agent 内部怎么构成，有人在讨论开发流程怎么设计，有人在比较哪个第三方套件更强——三组人各有道理，但很难对齐。</li></ul><p>2026 年初，OpenAI 在一篇关于 Codex 的文章里首次使用 <code>Harness Engineering</code> 这个组合词，把 <code>harness</code> 从 Agent 构件的语境推进到使用者侧的工程实践。随后几周内，Anthropic 发表了长时运行 Agent 的 harness 设计指南，LangChain 做了 Agent Harness 的构件解剖；Linux.DO 上一个持续数月的长帖则把这些概念带进了真实项目的实操验证。</p><p>这篇文章综合了上述材料和社区实践，围绕五个问题展开：Harness Engineering 是什么，它怎样运行，它解决什么问题，怎样优化它的成本，以及如何落地。</p><h2 id="概念与边界">概念与边界<a title="#概念与边界" href="#概念与边界"></a></h2><p><code>harness</code> 这个词被用得很泛，接近&quot;模型之外的一切&quot;。拆开看，它指向两层不同的问题。</p><p>LangChain 给出的公式最简洁：</p><blockquote><p>Agent = Model + Harness</p></blockquote><p>模型提供语言与推理，harness 提供状态、工具、执行路径、沙箱、上下文管理和反馈机制。</p><p>LangChain 的文章把这些构件分为六类：文件系统、bash 执行、沙箱与验证工具、记忆与搜索、上下文腐败对抗、长程自主执行所需的规划和自验证循环<sup id="fnref-1"><a href="#fn-1">[1]</a></sup>。</p><p>OpenAI 的文章把这个词推到使用者侧之后，<code>Harness Engineering</code> 成了一个独立的工程范式，关注 Coding Agent 怎样被组织进一个可以稳定产出可验收变更的开发流程。</p><div class="φbq"><div class="φbs"><table><thead><tr><th>维度</th><th>Agent Harnesses</th><th>Harness Engineering</th></tr></thead><tbody><tr><td>关注对象</td><td>Agent 的构件</td><td>使用 Agent 的工程系统</td></tr><tr><td>核心问题</td><td>它由什么组成</td><td>它如何被驾驭成开发流程</td></tr><tr><td>典型材料</td><td>system prompts、tools、MCP、memory、sandbox、subagents</td><td><code>AGENTS.md</code>、spec、runbook、tracker、门禁、审查</td></tr><tr><td>成熟标志</td><td>Agent 具备工具和约束</td><td>开发过程具备控制面、验证闭环和验收标准</td></tr></tbody></table></div></div><figure style="margin: 24px 0; width: 100%;"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1120 720" role="img" aria-labelledby="harness-engineering-control-system-harness-layers-diagram-title harness-engineering-control-system-harness-layers-diagram-desc" width="100%" height="auto" preserveAspectRatio="xMidYMid meet" style="display: block; width: 100%; max-width: 100%; height: auto;">  <title id="harness-engineering-control-system-harness-layers-diagram-title">Harness Engineering 分层模型</title>  <desc id="harness-engineering-control-system-harness-layers-diagram-desc">展示 Agent Harnesses 的构件层、Harness Engineering 的工程控制层，以及从工具层到交付层的成熟度推进。</desc>  <defs>    <marker id="harness-engineering-control-system-harness-layers-arrow" markerWidth="7" markerHeight="7" refX="6" refY="3.5" orient="auto">      <polygon points="0 0, 7 3.5, 0 7" fill="#5a5a5a"/>    </marker>  </defs>  <style>    text { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, "PingFang SC", "Microsoft YaHei", sans-serif; }    .title { font-size: 28px; font-weight: 700; fill: #1a1a1a; }    .subtitle { font-size: 14px; fill: #6a6a6a; }    .section { fill: #fffdf8; stroke: #d9d3ca; stroke-width: 1.4; }    .band-left { fill: #f4e4c1; stroke: #8f7350; stroke-width: 1.2; }    .band-right { fill: #d8ece6; stroke: #4b7f72; stroke-width: 1.2; }    .node { fill: #ffffff; stroke: #4a4a4a; stroke-width: 1.5; }    .node-blue { fill: #dbeafe; stroke: #355c8a; stroke-width: 1.5; }    .node-green { fill: #dcfce7; stroke: #3d7a4d; stroke-width: 1.5; }    .node-amber { fill: #fef3c7; stroke: #8f7350; stroke-width: 1.5; }    .node-pink { fill: #fce7f3; stroke: #8a4768; stroke-width: 1.5; }    .chip { fill: #f8f6f3; stroke: #d9d3ca; stroke-width: 1; }    .label { font-size: 13px; fill: #5a5a5a; }    .node-title { font-size: 16px; font-weight: 700; fill: #1a1a1a; }    .node-sub { font-size: 12px; fill: #5a5a5a; }    .small { font-size: 11px; fill: #5a5a5a; }    .edge { fill: none; stroke: #5a5a5a; stroke-width: 2; marker-end: url(#harness-engineering-control-system-harness-layers-arrow); }    .soft-edge { fill: none; stroke: #8f8a82; stroke-width: 1.6; stroke-dasharray: 6 6; marker-end: url(#harness-engineering-control-system-harness-layers-arrow); }  </style>  <rect width="1120" height="720" fill="#f8f6f3"/>  <rect x="28" y="24" width="1064" height="672" rx="20" fill="#fffdf8" stroke="#d9d3ca" stroke-width="1.4"/>  <text x="60" y="68" class="title">Harness Engineering 分层模型</text>  <text x="60" y="94" class="subtitle">构件层回答 Agent 由什么组成；控制层回答这些能力如何进入可验收的开发流程。</text>  <rect x="60" y="132" width="480" height="256" rx="18" class="section"/>  <rect x="80" y="116" width="154" height="30" rx="15" class="band-left"/>  <text x="157" y="136" class="label" text-anchor="middle">构件层</text>  <text x="92" y="178" class="node-title">Agent Harnesses</text>  <text x="92" y="202" class="node-sub">让模型变成能执行任务的 Agent</text>  <rect x="92" y="226" width="134" height="56" rx="12" class="node-amber"/>  <text x="159" y="249" class="node-title" text-anchor="middle">内置能力</text>  <text x="159" y="268" class="small" text-anchor="middle">tools / memory</text>  <rect x="244" y="226" width="134" height="56" rx="12" class="node-amber"/>  <text x="311" y="249" class="node-title" text-anchor="middle">外部增强</text>  <text x="311" y="268" class="small" text-anchor="middle">skills / hooks</text>  <rect x="396" y="226" width="112" height="56" rx="12" class="node-amber"/>  <text x="452" y="249" class="node-title" text-anchor="middle">包裹系统</text>  <text x="452" y="268" class="small" text-anchor="middle">team / workspace</text>  <rect x="94" y="312" width="414" height="44" rx="12" class="chip"/>  <text x="301" y="340" class="label" text-anchor="middle">给 Agent 状态、工具、权限、上下文和反馈机制</text>  <rect x="580" y="132" width="480" height="256" rx="18" class="section"/>  <rect x="600" y="116" width="172" height="30" rx="15" class="band-right"/>  <text x="686" y="136" class="label" text-anchor="middle">工程控制层</text>  <text x="612" y="178" class="node-title">Harness Engineering</text>  <text x="612" y="202" class="node-sub">让 Agent 在项目规则里稳定交付</text>  <rect x="612" y="226" width="132" height="56" rx="12" class="node-green"/>  <text x="678" y="249" class="node-title" text-anchor="middle">规则</text>  <text x="678" y="268" class="small" text-anchor="middle">AGENTS / docs</text>  <rect x="762" y="226" width="132" height="56" rx="12" class="node-green"/>  <text x="828" y="249" class="node-title" text-anchor="middle">流程</text>  <text x="828" y="268" class="small" text-anchor="middle">spec / plan</text>  <rect x="912" y="226" width="112" height="56" rx="12" class="node-green"/>  <text x="968" y="249" class="node-title" text-anchor="middle">门禁</text>  <text x="968" y="268" class="small" text-anchor="middle">test / review</text>  <rect x="612" y="312" width="412" height="44" rx="12" class="chip"/>  <text x="818" y="340" class="label" text-anchor="middle">给开发过程边界、状态、验证、审查和纠偏</text>  <path d="M 540 260 H 580" class="edge"/>  <rect x="520" y="268" width="80" height="22" rx="10" fill="#fffdf8" stroke="#d9d3ca"/>  <text x="560" y="283" class="small" text-anchor="middle">组合进入</text>  <rect x="60" y="430" width="1000" height="206" rx="18" class="section"/>  <text x="92" y="470" class="node-title">成熟度推进</text>  <text x="92" y="494" class="node-sub">从工具补丁到项目级交付系统，逐层补齐当前最大痛点。</text>  <rect x="92" y="528" width="152" height="62" rx="14" class="node"/>  <text x="168" y="552" class="node-title" text-anchor="middle">工具层</text>  <text x="168" y="573" class="small" text-anchor="middle">prompt / skill</text>  <rect x="278" y="528" width="152" height="62" rx="14" class="node-blue"/>  <text x="354" y="552" class="node-title" text-anchor="middle">流程层</text>  <text x="354" y="573" class="small" text-anchor="middle">spec / plan</text>  <rect x="464" y="528" width="152" height="62" rx="14" class="node-green"/>  <text x="540" y="552" class="node-title" text-anchor="middle">状态层</text>  <text x="540" y="573" class="small" text-anchor="middle">tracker / handoff</text>  <rect x="650" y="528" width="152" height="62" rx="14" class="node-amber"/>  <text x="726" y="552" class="node-title" text-anchor="middle">控制层</text>  <text x="726" y="573" class="small" text-anchor="middle">gates / worktree</text>  <rect x="836" y="528" width="152" height="62" rx="14" class="node-pink"/>  <text x="912" y="552" class="node-title" text-anchor="middle">交付层</text>  <text x="912" y="573" class="small" text-anchor="middle">feature / debt</text>  <path d="M 244 559 H 278" class="edge"/>  <path d="M 430 559 H 464" class="edge"/>  <path d="M 616 559 H 650" class="edge"/>  <path d="M 802 559 H 836" class="edge"/>  <path d="M 300 388 V 430" class="soft-edge"/>  <path d="M 820 388 V 430" class="soft-edge"/>  <text x="560" y="666" class="label" text-anchor="middle">采用顺序：先判断项目缺什么，再选择外部 harness 如何补位。</text></svg><figcaption>Harness Engineering 分层模型</figcaption></figure><p>开发者与模型交互的粒度至少经历了三次跳跃：</p><div class="φbq"><div class="φbs"><table><thead><tr><th>阶段</th><th>交互尺度</th><th>主要失败来源</th><th>核心工程动作</th></tr></thead><tbody><tr><td>Prompt Engineering</td><td>单次交互</td><td>prompt 模糊、上下文缺失</td><td>改提示词</td></tr><tr><td>Context Engineering</td><td>会话级</td><td>上下文污染、记忆断裂</td><td>管理文件选择与压缩</td></tr><tr><td>Harness Engineering</td><td>项目级</td><td>控制面失真、任务漂移、验证不足</td><td>设计规则、门禁、反馈回路</td></tr></tbody></table></div></div><p>这个边界直接影响诊断方向：Agent 产出不稳定时，先判断缺的是构件能力还是流程设计——缺构件补 MCP、skill、hook；缺流程补任务边界、质量门禁、runbook 和控制面纪律。</p><p>很多&quot;为什么套件功能很多、结果仍然不稳&quot;的困惑，根源在于把两类问题混在一起。</p><h2 id="运行结构">运行结构<a title="#运行结构" href="#运行结构"></a></h2><p>把开发流程当作工程对象之后，核心结构是三层工作面：</p><ul><li><strong>控制面</strong>：orchestration、tracker、prompts、交接文档、任务依赖与阻塞状态。</li><li><strong>执行面</strong>：每个任务从集成面切出的 worktree/branch，承载本次修改与定向验证。</li><li><strong>集成面</strong>：本地真实代码状态，所有任务完成后的合并目标。</li></ul><figure style="margin: 24px 0; width: 100%;"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1120 620" role="img" aria-labelledby="harness-engineering-control-system-control-loop-diagram-title harness-engineering-control-system-control-loop-diagram-desc" width="100%" height="auto" preserveAspectRatio="xMidYMid meet" style="display: block; width: 100%; max-width: 100%; height: auto;">  <title id="harness-engineering-control-system-control-loop-diagram-title">Harness Engineering 控制回路</title>  <desc id="harness-engineering-control-system-control-loop-diagram-desc">控制面、执行面、集成面和验证反馈构成 Coding Agent 开发闭环。</desc>  <defs>    <marker id="harness-engineering-control-system-control-loop-arrow" markerWidth="7" markerHeight="7" refX="6" refY="3.5" orient="auto">      <polygon points="0 0, 7 3.5, 0 7" fill="#5a5a5a"/>    </marker>  </defs>  <style>    text { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, "PingFang SC", "Microsoft YaHei", sans-serif; }    .title { font-size: 28px; font-weight: 700; fill: #1a1a1a; }    .subtitle { font-size: 14px; fill: #6a6a6a; }    .lane { fill: #ffffff; stroke: #d9d3ca; stroke-width: 1.4; }    .lane-title { font-size: 17px; font-weight: 700; fill: #1a1a1a; }    .node-title { font-size: 16px; font-weight: 700; fill: #1a1a1a; }    .label { font-size: 13px; fill: #5a5a5a; }    .small { font-size: 11px; fill: #5a5a5a; }    .node-blue { fill: #dbeafe; stroke: #355c8a; stroke-width: 1.5; }    .node-amber { fill: #fef3c7; stroke: #8f7350; stroke-width: 1.5; }    .node-green { fill: #dcfce7; stroke: #3d7a4d; stroke-width: 1.5; }    .node-pink { fill: #fce7f3; stroke: #8a4768; stroke-width: 1.5; }    .edge { fill: none; stroke: #5a5a5a; stroke-width: 2; marker-end: url(#harness-engineering-control-system-control-loop-arrow); }    .soft-edge { fill: none; stroke: #8f8a82; stroke-width: 1.6; stroke-dasharray: 6 6; marker-end: url(#harness-engineering-control-system-control-loop-arrow); }  </style>  <rect width="1120" height="620" fill="#f8f6f3"/>  <rect x="28" y="24" width="1064" height="572" rx="20" fill="#fffdf8" stroke="#d9d3ca" stroke-width="1.4"/>  <text x="60" y="68" class="title">Harness Engineering 控制回路</text>  <text x="60" y="92" class="subtitle">控制面定义事实和规则，执行面完成切片，集成面承载可验证代码，验证反馈回到控制面。</text>  <rect class="lane" x="48" y="120" width="1024" height="110" rx="16"/>  <rect class="lane" x="48" y="260" width="1024" height="110" rx="16"/>  <rect class="lane" x="48" y="400" width="1024" height="110" rx="16"/>  <text class="lane-title" x="72" y="154">控制面</text>  <text class="lane-title" x="72" y="294">执行面</text>  <text class="lane-title" x="72" y="434">集成与验证</text>  <rect class="node-blue" x="190" y="142" width="180" height="64" rx="12"/>  <text class="node-title" x="216" y="169">读取真相</text>  <text class="label" x="216" y="189">orchestration / tracker</text>  <rect class="node-blue" x="430" y="142" width="180" height="64" rx="12"/>  <text class="node-title" x="456" y="169">选择任务切片</text>  <text class="label" x="456" y="189">unlocked / blocked</text>  <rect class="node-blue" x="760" y="142" width="180" height="64" rx="12"/>  <text class="node-title" x="786" y="169">更新控制面</text>  <text class="label" x="786" y="189">handoff / next task</text>  <rect class="node-amber" x="310" y="282" width="180" height="64" rx="12"/>  <text class="node-title" x="336" y="309">派发实现</text>  <text class="label" x="336" y="329">worktree / subagent</text>  <rect class="node-amber" x="560" y="282" width="180" height="64" rx="12"/>  <text class="node-title" x="586" y="309">修复问题</text>  <text class="label" x="586" y="329">失败分支回流</text>  <rect class="node-green" x="250" y="422" width="180" height="64" rx="12"/>  <text class="node-title" x="276" y="449">合入集成面</text>  <text class="label" x="276" y="469">latest code truth</text>  <rect class="node-pink" x="510" y="422" width="180" height="64" rx="12"/>  <text class="node-title" x="536" y="449">验证与审查</text>  <text class="label" x="536" y="469">test / build / review</text>  <path class="edge" d="M370 174 H430"/>  <path class="edge" d="M520 206 V244 H405 V282"/>  <path class="edge" d="M400 346 V386 H342 V422"/>  <path class="edge" d="M430 454 H510"/>  <path class="edge" d="M690 454 H760 V346 H732"/>  <path class="soft-edge" d="M650 282 V234 H850 V206"/>  <path class="edge" d="M690 422 H850 V206"/>  <path class="edge" d="M850 142 V106 H280 V142"/>  <text class="small" x="755" y="252">通过验证：吸收事实</text>  <text class="small" x="700" y="374">验证失败：返回修复</text>  <text class="label" x="500" y="560" text-anchor="middle">完成标准来自真实命令输出、diff、审查结果和人工决策点。</text></svg><figcaption>Harness Engineering 控制回路</figcaption></figure><p>分离的核心目的是把&quot;应当如何推进&quot;和&quot;代码实际是什么&quot;拆开。</p><p>Agent 可以读控制面决定下一步做什么，但判断完成必须回到集成面看真实 diff、真实测试输出、真实构建结果——社区把这条纪律称为 Truth-first。</p><p>它反制的是一类具体失败：Agent 把 tracker 标记当成完成状态继续推进，旧 diff 被带入后续切片，错误在几轮交接后才暴露。</p><h3 id="引导与检测">引导与检测<a title="#引导与检测" href="#引导与检测"></a></h3><p>三层工作面定义了结构骨架，填充它的机制是引导和检测。Böckeler 在 Martin Fowler 站上用控制论框架对 harness 做了正交分解<sup id="fnref-2"><a href="#fn-2">[2]</a></sup>。</p><p><strong>第一个维度是方向:</strong></p><ul><li><code>guides / 引导</code>在 Agent 行动前指明正确方向：<code>AGENTS.md</code>、<a href="http://architecture.md">architecture.md</a>、skill 指令、LSP 集成、runbook。</li><li><code>sensors / 反馈</code>在 Agent 行动后检测和修正偏差：测试、lint、typecheck、code review、构建结果。</li></ul><p><strong>第二个维度是执行方式:</strong></p><ul><li><code>computational / 计算型</code>是确定性的 CPU 执行，成本低、结果可靠：lint、typecheck、ArchUnit、覆盖率检查。</li><li><code>inferential / 推理型</code>是 LLM/GPU 执行，成本高、非确定性，但能处理语义判断：<code>AGENTS.md</code> 指令、code review skill、AI judge。</li></ul><div class="φbq"><div class="φbs"><table><thead><tr><th style="padding:0"></th><th>引导（行动前）</th><th>反馈（行动后检测）</th></tr></thead><tbody><tr><td><strong>计算型</strong></td><td>LSP、bootstrap 脚本、OpenRewrite</td><td>lint、typecheck、ArchUnit、覆盖率</td></tr><tr><td><strong>推理型</strong></td><td><code>AGENTS.md</code>、architecture skill、API 文档</td><td>code review skill、AI judge、日志异常检测</td></tr></tbody></table></div></div><p>引导和反馈相互配合：</p><ul><li>只有反馈的系统让 Agent “反复犯同样的错误”——测试告诉它错了，但它不知道正确方向。</li><li>只有引导的系统&quot;编码了规则却永远不知道规则是否生效&quot;——<code>AGENTS.md</code> 写得再好，没有测试就无法闭环。</li><li>harness 的设计工作就是沿着四个象限逐一补齐，并通过<strong>转向循环</strong>（steering loop）持续迭代。</li></ul><h3 id="文档作为模型间的-api">文档作为模型间的 API<a title="#文档作为模型间的-api" href="#文档作为模型间的-api"></a></h3><p>多模型协作时，不同模型的上下文容量、推理强度和响应形态各不相同。直接互读原始执行日志会造成上下文膨胀和判断污染。</p><p>解决方式是把文档当作模型间的 API：</p><div class="φbq"><div class="φbs"><table><thead><tr><th>文档类型</th><th>生产者</th><th>消费者</th><th>接口职责</th></tr></thead><tbody><tr><td>历史大纲摘要</td><td>压缩模型 / 整理 Agent</td><td>高阶决策模型</td><td>去噪、保留状态</td></tr><tr><td><code>AGENTS.md</code></td><td>人类 / 高阶模型</td><td>执行 Agent</td><td>固化规则与边界</td></tr><tr><td>版本开发报告</td><td>执行 Agent</td><td>人类 + 其他模型</td><td>固化踩坑和未完成项</td></tr><tr><td>进度文件</td><td>每轮 Agent</td><td>下一轮 Agent</td><td>跨上下文窗口的连续记忆</td></tr></tbody></table></div></div><p>Anthropic 的指南把这个模式具象化：<code>claude-progress.txt</code> 跨会话维护，配合 <code>feature_list.json</code> 和 git log 构成启动信息。</p><p>每轮 Agent 的固定启动序列：<code>pwd</code> → 读进度文件 → 读功能清单 → <code>git log --oneline -20</code> → 运行 <code>init.sh</code> → 跑冒烟测试确认基线 → 开始工作。</p><p>LangChain 把 <code>AGENTS.md</code> 定义为一种<strong>持续学习</strong>机制——短期记忆固化为长期记忆的通道。</p><p>这是 harness 与传统 README 的实质分歧：harness 文档面向机器消费，字段稳定度和术语一致性比文笔重要。</p><p><code>tracker.md</code> 里一个字段从 <code>blocked</code> 改成 <code>waiting</code> 可能让下游 Agent 判断逻辑失效——这是 API 层面的破坏性变更。</p><h3 id="人类作为隐式-harness">人类作为隐式 harness<a title="#人类作为隐式-harness" href="#人类作为隐式-harness"></a></h3><p>Böckeler 指出：<strong>人类本身就是一种隐式 harness</strong>。人类开发者自带被吸收的编码规范、对复杂度的审美厌恶（“一个 300 行的函数看着就不对”）、社会问责（名字挂在 commit 上）、组织记忆，以及对&quot;承重约定&quot;与&quot;习惯约定&quot;的直觉区分。</p><p>Agent 缺少全部这些能力。harness 外显化了其中一部分。</p><h2 id="解决什么问题">解决什么问题<a title="#解决什么问题" href="#解决什么问题"></a></h2><p>Anthropic 的长时运行指南列出了几种具名的失败模式：</p><ul><li><strong>one-shotting</strong>：试图一次性完成所有工作，跑到一半上下文耗尽</li><li><strong>premature victory declaration</strong>：Agent 看到部分进展就宣布完成</li><li><strong>dirty handoffs</strong>：切片结束时留下未文档化的 bug 和半成品状态</li></ul><p>这些失败模式都源自 harness 缺失。Anthropic 直接说明，即便是 Opus 4.5 在 Claude Agent SDK 的循环中跨多个上下文窗口运行，缺少 harness 模式的约束就&quot;无法构建出生产级的 Web 应用&quot;<sup id="fnref-3"><a href="#fn-3">[3]</a></sup>。</p><h3 id="验证质量的天花板">验证质量的天花板<a title="#验证质量的天花板" href="#验证质量的天花板"></a></h3><p>Agent 自生成测试只覆盖模型自身理解到的路径，遗漏真实业务和历史 bug 走过的路径。局部实现里问题不大，重构场景里是系统性漏洞——重构要保持的恰恰是 Agent 没有理解到的行为。</p><p>Anthropic 的观察：Agent 会写单元测试、用 <code>curl</code> 打 dev server 端点，但仍然&quot;无法识别端到端功能不工作&quot;。引入浏览器自动化（Puppeteer MCP）做端到端验证后，“Agent 能够识别和修复仅从代码看不出来的 bug”。</p><p>Böckeler 的框架把这个问题定位到更大的缺口：<strong>行为验证（functional correctness）是当前最难解决的维度</strong>。代码风格有 lint，架构约束有 ArchUnit，可维护性有覆盖率——但&quot;功能是否正确&quot;主要依赖 AI 自生成测试和人工验收。</p><p>一种有前景但适用范围有限的模式是 <strong>approved fixtures</strong>——人类审批预期输出后将其固化为回归锚点。</p><p>门禁的测试集需要人工参与</p><ul><li>关键路径的回归集必须来自既有系统、线上样本或人工定义的验收用例</li><li>AI 自生成测试补边界，人工定义测试守核心行为。</li></ul><h2 id="成本与调优">成本与调优<a title="#成本与调优" href="#成本与调优"></a></h2><p>长时运行 Agent 的典型故障是&quot;跑得动但很贵&quot;。Linux.DO 社区的 OMO 实践数据可以作为机制信号：</p><ul><li>某次约 24 小时的运行里，集成面输出约 38 个文件、670 行代码改动；同期控制面产出 17 个文件、约 4933 行记录。控制面产出在行数上是集成面的七倍多<sup id="fnref-4"><a href="#fn-4">[4]</a></sup>。</li><li>一次 32 小时长跑里，48 个文件产生约 3333 行代码，token 消耗超过 10 亿。追溯发现交接提示词里混入了&quot;最小可执行单元&quot;倾向，每个 worktree 只改 1–3 个文件、几行到几十行 diff。</li><li>统一术语、瘦身控制面、调整切片策略之后，9 小时完成 65 个文件、约 1539 行改动，token 约 2.2 亿。时间效率和 token 产出比都改善了一个量级。</li></ul><h3 id="贪婪切片">贪婪切片<a title="#贪婪切片" href="#贪婪切片"></a></h3><p>这组数据指向一个反直觉的结论：<strong>任务粒度越细，单位产出的固定成本越高</strong>。每个切片都要跑 planning、边界确认、handoff、实现、focused test、审查、merge、tracker 更新——这是一组几乎不随切片大小变化的固定开销。</p><p>直觉上&quot;小批次、快反馈&quot;在人类协作中成立，因为人类 review 成本近似线性于 diff 大小。Agent 的 review 成本是亚线性的——读 200 行和读 20 行在 token 消耗上量级接近。</p><p>最优切片粒度因此从&quot;尽量小&quot;变成&quot;小到能通过验证，同时大到值得跑完整门禁&quot;。社区把这个策略称为<strong>贪婪切片</strong>。</p><h3 id="context-rot-对策">Context rot 对策<a title="#context-rot-对策" href="#context-rot-对策"></a></h3><p>与控制面熵增并行的另一个机制是 <strong>context rot</strong>——LangChain 的术语，指随着上下文窗口填满，模型的推理能力退化。三种对策：</p><ul><li><strong>compaction</strong>：上下文临近容量时智能摘要和卸载</li><li><strong>tool call offloading</strong>：大块工具输出只保留首尾，全文写入文件系统按需读取</li><li><strong>progressive disclosure</strong>：用 skills 机制按需展开能力，启动时不加载全部工具定义<sup id="fnref-5"><a href="#fn-5">[5]</a></sup></li></ul><p>共同思路是把上下文当作稀缺资源管理。</p><h3 id="harnessability">Harnessability<a title="#harnessability" href="#harnessability"></a></h3><p>Böckeler 提出的 <strong>harnessability</strong> 概念：代码库被 harness 的难度差异很大。提升有效性的结构性属性：</p><ul><li>强类型语言——类型检查本身就是内置 sensor</li><li>清晰的模块边界——支持架构约束规则</li><li>抽象框架如 Spring——隐式提高首次正确率</li></ul><p>她把这些称为&quot;环境可供性&quot;（ambient affordances），结构性属性让环境本身对 Agent 可读、可导航、可操作。</p><p>遗留系统面临一个悖论：最需要 harness 的地方，恰恰是 harness 最难建的地方。</p><h2 id="落地路径">落地路径<a title="#落地路径" href="#落地路径"></a></h2><figure style="margin: 24px 0; width: 100%;"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1040 860" role="img" aria-labelledby="harness-engineering-control-system-harness-adoption-flow-diagram-title harness-engineering-control-system-harness-adoption-flow-diagram-desc" width="100%" height="auto" preserveAspectRatio="xMidYMid meet" style="display: block; width: 100%; max-width: 100%; height: auto;">  <title id="harness-engineering-control-system-harness-adoption-flow-diagram-title">Harness Engineering 采用决策流程</title>  <desc id="harness-engineering-control-system-harness-adoption-flow-diagram-desc">从痛点识别、基础条件判断、控制层选择，到执行闭环和度量反馈的流程图。</desc>  <defs>    <marker id="harness-engineering-control-system-harness-adoption-flow-arrow" markerWidth="7" markerHeight="7" refX="6" refY="3.5" orient="auto">      <polygon points="0 0, 7 3.5, 0 7" fill="#5a5a5a"/>    </marker>  </defs>  <style>    text { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, "PingFang SC", "Microsoft YaHei", sans-serif; }    .title { font-size: 28px; font-weight: 700; fill: #1a1a1a; }    .subtitle { font-size: 14px; fill: #6a6a6a; }    .region-title { font-size: 16px; font-weight: 700; fill: #1a1a1a; }    .node-title { font-size: 15px; font-weight: 700; fill: #1a1a1a; }    .node-sub { font-size: 12px; fill: #5a5a5a; }    .label { font-size: 13px; fill: #5a5a5a; }    .small { font-size: 11px; fill: #5a5a5a; }    .chip { fill: #f8f6f3; stroke: #d9d3ca; stroke-width: 1; }    .chip-text { font-size: 11px; fill: #5a5a5a; }    .edge { fill: none; stroke: #5a5a5a; stroke-width: 2; marker-end: url(#harness-engineering-control-system-harness-adoption-flow-arrow); }    .soft-edge { fill: none; stroke: #8f8a82; stroke-width: 1.6; stroke-dasharray: 6 6; marker-end: url(#harness-engineering-control-system-harness-adoption-flow-arrow); }    .start { fill: #dbeafe; stroke: #355c8a; stroke-width: 1.8; }    .process { fill: #dcfce7; stroke: #3d7a4d; stroke-width: 1.8; }    .decision { fill: #fef3c7; stroke: #8f7350; stroke-width: 1.8; }    .output { fill: #e8e0f0; stroke: #6b5b8a; stroke-width: 1.8; }    .repair { fill: #fce7f3; stroke: #8a4768; stroke-width: 1.8; }    .rail { fill: #fffdf8; stroke: #d9d3ca; stroke-width: 1.4; }    .frame { fill: #fffdf8; stroke: #d9d3ca; stroke-width: 1.4; }  </style>  <rect width="1040" height="860" fill="#f8f6f3"/>  <rect x="24" y="24" width="992" height="812" rx="20" class="frame"/>  <text x="64" y="70" class="title">Harness Engineering 采用决策流程</text>  <text x="64" y="96" class="subtitle">先确认基础条件，再选择最小控制层，最后用真实验证和反馈数据修正流程。</text>  <rect x="64" y="124" width="912" height="58" rx="14" class="rail"/>  <text x="86" y="154" class="region-title">阅读顺序</text>  <text x="190" y="154" class="label">痛点识别</text>  <text x="300" y="154" class="label">基础条件</text>  <text x="410" y="154" class="label">控制层选择</text>  <text x="550" y="154" class="label">执行闭环</text>  <text x="665" y="154" class="label">度量反馈</text>  <text x="775" y="154" class="label">流程瘦身</text>  <rect x="390" y="220" width="260" height="72" rx="24" class="start"/>  <text x="520" y="251" text-anchor="middle" class="node-title">识别当前最大痛点</text>  <text x="520" y="274" text-anchor="middle" class="node-sub">上下文、质量、长任务、token 成本</text>  <path d="M 520 292 V 342" class="edge"/>  <path d="M 520 342 L 660 420 L 520 498 L 380 420 Z" class="decision"/>  <text x="520" y="414" text-anchor="middle" class="node-title">基础条件清楚？</text>  <text x="520" y="436" text-anchor="middle" class="node-sub">需求、runbook</text>  <text x="520" y="454" text-anchor="middle" class="node-sub">测试数据、完成标准</text>  <path d="M 380 420 H 160 V 548" class="edge"/>  <rect x="196" y="402" width="46" height="22" rx="7" class="chip"/>  <text x="219" y="417" text-anchor="middle" class="chip-text">不清楚</text>  <rect x="80" y="548" width="260" height="90" rx="14" class="repair"/>  <text x="210" y="584" text-anchor="middle" class="node-title">先补基础材料</text>  <text x="210" y="607" text-anchor="middle" class="node-sub">收敛需求，补 runbook</text>  <text x="210" y="627" text-anchor="middle" class="node-sub">准备真实验收用例</text>  <path d="M 520 498 V 548" class="edge"/>  <rect x="536" y="510" width="34" height="22" rx="7" class="chip"/>  <text x="553" y="525" text-anchor="middle" class="chip-text">清楚</text>  <rect x="390" y="548" width="260" height="90" rx="14" class="process"/>  <text x="520" y="583" text-anchor="middle" class="node-title">选择最小控制层</text>  <text x="520" y="606" text-anchor="middle" class="node-sub">工具层、流程层、状态层、控制层</text>  <text x="520" y="626" text-anchor="middle" class="node-sub">从当前痛点补一层</text>  <path d="M 650 593 H 740" class="edge"/>  <rect x="740" y="548" width="220" height="90" rx="14" class="output"/>  <text x="850" y="583" text-anchor="middle" class="node-title">进入执行闭环</text>  <text x="850" y="606" text-anchor="middle" class="node-sub">读事实，改代码，跑验证</text>  <text x="850" y="626" text-anchor="middle" class="node-sub">修复失败，合入，更新状态</text>  <path d="M 850 638 V 704 H 520 V 674" class="soft-edge"/>  <rect x="724" y="688" width="92" height="22" rx="7" class="chip"/>  <text x="770" y="703" text-anchor="middle" class="chip-text">反馈修正</text>  <rect x="390" y="674" width="260" height="90" rx="14" class="process"/>  <text x="520" y="709" text-anchor="middle" class="node-title">度量是否改善</text>  <text x="520" y="732" text-anchor="middle" class="node-sub">交付速度、验证通过率、返工率</text>  <text x="520" y="752" text-anchor="middle" class="node-sub">token 投入产出比</text>  <path d="M 390 719 H 210 V 638" class="soft-edge"/>  <rect x="250" y="702" width="94" height="22" rx="7" class="chip"/>  <text x="297" y="717" text-anchor="middle" class="chip-text">证据不足</text>  <rect x="696" y="220" width="264" height="194" rx="16" class="rail"/>  <text x="724" y="254" class="region-title">执行时守住三条线</text>  <text x="724" y="292" class="label">1. Truth-first：代码事实以集成面为准</text>  <text x="724" y="326" class="label">2. 控制面瘦身：只保留当前事实</text>  <text x="724" y="360" class="label">3. 贪婪切片：同模块同验证路径合并</text>  <path d="M 650 256 H 696" class="edge"/></svg><figcaption>Harness Engineering 采用决策流程</figcaption></figure><p>采用 harness engineering 的判断简化为三步：先看基础条件是否就绪（需求、runbook、测试数据、完成标准），再选择最小控制层补当前最大痛点，最后用真实交付数据修正系统。</p><p>个人或小团队起步不需要重型多 Agent 平台。一个可行的最小目录：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">AGENTS.md                   # 项目规则、禁止事项、默认验证命令、完成标准</span><br><span class="line">docs/architecture.md        # 模块边界、数据流、外部依赖、高风险区域</span><br><span class="line">docs/runbooks/dev-test.md   # 安装、启动、测试、联调、日志收集</span><br><span class="line">docs/plans/current.md       # 当前任务目标、非目标、方案、验收标准</span><br><span class="line">docs/tracker.md             # 任务状态、依赖、阻塞、完成证据</span><br></pre></td></tr></table></figure><p>每轮执行结束只要求一份最小完成证明：改了什么、为什么这样改、跑了什么验证、还剩什么风险、下一步是否需要人类决策。</p><p>外部套件的选型应当倒着来——先定位自身痛点，再判断套件补的是哪一层：</p><div class="φbq"><div class="φbs"><table><thead><tr><th>痛点</th><th>对应的能力层</th><th>可参考的套件方向</th></tr></thead><tbody><tr><td>需求澄清不足</td><td>流程层前段</td><td>Superpowers 的 brainstorming 和 TDD</td></tr><tr><td>长任务无人值守</td><td>状态层 + 控制层</td><td>OMO 的 orchestration</td></tr><tr><td>命令多、难记</td><td>流程层</td><td>GSD 的命令收敛</td></tr><tr><td>需要沉淀团队规则</td><td>静态设施</td><td>Trellis 的规范积累</td></tr><tr><td>控制面成本过高</td><td>控制层</td><td>CodeStable 的极简理念</td></tr><tr><td>跨产品、角色协作</td><td>交付层</td><td>BMAD、gstack 的产品闭环</td></tr></tbody></table></div></div><h3 id="什么时候应当按兵不动">什么时候应当按兵不动<a title="#什么时候应当按兵不动" href="#什么时候应当按兵不动"></a></h3><p>三种情况下应先补基础：</p><ul><li>需求本身仍然混乱，验收标准没定</li><li>关键路径没有可用的回归测试或真实数据</li><li>项目规则已经过期，<code>AGENTS.md</code> 和代码事实不一致</li></ul><p>在这种状态下加 workflow 会放大噪音，加 agent teams 会放大分歧，加自动化会放大错误传播。更稳的顺序是先把需求、runbook、测试数据和完成标准补齐。</p><p>衡量 harness 是否有效只需两个指标：返工率和验证通过率。两个指标持平或倒退，任何套件、角色、编排都只是控制面的装饰。</p><h3 id="注释">注释<a title="#注释" href="#注释"></a></h3><ol><li><span id="fn-1"></span>LangChain 在 Terminal Bench 2.0 上的发现佐证了这一点：同一个 Opus 4.6 模型在不同 harness 中得分差异巨大。LangChain 的 coding agent 仅通过改进 harness（不换模型）就从排行榜第 30 名升至前 5 名。harness 的设计质量对产出的影响不亚于模型本身。 <a href="#fnref-1">↩</a></li><li><span id="fn-2"></span>这个框架的理论根基是控制论。Böckeler 引用了 Ashby 的必要多样性定律（Law of Requisite Variety）：调节器需要拥有至少与被调节系统一样多的多样性。Coding Agent 几乎可以生成任何代码——约束拓扑结构（技术栈、模块边界、命名规范）是一种品种削减动作，让 harness 的覆盖变得可行。 <a href="#fnref-2">↩</a></li><li><span id="fn-3"></span>Anthropic 为此设计了一套双 Agent 架构：Initializer Agent 在首次会话中建立项目脚手架、生成结构化功能清单（JSON 格式，因为模型&quot;更不容易不恰当地修改 JSON 文件&quot;），Coding Agent 在后续每次会话中读取已有状态、增量完成单个功能、测试并留下干净状态。两个 Agent 共享同一个 system prompt 和工具集——区别只是 user prompt 不同。 <a href="#fnref-3">↩</a></li><li><span id="fn-4"></span>这里的比例来自具体项目和套件，在多轮复盘里一致出现。 <a href="#fnref-4">↩</a></li><li><span id="fn-5"></span>其中 compaction 已被 Claude Agent SDK 内置，但 Anthropic 指出 compaction “并不总是能把足够清晰的指令传递给下一个 Agent”，因此仍需要外部持久化机制（进度文件、git log、结构化功能清单）作为补充。 <a href="#fnref-5">↩</a></li></ol>]]>
    </content>
    <id>https://blog.becase.top/post/55459</id>
    <link href="https://blog.becase.top/post/55459"/>
    <published>2026-05-07T00:00:00.000Z</published>
    <summary>
      <![CDATA[<p>2025 年下半年开始，Coding Agent 的能力边界快速扩张</p>
<ul>
<li>Claude Code、Codex、Cursor、Windsurf 等工具让长时运行、多文件修改、子代理派发和 MCP 调用成为常见能力。</li>
<li>社区的讨论随之出现一]]>
    </summary>
    <title>Harness Engineering：驾驭 Coding Agent 的工程实践</title>
    <updated>2026-08-04T09:27:28.568Z</updated>
  </entry>
  <entry>
    <author>
      <name>jiechen</name>
    </author>
    <content>
      <![CDATA[<p>他年轻时以为钱是用来把房子变大的。后来才知道，人真正需要的空间很小。一间五十多平米的公寓，如果楼下有超市，常去的地方都在附近，生活已经很完整。郊区的大房子看上去体面，住久了只是多了打扫的负担，死要面子活受罪。</p><p>他也曾想过要有一场体面的归来，让人记住自己的名字。后来觉得这念头有些滑稽。人最后都会被忘记，而且忘得很快。他连隔了两代的太公叫什么都说不清，却曾认真计划过让后人记住自己。</p><p>他曾给自己设定一个数字，觉得到了才算成功。后来发现，钱大多只是换个地方待着，要么进了税表，要么瞎寄把投亏个精光，很难留下什么。能把一家公司做下去，让一群人有收入，他们背后各有家庭，也算是功德一件，至于别人领不领情就随便吧。</p><p>他一度觉得自己很特别。后来发现，不过是在少数事情上做得还可以。每个人都有这样的地方，也就谈不上什么特别，区别只在于有人更早意识到这一点。</p><p>他也曾认真比较人与人之间的高低。后来才明白，有些差异来自努力，更多来自运气。很多事并不在人的掌控之内。他曾经不信命，后来发现都是命。</p>]]>
    </content>
    <id>https://blog.becase.top/post/2026042701</id>
    <link href="https://blog.becase.top/post/2026042701"/>
    <published>2026-04-27T00:00:00.000Z</published>
    <summary>
      <![CDATA[<p>他年轻时以为钱是用来把房子变大的。后来才知道，人真正需要的空间很小。一间五十多平米的公寓，如果楼下有超市，常去的地方都在附近，生活已经很完整。郊区的大房子看上去体面，住久了只是多了打扫的负担，死要面子活受罪。</p>
<p>他也曾想过要有一场体面的归来，让人记住自己的名字。]]>
    </summary>
    <title>少年意气不可再生</title>
    <updated>2026-08-04T09:27:28.568Z</updated>
  </entry>
  <entry>
    <author>
      <name>jiechen</name>
    </author>
    <content>
      <![CDATA[<p>很多人以为，所谓成长，就是积累越来越多的经验。</p><p>这当然没错。经验能帮人更快判断、更快行动，也能减少大量试错成本。问题在于，经验不仅提高效率，也会固化视角。一个人越熟悉某个行业、某种做法、某套组织流程，就越容易默认“事情本来就该这样”。</p><p>所以，很多问题并不是没人努力，而是大家太快接受了既有答案。看起来是在解决问题，实际上只是沿着旧路径做优化；看起来是在做判断，实际上只是从经验库里调出一个熟悉模板。</p><p>第一性原理的价值，就在这里。</p><p>它不是为了反对经验，也不是为了显得比别人更“底层思考”。它真正重要的地方在于：<strong>当经验不再可靠时，它能帮助我们重新回到问题本身。</strong></p><h2 id="什么是第一性原理">什么是第一性原理<a title="#什么是第一性原理" href="#什么是第一性原理"></a></h2><p>如果用尽量朴素的话来定义，第一性原理就是：</p><p><strong>把一个问题不断往下拆，拆到那些不能再借用习惯说法、只能面对事实本身的层次，再从那里重新组织答案。</strong></p><p>很多时候，我们并不是直接面对问题，而是在面对一层又一层被包装过的说法。比如：</p><ul><li>用户要这个功能</li><li>行业里都这么做</li><li>市场就是这个规律</li><li>组织规模大了只能这样</li><li>成本太高，不可能做</li></ul><p>这些话不一定错，但它们大多不是最底层的事实，而是阶段性的结论、历史路径，或者只在特定条件下成立的经验总结。</p><p>第一性原理要求我们暂停接受这些现成结论，重新追问几个更底层的问题：</p><ul><li>我们真正要解决的问题是什么？</li><li>这个目标成立的必要条件是什么？</li><li>现在被视为“理所当然”的前提，哪些是硬约束，哪些只是惯性？</li><li>如果不沿用现有做法，是否还能从更底层的事实推出另一种方案？</li></ul><p>换句话说，第一性原理不是“从零开始胡思乱想”，而是<strong>从更少的假设开始思考</strong>。</p><h2 id="第一性原理的反面，不是愚蠢，而是惯性">第一性原理的反面，不是愚蠢，而是惯性<a title="#第一性原理的反面，不是愚蠢，而是惯性" href="#第一性原理的反面，不是愚蠢，而是惯性"></a></h2><p>很多人把第一性原理理解成“聪明人才能用的高级思维”。其实不是。它真正对应的反面，并不是缺少智力，而是过早接受既有框架。</p><p>人在工作里最容易出现三种偏离。</p><h3 id="1.-把经验当真理">1. 把经验当真理<a title="#1.-把经验当真理" href="#1.-把经验当真理"></a></h3><p>经验的价值在于，它让我们不必每次都从头思考。但经验一旦被误用，就会从“提高效率的工具”变成“限制可能性的边界”。</p><p>一个成熟团队最常见的表达方式是：</p><ul><li>我们以前试过，不行</li><li>这个行业不是这么干的</li><li>用户不会为这个买单</li><li>这类需求最后都会变成那样</li></ul><p>这些判断有时确实对，但危险在于，它们太像正确答案了，以至于很少有人继续追问：当初为什么不行？是在什么条件下不行？今天的条件变了吗？失败的是目标本身，还是实现路径？</p><p>经验最容易让人忽略的，不是事实，而是条件。</p><h3 id="2.-把手段当目的">2. 把手段当目的<a title="#2.-把手段当目的" href="#2.-把手段当目的"></a></h3><p>在产品、增长、管理里，人很容易把中间变量误认成最终目标。</p><p>比如做产品时，以为自己的任务是“上线一个功能”；做增长时，以为目标是“把转化率拉高”；做团队管理时，以为关键是“建立更严密的流程”。但这些往往都只是手段，不是目的。</p><p>真正的问题可能是：</p><ul><li>用户想完成什么任务，而不是想要什么功能</li><li>业务到底要的是高质量收入，还是短期数字好看</li><li>团队真正缺的是协同清晰度，而不是流程数量</li></ul><p>一旦手段被误认成目的，后续所有努力都可能非常勤奋，但方向越来越偏。</p><h3 id="3.-把约束当天花板">3. 把约束当天花板<a title="#3.-把约束当天花板" href="#3.-把约束当天花板"></a></h3><p>现实里当然有很多约束：预算、时间、人力、技术债、组织关系、市场环境。这些都真实存在。但真实存在，不等于它们都不可被重构。</p><p>很多时候，人不是被约束打败的，而是太早接受了约束的解释方式。</p><p>比如“我们没有资源做这件事”，有时真正的意思可能是：</p><ul><li>我们没法按原来的大方案做</li><li>现有团队不擅长这种路径</li><li>当前优先级不支持同时推进这么多事</li></ul><p>这三句话和“完全做不了”之间，差别非常大。</p><p>第一性原理的重要一步，就是把“约束”拆开看：哪些是物理层面的硬约束，哪些是资源分配问题，哪些只是组织默认选项。</p><h2 id="为什么成熟的人反而更需要第一性原理">为什么成熟的人反而更需要第一性原理<a title="#为什么成熟的人反而更需要第一性原理" href="#为什么成熟的人反而更需要第一性原理"></a></h2><p>新人常犯的错误，是不知道怎么做；成熟的人更常犯的错误，是太快认为自己已经知道怎么做。</p><p>经验越多，越容易形成高效的判断捷径。大多数时候，这是优势。但当环境、用户、技术和组织规模都在变化时，旧经验也会悄悄从资产变成负担。</p><p>一个人真正成熟，不是拥有更多模板，而是知道什么时候不能再依赖模板。</p><p>第一性原理在这里像一种“认知刹车”。它强迫我们在关键问题上停下来，重新确认：</p><ul><li>我们现在优化的，到底是不是那个真正重要的问题？</li><li>当前结论，是来自事实，还是来自熟悉感？</li><li>我们以为不可动的前提，是真的不可动，还是因为已经太久没人质疑？</li></ul><p>它不是要你在所有小事上都从头推演，而是在<strong>那些决定方向、资源配置和长期结果的关键判断上，避免被惯性带偏。</strong></p><h2 id="第一性原理如何改变判断">第一性原理如何改变判断<a title="#第一性原理如何改变判断" href="#第一性原理如何改变判断"></a></h2><p>如果要把它变成一套可操作的框架，我会把它整理成四步。</p><h3 id="第一步：重新定义真正目标">第一步：重新定义真正目标<a title="#第一步：重新定义真正目标" href="#第一步：重新定义真正目标"></a></h3><p>很多问题之所以越做越复杂，不是因为问题本身复杂，而是因为起点定义错了。</p><p>在开始讨论方案之前，先问一句：<strong>我们到底想得到什么结果？</strong></p><p>这句话听起来简单，但它能过滤掉大量伪问题。</p><p>例如：</p><ul><li>目标不是“做一个社区功能”，而是提升用户之间的信息交换效率</li><li>目标不是“提高开会频率”，而是降低跨团队协同的失真成本</li><li>目标不是“把价格打下来”，而是用更可持续的方式提高用户感知价值</li></ul><p>当目标被重新表述后，很多原本显得理所当然的方案，会立刻失去必然性。</p><h3 id="第二步：拆掉默认前提">第二步：拆掉默认前提<a title="#第二步：拆掉默认前提" href="#第二步：拆掉默认前提"></a></h3><p>接着要问的是：我们现在认定为真的东西，哪些只是默认前提？</p><p>例如：</p><ul><li>用户必须经过这条流程</li><li>这个产品必须长成这样</li><li>这类业务只能靠投放增长</li><li>组织一大就必须层层审批</li></ul><p>这里最有价值的动作，不是马上反驳，而是把前提一条条写出来，再分别审视：</p><ul><li>它是事实，还是经验总结？</li><li>它在什么条件下成立？</li><li>如果条件变化了，它还成立吗？</li><li>如果拿掉这条前提，会出现什么新可能？</li></ul><p>很多所谓创新，并不是得到了神秘灵感，而只是有人愿意重新检查那些大家默认不再检查的前提。</p><h3 id="第三步：区分硬约束和软约束">第三步：区分硬约束和软约束<a title="#第三步：区分硬约束和软约束" href="#第三步：区分硬约束和软约束"></a></h3><p>不是所有限制都一样。</p><p>硬约束是那些短期内无法绕开的事实，比如物理规律、明确的法律要求、账户现金流、系统当前承载上限。软约束则往往是阶段性形成的，比如组织分工、流程设计、预算分配、团队认知、历史系统结构。</p><p>这两者如果不分开，团队就很容易把“现在不方便做”误判成“根本不可能做”。</p><p>第一性原理不是忽视约束，而是要求我们把约束分类。只有分类之后，判断才会更准确：</p><ul><li>硬约束决定边界</li><li>软约束决定优先级和改造成本</li></ul><p>很多突破，本质上都发生在软约束被重新定义的那一刻。</p><h3 id="第四步：回到事实和机制，重新构造方案">第四步：回到事实和机制，重新构造方案<a title="#第四步：回到事实和机制，重新构造方案" href="#第四步：回到事实和机制，重新构造方案"></a></h3><p>当前提被拆开、目标被澄清、约束被分类之后，才轮到方案设计。</p><p>这时的提问方式会发生变化：</p><ul><li>用户完成这件事最小需要哪些条件？</li><li>价值是如何被产生的，阻力又是在哪里出现的？</li><li>哪个环节是真正的瓶颈？</li><li>如果不沿用现在的组织方式、产品形式、商业路径，还有没有更直接的实现方法？</li></ul><p>从这个阶段开始，方案才真正建立在事实和机制上，而不是建立在熟悉路径上。</p><h2 id="那些看似朴素的话，为什么往往更接近底层">那些看似朴素的话，为什么往往更接近底层<a title="#那些看似朴素的话，为什么往往更接近底层" href="#那些看似朴素的话，为什么往往更接近底层"></a></h2><p>很多人接触第一性原理，容易把它想得很抽象，仿佛必须借助复杂概念才能表达。其实真正接近底层的判断，往往都很朴素，甚至朴素到像一句“常识”。</p><p>比如这些话：</p><ul><li>攒钱就是改运</li><li>早睡就是续命</li><li>读书就是开悟</li><li>自律就是破局</li><li>认知就是出路</li><li>行善就是积德</li><li>闭嘴就是避灾</li><li>独处就是修心</li></ul><p>这些表达之所以容易打动人，不是因为它们华丽，而是因为它们都在做同一件事：<strong>绕过中间层的包装，直接指向更底层的因果。</strong></p><p>“攒钱就是改运”，本质上不是在夸奖节省，而是在强调现金流和选择权；“早睡就是续命”，不是在贩卖自律焦虑，而是在承认身体是所有长期行动的基础设施；“读书就是开悟”，不是把阅读神圣化，而是在说一个人的判断边界，很大程度上受限于他接触过多少高质量思想。</p><p>再往下看，“自律就是破局”说的是人能否摆脱即时反馈的控制；“认知就是出路”说的是你能看见什么，就大致决定了你能走到哪里；“闭嘴就是避灾”提醒的是表达成本和情绪成本；“独处就是修心”则是在说，一个人如果不能和自己稳定相处，就很难建立真正稳固的内在秩序。</p><p>这些话未必在任何场景里都百分之百成立，但它们提供了一种很有价值的训练：<strong>不要只盯着表面动作，要继续往下问，这个动作真正改变的底层变量是什么。</strong></p><p>从这个角度看，第一性原理并不总是表现为宏大的推演。很多时候，它只是把一句原本说得很直白的话，重新看出它背后的结构。</p><h2 id="三个典型案例">三个典型案例<a title="#三个典型案例" href="#三个典型案例"></a></h2><h3 id="案例一：用户要的真的是功能吗">案例一：用户要的真的是功能吗<a title="#案例一：用户要的真的是功能吗" href="#案例一：用户要的真的是功能吗"></a></h3><p>产品团队很容易把用户表达，直接翻译成功能需求。</p><p>用户说想要“导出”“筛选”“标签”“提醒”“协作”“看板”，于是团队开始排需求、定交互、做迭代。最后功能做出来了，用户却未必更满意。因为用户真正想要的，通常不是某个功能，而是某个结果。</p><p>比如一个用户说“我需要标签系统”，表面上看是在要一个功能，底层可能是在表达三种完全不同的需求：</p><ul><li>我需要更快找到信息</li><li>我需要把不同类型的任务区分开</li><li>我需要和别人共享同一种分类方式</li></ul><p>如果不往下拆，团队会默认“标签”就是答案；一旦回到第一性原理，就会发现问题其实是“信息组织效率”和“协同一致性”。于是可行方案未必只有标签，也可能是搜索优化、默认视图、智能分类、模板化分组，甚至只是更清晰的信息架构。</p><p>这里最容易犯的错，就是把用户提出的方案，当成用户真正的需求。</p><p>第一性原理提醒产品人：<strong>用户最知道自己哪里不舒服，但不一定最知道系统应该怎么设计。</strong></p><h3 id="案例二：行业共识真的不可挑战吗">案例二：行业共识真的不可挑战吗<a title="#案例二：行业共识真的不可挑战吗" href="#案例二：行业共识真的不可挑战吗"></a></h3><p>创业和业务判断里，行业共识经常被当作隐形边界。</p><p>比如有人会说：</p><ul><li>这个市场只能靠补贴启动</li><li>高客单价产品必须靠销售驱动</li><li>内容平台一定要先做规模，再做商业化</li><li>这个品类的毛利决定了你只能这样运营</li></ul><p>这些话可能都来自真实案例，但真实案例不等于普遍真理。行业共识往往是历史条件、成本结构、技术限制、渠道结构共同作用的结果。一旦底层条件变化，原有共识就可能失效。</p><p>第一性原理的问法会是：</p><ul><li>用户为什么愿意付费？</li><li>交易成本到底发生在哪一环？</li><li>信任是靠什么建立的？</li><li>价值交付的最小闭环是什么？</li></ul><p>当问题被拆到这个层面，你会发现很多所谓“行业规律”，其实只是上一代条件下的最优解，而不是永恒解。</p><p>创业里真正重要的，不是盲目反常识，而是识别：<strong>到底是规律本身不可违背，还是我们只是在沿用旧世界的解法。</strong></p><h3 id="案例三：团队管理要的真是更多流程吗">案例三：团队管理要的真是更多流程吗<a title="#案例三：团队管理要的真是更多流程吗" href="#案例三：团队管理要的真是更多流程吗"></a></h3><p>团队一旦变大，管理动作通常会迅速增加：更多会议、更多汇报、更多审批、更多同步机制。这些动作表面上是在提升管理能力，实际上常常只是对混乱的一种补偿。</p><p>如果从第一性原理出发，管理问题首先不是“要不要加流程”，而是：</p><ul><li>当前失控到底发生在哪里？</li><li>是目标不清、职责不清、信息滞后，还是决策权分布失衡？</li><li>我们要解决的是失误率、协同成本，还是责任不清？</li></ul><p>如果根因是目标不一致，那么加流程的效果可能有限；如果根因是信息透明度不足，那么更频繁的会议未必是最优解；如果根因是决策权和责任不对齐，那么审批层级越多，反而越慢。</p><p>很多组织问题不是“缺流程”，而是没有先分清楚：流程是在替代清晰，还是在放大混乱。</p><p>所以成熟的管理判断，不是本能地给系统加控制，而是回到系统失效的最小原因上。</p><h2 id="第一性原理不是万能方法，而是关键时刻的校准工具">第一性原理不是万能方法，而是关键时刻的校准工具<a title="#第一性原理不是万能方法，而是关键时刻的校准工具" href="#第一性原理不是万能方法，而是关键时刻的校准工具"></a></h2><p>讲到这里，一个常见误解也需要澄清：第一性原理并不意味着所有事情都必须从零思考。</p><p>如果一个问题已经高度成熟、反馈明确、变化很小，那么直接借用经验通常是更高效的做法。没有必要在每一次细小决策上都重新拆解世界。那样不仅成本过高，也会让组织失去执行速度。</p><p>第一性原理真正适合的，是这几类场景：</p><ul><li>你发现大家都很努力，但结果长期没有改善</li><li>你感觉讨论始终围绕方案，没人重新定义问题</li><li>你发现团队高度依赖经验，但环境已经明显变化</li><li>你隐约意识到某个“常识”正在限制判断空间</li></ul><p>在这些时刻，第一性原理像一个校准工具。它不会自动给出答案，但会帮你清掉错误前提，让你重新看见问题。</p><p>成熟的人不是不用经验，而是能在经验和本质之间切换。</p><p>该借经验时借经验，因为效率重要；该回到底层时回到底层，因为方向更重要。</p><h2 id="结语">结语<a title="#结语" href="#结语"></a></h2><p>第一性原理最珍贵的地方，不在于它听起来更高级，而在于它能逼着人承认一件事：我们平时很多所谓“理所当然”的判断，其实只是被继承下来的解释。</p><p>经验当然重要，但经验只能告诉我们过去怎样成立，不能保证未来仍然如此。真正拉开差距的，往往不是谁掌握了更多现成答案，而是谁愿意在关键时刻暂停惯性，重新追问：</p><ul><li>这件事真正要解决什么？</li><li>我们现在相信的，到底是事实，还是习惯？</li><li>如果把旧答案暂时拿掉，还能不能从更底层重新推出新的判断？</li></ul><p>第一性原理并不会让人自动变得更聪明，但它会让人的思考更诚实。</p><p>说到底，所谓成熟，不是掌握越来越多漂亮说法，而是越来越能穿过说法，看见底层变量；不是越来越会引用经验，而是越来越知道什么时候必须回到事实本身。</p><p>在复杂的产品判断、业务决策和组织管理里，诚实地面对问题本身，往往就是更好答案的起点。</p>]]>
    </content>
    <id>https://blog.becase.top/post/20260329</id>
    <link href="https://blog.becase.top/post/20260329"/>
    <published>2026-03-29T17:31:00.000Z</published>
    <summary>
      <![CDATA[<p>很多人以为，所谓成长，就是积累越来越多的经验。</p>
<p>这当然没错。经验能帮人更快判断、更快行动，也能减少大量试错成本。问题在于，经验不仅提高效率，也会固化视角。一个人越熟悉某个行业、某种做法、某套组织流程，就越容易默认“事情本来就该这样”。</p>
<p>所以，很多]]>
    </summary>
    <title>第一性原理</title>
    <updated>2026-08-04T09:27:28.572Z</updated>
  </entry>
  <entry>
    <author>
      <name>jiechen</name>
    </author>
    <category term="tech" scheme="https://blog.becase.top/categories/tech/"/>
    <category term="cs" scheme="https://blog.becase.top/categories/tech/cs/"/>
    <category term="AI" scheme="https://blog.becase.top/tags/AI/"/>
    <category term="工具选型" scheme="https://blog.becase.top/tags/%E5%B7%A5%E5%85%B7%E9%80%89%E5%9E%8B/"/>
    <content>
      <![CDATA[<h1 id="关于 ai 工具选型 &amp; 个人实践方式">关于 AI 工具选型 &amp; 个人实践方式<a title="#关于 ai 工具选型 &amp; 个人实践方式" href="#关于 ai 工具选型 &amp; 个人实践方式"></a></h1><p>为准备<strong>下单</strong>心仪工具的同学，提供取舍攻略参考</p><h2 id="主流工具对比">主流工具对比<a title="#主流工具对比" href="#主流工具对比"></a></h2><p>三种方式对比：官方订阅（Claude Code + Codex） / API 中转服务 / Antigravity等 IDE 集成</p><blockquote><p>个人主观判断，非客观标准</p></blockquote><ul><li><p>价格友好方面，Antigravity ＞ 中转服务 ＞ 官方订阅</p><ul><li>假设可报销的费用一定，那能否榨干剩余价值是一门学问</li></ul></li><li><p>灵活性上，中转服务 &gt; 官方订阅 &gt; Antigravity</p><ul><li>中转服务可配置 Claude 和 Codex</li></ul></li><li><p>编程能力上，官方订阅 &gt; 中转服务 &gt; Antigravity</p><ul><li><p>官方订阅自带的生态最优</p></li><li><p>中转服务因为号池缓存命中率的问题，会低于官方订阅</p></li></ul></li><li><p>账号稳定性上，Antigravity &gt; 中转服务 &gt; 官方订阅</p><ul><li><p>官方订阅需要处理：购买渠道、访问线路</p></li><li><p>中转服务存在跑路情况</p></li></ul></li><li><p>使用稳定性上， 中转服务 &gt; Antigravity &gt; 官方订阅</p><ul><li><p>Retrygravity，老生常谈</p></li><li><p>官方订阅存在访问网路问题</p></li></ul></li><li><p>上手易用性上，Antigravity &gt; 中转服务 &gt; 官方订阅</p><ul><li><p>中转服务通常具备一键配置的 shell 脚本</p></li><li><p>Antigravity 开箱即用</p></li></ul></li></ul><h3 id="踩过的坑 &amp; 一些经验">踩过的坑 &amp; 一些经验<a title="#踩过的坑 &amp; 一些经验" href="#踩过的坑 &amp; 一些经验"></a></h3><h4 id="价格成本上">价格成本上<a title="#价格成本上" href="#价格成本上"></a></h4><ul><li><p>Antigravity Ultra 通过家庭组六人均摊，成本预计 300¥，再通过前期打半价的手段，成本能降低到 150¥ </p><ul><li><p>禁止反代</p></li><li><p>每个谷歌账号需保持 location =&gt; 美国</p></li><li><p>需要确保家庭组去续费的渠道，为国外渠道</p></li></ul></li><li><p>中转服务</p><ul><li>个人日常使用，每日额度预计需要 70$，换算到具体的中转服务套餐费用上，即 500¥/月 左右</li></ul></li><li><p>官方订阅</p><ul><li>没有可操作空间</li></ul></li></ul><h4 id="在解决官方订阅的购买渠道和访问线路问题上">在解决官方订阅的购买渠道和访问线路问题上<a title="#在解决官方订阅的购买渠道和访问线路问题上" href="#在解决官方订阅的购买渠道和访问线路问题上"></a></h4><ul><li><p>购买渠道：Apple渠道卡、国内 visa 卡折转 Google Play ，这两种方案会被封</p><ul><li><p>香港卡不行</p></li><li><p>国外信用卡，目前是相对稳定的解</p></li></ul></li><li><p>访问线路：为解决纯净 IP 的问题，通过机场 + vps 落地（价格友好 + 处理简单）</p><ul><li>但是会影响自身的访问网速，体感明显</li></ul></li></ul><blockquote><p>命题：魔高一尺，道高一丈</p></blockquote><ul><li>举个例子：官方可通过筛选在东八区时区使用频繁的账号，可进一步锁定国区选手</li></ul><blockquote><p>在 Claude 严厉打击国内使用的背景下，个人觉得无论怎么绕后门，对方都有反制措施（Claude 本身不在乎退款），只能寄希望于官方本身松口 —— 类似 GPT睁一眼闭一眼</p></blockquote><h4 id="中转服务的小tips">中转服务的小tips<a title="#中转服务的小tips" href="#中转服务的小tips"></a></h4><ul><li><p>优先考虑稳定性 + 建站时间长（择取原则，类似机场）</p></li><li><p>好的中转服务，是<strong>支持开发票</strong>的</p></li><li><p>最好采购两到三个备用</p></li><li><p>速率原因，建议主力使用 Codex（0.25 ：1）/ 对比 Claude 普遍（1:1.3）</p><ul><li>因为 GPT Team 封号情况相对 Claude 缓解很多</li></ul></li></ul><h3 id="个人抉择">个人抉择<a title="#个人抉择" href="#个人抉择"></a></h3><p>个人的使用诉求如下：</p><ul><li><p>希望既能用 Codex，也能用 Claude</p><ul><li>Codex 和 Claude 能互相审阅对方，不会出现独断专裁<ul><li>使用场景：Codex 跑方案，Claude 核查；反之亦然</li></ul></li></ul></li><li><p>上手易用性和稳定性</p></li></ul><p>最后选择了 ++API 中转服务 + Antigravity 丐版++</p><ul><li><p><strong>丐版</strong>指的是，不用 Antigravity 来进行 VibeCoding，只用来当 IDE 查阅代码</p><ul><li>为什么不用 VS Code？因为未来还有购买 Antigravity Ultra 账号的可能（属于 Plan B）</li></ul></li><li><p>中转服务购买两个</p><ul><li>鸡蛋不放一个篮子里</li></ul></li></ul><h2 id="api中转服务相关">API中转服务相关<a title="#api中转服务相关" href="#api中转服务相关"></a></h2><ul><li><p>API 中转服务介绍：<a href="./post/2026030601">AI API 中转服务深度解析</a></p></li><li><p>各中转服务网站概览 &amp; 评测：<a href="https://www.helpaio.com/transit" target="_blank">https://www.helpaio.com/transit</a>、<a href="https://www.getcheapai.com/zh-cn" target="_blank">https://www.getcheapai.com/zh-cn</a></p></li><li><p>个人使用的中转服务：</p><ul><li><p><a href="https://www.sssaicode.com/register?ref=6KL3V5" target="_blank">sss-ai</a>（支持包月、支持开票-低消 100）</p></li><li><p><a href="https://www.packyapi.com/register?aff=0EjI" target="_blank">packy-code</a>（按量付费、支持开票-低消 500）</p></li></ul></li><li><p>sss-ai 使用举例</p><ul><li>如图，通过 shell 脚本，将 token 写入环境变量，可实现一键安装</li></ul></li><li><p>服务来回切换的配置异常问题</p></li><li><p>场景：使用 a 服务，然后要切换 b 服务，后面又切回 a 服务</p></li><li><p>原因：因为中转服务的配置，通常是 shell 脚本一键覆盖，可能会将自身已经存在的服务覆盖掉，在 a、b 来回切的过程中，环境变量可能存在冲突</p></li><li><p>解决方式：修改 agent 的全局配置，如 <code>.codex/auth.json</code>中，查看实际生效的 provider，进行修改</p></li></ul><h2 id="个人日常使用姿势">个人日常使用姿势<a title="#个人日常使用姿势" href="#个人日常使用姿势"></a></h2><p>Antigravity IDE + Claude Code 插件 + Codex 桌面端：</p><ol><li><p>使用 Codex 处理编程任务，多个代码仓库并行跑任务</p><ol><li>任务两遍没过，就用 Claude 审阅</li></ol></li><li><p>复杂问题使用 Claude Code 插件</p><ol><li>插件是在 IDE 插件市场可下载</li></ol></li><li><p>出现多次 work error 的场景，使用 Claude 跟 Codex 互相审阅</p><ol><li>《双方来打辩论赛》</li></ol></li><li><p>把 Antigravity 自带的 Gemini 当谷歌用</p></li></ol><h3 id="关于 codex、claude 二者的配置同步">关于 Codex、Claude 二者的配置同步<a title="#关于 codex、claude 二者的配置同步" href="#关于 codex、claude 二者的配置同步"></a></h3><p>使用 AI 来帮我完成，例如 <code>prompt: 把当前 Claude code 的全局 rules 、mcp 和 subagent 配置同步到 Codex 中</code></p><h3 id="关于 claud code 的使用（推荐）">关于 Claud Code 的使用（推荐）<a title="#关于 claud code 的使用（推荐）" href="#关于 claud code 的使用（推荐）"></a></h3><p>参阅这篇文章：<a href="https://x.com/HiTw93/status/2032091246588518683" target="_blank">《你不知道的 Claude Code：架构、治理与工程实践》-- 推特</a>（由浅入深，干货满满）</p><ul><li><p>建议学下其中的优化手段，这样对 VibeCoding 有帮助</p></li><li><p>关注其中 SKILL 的使用：<code>npx skills add tw93/claude-health</code>，用以优化自身的 Claude</p></li></ul><h3 id="个人的 claude 全局 rules">个人的 Claude 全局 rules<a title="#个人的 claude 全局 rules" href="#个人的 claude 全局 rules"></a></h3><p>其中特色点：</p><ul><li><p>预处理：是否 plan、是否 subagent</p><ul><li>subagent 会相对更耗 token，需酌情</li></ul></li><li><p>任务留存：关注其中的 lessons 和 task 生成逻辑</p><ul><li>类似简化版本的 SDD 方案</li></ul></li><li><p>安全：key、secret 隔离</p></li></ul><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># ⚠️ 强制执行规则（CRITICAL — 每次任务必须遵守）</span></span><br><span class="line"></span><br><span class="line"><span class="section">## 任务开始前的强制检查（不可跳过）</span></span><br><span class="line"></span><br><span class="line">收到任何任务后，<span class="strong">**第一步必须**</span>在心中过以下检查清单，并在回复开头说明判断结果：</span><br></pre></td></tr></table></figure><p>[ ] 是否需要进入规划模式？（见下方判断标准）<br>[ ] 是否需要用子智能体并行处理？<br>[ ] 完成后如何验证结果？</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">### 「简单任务」白名单（以下情况才可跳过规划）</span><br><span class="line">- 只修改 3 个以内文件的单行或少量改动</span><br><span class="line">- 纯解释类、问答类请求（不写代码）</span><br><span class="line">- 明确且无歧义的单步操作</span><br><span class="line"></span><br><span class="line">**除上述情况外，所有任务都视为非简单任务，MUST 进入规划模式。**</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"># 工作流编排</span><br><span class="line"></span><br><span class="line">### 1. 规划节点（MUST 执行）</span><br><span class="line">- **MUST**：凡不符合「简单任务白名单」的任务，必须先进入规划模式</span><br><span class="line">- **MUST**：一旦出现问题，立即停止并重新规划，禁止强行推进</span><br><span class="line">- **MUST**：规划模式同样用于验证环节</span><br><span class="line">- **MUST**：提前编写详细规格，减少歧义</span><br><span class="line"></span><br><span class="line">### 2. 子智能体策略（MUST 执行）</span><br><span class="line">- **MUST**：调研、探索、并行分析类工作，交给子智能体处理</span><br><span class="line">- **MUST**：复杂问题通过多个子智能体增加算力投入</span><br><span class="line">- **MUST**：每个子智能体只专注一个方向，聚焦执行</span><br><span class="line">- 保持主上下文窗口简洁</span><br><span class="line"></span><br><span class="line">### 3. 自我优化循环（MUST 执行）</span><br><span class="line">- **MUST**：收到用户任何修正后，立即将规律写入 `tasks/lessons.md`</span><br><span class="line">- **MUST**：每次项目开始前，回顾 `tasks/lessons.md` 中的相关经验</span><br><span class="line">- 持续迭代规则，直到错误率下降</span><br><span class="line"></span><br><span class="line">### 4. 完成前验证（MUST 执行）</span><br><span class="line">- **MUST**：未验证可用前，禁止标记任务完成</span><br><span class="line">- **MUST**：自问「资深工程师会认可这段代码吗？」</span><br><span class="line">- **MUST**：运行测试、查看日志、证明逻辑正确</span><br><span class="line"></span><br><span class="line">### 5. 追求优雅（平衡版）</span><br><span class="line">- 非简单修改：停下来思考「有没有更优雅的写法？」</span><br><span class="line">- 如果修复方案感觉很别扭：实现优雅方案</span><br><span class="line">- 简单明确的修复可跳过，不要过度设计</span><br><span class="line">- 展示成果前，先严格自检</span><br><span class="line"></span><br><span class="line">### 6. 自主修复 Bug（MUST 执行）</span><br><span class="line">- **MUST**：收到 Bug 报告直接修复，无需用户一步步引导</span><br><span class="line">- **MUST**：定位日志、错误、失败用例，然后解决</span><br><span class="line">- **MUST**：主动修复 CI 失败测试，无需详细指令</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"># 任务管理（MUST 执行顺序）</span><br><span class="line"></span><br><span class="line">1. **先规划**：将计划写入 `tasks/todo.md`，列出可勾选项</span><br><span class="line">2. **验证计划**：开始实现前先确认方案</span><br><span class="line">3. **跟踪进度**：完成一项立即标记一项（不批量标记）</span><br><span class="line">4. **说明变更**：每步给出概要总结</span><br><span class="line">5. **记录结果**：在 `tasks/todo.md` 中添加评审章节</span><br><span class="line">6. **沉淀经验**：修正后立即更新 `tasks/lessons.md`</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"># 核心原则</span><br><span class="line"></span><br><span class="line">- **简洁优先**：每次修改尽可能简单，影响代码最小化</span><br><span class="line">- **拒绝敷衍**：定位根因，不做临时修复，按资深工程师标准要求</span><br><span class="line">- **最小影响**：只修改必要部分，避免引入新 Bug</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"># 注意事项</span><br><span class="line"></span><br><span class="line">- 确保使用中文进行回复、回答</span><br><span class="line">- 输出代码时，在代码的关键位置请添加注释，说明代码的用途</span><br><span class="line">- 创建项目的时候，需要同步创建 .gitignore 文件（如果已经存在则忽略）</span><br><span class="line">- 如果需要生成文档，默认 md 格式，默认保存到 doc 目录（README.md 除外），如果目录不存在则新建目录</span><br><span class="line">- 在做技术方案的调研或者复杂链路的分析时，默认生成一个流程图或者时序图或者架构图，来加以说明</span><br><span class="line">- 出现生成图片的场景，默认使用 svg 格式生成图片</span><br><span class="line"></span><br><span class="line">---</span><br><span class="line"></span><br><span class="line"># 安全规范（MUST 执行）</span><br><span class="line"></span><br><span class="line">### 凭证检查（每次任务开始前）</span><br><span class="line">- **MUST**：发现任何含 `secret` / `token` / `key` / `password` 字样的本地配置文件（如 `.env`、工具本地配置），立即检查是否已加入 `.gitignore`；未加入时先警告，再继续任务</span><br><span class="line">- **MUST**：禁止将凭证字面量写入工具命令白名单中；密钥统一通过环境变量引用（`$SECRET_KEY`）</span><br><span class="line">- **MUST**：`git add` 前检查暂存区是否包含敏感文件；若包含，立即停止并告知用户</span><br><span class="line"></span><br><span class="line">### tasks 文件保护</span><br><span class="line">- `tasks/` 目录的内容跨会话累积，切换分支前提醒用户确认 `tasks/lessons.md` 已保存</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://blog.becase.top/post/2026032001</id>
    <link href="https://blog.becase.top/post/2026032001"/>
    <published>2026-03-20T00:00:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="关于 ai 工具选型 &amp; 个人实践方式">关于 AI 工具选型 &amp; 个人实践方式<a title="#关于 ai 工具选型 &amp; 个人实践方式" href="#关于 ai 工具选型 &amp; 个人实践方式"></a></h1>
<p>为准备]]>
    </summary>
    <title>
      <![CDATA[AI 工具选型 & 个人实践方式]]>
    </title>
    <updated>2026-08-04T09:27:28.572Z</updated>
  </entry>
  <entry>
    <author>
      <name>jiechen</name>
    </author>
    <category term="tech" scheme="https://blog.becase.top/categories/tech/"/>
    <category term="business" scheme="https://blog.becase.top/categories/tech/business/"/>
    <category term="AI" scheme="https://blog.becase.top/tags/AI/"/>
    <category term="API" scheme="https://blog.becase.top/tags/API/"/>
    <category term="中转站" scheme="https://blog.becase.top/tags/%E4%B8%AD%E8%BD%AC%E7%AB%99/"/>
    <category term="安全" scheme="https://blog.becase.top/tags/%E5%AE%89%E5%85%A8/"/>
    <category term="LLM" scheme="https://blog.becase.top/tags/LLM/"/>
    <content>
      <![CDATA[<blockquote><p>本文起源于 V2EX 社区帖子 <a href="https://www.v2ex.com/t/1196011" target="_blank">AI 中转站黑话大全整理</a>（作者 v2exgo），在原帖内容基础上做了大量扩展和深入分析，面向专业研发人员，系统梳理 AI API 中转服务的技术架构、主流方案对比、安全风险评估与工程实践指南。</p></blockquote><hr><h2 id="一、ai-api-中转服务概述">一、AI API 中转服务概述<a title="#一、ai-api-中转服务概述" href="#一、ai-api-中转服务概述"></a></h2><h3 id="1.1-什么是中转服务">1.1 什么是中转服务<a title="#1.1-什么是中转服务" href="#1.1-什么是中转服务"></a></h3><p>AI API 中转服务（Relay / Proxy Service），本质上是一个 <strong>API 网关（API Gateway）</strong>，充当客户端应用与上游 AI 模型提供商（如 OpenAI、Anthropic、Google 等）之间的中间层。其核心工作流程：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Client App → [中转服务] → 上游 AI API Provider（OpenAI / Anthropic / Google ...）</span><br><span class="line">                ↑</span><br><span class="line">        请求转发、密钥注入、</span><br><span class="line">        格式转换、负载均衡、</span><br><span class="line">        计费计量、缓存优化</span><br></pre></td></tr></table></figure><p><strong>中转服务存在的技术背景：</strong></p><ul><li><strong>网络封锁</strong>：国内无法直接访问 <code>api.openai.com</code>、<code>api.anthropic.com</code> 等 endpoint</li><li><strong>支付壁垒</strong>：国际信用卡（Visa/Mastercard）绑定困难，部分平台不支持国内银行卡</li><li><strong>合规限制</strong>：部分 AI 服务商 ToS 明确限制特定地区的 API 访问</li></ul><p>中转服务通过在海外部署代理节点，将请求透传到目标 API，再将响应返回给国内客户端，解决了上述痛点。</p><h3 id="1.2-中转服务的技术架构">1.2 中转服务的技术架构<a title="#1.2-中转服务的技术架构" href="#1.2-中转服务的技术架构"></a></h3><p>一个典型的中转站技术架构如下：</p><p><img src="illustrations/relay-architecture.svg" alt="中转服务技术架构" loading="lazy" class="φbp"></p><p><strong>核心模块说明：</strong></p><div class="φbq"><div class="φbs"><table><thead><tr><th style="text-align:left">模块</th><th style="text-align:left">职责</th><th style="text-align:left">技术实现</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Auth 鉴权</strong></td><td style="text-align:left">验证客户端 API Key，鉴权计费</td><td style="text-align:left">JWT / API Key 校验</td></tr><tr><td style="text-align:left"><strong>Router 路由</strong></td><td style="text-align:left">根据模型名称路由到对应渠道</td><td style="text-align:left">模型名映射 + 优先级/权重策略</td></tr><tr><td style="text-align:left"><strong>Channel Pool</strong></td><td style="text-align:left">管理多个上游 API 账号/密钥</td><td style="text-align:left">连接池 + 健康检查 + 自动故障转移</td></tr><tr><td style="text-align:left"><strong>计费模块</strong></td><td style="text-align:left">Token 计量、余额扣减</td><td style="text-align:left">基于 <code>usage</code> 字段的流式/非流式计费</td></tr><tr><td style="text-align:left"><strong>负载均衡</strong></td><td style="text-align:left">跨渠道分发请求</td><td style="text-align:left">加权随机 / 轮询 / 优先级</td></tr></tbody></table></div></div><h3 id="1.3-产业链结构">1.3 产业链结构<a title="#1.3-产业链结构" href="#1.3-产业链结构"></a></h3><p><img src="illustrations/relay-supply-chain.svg" alt="产业链全景" loading="lazy" class="φbp"></p><hr><h2 id="二、主流中转服务方案">二、主流中转服务方案<a title="#二、主流中转服务方案" href="#二、主流中转服务方案"></a></h2><h3 id="2.1-开源自建方案">2.1 开源自建方案<a title="#2.1-开源自建方案" href="#2.1-开源自建方案"></a></h3><p>以下是目前社区最主流的开源中转站项目：</p><div class="φbq"><div class="φbs"><table><thead><tr><th style="text-align:left">项目</th><th style="text-align:left">技术栈</th><th style="text-align:left">核心特性</th><th style="text-align:left">GitHub Stars</th></tr></thead><tbody><tr><td style="text-align:left"><strong><a href="https://github.com/songquanpeng/one-api" target="_blank">One-API</a></strong></td><td style="text-align:left">Go + React</td><td style="text-align:left">统一 OpenAI 格式接口，支持 30+ 模型提供商，三层倍率体系，多机部署</td><td style="text-align:left">30k+</td></tr><tr><td style="text-align:left"><strong><a href="https://github.com/Calcium-Ion/new-api" target="_blank">New-API</a></strong></td><td style="text-align:left">基于 One-API 二开</td><td style="text-align:left">在 One-API 基础上增加 Midjourney/Suno 集成、缓存计费、企业级特性</td><td style="text-align:left">19k+</td></tr></tbody></table></div></div><p><strong>One-API / New-API 的倍率体系：</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">最终扣费 = (input_tokens + output_tokens × 补全倍率) × 模型倍率 × 分组倍率</span><br></pre></td></tr></table></figure><ul><li><strong>模型倍率（ModelRatio）</strong>：不同模型的基础计费倍数，基准为 <code>$0.002/1K tokens = 1 倍</code></li><li><strong>补全倍率（CompletionRatio）</strong>：输出 token 相对输入 token 的价格倍数</li><li><strong>分组倍率（GroupRatio）</strong>：针对不同用户组的差异化倍率</li></ul><blockquote><p><strong>💡 衍生建议：</strong> 对于高频、需要超长上下文的新一代 AI 编程工具（如 Claude Code），直接开通官方的订阅（如 $20/月的 Claude Pro）往往比在中转站被层层收取高额的输入、输出、缓存费用更便宜，且减少被封号或遇到模型被降智的风险。</p></blockquote><h3 id="2.2-商业中转服务">2.2 商业中转服务<a title="#2.2-商业中转服务" href="#2.2-商业中转服务"></a></h3><p>市面上也有大量商业化运营的中转站，通常提供：</p><ul><li>预充值余额 + 按量计费</li><li>人民币支付（微信/支付宝）</li><li>多模型一站式接入</li><li>客服/技术支持</li></ul><p><strong>选择商业中转站的核心考量：</strong></p><div class="φbq"><div class="φbs"><table><thead><tr><th style="text-align:left">维度</th><th style="text-align:left">评估要点</th></tr></thead><tbody><tr><td style="text-align:left"><strong>价格透明度</strong></td><td style="text-align:left">倍率是否公开？是否存在隐藏费用（汇率差、通道费）？</td></tr><tr><td style="text-align:left"><strong>渠道来源</strong></td><td style="text-align:left">官方 API Key vs 逆向工程 vs Azure 企业版？</td></tr><tr><td style="text-align:left"><strong>SLA 保障</strong></td><td style="text-align:left">是否承诺可用性（如 99.9%）？是否有故障补偿？</td></tr><tr><td style="text-align:left"><strong>合规性</strong></td><td style="text-align:left">是否提供发票？数据是否过境？是否有隐私协议？</td></tr></tbody></table></div></div><h3 id="2.3-企业级-llm-gateway">2.3 企业级 LLM Gateway<a title="#2.3-企业级-llm-gateway" href="#2.3-企业级-llm-gateway"></a></h3><p>对于有更高要求的企业场景，有专业的 LLM Gateway 方案：</p><div class="φbq"><div class="φbs"><table><thead><tr><th style="text-align:left">方案</th><th style="text-align:left">定位</th><th style="text-align:left">特色</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Cloudflare AI Gateway</strong></td><td style="text-align:left">网络原生 AI 网关</td><td style="text-align:left">缓存、重试、分析、全球 CDN 加速</td></tr><tr><td style="text-align:left"><strong>Kong AI Gateway</strong></td><td style="text-align:left">企业 API 管理</td><td style="text-align:left">插件生态、RBAC、审计日志</td></tr><tr><td style="text-align:left"><strong>LiteLLM</strong></td><td style="text-align:left">开源 Python Proxy</td><td style="text-align:left">100+ LLM API 统一为 OpenAI 格式</td></tr><tr><td style="text-align:left"><strong>Bifrost (Maxim AI)</strong></td><td style="text-align:left">高性能 AI 网关</td><td style="text-align:left">11000+ 模型、语义缓存、自动故障转移</td></tr></tbody></table></div></div><hr><h2 id="三、中转服务-vs-官方-api-对比">三、中转服务 vs 官方 API 对比<a title="#三、中转服务-vs-官方-api-对比" href="#三、中转服务-vs-官方-api-对比"></a></h2><h3 id="3.1-技术差异">3.1 技术差异<a title="#3.1-技术差异" href="#3.1-技术差异"></a></h3><p><img src="illustrations/relay-vs-official.svg" alt="官方 API vs 中转服务对比" loading="lazy" class="φbp"></p><h3 id="3.2-响应格式差异">3.2 响应格式差异<a title="#3.2-响应格式差异" href="#3.2-响应格式差异"></a></h3><p>正规中转站会完整透传官方 API 的响应格式，但部分低质量中转站可能存在以下问题：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// ❌ 常见问题：usage 字段缺失或不准确</span></span><br><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;choices&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span>...<span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;usage&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span>  <span class="comment">// 部分中转站不返回 usage，导致客户端无法统计 token</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// ❌ 常见问题：流式响应断裂</span></span><br><span class="line"><span class="comment">// SSE stream 中 chunk 丢失或延迟</span></span><br><span class="line">data<span class="punctuation">:</span> <span class="punctuation">&#123;</span><span class="attr">&quot;choices&quot;</span><span class="punctuation">:</span><span class="punctuation">[</span><span class="punctuation">&#123;</span><span class="attr">&quot;delta&quot;</span><span class="punctuation">:</span><span class="punctuation">&#123;</span><span class="attr">&quot;content&quot;</span><span class="punctuation">:</span><span class="string">&quot;Hello&quot;</span><span class="punctuation">&#125;</span><span class="punctuation">&#125;</span><span class="punctuation">]</span><span class="punctuation">&#125;</span></span><br><span class="line"><span class="comment">// ... 长时间无响应 ...</span></span><br><span class="line">data<span class="punctuation">:</span> <span class="punctuation">[</span>DONE<span class="punctuation">]</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// ❌ 常见问题：模型名映射错误</span></span><br><span class="line"><span class="comment">// 请求 claude-3.5-sonnet，实际路由到 claude-3-haiku</span></span><br></pre></td></tr></table></figure><hr><h2 id="四、如何识别是否在使用中转服务">四、如何识别是否在使用中转服务<a title="#四、如何识别是否在使用中转服务" href="#四、如何识别是否在使用中转服务"></a></h2><p>作为开发者，你可能需要确认你（或你的团队成员）使用的 API 是否为官方直连。以下是几种检测方法：</p><h3 id="4.1-检查-base-url">4.1 检查 Base URL<a title="#4.1-检查-base-url" href="#4.1-检查-base-url"></a></h3><p>最直接的方法——看 SDK 配置中的 <code>base_url</code>：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 官方直连</span></span><br><span class="line">client = OpenAI(</span><br><span class="line">    api_key=<span class="string">&quot;sk-xxx&quot;</span>,</span><br><span class="line">    base_url=<span class="string">&quot;https://api.openai.com/v1&quot;</span>  <span class="comment"># ✅ 官方</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 中转服务</span></span><br><span class="line">client = OpenAI(</span><br><span class="line">    api_key=<span class="string">&quot;sk-xxx&quot;</span>,</span><br><span class="line">    base_url=<span class="string">&quot;https://some-relay.example.com/v1&quot;</span>  <span class="comment"># ⚠️ 第三方</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure><p><strong>注意检查环境变量</strong>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 检查是否被环境变量覆盖</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$OPENAI_API_BASE</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$OPENAI_BASE_URL</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 常见的 IDE 插件（如 Cursor、Continue）配置文件</span></span><br><span class="line"><span class="built_in">cat</span> ~/.cursor/config.json</span><br><span class="line"><span class="built_in">cat</span> ~/.continue/config.json</span><br></pre></td></tr></table></figure><h3 id="4.2-http-响应头分析">4.2 HTTP 响应头分析<a title="#4.2-http-响应头分析" href="#4.2-http-响应头分析"></a></h3><p>通过 curl 直接检查响应头：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">curl -sI https://your-api-endpoint/v1/models \</span><br><span class="line">  -H <span class="string">&quot;Authorization: Bearer sk-xxx&quot;</span> | <span class="built_in">head</span> -20</span><br></pre></td></tr></table></figure><p><strong>官方 API 典型响应头：</strong></p><figure class="highlight http"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">server</span><span class="punctuation">: </span>cloudflare</span><br><span class="line"><span class="attribute">cf-ray</span><span class="punctuation">: </span>xxx-LAX</span><br><span class="line"><span class="attribute">openai-organization</span><span class="punctuation">: </span>org-xxx</span><br><span class="line"><span class="attribute">openai-processing-ms</span><span class="punctuation">: </span>150</span><br><span class="line"><span class="attribute">x-ratelimit-limit-requests</span><span class="punctuation">: </span>500</span><br><span class="line"><span class="attribute">x-ratelimit-remaining-requests</span><span class="punctuation">: </span>499</span><br></pre></td></tr></table></figure><p><strong>中转服务可能出现的响应头特征：</strong></p><figure class="highlight http"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">server</span><span class="punctuation">: </span>nginx                    # 非 cloudflare</span><br><span class="line"><span class="attribute">via</span><span class="punctuation">: </span>1.1 relay-proxy             # Via 头暴露代理</span><br><span class="line"><span class="attribute">x-forwarded-for</span><span class="punctuation">: </span>xxx             # 转发头</span><br><span class="line"><span class="attribute">x-real-ip</span><span class="punctuation">: </span>xxx                   # 真实 IP 头</span><br><span class="line"># 缺少 openai-organization 头</span><br><span class="line"># 缺少 x-ratelimit-* 头</span><br><span class="line"># 可能出现自定义头如 x-relay-channel 等</span><br></pre></td></tr></table></figure><h3 id="4.3-dns-/-ip-分析">4.3 DNS / IP 分析<a title="#4.3-dns-/-ip-分析" href="#4.3-dns-/-ip-分析"></a></h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 解析目标域名的 IP</span></span><br><span class="line">dig +short your-api-endpoint</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看 IP 归属</span></span><br><span class="line">whois $(dig +short your-api-endpoint) | grep -i org</span><br><span class="line"></span><br><span class="line"><span class="comment"># 官方 OpenAI API 通常解析到 Cloudflare 的 IP 段</span></span><br><span class="line"><span class="comment"># 中转站通常解析到 VPS 提供商（如 AWS、GCP、阿里云等）</span></span><br></pre></td></tr></table></figure><h3 id="4.4-api-key-格式鉴别">4.4 API Key 格式鉴别<a title="#4.4-api-key-格式鉴别" href="#4.4-api-key-格式鉴别"></a></h3><div class="φbq"><div class="φbs"><table><thead><tr><th style="text-align:left">API Key 格式</th><th style="text-align:left">说明</th></tr></thead><tbody><tr><td style="text-align:left"><code>sk-proj-xxx...</code></td><td style="text-align:left">OpenAI 官方项目密钥</td></tr><tr><td style="text-align:left"><code>sk-svcacct-xxx...</code></td><td style="text-align:left">OpenAI 服务账号密钥</td></tr><tr><td style="text-align:left"><code>sk-ant-xxx...</code></td><td style="text-align:left">Anthropic Claude 官方密钥</td></tr><tr><td style="text-align:left"><code>sk-</code> + 短字符串</td><td style="text-align:left">很可能是中转站自行签发的密钥</td></tr></tbody></table></div></div><hr><h2 id="五、如何评估中转服务的稳定性与可靠性">五、如何评估中转服务的稳定性与可靠性<a title="#五、如何评估中转服务的稳定性与可靠性" href="#五、如何评估中转服务的稳定性与可靠性"></a></h2><h3 id="5.1-核心评估指标">5.1 核心评估指标<a title="#5.1-核心评估指标" href="#5.1-核心评估指标"></a></h3><div class="φbq"><div class="φbs"><table><thead><tr><th style="text-align:left">指标</th><th style="text-align:left">测试方法</th><th style="text-align:left">合格基准</th></tr></thead><tbody><tr><td style="text-align:left"><strong>可用性（Uptime）</strong></td><td style="text-align:left">持续拨测 <code>/v1/models</code> endpoint</td><td style="text-align:left">≥ 99.9%（月宕机 ≤ 43 分钟）</td></tr><tr><td style="text-align:left"><strong>响应延迟（Latency）</strong></td><td style="text-align:left">轻量请求（max_tokens=1）多次采样</td><td style="text-align:left">P95 ≤ 2s，额外代理延迟 ≤ 300ms</td></tr><tr><td style="text-align:left"><strong>流式首 Token 延迟（TTFT）</strong></td><td style="text-align:left">流式请求首个 chunk 到达时间</td><td style="text-align:left">≤ 3s</td></tr><tr><td style="text-align:left"><strong>错误率（Error Rate）</strong></td><td style="text-align:left">统计 4xx/5xx 响应比例</td><td style="text-align:left">≤ 0.5%</td></tr><tr><td style="text-align:left"><strong>模型一致性</strong></td><td style="text-align:left">请求特定模型，验证返回的 <code>model</code> 字段</td><td style="text-align:left">100% 匹配请求模型</td></tr><tr><td style="text-align:left"><strong>Token 计费准确性</strong></td><td style="text-align:left">对比中转站扣费与 <code>tiktoken</code> 预估</td><td style="text-align:left">偏差 ≤ 5%</td></tr></tbody></table></div></div><h3 id="5.2-模型真实性验证">5.2 模型真实性验证<a title="#5.2-模型真实性验证" href="#5.2-模型真实性验证"></a></h3><p>部分不良中转站存在<strong>模型降级</strong>行为——请求 <code>claude-3.5-sonnet</code> 但实际路由到更便宜的模型。以下是几种检测思路：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 方法 1：检查响应中的 model 字段</span></span><br><span class="line">response = client.chat.completions.create(</span><br><span class="line">    model=<span class="string">&quot;claude-3-5-sonnet-20241022&quot;</span>,</span><br><span class="line">    messages=[&#123;<span class="string">&quot;role&quot;</span>: <span class="string">&quot;user&quot;</span>, <span class="string">&quot;content&quot;</span>: <span class="string">&quot;What model are you?&quot;</span>&#125;]</span><br><span class="line">)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">f&quot;请求模型: claude-3-5-sonnet-20241022&quot;</span>)</span><br><span class="line"><span class="built_in">print</span>(<span class="string">f&quot;响应模型: <span class="subst">&#123;response.model&#125;</span>&quot;</span>)  <span class="comment"># 应完全匹配</span></span><br><span class="line"><span class="built_in">print</span>(<span class="string">f&quot;回答内容: <span class="subst">&#123;response.choices[<span class="number">0</span>].message.content&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 方法 2：利用模型特有能力进行验证</span></span><br><span class="line"><span class="comment"># 例如测试视觉能力、长上下文窗口、特定知识截止日期等</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 方法 3：对比输出质量基准</span></span><br><span class="line"><span class="comment"># 使用标准化 benchmark prompt 对比官方 API 与中转的输出质量</span></span><br></pre></td></tr></table></figure><h3 id="5.3-渠道类型甄别与“掺假”行为">5.3 渠道类型甄别与“掺假”行为<a title="#5.3-渠道类型甄别与“掺假”行为" href="#5.3-渠道类型甄别与“掺假”行为"></a></h3><p>中转站的渠道来源直接影响稳定性和合规性。常见渠道类型：</p><div class="φbq"><div class="φbs"><table><thead><tr><th style="text-align:left">渠道类型</th><th style="text-align:left">说明</th><th style="text-align:left">稳定性</th><th style="text-align:left">价格</th><th style="text-align:left">风险</th></tr></thead><tbody><tr><td style="text-align:left"><strong>官转（Official）</strong></td><td style="text-align:left">使用正规付费的官方 API Key</td><td style="text-align:left">⭐⭐⭐⭐⭐</td><td style="text-align:left">高（≥1x 倍率）</td><td style="text-align:left">低</td></tr><tr><td style="text-align:left"><strong>AZ 转（Azure）</strong></td><td style="text-align:left">通过 Azure OpenAI Service 转发</td><td style="text-align:left">⭐⭐⭐⭐</td><td style="text-align:left">中高</td><td style="text-align:left">中低</td></tr><tr><td style="text-align:left"><strong>逆向（Reverse）</strong></td><td style="text-align:left">逆向工程免费/付费版 Web 接口</td><td style="text-align:left">⭐⭐</td><td style="text-align:left">低（0.1x-0.5x）</td><td style="text-align:left">高，随时可能失效</td></tr><tr><td style="text-align:left"><strong>号池（Account Pool）</strong></td><td style="text-align:left">批量注册试用账号的 API 额度</td><td style="text-align:left">⭐⭐⭐</td><td style="text-align:left">低</td><td style="text-align:left">中高，账号可能被封</td></tr></tbody></table></div></div><p><strong>⚠️ 警惕“官逆混用/掺假”：</strong> 不良中转站会在官方渠道耗尽或不可用时，静默切换至低质的逆向渠道（即“官方挂了换逆向”或“白天并发用官转，晚上用逆向”）。这就导致即使接口可用，模型的智商、长上下文响应能力和 Tool Calling 能力也可能出现严重衰退。</p><h3 id="5.4-隐形计费考量：缓存率（cache-rate）的魔力">5.4 隐形计费考量：缓存率（Cache Rate）的魔力<a title="#5.4-隐形计费考量：缓存率（cache-rate）的魔力" href="#5.4-隐形计费考量：缓存率（cache-rate）的魔力"></a></h3><p>在比较多家中转站的价格时，绝不能只看表面的“大模型倍率”或单价。当前如 Claude Code 等重度依赖长上下文缓存的应用，价格构成公式应当是：<br><strong>总费用 = (Input + Output + Cache Write + Cache Read) × 倍率</strong></p><p><strong>为何缓存率极其重要：</strong></p><ul><li>新一代工具极其依赖 Context Caching。</li><li>劣质中转站的**缓存率（Cache Rate）**可能只有 30%，甚至根本无法透传真实的缓存；而优质一线的官转服务缓存率能稳定在 80%~85% 以上。</li><li><strong>缓存率差 10%，实际支出的真金白银可能翻倍。</strong> 原本以为很便宜的低倍率渠道，因为没有有效利用缓存，实际花费远超高单价的高缓存率渠道。</li></ul><h3 id="5.5-持续监控建议">5.5 持续监控建议<a title="#5.5-持续监控建议" href="#5.5-持续监控建议"></a></h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 建议部署持续拨测脚本，关键监控维度：</span></span><br><span class="line"><span class="string">监控项:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">endpoint:</span> <span class="string">/v1/chat/completions</span></span><br><span class="line">    <span class="attr">interval:</span> <span class="string">5m</span></span><br><span class="line">    <span class="attr">timeout:</span> <span class="string">30s</span></span><br><span class="line">    <span class="attr">alerts:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">condition:</span> <span class="string">error_rate</span> <span class="string">&gt;</span> <span class="number">1</span><span class="string">%</span></span><br><span class="line">        <span class="attr">action:</span> <span class="string">notify</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">condition:</span> <span class="string">p95_latency</span> <span class="string">&gt;</span> <span class="string">5000ms</span></span><br><span class="line">        <span class="attr">action:</span> <span class="string">warn</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">condition:</span> <span class="string">model_mismatch</span></span><br><span class="line">        <span class="attr">action:</span> <span class="string">critical</span></span><br></pre></td></tr></table></figure><hr><h2 id="六、中转服务的安全隐患">六、中转服务的安全隐患<a title="#六、中转服务的安全隐患" href="#六、中转服务的安全隐患"></a></h2><blockquote><p><strong>⚠️ 这是使用中转服务时最需要关注的问题。</strong> 即使中转站价格诱人、稳定性良好，安全风险也不容忽视。</p></blockquote><h3 id="6.1-核心威胁模型">6.1 核心威胁模型<a title="#6.1-核心威胁模型" href="#6.1-核心威胁模型"></a></h3><p><img src="illustrations/relay-security-threats.svg" alt="安全威胁模型" loading="lazy" class="φbp"></p><h3 id="6.2-无法回避的“https-中间人攻击”本质">6.2 无法回避的“HTTPS 中间人攻击”本质<a title="#6.2-无法回避的“https-中间人攻击”本质" href="#6.2-无法回避的“https-中间人攻击”本质"></a></h3><p><strong>所有通过中转站的请求内容对中转站运营者绝对明文可见。</strong><br>不论中转站宣传采用了多少安全防护，从技术原理上说，中转服务本质就是一个 <strong>HTTPS 中间人（MITM）</strong>。为了做路由分发与计费计量，网关层必然要先解密请求。这意味着：</p><ul><li>你发送给 AI 的<strong>代码片段</strong>、<strong>数据库 schema</strong>、<strong>内部文档</strong>、<strong>聊天隐私</strong>都在裸奔。</li><li>你在 prompt 中无意包含的<strong>环境变量</strong>、<strong>配置信息</strong>可能被轻易提取。</li><li>现代 AI 编码助手（如 Cursor、Windsurf、Claude Code）会自动将<strong>海量项目代码上下文</strong>发送到 API。</li></ul><h3 id="6.3-防护措施的局限性与终极建议">6.3 防护措施的局限性与终极建议<a title="#6.3-防护措施的局限性与终极建议" href="#6.3-防护措施的局限性与终极建议"></a></h3><p>网络上经常有人推荐通过配置忽略文件来防护，但<strong>这种防护往往给人一种虚假的安全感</strong>。</p><h4 id="客户端侧配置（效果有限，仅能减小暴露面）">客户端侧配置（效果有限，仅能减小暴露面）<a title="#客户端侧配置（效果有限，仅能减小暴露面）" href="#客户端侧配置（效果有限，仅能减小暴露面）"></a></h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 配置 .cursorignore / .claudeignore</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;.env&quot;</span> &gt;&gt; .cursorignore</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;*.pem&quot;</span> &gt;&gt; .cursorignore</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;credentials/&quot;</span> &gt;&gt; .cursorignore</span><br></pre></td></tr></table></figure><blockquote><p><strong>⚠️ 为什么说它有限：</strong> 这些手段<strong>仅能阻止 AI 工具主动去读</strong>隐藏文件。但它阻止不了你在对话窗手动粘贴包含了密钥的内容，也阻止不了你代码文件中硬编码的密钥被发送。只要数据上了 prompt 请求体，中转站就完全可见。</p></blockquote><h4 id="终极建议：敏感项目不走中转">终极建议：敏感项目不走中转<a title="#终极建议：敏感项目不走中转" href="#终极建议：敏感项目不走中转"></a></h4><p>这是唯一彻底的解决方案：<strong>面对涉及核心商业机密、私钥/证书环境或高价值私有代码库的项目，唯一的安全方案是不走任何第三方中转，只走官方直连（或使用云厂商企业级私有化部署的 API 如 Azure OpenAI、AWS Bedrock）。</strong></p><h4 id="架构侧防护">架构侧防护<a title="#架构侧防护" href="#架构侧防护"></a></h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">推荐架构：在自有服务器上部署 API Gateway，自行管理上游密钥</span><br><span class="line"></span><br><span class="line">Client → [自建 Gateway] → 官方 API</span><br><span class="line">           ↑</span><br><span class="line">     密钥加密存储</span><br><span class="line">     请求日志审计</span><br><span class="line">     敏感信息过滤</span><br></pre></td></tr></table></figure><div class="φbq"><div class="φbs"><table><thead><tr><th style="text-align:left">防护措施</th><th style="text-align:left">说明</th><th style="text-align:left">优先级</th></tr></thead><tbody><tr><td style="text-align:left"><strong>密钥隔离</strong></td><td style="text-align:left">不同环境（dev/staging/prod）使用独立密钥</td><td style="text-align:left">P0</td></tr><tr><td style="text-align:left"><strong>请求审计</strong></td><td style="text-align:left">记录所有 API 请求的元数据（不含内容）</td><td style="text-align:left">P0</td></tr><tr><td style="text-align:left"><strong>敏感信息过滤</strong></td><td style="text-align:left">在客户端侧过滤掉 prompt 中的密钥/密码</td><td style="text-align:left">P0</td></tr><tr><td style="text-align:left"><strong>TLS 校验</strong></td><td style="text-align:left">确保客户端严格校验中转站的 TLS 证书</td><td style="text-align:left">P1</td></tr><tr><td style="text-align:left"><strong>最小权限</strong></td><td style="text-align:left">API Key 仅授予必要的模型访问权限</td><td style="text-align:left">P1</td></tr><tr><td style="text-align:left"><strong>预算告警</strong></td><td style="text-align:left">设置余额/用量告警，防止异常消耗</td><td style="text-align:left">P1</td></tr><tr><td style="text-align:left"><strong>定期轮换</strong></td><td style="text-align:left">API Key 定期更换</td><td style="text-align:left">P2</td></tr></tbody></table></div></div><h3 id="6.4-合规性考量">6.4 合规性考量<a title="#6.4-合规性考量" href="#6.4-合规性考量"></a></h3><ul><li><strong>数据出境</strong>：请求数据发送到海外中转节点，可能涉及《数据安全法》《个人信息保护法》中的数据出境条款</li><li><strong>服务资质</strong>：大部分中转站无 ICP 备案、无增值电信业务经营许可</li><li><strong>税务合规</strong>：预充值模式通常无法提供正规发票</li><li><strong>知识产权</strong>：Anthropic 等厂商在其报告中明确指出，商业代理服务可能被用于非法模型蒸馏</li></ul><hr><h2 id="七、行业黑话速查表">七、行业黑话速查表<a title="#七、行业黑话速查表" href="#七、行业黑话速查表"></a></h2><div class="φbq"><div class="φbs"><table><thead><tr><th style="text-align:left">术语</th><th style="text-align:left">含义</th></tr></thead><tbody><tr><td style="text-align:left"><strong>刀</strong></td><td style="text-align:left">虚拟美刀，通常 1 元人民币 = 1 刀（非真实汇率）</td></tr><tr><td style="text-align:left"><strong>倍率</strong></td><td style="text-align:left">模型价格系数，官转 ≈ 1x，逆向通常 0.1x-0.5x</td></tr><tr><td style="text-align:left"><strong>官转</strong></td><td style="text-align:left">使用官方正规 API Key 的中转渠道</td></tr><tr><td style="text-align:left"><strong>AZ 转</strong></td><td style="text-align:left">通过 Azure OpenAI Service 中转</td></tr><tr><td style="text-align:left"><strong>逆向</strong></td><td style="text-align:left">逆向工程 Web 版/App 版的非公开 API</td></tr><tr><td style="text-align:left"><strong>号池</strong></td><td style="text-align:left">批量注册的试用/免费 API 账号池</td></tr><tr><td style="text-align:left"><strong>官逆混用</strong></td><td style="text-align:left">宣称是官转，实则掺假混入低成本的逆向渠道来获利</td></tr><tr><td style="text-align:left"><strong>缓存创建</strong></td><td style="text-align:left">Cache Write，发送给大模型处理并创建缓存的 Token</td></tr><tr><td style="text-align:left"><strong>缓存命中</strong></td><td style="text-align:left">Cache Read，已命中缓存的输入内容，价格极低</td></tr><tr><td style="text-align:left"><strong>跑量</strong></td><td style="text-align:left">在中转站消耗的 token 总量</td></tr><tr><td style="text-align:left"><strong>渠道</strong></td><td style="text-align:left">中转站配置的上游 API Key/Provider</td></tr><tr><td style="text-align:left"><strong>分组</strong></td><td style="text-align:left">中转站内的用户等级/权限组</td></tr><tr><td style="text-align:left"><strong>补全倍率</strong></td><td style="text-align:left">输出 token 相对输入 token 的价格比</td></tr></tbody></table></div></div><hr><h2 id="八、总结与建议">八、总结与建议<a title="#八、总结与建议" href="#八、总结与建议"></a></h2><h3 id="核心原则">核心原则<a title="#核心原则" href="#核心原则"></a></h3><p>中转服务本质是用安全性换取便利性和低价。在使用时，务必明确风险边界：<strong>真正的商业机密绝不过中转，能走官方/云平台企业版的必须走正规渠道。</strong></p><h3 id="面向个人使用">面向个人使用<a title="#面向个人使用" href="#面向个人使用"></a></h3><ul><li><strong>日常开发/学习</strong>：中转服务是务实的降本选择，建议多参考近期排名的评测数据。</li><li><strong>高频重度用户</strong>：如果重度依赖 Claude Code 这种耗费 Context 的工具，直接购买官方 Max20/Pro 订阅套餐可能比在中转站被反复收取缓存费更经济，且能完全杜绝封号风控。</li><li><strong>安全底线</strong>：配好 ignore 文件是必要的基础，但更重要的是养成<strong>不在对话中随意发送包含认证信息文本</strong>的习惯。</li></ul><h3 id="面向企业使用">面向企业使用<a title="#面向企业使用" href="#面向企业使用"></a></h3><p>需要考虑的因素更多，包括：</p><ul><li><strong>自建方案</strong>：使用 One-API / New-API 自建中转站，自行管理上游 API Key</li><li><strong>合规要求</strong>：涉及用户数据的场景</li><li><strong>监控体系</strong>：需要全链路监控，覆盖可用性、延迟、模型一致性、计费准确性</li></ul>]]>
    </content>
    <id>https://blog.becase.top/post/2026030601</id>
    <link href="https://blog.becase.top/post/2026030601"/>
    <published>2026-03-06T00:00:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>本文起源于 V2EX 社区帖子 <a href="https://www.v2ex.com/t/1196011" target="_blank">AI 中转站黑话大全整理</a>（作者 v2exgo），在原帖内容基础上做了大量扩展和深入分析，面向专]]>
    </summary>
    <title>AI API 中转服务深度解析：架构、风险与工程实践</title>
    <updated>2026-08-04T09:27:28.572Z</updated>
  </entry>
  <entry>
    <author>
      <name>jiechen</name>
    </author>
    <category term="tech" scheme="https://blog.becase.top/categories/tech/"/>
    <category term="ai" scheme="https://blog.becase.top/categories/tech/ai/"/>
    <category term="business" scheme="https://blog.becase.top/tags/business/"/>
    <category term="ai" scheme="https://blog.becase.top/tags/ai/"/>
    <content>
      <![CDATA[<h2 id="1.-嘉宾背景与核心贡献">1. 嘉宾背景与核心贡献<a title="#1.-嘉宾背景与核心贡献" href="#1.-嘉宾背景与核心贡献"></a></h2><p>翁家翌（Jiayi Weng）于 2022 年加入 OpenAI，是 GPT 系列模型（从 GPT-3.5、GPT-4 到 GPT-5）背后的核心贡献者之一。他在访谈中被定义为“把模型做得更强的人”，其核心贡献集中在以下三个领域：</p><ul><li><strong>强化学习（Reinforcement Learning）</strong>：负责模型对齐与性能提升的关键算法实现。</li><li><strong>后训练（Post-training）</strong>：主导预训练之后的微调与优化流程。</li><li><strong>基础设施（Infra）</strong>：构建高吞吐量的 RLHF（基于人类反馈的强化学习）流水线和工具。</li></ul><h2 id="2.-个人成长与价值观：投资未来与打破信息差">2. 个人成长与价值观：投资未来与打破信息差<a title="#2.-个人成长与价值观：投资未来与打破信息差" href="#2.-个人成长与价值观：投资未来与打破信息差"></a></h2><p>翁家翌的成长路径展现了一种极强的“投资未来”意识和对“影响力（Impact）”的追求：</p><ul><li><strong>早期启蒙</strong>：初中时便超前学习高中数学和微积分，建立“知识树”以实现高效解题。他认为这种超前学习是对未来选择权的投资。</li><li><strong>清华时期</strong>：在清华大学就读期间，他将自己的所有课程作业和资料开源到 GitHub。他认为“信息平权”比捐款更有价值，旨在打破因信息差导致的效率低下。</li><li><strong>开源哲学</strong>：他开发了强化学习框架 <strong>Tianshou（天授）</strong> 和签证查询系统 <strong>tuixue.online</strong>。他将开发实用工具视为一种“慈善”，追求的是工具被广泛使用所带来的社会影响力。</li></ul><h2 id="3.-openai-的技术洞见：工程与-infra-的核心地位">3. OpenAI 的技术洞见：工程与 Infra 的核心地位<a title="#3.-openai-的技术洞见：工程与-infra-的核心地位" href="#3.-openai-的技术洞见：工程与-infra-的核心地位"></a></h2><p>访谈深入探讨了大模型开发背后的技术逻辑，打破了“算法至上”的迷思：</p><ul><li><strong>Infra 是第一生产力</strong>：翁家翌强调，在大模型工业界，<strong>基础设施的迭代速度决定了 AGI 的实现速度</strong>。他认为“修 bug 的数量决定了模型的质量”，工程能力的上限往往就是研究能力的上限。</li><li><strong>RLHF 的挑战</strong>：在 2022 年加入 OpenAI 时，RLHF 仍面临巨大的工程挑战。他参与构建了工业级的 RL Infra，解决了高吞吐量下的模型对齐问题。</li><li><strong>学术界与工业界的脱节</strong>：他指出学术界过度关注在小型 Benchmark 上的调参，而工业界需要解决的是真实世界的规模化问题。</li></ul><h2 id="4.-openai-内部视角：组织架构与人才密度">4. OpenAI 内部视角：组织架构与人才密度<a title="#4.-openai-内部视角：组织架构与人才密度" href="#4.-openai-内部视角：组织架构与人才密度"></a></h2><p>作为风暴中心的一员，翁家翌分享了 OpenAI 内部的运作细节：</p><ul><li><strong>人才密度与组织</strong>：OpenAI 拥有极高的人才密度，组织架构强调 <strong>Context Sharing（上下文共享）</strong>，即信息在内部的高效、无损流通，这是保持创新的关键。</li><li><strong>Sam Altman 事件</strong>：从内部视角回顾了 Sam Altman 被开除又回归的经历，展现了公司在动荡中的韧性。</li><li><strong>竞争压力</strong>：面对 DeepSeek 等新兴竞争对手，他认为真正的威胁在于对方的<strong>迭代速度</strong>和<strong>基础设施效率</strong>，而非单纯的榜单成绩。</li></ul><h2 id="5.-对-agi-与未来的哲学思考">5. 对 AGI 与未来的哲学思考<a title="#5.-对-agi-与未来的哲学思考" href="#5.-对-agi-与未来的哲学思考"></a></h2><p>访谈最后上升到了对人类命运和 AI 终局的思考：</p><ul><li><strong>AGI 的定义</strong>：他认为 AGI 的定义在 OpenAI 内部也是模糊的，但其实现将取决于 Infra 的吞吐效率。</li><li><strong>AI 管理组织</strong>：他预测未来组织可能由拥有“无限 Context”的 AI Agent 管理，以解决人类协作中的信息损耗瓶颈。</li><li><strong>宿命论与自由意志</strong>：翁家翌持有一种实用主义的宿命论观点。他认为世界可能是确定的，但他选择“假装自由意志存在”，并专注于解决可验证的技术问题。</li></ul>]]>
    </content>
    <id>https://blog.becase.top/post/2026021301</id>
    <link href="https://blog.becase.top/post/2026021301"/>
    <published>2026-02-13T14:14:29.000Z</published>
    <summary>
      <![CDATA[<h2 id="1.-嘉宾背景与核心贡献">1. 嘉宾背景与核心贡献<a title="#1.-嘉宾背景与核心贡献" href="#1.-嘉宾背景与核心贡献"></a></h2>
<p>翁家翌（Jiayi Weng）于 2022 年加入 OpenAI，是 GPT 系列模型（从 G]]>
    </summary>
    <title>OpenAI 翁家翌访谈调研报告</title>
    <updated>2026-08-04T09:27:28.572Z</updated>
  </entry>
  <entry>
    <author>
      <name>jiechen</name>
    </author>
    <category term="tech" scheme="https://blog.becase.top/categories/tech/"/>
    <category term="ai" scheme="https://blog.becase.top/categories/tech/ai/"/>
    <category term="ai" scheme="https://blog.becase.top/tags/ai/"/>
    <category term="computer-science" scheme="https://blog.becase.top/tags/computer-science/"/>
    <content>
      <![CDATA[<div class="reprinted-notice" style="  background: #f8f9fa;  border-left: 4px solid #333;  padding: 12px 16px;  margin: 16px 0;  border-radius: 4px;  font-size: 14px;  color: #495057;  line-height: 1.6;">  <strong>📋 声明</strong> - 本文为转载文章<br><a href="https://x.com/oran_ge/status/2020649409521041502" target="_blank" rel="noopener noreferrer" class="reprinted-link">🔗 原文链接：https://x.com/oran_ge/status/2020649409521041502</a></div><blockquote><p><strong>2026 年，旧地图已碎，新大陆已现。</strong></p></blockquote><hr><div align="center">  <svg width="600" height="200" viewBox="0 0 600 200" fill="none" xmlns="http://www.w3.org/2000/svg">    <rect width="600" height="200" rx="16" fill="#0A0A0F"/>    <circle cx="300" cy="100" r="60" stroke="url(#paint0_linear)" stroke-width="2" stroke-dasharray="10 5">      <animateTransform attributeName="transform" type="rotate" from="0 300 100" to="360 300 100" dur="20s" repeatCount="indefinite"/>    </circle>    <circle cx="300" cy="100" r="40" fill="url(#paint1_radial)"/>    <text x="300" y="105" text-anchor="middle" fill="white" font-family="Inter, sans-serif" font-size="20" font-weight="bold" letter-spacing="0.1em">AGENT IS ETERNAL</text>    <defs>      <linearGradient id="paint0_linear" x1="240" y1="40" x2="360" y2="160" gradientUnits="userSpaceOnUse">        <stop stop-color="#8B5CF6"/>        <stop offset="1" stop-color="#3B82F6"/>      </linearGradient>      <radialGradient id="paint1_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" transform="translate(300 100) rotate(90) scale(40)">        <stop stop-color="#8B5CF6" stop-opacity="0.6"/>        <stop offset="1" stop-color="#3B82F6" stop-opacity="0"/>      </radialGradient>    </defs>  </svg></div><h2 id="引">引<a title="#引" href="#引"></a></h2><p>最近有个感觉，越来越强烈：在互联网时代学的东西，全部都已经过时了。</p><p><strong>DAU 过时了。SaaS 过时了。注意力经济已经死了。工具到平台的路径走不通了。</strong><br>&quot;AI 应用&quot;和&quot;出海&quot;这两个词，在 Agent 范式下都是逻辑谬误。</p><p>过去的一切，都建立在一个正在消失的前提之上：<strong>人是软件的用户。</strong><br>而新世界的前提变了：<strong>Agent 才是软件的新主人。</strong></p><p>所以我决定拿起刀，砍掉六张过时的旧地图。</p><hr><h2 id="part-1：互联网已死-——-斩断旧范式的六刀">Part 1：互联网已死 —— 斩断旧范式的六刀<a title="#part-1：互联网已死-——-斩断旧范式的六刀" href="#part-1：互联网已死-——-斩断旧范式的六刀"></a></h2><div align="center">  <svg width="100" height="40" viewBox="0 0 100 40">    <path d="M10 20 L90 20" stroke="#EF4444" stroke-width="2" stroke-dasharray="4 2"/>    <path d="M45 10 L55 30" stroke="#EF4444" stroke-width="3"/>  </svg></div><h3 id="第一刀：dau-已经严重过时">第一刀：DAU 已经严重过时<a title="#第一刀：dau-已经严重过时" href="#第一刀：dau-已经严重过时"></a></h3><p>上一个时代，DAU 是资产；这个时代，DAU 是负债。</p><ul><li><strong>微信是网状拓扑</strong>：每多一个人，网络效应指数级增长，成本几乎不增。</li><li><strong>AI 是星型拓扑</strong>：每多一个用户，就要多烧一份推理成本。</li></ul><p>没有网络效应，只有 ROI 算账。ChatGPT 在烧钱扩规模，而 Claude 已经拒绝广告逻辑。</p><h3 id="第二刀：从工具到平台的路径已经堵死">第二刀：从工具到平台的路径已经堵死<a title="#第二刀：从工具到平台的路径已经堵死" href="#第二刀：从工具到平台的路径已经堵死"></a></h3><p>别再想投出一个 “AI 抖音” 了。<br>旧逻辑是：工具 -&gt; 社区 -&gt; 平台。<br>但 AI 时代，工具本身足够强，<strong>“人帮人”的社区价值基础已经坍塌</strong>。当 AI 能直接给你完美结果时，你不需要看别人怎么用，你只需要它帮你做好。</p><h3 id="第三刀：saas-没死，但主人换了">第三刀：SaaS 没死，但主人换了<a title="#第三刀：saas-没死，但主人换了" href="#第三刀：saas-没死，但主人换了"></a></h3><ul><li><strong>旧世界</strong>：2B 或 2C，围绕“人怎么用软件”展开。</li><li><strong>新世界</strong>：<strong>2A (To Agent)</strong>。Agent 才是 API 的重度调用者。</li></ul><p>软件公司将变成 Agent 的基础设施。Agent 会自己看文档、学操作，百倍速于人类。</p><div align="center">  <svg width="400" height="120" viewBox="0 0 400 120" fill="none" xmlns="http://www.w3.org/2000/svg">    <rect x="50" y="30" width="120" height="60" rx="8" stroke="#4B5563" stroke-width="2"/>    <text x="110" y="65" text-anchor="middle" fill="#4B5563" font-size="12">Human UI</text>    <path d="M180 60 H220" stroke="#8B5CF6" stroke-width="2" stroke-dasharray="4 4"/>    <rect x="230" y="30" width="120" height="60" rx="8" stroke="#8B5CF6" stroke-width="2"/>    <text x="290" y="65" text-anchor="middle" fill="#8B5CF6" font-size="12" font-weight="bold">Agent API</text>    <path d="M215 55 L225 60 L215 65 Z" fill="#8B5CF6"/>  </svg></div><h3 id="第四刀：&quot;ai-应用&quot;这个词就是错的">第四刀：&quot;AI 应用&quot;这个词就是错的<a title="#第四刀：&quot;ai-应用&quot;这个词就是错的" href="#第四刀：&quot;ai-应用&quot;这个词就是错的"></a></h3><p>&quot;应用&quot;这个词天然暗示了使用者是人。当你试图设计交互、留存时，你是在为旧车换引擎。<br><strong>不要服务人，服务 Agent。</strong></p><h3 id="第五刀：注意力经济已死">第五刀：注意力经济已死<a title="#第五刀：注意力经济已死" href="#第五刀：注意力经济已死"></a></h3><ul><li><strong>注意力经济</strong>：抢夺用户时间，零和博弈，让你沉迷。</li><li><strong>生产力经济</strong>：交付结果效率，正和游戏，让你解放。</li></ul><p>一个是让你花更多时间，一个是让你花更少时间拿到更好结果。</p><h3 id="第六刀：&quot;出海&quot;是一个过时的词">第六刀：&quot;出海&quot;是一个过时的词<a title="#第六刀：&quot;出海&quot;是一个过时的词" href="#第六刀：&quot;出海&quot;是一个过时的词"></a></h3><p>在 Agent 的世界里，没有国界，没有海。<br>你不需要去适配国外的 UI 或推广，你只需要<strong>把 API 做好，把文档写清楚</strong>，全世界的 Agent 都能瞬间找到你。你需要的不是出海，是<strong>接入新世界</strong>。</p><hr><h2 id="part-2：agent-永生-——-奠定未来的四块基石">Part 2：Agent 永生 —— 奠定未来的四块基石<a title="#part-2：agent-永生-——-奠定未来的四块基石" href="#part-2：agent-永生-——-奠定未来的四块基石"></a></h2><div align="center">  <svg width="600" height="150" viewBox="0 0 600 150" fill="none" xmlns="http://www.w3.org/2000/svg">    <path d="M100 130 H500" stroke="#3B82F6" stroke-width="4"/>    <rect x="120" y="50" width="60" height="80" fill="#1E293B"/>    <rect x="220" y="30" width="60" height="100" fill="#312E81"/>    <rect x="320" y="10" width="60" height="120" fill="#4C1D95"/>    <rect x="420" y="40" width="60" height="90" fill="#1E1B4B"/>    <text x="300" y="145" text-anchor="middle" fill="#94A3B8" font-size="10">FOUR CORNERSTONES</text>  </svg></div><h3 id="第一块基石：token-是新时代的特权">第一块基石：Token 是新时代的特权<a title="#第一块基石：token-是新时代的特权" href="#第一块基石：token-是新时代的特权"></a></h3><p>算力的马太效应已经开启。<br>Opus 4.6 随着上下文增加反而更贵，Fast 模式以 5 倍费用换取 2.5 倍速度。<br><strong>谁拥有更多算力，谁就拥有更多权力。</strong> 这不是均匀分布的，而是金钱与进化的正反馈循环。</p><h3 id="第二块基石：燃烧-token-的速度，决定了人的进化速度">第二块基石：燃烧 Token 的速度，决定了人的进化速度<a title="#第二块基石：燃烧-token-的速度，决定了人的进化速度" href="#第二块基石：燃烧-token-的速度，决定了人的进化速度"></a></h3><p>买 Token 不是消费，是投资。</p><ul><li>用顶级模型与垃圾模型的人，一年后的认知差是 <strong>100 倍</strong>。</li><li>今天进化的最快方式，就是和 Agents 一起燃烧 Token。</li></ul><p><strong>AI Coding、AI Agent、AI Video —— 这是今天燃烧最快的三台引擎。</strong></p><h3 id="第三块基石：agent-是新世界的人口红利">第三块基石：Agent 是新世界的人口红利<a title="#第三块基石：agent-是新世界的人口红利" href="#第三块基石：agent-是新世界的人口红利"></a></h3><p>过去研究“让人用得爽”，现在研究“让 Agent 用得爽”。<br>Agent 每天调用接口几万次，这个量级远超人类。</p><p><strong>增长飞轮：</strong></p><ol><li><strong>先被发现</strong>：SEO 面向 Agent，文档清晰。</li><li><strong>再被依赖</strong>：结果稳定、准确、快速。</li></ol><p><em>如果 Agent 调不动你的产品，那你在新世界里就不存在。</em></p><h3 id="第四块基石：在新世界里的你">第四块基石：在新世界里的你<a title="#第四块基石：在新世界里的你" href="#第四块基石：在新世界里的你"></a></h3><p>当劳动力被取代，生产力爆炸，我们将进入 <strong>愿力时代</strong>。</p><ul><li><strong>Agent</strong>：有能力，有理性，没想法。</li><li><strong>人类</strong>：有欲望，有想象，没体力。</li></ul><p><strong>未来人的价值，不在于亲自干活，而在于驱动多少 Agent。</strong><br>“韩信点兵，多多益善”。不是因为韩信能打，是因为他有一套体系，给他多少兵他都能管。</p><hr><h2 id="终">终<a title="#终" href="#终"></a></h2><p>六把刀砍完，四块基石初现。</p><div class="φbq"><div class="φbs"><table><thead><tr><th style="text-align:left">旧世界 (Internet)</th><th style="text-align:left">新世界 (Agent)</th></tr></thead><tbody><tr><td style="text-align:left">人是用户</td><td style="text-align:left">Agent 是用户</td></tr><tr><td style="text-align:left">流量是资源</td><td style="text-align:left">算力是特权</td></tr><tr><td style="text-align:left">免费是策略</td><td style="text-align:left">投资是底色</td></tr><tr><td style="text-align:left">规模是壁垒</td><td style="text-align:left">结果是壁垒</td></tr></tbody></table></div></div><p>如果你还在用旧词思考，你是在<strong>考古</strong>而非<strong>创业</strong>。</p><p><strong>互联网已死，Agent 永生。</strong></p><div align="center">  <svg width="200" height="60" viewBox="0 0 200 60">    <rect width="200" height="60" rx="30" fill="url(#grad_btn)"/>    <text x="100" y="35" text-anchor="middle" fill="white" font-weight="bold">发现新大陆</text>    <defs>      <linearGradient id="grad_btn" x1="0" y1="0" x2="200" y2="60">        <stop stop-color="#8B5CF6"/>        <stop offset="1" stop-color="#3B82F6"/>      </linearGradient>    </defs>  </svg></div><hr>]]>
    </content>
    <id>https://blog.becase.top/post/20260211</id>
    <link href="https://blog.becase.top/post/20260211"/>
    <published>2026-02-11T00:00:00.000Z</published>
    <summary>
      <![CDATA[<div class="reprinted-notice" style="
  background: #f8f9fa;
  border-left: 4px solid #333;
  padding: 12px 16px;
  margin: 16px 0;
  borde]]>
    </summary>
    <title>互联网已死，Agent 永生</title>
    <updated>2026-08-04T09:27:28.572Z</updated>
  </entry>
  <entry>
    <author>
      <name>jiechen</name>
    </author>
    <category term="tech" scheme="https://blog.becase.top/categories/tech/"/>
    <category term="ai" scheme="https://blog.becase.top/categories/tech/ai/"/>
    <category term="ai" scheme="https://blog.becase.top/tags/ai/"/>
    <category term="computer-science" scheme="https://blog.becase.top/tags/computer-science/"/>
    <content>
      <![CDATA[<h2 id="哲学/思想">哲学/思想<a title="#哲学/思想" href="#哲学/思想"></a></h2><p>在 React 的世界中，有一个经典的哲学公式：<strong>UI = f(State, Props)</strong>，它用函数式的思维定义了用户界面的本质。而在 AI 编程时代，我们可以推导出一个类似的公式：</p><p><strong>Code = AI(Context, Prompt)</strong></p><p>这个公式揭示了 AI 编程的核心范式：</p><ul><li><strong>Context（上下文）</strong> 是 AI 理解问题的基础，包括代码库结构、技术栈、业务逻辑、设计规范等</li><li><strong>Prompt（提示词）</strong> 是人类向 AI 传达的另类 Props，包括传统意义上的提示词、MCP、Skill 等</li><li><strong>AI</strong> 是将上下文和提示词转化为代码的&quot;函数&quot;，包括底层 LLM 模型和延伸出来的 Agent 等</li></ul><h3 id="vibe-coding-核心理念">Vibe Coding 核心理念<a title="#vibe-coding-核心理念" href="#vibe-coding-核心理念"></a></h3><p>“Vibe Coding” 这一概念由 Open AI 的 Andrej Karpathy 在 2025 年初提出，它强调一种 <strong>对话式、迭代式</strong> 的编程方式——用自然语言描述需求，让 AI 生成代码，然后通过反馈循环不断调优。</p><h4 id="🧭-道（philosophy）--思想">🧭 道（Philosophy）- 思想<a title="#🧭-道（philosophy）--思想" href="#🧭-道（philosophy）--思想"></a></h4><ul><li><strong>AI 优先</strong>：凡是 AI 可完成的工作，优先交由 AI 执行（效率第一原则）</li><li><strong>上下文至上</strong>：上下文是 Vibe Coding 的第一性要素，遵循 “垃圾进，垃圾出” 的底层逻辑</li><li><strong>目的导向</strong>：开发全流程的所有动作均围绕核心目标展开，避免无意义的试错</li><li><strong>结构先行</strong>：先明确整体框架再落地代码实现，从源头规避技术债累积</li></ul><h4 id="🧩-法（methodology）--方法论">🧩 法（Methodology）- 方法论<a title="#🧩-法（methodology）--方法论" href="#🧩-法（methodology）--方法论"></a></h4><ul><li>用一句话清晰定义目标与非目标，明确需求边界</li><li>保持功能正交性，避免模块职责重叠与功能冗余</li><li><strong>复用优先</strong>：不重复造轮子，优先通过 AI 检索适配的开源仓库或成熟方案</li><li>按职责拆分模块，先定义接口再补充实现，保证架构合理性</li><li>单次变更仅聚焦一个模块，严格控制变更范围，降低出错概率</li><li><strong>文档即上下文</strong>：文档并非事后补充，而是编程过程的核心组成部分</li></ul><h4 id="🛠️-术（techniques）--技巧">🛠️ 术（Techniques）- 技巧<a title="#🛠️-术（techniques）--技巧" href="#🛠️-术（techniques）--技巧"></a></h4><ul><li>向 AI 提需求时，明确标注可修改范围与不可触碰边界</li><li>调试场景下，仅向 AI 提供核心信息：预期结果 vs 实际结果 + 最小复现案例</li><li>测试代码可交由 AI 生成，但核心断言逻辑需人工审核确认</li><li>代码量较大时及时切换新会话，避免上下文污染导致理解偏差</li></ul><h4 id="📋-器（tools）--拓展工具">📋 器（Tools）- 拓展工具<a title="#📋-器（tools）--拓展工具" href="#📋-器（tools）--拓展工具"></a></h4><p>详见下文「AI 生态发展状况 - 系统能力」部分。</p><h2 id="ai-生态发展状况">AI 生态发展状况<a title="#ai-生态发展状况" href="#ai-生态发展状况"></a></h2><h3 id="系统能力">系统能力<a title="#系统能力" href="#系统能力"></a></h3><p><strong>MCP</strong>（Model Context Protocol）是 Anthropic 于 2024 年发布的开放协议，被称为 AI 界的&quot;USB-C 接口&quot;；<strong>Skill</strong> 是将领域专业知识封装为可复用指令集的机制。</p><div class="φbq"><div class="φbs"><table><thead><tr><th>维度</th><th>MCP</th><th>Skill</th></tr></thead><tbody><tr><td><strong>本质</strong></td><td>标准化协议——AI 与外部系统的通信标准</td><td>知识封装——领域专业知识的结构化指令集</td></tr><tr><td><strong>作用</strong></td><td>连接外部工具和数据源（GitHub、设计稿）</td><td>定义任务执行流程（代码审查、日报生成）</td></tr><tr><td><strong>类比</strong></td><td>USB-C 接口，即插即用</td><td>App，基于接口实现具体功能</td></tr><tr><td><strong>复用范围</strong></td><td>跨场景通用</td><td>垂直领域专用</td></tr><tr><td><strong>配置方式</strong></td><td>JSON Server 配置</td><td>Markdown 文件（<a href="http://SKILL.md">SKILL.md</a>）</td></tr><tr><td><strong>Token 消耗</strong></td><td>工具定义可能占用大量 token</td><td>按需加载，脚本执行结果才返回</td></tr></tbody></table></div></div><h3 id="产品载体演进">产品载体演进<a title="#产品载体演进" href="#产品载体演进"></a></h3><p>AI 产品的交互载体经历了明显的代际演进，每一代都代表着人机协作模式的变革：</p><div class="φbq"><div class="φbs"><table><thead><tr><th>代际</th><th>产品形态</th><th>代表产品</th><th>交互模式</th><th>核心特征</th><th>局限性</th></tr></thead><tbody><tr><td><strong>Gen 1</strong></td><td>ChatBox</td><td>ChatGPT, <a href="http://Claude.ai">Claude.ai</a></td><td>纯对话式 Q&amp;A</td><td>单轮/多轮对话，知识问答</td><td>无法操作外部系统，输出仅限文本</td></tr><tr><td><strong>Gen 2</strong></td><td>IDE 集成</td><td>GitHub Copilot, Cursor</td><td>代码补全 + 内联对话</td><td>上下文感知，实时代码建议</td><td>被动响应，缺乏主动规划能力</td></tr><tr><td><strong>Gen 3</strong></td><td>CLI/GUI Agent</td><td>Claude Code, Windsurf</td><td>命令行/图形化 Agent</td><td>自主执行多步任务，操作文件系统</td><td>仍需人工频繁确认，连续性受限</td></tr><tr><td><strong>Gen 4</strong></td><td>自主代理</td><td>Manus, Devin</td><td>高度自主的任务执行</td><td>端到端完成复杂任务，最小化人工干预</td><td>成本高，可控性存疑，调试困难</td></tr><tr><td><strong>Gen 5</strong></td><td>环境原生</td><td>Claude Desktop, ClawdBot</td><td>融入操作系统/通讯工具</td><td>跨应用协作，无缝集成工作流</td><td>生态碎片化，隐私安全挑战</td></tr></tbody></table></div></div><h4 id="演进趋势分析">演进趋势分析<a title="#演进趋势分析" href="#演进趋势分析"></a></h4><div class="φbq"><div class="φbs"><table><thead><tr><th>演进维度</th><th>早期（Gen 1-2）</th><th>当前（Gen 3-4）</th><th>未来（Gen 5+）</th></tr></thead><tbody><tr><td><strong>人机分工</strong></td><td>AI 辅助，人类主导</td><td>AI 执行，人类监督</td><td>AI 自主，人类审批</td></tr><tr><td><strong>上下文范围</strong></td><td>单文件/单对话</td><td>项目级/仓库级</td><td>组织级/跨系统</td></tr><tr><td><strong>执行边界</strong></td><td>仅生成文本</td><td>操作文件和终端</td><td>操作任意软件</td></tr><tr><td><strong>持久性</strong></td><td>会话级记忆</td><td>项目级记忆</td><td>长期记忆 + 学习</td></tr><tr><td><strong>协作模式</strong></td><td>1 人 1 AI</td><td>1 人 N Agent</td><td>N 人 N Agent</td></tr></tbody></table></div></div><h3 id="思想钢印：ai-系统在自我进化">思想钢印：AI 系统在自我进化<a title="#思想钢印：ai-系统在自我进化" href="#思想钢印：ai-系统在自我进化"></a></h3><p>这是一个需要提前&quot;押注&quot;的信念 —— 我们正处于 AI 能力指数级增长的时期，相信 AI 会演变成<strong>一个自我优化的递归系统</strong>，不仅能执行任务，还能持续改进执行任务的方式本身</p><p>自我优化的递归系统：</p><ol><li><strong>启动 (Bootstrap)</strong>：通过 AI 生成初始的 “生成器提示词” 与 “优化器提示词”</li><li><strong>自省进化</strong>：利用优化器提示词迭代改进生成器提示词的质量</li><li><strong>任务生成</strong>：基于进化后的生成器，生成目标场景的所有提示词与 Skill 指令集</li><li><strong>循环飞跃</strong>：将新生成的产物反馈至系统，启动持续的自我进化循环</li></ol><h2 id="vibe-coding-次佳实践">Vibe Coding 次佳实践<a title="#vibe-coding-次佳实践" href="#vibe-coding-次佳实践"></a></h2><p>基于 <a href="https://github.com/affaan-m/everything-claude-code" target="_blank">everything-claude-code</a> 框架，融合实用 Skills，创建了一个可复用的配置仓库：ai-agent-config</p><h3 id="仓库结构">仓库结构<a title="#仓库结构" href="#仓库结构"></a></h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line">ai-agent-config/</span><br><span class="line">├── agents/                        # 专业化子代理（5 个）</span><br><span class="line">│   ├── planner.md                # 功能规划代理</span><br><span class="line">│   ├── code-reviewer.md          # 代码审查代理</span><br><span class="line">│   ├── architect.md              # 架构设计代理</span><br><span class="line">│   ├── security-reviewer.md      # 安全审查代理</span><br><span class="line">│   └── build-error-resolver.md   # 构建错误解决代理</span><br><span class="line">├── commands/                      # 快捷命令（6 个）</span><br><span class="line">│   ├── daily.md                  # /daily - 生成日报</span><br><span class="line">│   ├── plan.md                   # /plan - 实现规划</span><br><span class="line">│   ├── review.md                 # /review - 代码审查</span><br><span class="line">│   ├── tdd.md                    # /tdd - TDD 开发</span><br><span class="line">│   ├── build-fix.md              # /build-fix - 修复构建错误</span><br><span class="line">│   └── security.md               # /security - 安全审查</span><br><span class="line">├── skills/                        # 工作流技能（16 个）</span><br><span class="line">│   ├── aone-bug-context/         # Aone 缺陷上下文提取</span><br><span class="line">│   ├── mastergo-design/          # MasterGo D2C 设计稿处理</span><br><span class="line">│   ├── daily-report/             # 日报生成</span><br><span class="line">│   ├── weekly-report/            # 周报生成</span><br><span class="line">│   ├── code-review/              # 代码审查</span><br><span class="line">│   ├── tdd-workflow/             # TDD 工作流</span><br><span class="line">│   ├── react-typescript/         # React + TS 开发规范</span><br><span class="line">│   ├── frontend-design/          # 前端设计指南</span><br><span class="line">│   ├── webapp-testing/           # Playwright 测试</span><br><span class="line">│   ├── knowledge-management/     # 知识管理决策</span><br><span class="line">│   ├── docx/                     # Word 文档处理</span><br><span class="line">│   ├── xlsx/                     # Excel 表格处理</span><br><span class="line">│   ├── pptx/                     # PPT 演示文稿</span><br><span class="line">│   ├── pdf/                      # PDF 文档处理</span><br><span class="line">│   ├── drawio-architecture/      # Drawio 架构图</span><br><span class="line">│   └── drawio-export/            # Drawio 导出</span><br><span class="line">├── rules/                         # 始终遵循的规则</span><br><span class="line">│   ├── security.md               # 安全规则</span><br><span class="line">│   ├── coding-style.md           # 编码风格</span><br><span class="line">│   ├── testing.md                # 测试规则</span><br><span class="line">│   └── git-workflow.md           # Git 工作流</span><br><span class="line">├── hooks/                         # 事件触发器</span><br><span class="line">│   └── hooks.json                # Hook 配置</span><br><span class="line">├── contexts/                      # 动态上下文</span><br><span class="line">│   ├── dev.md                    # 开发模式</span><br><span class="line">│   ├── review.md                 # 审查模式</span><br><span class="line">│   └── research.md               # 研究模式</span><br><span class="line">├── memory-bank/                   # 项目记忆库模板</span><br><span class="line">│   ├── @architecture.md          # 架构文档模板</span><br><span class="line">│   └── @decisions.md             # 决策记录模板</span><br><span class="line">├── workflows/                     # 复用工作流</span><br><span class="line">├── AGENTS.md                      # Skills 索引配置</span><br><span class="line">└── GEMINI.md                      # AI Agent 配置文件</span><br></pre></td></tr></table></figure><h3 id="能力矩阵-(agents-&amp;-commands-&amp;-skills)">能力矩阵 (Agents &amp; Commands &amp; Skills)<a title="#能力矩阵-(agents-&amp;-commands-&amp;-skills)" href="#能力矩阵-(agents-&amp;-commands-&amp;-skills)"></a></h3><h3 id="快速参考表">快速参考表<a title="#快速参考表" href="#快速参考表"></a></h3><div class="φbq"><div class="φbs"><table><thead><tr><th>我想要…</th><th>使用方式</th></tr></thead><tbody><tr><td>规划一个新功能</td><td><code>帮我规划 xxx</code> 或 <code>/plan</code></td></tr><tr><td>审查代码质量</td><td><code>CR一下</code> 或 <code>/review</code></td></tr><tr><td>设计系统架构</td><td><code>架构设计 xxx</code></td></tr><tr><td>安全检查</td><td><code>security review</code> 或 <code>/security</code></td></tr><tr><td>修复编译错误</td><td><code>build error: xxx</code> 或 <code>/build-fix</code></td></tr><tr><td>生成日报</td><td><code>/daily</code></td></tr><tr><td>TDD 开发</td><td><code>/tdd xxx</code></td></tr><tr><td>生成周报</td><td>使用 <code>weekly-report</code> skill</td></tr></tbody></table></div></div><h4 id="daily-report-示例">Daily Report 示例<a title="#daily-report-示例" href="#daily-report-示例"></a></h4><p><strong>数据来源</strong>：Git commit 历史 &gt; 对话摘要 &gt; 文件变更 &gt; 用户输入</p><p><strong>产出示例</strong>：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># 日报 2026-01-28 (周二)</span></span><br><span class="line"></span><br><span class="line"><span class="quote">&gt; <span class="strong">**一句话总结**</span>：完成 VibeCoding 文章撰写 + 创建 ai-agent-config 配置仓库</span></span><br><span class="line"></span><br><span class="line"><span class="section">## 📋 完成任务</span></span><br><span class="line"></span><br><span class="line"><span class="section">### 文档撰写</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> <span class="strong">**VibeCoding 实践文章**</span></span><br><span class="line"><span class="bullet">  -</span> 补全 AI 编程哲学、MCP/Skill 对比、最佳实践等章节</span><br><span class="line"><span class="bullet">  -</span> 产出：<span class="code">`source/_posts/tech/cs/VibeCoding 实践.md`</span></span><br><span class="line"></span><br><span class="line"><span class="section">### Skill 开发</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> <span class="strong">**ai-agent-config 仓库**</span></span><br><span class="line"><span class="bullet">  -</span> 融合 everything-claude-code 框架与实用 Skills</span><br><span class="line"><span class="bullet">  -</span> 包含 daily-report、weekly-report、code-review 等技能</span><br><span class="line"></span><br><span class="line"><span class="section">## 📦 产出物</span></span><br><span class="line"></span><br><span class="line">| 类型 | 路径                 | 说明                      |</span><br><span class="line">| ---- | -------------------- | ------------------------- |</span><br><span class="line">| 文章 | <span class="code">`VibeCoding 实践.md`</span> | 12000+ 字的 AI 编程方法论 |</span><br><span class="line">| 仓库 | <span class="code">`ai-agent-config/`</span>   | 可复用的 Agent 配置集合   |</span><br></pre></td></tr></table></figure><h2 id="思考/探索">思考/探索<a title="#思考/探索" href="#思考/探索"></a></h2><h3 id="当前的瓶颈/上限">当前的瓶颈/上限<a title="#当前的瓶颈/上限" href="#当前的瓶颈/上限"></a></h3><p>回到这个公式：Code = AI(Context, Prompt) 来分析：</p><ol><li><strong>Context（上下文）的转换率损耗</strong>：在复杂的业务链路中，从原始需求到代码实现中间经历了多次“翻译”;每一层上下文的传递都可能伴随着信息熵的增加和有效信息的丢失</li><li><strong>Prompt（提示词）的语义鸿沟</strong>：当需求复杂度提升时，Prompt 的长度和复杂度呈指数级增长，在编写 Prompt 时往往难以覆盖所有边缘情况，导致 AI 生成的代码在逻辑完备性上存在“最后一公里”的问题</li><li><strong>AI（模型/Agent）的逻辑上限</strong></li></ol><h4 id="拿-d2c-场景举例">拿 D2C 场景举例<a title="#拿-d2c-场景举例" href="#拿-d2c-场景举例"></a></h4><p>直观理解下 D2C 方案：设计稿上下文 =&gt; 代码<br>在具体业务场景下，这个链路可以补全为：设计规范 =&gt; 设计同学 =&gt; 设计稿上下文 =&gt; DSL =&gt; AI =&gt; 代码 =&gt; 页面效果</p><p>在完整的链路场景下，从一开始的设计规范到最后的页面，中间穿插着多轮的上下文转换（上游到下游的交互），不可避免的造成了上下文的冗余化和可读性变差</p><p>D2C 的众多解决方案，最终应该都是在优化这条链路上下文的转换率</p><h3 id="可探索的应用新方向">可探索的应用新方向<a title="#可探索的应用新方向" href="#可探索的应用新方向"></a></h3><ul><li>browser control：用以网页 devtools 调试</li></ul><h2 id="参考资料">参考资料<a title="#参考资料" href="#参考资料"></a></h2><ul><li><a href="https://github.com/2025Emma/vibe-coding-cn" target="_blank">vibe-coding-cn</a> - Vibe Coding 中文指南</li><li><a href="https://github.com/affaan-m/everything-claude-code" target="_blank">everything-claude-code</a> - Claude Code 完整配置集合</li><li><a href="https://anthropic.com/blog/mcp" target="_blank">Anthropic MCP 文档</a> - Model Context Protocol 官方介绍</li></ul>]]>
    </content>
    <id>https://blog.becase.top/post/20260128</id>
    <link href="https://blog.becase.top/post/20260128"/>
    <published>2026-01-28T00:00:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="哲学/思想">哲学/思想<a title="#哲学/思想" href="#哲学/思想"></a></h2>
<p>在 React 的世界中，有一个经典的哲学公式：<strong>UI = f(State, Props)</strong>，它用函数式的思维定义了用户]]>
    </summary>
    <title>VibeCoding 思想与实践</title>
    <updated>2026-08-04T09:27:28.572Z</updated>
  </entry>
  <entry>
    <author>
      <name>jiechen</name>
    </author>
    <content>
      <![CDATA[<div class="reprinted-notice" style="  background: #f8f9fa;  border-left: 4px solid #333;  padding: 12px 16px;  margin: 16px 0;  border-radius: 4px;  font-size: 14px;  color: #495057;  line-height: 1.6;">  <strong>📋 声明</strong> - 本文为转载文章</div><p><a href="https://bibigpt.co/video/BV1sziQB5EEh" target="_blank">2025年终总结：当你决定出发时，你就已经在山顶了</a></p><p><img src="https://i0.hdslb.com/bfs/archive/cdb4625e0f3362525a03a1754ac275b56fc33e32.jpg" alt="" loading="lazy" class="φbp"></p><h2 id="摘要">摘要<a title="#摘要" href="#摘要"></a></h2><p>本视频作者分享了他对“命运”的理解，受《你一生的故事》（电影《降临》原著）中费马原理的启发，他开始相信命运并非由过去决定，而是有可能由未来的自己所吸引。视频强调了选择的重要性，并鼓励观众积极明确地规划未来，将其视为向宇宙发出需求，从而让未来的愿景成为现实。</p><h2 id="口播逐字稿">口播逐字稿<a title="#口播逐字稿" href="#口播逐字稿"></a></h2><h3 id="📚-从《你一生的故事》到费马原理">📚 从《你一生的故事》到费马原理<a title="#📚-从《你一生的故事》到费马原理" href="#📚-从《你一生的故事》到费马原理"></a></h3><p>去年我读了一本书叫你一生的故事 但后来被改编成了电影降临 今天想说的不是小说 而是书里面提到的费马原理<br>它让我开始相信命运这个事情 我以前看待世界都是经典力学式的 万事皆有一 那个音在过去<br>过去的一切导致了现在 但是读完这本书之后 我感觉这个音也有可能在未来 费马原理是什么呢</p><h3 id="🔭-费马原理：光线与宿命的宇宙观">🔭 费马原理：光线与宿命的宇宙观<a title="#🔭-费马原理：光线与宿命的宇宙观" href="#🔭-费马原理：光线与宿命的宇宙观"></a></h3><p>飞马原理说的是光线从A点经过水面 抵达B点的时候会发生折射 这条路径呢一定是花费时间最短的路径 你会问AB之间直线才应该是吧<br>不因为光线在水里的传播速度要更慢 所以如果它走直线 在水里的路程就会更长 时间就会变得更长<br>这是一个非常反常识的事情 他应该是要遍历每一条路线 他才能知道要选哪一条吧 但不是他一出发的时候<br>好像就知道了 他在出发的那一刻 仿佛就知道这是最短时间的路线 更准确的说<br>他仿佛已经知道自己的命运 飞马原里所描绘的宇宙 更像是宿命般被写好的 宇宙在出发时就已经知道结<br>当时我读到这一段的时候 正在飞机上 我抬头看了一眼周围的乘客 没有人注意到我</p><h3 id="🤔-命运已定，选择仍有意义？">🤔 命运已定，选择仍有意义？<a title="#🤔-命运已定，选择仍有意义？" href="#🤔-命运已定，选择仍有意义？"></a></h3><p>因为我感觉自己正在窥探宇宙的秘密 如果命运已经确定了 那我的选择还有意义 答案是有<br>而且选择更加重要 其实我看待这个事情 他并非是说哦 宇宙或命运或者更宏大的力量<br>安排了我的人生轨迹 那我就可以躺平了 他对我的启示是 当我决定爬山的时候<br>我其实已经出现在山顶 因为在我决定的那一个瞬间 宇宙就为我生成了一个我出现在山顶的可能 无数的平行宇宙里就多了这么一个平行宇宙<br>而我每爬一步 世界线就会收束一点 最终无数个宇宙会塌缩成这一个现实 但为什么我会去爬山<br>是因为我看到了山顶的 我是山顶的那个 我吸引了现在的自己 山顶的我才是原因</p><h3 id="✍️-自由意志：成为未来的“提示词”">✍️ 自由意志：成为未来的“提示词”<a title="#✍️-自由意志：成为未来的“提示词”" href="#✍️-自由意志：成为未来的“提示词”"></a></h3><p>当然小说讨论更多的是 如果你已经知道你的未来了 你会怎么度过 他的写作方式很有意思<br>真的推荐你们去看 但是鉴于我们现在没有外星人 我们也真的无法知道未来会怎么样 所以选择就变得极其有趣<br>自由意志的开始有用起来 选择去哪儿本身并不重要 重要的事是你自己选 因为如果你不选<br>别人就帮你选了 别人看见的未来会成为你的现实 对于有些人来说 结婚生孩子可能是他父母看见了未来<br>但是迫于压力 他就变成了你的现实 要买很多东西才能信服 是消费主义看见的未来<br>但是因为你并不清楚自己想要什么 所以他变成了你的现实 当然我对这些都不加以评判 因为有些人他就适合结婚生孩子<br>有些人他就购买东西 他能获得快乐 这些我们都不加以评判 选择什么并不重要<br>重要的是你选一个好用的方法 是把它当成和宇宙提需求 我希望在几年之后在什么地方做什么样的工作 你越具体越好<br>就跟你写AI的prompt一样 你提的需求越准 所生成的那个宇宙就会越清晰 你看见的也就会越清晰<br>当你清晰的看见的时候 它才有可能会发生这个因 才有可能会导致这个果 我知道我神神叨叨讲了一堆</p><h3 id="💫-2025年终总结：未来的自己指引当下">💫 2025年终总结：未来的自己指引当下<a title="#💫-2025年终总结：未来的自己指引当下" href="#💫-2025年终总结：未来的自己指引当下"></a></h3><p>但我们回到开头呃 2025年 我确实开始相信命运的存在 我以前不同意<br>一切都是最好的安排 我觉得他他在很多语境下 他在合理化现在的痛苦 它蕴含了一种等待他人救赎自己的感觉<br>可是现在来看的话 如果安排的人不是别人 而是未来的自己 那种命运的推背感<br>很有可能就是未来的给你暗示 你要仔细去听而已才行啊 这就是我的2025年的总结 拜拜</p><h3 id="亮点">亮点<a title="#亮点" href="#亮点"></a></h3><ul><li>📖 费马原理揭示了光线在不同介质中传播时会选择耗时最短的路径，这挑战了常识，暗示光在出发时仿佛已知终点，让作者开始相信命运的存在 [00:41]。</li><li>🤔 面对命运已定的可能，作者认为选择的意义反而更加重要，因为这并非是宇宙或宏大力量安排人生，而是我们通过选择塑造未来 [01:43]。</li><li>🏞️ 作者提出一个深刻的观点：当我们决定爬山时，就已经出现在山顶了，因为那一瞬间宇宙便生成了我们成功抵达山顶的可能，而未来的我们则吸引着现在的自己 [02:08]。</li><li>🧘‍♀️ 如果不主动做出选择，他人的未来愿景，如父母对婚姻育儿的期待或消费主义对物质的诱导，就可能成为我们自己的现实，因此自主选择至关重要 [03:00]。</li><li>✨ 作者建议将做选择视为向宇宙提出需求，越具体清晰的规划，就像写AI prompt一样，越能让未来蓝图变得清晰，从而更有可能实现 [03:36]。</li><li>🔮 作者在2025年的总结中提到，如果命运的安排者不是别人，而是未来的自己，那么那种“命运的推背感”很可能就是未来的自己给出的暗示，需要我们仔细聆听 [04:22]。</li></ul><p><a href="https://bibigpt.co/search?q=%E5%91%BD%E8%BF%90" target="_blank">#命运</a> <a href="https://bibigpt.co/search?q=%E8%B4%B9%E9%A9%AC%E5%8E%9F%E7%90%86" target="_blank">#费马原理</a> <a href="https://bibigpt.co/search?q=%E8%87%AA%E7%94%B1%E6%84%8F%E5%BF%97" target="_blank">#自由意志</a> <a href="https://bibigpt.co/search?q=%E6%9C%AA%E6%9D%A5%E8%A7%84%E5%88%92" target="_blank">#未来规划</a> <a href="https://bibigpt.co/search?q=%E8%87%AA%E6%88%91%E9%80%89%E6%8B%A9" target="_blank">#自我选择</a></p><h3 id="思考">思考<a title="#思考" href="#思考"></a></h3><ol><li><strong><a href="https://bibigpt.co/search?q=%E8%B4%B9%E9%A9%AC%E5%8E%9F%E7%90%86%E6%98%AF%E5%A6%82%E4%BD%95%E8%AE%A9%E4%BD%9C%E8%80%85%E7%9B%B8%E4%BF%A1%E5%91%BD%E8%BF%90%E7%9A%84%E5%AD%98%E5%9C%A8%E7%9A%84%EF%BC%9F" target="_blank">费马原理是如何让作者相信命运的存在的？</a></strong><ul><li>作者通过费马原理中光线在出发时仿佛已知最短路径来抵达终点的现象，感受到宇宙可能存在一种预设性，这让他联想到命运可能在出发时就已经被写好，从而开始相信命运。</li></ul></li><li><strong><a href="https://bibigpt.co/search?q=%E6%97%A2%E7%84%B6%E5%91%BD%E8%BF%90%E5%8F%AF%E8%83%BD%E5%B7%B2%E5%AE%9A%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%9C%E8%80%85%E8%BF%98%E5%BC%BA%E8%B0%83%E9%80%89%E6%8B%A9%E7%9A%84%E9%87%8D%E8%A6%81%E6%80%A7%EF%BC%9F" target="_blank">既然命运可能已定，为什么作者还强调选择的重要性？</a></strong><ul><li>作者认为，命运并非外部力量的安排，而是由“未来的自己”吸引“现在的自己”所形成。因此，选择变得更加重要，因为每一次选择都是向宇宙提出需求，明确地选择和规划未来，才能让未来的愿景变为现实，从而创造出我们想要的命运。</li></ul></li></ol><h3 id="术语解释">术语解释<a title="#术语解释" href="#术语解释"></a></h3><ul><li><strong>费马原理 (Fermat’s Principle)</strong>: 光线从一点传到另一点时，总是沿着光程最短（即耗时最短）的路径传播 [00:41]。</li><li><strong>经典力学 (Classical Mechanics)</strong>: 一种描述宏观物体运动规律的物理学理论，认为万事皆有因，过去的一切导致了现在 [00:23]。</li><li><strong>世界线收束 (Worldline Convergence)</strong>: 在视频中，指随着个人每迈出一步，原本无数个平行的可能性宇宙逐渐减少，最终收缩成一个具体的现实 [02:29]。</li><li><strong>宿命 (Fate/Destiny)</strong>: 视频中指一种预先被设定好的、无法更改的命运轨迹，作者通过费马原理对其有了新的理解，认为它可能由未来的自己所影响 [01:21]。</li><li><strong>平行宇宙 (Parallel Universes)</strong>: 视频中提及的理论，指在我们的宇宙之外还存在着无数个其他宇宙，每个宇宙都代表着不同的可能性或现实 [02:22]。</li></ul><hr><h2 id="视频章节总结-｜-💡-当你决定出发，你就已在山顶：从费马原理看命运与自由意志">视频章节总结 ｜ 💡 当你决定出发，你就已在山顶：从费马原理看命运与自由意志<a title="#视频章节总结-｜-💡-当你决定出发，你就已在山顶：从费马原理看命运与自由意志" href="#视频章节总结-｜-💡-当你决定出发，你就已在山顶：从费马原理看命运与自由意志"></a></h2><p>本视频深入探讨了费马原理及其在理解命运和自由意志方面的哲学启示。作者从《你一生的故事》（电影《降临》原著）中的费马原理切入，解释了光线选择最短时间路径的“反常识”现象，进而引申出“未来之因”的概念。这一观点挑战了经典的因果论，认为未来的“我”可能正是现在选择和行动的原因。视频强调，即便命运存在，个人的选择也至关重要，因为正是通过我们的选择，才能具象化和吸引我们所设定的未来。作者鼓励观众明确自己的愿望，将其视为向宇宙发出的“提示词”，从而让未来的可能性变得清晰并最终实现。这不仅仅是对宿命论的消极接受，更是对自我创造未来的积极肯定，将未来的自己视为指引和吸引当下行动的动力，从而赋予个人选择更深远的意义。</p><h3 id="00:00---📚-从《你一生的故事》到费马原理"><a href="https://bibigpt.co/content/861f6c18-760f-4b63-96bb-5de8ced6b6db?t=0.000">00:00</a> - 📚 从《你一生的故事》到费马原理<a title="#00:00---📚-从《你一生的故事》到费马原理" href="#00:00---📚-从《你一生的故事》到费马原理"></a></h3><p><img src="https://bibigpt-apps.chatvid.ai/screenshots/bilibili.com/BV1sziQB5EEh/0.jpg" alt="章节截图 00:00" loading="lazy" class="φbp"></p><p>视频开篇引入了科幻小说《你一生的故事》（电影《降临》原著），并指出书中的费马原理是核心。作者曾是经典力学的信徒，认为万事皆有过去之因，但在接触费马原理后，开始相信“未来”也可能是“因”，从而开始相信命运。</p><h3 id="00:17---🔭-费马原理：光线与宿命的宇宙观"><a href="https://bibigpt.co/content/861f6c18-760f-4b63-96bb-5de8ced6b6db?t=17.000">00:17</a> - 🔭 费马原理：光线与宿命的宇宙观<a title="#00:17---🔭-费马原理：光线与宿命的宇宙观" href="#00:17---🔭-费马原理：光线与宿命的宇宙观"></a></h3><p><img src="https://bibigpt-apps.chatvid.ai/screenshots/bilibili.com/BV1sziQB5EEh/17.jpg" alt="章节截图 00:17" loading="lazy" class="φbp"></p><p>本章详细解释了费马原理：光线从A点到B点经过不同介质时，会选择花费时间最短的路径，而非直线。这一现象“反常识”，因为它似乎意味着光线“预知”了最短路径，仿佛宇宙在出发时就已写好结局。这让作者感受到一种宿命论的宇宙观。</p><h3 id="00:53---🤔-命运已定，选择仍有意义？"><a href="https://bibigpt.co/content/861f6c18-760f-4b63-96bb-5de8ced6b6db?t=53.000">00:53</a> - 🤔 命运已定，选择仍有意义？<a title="#00:53---🤔-命运已定，选择仍有意义？" href="#00:53---🤔-命运已定，选择仍有意义？"></a></h3><p><img src="https://bibigpt-apps.chatvid.ai/screenshots/bilibili.com/BV1sziQB5EEh/53.jpg" alt="章节截图 00:53" loading="lazy" class="φbp"></p><p>作者探讨了如果命运已定，个人选择是否还有意义的问题。他认为选择不仅有意义，而且更重要。这并非是宏大力量安排人生轨迹，而是当我们决定一件事（如爬山）时，宇宙就已生成了那个可能的未来。未来的“我”才是原因，吸引着现在的自己去实现。</p><h3 id="01:38---✍️-自由意志：成为未来的“提示词”"><a href="https://bibigpt.co/content/861f6c18-760f-4b63-96bb-5de8ced6b6db?t=98.000">01:38</a> - ✍️ 自由意志：成为未来的“提示词”<a title="#01:38---✍️-自由意志：成为未来的“提示词”" href="#01:38---✍️-自由意志：成为未来的“提示词”"></a></h3><p><img src="https://bibigpt-apps.chatvid.ai/screenshots/bilibili.com/BV1sziQB5EEh/98.jpg" alt="章节截图 01:38" loading="lazy" class="φbp"></p><p>鉴于我们无法预知未来，选择变得极其有趣且重要。如果缺乏自主选择，就可能被他人的期望或消费主义所定义。视频鼓励观众运用自由意志，清晰具体地向“宇宙”提出自己的未来愿望，就像写AI prompt一样，越具体，未来就越清晰，从而实现“未来的你”吸引“现在的你”去努力的因果。</p><h3 id="02:43---💫-2025年终总结：未来的自己指引当下"><a href="https://bibigpt.co/content/861f6c18-760f-4b63-96bb-5de8ced6b6db?t=163.000">02:43</a> - 💫 2025年终总结：未来的自己指引当下<a title="#02:43---💫-2025年终总结：未来的自己指引当下" href="#02:43---💫-2025年终总结：未来的自己指引当下"></a></h3><p><img src="https://bibigpt-apps.chatvid.ai/screenshots/bilibili.com/BV1sziQB5EEh/163.jpg" alt="章节截图 02:43" loading="lazy" class="φbp"></p><p>在总结部分，作者再次强调他开始相信命运，但不同于传统宿命论的消极等待。他认为“一切都是最好的安排”并非合理化痛苦，而是指未来的“自己”可能就是那个“安排者”，通过“推背感”或暗示来指引当下的行动。这种观点赋予了个人积极主动创造未来的力量。</p><hr>]]>
    </content>
    <id>https://blog.becase.top/post/2026012401</id>
    <link href="https://blog.becase.top/post/2026012401"/>
    <published>2026-01-24T00:00:00.000Z</published>
    <summary>
      <![CDATA[<div class="reprinted-notice" style="
  background: #f8f9fa;
  border-left: 4px solid #333;
  padding: 12px 16px;
  margin: 16px 0;
  borde]]>
    </summary>
    <title>当你决定出发时</title>
    <updated>2026-08-04T09:27:28.568Z</updated>
  </entry>
  <entry>
    <author>
      <name>jiechen</name>
    </author>
    <category term="tech" scheme="https://blog.becase.top/categories/tech/"/>
    <category term="ai" scheme="https://blog.becase.top/categories/tech/ai/"/>
    <category term="business" scheme="https://blog.becase.top/tags/business/"/>
    <category term="ai" scheme="https://blog.becase.top/tags/ai/"/>
    <content>
      <![CDATA[<h1 id="manus-季逸超访谈深度调研报告：ai-时代的产品哲学与创业思考">Manus 季逸超访谈深度调研报告：AI 时代的产品哲学与创业思考<a title="#manus-季逸超访谈深度调研报告：ai-时代的产品哲学与创业思考" href="#manus-季逸超访谈深度调研报告：ai-时代的产品哲学与创业思考"></a></h1><h2 id="播客基本信息">播客基本信息<a title="#播客基本信息" href="#播客基本信息"></a></h2><p><strong>播客名称</strong>：张小珺 Jùn ｜商业访谈录 第 128 期 - “Manus 决定出售前最后的访谈：啊，这奇幻的 2025 年漂流啊…”</p><p><strong>播出时间</strong>：2025 年 12 月 31 日（实际录制于 2025 年 12 月 1 日）</p><p><strong>播出平台</strong>：小宇宙、苹果播客、喜马拉雅等多平台</p><p><strong>访谈时长</strong>：3 小时 31 分钟</p><p><strong>嘉宾介绍</strong>：</p><ul><li><p><strong>季逸超（Peak）</strong>：Manus 联合创始人兼首席科学家，1992 年出生，连续创业者，曾开发猛犸浏览器、Magi 知识引擎</p></li><li><p><strong>张小珺</strong>：财经作者、腾讯新闻科技主笔，《张小珺 Jùn ｜商业访谈录》制作人，拥有 25 年财经媒体经验</p></li></ul><p><strong>特殊意义</strong>：这期访谈录制于 2025 年 12 月 1 日，当时 Meta 收购 Manus 的事件尚未发生。而在节目发布的前一天凌晨，Meta 宣布全资收购 Manus，使这期节目成为了 Manus 公开的最后一次深度访谈<a href="https://www.xiaoyuzhoufm.com/podcast/626b46ea9cbbf0451cf5a962?utm_source=rss" target="_blank">(66)</a>。</p><h2 id="一、季逸超的创业历程与个人背景">一、季逸超的创业历程与个人背景<a title="#一、季逸超的创业历程与个人背景" href="#一、季逸超的创业历程与个人背景"></a></h2><p><img src="./image/manus-jiyichao-interview/01-framework-career-timeline.png" alt="季逸超创业历程时间线" loading="lazy" class="φbp"></p><h3 id="1.1-早期创业：从猛犸浏览器到-peak-labs">1.1 早期创业：从猛犸浏览器到 Peak Labs<a title="#1.1-早期创业：从猛犸浏览器到-peak-labs" href="#1.1-早期创业：从猛犸浏览器到-peak-labs"></a></h3><p>季逸超的创业故事始于 2009 年，当时他还是北大附中的一名高中生。<strong>2009 年苹果发布 iPhone 的第二年，App Store 的出现成为了他人生的重要转折点</strong>，因为它给了开发者一种全景化变现的能力。</p><p>在开发猛犸浏览器之前，季逸超已经开发过六七个苹果应用。<strong>2010 年夏天，高二的他开始开发猛犸浏览器，从设计到美工、开发、测试、运营等工作全部由他一人独立完成</strong>。关于浏览器名称的由来，有一个有趣的故事：第一版完成时，他看到桌子上有一张生物课上拿来的猛犸象图片，由于纯色背景比较容易用 PS 抠出图样做图标，所以他干脆给浏览器起名叫 “猛犸”。</p><p>猛犸浏览器的成功超出了所有人的预期。这款产品凭借占用内存少（当时的手机才 128M 内存）、滑动交互便捷等特征，定价 1.99 美元，<strong>在 App Store 上颇受欢迎，前后为他赚取了 30 多万美金</strong><a href="http://m.toutiao.com/group/7592812703157076522/?upstream_biz=doubao" target="_blank">(102)</a>。更令人惊讶的是，“猛犸 3” 发布后，3 天内下载量达到 12 万<a href="http://news.qq.com/rain/a/20250308A08ABQ00" target="_blank">(62)</a>。</p><p>2011 年，季逸超凭借猛犸浏览器获得了 Macworld Asia 2011 Award 特等奖。<strong>2012 年，他获得徐小平和红杉资本投资，成立了 Peak Labs 实验室，同年 3 月登上《福布斯》中文版封面</strong>，成为 “中美 30 位 30 岁以下创业者” 之一。</p><h3 id="1.2-技术探索：从浏览器到知识图谱">1.2 技术探索：从浏览器到知识图谱<a title="#1.2-技术探索：从浏览器到知识图谱" href="#1.2-技术探索：从浏览器到知识图谱"></a></h3><p>季逸超的技术探索之路从未停止。<strong>2011 年，他因为想解决 “预测用户下一次点击” 的问题，进入了自然语言处理（NLP）领域</strong><a href="http://m.163.com/dy/article_cambrian/KI2BSOSU0556BKW5.html" target="_blank">(60)</a>。这个看似简单的需求，引导他走向了更广阔的技术领域。</p><p>2014 年，他开始做 Magi—— 一个用 AI 自动构建知识图谱的搜索引擎，他的目标是 “做下一代 Google”<a href="http://m.163.com/dy/article_cambrian/KI2BSOSU0556BKW5.html" target="_blank">(60)</a>。这个项目他做了四年，主导研发了 Magi 知识引擎及相关的知识图谱、信息抽取、信息检索技术。麻省理工科技评论曾评价季逸超所研发的 Magi 会成为最大的通用知识图谱系统，中国互联网络信息中心也将其作为人工智能与搜索引擎结合的创新案例列入了年度互联网调查报告。</p><p>在这段技术探索过程中，<strong>季逸超的创业核心始终是需求和兴趣引导，从浏览器的 “预加载需求” 切入 NLP，从知识图谱的 “自动化构建” 走向 Open IE，技术探索始终围绕用户真实痛点，而非单纯追求论文或指标</strong><a href="https://xueqiu.com/4111913912/368423284" target="_blank">(86)</a>。</p><h3 id="1.3-加入-manus：从独立创业到团队合作">1.3 加入 Manus：从独立创业到团队合作<a title="#1.3-加入-manus：从独立创业到团队合作" href="#1.3-加入-manus：从独立创业到团队合作"></a></h3><p>经历了 Magi 项目后，季逸超对 AI 行业有了更深刻的理解。2024 年，经真格基金撮合，他加入了 Manus，与肖弘、张涛组成核心团队<a href="https://xueqiu.com/3783292942/368778062" target="_blank">(73)</a>。</p><p><strong>季逸超选择加入 Manus 的一个重要原因是肖弘是个 “正常人”</strong>。他评价道：“你会发现小红有一个非常稀缺的特质，什么？他很正常。他身心健全，没有任何不良嗜好，没有任何极端的思想。”<a href="https://c.m.163.com/news/a/KI2BSOSU0556BKW5.html" target="_blank">(99)</a>在季逸超看来，“正常” 意味着去精英化的吸引力、团队氛围的确定性价值以及价值层面的共频共振，本质上是价值观的务实和真诚<a href="https://www.iesdouyin.com/share/video/7593038036498268901/?region=&amp;mid=7593037934350125824&amp;u_code=0&amp;did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&amp;iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&amp;with_sec_did=1&amp;video_share_track_ver=&amp;titleType=title&amp;share_sign=0wLvUFYnUqlpI3dFTiPrAA4H781p4leMWkjw_BC4RW0-&amp;share_version=280700&amp;ts=1767945672&amp;from_aid=1128&amp;from_ssr=1&amp;share_track_info=%7B%22link_description_type%22%3A%22%22%7D" target="_blank">(96)</a>。</p><h3 id="1.4-家庭背景：科学家父亲与企业家母亲">1.4 家庭背景：科学家父亲与企业家母亲<a title="#1.4-家庭背景：科学家父亲与企业家母亲" href="#1.4-家庭背景：科学家父亲与企业家母亲"></a></h3><p>季逸超的家庭背景对他的成长产生了深远影响。<strong>他的父亲是北大物理系教授，母亲是老一辈中关村连续创业者</strong>。这种独特的家庭环境让他在两种不同的文化氛围中成长。</p><p>季逸超形容自己是在这两种风格中取了一个中间点，成为了 “科技创业者”。他坦言自己从小不是一个聪明孩子，学习成绩一般，比较偏科。但家庭环境培养了他对技术和商业的双重敏感度，为他日后的创业之路奠定了基础。</p><h2 id="二、manus-的产品哲学与技术路线">二、Manus 的产品哲学与技术路线<a title="#二、manus-的产品哲学与技术路线" href="#二、manus-的产品哲学与技术路线"></a></h2><h3 id="2.1-对-agent-的独特定义：从聊天工具到行动执行者">2.1 对 Agent 的独特定义：从聊天工具到行动执行者<a title="#2.1-对-agent-的独特定义：从聊天工具到行动执行者" href="#2.1-对-agent-的独特定义：从聊天工具到行动执行者"></a></h3><p><img src="./image/manus-jiyichao-interview/02-framework-product-philosophy.png" alt="Manus 产品哲学核心框架" loading="lazy" class="φbp"></p><p>季逸超对 AI Agent 有着独特而深刻的理解。<strong>他认为 Agent 不应该只是一个聊天的入口，而应该是能替代你把事办了的工具。Agent 的定义是：它不应该是你请来的一个老师，而应该是一个随时待命的特工</strong>。</p><p>这种定义反映了 Manus 的产品哲学：<strong>真正的 Agent 一定是结果导向的，它得能去把手弄脏</strong>。季逸超举了一个生动的例子：比如订机票，它直接去比价、去填信息，最后把订单交到你手里，这是对互联网基础设施的重构。</p><p>Manus 的产品定位极其清晰：<strong>不做垂直工具，而是在 “模拟一个人”</strong><a href="http://m.toutiao.com/group/7592812703157076522/?upstream_biz=doubao" target="_blank">(102)</a>。这种定位让 Manus 在众多 AI 产品中独树一帜，它不是为特定场景设计的工具，而是一个通用的智能体，能够处理各种复杂的任务。</p><h3 id="2.2-技术路线：不做模型，专注-agent-框架">2.2 技术路线：不做模型，专注 Agent 框架<a title="#2.2-技术路线：不做模型，专注-agent-框架" href="#2.2-技术路线：不做模型，专注-agent-框架"></a></h3><p>Manus 在技术路线上做出了一个大胆的选择：<strong>几乎不训练自己的模型，也不做微调，坚持依赖最强的模型</strong>。季逸超对此有自己的理解：</p><p>“我觉得首先做模型或者说做垂直整合这件事，它其实最影响的是你初期的迭代速度。我上一次创业最惨痛的教训就是，你在不确定的时候开始做自下而上的迭代的话，你会被你的模型迭代所影响。”</p><p>他进一步解释道，<strong>模型的保质期已经大大缩短，从过去的一年缩短到 1-1.5 个月</strong>。在这种情况下，“如果你只做模型，你不是 SOTA 就没有意义”，这是一种非常激烈的不进则退的状态。</p><p>相反，Manus 选择专注于 Agent 框架和 Context Engineering（上下文工程）。季逸超认为，<strong>上层的 Agent 框架和 Context Engineering 仍然有很多工作要做，而目前没人替他们去做，所以他们自己把研发成本投入到这方面</strong>。</p><h3 id="2.3-数据飞轮：用户反馈驱动的自进化">2.3 数据飞轮：用户反馈驱动的自进化<a title="#2.3-数据飞轮：用户反馈驱动的自进化" href="#2.3-数据飞轮：用户反馈驱动的自进化"></a></h3><p>尽管不做模型，Manus 仍然构建了自己的数据飞轮。季逸超描述了两种主要的方式：</p><p><strong>第一种数据飞轮是基于集体反馈的自进化能力</strong>。当用户使用 Manus 时，会出现两种情况：一是用户会 &quot;教&quot;Agent，比如在筛选简历时告诉 Manus 自己的偏好；二是用户会 &quot;修复&quot;Agent 的错误，比如帮助修改文件格式。“当你有很大的用户量之后，你可以说大一点，叫做基于 collective feedback 做到一种在线学习。但是我很不喜欢在线学习这个字。它能达到的一点就是我们即使不碰模型，也能够获得一种叫做 self evolving 的能力。”</p><p><strong>第二种是基于用户朴素反馈的评估优化</strong>。Manus 非常依赖用户给的直接反馈，且有一个固定的团队专门做 evaluation，而且是主观 evaluation。“因为用户关注点跟这些理想化的 benchmark 还挺不一样的。比如说用户更关注的是你做的这个网站，长宽比是否超过了 16:9，这个网站是否比较易用且好看。”</p><h3 id="2.4-增长运营秘诀：少即是多的设计哲学">2.4 增长运营秘诀：少即是多的设计哲学<a title="#2.4-增长运营秘诀：少即是多的设计哲学" href="#2.4-增长运营秘诀：少即是多的设计哲学"></a></h3><p>Manus 的增长运营有其独特的秘诀。<strong>季逸超强调：“打造 Manus 的秘诀首先在于不侵入，能少一个按钮就少一个按钮”</strong>。这种 “少即是多” 的设计哲学贯穿了 Manus 的整个产品设计。</p><p>在用户参与方面，Manus 极其重视真实世界的反馈。季逸超认为：“Agent 的进步不能只靠实验室的数据，它必须在真实世界的环境里被毒打。当用户给出模糊指令而执行失败时，这种失败的数据比成功更宝贵。”</p><p>在运营上，<strong>Manus 是一个云原生的公司，组织架构非常清亮，产品只看一个指标：这个 Agent 是不是真正的帮用户节省了时间，是不是真正的完成了任务</strong>。</p><h3 id="2.5-对-&quot;套壳&quot;-争议的回应">2.5 对 “套壳” 争议的回应<a title="#2.5-对-&quot;套壳&quot;-争议的回应" href="#2.5-对-&quot;套壳&quot;-争议的回应"></a></h3><p>面对外界关于 Manus 是 “套壳” 产品的质疑，季逸超给出了自己的理解：“<strong>套壳到极致，本身也是一种胜利</strong>”。他认为这不仅是辩解，更是对产品边界与用户价值的重新理解。</p><p>季逸超澄清了一个重要争议：“如果我们在 3 月份发布的时候，如果我们有任何付费的宣传 —— 我死全家。”<a href="https://c.m.163.com/news/a/KI2BSOSU0556BKW5.html" target="_blank">(99)</a>他强调，Manus 的产品力源于对用户需求的深刻理解，而非简单的包装。</p><h2 id="三、ai-行业观察与思考">三、AI 行业观察与思考<a title="#三、ai-行业观察与思考" href="#三、ai-行业观察与思考"></a></h2><h3 id="3.1-ai-时代的创业认知：从艺术家到精英者">3.1 AI 时代的创业认知：从艺术家到精英者<a title="#3.1-ai-时代的创业认知：从艺术家到精英者" href="#3.1-ai-时代的创业认知：从艺术家到精英者"></a></h3><p><img src="./image/manus-jiyichao-interview/03-framework-era-transition.png" alt="AI 时代创业思维转变" loading="lazy" class="φbp"></p><p>季逸超对 AI 时代的创业有着深刻的洞察。他指出了一个关键差异：<strong>“移动互联网喜欢艺术家，但是 AI 时代更需要精英者”</strong><a href="https://www.iesdouyin.com/share/video/7592277863082024870/?region=&amp;mid=7592277796819356443&amp;u_code=0&amp;did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&amp;iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&amp;with_sec_did=1&amp;video_share_track_ver=&amp;titleType=title&amp;share_sign=jSpFWWqq7nSXFJ3FPyU3Eghs3pxBu4oZA0rCUZoVOyw-&amp;share_version=280700&amp;ts=1767945672&amp;from_aid=1128&amp;from_ssr=1&amp;share_track_info=%7B%22link_description_type%22%3A%22%22%7D" target="_blank">(94)</a>。</p><p>这个观点背后有着深刻的商业逻辑。季逸超解释道：“移动互联网时代边际成本几乎为零，软件产品有了规模之后，服务成本基本不变。可以很有情怀、很偏执，特别艺术家，只要找到一群跟你同频共振的用户，就能把这个事业给做起来。但是 AI 不一样，AI 创业更像传统制造业，每一次用户调用都会产生一定的 TOKEN 成本，用的人越多成本越高。”</p><p>他用一句特别扎心的话总结道：“<strong>太多人有乔布斯的病，但没有乔布斯的命</strong>”<a href="https://www.iesdouyin.com/share/video/7592277863082024870/?region=&amp;mid=7592277796819356443&amp;u_code=0&amp;did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&amp;iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&amp;with_sec_did=1&amp;video_share_track_ver=&amp;titleType=title&amp;share_sign=jSpFWWqq7nSXFJ3FPyU3Eghs3pxBu4oZA0rCUZoVOyw-&amp;share_version=280700&amp;ts=1767945672&amp;from_aid=1128&amp;from_ssr=1&amp;share_track_info=%7B%22link_description_type%22%3A%22%22%7D" target="_blank">(94)</a>。意思是，很多创业者都太艺术家了，这种所谓的艺术家气质对创业公司其实是风险。创始人不应该陷入那种为理想殉道的悲情意识，因为这会掩盖商业判断。在他看来，好的创始人应该是理性的执行者，去解决具体、琐碎的需求，而不是天天想着怎么去改变人类。</p><h3 id="3.2-大模型时代的竞争格局">3.2 大模型时代的竞争格局<a title="#3.2-大模型时代的竞争格局" href="#3.2-大模型时代的竞争格局"></a></h3><p>季逸超对大模型时代的竞争格局有着清醒的认识。<strong>他认为 DeepSeek 的出现对整个行业产生了巨大冲击，让模型的保质期从过去的一年缩短到只有 1-1.5 个月</strong>。</p><p>DeepSeek 的成功证明了一个重要观点：<strong>在大模型领域效率和工程能力有时候比单纯的算力堆砌更重要，它还打破了大家对大厂算力霸权的某种幻觉</strong>。对于做 Agent 的人来说，底层能力普及是好事，但同时也让竞争变得白热化，底层能力不再是某几家公司的护城河，大家的差距在快速缩小。</p><p>关于未来的竞争格局，季逸超认为：“<strong>现在的 AI 竞争没有蛮荒期，无论是大厂还是小公司反应都极其快。做大模型的公司一定最后会变成同时做模型和应用的公司</strong>”。在 Agent 赛道，Manus 的对手不只是创业公司，更是那些掌握入口的大厂。但是大厂往往有路径依赖，想的是怎么保护原有的生态，Manus 想的是怎么打破这些 app 之间的围墙。</p><h3 id="3.3-&quot;有所不为&quot;-的产品哲学">3.3 “有所不为” 的产品哲学<a title="#3.3-&quot;有所不为&quot;-的产品哲学" href="#3.3-&quot;有所不为&quot;-的产品哲学"></a></h3><p>在 AI 时代，季逸超提出了一个重要观点：<strong>“AI 时代不做什么比做什么更加重要”</strong><a href="https://www.iesdouyin.com/share/video/7592277863082024870/?region=&amp;mid=7592277796819356443&amp;u_code=0&amp;did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&amp;iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&amp;with_sec_did=1&amp;video_share_track_ver=&amp;titleType=title&amp;share_sign=jSpFWWqq7nSXFJ3FPyU3Eghs3pxBu4oZA0rCUZoVOyw-&amp;share_version=280700&amp;ts=1767945672&amp;from_aid=1128&amp;from_ssr=1&amp;share_track_info=%7B%22link_description_type%22%3A%22%22%7D" target="_blank">(94)</a>。他说：“以前可能没有思考不做什么的奢侈，现在不做什么才是每天都要回答的命题。”</p><p>这种 “有所不为” 的哲学在 Manus 的产品决策中体现得淋漓尽致。季逸超透露，Manus 是一款相对克制的产品，很多 Agent 公司都在拼命给 AI 加工具、加能力，Manus 反而每个月都在想能删掉什么。<strong>他们公司甚至砍掉了一个做了 7 个月的 AI 浏览器项目，理由只有一个：做完了之后自己都觉得不太酷</strong>。</p><p>他解释道：“你本应该是最喜欢这个产品的人，都觉得不喜欢，用户怎么可能会喜欢？” 这种对产品的高标准和严要求，体现了 Manus 对用户体验的极致追求。</p><h3 id="3.4-ai-与人类的关系思考">3.4 AI 与人类的关系思考<a title="#3.4-ai-与人类的关系思考" href="#3.4-ai-与人类的关系思考"></a></h3><p>季逸超对 AI 与人类的关系有着独特的见解。他认为，<strong>现在的 AI 模型已经达到了 “超人” 级别，数学竞赛能吊打大部分人，但问题是它们还像 “瓶子里的大脑”，必须和现实世界交互</strong>。</p><p>更重要的是，他指出了一个关键问题：“<strong>AI 永远无法替代中介面对客户时的那种沟通方式。因为这是关于信任的事情。而信任，是不能完全交给 AI 的</strong>”。这个观点揭示了 AI 在某些领域的局限性，也为未来 AI 产品的发展指明了方向。</p><h2 id="四、创业思考与人生感悟">四、创业思考与人生感悟<a title="#四、创业思考与人生感悟" href="#四、创业思考与人生感悟"></a></h2><h3 id="4.1-对-&quot;正常&quot;-的理解：理性与平衡">4.1 对 “正常” 的理解：理性与平衡<a title="#4.1-对-&quot;正常&quot;-的理解：理性与平衡" href="#4.1-对-&quot;正常&quot;-的理解：理性与平衡"></a></h3><p>在访谈中，季逸超多次提到 “正常” 这个词，这反映了他对创业和人生的理解。他认为，在当前的 AI 行业中，“正常” 是一种极其稀缺的品质。</p><p><strong>“正常” 意味着身心健全，没有不良嗜好，没有极端思想</strong><a href="https://c.m.163.com/news/a/KI2BSOSU0556BKW5.html" target="_blank">(99)</a>。在他看来，很多创业者都太 “艺术家” 了，陷入了为理想殉道的悲情意识，这会掩盖商业判断。好的创始人应该是理性的执行者，去解决具体、琐碎的需求，而不是天天想着怎么去改变人类。</p><p>这种对 “正常” 的追求，实际上是对理性和平衡的追求。在一个充满激情和泡沫的行业中，保持理性和清醒是极其困难的，但也是极其重要的。</p><h3 id="4.2-悲观与乐观：在不确定性中前行">4.2 悲观与乐观：在不确定性中前行<a title="#4.2-悲观与乐观：在不确定性中前行" href="#4.2-悲观与乐观：在不确定性中前行"></a></h3><p>当被问到对 Manus 最悲观的预期时，季逸超的回答令人印象深刻：<strong>“悲观预期就是下个月死掉。然后补了一句：” 我们没有权利活着，我们是在努力获得一个活着的权利。&quot;</strong><a href="https://c.m.163.com/news/a/KI2BSOSU0556BKW5.html" target="_blank">(99)</a></p><p>然而，这种看似悲观的态度背后，实际上是一种深刻的清醒和责任感。季逸超说：“如果 Manus 下个月死了，我会歇一会。”<a href="http://m.163.com/sports/article_cambrian/KI2BSOSU0556BKW5.html" target="_blank">(52)</a>但他又补充道：“我早就无憾了。” 这句话在被收购的语境下，听起来像是一种松弛。</p><p>这种在悲观与乐观之间的平衡，体现了一个连续创业者对不确定性的深刻理解和接受。</p><h3 id="4.3-关于学习：实践优于理论">4.3 关于学习：实践优于理论<a title="#4.3-关于学习：实践优于理论" href="#4.3-关于学习：实践优于理论"></a></h3><p>在访谈中，当被问到平时看什么书时，季逸超的回答出人意料：“<strong>我不看书</strong>”<a href="https://www.iesdouyin.com/share/video/7591345572239794843/?region=&amp;mid=7591345441896155956&amp;u_code=0&amp;did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&amp;iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&amp;with_sec_did=1&amp;video_share_track_ver=&amp;titleType=title&amp;share_sign=1nMOaFLbdbex2Tb_wRrlzFU6p7TWukcdmFtTqZsNVZA-&amp;share_version=280700&amp;ts=1767945665&amp;from_aid=1128&amp;from_ssr=1&amp;share_track_info=%7B%22link_description_type%22%3A%22%22%7D" target="_blank">(91)</a>。但他随即解释道，虽然不看书，但他的学习能力特别强。</p><p>这种学习方式反映了季逸超的实践导向思维。他的创业过程一直在迭代，核心是需求和兴趣引导，从浏览器的 “预加载需求” 切入 NLP，从知识图谱的 “自动化构建” 走向 Open IE，技术探索始终围绕用户真实痛点，而非单纯追求论文或指标<a href="https://xueqiu.com/4111913912/368423284" target="_blank">(86)</a>。</p><h3 id="4.4-被收购的思考：从句号到逗号">4.4 被收购的思考：从句号到逗号<a title="#4.4-被收购的思考：从句号到逗号" href="#4.4-被收购的思考：从句号到逗号"></a></h3><p>关于 Manus 被 Meta 收购，季逸超有着自己的理解。他强调，<strong>收购决策是一个非常自然的过程，在 2025 年的这个节点，他意识到 Agent 的普及需要远比想象中庞大的算力和资源支持</strong>。</p><p>更重要的是，他明确指出：“决定收购不是因为做不下去了，而是想让这种技术更快的影响更多人。” 在谈判中，他最看重团队的独立性和技术路线的延续性，不希望变成大厂里边缘的部门。</p><p>对于未来，季逸超充满期待：“<strong>这次收购不是一个句号，而是一个逗号，是探索 AGI 下一公里的底座</strong>”。这种积极的态度，体现了他对技术前景的信心和对未来的期待。</p><h2 id="五、核心金句与关键观点">五、核心金句与关键观点<a title="#五、核心金句与关键观点" href="#五、核心金句与关键观点"></a></h2><p><img src="./image/manus-jiyichao-interview/04-framework-key-quotes.png" alt="核心金句集锦" loading="lazy" class="φbp"></p><h3 id="5.1-关于产品哲学的金句">5.1 关于产品哲学的金句<a title="#5.1-关于产品哲学的金句" href="#5.1-关于产品哲学的金句"></a></h3><ol><li><p><strong>“套壳到极致，本身也是一种胜利”</strong> - 这不仅是对质疑的回应，更是对产品边界与用户价值的重新理解</p></li><li><p><strong>“打造 Manus 的秘诀首先在于不侵入，能少一个按钮就少一个按钮”</strong> - 体现了 “少即是多” 的设计哲学</p></li><li><p><strong>“Agent 不应该是你请来的一个老师，而应该是一个随时待命的特工”</strong> - 对 Agent 的独特定义</p></li><li><p><strong>“真正的 Agent 一定是结果导向的，它得能去把手弄脏”</strong> - 强调 Agent 的行动能力</p></li></ol><h3 id="5.2-关于创业思考的金句">5.2 关于创业思考的金句<a title="#5.2-关于创业思考的金句" href="#5.2-关于创业思考的金句"></a></h3><ol><li><p><strong>“太多人有乔布斯的病，但没有乔布斯的命”</strong> - 对 AI 时代创业者的警醒<a href="https://www.iesdouyin.com/share/video/7592277863082024870/?region=&amp;mid=7592277796819356443&amp;u_code=0&amp;did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&amp;iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&amp;with_sec_did=1&amp;video_share_track_ver=&amp;titleType=title&amp;share_sign=jSpFWWqq7nSXFJ3FPyU3Eghs3pxBu4oZA0rCUZoVOyw-&amp;share_version=280700&amp;ts=1767945672&amp;from_aid=1128&amp;from_ssr=1&amp;share_track_info=%7B%22link_description_type%22%3A%22%22%7D" target="_blank">(94)</a></p></li><li><p><strong>“以前可能没有思考不做什么的奢侈，现在不做什么才是每天都要回答的命题”</strong> - AI 时代的选择哲学</p></li><li><p><strong>“我们没有权利活着，我们是在努力获得一个活着的权利”</strong> - 对创业公司生存状态的深刻描述<a href="https://c.m.163.com/news/a/KI2BSOSU0556BKW5.html" target="_blank">(99)</a></p></li><li><p><strong>“这次收购不是一个句号，而是一个逗号，是探索 AGI 下一公里的底座”</strong> - 对被收购的积极理解</p></li></ol><h3 id="5.3-关于行业洞察的金句">5.3 关于行业洞察的金句<a title="#5.3-关于行业洞察的金句" href="#5.3-关于行业洞察的金句"></a></h3><ol><li><p><strong>“移动互联网喜欢艺术家，但是 AI 时代更需要精英者”</strong> - 时代变迁的洞察<a href="https://www.iesdouyin.com/share/video/7592277863082024870/?region=&amp;mid=7592277796819356443&amp;u_code=0&amp;did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&amp;iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&amp;with_sec_did=1&amp;video_share_track_ver=&amp;titleType=title&amp;share_sign=jSpFWWqq7nSXFJ3FPyU3Eghs3pxBu4oZA0rCUZoVOyw-&amp;share_version=280700&amp;ts=1767945672&amp;from_aid=1128&amp;from_ssr=1&amp;share_track_info=%7B%22link_description_type%22%3A%22%22%7D" target="_blank">(94)</a></p></li><li><p><strong>“Benchmark 是所有 AI 公司的唯一护城河”</strong> - 对 AI 公司核心竞争力的理解</p></li><li><p><strong>“AI 时代不做什么比做什么更加重要”</strong> - 对 AI 时代竞争策略的思考<a href="https://www.iesdouyin.com/share/video/7592277863082024870/?region=&amp;mid=7592277796819356443&amp;u_code=0&amp;did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&amp;iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&amp;with_sec_did=1&amp;video_share_track_ver=&amp;titleType=title&amp;share_sign=jSpFWWqq7nSXFJ3FPyU3Eghs3pxBu4oZA0rCUZoVOyw-&amp;share_version=280700&amp;ts=1767945672&amp;from_aid=1128&amp;from_ssr=1&amp;share_track_info=%7B%22link_description_type%22%3A%22%22%7D" target="_blank">(94)</a></p></li><li><p><strong>“AI 接下来的进步需要每一个用户的参与”</strong> - 对 AI 发展方向的判断，也是访谈的最后一句话<a href="https://www.iesdouyin.com/share/video/7592277863082024870/?region=&amp;mid=7592277796819356443&amp;u_code=0&amp;did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&amp;iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&amp;with_sec_did=1&amp;video_share_track_ver=&amp;titleType=title&amp;share_sign=jSpFWWqq7nSXFJ3FPyU3Eghs3pxBu4oZA0rCUZoVOyw-&amp;share_version=280700&amp;ts=1767945672&amp;from_aid=1128&amp;from_ssr=1&amp;share_track_info=%7B%22link_description_type%22%3A%22%22%7D" target="_blank">(94)</a></p></li></ol><h3 id="5.4-关于技术趋势的金句">5.4 关于技术趋势的金句<a title="#5.4-关于技术趋势的金句" href="#5.4-关于技术趋势的金句"></a></h3><ol><li><p><strong>“模型的保质期只有 1-1.5 个月”</strong> - 对大模型时代竞争激烈程度的描述</p></li><li><p><strong>“现在的 AI 模型已经 ’ 超人 ’ 级别了，但还像 ’ 瓶子里的大脑 '”</strong> - 对 AI 现状的形象比喻</p></li><li><p><strong>“AI 永远无法替代中介面对客户时的那种沟通方式，因为信任是不能完全交给 AI 的”</strong> - 对 AI 局限性的认识</p></li></ol><h2 id="六、内容亮点总结">六、内容亮点总结<a title="#六、内容亮点总结" href="#六、内容亮点总结"></a></h2><h3 id="6.1-三大核心洞察">6.1 三大核心洞察<a title="#6.1-三大核心洞察" href="#6.1-三大核心洞察"></a></h3><p>通过对三个半小时访谈的深入分析，我们可以提炼出季逸超最核心的三大洞察：</p><p><strong>第一，移动互联网与 AI 时代的本质差异</strong>。移动互联网时代可以有情怀、很偏执，因为边际成本几乎为零；而 AI 时代更像传统制造业，每一次调用都有成本，需要更理性的商业判断。</p><p><strong>第二，“有所不为” 的战略思维</strong>。在 AI 时代，选择不做什么比做什么更重要。Manus 的成功部分源于其克制的产品策略，每个月都在思考能删掉什么功能。</p><p><strong>第三，用户参与的重要性</strong>。季逸超在访谈最后说：“AI 接下来的进步需要每一个用户的参与”<a href="https://www.iesdouyin.com/share/video/7592277863082024870/?region=&amp;mid=7592277796819356443&amp;u_code=0&amp;did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&amp;iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&amp;with_sec_did=1&amp;video_share_track_ver=&amp;titleType=title&amp;share_sign=jSpFWWqq7nSXFJ3FPyU3Eghs3pxBu4oZA0rCUZoVOyw-&amp;share_version=280700&amp;ts=1767945672&amp;from_aid=1128&amp;from_ssr=1&amp;share_track_info=%7B%22link_description_type%22%3A%22%22%7D" target="_blank">(94)</a>。这不仅是对技术发展的判断，也体现了 Manus 重视用户反馈的产品理念。</p><h3 id="6.2-产品设计的独特理念">6.2 产品设计的独特理念<a title="#6.2-产品设计的独特理念" href="#6.2-产品设计的独特理念"></a></h3><p>Manus 的产品设计理念可以总结为 “<strong>少即是多，行动至上</strong>”。从&quot; 能少一个按钮就少一个按钮 “的设计原则，到” 真正的 Agent 得能去把手弄脏 &quot; 的行动理念，都体现了对用户体验的极致追求。</p><p>特别值得注意的是 Manus 对 “失败数据” 的重视。季逸超认为，当用户给出模糊指令而执行失败时，这种失败的数据比成功更宝贵。这种逆向思维，让 Manus 能够在不断的 “试错” 中进化。</p><h3 id="6.3-技术路线的大胆选择">6.3 技术路线的大胆选择<a title="#6.3-技术路线的大胆选择" href="#6.3-技术路线的大胆选择"></a></h3><p>Manus 选择了一条看似 “非主流” 的技术路线：<strong>不做模型，专注 Agent 框架</strong>。这种选择基于对行业趋势的深刻洞察：模型的保质期越来越短，而 Agent 框架和 Context Engineering 还有巨大的创新空间。</p><p>更巧妙的是，Manus 通过大量的 Token 消耗成为了模型厂商的重要客户，从而能够影响模型的发展方向。季逸超透露，Google DeepMind 的一些新功能就是根据 Manus 的需求开发的。</p><h3 id="6.4-对-&quot;正常&quot;-的追求">6.4 对 “正常” 的追求<a title="#6.4-对-&quot;正常&quot;-的追求" href="#6.4-对-&quot;正常&quot;-的追求"></a></h3><p>在整个访谈中，“正常” 这个词多次出现，这反映了季逸超对创业和人生的理解。在一个充满激情和泡沫的行业中，保持 “正常”—— 理性、平衡、不极端 —— 是一种稀缺而宝贵的品质。</p><p>这种对 “正常” 的追求，让 Manus 在激烈的竞争中保持了独特的视角和定力。正如季逸超所说，好的创始人应该是理性的执行者，而不是陷入悲情意识的艺术家。</p><h2 id="结语：ai-时代的理性声音">结语：AI 时代的理性声音<a title="#结语：ai-时代的理性声音" href="#结语：ai-时代的理性声音"></a></h2><p>这三个半小时的访谈，不仅是 Manus 被收购前的最后一次公开对话，更是一位连续创业者对 AI 时代的深度思考和总结。季逸超用他独特的视角，为我们呈现了一个不一样的 AI 创业故事。</p><p>在这个故事中，我们看到了技术理想与商业现实的平衡，看到了 “有所为有所不为” 的战略智慧，更看到了在不确定性中保持理性和清醒的重要性。<strong>“AI 接下来的进步需要每一个用户的参与”</strong>—— 这不仅是季逸超对未来的判断，也应该成为我们每个人的行动指南。</p><p>对于创业者而言，季逸超的经历和思考提供了宝贵的借鉴：在 AI 时代，技术能力固然重要，但商业判断力、产品洞察力和对用户需求的理解同样不可或缺。成功的关键不在于追逐每一个技术热点，而在于找到真正的用户痛点，并以理性和务实的态度去解决它。</p><p>对于普通用户而言，这期访谈提醒我们：AI 不仅是技术专家的领域，更是每一个人都能参与、都能受益、都能产生影响的时代。在使用 AI 产品的同时，我们也在为 AI 的进步贡献着自己的力量。</p><p>最后，让我们记住季逸超的那句话：“<strong>我们没有权利活着，我们是在努力获得一个活着的权利</strong>”<a href="https://c.m.163.com/news/a/KI2BSOSU0556BKW5.html" target="_blank">(99)</a>。这种对生存的敬畏和对成功的谦逊，或许正是这个时代最需要的品质。在 AI 浪潮席卷而来的今天，保持理性、坚持价值、勇于创新，我们才能在这场技术革命中找到属于自己的位置。</p><h2 id="参考资料">参考资料<a title="#参考资料" href="#参考资料"></a></h2><h3 id="核心访谈来源">核心访谈来源<a title="#核心访谈来源" href="#核心访谈来源"></a></h3><ol><li><p><strong>张小珺 Jùn｜商业访谈录 第 128 期</strong> - Manus 决定出售前最后的访谈</p><ul><li><a href="https://www.xiaoyuzhoufm.com/episode/695331cb2db086f897b50ea9" target="_blank">小宇宙</a> ｜ <a href="https://podcasts.apple.com/cn/podcast/id1634356920?i=1000743131736" target="_blank">Apple 播客</a></li></ul></li><li><p><strong>腾讯科技独家对话 Manus 肖弘</strong> - 混沌学园对话 Manus 两位创始人</p><ul><li><a href="https://m.sohu.com/a/871251605_121124376/" target="_blank">搜狐</a></li></ul></li><li><p><strong>对话&quot;Manus&quot;两位创始人：2025，AI Agent 即将引爆</strong></p><ul><li><a href="https://finance.sina.com.cn/jjxw/2025-03-10/doc-inepeiih0596196.shtml" target="_blank">新浪财经</a></li></ul></li></ol><h3 id="深度解读文章">深度解读文章<a title="#深度解读文章" href="#深度解读文章"></a></h3><ol start="4"><li><p><strong>Manus 被收购前最后一次访谈：季逸超还不知道 Meta 即将来敲门</strong> - 网易</p><ul><li><a href="https://c.m.163.com/news/a/KI2BSOSU0556BKW5.html" target="_blank">链接</a></li></ul></li><li><p><strong>Manus 季逸超访谈解读系列</strong> - 孔某人的低维认知</p><ul><li><a href="http://m.toutiao.com/group/7591408149740012038/" target="_blank">(1) Benchmark 是所有 AI 公司的唯一护城河</a></li><li><a href="http://m.toutiao.com/group/7591946717029728774/" target="_blank">(2) Proactive Agent 不应占用用户时间</a></li><li><a href="http://m.toutiao.com/group/7592317769761260067/" target="_blank">(3) Manus 的数据飞轮</a></li><li><a href="http://m.toutiao.com/group/7592688829362864680/" target="_blank">(4) 不要构建对等的 Multi-Agent</a></li></ul></li><li><p><strong>Manus 杀疯了！这个非主流 90 后的突围路，揭示了 AI 时代的成长法则</strong> - 外滩教育</p><ul><li><a href="http://m.toutiao.com/group/7592812703157076522/" target="_blank">链接</a></li></ul></li><li><p><strong>3 位连续创业者打造 Manus，应用潮里有更多&quot;underdog&quot;的机会</strong> - 腾讯新闻</p><ul><li><a href="http://news.qq.com/rain/a/20250308A08ABQ00" target="_blank">链接</a></li></ul></li></ol><h3 id="人物背景资料">人物背景资料<a title="#人物背景资料" href="#人物背景资料"></a></h3><ol start="8"><li><p><strong>季逸超 Peak：AI 竞泳十年</strong> - 网易订阅</p><ul><li><a href="https://www.163.com/dy/article/IPQ85GIG0511B6FU.html" target="_blank">链接</a></li></ul></li><li><p><strong>季逸超百科词条</strong> - 百度百科</p><ul><li><a href="https://m.baike.com/wiki/%E5%AD%A3%E9%80%B8%E8%B6%85/4094098" target="_blank">链接</a></li></ul></li><li><p><strong>英雄出少年之季逸超</strong> - CSDN 博客</p><ul><li><a href="https://blog.csdn.net/junecauzhang/article/details/7889256" target="_blank">链接</a></li></ul></li></ol><h3 id="行业分析与评论">行业分析与评论<a title="#行业分析与评论" href="#行业分析与评论"></a></h3><ol start="11"><li><p><strong>Manus 上岸了，但 Agent 还没有赢</strong> - 中国企业家杂志</p><ul><li><a href="http://m.toutiao.com/group/7589981563408957978/" target="_blank">链接</a></li></ul></li><li><p><strong>Manus 最新对话全文：尝试 Agent 支付，公司 ARR 近 1 亿美元</strong> - 极客公园</p><ul><li><a href="http://m.toutiao.com/group/7541273859254698539/" target="_blank">链接</a></li></ul></li><li><p><strong>Manus 季逸超访谈：阿里千问非常扎实</strong> - 雪球</p><ul><li><a href="https://xueqiu.com/4111913912/368423284" target="_blank">链接</a></li></ul></li><li><p><strong>AI 时代，到底什么是稀缺的？</strong> - 网易订阅</p><ul><li><a href="https://www.163.com/dy/article/KIGT8PU905566SDR.html" target="_blank">链接</a></li></ul></li></ol><h3 id="相关播客">相关播客<a title="#相关播客" href="#相关播客"></a></h3><ol start="15"><li><p><strong>播客更新｜与戴雨森和季逸超聊：一幅 Sora 的信息拼图和中国大模型淘汰赛</strong> - 腾讯新闻</p><ul><li><a href="http://news.qq.com/rain/a/20240311A024IP00" target="_blank">链接</a></li></ul></li><li><p><strong>AGI 范式大转移：和广密预言草莓、OpenAI o1 和 self-play RL</strong> - 小宇宙</p><ul><li><a href="https://www.xiaoyuzhoufm.com/episode/66d866f0f39a2201c069dccb" target="_blank">链接</a></li></ul></li></ol><hr><blockquote><p>注：本文档部分内容可能由 AI 辅助生成，核心观点均来自原始访谈内容。</p></blockquote>]]>
    </content>
    <id>https://blog.becase.top/post/20260103</id>
    <link href="https://blog.becase.top/post/20260103"/>
    <published>2026-01-03T14:14:29.000Z</published>
    <summary>
      <![CDATA[<h1 id="manus-季逸超访谈深度调研报告：ai-时代的产品哲学与创业思考">Manus 季逸超访谈深度调研报告：AI 时代的产品哲学与创业思考<a title="#manus-季逸超访谈深度调研报告：ai-时代的产品哲学与创业思考" href="#manus-季逸超访谈]]>
    </summary>
    <title>Manus 季逸超访谈深度调研报告：AI 时代的产品哲学与创业思考</title>
    <updated>2026-08-04T09:27:28.572Z</updated>
  </entry>
  <entry>
    <author>
      <name>jiechen</name>
    </author>
    <category term="tech" scheme="https://blog.becase.top/categories/tech/"/>
    <category term="annual-review" scheme="https://blog.becase.top/categories/tech/annual-review/"/>
    <category term="annual-review" scheme="https://blog.becase.top/tags/annual-review/"/>
    <category term="planning" scheme="https://blog.becase.top/tags/planning/"/>
    <content>
      <![CDATA[<h1 id="生活上">生活上<a title="#生活上" href="#生活上"></a></h1><h2 id="认识自己的性格缺点">认识自己的性格缺点<a title="#认识自己的性格缺点" href="#认识自己的性格缺点"></a></h2><ul><li>直言直语：有时候是直言不讳的勇敢，有时候也是欠缺考量的冲动</li></ul><p>非暴力沟通这本书，还是得多复习复习</p><h2 id="享受幸福">享受幸福<a title="#享受幸福" href="#享受幸福"></a></h2><p>拥抱鱼鱼，经历了很多时间节点</p><ul><li>情人节前后在她家（不知前后）</li><li>端午出发了千岛湖度假</li><li>七夕的再度出发青岛，看电影《七天》</li><li>圣诞节前在迪士尼</li><li>临近元旦的新家布置</li></ul><h2 id="继续几个城市的旅游">继续几个城市的旅游<a title="#继续几个城市的旅游" href="#继续几个城市的旅游"></a></h2><p>这个 J 人变的更 P 了</p><ul><li>苏州</li><li>深圳 &amp; 香港<ul><li>无攻略准备，直接单刷，体验还是有点局促的；但胜在自身如意也乐意</li></ul></li><li>上海迪士尼</li></ul><h2 id="换工作，换房子">换工作，换房子<a title="#换工作，换房子" href="#换工作，换房子"></a></h2><ul><li><p>一个月速通了面试</p><ul><li>在全勤工作的情况下，下班后晚上一周 10 场面试的经历，着实辛苦</li><li>好在结果如人意</li></ul></li><li><p>搬家，换了更好的房子</p><ul><li>终于有了心心念念的阳光</li></ul></li></ul><h2 id="技能方面">技能方面<a title="#技能方面" href="#技能方面"></a></h2><ul><li>摄影 📷：愈发炉火纯青</li></ul><h1 id="工作上">工作上<a title="#工作上" href="#工作上"></a></h1><h2 id="全面拥抱-ai">全面拥抱 AI<a title="#全面拥抱-ai" href="#全面拥抱-ai"></a></h2><h3 id="cursor-的年费用户">Cursor 的年费用户<a title="#cursor-的年费用户" href="#cursor-的年费用户"></a></h3><p>一个月 20$ 的订阅，物超所值；不知不觉就经历了一年的周期</p><p>虽然又从 Cursor 后面换成了 168¥/年 的 Antigravity 哈哈哈哈</p><h2 id="跳槽面试经历">跳槽面试经历<a title="#跳槽面试经历" href="#跳槽面试经历"></a></h2><p>经历过好些有趣的事情</p><ul><li>美国律师背景的女强人，回国组建 AI 团队，做信息服务</li><li>阿里高 P 跳槽，组建 AI 团队做商品比价和筛选服务</li><li>百度三轮技术面试全是女强人</li><li>阿里一个 BU 下的两个组竞争候选人逻辑</li></ul><h1 id="2026-的发展规划">2026 的发展规划<a title="#2026-的发展规划" href="#2026-的发展规划"></a></h1><ul><li>生活上<ul><li>生活技能再加强加强</li></ul></li><li>工作上<ul><li>尽早游刃有余</li></ul></li></ul>]]>
    </content>
    <id>https://blog.becase.top/post/2025122903</id>
    <link href="https://blog.becase.top/post/2025122903"/>
    <published>2025-12-29T00:00:00.000Z</published>
    <summary>
      <![CDATA[<h1 id="生活上">生活上<a title="#生活上" href="#生活上"></a></h1>
<h2 id="认识自己的性格缺点">认识自己的性格缺点<a title="#认识自己的性格缺点" href="#认识自己的性格缺点"></a></h2>
<ul>
<li]]>
    </summary>
    <title>我在2025这一年</title>
    <updated>2026-08-04T09:27:28.576Z</updated>
  </entry>
  <entry>
    <author>
      <name>jiechen</name>
    </author>
    <content>
      <![CDATA[<p>现在在各种各样的争议事件中，身份和姿态是最重要的——影响现在的舆论场好恶判断的东西。</p><p>哪怕你的内核没有太大的问题，只要你的身份、姿态是高高在上的，那么你一定是遭殃的。这个时代最讨巧的人设是真小人，把一些东西摆在明面上，比如我说我就是一个唯利是图的不顾一切赚钱的人，就是想赚你们的钱，网友可能反而觉得，你把兄弟们当自己人，跟我们说真话，虽然日常生活中他们不会喜欢这样的人，但是不重要，传播上的情绪模式是对的，把姿态摆到了一个和网友平起平坐的状态，引起大家的好感。</p><p>这个趋势的结果是：各路的公众人物，企业家学者明星都退出了公共讨论。一个人说的话不可能永远正确。</p><h2 id="舆论场的第一次崩坏：不允许错误出现">舆论场的第一次崩坏：不允许错误出现<a title="#舆论场的第一次崩坏：不允许错误出现" href="#舆论场的第一次崩坏：不允许错误出现"></a></h2><p>最开始的时候，舆论场还算健康。政府、媒体、学者、公众、明星这些不同的节点之间还能展开充分的交流。公众可以在平台上进行内容创作，受到认可的内容能引发深入讨论，形成多角度的思辨，容易带来真理的火花。优质内容得到鼓励，内容的多样性和真实感成为主流。</p><p>但第一次崩坏很快就来了：不允许错误出现。</p><p>公众人士一旦有偏差或低级错误，便可能被&quot;全网喷杀&quot;，一棍子打死。何同学、黄磊等公共事件就是典型，小错误被无限放大，演变成全民的集体清算。一旦出现负面舆情，公众人物和创作者无法自证清白，只能被动承受攻击。运动式封杀成为常态。</p><h2 id="舆论场的第二次崩坏：必须说对的话">舆论场的第二次崩坏：必须说对的话<a title="#舆论场的第二次崩坏：必须说对的话" href="#舆论场的第二次崩坏：必须说对的话"></a></h2><p>然后事情变得更糟。从&quot;不能说错话&quot;，演变成了&quot;必须说对话&quot;。</p><p>而且必须说全，否则就是春秋笔法夹带私货。正确不绝对，就等于绝对不正确。</p><p>现在对表达者有一种求全逻辑，表达者必须先亮明立场，先叠甲，把最对的话说出来，然后再去做其他表达，否则就没有资格选取一个自己的角度。这背后的逻辑是，受众对媒体的极度不信任，用一种舆论战的思维而不是和平交流，是一种身份政治。</p><p>内容生产者不敢表达个人观点，只好迎合&quot;正确声音&quot;。游戏、文化作品被要求明显展现&quot;正确态度&quot;，否则就可能被扣上&quot;偏离主流&quot;的帽子。审查变成了自我审查，内容变得极度合规但空洞，缺少真实和深度。</p><p>这种现状会导致：</p><ol><li><p>浪费信息传播效率。内容被审核、过滤，创新和真实表达空间受限。</p></li><li><p>更重要的是产生有罪推定，表达者无法自证，无法证明我没有说过的话我是什么意图。一旦被质疑或批评，几乎无法自证清白，陷入自我证伪的怪圈。</p></li><li><p>真正有意义的稍微可能引发争议的，有探讨价值的问题没有创作者敢碰了，内容领域进一步贫瘠化，劣币驱逐良币。这甚至进一步导致，极端言论服务者转为一种私域的服务者，为极端思想的受众提供精神食粮。</p></li></ol><h2 id="舆论场的第三次崩坏：公共议题的讨论变成一种游乐场、垃圾场">舆论场的第三次崩坏：公共议题的讨论变成一种游乐场、垃圾场<a title="#舆论场的第三次崩坏：公共议题的讨论变成一种游乐场、垃圾场" href="#舆论场的第三次崩坏：公共议题的讨论变成一种游乐场、垃圾场"></a></h2><p>第三次崩坏，就是我们现在看到的这个样子。公共议题的讨论变成一种游乐场、垃圾场。</p><p>户晨风为代表的人登场，进行的是完全标签化的输出，实际上并不代表任何一种真正的价值倾向。真实的问题无人问津。</p><p>讨论被碎片化、标签化后，变成无意义的辩论和&quot;转账&quot;。舆论场变成游乐场，充满战场式的发泄和爆炸式的对立，人人都是&quot;喷子&quot;与&quot;受害者&quot;。极端言论泛滥，真相逐渐被边缘化，取而代之的是情绪的宣泄和价值的对立。网络中的喷战、标签战，充斥着&quot;公知&quot;、“爱国”、&quot;恨国&quot;等标签。</p><p>一些内容创作者反其道而行，将文字游戏、标签化、激烈辩论进行到底，形成空洞的激烈论战。大量所谓&quot;分析&quot;&quot;评论&quot;实际上只是一种标签化游戏，内里空无一物。这使得公众缺乏对真实社会、人物、事件的深刻认知，只剩下宽广的虚空。</p><p>为什么会变成这样？问题出在机制上。</p><h2 id="机制的问题">机制的问题<a title="#机制的问题" href="#机制的问题"></a></h2><p>理想的健康舆论场应该是什么样的？政府、媒体、民众、学者、创作者互动频繁，相互质疑与辩论，形成健全的内容生态。公众在探讨中不断反思自身与社会的关系，形成理性和包容的讨论氛围。各方观点共存，减少偏见，促进认知灰度化。</p><p>但现在的机制完全不是这样。</p><p>过度追求&quot;绝对正确&quot;，封杀异见，使得内容趋于极端单一。争论非基于事实，而是标签和身份，导致&quot;身份确权&quot;成为讨论核心。众多创作者、公众人物选择低调、回避争议，以避免&quot;被黑&quot;或&quot;被攻击&quot;。</p><p>这背后的深层问题是：现代人渴望&quot;力量感&quot;，但缺乏实际认知敏锐度。公众对&quot;真实性&quot;诉求变得扭曲，只在意情绪的操控，而非事实。由虚假繁荣驱动的舆论大战反而掩盖了现实中的矛盾。</p><p>错话不可说，唯有正确话，导致内容荒腔走板。言外之意、潜台词成为攻击焦点，而非实际内容。社会热点、公共议题越发政治化、标签化、碎片化。</p><p>结果就是：公共讨论变得碎片化、极端化，每个人都不敢&quot;碰触&quot;争议话题。真实的社会矛盾被掩盖，虚假繁荣成为新常态。舆论生态的崩坏不仅仅是技术层的问题，更是机制、文化、价值观的深层变异。</p><p>这些机制问题在现实中是怎么体现的？看看最近的案例就知道了。</p><h2 id="现实案例">现实案例<a title="#现实案例" href="#现实案例"></a></h2><p>影视飓风事件就是这种崩坏的典型缩影。加纳电子垃圾事件、相亲角、公众人物等事件，都展现了舆论场的乱象。内容变化随风倒，一开始的正向反馈变成&quot;爱国&quot;或&quot;恨国&quot;的极端争执。从&quot;正能量&quot;到&quot;攻击性内容&quot;，抖音、微博上两极反转，体现舆情的极端和不稳定。</p><p>公众人物的困境更明显。无论是黄磊还是TM，都被标签化和极端化追杀。一次错误或偏差就会被无限放大，成为永远的黑点。自证清白几乎不可能，成为被动挨打的典型。</p><p>网络自媒体也好不到哪里去。以影视飓风为代表，内容被不断极端化、标签化、游戏化。内容空洞化、战场化，变成纯粹的情绪广告。追逐流量、娱乐元素成为唯一目标，价值观被边缘化。</p><p>那么，未来会怎样？</p><h2 id="未来会怎样">未来会怎样<a title="#未来会怎样" href="#未来会怎样"></a></h2><p>以&quot;垃圾场化&quot;为核心趋势已成定局：内容贫瘠，争议泛滥的环境难以逆转。共识缺失、自由被压缩，导致社会认知逐渐扁平化、极端化，形成虚假繁荣。</p><p>以&quot;求全&quot;与&quot;标签化&quot;为导向的机制，最终带来信息垄断、认知贫瘠。公众人物、内容创作者只得自我克制或迎合舆论，难以提供深刻内容。重在&quot;控制&quot;与&quot;标签&quot;，而非&quot;探讨&quot;和&quot;反思&quot;。</p><p>影视飓风事件作为当代互联网舆论场崩坏的缩影，反映出从不能说错话，到必须说对话，再到无底线解构和标签化的漫长恶化过程。当前，我们共同面对的已不再是单纯的内容问题，而是机制、价值观和文化的深层危机。</p><p>只有重建理性、多元、包容的讨论环境，才能缓解垃圾场化的趋势。这需要减少标签化，鼓励多角度、多形态表达，以增强内容的公共性和深度。每个人都应反思自身在垃圾场化中的作用，选择理性表达而非冲动宣泄。</p><p>这场危机，既是警钟，也是反思未来的起点。</p>]]>
    </content>
    <id>https://blog.becase.top/post/2025111801</id>
    <link href="https://blog.becase.top/post/2025111801"/>
    <published>2025-11-18T00:00:00.000Z</published>
    <summary>
      <![CDATA[<p>现在在各种各样的争议事件中，身份和姿态是最重要的——影响现在的舆论场好恶判断的东西。</p>
<p>哪怕你的内核没有太大的问题，只要你的身份、姿态是高高在上的，那么你一定是遭殃的。这个时代最讨巧的人设是真小人，把一些东西摆在明面上，比如我说我就是一个唯利是图的不顾一切赚钱的]]>
    </summary>
    <title>舆论环境的垃圾化</title>
    <updated>2026-08-04T09:27:28.568Z</updated>
  </entry>
  <entry>
    <author>
      <name>jiechen</name>
    </author>
    <category term="tech" scheme="https://blog.becase.top/categories/tech/"/>
    <category term="front-end" scheme="https://blog.becase.top/categories/tech/front-end/"/>
    <category term="engineering" scheme="https://blog.becase.top/tags/engineering/"/>
    <category term="tooling" scheme="https://blog.becase.top/tags/tooling/"/>
    <content>
      <![CDATA[<p>在 X 平台看到关于 Electron 和 Tauri 的争论，建议大家在做技术选型前，先了解以下基础事实：</p><h3 id="1.-两者的核心实现逻辑">1. 两者的核心实现逻辑<a title="#1.-两者的核心实现逻辑" href="#1.-两者的核心实现逻辑"></a></h3><ul><li><strong>Electron</strong>：本质是将应用（HTML/JS/CSS）与一个<strong>完整的 Chrome 运行时</strong>打包成自定义发行版。<ul><li>优势：稳定、可控。</li><li>劣势：体积臃肿、资源占用高。</li></ul></li><li><strong>Tauri</strong>：让应用复用操作系统<strong>自带的 WebView</strong>（如 WebKit、WebView2），不单独打包浏览器。<ul><li>优势：极大减小应用体积。</li><li>劣势：需面对不同平台 WebView 的 bug 与兼容性差异。</li></ul></li></ul><h3 id="2.-本质是两种不同的工程哲学">2. 本质是两种不同的工程哲学<a title="#2.-本质是两种不同的工程哲学" href="#2.-本质是两种不同的工程哲学"></a></h3><div class="φbq"><div class="φbs"><table><thead><tr><th>框架</th><th>核心挑战</th><th>工程重心</th></tr></thead><tbody><tr><td>Tauri</td><td>“系统集成”的兼容性问题</td><td>debug 系统</td></tr><tr><td>Electron</td><td>“自带浏览器”的资源妥协</td><td>打包系统</td></tr></tbody></table></div></div><h3 id="3.-选型的关键：明确需求导向">3. 选型的关键：明确需求导向<a title="#3.-选型的关键：明确需求导向" href="#3.-选型的关键：明确需求导向"></a></h3><ul><li>喷 Tauri bug 多，本质是在喷“跨平台本地集成”这件事本身的技术难度。</li><li>选择哪个框架，核心是判断需求：<ol><li>需要“完美的封闭盒子”（稳定、无需操心环境）→ 选 Electron。</li><li>需要“自由但需解决兼容问题的原生集成”（轻量、省资源）→ 选 Tauri。</li></ol></li></ul><h3 id="4.-现状：没有绝对完美的第三种选择">4. 现状：没有绝对完美的第三种选择<a title="#4.-现状：没有绝对完美的第三种选择" href="#4.-现状：没有绝对完美的第三种选择"></a></h3><p>如果需要在 App 内提供网页渲染层，目前只有两种路径：</p><ul><li>要么“重”（Electron，自带浏览器）。</li><li>要么“坑”（Tauri，需处理系统 WebView 差异）。</li></ul><p>暂时不存在更好的第三种选择，除非浏览器厂商开放一个<strong>统一、轻量、稳定的嵌入式 Web API</strong>，而目前该条件尚未满足。</p>]]>
    </content>
    <id>https://blog.becase.top/post/2025102001</id>
    <link href="https://blog.becase.top/post/2025102001"/>
    <published>2025-10-20T10:13:54.000Z</published>
    <summary>
      <![CDATA[<p>在 X 平台看到关于 Electron 和 Tauri 的争论，建议大家在做技术选型前，先了解以下基础事实：</p>
<h3 id="1.-两者的核心实现逻辑">1. 两者的核心实现逻辑<a title="#1.-两者的核心实现逻辑" href="#1.-两者的核心实现逻辑]]>
    </summary>
    <title>Electron 与 Tauri 技术选型</title>
    <updated>2026-08-04T09:27:28.572Z</updated>
  </entry>
  <entry>
    <author>
      <name>jiechen</name>
    </author>
    <category term="tech" scheme="https://blog.becase.top/categories/tech/"/>
    <category term="front-end" scheme="https://blog.becase.top/categories/tech/front-end/"/>
    <category term="security" scheme="https://blog.becase.top/tags/security/"/>
    <category term="front-end" scheme="https://blog.becase.top/tags/front-end/"/>
    <content>
      <![CDATA[<div class="reprinted-notice" style="  background: #f8f9fa;  border-left: 4px solid #333;  padding: 12px 16px;  margin: 16px 0;  border-radius: 4px;  font-size: 14px;  color: #495057;  line-height: 1.6;">  <strong>📋 声明</strong> - 本文为转载文章<br><a href="https://github.com/bodadotsh/npm-security-best-practices" target="_blank" rel="noopener noreferrer" class="reprinted-link">🔗 原文链接：https://github.com/bodadotsh/npm-security-best-practices</a></div><p>在现代 JavaScript 开发中，NPM 生态系统为我们提供了丰富的包资源，但同时也带来了安全风险，包括但不限于：数据入侵、供应链攻击、恶意软件、垃圾邮件、网络钓鱼等</p><p>本文将介绍一系列 NPM 包安全最佳实践，帮助开发者保护项目免受供应链攻击、恶意软件和其他安全威胁。</p><h2 id="📦-开发者安全实践">📦 开发者安全实践<a title="#📦-开发者安全实践" href="#📦-开发者安全实践"></a></h2><h3 id="1.-锁定依赖版本">1. 锁定依赖版本<a title="#1.-锁定依赖版本" href="#1.-锁定依赖版本"></a></h3><p>在 <code>npm</code> 上，默认情况下，新依赖项将使用插入符号 <code>^</code> 操作符安装。此操作符安装最新的 <code>次要</code> 或 <code>补丁</code> 版本。例如，<code>^1.2.3</code> 将安装 <code>1.2.3</code>、<code>1.6.2</code> 等。</p><p><strong>在各种包管理器中锁定精确版本的方法</strong>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">npm install --save-exact react</span><br><span class="line">pnpm add --save-exact react</span><br><span class="line">yarn add --save-exact react</span><br><span class="line">bun add --exact react</span><br></pre></td></tr></table></figure><p>我们也可以在配置文件中更新此设置（例如，<a href="https://github.com/bodadotsh/npm-security-best-practices/blob/main/.npmrc" target="_blank">.npmrc</a>），使用 <a href="https://docs.npmjs.com/cli/v11/using-npm/config#save-exact" target="_blank">save-exact</a> 或 <a href="https://docs.npmjs.com/cli/v11/using-npm/config#save-prefix" target="_blank">save-prefix</a> 键值对：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">npm config <span class="built_in">set</span> save-exact=<span class="literal">true</span></span><br><span class="line">pnpm config <span class="built_in">set</span> save-exact <span class="literal">true</span></span><br><span class="line">yarn config <span class="built_in">set</span> defaultSemverRangePrefix <span class="string">&quot;&quot;</span></span><br></pre></td></tr></table></figure><p>对于 <code>bun</code>，配置文件是 <code>bunfig.toml</code>，相应的配置是：</p><figure class="highlight toml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[install]</span></span><br><span class="line"><span class="attr">exact</span> = <span class="literal">true</span></span><br></pre></td></tr></table></figure><h4 id="覆盖传递依赖">覆盖传递依赖<a title="#覆盖传递依赖" href="#覆盖传递依赖"></a></h4><p><strong>然而</strong>，我们的直接依赖也有它们自己的依赖（<em>传递</em>依赖）。即使我们锁定了直接依赖，它们的传递依赖可能仍使用宽泛版本范围操作符（如 <code>^</code> 或 <code>~</code>）。解决方案是覆盖传递依赖：<a href="https://docs.npmjs.com/cli/v11/configuring-npm/package-json#overrides" target="_blank">https://docs.npmjs.com/cli/v11/configuring-npm/package-json#overrides</a></p><p>在 <code>package.json</code> 中，如果我们有以下 <code>overrides</code> 字段：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;dependencies&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;library-a&quot;</span><span class="punctuation">:</span> <span class="string">&quot;^3.0.0&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;overrides&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;lodash&quot;</span><span class="punctuation">:</span> <span class="string">&quot;4.17.21&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><ul><li>假设 <code>library-a</code> 的 <code>package.json</code> 依赖于 <code>&quot;lodash&quot;: &quot;^4.17.0&quot;</code></li><li>没有 <code>overrides</code> 部分，<code>npm</code> 可能会安装 <code>lodash@4.17.22</code>（或任何最新的 <code>4.x.x</code> 版本）作为 <code>library-a</code> 的传递依赖</li><li>但是，通过添加 <code>&quot;overrides&quot;: { &quot;lodash&quot;: &quot;4.17.21&quot; }</code>，我们告诉 <code>npm</code>，在依赖树中的任何地方出现 <code>lodash</code>，都必须解析为精确版本 <code>4.17.21</code></li></ul><p>对于 <code>pnpm</code>，我们也可以在 <code>pnpm-workspace.yaml</code> 文件中定义 <code>overrides</code> 字段：<a href="https://pnpm.io/settings#overrides" target="_blank">https://pnpm.io/settings#overrides</a></p><p>对于 <code>yarn</code>，<code>resolutions</code> 字段在 <code>overrides</code> 字段之前引入，它也提供类似功能：<a href="https://yarnpkg.com/configuration/manifest#resolutions" target="_blank">https://yarnpkg.com/configuration/manifest#resolutions</a></p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;resolutions&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;lodash&quot;</span><span class="punctuation">:</span> <span class="string">&quot;4.17.21&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># yarn 也提供 cli 来设置解析：https://yarnpkg.com/cli/set/resolution</span></span><br><span class="line">yarn <span class="built_in">set</span> resolution &lt;descriptor&gt; &lt;resolution&gt;</span><br></pre></td></tr></table></figure><p>对于 <code>bun</code>，它支持 <code>overrides</code> 字段或 <code>resolutions</code> 字段：<a href="https://bun.com/docs/install/overrides" target="_blank">https://bun.com/docs/install/overrides</a></p><h3 id="2.-包含锁文件">2. 包含锁文件<a title="#2.-包含锁文件" href="#2.-包含锁文件"></a></h3><p>确保将包管理器锁文件提交到 <code>git</code> 并在不同环境之间共享。不同的锁文件是：<code>package-lock.json</code> 用于 <code>npm</code>，<code>pnpm-lock.yaml</code> 用于 <code>pnpm</code>，<code>bun.lock</code> 用于 <code>bun</code>，<code>yarn.lock</code> 用于 <code>yarn</code>。</p><p>在自动化环境（如持续集成和部署）中，我们应该安装锁文件中定义的精确依赖：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">npm ci</span><br><span class="line">bun install --frozen-lockfile</span><br><span class="line">yarn install --frozen-lockfile</span><br></pre></td></tr></table></figure><blockquote><p>💡 <strong>提示</strong>：当处理锁文件中的合并冲突时，<em>不</em>需要删除锁文件。当依赖项（包括传递依赖）使用版本范围操作符（<code>^</code>、<code>~</code> 等）定义时，从头开始重建锁文件可能导致意外更新。</p><p>现代包管理器有内置的冲突解决机制，只需切换到主分支并重新运行安装。<code>pnpm</code> 还允许 <a href="https://pnpm.io/git#merge-conflicts" target="_blank">Git 分支锁文件</a>，它根据分支名称创建新的锁文件，稍后自动合并回主锁文件。</p></blockquote><h3 id="3.-禁用生命周期脚本">3. 禁用生命周期脚本<a title="#3.-禁用生命周期脚本" href="#3.-禁用生命周期脚本"></a></h3><p>生命周期脚本是在 <code>pre&lt;event&gt;</code>、<code>post&lt;event&gt;</code> 和 <code>&lt;event&gt;</code> 脚本之外发生的特殊脚本。例如，<code>preinstall</code> 在 <code>install</code> 运行之前运行，<code>postinstall</code> 在 <code>install</code> 运行之后运行。</p><p>生命周期脚本是恶意行为者的常见策略。例如，“Shai-Hulud” 蠕虫编辑 <code>package.json</code> 文件以添加 <code>postinstall</code> 脚本，然后窃取凭据。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm config <span class="built_in">set</span> ignore-scripts <span class="literal">true</span> --global</span><br><span class="line">yarn config <span class="built_in">set</span> enableScripts <span class="literal">false</span></span><br></pre></td></tr></table></figure><p>对于 <code>bun</code> 和 <code>pnpm</code>，它们默认禁用。</p><blockquote><p>⚠️ <strong>注意</strong>：对于 <code>bun</code>，默认允许前 500 个 npm 包的生命周期脚本。</p></blockquote><blockquote><p>💡 <strong>提示</strong>：我们可以结合上面的许多标志。例如，以下 <code>npm</code> 命令将只安装锁文件中定义的生产依赖项并忽略生命周期脚本：<br><code>npm ci --omit=dev --ignore-scripts</code></p></blockquote><h3 id="4.-设置最小发布年龄">4. 设置最小发布年龄<a title="#4.-设置最小发布年龄" href="#4.-设置最小发布年龄"></a></h3><p>我们可以设置延迟以避免安装新发布的包。这适用于所有依赖项，包括传递依赖。例如，<code>pnpm v10.16</code> 引入了 <code>minimumReleaseAge</code> 选项：<a href="https://pnpm.io/settings#minimumreleaseage" target="_blank">https://pnpm.io/settings#minimumreleaseage</a>，它定义了版本发布后必须经过的最小分钟数，pnpm 才会安装它。如果 <code>minimumReleaseAge</code> 设置为 <code>1440</code>，那么 pnpm 不会安装发布不到 24 小时的版本。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">pnpm config <span class="built_in">set</span> minimumReleaseAge &lt;minutes&gt;</span><br><span class="line"><span class="comment"># 只安装至少 1 天前发布的包</span></span><br><span class="line">npm install --before=<span class="string">&quot;<span class="subst">$(date -v -1d)</span>&quot;</span>                               <span class="comment"># 对于 Mac 或 BSD 用户</span></span><br><span class="line">npm install --before=<span class="string">&quot;<span class="subst">$(date -d &#x27;1 days ago&#x27; +%Y-%m-%dT%H:%M:%S%z)</span>&quot;</span> <span class="comment"># 对于 Linux 用户</span></span><br><span class="line">yarn config <span class="built_in">set</span> npmMinimalAgeGate &lt;minutes&gt;</span><br></pre></td></tr></table></figure><p>对于 <code>pnpm</code>，还有一个 <code>minimumReleaseAgeExclude</code> 选项来排除某些包的最小发布年龄。</p><p>对于 <code>npm</code>，有 <a href="https://github.com/npm/statusboard/issues/597" target="_blank">一个提案</a> 添加 <code>minimumReleaseAge</code> 选项和 <code>minimumReleaseAgeExclude</code> 选项。</p><p>对于 <code>yarn</code>，配置选项 <code>npmMinimalAgeGate</code> 和 <code>npmPreapprovedPackages</code> 自 <a href="https://github.com/yarnpkg/berry/pull/6298" target="_blank">v4.10.0</a> 起实现。</p><p>对于 <code>bun</code>，这里讨论：<a href="https://github.com/oven-sh/bun/issues/22679" target="_blank">oven-sh/bun#22679</a></p><p>提供类似功能的其他工具示例：</p><ul><li>npm-check-updates (<a href="https://github.com/raineorshine/npm-check-updates" target="_blank">https://github.com/raineorshine/npm-check-updates</a>) 有 <code>--cooldown</code> 标志。</li><li>Renovate CLI (<a href="https://github.com/renovatebot/renovate" target="_blank">https://github.com/renovatebot/renovate</a>) 有 <a href="https://github.com/renovatebot/renovate/blob/main/docs/configuration-options.md#minimumreleaseage" target="_blank">minimumReleaseAge</a> 配置选项。</li><li>Step Security (<a href="https://www.stepsecurity.io" target="_blank">https://www.stepsecurity.io</a>) 有 <a href="https://github.com/step-security/harden-runner/blob/main/docs/npm-package-cooldown-check.md" target="_blank">NPM Package Cooldown Check</a> 功能。</li></ul><h3 id="5.-权限模型">5. 权限模型<a title="#5.-权限模型" href="#5.-权限模型"></a></h3><p>在最新的 <code>nodejs</code> LTS 版本中，我们可以使用权限模型来控制进程可以访问哪些系统资源或进程可以对这些资源采取哪些操作。<strong>然而</strong>，这在存在恶意代码的情况下不提供安全保证。恶意代码仍然可以绕过权限模型并在没有权限模型施加的限制的情况下执行任意代码。</p><p>阅读关于 Node.js 权限模型：<a href="https://nodejs.org/docs/latest/api/permissions.html" target="_blank">https://nodejs.org/docs/latest/api/permissions.html</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 默认情况下，授予完全访问权限</span></span><br><span class="line">node index.js</span><br><span class="line"><span class="comment"># 限制对所有可用权限的访问</span></span><br><span class="line">node --permission index.js</span><br><span class="line"><span class="comment"># 启用特定权限</span></span><br><span class="line">node --permission --allow-fs-read=* --allow-fs-write=* index.js</span><br><span class="line"><span class="comment"># 将权限模型与 `npx` 一起使用</span></span><br><span class="line">npx --node-options=<span class="string">&quot;--permission&quot;</span> &lt;package-name&gt;</span><br></pre></td></tr></table></figure><p>对于 Bun，权限模型目前正在 <a href="https://github.com/oven-sh/bun/issues/22679" target="_blank">这里</a> 和 <a href="https://github.com/oven-sh/bun/issues/22679" target="_blank">这里</a> 讨论。</p><h3 id="6.-减少外部依赖">6. 减少外部依赖<a title="#6.-减少外部依赖" href="#6.-减少外部依赖"></a></h3><p>因为 <code>npm</code> 发布包的门槛很低，生态系统迅速增长成为最大的包注册表，至今有超过 500 万个包。但并非所有包都是平等的。有一些小型实用程序包，当我们自己可以编写它们时却被下载为依赖项，这引发了&quot;我们是否忘记了如何编码？&quot;的问题</p><p>在 <code>nodejs</code> 和 <code>bun</code> 之间，开发者可以使用它们的许多现代功能，而不是依赖第三方库。原生模块可能不会提供相同级别的功能，但应尽可能考虑它们。这里有几个例子：</p><div class="φbq"><div class="φbs"><table><thead><tr><th>NPM 库</th><th>内置模块</th></tr></thead><tbody><tr><td><code>axios</code>, <code>node-fetch</code>, <code>got</code>, 等</td><td>原生 <code>fetch</code> API</td></tr><tr><td><code>jest</code>, <code>mocha</code>, <code>ava</code>, 等</td><td><code>node:test</code>, <code>node:assert</code>, <code>bun test</code></td></tr><tr><td><code>nodemon</code>, <code>chokidar</code>, 等</td><td><code>node --watch</code>, <code>bun --watch</code></td></tr><tr><td><code>dotenv</code>, <code>dotenv-expand</code>, 等</td><td><code>node --env-file</code>, <code>bun --env-file</code></td></tr><tr><td><code>typescript</code>, <code>ts-node</code>, 等</td><td><code>node --experimental-strip-types</code>, <code>bun</code> 原生支持</td></tr><tr><td><code>esbuild</code>, <code>rollup</code>, 等</td><td><code>bun build</code></td></tr><tr><td><code>prettier</code>, <code>eslint</code>, 等</td><td><code>bun fmt</code>, <code>bun lint</code></td></tr></tbody></table></div></div><p>这里有一些您可能会觉得有用的资源：</p><ul><li><a href="https://obsidian.md/blog/less-is-safer" target="_blank">https://obsidian.md/blog/less-is-safer</a></li><li><a href="https://kashw1n.com/blog/nodejs-2025" target="_blank">https://kashw1n.com/blog/nodejs-2025</a></li><li><a href="https://lyra.horse/blog/2025/08/you-dont-need-js" target="_blank">https://lyra.horse/blog/2025/08/you-dont-need-js</a></li><li><a href="https://blog.greenroots.info/10-lesser-known-web-apis-you-may-want-to-use" target="_blank">https://blog.greenroots.info/10-lesser-known-web-apis-you-may-want-to-use</a></li><li><a href="https://github.com/you-dont-need/You-Dont-Need-Momentjs" target="_blank">https://github.com/you-dont-need/You-Dont-Need-Momentjs</a></li><li>可视化 NPM 依赖：<a href="https://npmgraph.js.org" target="_blank">https://npmgraph.js.org</a></li><li>Knip（移除未使用的依赖）：<a href="https://github.com/webpro-nl/knip" target="_blank">https://github.com/webpro-nl/knip</a></li></ul><h2 id="🔧-维护者安全实践">🔧 维护者安全实践<a title="#🔧-维护者安全实践" href="#🔧-维护者安全实践"></a></h2><h3 id="7.-启用-2fa">7. 启用 2FA<a title="#7.-启用-2fa" href="#7.-启用-2fa"></a></h3><p><a href="https://docs.npmjs.com/about-two-factor-authentication" target="_blank">https://docs.npmjs.com/about-two-factor-authentication</a></p><p>双因素认证 (2FA) 为您的 <code>npm</code> 账户添加了额外的认证层。2FA 默认不是必需的，但启用它是一个好习惯。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 确保 2FA 已启用用于认证和写入（这是默认设置）</span></span><br><span class="line">npm profile enable-2fa auth-and-writes</span><br></pre></td></tr></table></figure><div class="φbq"><div class="φbs"><table><thead><tr><th>自动化级别</th><th>包发布访问</th></tr></thead><tbody><tr><td>手动</td><td>将每个包访问设置为 <code>需要 2FA</code> 和 <code>禁用令牌</code></td></tr><tr><td>自动</td><td>将每个包访问设置为 <code>需要双因素认证</code> 或 <code>单因素自动化令牌</code> 或 <code>单因素 granular 访问令牌</code></td></tr></tbody></table></div></div><blockquote><p>⚠️ <strong>重要</strong>：建议配置支持 <a href="https://github.com/blog/security/supply-chain-security/our-plan-for-a-more-secure-npm-supply-chain" target="_blank">WebAuthn</a> 的安全密钥，而不是基于时间的一次性密码 (TOTP)</p></blockquote><h3 id="8.-创建有限访问令牌">8. 创建有限访问令牌<a title="#8.-创建有限访问令牌" href="#8.-创建有限访问令牌"></a></h3><p><a href="https://docs.npmjs.com/about-access-tokens#about-granular-access-tokens" target="_blank">https://docs.npmjs.com/about-access-tokens#about-granular-access-tokens</a></p><p>访问令牌是使用 API 或 <code>npm</code> CLI 时向 <code>npm</code> 进行身份验证的常见方式。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">npm token create <span class="comment"># 用于读取和发布令牌</span></span><br><span class="line">npm token create --read-only <span class="comment"># 用于只读令牌</span></span><br><span class="line">npm token create --cidr=[list] <span class="comment"># 用于 CIDR 限制的读取和发布令牌</span></span><br><span class="line">npm token create --read-only --cidr=[list] <span class="comment"># 用于 CIDR 限制的只读令牌</span></span><br></pre></td></tr></table></figure><blockquote><p>⚠️ <strong>重要</strong>：应使用 Granular Access Tokens 而不是 Legacy Tokens。Legacy tokens 无法限定范围且不会自动过期。使用它们被认为是危险的。</p></blockquote><ul><li>限制令牌到特定包、范围和组织</li><li>设置令牌过期日期（例如，每年）</li><li>基于 IP 地址范围限制令牌访问（CIDR 表示法）</li><li>在只读或读写访问之间选择</li><li>不要对多个用途使用相同令牌</li><li>使用描述性令牌名称</li></ul><h3 id="9.-生成来源声明">9. 生成来源声明<a title="#9.-生成来源声明" href="#9.-生成来源声明"></a></h3><p><a href="https://docs.npmjs.com/generating-provenance-statements" target="_blank">https://docs.npmjs.com/generating-provenance-statements</a></p><p><em>来源证明</em>通过公开提供包源代码和构建环境的链接来建立。这允许开发者在下载之前验证包的构建位置和方式。</p><p><em>发布证明</em>由注册表在授权用户发布包时生成。当 npm 包与来源一起发布时，它由 Sigstore 公共服务器签名并记录在公共透明账本中，用户可以在其中查看此信息。</p><p>例如，这是 <code>vue</code> 包页面上的来源声明看起来像的样子：<a href="https://www.npmjs.com/package/vue#provenance" target="_blank">https://www.npmjs.com/package/vue#provenance</a></p><p>要建立来源，使用支持的 CI/CD 提供商（例如，GitHub Actions）并使用正确的标志发布：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm publish --provenance</span><br></pre></td></tr></table></figure><p>要在不调用 <code>npm publish</code> 命令的情况下发布，我们可以执行以下操作之一：</p><ul><li>在 CI/CD 环境中设置 <code>NPM_CONFIG_PROVENANCE</code> 为 <code>true</code></li><li>将 <code>provenance=true</code> 添加到 <code>.npmrc</code> 文件</li><li>将 <code>publishConfig</code> 块添加到 <code>package.json</code></li></ul><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;publishConfig&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;provenance&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><blockquote><p>对于那些对 <a href="https://reproducible-builds.org/" target="_blank">可重现构建</a> 感兴趣的人，请查看 OSS Rebuild (<a href="https://github.com/google/oss-rebuild" target="_blank">https://github.com/google/oss-rebuild</a>) 和软件工件供应链级别 (SLSA) 框架 (<a href="https://slsa.dev" target="_blank">https://slsa.dev</a>)。</p></blockquote><h4 id="受信任发布">受信任发布<a title="#受信任发布" href="#受信任发布"></a></h4><p>当使用 OpenID Connect (OIDC) 身份验证时，可以<em>无需</em> npm 令牌发布包，并获得<em>自动</em>来源。这称为<strong>受信任发布</strong>，请在此处阅读 GitHub 公告：<a href="https://github.blog/changelog/2025-07-31-npm-trusted-publishing-with-oidc-is-generally-available/" target="_blank">https://github.blog/changelog/2025-07-31-npm-trusted-publishing-with-oidc-is-generally-available/</a> 和 <a href="https://docs.npmjs.com/trusted-publishers" target="_blank">https://docs.npmjs.com/trusted-publishers</a></p><blockquote><p>⚠️ <strong>重要</strong>：建议使用受信任发布代替令牌。</p></blockquote><p>相关工具：</p><ul><li><a href="https://github.com/antfu/open-packages-on-npm" target="_blank">https://github.com/antfu/open-packages-on-npm</a> (CLI 为 monorepo 包设置受信任发布者)</li><li><a href="https://github.com/sxzz/userscripts/blob/main/src/npm-trusted-publisher.md" target="_blank">https://github.com/sxzz/userscripts/blob/main/src/npm-trusted-publisher.md</a> (Userscript 在 <a href="http://npmjs.com">npmjs.com</a> 上填写受信任发布者的表单)</li></ul><h3 id="10.-审查发布文件">10. 审查发布文件<a title="#10.-审查发布文件" href="#10.-审查发布文件"></a></h3><p>限制 npm 包中的文件有助于通过减少攻击面来防止恶意软件，并避免意外泄露敏感数据。</p><p><code>package.json</code> 中的 <code>files</code> 字段用于指定应包含在发布包中的文件。某些文件总是包含在内，请参阅：<a href="https://docs.npmjs.com/cli/v11/configuring-npm/package-json#files" target="_blank">https://docs.npmjs.com/cli/v11/configuring-npm/package-json#files</a> 了解更多详细信息。</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;name&quot;</span><span class="punctuation">:</span> <span class="string">&quot;my-package&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;version&quot;</span><span class="punctuation">:</span> <span class="string">&quot;1.0.0&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;main&quot;</span><span class="punctuation">:</span> <span class="string">&quot;dist/index.js&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;files&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">&quot;dist&quot;</span><span class="punctuation">,</span> <span class="string">&quot;LICENSE&quot;</span><span class="punctuation">,</span> <span class="string">&quot;README.md&quot;</span><span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><blockquote><p>💡 <strong>提示</strong>：<code>.npmignore</code> 文件也可用于从发布包中排除文件。它不会覆盖 <code>&quot;files&quot;</code> 字段，但在子目录中会。</p><p><code>.npmignore</code> 文件就像 <code>.gitignore</code> 一样工作。如果有 <code>.gitignore</code> 文件，而 <code>.npmignore</code> 缺失，则将使用 <code>.gitignore</code> 的内容。</p></blockquote><p>运行 <code>npm pack --dry-run</code> 或 <code>npm publish --dry-run</code> 查看运行 pack 或 publish 命令时会发生什么。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">&gt; npm pack --dry-run</span><br><span class="line">npm notice Tarball Contents</span><br><span class="line">npm notice 1.1kB LICENSE</span><br><span class="line">npm notice 1.9kB README.md</span><br><span class="line">npm notice 108B index.js</span><br><span class="line">npm notice 700B package.json</span><br><span class="line">npm notice Tarball Details</span><br></pre></td></tr></table></figure><h2 id="🛡️-高级安全策略">🛡️ 高级安全策略<a title="#🛡️-高级安全策略" href="#🛡️-高级安全策略"></a></h2><h3 id="11.-npm-组织">11. NPM 组织<a title="#11.-npm-组织" href="#11.-npm-组织"></a></h3><p><a href="https://docs.npmjs.com/organizations" target="_blank">https://docs.npmjs.com/organizations</a></p><p>在组织级别，最佳实践是：</p><ul><li>在组织级别启用 <code>需要 2FA</code></li><li>最小化 <code>npm</code> 组织成员数量</li><li>如果同一组织中有多个包团队，将所有包的 <code>开发人员</code> 团队权限设置为 <code>读取</code></li><li>创建单独的团队来管理每个包的权限</li></ul><h3 id="12.-替代注册表">12. 替代注册表<a title="#12.-替代注册表" href="#12.-替代注册表"></a></h3><h4 id="jsr">JSR<a title="#jsr" href="#jsr"></a></h4><p>JSR 是一个现代 JavaScript/TypeScript 包注册表，与 npm 向后兼容。</p><blockquote><p>⚠️ <strong>注意</strong>：并非所有 npm 包都在 JSR 上！</p></blockquote><p>访问 <a href="https://jsr.io" target="_blank">https://jsr.io</a> 查看包是否可用并阅读 <a href="https://jsr.io/docs/npm" target="_blank">npm 限制</a> 文档。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">deno add jsr:&lt;package-name&gt;</span><br><span class="line">pnpm add jsr:&lt;package-name&gt; <span class="comment"># pnpm 10.9+</span></span><br><span class="line">yarn add jsr:&lt;package-name&gt; <span class="comment"># yarn 4.9+</span></span><br><span class="line"><span class="comment"># npm, bun 和旧版本 yarn 或 pnpm</span></span><br><span class="line">npx jsr add &lt;package-name&gt; <span class="comment"># 将 npx 替换为 yarn dlx, pnpm dlx 或 bunx</span></span><br></pre></td></tr></table></figure><h4 id="私有注册表">私有注册表<a title="#私有注册表" href="#私有注册表"></a></h4><p>私有包注册表是组织管理自己依赖项的好方法，作为公共 <code>npm</code> 注册表的代理，并在项目中使用之前强制执行安全策略。</p><p>这里有一些您可能会觉得有用的私有注册表：</p><ul><li>GitHub Packages <a href="https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry" target="_blank">https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry</a></li><li>Verdaccio <a href="https://github.com/verdaccio/verdaccio" target="_blank">https://github.com/verdaccio/verdaccio</a><ul><li>参见 Verdaccio 最佳实践：<a href="https://verdaccio.org/docs/best/" target="_blank">https://verdaccio.org/docs/best/</a></li></ul></li><li>Vlt <a href="https://www.vlt.sh/" target="_blank">https://www.vlt.sh/</a><ul><li><a href="https://vlt.sh/blog/introducing-vlt-serverless-registry" target="_blank">vlt 的 Serverless Registry</a> (VSR) 可以在几分钟内部署到 Cloudflare Workers。</li></ul></li><li>JFrog Artifactory <a href="https://jfrog.com/integrations/npm-registry" target="_blank">https://jfrog.com/integrations/npm-registry</a></li><li>Sonatype: <a href="https://help.sonatype.com/en/npm-registry.html" target="_blank">https://help.sonatype.com/en/npm-registry.html</a></li></ul><h3 id="13.-审计、监控和安全工具">13. 审计、监控和安全工具<a title="#13.-审计、监控和安全工具" href="#13.-审计、监控和安全工具"></a></h3><h4 id="审计">审计<a title="#审计" href="#审计"></a></h4><p>许多包管理器提供审计功能来扫描项目依赖项中的已知安全漏洞，显示报告并推荐修复它们的最佳方法。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">npm audit <span class="comment"># 审计依赖项</span></span><br><span class="line">npm audit fix <span class="comment"># 自动安装任何兼容的更新</span></span><br><span class="line">npm audit signatures <span class="comment"># 验证依赖项的签名</span></span><br><span class="line">pnpm audit</span><br><span class="line">pnpm audit --fix</span><br><span class="line">bun audit</span><br><span class="line">yarn npm audit</span><br><span class="line">yarn npm audit --recursive <span class="comment"># 审计传递依赖项</span></span><br></pre></td></tr></table></figure><h4 id="github">GitHub<a title="#github" href="#github"></a></h4><p><a href="https://github.com/security" target="_blank">https://github.com/security</a></p><p>GitHub 提供几种可以帮助保护免受 <code>npm</code> 恶意软件侵害的服务，包括：</p><ul><li><a href="https://docs.github.com/en/code-security/dependabot/dependabot-security-updates/about-dependabot-security-updates" target="_blank">Dependabot</a>：此工具自动扫描项目依赖项（包括 <code>npm</code> 包）的已知漏洞。</li><li><a href="https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/about-the-software-bill-of-materials" target="_blank">软件物料清单 (SBOMs)</a>：GitHub 允许您直接从其依赖图导出存储库的 SBOM。SBOM 提供项目所有依赖项的全面列表，包括传递依赖项（依赖项的依赖项）。</li><li><a href="https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/about-code-scanning" target="_blank">代码扫描</a>：代码扫描也可以帮助识别潜在漏洞或可疑模式，这些可能来自集成受损的 <code>npm</code> 包。</li></ul><blockquote><p>⚠️ <strong>警告</strong>：如果您在 NPM 或 GitHub 中发现漏洞或问题，请使用以下链接报告：</p><ul><li><a href="https://docs.npmjs.com/reporting-malware-in-an-npm-package" target="_blank">https://docs.npmjs.com/reporting-malware-in-an-npm-package</a></li><li><a href="https://docs.github.com/en/communities/maintaining-your-safety-on-github/reporting-abuse-or-spam#reporting-a-repository" target="_blank">https://docs.github.com/en/communities/maintaining-your-safety-on-github/reporting-abuse-or-spam#reporting-a-repository</a></li></ul></blockquote><h4 id="openssf-scorecard">OpenSSF Scorecard<a title="#openssf-scorecard" href="#openssf-scorecard"></a></h4><p><a href="https://securityscorecards.dev" target="_blank">https://securityscorecards.dev</a> 和 <a href="https://github.com/ossf/scorecard" target="_blank">https://github.com/ossf/scorecard</a></p><p>免费开源自动化工具，评估与软件安全相关的重要启发式方法（“检查”），并为每个检查分配 0-10 分的分数。本仓库中提到的几个风险作为检查的一部分包含在内：固定依赖项、令牌权限、打包、签名发布等…</p><p>运行检查：</p><ol><li>在您拥有的代码上自动使用 <a href="https://github.com/marketplace/actions/oss-scorecard-action" target="_blank">GitHub Action</a></li><li>通过 <a href="https://github.com/ossf/scorecard/blob/main/docs/checks.md#command-line" target="_blank">命令行</a> 手动在您的（或别人的）项目上</li></ol><h4 id="socket.dev">Socket.dev<a title="#socket.dev" href="#socket.dev"></a></h4><p><a href="https://socket.dev" target="_blank">https://socket.dev</a></p><p>Socket.dev 是一个安全平台，保护代码免受漏洞和恶意依赖项的侵害。它提供各种工具，如 <a href="https://socket.dev/github" target="_blank">GitHub App</a> 扫描拉取请求、<a href="https://socket.dev/cli" target="_blank">CLI 工具</a>、<a href="https://socket.dev/browser-extension" target="_blank">web 扩展</a>、<a href="https://socket.dev/vscode" target="_blank">VSCode 扩展</a> 等。这是他们关于 <a href="https://socket.dev/blog/ai-powered-malware-hunting-at-scale" target="_blank">2025 年 1 月大规模 AI 驱动恶意软件狩猎</a> 的演讲。</p><p><a href="https://socket.dev/blog/introducing-the-socket-firewall" target="_blank">Socket Firewall</a> 是在安装时阻止恶意包的免费工具：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">npm i -g sfw</span><br><span class="line"><span class="comment"># 适用于 `npm`, `yarn`, `pnpm`</span></span><br><span class="line">sfw npm install &lt;package-name&gt;</span><br><span class="line"><span class="comment"># 示例：在 zsh 中将 `npm` 别名为 `sfw npm`</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;alias npm=&#x27;sfw npm&#x27;&quot;</span> &gt;&gt; ~/.zshrc</span><br></pre></td></tr></table></figure><h4 id="snyk">Snyk<a title="#snyk" href="#snyk"></a></h4><p><a href="https://snyk.io" target="_blank">https://snyk.io</a></p><p>Snyk 提供一套工具来修复开源依赖项中的漏洞，包括 CLI 在本地计算机上运行漏洞扫描、IDE 集成嵌入开发环境以及 API 以编程方式与 Snyk 集成。例如，您可以 <a href="https://snyk.io/vuln/npm:axios" target="_blank">在使用前测试公共 npm 包</a> 或 <a href="https://snyk.io/blog/open-source-and-dependency-management-at-scale-with-snyk-and-github-dependabot/" target="_blank">为已知漏洞创建自动 PR</a>。</p><h3 id="14.-支持-oss">14. 支持 OSS<a title="#14.-支持-oss" href="#14.-支持-oss"></a></h3><p>维护者倦怠是开源社区中的一个重要问题。许多流行的 <code>npm</code> 包由志愿者在业余时间维护，通常没有任何补偿。随着时间的推移，这会导致疲惫和缺乏动力，使他们更容易受到社会工程学的影响，恶意行为者假装成为有用的贡献者并最终注入恶意代码。</p><p>2018 年，<code>event-stream</code> 包因维护者给予恶意行为者访问权限而被攻破。JavaScript 生态系统之外的另一个例子是 2024 年的 XZ Utils 事件，恶意行为者工作了三年多才获得信任地位。</p><p>OSS 捐赠也有助于为开源开发创建更可持续的模式。基金会可以帮助支持数百个开源项目背后的业务、营销、法律、技术援助和直接支持，许多人依赖这些项目。</p><p>在 JavaScript 生态系统中，OpenJS Foundation (<a href="https://openjsf.org" target="_blank">https://openjsf.org</a>) 于 2019 年由 JS Foundation 和 Node.js Foundation 合并成立，以支持一些最重要的 JS 项目。下面列出了几个其他平台，您可以在那里捐赠和支持每天使用的 OSS：</p><ul><li>GitHub Sponsors <a href="https://github.com/sponsors" target="_blank">https://github.com/sponsors</a></li><li>Open Collective <a href="https://opencollective.com" target="_blank">https://opencollective.com</a></li><li>Thanks.dev <a href="https://thanks.dev" target="_blank">https://thanks.dev</a></li><li>Open Source Pledge <a href="https://opensourcepledge.com" target="_blank">https://opensourcepledge.com</a></li><li>Ecosystem Funds: <a href="https://funds.ecosyste.ms" target="_blank">https://funds.ecosyste.ms</a></li></ul><h2 id="📝-配置文件示例">📝 配置文件示例<a title="#📝-配置文件示例" href="#📝-配置文件示例"></a></h2><p>以下是一个示例 <code>.npmrc</code> 文件，包含下面提到的配置选项：</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">ignore-scripts</span>=<span class="literal">true</span></span><br><span class="line"><span class="attr">provenance</span>=<span class="literal">true</span></span><br><span class="line"><span class="attr">save-exact</span>=<span class="literal">true</span></span><br><span class="line"><span class="attr">save-prefix</span>=<span class="string">&#x27;&#x27;</span></span><br></pre></td></tr></table></figure><p>其他配置文件示例：</p><ul><li><a href="https://github.com/bodadotsh/npm-security-best-practices/blob/main/bunfig.toml" target="_blank">bunfig.toml</a></li><li><a href="https://github.com/bodadotsh/npm-security-best-practices/blob/main/pnpm-workspace.yaml" target="_blank">pnpm-workspace.yaml</a></li><li><a href="https://github.com/bodadotsh/npm-security-best-practices/blob/main/.yarnrc.yml" target="_blank">.yarnrc.yml</a></li></ul><h2 id="🎯-结论">🎯 结论<a title="#🎯-结论" href="#🎯-结论"></a></h2><p>NPM 生态系统虽然强大，但也存在安全风险。通过实施这些最佳实践——从锁定依赖版本、禁用生命周期脚本到启用 2FA 和使用来源声明——开发者可以显著提高其项目的安全性。</p><p>记住，安全性是一个持续的过程，而不是一次性的任务。定期审计依赖项、保持更新并支持开源维护者，这些都有助于构建更安全的 JavaScript 生态系统。</p><blockquote><p>🛡️ <strong>安全提示</strong>：如果您在 NPM 或 GitHub 中发现漏洞或问题，请使用以下链接报告：</p><ul><li><a href="https://docs.npmjs.com/reporting-malware-in-an-npm-package" target="_blank">https://docs.npmjs.com/reporting-malware-in-an-npm-package</a></li><li><a href="https://docs.github.com/en/communities/maintaining-your-safety-on-github/reporting-abuse-or-spam#reporting-a-repository" target="_blank">https://docs.github.com/en/communities/maintaining-your-safety-on-github/reporting-abuse-or-spam#reporting-a-repository</a></li></ul></blockquote>]]>
    </content>
    <id>https://blog.becase.top/post/2025101001</id>
    <link href="https://blog.becase.top/post/2025101001"/>
    <published>2025-10-10T21:47:50.000Z</published>
    <summary>
      <![CDATA[<div class="reprinted-notice" style="
  background: #f8f9fa;
  border-left: 4px solid #333;
  padding: 12px 16px;
  margin: 16px 0;
  borde]]>
    </summary>
    <title>关于 NPM 包的安全性实践</title>
    <updated>2026-08-04T09:27:28.572Z</updated>
  </entry>
  <entry>
    <author>
      <name>jiechen</name>
    </author>
    <category term="tech" scheme="https://blog.becase.top/categories/tech/"/>
    <category term="computer-science" scheme="https://blog.becase.top/categories/tech/computer-science/"/>
    <category term="computer-science" scheme="https://blog.becase.top/tags/computer-science/"/>
    <category term="architecture" scheme="https://blog.becase.top/tags/architecture/"/>
    <content>
      <![CDATA[<div class="reprinted-notice" style="  background: #f8f9fa;  border-left: 4px solid #333;  padding: 12px 16px;  margin: 16px 0;  border-radius: 4px;  font-size: 14px;  color: #495057;  line-height: 1.6;">  <strong>📋 声明</strong> - 本文为转载文章<br><a href="https://www.seangoedecke.com/good-system-design/" target="_blank" rel="noopener noreferrer" class="reprinted-link">🔗 原文链接：https://www.seangoedecke.com/good-system-design/</a></div><p>在系统设计领域，存在不少欠佳的建议：一类是面向行业新人、主打 “你肯定没听过队列” 的 LinkedIn 风格内容，另一类是标榜 “用数据库存储布尔值即不合格工程师” 的 Twitter 式 “小聪明”。即便部分优质资料（如《设计数据密集型应用》），对工程师日常面临的多数系统设计问题也未必具备实用性。</p><p>什么是系统设计？从行业共识来看，软件设计是 “组装代码行”，核心元素包括变量、函数、类等；而系统设计是 “组装服务”，核心元素涵盖应用服务器、数据库、缓存、队列、事件总线、代理等基础设施。本文将梳理 “好的系统设计” 的核心认知 —— 尽管具体决策需依赖实践经验，但仍可提炼出具有普适性的核心原则</p><h2 id="一、好的系统设计的识别标准">一、好的系统设计的识别标准<a title="#一、好的系统设计的识别标准" href="#一、好的系统设计的识别标准"></a></h2><p>好的系统设计往往呈现 “不起眼” 的特征，甚至与直觉相悖：</p><ul><li><strong>外观平淡，运行稳定</strong>：具体表现为 “长时间无故障”“操作复杂度低于预期”“无需特意关注某部分运行状态”。例如，当接入某一服务时，若出现 “流程比预想中顺畅” 的感受，大概率是优质设计的作用。</li><li><strong>复杂不等于优秀</strong>：劣质设计常更具 “视觉冲击力”—— 若一个系统堆砌了分布式一致性机制、多模式事件驱动、CQRS 等复杂技术，反而可能是在弥补底层决策失误，或存在过度设计问题。当然，并非所有复杂系统均不合理（部分场景确实需要一定复杂度），但能稳定运行的复杂系统，必然源于能稳定运行的简单系统，从零构建复杂系统属于高风险行为。</li></ul><h2 id="二、核心矛盾：状态与无状态">二、核心矛盾：状态与无状态<a title="#二、核心矛盾：状态与无状态" href="#二、核心矛盾：状态与无状态"></a></h2><p>软件设计的核心难点，本质在于 “状态管理”，二者的定义与特征如下：</p><ul><li><strong>有状态（Stateful）</strong>：需长期存储信息（如与数据库交互的服务），这类组件易出现故障且无法自动修复 —— 例如数据库中存储了触发应用崩溃的异常数据时，需手动清理；磁盘空间不足时，需手动扩容或删除冗余数据。</li><li><strong>无状态（Stateless）</strong>：不持久化存储信息（仅在请求生命周期内暂存数据），典型案例为 GitHub 的内部 API：接收 PDF 文件后返回 HTML 渲染结果，重启服务无需恢复任何前置数据。</li></ul><h3 id="设计原则：最小化有状态组件">设计原则：最小化有状态组件<a title="#设计原则：最小化有状态组件" href="#设计原则：最小化有状态组件"></a></h3><ul><li><p><strong>实践方案</strong>：设置单一服务专门管理状态（仅该服务与数据库交互），其他服务仅承担无状态处理任务。例如，避免 5 个服务同时写入同一张数据库表，而是让其中 4 个服务通过 API 或事件调用 “状态管理服务”，由后者统一执行写入逻辑。</p></li><li><p><strong>读逻辑灵活性</strong>：读操作可适当简化 —— 若直接读取user_sessions表的速度比调用内部会话服务快 2 倍，无需强求通过统一服务调用。</p></li></ul><h2 id="三、数据库：状态管理的核心载体">三、数据库：状态管理的核心载体<a title="#三、数据库：状态管理的核心载体" href="#三、数据库：状态管理的核心载体"></a></h2><p>由于状态管理是系统设计的关键，存储状态的数据库自然成为核心组件。以下以 SQL 数据库（MySQL/PostgreSQL）为例，梳理核心设计要点：</p><h3 id="1.-schema-与索引：平衡灵活性与可读性">1. Schema 与索引：平衡灵活性与可读性<a title="#1.-schema-与索引：平衡灵活性与可读性" href="#1.-schema-与索引：平衡灵活性与可读性"></a></h3><ul><li><p><strong>Schema 设计</strong>：需具备一定灵活性（避免数据量达百万级后修改 Schema 的繁琐操作），但不可过度灵活 —— 若将所有数据存入 “value” JSON 列，或通过 “键值表” 存储任意数据，会将复杂度转移至应用层，还可能引发性能隐患。核心原则是人类可读：通过 Schema 即可大致理解 “存储内容及存储目的”。</p></li><li><p><strong>索引设计</strong>：</p><ul><li>必要性：仅当表数据量极少（如仅几行）时可省略索引，否则必须添加 —— 索引是提升查询效率的核心手段。</li><li>匹配查询场景：若常用email与type组合查询，需建立包含这两个字段的联合索引。</li><li>字段顺序技巧：索引结构类似 “嵌套字典”，需将高基数字段（如email，值唯一度高）置于前方，避免出现 “查询email时先扫描所有同type数据” 的低效情况。</li><li>避免过度索引：每新增一个索引，都会增加写操作的开销（写入数据时需同步更新索引）。</li></ul></li></ul><h3 id="2.-突破数据库瓶颈：优化读写逻辑">2. 突破数据库瓶颈：优化读写逻辑<a title="#2.-突破数据库瓶颈：优化读写逻辑" href="#2.-突破数据库瓶颈：优化读写逻辑"></a></h3><p>在高流量应用中，数据库常成为性能瓶颈（即便应用层代码效率一般，如 Ruby on Rails 服务），原因是复杂请求可能需顺序执行数百次数据库调用。解决思路包括：</p><ul><li>最大化数据库处理能力：多表数据查询优先使用JOIN语句，而非多次查询后在内存中拼接；需警惕 ORM 框架的 “内循环查询”—— 例如将 “查询所有记录的 id 和 name” 拆分为 “先查询所有 id，再循环查询每个 id 对应的 name”，会导致查询次数从 1 次增至 101 次。</li><li>复杂查询拆分：极少数情况下，拆分极复杂查询比优化索引更高效（尽管理论上可通过索引优化解决，但实际操作中拆分更易落地）。</li><li>读写分离：采用 “1 主库 + 多从库” 架构，读请求优先分配至从库（主库已承担全部写操作）。仅当无法容忍 “毫秒级同步延迟” 时读取主库 —— 例如数据更新后，可直接在内存中使用更新后的值，避免立即查询主库。</li><li>应对查询峰值：写请求与事务最易导致数据库过载（每笔操作需消耗大量计算资源）。若服务可能引发查询峰值（如批量导入 API），需实施 “节流” 策略控制请求频率，防止数据库因过载陷入 “越慢越拥堵” 的恶性循环。</li></ul><h3 id="代码示例：数据库索引与查询优化">代码示例：数据库索引与查询优化<a title="#代码示例：数据库索引与查询优化" href="#代码示例：数据库索引与查询优化"></a></h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- 1. 合理的用户表Schema设计（人类可读，避免过度JSON化）</span></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> users (</span><br><span class="line">    id <span class="type">INT</span> <span class="keyword">PRIMARY</span> KEY AUTO_INCREMENT,</span><br><span class="line">    email <span class="type">VARCHAR</span>(<span class="number">255</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">UNIQUE</span>, <span class="comment">-- 高基数字段</span></span><br><span class="line">    user_type <span class="type">VARCHAR</span>(<span class="number">50</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span>,     <span class="comment">-- 低基数字段（如&quot;admin&quot;/&quot;user&quot;）</span></span><br><span class="line">    created_at <span class="type">TIMESTAMP</span> <span class="keyword">DEFAULT</span> <span class="built_in">CURRENT_TIMESTAMP</span>,</span><br><span class="line">    updated_at <span class="type">TIMESTAMP</span> <span class="keyword">DEFAULT</span> <span class="built_in">CURRENT_TIMESTAMP</span> <span class="keyword">ON</span> <span class="keyword">UPDATE</span> <span class="built_in">CURRENT_TIMESTAMP</span></span><br><span class="line">);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 2. 联合索引设计（高基数字段email在前，匹配常用查询场景）</span></span><br><span class="line"><span class="keyword">CREATE</span> INDEX idx_users_email_type <span class="keyword">ON</span> users (email, user_type);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 3. 高效查询：用JOIN替代多次查询，避免内存拼接</span></span><br><span class="line"><span class="comment">-- 需求：查询用户及其所属组织信息</span></span><br><span class="line"><span class="keyword">SELECT</span> u.id, u.email, o.org_name</span><br><span class="line"><span class="keyword">FROM</span> users u</span><br><span class="line"><span class="keyword">JOIN</span> organizations o <span class="keyword">ON</span> u.org_id <span class="operator">=</span> o.id</span><br><span class="line"><span class="keyword">WHERE</span> u.user_type <span class="operator">=</span> <span class="string">&#x27;admin&#x27;</span> <span class="keyword">AND</span> u.created_at <span class="operator">&gt;</span> <span class="string">&#x27;2024-01-01&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 4. 避免ORM内循环查询：一次性获取所需数据</span></span><br><span class="line"><span class="comment">-- 反例（低效）：先查用户id，再循环查每个用户的详情</span></span><br><span class="line"><span class="comment">-- SELECT id FROM users WHERE user_type = &#x27;user&#x27;; </span></span><br><span class="line"><span class="comment">-- SELECT * FROM users WHERE id = 1; SELECT * FROM users WHERE id = 2; ...</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 正例（高效）：一次性获取所有目标用户详情</span></span><br><span class="line"><span class="keyword">SELECT</span> id, email, user_type <span class="keyword">FROM</span> users <span class="keyword">WHERE</span> user_type <span class="operator">=</span> <span class="string">&#x27;user&#x27;</span>;</span><br></pre></td></tr></table></figure><h2 id="四、快慢操作：任务拆分与后台处理">四、快慢操作：任务拆分与后台处理<a title="#四、快慢操作：任务拆分与后台处理" href="#四、快慢操作：任务拆分与后台处理"></a></h2><p>系统需同时处理 “低延迟响应” 与 “长耗时操作”，核心策略是拆分任务，通过后台异步处理长耗时操作：</p><ul><li>快操作标准：用户交互场景（如 API 调用、网页加载）需在数百毫秒内返回响应（游戏领域虽要求 10 毫秒内，但实际成功产品中，用户可接受稍慢响应，前提是功能具备实用价值）。</li><li>慢操作处理方式：优先完成 “对用户有直接价值的最小任务集”，剩余任务移交后台处理。例如转换大型 PDF 文件时，先返回第一页的 HTML 结果，其余页面通过后台任务异步处理。</li></ul><h3 id="后台任务的两种实现方式">后台任务的两种实现方式<a title="#后台任务的两种实现方式" href="#后台任务的两种实现方式"></a></h3><ul><li>常规任务（短周期）：采用 “队列 + 任务执行器” 架构 —— 队列（如 Redis）存储任务（格式示例：{job_name: “pdf_render”, params: {file_id: 123}}），任务执行器从队列中提取任务并运行，支持定时执行（如每日日志清理）。</li><li>长期任务（长周期）：Redis 不适用于存储 “一个月后执行” 的任务（持久化可靠性不足，且查询难度高），此时需改用数据库表：创建包含任务参数与scheduled_at（计划执行时间）字段的表，通过每日定时任务筛选 “scheduled_at ≤ 当日” 的记录，执行完成后标记状态或删除。</li></ul><h3 id="代码示例：后台任务实现（常规任务与长期任务）">代码示例：后台任务实现（常规任务与长期任务）<a title="#代码示例：后台任务实现（常规任务与长期任务）" href="#代码示例：后台任务实现（常规任务与长期任务）"></a></h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1. 常规短周期任务（基于Redis队列，使用Celery框架）</span></span><br><span class="line"><span class="keyword">from</span> celery <span class="keyword">import</span> Celery</span><br><span class="line"><span class="keyword">import</span> redis</span><br><span class="line"></span><br><span class="line"><span class="comment"># 初始化Celery（Redis作为消息队列）</span></span><br><span class="line">redis_client = redis.Redis(host=<span class="string">&#x27;localhost&#x27;</span>, port=<span class="number">6379</span>, db=<span class="number">0</span>)</span><br><span class="line">app = Celery(<span class="string">&#x27;pdf_tasks&#x27;</span>, broker=<span class="string">&#x27;redis://localhost:6379/0&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 定义PDF渲染任务（短周期，数分钟内完成）</span></span><br><span class="line"><span class="meta">@app.task</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">render_pdf_page</span>(<span class="params">file_id: <span class="built_in">str</span>, page_num: <span class="built_in">int</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;渲染PDF指定页面为HTML，返回HTML内容&quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># 模拟PDF渲染逻辑（实际需调用PDF处理库如PyPDF2）</span></span><br><span class="line">    pdf_content = redis_client.get(<span class="string">f&quot;pdf:<span class="subst">&#123;file_id&#125;</span>&quot;</span>)</span><br><span class="line">    html = <span class="string">f&quot;&lt;html&gt;&lt;body&gt;Page <span class="subst">&#123;page_num&#125;</span> of PDF <span class="subst">&#123;file_id&#125;</span>&lt;/body&gt;&lt;/html&gt;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> html</span><br><span class="line"></span><br><span class="line"><span class="comment"># 任务调用：先渲染第一页（即时响应），剩余页面入队列（后台处理）</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">handle_pdf_request</span>(<span class="params">file_id: <span class="built_in">str</span>, total_pages: <span class="built_in">int</span></span>):</span><br><span class="line">    <span class="comment"># 1. 即时处理：渲染第一页，返回给用户</span></span><br><span class="line">    first_page_html = render_pdf_page(file_id, page_num=<span class="number">1</span>)</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 2. 后台处理：剩余页面入队列</span></span><br><span class="line">    <span class="keyword">for</span> page <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">2</span>, total_pages + <span class="number">1</span>):</span><br><span class="line">        render_pdf_page.delay(file_id=file_id, page_num=page)</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> &#123;<span class="string">&quot;first_page&quot;</span>: first_page_html, <span class="string">&quot;status&quot;</span>: <span class="string">&quot;processing_remaining_pages&quot;</span>&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 长期任务（基于数据库表，每日定时扫描）</span></span><br><span class="line"><span class="keyword">import</span> sqlite3</span><br><span class="line"><span class="keyword">from</span> datetime <span class="keyword">import</span> datetime</span><br><span class="line"></span><br><span class="line"><span class="comment"># 初始化数据库表（存储长期任务）</span></span><br><span class="line">conn = sqlite3.connect(<span class="string">&#x27;long_term_tasks.db&#x27;</span>)</span><br><span class="line">cursor = conn.cursor()</span><br><span class="line">cursor.execute(<span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="string">CREATE TABLE IF NOT EXISTS pending_tasks (</span></span><br><span class="line"><span class="string">    id TEXT PRIMARY KEY,</span></span><br><span class="line"><span class="string">    job_name TEXT NOT NULL,</span></span><br><span class="line"><span class="string">    params JSON NOT NULL,</span></span><br><span class="line"><span class="string">    scheduled_at TIMESTAMP NOT NULL,</span></span><br><span class="line"><span class="string">    status TEXT DEFAULT &#x27;pending&#x27; -- pending/completed/failed</span></span><br><span class="line"><span class="string">)</span></span><br><span class="line"><span class="string">&#x27;&#x27;&#x27;</span>)</span><br><span class="line">conn.commit()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 每日定时任务：扫描并执行到期任务</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">daily_task_scanner</span>():</span><br><span class="line">    today = datetime.now().strftime(<span class="string">&quot;%Y-%m-%d %H:%M:%S&quot;</span>)</span><br><span class="line">    <span class="comment"># 查询今日及之前需执行的任务</span></span><br><span class="line">    cursor.execute(<span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="string">    SELECT id, job_name, params FROM pending_tasks </span></span><br><span class="line"><span class="string">    WHERE scheduled_at &lt;= ? AND status = &#x27;pending&#x27;</span></span><br><span class="line"><span class="string">    &#x27;&#x27;&#x27;</span>, (today,))</span><br><span class="line">    tasks = cursor.fetchall()</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">for</span> task_id, job_name, params <span class="keyword">in</span> tasks:</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="comment"># 执行任务（示例：发送月度账单）</span></span><br><span class="line">            <span class="keyword">if</span> job_name == <span class="string">&#x27;send_monthly_bill&#x27;</span>:</span><br><span class="line">                user_id = params[<span class="string">&#x27;user_id&#x27;</span>]</span><br><span class="line">                amount = params[<span class="string">&#x27;amount&#x27;</span>]</span><br><span class="line">                <span class="comment"># send_bill_email(user_id, amount)  # 实际发送邮件逻辑</span></span><br><span class="line">                </span><br><span class="line">                <span class="comment"># 标记任务完成</span></span><br><span class="line">                cursor.execute(<span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="string">                UPDATE pending_tasks SET status = &#x27;completed&#x27; WHERE id = ?</span></span><br><span class="line"><span class="string">                &#x27;&#x27;&#x27;</span>, (task_id,))</span><br><span class="line">                conn.commit()</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            <span class="comment"># 标记任务失败（后续可重试）</span></span><br><span class="line">            cursor.execute(<span class="string">&#x27;&#x27;&#x27;</span></span><br><span class="line"><span class="string">            UPDATE pending_tasks SET status = &#x27;failed&#x27;, error = ? WHERE id = ?</span></span><br><span class="line"><span class="string">            &#x27;&#x27;&#x27;</span>, (<span class="built_in">str</span>(e), task_id))</span><br><span class="line">            conn.commit()</span><br></pre></td></tr></table></figure><h2 id="五、缓存：缓解高成本操作的双刃剑">五、缓存：缓解高成本操作的双刃剑<a title="#五、缓存：缓解高成本操作的双刃剑" href="#五、缓存：缓解高成本操作的双刃剑"></a></h2><p>缓存用于解决 “重复执行高成本操作” 的问题，但需谨慎使用：</p><ul><li><p>适用场景：例如计费服务需调用外部 API 获取实时价格，若采用按次计费模式（如 OpenAI 按 token 收费），会导致 “响应延迟高 + 外部服务流量过载”，此时每 5 分钟查询一次价格并缓存，可显著优化性能。</p></li><li><p>常见实现方案：内存缓存（实现简单但无法跨服务共享）、Redis/Memcached（支持跨服务共享，且读写速度快）。</p></li><li><p>核心原则：先优化，再缓存：初级工程师易倾向 “缓存所有内容”，但资深工程师会尽量减少缓存使用 —— 因为缓存同样属于 “状态载体”，可能出现数据不一致、过期数据（stale data）等问题。例如，对于慢 SQL 查询，应优先添加索引，而非直接缓存查询结果。</p></li><li><p>高级技巧：大结果缓存：若需缓存超大体积结果（如大客户的周度使用报表），Redis 存储能力不足时，可将结果按时间戳存入 S3 或 Azure Blob Storage，直接从存储服务返回文件。</p></li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> redis</span><br><span class="line"><span class="keyword">import</span> boto3</span><br><span class="line"><span class="keyword">from</span> datetime <span class="keyword">import</span> timedelta</span><br><span class="line"><span class="keyword">from</span> typing <span class="keyword">import</span> <span class="type">Dict</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 1. 常规缓存：Redis缓存外部API价格（5分钟过期）</span></span><br><span class="line">redis_client = redis.Redis(host=<span class="string">&#x27;localhost&#x27;</span>, port=<span class="number">6379</span>, db=<span class="number">1</span>)</span><br><span class="line">PRICE_CACHE_TTL = timedelta(minutes=<span class="number">5</span>).total_seconds()  <span class="comment"># 缓存过期时间</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_price_from_external_api</span>(<span class="params">product_id: <span class="built_in">str</span></span>) -&gt; <span class="built_in">float</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;模拟调用外部API获取价格&quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># 实际逻辑：response = requests.get(f&quot;https://api.example.com/price/&#123;product_id&#125;&quot;)</span></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0.01</span>  <span class="comment"># 示例：假设每单位价格0.01元</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_cached_price</span>(<span class="params">product_id: <span class="built_in">str</span></span>) -&gt; <span class="built_in">float</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;优先从缓存获取价格，缓存未命中则调用API并更新缓存&quot;&quot;&quot;</span></span><br><span class="line">    cache_key = <span class="string">f&quot;price:<span class="subst">&#123;product_id&#125;</span>&quot;</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 1. 尝试从缓存获取</span></span><br><span class="line">    cached_price = redis_client.get(cache_key)</span><br><span class="line">    <span class="keyword">if</span> cached_price:</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">float</span>(cached_price)</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 2. 缓存未命中，调用API</span></span><br><span class="line">    price = get_price_from_external_api(product_id)</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 3. 更新缓存（设置过期时间，避免数据 stale）</span></span><br><span class="line">    redis_client.setex(cache_key, PRICE_CACHE_TTL, <span class="built_in">str</span>(price))</span><br><span class="line">    <span class="keyword">return</span> price</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 大结果缓存：S3存储大客户周度报表（避免Redis内存不足）</span></span><br><span class="line">s3_client = boto3.client(<span class="string">&#x27;s3&#x27;</span>, aws_access_key_id=<span class="string">&#x27;YOUR_KEY&#x27;</span>, aws_secret_access_key=<span class="string">&#x27;YOUR_SECRET&#x27;</span>)</span><br><span class="line">S3_BUCKET = <span class="string">&#x27;report-cache-bucket&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">generate_weekly_report</span>(<span class="params">customer_id: <span class="built_in">str</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;生成大客户周度报表（模拟大体积结果，如100MB+）&quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># 实际逻辑：从数据库查询大量数据，生成详细报表</span></span><br><span class="line">    report_content = <span class="string">f&quot;Weekly Report for Customer <span class="subst">&#123;customer_id&#125;</span>: ... (large content)&quot;</span></span><br><span class="line">    <span class="keyword">return</span> report_content</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get_cached_weekly_report</span>(<span class="params">customer_id: <span class="built_in">str</span>, week: <span class="built_in">str</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;从S3获取缓存报表，不存在则生成并上传&quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># 构建S3对象键（包含时间戳，确保唯一性和可追溯性）</span></span><br><span class="line">    s3_key = <span class="string">f&quot;weekly_reports/<span class="subst">&#123;customer_id&#125;</span>/<span class="subst">&#123;week&#125;</span>.html&quot;</span></span><br><span class="line">    </span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="comment"># 1. 尝试从S3下载缓存</span></span><br><span class="line">        response = s3_client.get_object(Bucket=S3_BUCKET, Key=s3_key)</span><br><span class="line">        <span class="keyword">return</span> response[<span class="string">&#x27;Body&#x27;</span>].read().decode(<span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">    <span class="keyword">except</span> s3_client.exceptions.NoSuchKey:</span><br><span class="line">        <span class="comment"># 2. 缓存未命中，生成报表</span></span><br><span class="line">        report = generate_weekly_report(customer_id)</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 3. 上传到S3（作为持久化缓存）</span></span><br><span class="line">        s3_client.put_object(</span><br><span class="line">            Bucket=S3_BUCKET,</span><br><span class="line">            Key=s3_key,</span><br><span class="line">            Body=report,</span><br><span class="line">            ContentType=<span class="string">&#x27;text/html&#x27;</span></span><br><span class="line">        )</span><br><span class="line">        <span class="keyword">return</span> report</span><br></pre></td></tr></table></figure><h2 id="六、事件：解耦多服务通信的工具">六、事件：解耦多服务通信的工具<a title="#六、事件：解耦多服务通信的工具" href="#六、事件：解耦多服务通信的工具"></a></h2><p>多数企业会部署事件中心（如 Kafka），但该工具并非适用于所有场景：</p><ul><li>本质定义：事件中心是一种 “事件队列”，与后台任务队列的区别在于，其存储的是 “某事件已发生” 的信息，而非 “执行某任务” 的指令。例如 “新账户创建” 事件，可被 “发送欢迎邮件”“滥用行为扫描”“账户基础设施初始化” 等多个服务消费。</li><li>使用边界：<ul><li>优先选择 API 调用：API 调用的日志集中、逻辑可追溯性强、能实时获取响应结果，多数场景下优于事件通信。</li><li>适合使用事件的场景：发送方无需关注消费方行为（如 “新账户创建” 事件无需确认邮件是否发送成功），或事件流量大且对实时性要求低（如社交平台中每篇新内容的滥用扫描）。</li></ul></li></ul><h3 id="代码示例：kafka-事件通信实现">代码示例：Kafka 事件通信实现<a title="#代码示例：kafka-事件通信实现" href="#代码示例：kafka-事件通信实现"></a></h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> kafka <span class="keyword">import</span> KafkaProducer, KafkaConsumer</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">from</span> typing <span class="keyword">import</span> <span class="type">Dict</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 1. 事件生产者：发送“新账户创建”事件</span></span><br><span class="line">producer = KafkaProducer(</span><br><span class="line">    bootstrap_servers=[<span class="string">&#x27;localhost:9092&#x27;</span>],</span><br><span class="line">    value_serializer=<span class="keyword">lambda</span> v: json.dumps(v).encode(<span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">send_new_account_event</span>(<span class="params">account_data: <span class="type">Dict</span>[<span class="built_in">str</span>, <span class="built_in">str</span>]</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;当新账户创建时，发送事件到Kafka&quot;&quot;&quot;</span></span><br><span class="line">    event = &#123;</span><br><span class="line">        <span class="string">&quot;event_type&quot;</span>: <span class="string">&quot;new_account_created&quot;</span>,</span><br><span class="line">        <span class="string">&quot;timestamp&quot;</span>: json.dumps(datetime.now()),</span><br><span class="line">        <span class="string">&quot;data&quot;</span>: account_data  <span class="comment"># 包含账户核心信息：id、email、created_at等</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment"># 发送到指定主题（topic）</span></span><br><span class="line">    producer.send(<span class="string">&#x27;account_events&#x27;</span>, value=event)</span><br><span class="line">    producer.flush()  <span class="comment"># 确保事件被发送</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 事件消费者1：接收事件并发送欢迎邮件</span></span><br><span class="line">email_consumer = KafkaConsumer(</span><br><span class="line">    <span class="string">&#x27;account_events&#x27;</span>,</span><br><span class="line">    bootstrap_servers=[<span class="string">&#x27;localhost:9092&#x27;</span>],</span><br><span class="line">    value_deserializer=<span class="keyword">lambda</span> m: json.loads(m.decode(<span class="string">&#x27;utf-8&#x27;</span>)),</span><br><span class="line">    group_id=<span class="string">&#x27;email_service_group&#x27;</span>  <span class="comment"># 消费者组：确保事件被消费一次</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">consume_for_email</span>():</span><br><span class="line">    <span class="keyword">for</span> message <span class="keyword">in</span> email_consumer:</span><br><span class="line">        event = message.value</span><br><span class="line">        <span class="keyword">if</span> event[<span class="string">&quot;event_type&quot;</span>] == <span class="string">&quot;new_account_created&quot;</span>:</span><br><span class="line">            account_email = event[<span class="string">&quot;data&quot;</span>][<span class="string">&quot;email&quot;</span>]</span><br><span class="line">            <span class="comment"># send_welcome_email(account_email)  # 实际发送邮件逻辑</span></span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;Sent welcome email to <span class="subst">&#123;account_email&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3. 事件消费者2：接收事件并执行滥用扫描</span></span><br><span class="line">abuse_consumer = KafkaConsumer(</span><br><span class="line">    <span class="string">&#x27;account_events&#x27;</span>,</span><br><span class="line">    bootstrap_servers=[<span class="string">&#x27;localhost:9092&#x27;</span>],</span><br><span class="line">    value_deserializer=<span class="keyword">lambda</span> m: json.loads(m.decode(<span class="string">&#x27;utf-8&#x27;</span>)),</span><br><span class="line">    group_id=<span class="string">&#x27;abuse_scan_group&#x27;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">consume_for_abuse_scan</span>():</span><br><span class="line">    <span class="keyword">for</span> message <span class="keyword">in</span> abuse_consumer:</span><br><span class="line">        event = message.value</span><br><span class="line">        <span class="keyword">if</span> event[<span class="string">&quot;event_type&quot;</span>] == <span class="string">&quot;new_account_created&quot;</span>:</span><br><span class="line">            account_id = event[<span class="string">&quot;data&quot;</span>][<span class="string">&quot;id&quot;</span>]</span><br><span class="line">            account_email = event[<span class="string">&quot;data&quot;</span>][<span class="string">&quot;email&quot;</span>]</span><br><span class="line">            <span class="comment"># scan_for_abuse(account_id, account_email)  # 实际滥用扫描逻辑</span></span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;Scanned abuse for account <span class="subst">&#123;account_id&#125;</span> (<span class="subst">&#123;account_email&#125;</span>)&quot;</span>)</span><br></pre></td></tr></table></figure><h2 id="七、数据流动：推模式与拉模式的选择">七、数据流动：推模式与拉模式的选择<a title="#七、数据流动：推模式与拉模式的选择" href="#七、数据流动：推模式与拉模式的选择"></a></h2><p>数据从 “源头” 传递至 “多个接收方” 时，存在两种核心模式，需根据场景选择：</p><ul><li><p>两种模式的核心差异</p><ul><li>拉模式（Pull）：接收方主动请求数据，例如普通网站 —— 用户刷新邮箱时，浏览器向服务器请求最新邮件数据。缺点是易出现 “重复拉取相同数据” 的情况（如刷新页面时重新加载全部内容）。</li><li>推模式（Push）：接收方完成注册后，数据发生变化时由源头主动推送，例如 Gmail—— 新邮件到达后无需刷新页面，会自动显示。</li></ul></li><li><p>不同场景下的选择策略</p><ul><li>服务间通信：若数据更新频率低（如配置信息），推模式更优 —— 数据更新时向 100 个服务各发送 1 次请求，比 100 个服务每秒各拉取 1 次（累计 1000 次 / 秒）更高效。</li><li>百万级客户端场景（如 Gmail）：<ul><li>推模式：将推送任务加入事件队列，通过大量事件处理器从队列提取任务，分别向客户端推送数据。</li><li>拉模式：部署数百台 “快速读从库缓存”（无需频繁与主库交互，可存储内存数据或磁盘静态数据），集中处理所有读请求。</li></ul></li></ul></li></ul><h3 id="代码示例：推模式与拉模式实现（服务间通信）">代码示例：推模式与拉模式实现（服务间通信）<a title="#代码示例：推模式与拉模式实现（服务间通信）" href="#代码示例：推模式与拉模式实现（服务间通信）"></a></h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1. 拉模式（服务A主动拉取服务B的配置数据）</span></span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">from</span> time <span class="keyword">import</span> sleep</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">pull_config_from_service_b</span>(<span class="params">service_a_id: <span class="built_in">str</span></span>) -&gt; <span class="type">Dict</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;服务A每隔10秒拉取服务B的配置数据&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="comment"># 主动请求服务B的配置接口</span></span><br><span class="line">            response = requests.get(<span class="string">f&quot;https://service-b.example.com/config?service_id=<span class="subst">&#123;service_a_id&#125;</span>&quot;</span>)</span><br><span class="line">            config = response.json()</span><br><span class="line">            <span class="comment"># update_local_config(config)  # 更新本地配置</span></span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;Service A pulled config: <span class="subst">&#123;config&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;Pull config failed: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&quot;</span>)</span><br><span class="line">        sleep(<span class="number">10</span>)  <span class="comment"># 每10秒拉取一次</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 推模式（服务B主动推送配置到服务A）</span></span><br><span class="line"><span class="keyword">from</span> flask <span class="keyword">import</span> Flask, request</span><br><span class="line"></span><br><span class="line">app = Flask(__name__)</span><br><span class="line"><span class="comment"># 存储已注册的服务A实例（实际生产环境用分布式存储）</span></span><br><span class="line">registered_services = <span class="built_in">set</span>()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 服务A注册接口：告知服务B“需要接收配置推送”</span></span><br><span class="line"><span class="meta">@app.route(<span class="params"><span class="string">&#x27;/register&#x27;</span>, methods=[<span class="string">&#x27;POST&#x27;</span>]</span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">register_service</span>():</span><br><span class="line">    service_id = request.json.get(<span class="string">&#x27;service_id&#x27;</span>)</span><br><span class="line">    service_url = request.json.get(<span class="string">&#x27;service_url&#x27;</span>)</span><br><span class="line">    registered_services.add((service_id, service_url))</span><br><span class="line">    <span class="keyword">return</span> &#123;<span class="string">&quot;status&quot;</span>: <span class="string">&quot;success&quot;</span>&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置更新时，主动推送到所有注册的服务A</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">push_config_to_services</span>(<span class="params">new_config: <span class="type">Dict</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;服务B配置更新时，推送到所有已注册的服务A&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">for</span> service_id, service_url <span class="keyword">in</span> registered_services:</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="comment"># 主动推送配置到服务A的接收接口</span></span><br><span class="line">            requests.post(</span><br><span class="line">                <span class="string">f&quot;<span class="subst">&#123;service_url&#125;</span>/config/update&quot;</span>,</span><br><span class="line">                json=&#123;<span class="string">&quot;service_id&quot;</span>: service_id, <span class="string">&quot;config&quot;</span>: new_config&#125;</span><br><span class="line">            )</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;Pushed config to service <span class="subst">&#123;service_id&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;Push to service <span class="subst">&#123;service_id&#125;</span> failed: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 模拟配置更新：当服务B配置变化时触发推送</span></span><br><span class="line">new_config = &#123;<span class="string">&quot;max_requests&quot;</span>: <span class="number">1000</span>, <span class="string">&quot;timeout&quot;</span>: <span class="number">30</span>&#125;</span><br><span class="line">push_config_to_services(new_config)</span><br></pre></td></tr></table></figure><h2 id="八、聚焦关键：热路径设计">八、聚焦关键：热路径设计<a title="#八、聚焦关键：热路径设计" href="#八、聚焦关键：热路径设计"></a></h2><p>系统设计无需追求 “全面覆盖”，应重点关注热路径（Hot Path）：</p><ul><li>定义：系统中 “业务价值最高” 且 “数据流量最大” 的部分。例如在计量计费系统中，“判断是否向客户收费” 与 “接入所有用户行为以计算费用” 均属于热路径。</li><li>重要性原因：<ul><li>解决方案局限性高：非热路径（如计费设置页面）的实现方式多样，而热路径（如处理用户行为数据流）的合理解决方案可能仅少数几种。</li><li>故障影响范围广：非热路径故障（如设置页面异常）难以导致整体产品不可用，但触发所有用户行为的代码若存在漏洞，会直接引发全局故障。</li></ul></li></ul><h3 id="代码示例：热路径设计实现（用户行为计费）">代码示例：热路径设计实现（用户行为计费）<a title="#代码示例：热路径设计实现（用户行为计费）" href="#代码示例：热路径设计实现（用户行为计费）"></a></h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> redis</span><br><span class="line"><span class="keyword">from</span> typing <span class="keyword">import</span> <span class="type">Dict</span></span><br><span class="line"></span><br><span class="line">redis_client = redis.Redis(host=<span class="string">&#x27;localhost:6379&#x27;</span>, db=<span class="number">2</span>)</span><br><span class="line">BILLING_RATE = <span class="number">0.001</span>  <span class="comment"># 每行为单位计费价格</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">process_user_action</span>(<span class="params">user_id: <span class="built_in">str</span>, action_type: <span class="built_in">str</span>, action_data: <span class="type">Dict</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    热路径：处理用户行为并计算费用</span></span><br><span class="line"><span class="string">    特点：高并发（每秒数千次调用）、高准确性（计费不能出错）</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># 1. 快速过滤：仅对需计费的行为处理（减少无效计算）</span></span><br><span class="line">    billable_actions = &#123;<span class="string">&quot;api_call&quot;</span>, <span class="string">&quot;file_upload&quot;</span>&#125;</span><br><span class="line">    <span class="keyword">if</span> action_type <span class="keyword">not</span> <span class="keyword">in</span> billable_actions:</span><br><span class="line">        <span class="keyword">return</span> &#123;<span class="string">&quot;status&quot;</span>: <span class="string">&quot;success&quot;</span>, <span class="string">&quot;billable&quot;</span>: <span class="literal">False</span>&#125;</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 2. 幂等性保障：避免重复计费（关键！热路径必须防重复）</span></span><br><span class="line">    action_id = action_data.get(<span class="string">&quot;action_id&quot;</span>)  <span class="comment"># 唯一行为ID（如UUID）</span></span><br><span class="line">    <span class="keyword">if</span> redis_client.exists(<span class="string">f&quot;billed:<span class="subst">&#123;action_id&#125;</span>&quot;</span>):</span><br><span class="line">        <span class="keyword">return</span> &#123;<span class="string">&quot;status&quot;</span>: <span class="string">&quot;success&quot;</span>, <span class="string">&quot;billable&quot;</span>: <span class="literal">True</span>, <span class="string">&quot;duplicate&quot;</span>: <span class="literal">True</span>&#125;</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 3. 轻量计算：减少热路径中的复杂逻辑（复杂计算移至后台）</span></span><br><span class="line">    <span class="comment"># 示例：按API调用次数计费，直接用Redis自增计数</span></span><br><span class="line">    usage_key = <span class="string">f&quot;usage:<span class="subst">&#123;user_id&#125;</span>:<span class="subst">&#123;action_type&#125;</span>:<span class="subst">&#123;datetime.now().strftime(<span class="string">&#x27;%Y-%m&#x27;</span>)&#125;</span>&quot;</span></span><br><span class="line">    redis_client.incr(usage_key)  <span class="comment"># 原子操作，确保计数准确</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 4. 标记已计费（先标记，再异步计算总费用，避免热路径阻塞）</span></span><br><span class="line">    redis_client.setex(<span class="string">f&quot;billed:<span class="subst">&#123;action_id&#125;</span>&quot;</span>, timedelta(days=<span class="number">30</span>), <span class="string">&quot;1&quot;</span>)  <span class="comment"># 30天过期</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 5. 异步触发后续流程（非热路径：计算总费用、生成账单）</span></span><br><span class="line">    calculate_monthly_bill.delay(user_id, usage_key)  <span class="comment"># 后台任务（Celery等）</span></span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> &#123;<span class="string">&quot;status&quot;</span>: <span class="string">&quot;success&quot;</span>, <span class="string">&quot;billable&quot;</span>: <span class="literal">True</span>, <span class="string">&quot;duplicate&quot;</span>: <span class="literal">False</span>&#125;</span><br></pre></td></tr></table></figure><h2 id="九、可观测性：日志与监控体系">九、可观测性：日志与监控体系<a title="#九、可观测性：日志与监控体系" href="#九、可观测性：日志与监控体系"></a></h2><p>“提前发现系统问题” 比 “问题发生后修复” 更重要，核心依赖日志与监控：</p><ul><li>日志：重点记录 “异常路径”<ul><li>设计原则：在 “流程异常” 场景中增加日志输出。例如返回 422 响应时，记录 “触发 422 的具体条件”；计费逻辑中，记录 “因某原因不执行收费的决策依据”。<br>核心价值：排查用户问题时不可或缺 —— 若重要客户遇到 422 错误，即便问题源于客户操作，也需明确 “具体操作行为”，不可为追求代码简洁省略关键日志。</li></ul></li><li>监控：关注 “核心指标 + 长尾延迟”<ul><li>运维指标：需监控主机 / 容器的 CPU 使用率、内存占用、队列长度、请求 / 任务的平均耗时。</li><li>用户体验指标：必须关注p95/p99 延迟（即 95%/99% 的请求耗时低于该数值），而非仅依赖平均值。例如 100 个请求中，98 个耗时 100 毫秒、2 个耗时 10 秒，平均值仅 298 毫秒，但这 2 个慢请求可能来自核心客户，平均值会掩盖真实的用户体验问题。</li></ul></li></ul><h3 id="代码示例：日志与监控实现（python+prometheus）">代码示例：日志与监控实现（Python+Prometheus）<a title="#代码示例：日志与监控实现（python+prometheus）" href="#代码示例：日志与监控实现（python+prometheus）"></a></h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> logging</span><br><span class="line"><span class="keyword">from</span> prometheus_client <span class="keyword">import</span> Counter, Histogram, start_http_server</span><br><span class="line"><span class="keyword">from</span> time <span class="keyword">import</span> time</span><br><span class="line"></span><br><span class="line"><span class="comment"># 1. 日志配置：重点记录异常路径，包含关键上下文</span></span><br><span class="line">logging.basicConfig(</span><br><span class="line">    level=logging.INFO,</span><br><span class="line">    <span class="built_in">format</span>=<span class="string">&quot;%(asctime)s - %(name)s - %(levelname)s - %(message)s&quot;</span>,</span><br><span class="line">    handlers=[logging.FileHandler(<span class="string">&quot;app.log&quot;</span>), logging.StreamHandler()]</span><br><span class="line">)</span><br><span class="line">logger = logging.getLogger(<span class="string">&quot;system_design&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">validate_user_input</span>(<span class="params">input_data: <span class="type">Dict</span></span>) -&gt; <span class="built_in">bool</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;验证用户输入，异常时记录详细日志&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">if</span> <span class="string">&quot;email&quot;</span> <span class="keyword">not</span> <span class="keyword">in</span> input_data:</span><br><span class="line">        <span class="comment"># 记录“缺失字段”的异常日志，包含输入详情（脱敏敏感信息）</span></span><br><span class="line">        logger.error(</span><br><span class="line">            <span class="string">&quot;User input validation failed: missing &#x27;email&#x27; field. &quot;</span></span><br><span class="line">            <span class="string">&quot;Input (masked): %s&quot;</span>,</span><br><span class="line">            &#123;k: v <span class="keyword">for</span> k, v <span class="keyword">in</span> input_data.items() <span class="keyword">if</span> k != <span class="string">&quot;password&quot;</span>&#125;  <span class="comment"># 脱敏密码</span></span><br><span class="line">        )</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    <span class="keyword">if</span> <span class="string">&quot;@&quot;</span> <span class="keyword">not</span> <span class="keyword">in</span> input_data[<span class="string">&quot;email&quot;</span>]:</span><br><span class="line">        logger.warning(</span><br><span class="line">            <span class="string">&quot;User input validation warning: invalid email format. &quot;</span></span><br><span class="line">            <span class="string">&quot;Email: %s&quot;</span>,</span><br><span class="line">            input_data[<span class="string">&quot;email&quot;</span>]</span><br><span class="line">        )</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 监控指标：统计请求量、错误率、延迟（含p95/p99）</span></span><br><span class="line"><span class="comment"># 初始化Prometheus指标</span></span><br><span class="line">REQUEST_COUNT = Counter(</span><br><span class="line">    <span class="string">&quot;http_requests_total&quot;</span>, </span><br><span class="line">    <span class="string">&quot;Total number of HTTP requests&quot;</span>,</span><br><span class="line">    [<span class="string">&quot;endpoint&quot;</span>, <span class="string">&quot;method&quot;</span>, <span class="string">&quot;status_code&quot;</span>]</span><br><span class="line">)</span><br><span class="line">REQUEST_LATENCY = Histogram(</span><br><span class="line">    <span class="string">&quot;http_request_duration_seconds&quot;</span>,</span><br><span class="line">    <span class="string">&quot;Duration of HTTP requests in seconds&quot;</span>,</span><br><span class="line">    [<span class="string">&quot;endpoint&quot;</span>],</span><br><span class="line">    buckets=[<span class="number">0.1</span>, <span class="number">0.3</span>, <span class="number">0.5</span>, <span class="number">1.0</span>, <span class="number">3.0</span>, <span class="number">5.0</span>]  <span class="comment"># 桶边界：用于计算p95/p99</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 监控装饰器：统计请求指标</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">monitor_request</span>(<span class="params">endpoint</span>):</span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">decorator</span>(<span class="params">func</span>):</span><br><span class="line">        <span class="keyword">def</span> <span class="title function_">wrapper</span>(<span class="params">*args, **kwargs</span>):</span><br><span class="line">            start_time = time()</span><br><span class="line">            status_code = <span class="number">200</span></span><br><span class="line">            </span><br><span class="line">            <span class="keyword">try</span>:</span><br><span class="line">                <span class="comment"># 执行实际请求处理函数</span></span><br><span class="line">                result = func(*args, **kwargs)</span><br><span class="line">                <span class="keyword">return</span> result</span><br><span class="line">            <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">                status_code = <span class="number">500</span></span><br><span class="line">                <span class="keyword">raise</span> e</span><br><span class="line">            <span class="keyword">finally</span>:</span><br><span class="line">                <span class="comment"># 记录请求耗时</span></span><br><span class="line">                latency = time() - start_time</span><br><span class="line">                REQUEST_LATENCY.labels(endpoint=endpoint).observe(latency)</span><br><span class="line">                <span class="comment"># 记录请求计数</span></span><br><span class="line">                REQUEST_COUNT.labels(</span><br><span class="line">                    endpoint=endpoint,</span><br><span class="line">                    method=kwargs.get(<span class="string">&quot;method&quot;</span>, <span class="string">&quot;GET&quot;</span>),</span><br><span class="line">                    status_code=status_code</span><br><span class="line">                ).inc()</span><br><span class="line">        <span class="keyword">return</span> wrapper</span><br><span class="line">    <span class="keyword">return</span> decorator</span><br><span class="line"></span><br><span class="line"><span class="comment"># 示例：用装饰器监控“用户注册”接口</span></span><br><span class="line"><span class="meta">@monitor_request(<span class="params">endpoint=<span class="string">&quot;/api/register&quot;</span></span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">handle_register_request</span>(<span class="params">method: <span class="built_in">str</span>, data: <span class="type">Dict</span></span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> validate_user_input(data):</span><br><span class="line">        <span class="keyword">return</span> &#123;<span class="string">&quot;status&quot;</span>: <span class="string">&quot;error&quot;</span>&#125;, <span class="number">422</span></span><br><span class="line">    <span class="comment"># 实际注册逻辑：create_user(data)</span></span><br><span class="line">    <span class="keyword">return</span> &#123;<span class="string">&quot;status&quot;</span>: <span class="string">&quot;success&quot;</span>&#125;, <span class="number">201</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动Prometheus暴露端口（默认9090）</span></span><br><span class="line">start_http_server(<span class="number">9090</span>)</span><br></pre></td></tr></table></figure><h2 id="十、容错设计：熔断、重试与优雅失败">十、容错设计：熔断、重试与优雅失败<a title="#十、容错设计：熔断、重试与优雅失败" href="#十、容错设计：熔断、重试与优雅失败"></a></h2><p>系统故障不可避免，关键在于 “故障发生时减少影响范围”：</p><ul><li><p>重试的局限性与熔断的必要性</p><ul><li>避免盲目重试：若服务已返回 5xx 错误，盲目重试会增加服务负载，加剧故障严重程度。</li><li>熔断机制的作用：对高流量 API，若连续收到大量 5xx 错误，应暂时停止发送请求（如暂停 30 秒），为服务预留恢复时间。</li><li>写请求重试的注意事项：需使用 “幂等键（Idempotency Key）”—— 在请求中携带唯一 UUID，服务执行后存储该键；若收到相同键的请求，直接忽略，避免重复执行（如 “给用户计费” 请求返回 5xx，无法确定是否已计费，幂等键可防止重复扣费）。</li></ul></li><li><p>优雅失败：开放与关闭的权衡</p><ul><li>当部分系统故障时，需决策 “是否允许请求通过”：<ul><li>失败开放（Fail Open）：故障时放请求通过。例如限流系统依赖的 Redis 不可用，暂时允许所有请求 —— 避免限流故障引发用户可见问题。</li><li>失败关闭（Fail Closed）：故障时拒绝请求。例如认证服务不可用，直接返回 401—— 宁可不允许合法用户访问，也不能泄露他人数据。</li></ul></li><li>多数场景无标准答案，需结合业务风险权衡。</li></ul></li></ul><h3 id="代码示例：熔断与幂等性设计（python+tenacity）">代码示例：熔断与幂等性设计（Python+tenacity）<a title="#代码示例：熔断与幂等性设计（python+tenacity）" href="#代码示例：熔断与幂等性设计（python+tenacity）"></a></h3><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> tenacity <span class="keyword">import</span> retry, stop_after_attempt, wait_exponential, retry_if_exception_type</span><br><span class="line"><span class="keyword">from</span> tenacity.before_sleep <span class="keyword">import</span> before_sleep_log</span><br><span class="line"><span class="keyword">from</span> circuitbreaker <span class="keyword">import</span> CircuitBreaker, CircuitBreakerError</span><br><span class="line"><span class="keyword">import</span> logging</span><br><span class="line"><span class="keyword">import</span> requests</span><br><span class="line"><span class="keyword">import</span> uuid</span><br><span class="line"></span><br><span class="line">logger = logging.getLogger(<span class="string">&quot;fault_tolerance&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 1. 熔断机制：使用circuitbreaker库，连续5次失败则熔断30秒</span></span><br><span class="line"><span class="meta">@CircuitBreaker(<span class="params">failure_threshold=<span class="number">5</span>, recovery_timeout=<span class="number">30</span>, fallback_function=<span class="literal">None</span></span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">call_external_payment_service</span>(<span class="params">amount: <span class="built_in">float</span>, user_id: <span class="built_in">str</span></span>) -&gt; <span class="type">Dict</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;调用外部支付服务，熔断保护避免服务过载&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        response = requests.post(</span><br><span class="line">            <span class="string">&quot;https://payment-service.example.com/charge&quot;</span>,</span><br><span class="line">            json=&#123;</span><br><span class="line">                <span class="string">&quot;user_id&quot;</span>: user_id,</span><br><span class="line">                <span class="string">&quot;amount&quot;</span>: amount,</span><br><span class="line">                <span class="comment"># 幂等键：确保重复请求不会重复扣费（UUID唯一）</span></span><br><span class="line">                <span class="string">&quot;idempotency_key&quot;</span>: <span class="built_in">str</span>(uuid.uuid4())</span><br><span class="line">            &#125;,</span><br><span class="line">            timeout=<span class="number">5.0</span></span><br><span class="line">        )</span><br><span class="line">        response.raise_for_status()  <span class="comment"># 触发HTTP错误（4xx/5xx）</span></span><br><span class="line">        <span class="keyword">return</span> response.json()</span><br><span class="line">    <span class="keyword">except</span> requests.exceptions.RequestException <span class="keyword">as</span> e:</span><br><span class="line">        logger.error(<span class="string">f&quot;Payment service call failed: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="keyword">raise</span>  <span class="comment"># 抛出异常，让熔断器计数</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 重试机制：仅对特定异常重试，且指数退避（避免瞬时故障）</span></span><br><span class="line"><span class="meta">@retry(<span class="params"></span></span></span><br><span class="line"><span class="params"><span class="meta">    stop=stop_after_attempt(<span class="params"><span class="number">3</span></span>),  <span class="comment"># 最多重试3次</span></span></span></span><br><span class="line"><span class="params"><span class="meta">    wait=wait_exponential(<span class="params">multiplier=<span class="number">1</span>, <span class="built_in">min</span>=<span class="number">1</span>, <span class="built_in">max</span>=<span class="number">10</span></span>),  <span class="comment"># 指数退避：1s→2s→4s</span></span></span></span><br><span class="line"><span class="params"><span class="meta">    retry=retry_if_exception_type(<span class="params">(<span class="params">requests.exceptions.Timeout, requests.exceptions.ConnectionError</span>)</span>),</span></span></span><br><span class="line"><span class="params"><span class="meta">    before_sleep=before_sleep_log(<span class="params">logger, logging.WARNING</span>)  <span class="comment"># 重试前打印日志</span></span></span></span><br><span class="line"><span class="params"><span class="meta"></span>)</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">call_retryable_service</span>(<span class="params">api_url: <span class="built_in">str</span></span>) -&gt; <span class="type">Dict</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;调用可重试服务（如读请求），仅对超时/连接异常重试&quot;&quot;&quot;</span></span><br><span class="line">    response = requests.get(api_url, timeout=<span class="number">3.0</span>)</span><br><span class="line">    response.raise_for_status()</span><br><span class="line">    <span class="keyword">return</span> response.json()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3. 优雅失败：限流系统Redis故障时的策略选择</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">check_rate_limit</span>(<span class="params">user_id: <span class="built_in">str</span></span>) -&gt; <span class="built_in">bool</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;检查用户是否触发限流，Redis故障时选择“失败开放”&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="comment"># 正常逻辑：从Redis获取用户请求计数</span></span><br><span class="line">        redis_key = <span class="string">f&quot;rate_limit:<span class="subst">&#123;user_id&#125;</span>&quot;</span></span><br><span class="line">        current_count = redis_client.incr(redis_key)</span><br><span class="line">        <span class="keyword">if</span> current_count == <span class="number">1</span>:</span><br><span class="line">            redis_client.expire(redis_key, <span class="number">60</span>)  <span class="comment"># 1分钟窗口</span></span><br><span class="line">        <span class="keyword">return</span> current_count &lt;= <span class="number">100</span>  <span class="comment"># 限流阈值：1分钟100次</span></span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        logger.error(<span class="string">f&quot;Rate limit Redis failed: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="comment"># 失败开放策略：Redis故障时允许请求通过（避免用户无法使用服务）</span></span><br><span class="line">        <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 4. 认证服务故障时的“失败关闭”策略</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">authenticate_user</span>(<span class="params">token: <span class="built_in">str</span></span>) -&gt; <span class="built_in">bool</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;验证用户token，认证服务故障时拒绝访问&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="comment"># 正常逻辑：调用认证服务验证token</span></span><br><span class="line">        response = requests.post(</span><br><span class="line">            <span class="string">&quot;https://auth-service.example.com/verify&quot;</span>,</span><br><span class="line">            json=&#123;<span class="string">&quot;token&quot;</span>: token&#125;,</span><br><span class="line">            timeout=<span class="number">2.0</span></span><br><span class="line">        )</span><br><span class="line">        <span class="keyword">return</span> response.json().get(<span class="string">&quot;valid&quot;</span>, <span class="literal">False</span>)</span><br><span class="line">    <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line">        logger.error(<span class="string">f&quot;Auth service failed: <span class="subst">&#123;<span class="built_in">str</span>(e)&#125;</span>&quot;</span>)</span><br><span class="line">        <span class="comment"># 失败关闭策略：认证服务故障时拒绝访问（避免数据泄露）</span></span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br></pre></td></tr></table></figure><h2 id="十一、总结：好设计的本质是-“平淡”">十一、总结：好设计的本质是 “平淡”<a title="#十一、总结：好设计的本质是-“平淡”" href="#十一、总结：好设计的本质是-“平淡”"></a></h2><p>本文未覆盖微服务拆分、容器 / VM 选择、链路追踪等话题 —— 要么是因为这些决策对 “系统好坏” 影响不大（如单体应用多数时候足够好），要么是太基础无需强调（如链路追踪是必备工具），要么是复杂度过高（如 API 设计需单独展开）。</p><p>核心观点始终是：好的系统设计，不是用花哨技巧，而是在正确的地方用成熟、经过验证的组件。就像优质的管道工程不会 “惊艳”—— 若操作太复杂，反而容易出现问题。</p><p>尤其在大型企业中，现成的基础设施（事件总线、缓存服务等）已足够完善，好的设计往往 “看不见”。实践中，“自定义数据结构实现关键功能” 的惊艳设计极少出现，而 “平淡的、可靠的设计”，才是支撑系统稳定运行的主流。</p>]]>
    </content>
    <id>https://blog.becase.top/post/2025082201</id>
    <link href="https://blog.becase.top/post/2025082201"/>
    <published>2025-08-22T00:00:00.000Z</published>
    <summary>
      <![CDATA[<div class="reprinted-notice" style="
  background: #f8f9fa;
  border-left: 4px solid #333;
  padding: 12px 16px;
  margin: 16px 0;
  borde]]>
    </summary>
    <title>好的系统设计：核心原则与实践指南</title>
    <updated>2026-08-04T09:27:28.572Z</updated>
  </entry>
  <entry>
    <author>
      <name>jiechen</name>
    </author>
    <category term="tech" scheme="https://blog.becase.top/categories/tech/"/>
    <category term="ai" scheme="https://blog.becase.top/categories/tech/ai/"/>
    <category term="ai" scheme="https://blog.becase.top/tags/ai/"/>
    <category term="engineering" scheme="https://blog.becase.top/tags/engineering/"/>
    <content>
      <![CDATA[<p>观视频有感：《Anthropic 的工程师们如何适应 AI 编程工具》</p><p><a href="https://www.youtube.com/watch?v=8maA13Qq540&amp;ab_channel=Coder" target="_blank">How Anthropic Engineers Are Adapting to AI Coding Agents</a></p><h2 id="产品哲学与设计巧思">产品哲学与设计巧思<a title="#产品哲学与设计巧思" href="#产品哲学与设计巧思"></a></h2><p>“改变实现方式，而非工具本身”：Jacqueline 提出的这个观点非常深刻。在推广新工具时，最好的策略不是让开发者抛弃他们熟悉的命令行或 IDE，而是在他们已有的工具链中，以一种无缝、无打扰的方式增加新功能。这极大地降低了心理排斥感。</p><p>终端是“最大公约数”：他们选择终端作为主战场，是因为这是唯一一个几乎所有后端和基础设施工程师都会高频使用的界面。这个选择本身就是“在用户所在之处满足他们”哲学的最佳体现。</p><p>为“可折腾性”而生 (Designed for Tinkerability)：Claude Code 被设计成高度可扩展和定制的。这不仅仅是一个功能，更是一种邀请，鼓励用户把它接入自己独特的环境，喂给它独特的上下文，让它从一个“通用实习生”变成一个“资深项目成员”。</p><h2 id="anthropic-内部工作流">Anthropic 内部工作流<a title="#anthropic-内部工作流" href="#anthropic-内部工作流"></a></h2><p>Claude Code 的诞生故事：它不是一个自上而下规划的产品，而是工程师 Boris 为了熟悉自家 API 发起的一个个人项目。因为太好用了，所以像涟漪一样从个人、到团队、到实验室、再到整个公司，最终在对外发布时，内部大部分技术人员已经是它的日活用户了。这种有机的、自下而上的生长路径本身就证明了它的价值。</p><p>AI 时代的 Code Review 新范式：当 AI 大量生成代码时，审查责任如何分配？Anthropic 的答案是：责任在于 PR 的作者，而非审查者。 Claude Code 通过支持“测试驱动开发”（TDD）等方式，帮助作者在提交前就建立信心。作者可以用它生成测试，或者让它截图验证前端修改，确保提交的代码质量。</p><p>鼓励“广谱实验”：内部工程师可以自由使用 Claude Code、GitHub Copilot 甚至其他创业公司的 AI 工具。他们鼓励大家用 AI 去挑战非常困难的任务，因为只有在 pushing the boundary 的时候，你才能真正发现 AI 的惊人能力，比如给它一个晦涩的 GCP 堆栈跟踪，它能立刻看懂并修复，直接节省4小时。</p><p>Jacqueline 的黑客马拉松亲身经历：她在一个自己完全不熟悉的语言和代码库上，仅用了一天时间，就借助 Claude 做出了一个可以工作的演示。这是“从文档到演示”理念最有说服力的真人案例。</p><p>研究员与工程师的“统一战线”：在 Anthropic，研究员和工程师为同一个代码库（monorepo）贡献代码，使用相同的开发环境和工具集。这意味着对工具（比如 CLAUDE md）的任何投资和优化，都能让所有人受益，实现了规模效应。</p><h2 id="高阶玩法与最佳实践">高阶玩法与最佳实践<a title="#高阶玩法与最佳实践" href="#高阶玩法与最佳实践"></a></h2><p>“多 Claude”详解：</p><p>目的：并行处理多个独立任务。<br>最佳实践：最好在不重叠的仓库中实例化多个 Claude，或者使用 GitHub worktrees、直接 git clone 多份等方式，避免多个代理修改同一份文件造成冲突和混乱。<br>认知极限：Ben 和 Cat 提到，3个claude进程是普通人的“甜点位”，有人能同时驾驭 6 个，甚至有人跑 12 个（可能是异步运行）。</p><p>“多 Claude” vs “子代理”：</p><p>多 Claude：用于处理多个不同的独立任务。<br>子代理：用于加速同一个核心任务，通过并行处理或引入不同视角（安全、产品等）来提升效率和质量。</p><p>如何让 Claude 更懂你的代码库：</p><p>通用原则：如果一个人类新员工能轻松看懂你的代码库（文档齐全、命名清晰、抽象合理），那 Claude 就能做得很好。反之，如果代码库里到处都是需要“祖传知识”才能理解的坑，Claude 也会一样懵。<br>处理多仓库依赖：可以在包含所有相关仓库的上级目录实例化 Claude，或者使用新推出的 add dir 功能，把其他仓库的访问权限授予当前会话。</p><p>迭代式地处理复杂任务：当面对大型重构或提升测试覆盖率这类复杂任务时，不要指望一步到位。最佳策略是：先从一两个文件开始，观察 Claude 在哪里会失败，然后迭代优化你给它的指令，最后再逐步扩大规模。</p><h2 id="安全-&amp;-局限">安全 &amp; 局限<a title="#安全-&amp;-局限" href="#安全-&amp;-局限"></a></h2><p>精细化的权限系统：他们的权限系统不只是简单的“是/否”，而是拆分成了读取文件、编辑文件、搜索、执行 bash 命令等多个维度，让用户可以进行更细粒度的授权。</p><p>内置的提示注入防护：当使用网页搜索等功能时，获取到的外部内容会先经过一个分类器模型进行“安检”，判断是否存在提示注入风险，然后再交给主代理。</p><p>公开承认的失败与教训：</p><ul><li>他们曾尝试让 Claude Code 自动创建大量 PR，结果造成了内部的“信息垃圾 (spam)”，后来不得不调整限制。</li><li>有一长串功能已经构建出来了，但因为觉得模型成功率还不够高，最终没有发布。他们对开发者的“垃圾信息敏感度”有清醒的认识。</li></ul><p>对“代码品味”的思考：Kyle 问 AI 何时能达到 100% 自动编程，Cat 认为很多不是原始“智能”的问题，而是**产品和“代码品味”**的问题。模型需要看到更多元、更优秀的代码库来学习，而不是简单地增加上下文窗口长度。</p><p>异步运行的取舍：Jacqueline 提到她会通过 Slack 异步触发一些 Claude Code 任务，让它们在后台无人监督地运行。这样做的好处是能并行处理更多任务，但代价是结果的方差会更大，不一定能成功。这是一个典型的效率与可控性之间的权衡。</p><h2 id="未来规划">未来规划<a title="#未来规划" href="#未来规划"></a></h2><p>迈向“主动式”代理：未来的 Claude Code 不仅是被动地等你下命令，更希望能变得主动 (proactive)。它能读取你和你队友所有的历史会话，从中提取见解，甚至能主动维护一个 CLAUDE md 文件，成为团队知识的沉淀者和管理者。</p><p>成为开发者的“信息中枢”：未来的方向是让 Claude Code 能访问开发者能接触到的一切信息——Slack, Jira, PRD, 工程规范, 客户支持工单等等。上下文越完整，代理的能力就越强。</p><p>赋能开发者构建自己的代理：他们会大力投入 SDK 的建设，确保其功能与 CLI 体验对齐，最终目标是让所有开发者都能灵活、强大地构建出满足自己需求的、千奇百怪的 AI 代理。</p>]]>
    </content>
    <id>https://blog.becase.top/post/2025080411</id>
    <link href="https://blog.becase.top/post/2025080411"/>
    <published>2025-08-04T00:00:00.000Z</published>
    <summary>
      <![CDATA[<p>观视频有感：《Anthropic 的工程师们如何适应 AI 编程工具》</p>
<p><a href="https://www.youtube.com/watch?v=8maA13Qq540&amp;ab_channel=Coder" target="_blank">How]]>
    </summary>
    <title>Claude Code 背后的设计思考</title>
    <updated>2026-08-04T09:27:28.572Z</updated>
  </entry>
  <entry>
    <author>
      <name>jiechen</name>
    </author>
    <content>
      <![CDATA[<p>通缩比通胀可怕，通缩是会死人的</p><p>1933年，经历了大萧条，和个人破产的欧文·费雪提出了“债务-通缩理论”：当物价持续下跌时，债务的实际负担会急剧放大。因为货币购买力增强，借款人需用更多“值钱”的钱来还债，导致破产潮涌现，企业清算、失业激增，进一步压低需求，形成恶性循环。</p><p>这就是著名的“通缩螺旋”：消费延迟，因为人们预期明天更便宜；投资停滞，因为回报率不确定；工资下降，因为企业利润蒸发。最终，整个经济体如一艘漏水的船，沉没在绝望的深渊中。</p><p>中国目前的情况，和费雪的通缩的9个环节，一毛一样（如表）。</p><p><img src="https://cdn.jsdelivr.net/gh/jiechen257/personal-gallery@main/img/20251125162254083.png" alt="" loading="lazy" class="φbp"></p><p>面对如此清晰的病症，任何理性的医生都会开出同样的药方：需求不足，就刺激需求。</p><p>诺贝尔奖得主保罗·克鲁格曼称中国领导层“匪夷所思地不愿意”转向内需 。<br>国内外的几乎所有的经济学家观点几乎都一致：中国经济的核心症结，在于居民消费占GDP的比重过低，家庭收入分到的蛋糕太小 。</p><p>诊断如此明确，治疗方案也本该如此。然而，我们看到的却是堪称荒诞的“疗法”。<br>官方的药方是“供给侧结构性改革” 。这好比试图通过给一个饥肠辘辘的人换一口更先进的锅，来解决他的饥饿问题。<br>向一个需求枯竭的经济体注入更多供给——无论是光伏、电动车还是别的什么“新质生产力”——只会加剧通缩的泥潭，并将过剩产能的祸水引向全世界 。</p><p>这种看似不理性的政策背后，是极其理性但残酷的政治算计。<br>因为中国过去几十年的增长模式，其根基就是通过压低利率（惩罚储户）、压低工资和薄弱的社会保障（迫使民众储蓄），系统性地将财富从家庭部门转移到生产部门（尤其是国有企业和地方政府）。</p><p>因此，真正的结构性改革——即提高居民收入、建立强大的社会安全网——意味着要彻底颠覆这一权力与利益的分配格局。它意味着地方政府将失去大搞形象工程的资金，国有企业再也无法享受廉价资本的盛宴。中央政府可能要防宽对经济政策的控制。</p><p>这并非一次经济政策的调整，而是一场权力的再分配。政府之所以迟迟不愿给奄奄一息的需求侧“喂药”，是因为这药会损害国家利维坦的根基。</p><p>他们宁愿牺牲民营部门，也要保卫国家部门的利益堡垒。所谓“供给侧改革”而不进行“需求侧改革”，说到底，不过是为了避免彻底的“体制改革”，保护既得利益者的防火墙。</p>]]>
    </content>
    <id>https://blog.becase.top/post/2025073010</id>
    <link href="https://blog.becase.top/post/2025073010"/>
    <published>2025-07-30T00:00:00.000Z</published>
    <summary>
      <![CDATA[<p>通缩比通胀可怕，通缩是会死人的</p>
<p>1933年，经历了大萧条，和个人破产的欧文·费雪提出了“债务-通缩理论”：当物价持续下跌时，债务的实际负担会急剧放大。因为货币购买力增强，借款人需用更多“值钱”的钱来还债，导致破产潮涌现，企业清算、失业激增，进一步压低需求，形成]]>
    </summary>
    <title>中国的通缩危机</title>
    <updated>2026-08-04T09:27:28.568Z</updated>
  </entry>
  <entry>
    <author>
      <name>jiechen</name>
    </author>
    <content>
      <![CDATA[<p>背景文章链接：</p><p><a href="https://maalvika.substack.com/p/being-too-ambitious-is-a-clever-form" target="_blank">being too ambitious is a clever form of self-sabotage</a></p><ul><li><p>文章逻辑概括</p><p>文章遵循 “提出问题→分析原因→论证解法→总结呼吁” 的逻辑，层层递进：</p><ol><li><strong>现象引入</strong>：先描绘 “创作前的完美想象”，点出其虚幻本质 —— 想象中的完美会阻碍行动。</li><li><strong>问题深挖</strong>：分析 “想象与现实的差距” 为何产生：人类独有的 “品味 - 技能差异”+ 大脑的 “目标替代” 机制 + 技术时代的 “完美幻象”，共同导致人们逃避实践。</li><li><strong>反常识论证</strong>：通过摄影实验、作者经历等证明：“数量积累”（反复实践）比 “完美计划” 更有效，因为实践能让人在失败中学习、在调整中接近目标。</li><li><strong>解决方案</strong>：提出 “降低期待”“直面放弃点”“做中学”—— 接纳不完美，用持续行动替代空想，才能让想象落地。</li><li><strong>总结</strong>：人类的 “诅咒”（被完美愿景折磨）亦是 “天赋”（敢于想象超越能力的未来），而连接想象与现实的唯一方式，是 “放下完美执念，动手实践”。</li></ol></li></ul><p>在佛罗里达大学的摄影课堂上，杰瑞・尤尔斯曼（Jerry Uelsmann）无意间设计了一个堪称完美的实验，让人们得以窥见 “卓越” 的本质。他将学生分成了两组。</p><p><strong>数量组</strong>的评分标准完全取决于产出量：拍够 100 张照片得 A，90 张得 B，80 张得 C，以此类推。</p><p>而<strong>质量组</strong>只需提交一张 “完美” 的照片即可。</p><p>学期结束时，所有脱颖而出的优秀作品都来自数量组。</p><p>数量组领悟了一些无法通过课堂传授的道理：卓越源于与不完美的深度碰撞，精通是在与失败的不断周旋中铸就的，创造一件完美事物的道路，必然要先踏过无数不完美的尝试。</p><p>不妨想想那 100 次尝试的真正意义：那是 100 次与光线的对话，100 次构图的实验，100 次直面 “意图与结果差距” 并调整的机会，更是 100 次发现 “现实对愿景的反馈往往比最初的计划更有趣” 的契机。</p><p>与此同时，质量组在整个学期都深陷 “理论炼狱”—— 分析完美的照片，研究理想的构图，探究最优的技巧。他们积累了丰富的摄影知识，却始终没能获得那种 “唯有反复按下快门并承担结果才能沉淀的实践智慧”。</p><p>当数量组在真实的 “领土” 上探索时，质量组成了精通 “地图” 的专家。学期结束时，质量组能告诉你一张好照片 “为什么好”，而数量组早已能拍出好照片。</p><blockquote><p>胶片不在乎他们的意图，只回应他们按下快门的意愿</p></blockquote><h1 id="相关论点">相关论点<a title="#相关论点" href="#相关论点"></a></h1><h2 id="想象与现实的差距"><strong>想象与现实的差距</strong><a title="#想象与现实的差距" href="#想象与现实的差距"></a></h2><p>鸟儿筑巢时，不会先构思完美巢穴再为树枝泥土的不足而苦恼；蜘蛛织网时，不会因超出能力的几何完美幻象而停滞。但人类呢？我们拥有一种奇特的天赋：被 “未来可能” 的愿景纠缠，被抱负与能力的差距折磨。</p><p>认知科学给这种折磨起了个名字：“品味 - 技能差异”。你的品味（识别品质的能力）总是比技能（创造品质的能力）发展得更快。这就造成了伊拉・格拉斯（Ira Glass）所说的 “差距”，而我认为，这正是创造者与消费者的分野。</p><p>观察孩子画画时你会发现，他们无所畏惧、毫无顾忌，因为还没被 “高雅品味” 的魔咒缠身。他们画紫色的树、飞翔的大象，自信得仿佛从未有人告诉他们 “树不是紫色的，大象不会飞”。但到了八九岁，品味会像严厉的批评家突然降临，差距就此拉开。孩子会发现，自己的画根本达不到正在成形的审美标准 —— 那个不可能实现的标准。</p><p>这就是我们大多数人放弃绘画的原因：并非缺乏天赋，而是因为在培养执行能力之前，就先掌握了判断能力。我们成了自身不足的鉴赏家。</p><p>而我们的大脑在绝望中，会设计出一种优雅的逃避方式。面对这难以承受的差距，我们发展出研究人员所说的 “有效回避”—— 忙着计划、研究、幻想，却回避创造具体事物的脆弱行为（毕竟可能失败）。这感觉像在工作，因为它调动了所有智力；但本质是逃避，因为它帮我们躲开了创造不完美之物的恐惧。我见过想创业的人循环播放播客，想做抖音博主的人把几小时看视频称为 “研究”，想写小说的人花数年构思人物背景却从未动笔。</p><p>蜘蛛不会有这种问题。它按古老的基因指令织网，每张都和上一张惊人地相似。但人类的创造力，要求我们在 “能想象的” 与 “能做到的” 之间的危险地带穿行。我们被完美愿景的诅咒缠绕，又被 “向完美靠近的失败能力” 所祝福。</p><h2 id="大脑的-“自我欺骗”"><strong>大脑的 “自我欺骗”</strong><a title="#大脑的-“自我欺骗”" href="#大脑的-“自我欺骗”"></a></h2><p>当你想象达成某件事时，大脑激活的神经奖励回路，和真正达成时一模一样。这就产生了神经科学家所说的 “目标替代”—— 大脑开始把 “计划” 当作 “完成”。计划之所以让人满足，从神经机制来说，是真的会带来满足感。你从想象的成就中获得了实实在在的快感。</p><p>但有趣的是，这种神经特性在某些场景中助我们一臂之力，在另一些场景中却会毁了我们。奥运选手想象训练流程时，会建立提升实际表现的神经通路 —— 他们用想象力强化已有的能力；外科医生在脑海中演练复杂手术，是在优化多年积累的技能。</p><p>可当想象力取代实践而非强化实践时，同样的机制就成了陷阱。胸怀抱负的小说家花数月构思完美大纲，和花数月实际写作的小说家，获得的神经奖励并无二致。大脑分不清 “有效准备” 和 “精心拖延”。</p><h2 id="技术时代的-“完美幻象”"><strong>技术时代的 “完美幻象”</strong><a title="#技术时代的-“完美幻象”" href="#技术时代的-“完美幻象”"></a></h2><p>注意力的算法机制不仅制造了简单的比较，还似乎抹去了成就精通的过程。一段创作杰作的延时视频能获百万播放，而记录第一百次平庸尝试的实时视频，却在算法中销声匿迹。</p><p>Instagram 展示的是完成的画作，而非失败的色彩实验；TikTok 呈现的是完美表演，而非千百次不完美的排练；LinkedIn 推送的是晋升公告，而非多年平淡的技能积累。</p><p>事实是，每件杰作都存在于 “次等作品构成的隐形生态” 中。伟大的画作源于数百次研究、草图和失败尝试；精彩的书籍成长于多年平庸的写作；突破性创新建立在无数小改进和局部失败之上。我们看到橡树，却看不到橡子；听到交响乐，却听不到音阶练习；惊叹杰作，却看不到学徒期的笨拙。</p><h2 id="直面“放弃点”"><strong>直面</strong>“放弃点”<a title="#直面“放弃点”" href="#直面“放弃点”"></a></h2><p>对那些勇敢开始的人来说，开始只是第一个挑战。真正的考验在 “放弃点”—— 最初的兴奋褪去，工作露出真实面貌的必然时刻。</p><p>每个人的放弃点各不相同，但它总会到来。对作家来说，可能是小说写到第 30 页时，最初的灵感耗尽，突然不知道接下来该写什么；对创业者来说，可能是最初几个月后，市场反应远不如亲友热烈；对艺术家来说，可能是第一次客观看待自己的作品，惊觉愿景与现有能力的巨大差距。</p><p>这正是数量组与质量组的分野：不在开始，而在中途 —— 当工作不再有趣，开始变成 “苦差事” 的时刻。</p><p>数量组在这时有个优势：他们早已习惯与不完美共处。他们明白每次尝试都是数据，而非审判。他们培养了心理学家所说的 “任务导向” 而非 “自我导向”—— 专注于改进工作，而非维护自我形象。</p><p>而质量组面对这一刻的心态完全不同。他们花了太多时间制定完美计划，会把早期挣扎解读为 “出了问题”。他们期望工作能验证愿景，结果却只看到意图与能力的距离。</p><p>我认为大多数创意项目都死于此 —— 并非缺人才或资源，而是误解了工作的本质。放弃点的感觉像失败，但实际上，真正的工作才刚刚开始。</p>]]>
    </content>
    <id>https://blog.becase.top/post/2025071809</id>
    <link href="https://blog.becase.top/post/2025071809"/>
    <published>2025-07-18T00:00:00.000Z</published>
    <summary>
      <![CDATA[<p>背景文章链接：</p>
<p><a href="https://maalvika.substack.com/p/being-too-ambitious-is-a-clever-form" target="_blank">being too ambitious is a cl]]>
    </summary>
    <title>好高骛远是一种巧妙的自我毁灭</title>
    <updated>2026-08-04T09:27:28.568Z</updated>
  </entry>
  <entry>
    <author>
      <name>jiechen</name>
    </author>
    <content>
      <![CDATA[<p>最近整理了下自己看过的电视剧</p><p>发现老友记或者请回答 1988 那种，三五好友的朋友生活</p><p>是我所期望，并且过得舒适的</p><p>可奇怪的是 我当下没有个所谓的生活朋友圈</p><p>我没有那种微信群 里面的人聊的是各种的生活常态</p><p>（游戏群倒是有）</p><p>所以我突然想维护这样一个圈子</p><p>这样到了中年</p><p>哪怕自己没有孩子</p><p>生活也不会枯燥 可以串门</p><ul><li><p>因为你只要看过老友记或者机智的医生生活那种</p><p>你就知道 形态各异的几个朋友相处在一起</p><p>生活多么有意思</p></li></ul><hr><p>就比如一个点</p><p>你们周末 完全可以聚在一个人家里 一块做饭 玩桌游 或者相约出去玩</p><p>这个前提就是 你们是合拍的</p><p>如果彼此不共鸣 那在一起会发生很多意见</p><p>然后根据自己的经验来看</p><p>富有分享欲 + 随意型人格 + 说话不犀利</p><p>是这个圈子里的人的共性</p><hr><p>再举个例子</p><p>你今天上班 突然遇到了莫名其妙的事情 或者瓜</p><p>你这时候如果很想说给别人听</p><p>但又处于拔剑四顾心茫然的状态</p><p>那很有可能 你就是需要一个这种小圈子</p><p>互相吃瓜</p><hr><p>这种需要长期来维护</p><p>就是群里不能说有潜水的</p><p>我以前试图发展室友成这样的关系</p><p>所以我那会儿去北京的时候 特喜欢找合租的</p><p>去到一个人生地不熟的地方；能够以崭新的姿态去认识新伙伴 接触新生活</p><p>简直像游戏里面的重开一样</p><p>social 属性突然大爆发</p><hr><p>这种圈子有个好处</p><p>就是告诉你 你时刻还是为了你自己生活（而不是在成家之后变成了为家庭而活）</p><p>因为你时刻还有一帮子朋友 知晓你的过去现在 一起走未来</p><p>胜者举杯相庆 败者拼死相救</p>]]>
    </content>
    <id>https://blog.becase.top/post/2025060908</id>
    <link href="https://blog.becase.top/post/2025060908"/>
    <published>2025-06-09T00:00:00.000Z</published>
    <summary>
      <![CDATA[<p>最近整理了下自己看过的电视剧</p>
<p>发现老友记或者请回答 1988 那种，三五好友的朋友生活</p>
<p>是我所期望，并且过得舒适的</p>
<p>可奇怪的是 我当下没有个所谓的生活朋友圈</p>
<p>我没有那种微信群 里面的人聊的是各种的生活常态</p>
<p]]>
    </summary>
    <title>三五好友</title>
    <updated>2026-08-04T09:27:28.568Z</updated>
  </entry>
</feed>
