<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>逻辑思维 on 方糖猫Blog</title>
    <link>https://ftmao.com/blog/tags/%E9%80%BB%E8%BE%91%E6%80%9D%E7%BB%B4/</link>
    <description>AI 视频、AI Agent 与工程实践笔记</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Sun, 08 Jan 2023 10:40:00 +0800</lastBuildDate><atom:link href="https://ftmao.com/blog/tags/%E9%80%BB%E8%BE%91%E6%80%9D%E7%BB%B4/index.xml" rel="self" type="application/rss+xml" /><item>
      <title>《学会提问》×《金字塔原理》笔记：论证的双向管道——拆解别人的，搭建自己的</title>
      <link>https://ftmao.com/blog/bookstore/asking-questions-pyramid-principle-book-notes/</link>
      <pubDate>Sun, 08 Jan 2023 10:40:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/bookstore/asking-questions-pyramid-principle-book-notes/</guid>
      <description>&lt;h1 id=&#34;学会提问金字塔原理笔记论证的双向管道拆解别人的搭建自己的&#34;&gt;《学会提问》×《金字塔原理》笔记：论证的双向管道——拆解别人的，搭建自己的&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;目标读者：每天要读技术文章、评审同事方案、听汇报做判断，同时要写设计文档、做复盘、向上汇报的工程师。
参考书籍：M. Neil Browne &amp;amp; Stuart M. Keeley《学会提问》（Asking the Right Questions: A Guide to Critical Thinking，批判性思维经典教材，多次再版）；Barbara Minto《金字塔原理》（The Minto Pyramid Principle，麦肯锡的写作与思考方法论）。
阅读目标：不逐章抄书，而是把两本书合成一条「论证双向管道」——《学会提问》管输入，教我把别人递过来的论证拆开检查；《金字塔原理》管输出，教我把自己的论证搭得让人一听就懂。一个向内防御，一个向外进攻。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一为什么这两本要一起读&#34;&gt;一、为什么这两本要一起读&lt;/h2&gt;
&lt;p&gt;单独看，这两本书毫不相干：一本是美国大学的批判性思维教材，一本是麦肯锡顾问的写作手册。但把工程师的一天摊开看，会发现我们做的事只有两类：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;输入侧&lt;/strong&gt;：读公众号的&amp;quot;某某技术已死&amp;quot;、听同事说&amp;quot;这个方案肯定扛不住&amp;quot;、看复盘报告里的&amp;quot;根因是网络抖动&amp;quot;——这些都是别人递过来的&lt;strong&gt;论证&lt;/strong&gt;，需要判断信不信。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输出侧&lt;/strong&gt;：写技术方案、写故障复盘、做晋升答辩、在会上汇报进展——这些都是自己递出去的&lt;strong&gt;论证&lt;/strong&gt;，需要让人听懂、被说服。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;《学会提问》是输入侧的安检仪，《金字塔原理》是输出侧的打包机。只装安检仪的人会变得只会挑刺、自己写东西照样一塌糊涂；只装打包机的人会把没经验证的结论包装得漂漂亮亮——这比不包装更危险，因为说服力变强了，错的也更像对的。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    IN[&amp;#34;外部论证&amp;lt;br/&amp;gt;技术文章、同事观点&amp;lt;br/&amp;gt;复盘结论、行业报告&amp;#34;] --&amp;gt; A[&amp;#34;输入侧安检&amp;lt;br/&amp;gt;《学会提问》&amp;lt;br/&amp;gt;批判性拆解&amp;#34;]
    A --&amp;gt; SELF[&amp;#34;自己站得住的判断&amp;#34;]
    SELF --&amp;gt; B[&amp;#34;输出侧打包&amp;lt;br/&amp;gt;《金字塔原理》&amp;lt;br/&amp;gt;结构化搭建&amp;#34;]
    B --&amp;gt; OUT[&amp;#34;自己的论证&amp;lt;br/&amp;gt;设计文档、评审意见&amp;lt;br/&amp;gt;复盘报告、晋升答辩&amp;#34;]
    style A fill:#e8f4e8
    style B fill:#e8f4e8&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;下面的顺序也按这条管道走：先学拆（防御），再学搭（进攻），最后讲两者怎么在工程现场合流。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二学会提问的起点淘金式思维与强势批判&#34;&gt;二、《学会提问》的起点：淘金式思维与强势批判&lt;/h2&gt;
&lt;p&gt;这本书开篇先解决的不是技巧，而是姿势。它区分了两组对立概念，我觉得这是全书的地基。&lt;/p&gt;
&lt;h3 id=&#34;21-海绵式思维-vs-淘金式思维&#34;&gt;2.1 海绵式思维 vs 淘金式思维&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;海绵式思维&lt;/strong&gt;是被动的：像海绵吸水一样把读到的东西全部吸收，记得很多，但不做取舍。它的收益是知识量，代价是——&lt;strong&gt;最后读到什么就信什么&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;淘金式思维&lt;/strong&gt;是主动的：带着问题读，边读边和作者互动——&amp;ldquo;你的结论是什么？凭什么？这个证据可靠吗？有没有没说的前提？&amp;ldquo;像淘金者不断筛掉沙子，最后留下的是经过检验的判断。&lt;/p&gt;
&lt;p&gt;工程师对这个区分应该不陌生：收藏夹里几百篇&amp;quot;必读&amp;quot;文章是海绵式积累的纪念碑；而真正改变了你决策的，是那些你读到一半停下来抬杠的文章。&lt;/p&gt;
&lt;h3 id=&#34;22-弱势批判-vs-强势批判&#34;&gt;2.2 弱势批判 vs 强势批判&lt;/h3&gt;
&lt;p&gt;第二组区分更扎心。&lt;strong&gt;弱势批判性思维&lt;/strong&gt;（weak-sense）是用批判性思维来&lt;strong&gt;捍卫自己已有的观点&lt;/strong&gt;——挑对手的毛病，对自己的论证免检。它的本质是辩论赛技巧，目标是赢。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;强势批判性思维&lt;/strong&gt;（strong-sense）是把同一套检查标准&lt;strong&gt;一视同仁地用到所有论证上，包括自己的&lt;/strong&gt;。目标是逼近真相，代价是经常要亲手拆掉自己刚搭好的东西。&lt;/p&gt;
&lt;p&gt;评审会上的大部分&amp;quot;批判性思维&amp;quot;都是弱势的：对别人方案里的风险嗅觉灵敏，对自己方案里同样的风险自动失明。这本书真正值钱的动作只有一个——&lt;strong&gt;把枪口也转向自己&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三论证解剖四件套论题结论理由假设&#34;&gt;三、论证解剖四件套：论题、结论、理由、假设&lt;/h2&gt;
&lt;p&gt;《学会提问》的主体是一套解剖流程：任何一个论证（文章、演讲、方案），都按固定顺序拆成零件，逐件检查。&lt;/p&gt;
&lt;h3 id=&#34;31-先找论题和结论&#34;&gt;3.1 先找论题和结论&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;论题&lt;/strong&gt;是&amp;quot;在讨论什么&amp;rdquo;，分两类：&lt;strong&gt;描述性论题&lt;/strong&gt;（世界是什么样——&amp;ldquo;这个故障是不是缓存引起的&amp;rdquo;）和&lt;strong&gt;规定性论题&lt;/strong&gt;（世界应该是什么样——&amp;ldquo;我们应不应该上微服务&amp;rdquo;）。&lt;strong&gt;结论&lt;/strong&gt;是作者想让你接受的那个判断。&lt;/p&gt;
&lt;p&gt;这一步听起来 trivial，实际能挡掉一半无效争论：很多技术争论吵了一小时，最后发现双方论题都不同——一个在讨论&amp;quot;这个方案性能够不够&amp;rdquo;（描述性），一个在讨论&amp;quot;值不值得为这点性能加复杂度&amp;quot;（规定性）。&lt;strong&gt;找不到结论，就别评价论证&lt;/strong&gt;；论题都没对齐，就先把论题对齐。&lt;/p&gt;
&lt;h3 id=&#34;32-再找理由&#34;&gt;3.2 再找理由&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;理由&lt;/strong&gt;是支撑结论的陈述，&amp;ldquo;结论 + 理由&amp;quot;才构成一个论证。只有结论没有理由的东西是观点，不是论证，不值得认真对待——&amp;ldquo;我觉得 Go 比 Java 好&amp;quot;后面接不出&amp;quot;因为&amp;rdquo;，就是纯口味问题，不用辩。&lt;/p&gt;
&lt;p&gt;判断理由时书里提醒一个常见错位：&lt;strong&gt;别把理由当结论来引用&lt;/strong&gt;。别人给的理由链是 A 所以 B、B 所以 C，你得先弄清他最终要证的是 C 还是 B。&lt;/p&gt;
&lt;h3 id=&#34;33-挖出假设论证里没写出来的承重墙&#34;&gt;3.3 挖出假设：论证里没写出来的承重墙&lt;/h3&gt;
&lt;p&gt;理由能推出结论，往往依赖一些&lt;strong&gt;没说出口、但必须成立的前提&lt;/strong&gt;，这就是假设。书里分两种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;价值观假设&lt;/strong&gt;：在两种价值冲突时，作者默认哪一个更重要。&amp;ldquo;我们应该为了稳定性牺牲交付速度&amp;quot;背后，是一个&amp;quot;稳定性 ＞ 速度&amp;quot;的价值排序——它通常不被写出来，但整个论证压在它上面。识别方法：找一个理性的人可能持相反结论时看重什么，那就是被压住的另一种价值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;描述性假设&lt;/strong&gt;：关于世界是什么样的事实性默认。&amp;ldquo;上这套监控系统就能减少故障&amp;quot;背后，可能藏着&amp;quot;我们的故障主要是可观测性问题&amp;quot;这个事实假设——它在你的系统里成立吗？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;理由决定论证明面的强度，假设决定它暗处的强度。&lt;/strong&gt; 一个论证最脆弱的地方，几乎永远是没写出来的那部分。&lt;/p&gt;
&lt;h3 id=&#34;34-解剖全景&#34;&gt;3.4 解剖全景&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    Q[&amp;#34;论题&amp;lt;br/&amp;gt;在讨论什么&amp;lt;br/&amp;gt;描述性还是规定性&amp;#34;] --&amp;gt; C[&amp;#34;结论&amp;lt;br/&amp;gt;作者想让我信什么&amp;#34;]
    C --&amp;gt; R[&amp;#34;理由&amp;lt;br/&amp;gt;凭什么信&amp;#34;]
    R --&amp;gt; A1[&amp;#34;价值观假设&amp;lt;br/&amp;gt;默认的价值排序是什么&amp;#34;]
    R --&amp;gt; A2[&amp;#34;描述性假设&amp;lt;br/&amp;gt;默认的事实前提是什么&amp;#34;]
    R --&amp;gt; E[&amp;#34;证据&amp;lt;br/&amp;gt;理由有证据支撑吗&amp;#34;]
    E --&amp;gt; D[&amp;#34;数据&amp;lt;br/&amp;gt;统计口径可靠吗&amp;#34;]
    R --&amp;gt; F[&amp;#34;推理&amp;lt;br/&amp;gt;有没有谬误和歧义&amp;#34;]
    C --&amp;gt; ALT[&amp;#34;替代结论&amp;lt;br/&amp;gt;同样的理由能推出别的吗&amp;#34;]
    style C fill:#fff3cd&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;四证据的效力从直觉到研究等级天差地别&#34;&gt;四、证据的效力：从直觉到研究，等级天差地别&lt;/h2&gt;
&lt;p&gt;理由下面垫的是证据。书里花了几章逐类评估证据来源的可靠性，按我从弱到强的理解排一下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;直觉&lt;/strong&gt;：&amp;ldquo;我就是感觉这个方案不行。&amp;ldquo;直觉的问题是无法验证、无法证伪，它和偏见在生理上很难区分。只能当假设的起点，不能当论证的终点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;个人经历&lt;/strong&gt;：&amp;ldquo;我之前那个项目就是这么黄的。&amp;ldquo;单一样本，以偏概全的重灾区。自己的经历尤其危险——记忆会选择性加工，人对自己交过的学费记得格外戏剧化。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;典型案例&lt;/strong&gt;：精心挑出来的生动故事。故事的说服力来自生动性，而生动性和代表性毫不相关。一个&amp;quot;某团队上了微服务之后效率翻倍&amp;quot;的案例，没说挑选过程，就只是广告素材。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;当事人证词&lt;/strong&gt;：用户的感谢信、大厂工程师的背书。证词的问题在于选择性（谁会被请来作证？）、利益相关（作证者拿了什么？）和省略（没说的是什么？）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;专家意见&lt;/strong&gt;：比前几类强，但要问三个问题：专家在这个&lt;strong&gt;具体&lt;/strong&gt;问题上有多专？有没有利益相关？这个意见在专家群体内是主流还是孤例？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;研究报告&lt;/strong&gt;：证据链的顶端，但也不是免检金牌。要追问：&lt;strong&gt;样本量&lt;/strong&gt;多大、有没有&lt;strong&gt;代表性&lt;/strong&gt;、抽样有没有偏差、问卷措辞有没有诱导、研究能否被&lt;strong&gt;复现&lt;/strong&gt;、谁出的钱。一个对 30 个在校本科生做的实验，外推到&amp;quot;程序员群体&amp;quot;就是过度推广。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实用的心法是把证据当成分级告警：研究和可靠的观察是 error，专家意见是 warning，案例和证词是 info，直觉和个人经历是 debug——&lt;strong&gt;debug 级别的信息不该触发任何决策&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五推理路上的坑谬误数据与沉默的信息&#34;&gt;五、推理路上的坑：谬误、数据与沉默的信息&lt;/h2&gt;
&lt;h3 id=&#34;51-常见谬误清单&#34;&gt;5.1 常见谬误清单&lt;/h3&gt;
&lt;p&gt;书里列的谬误很多，工程语境下高频出现的几个：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;人身攻击&lt;/strong&gt;：不回应论证，转而攻击论证者。&amp;ldquo;他才工作三年，他的方案不用看。&amp;ldquo;人可以是错的，论证仍然要按证据评估。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;稻草人&lt;/strong&gt;：把对方的观点扭曲成好攻击的版本再开火。对方说&amp;quot;这个场景下缓存收益有限&amp;rdquo;，被转述成&amp;quot;他反对用缓存&amp;rdquo;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;滑坡&lt;/strong&gt;：&amp;ldquo;如果允许这个接口不加鉴权，下一步所有接口都不加，系统就完了。&amp;ldquo;每一步&amp;quot;必然&amp;quot;都需要证据，而不是靠节奏感滑下去。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;虚假两难&lt;/strong&gt;：&amp;ldquo;要么自研要么买，没有第三条路。&amp;ldquo;多数时候有——只是列出来对论证者不利。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;诉诸公众&lt;/strong&gt;：&amp;ldquo;大厂都这么干。&amp;ldquo;&amp;ldquo;大家都觉得该重构。&amp;ldquo;多数人的选择是相关性极弱的证据，参见上一节的证词问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;循环论证&lt;/strong&gt;：结论换个说法冒充理由。&amp;ldquo;这个设计好，因为它是经过良好设计的。&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;词语歧义&lt;/strong&gt;：论证的扣子经常系在一个多义词上。&amp;ldquo;高可用&amp;quot;&amp;ldquo;高性能&amp;quot;&amp;ldquo;解耦&amp;rdquo;——&lt;strong&gt;在同意任何结论之前，先逼对方定义关键词&lt;/strong&gt;。书里的原话精神是：意思不明确的关键词，是论证里最容易被动手脚的地方。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;52-数据的欺骗性&#34;&gt;5.2 数据的欺骗性&lt;/h3&gt;
&lt;p&gt;数据是最容易被当成&amp;quot;客观&amp;quot;的证据，也最容易被动手脚。书里点名的几种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;平均值的口径&lt;/strong&gt;：平均数、中位数、众数是三个不同的数。报&amp;quot;平均&amp;quot;时先问是哪个。均值对长尾极度敏感——监控里的 AVG 健康而 P99 爆炸，就是这条的线上版本。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;省略基数&lt;/strong&gt;：&amp;ldquo;错误率上升了 100%&amp;quot;——从 0.01% 到 0.02%。百分比离开基数就是情绪而不是信息。反过来，绝对值离开占比也一样。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;相关不等于因果&lt;/strong&gt;：两个指标同涨，可能是 A 导致 B、B 导致 A、第三个因素同时导致两者，或者纯属巧合。&amp;ldquo;在这之后&amp;quot;更不等于&amp;quot;因为这个&amp;rdquo;。书里给的解药是&lt;strong&gt;替代原因&lt;/strong&gt;（rival causes）：主动找&amp;quot;还有没有别的解释&amp;rdquo;，找到再逐一排除。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;53-被省略的信息与二分式思维&#34;&gt;5.3 被省略的信息与二分式思维&lt;/h3&gt;
&lt;p&gt;最后两章是全书最容易被忽略、也最锋利的部分。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;被省略的信息&lt;/strong&gt;：论证天然是选料加工的产物。要主动问：反对者会说什么？数据里少了哪个时间段？这个方案的失败案例呢？&lt;strong&gt;判断一份材料的可信度，看它怎么对待不利证据，比看它怎么陈列有利证据更有效。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;二分式思维的局限&lt;/strong&gt;：我们习惯问&amp;quot;是不是&amp;quot;&amp;ldquo;该不该&amp;rdquo;，仿佛结论只有是和否。书里主张把结论改成条件式的——&amp;ldquo;在 X 条件下应该，在 Y 条件下不应该&amp;rdquo;。&lt;strong&gt;任何一个论证之后追问一句&amp;quot;还有没有更多可能的结论&amp;rdquo;，是把批判性思维从破坏工具变成生产工具的关键一步&lt;/strong&gt;：拆完不是为了说&amp;quot;你错了&amp;rdquo;，是为了找到更好的那个答案。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;六金字塔原理结论先行与四条规则&#34;&gt;六、《金字塔原理》：结论先行与四条规则&lt;/h2&gt;
&lt;p&gt;换到管道另一端。Minto 在麦肯锡发现的问题很朴素：聪明人的报告没人看得下去，不是因为内容不行，而是因为&lt;strong&gt;组织顺序是作者的思考顺序，不是读者的理解顺序&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;61-结论先行&#34;&gt;6.1 结论先行&lt;/h3&gt;
&lt;p&gt;金字塔原理的第一条，也是全部规则的源头：&lt;strong&gt;先说结论，再说理由&lt;/strong&gt;（top-down）。&lt;/p&gt;
&lt;p&gt;理由是认知科学：读者每读一句话都在猜&amp;quot;这想说明什么&amp;rdquo;，如果结论在最后，读者的整个阅读过程都是在黑暗中做猜测，猜错了还要推倒重来；而结论先行，后面的每句话都变成对已知结论的验证和展开，理解成本骤降。用工程师的话说：&lt;strong&gt;结论先行是把读者的认知负载从 O(n) 的穷举猜测降到 O(1) 的模式匹配。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;62-为什么必须分组工作记忆的上限&#34;&gt;6.2 为什么必须分组：工作记忆的上限&lt;/h3&gt;
&lt;p&gt;书里引用了 George Miller 那个著名的心理学结论：人的工作记忆一次大约只能装 7±2 个互不关联的项目。一篇文档如果抛出十几个并列的论点，读者根本装不下，只能自己费力归类——而多数读者懒得归，于是干脆不读了。&lt;/p&gt;
&lt;p&gt;所以表达者的义务是&lt;strong&gt;替读者完成分组&lt;/strong&gt;：把散点归入少数几个组，给每个组起一个概括性的名字，读者需要记住的就只剩几个组名。这就是为什么所有金字塔结构都长&amp;quot;每层三四个要点&amp;quot;的样子——不是审美，是生理。&lt;/p&gt;
&lt;h3 id=&#34;63-四条规则&#34;&gt;6.3 四条规则&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;结论先行&lt;/strong&gt;：塔尖是中心论点，一句话说清。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;以上统下&lt;/strong&gt;：上一层的每个论点，必须是下一层那一组论点的准确概括；下一层必须完整支撑上一层。金字塔不允许出现&amp;quot;孤儿论点&amp;rdquo;——没有任何一层的内容是悬空的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;归类分组&lt;/strong&gt;：同组论点必须属于同一逻辑范畴。工程上常用的检验标准是 MECE（Mutually Exclusive, Collectively Exhaustive，相互独立、完全穷尽）：组与组不重叠，所有组合起来无遗漏。分类维度一次只能用一种——按时间切就别混着按模块切。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;逻辑递进&lt;/strong&gt;：组内的论点必须按某种明确顺序排列：时间顺序（步骤先后）、结构顺序（整体拆成部分）、程度顺序（重要性递减）。说不出排序依据的一组论点，通常意味着归类本身就有问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;七金字塔的内部力学纵向问答横向演绎归纳与-scqa-开场&#34;&gt;七、金字塔的内部力学：纵向问答、横向演绎归纳与 SCQA 开场&lt;/h2&gt;
&lt;h3 id=&#34;71-纵向疑问-回答式对话&#34;&gt;7.1 纵向：疑问-回答式对话&lt;/h3&gt;
&lt;p&gt;金字塔上下层之间不是简单的&amp;quot;总分&amp;quot;关系，Minto 的描述更精确：&lt;strong&gt;上一层的每个论点都应该在读者脑子里激起一个疑问，而下一层正好回答它。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;塔尖说&amp;quot;我们应该重写网关&amp;rdquo;，读者立刻问&amp;quot;为什么？&amp;quot;；第二层回答&amp;quot;性能到顶、扩展性差、维护成本高&amp;rdquo;；读者对&amp;quot;性能到顶&amp;quot;又问&amp;quot;何以见得？&amp;quot;；第三层给出压测数据。写作者的工作是&lt;strong&gt;预判读者在每一层会问什么，并保证答案就在下一层&lt;/strong&gt;。写得好的文档读起来像一场被引导的对话；写得差的文档，读者的问题都问完了，文档还没开始回答。&lt;/p&gt;
&lt;h3 id=&#34;72-横向演绎与归纳&#34;&gt;7.2 横向：演绎与归纳&lt;/h3&gt;
&lt;p&gt;同一层论点之间的关系只有两种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;演绎推理&lt;/strong&gt;：线性链条——大前提、小前提、结论。&amp;ldquo;所有核心链路都要有降级方案（大前提），支付链路是核心链路（小前提），所以支付链路要有降级方案（结论）。&amp;ldquo;演绎的优点是链条严密、步步紧逼；缺点是读者必须记住前面每一环才能理解后面，认知负担重，且任何一环被质疑整条链就停在那。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;归纳推理&lt;/strong&gt;：把一组同类的论点并列，用一个更高层的概括命名它们。&amp;ldquo;客户端、服务端、链路层都有优化空间&amp;quot;归纳为&amp;quot;全链路都有优化空间&amp;rdquo;。读者只需理解每个并列点，再接受那个概括名。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Minto 的建议很实用：&lt;strong&gt;塔尖附近优先用归纳&lt;/strong&gt;——并列的三条理由各自独立，读者质疑其中一条不影响另外两条，论证不会整体塌掉；演绎链条留给真正需要&amp;quot;步步紧逼、一环扣一环&amp;quot;的说服场景，且尽量放在金字塔的中下层。演绎适合用来&lt;strong&gt;证明&lt;/strong&gt;，归纳适合用来&lt;strong&gt;说明&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;73-scqa序言怎么写&#34;&gt;7.3 SCQA：序言怎么写&lt;/h3&gt;
&lt;p&gt;金字塔解决的是主体，序言解决的是&amp;quot;读者为什么要读&amp;rdquo;。Minto 给的公式是讲故事的四个音节：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;S（Situation，情境）&lt;/strong&gt;：从读者已经认可、无争议的背景开始，把读者带入共同语境。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;C（Complication，冲突）&lt;/strong&gt;：在这个背景上发生了什么打破稳定的事——需求变了、流量涨了、老系统扛不住了。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Q（Question，疑问）&lt;/strong&gt;：冲突自然引发的疑问——那我们怎么办？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A（Answer，答案）&lt;/strong&gt;：答案就是金字塔尖的结论。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SCQA 的精髓是：&lt;strong&gt;序言不是背景资料的堆砌，是一个把读者的疑问&amp;quot;逼&amp;quot;出来的装置。&lt;/strong&gt; 读者自己产生了 Q，你的 A 才是被需要的；读者心里没有 Q，你给的 A 再漂亮也只是噪音。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    TOP[&amp;#34;塔尖：中心论点&amp;lt;br/&amp;gt;结论先行 一句话说清&amp;#34;] --&amp;gt; M1[&amp;#34;要点一&amp;#34;]
    TOP --&amp;gt; M2[&amp;#34;要点二&amp;#34;]
    TOP --&amp;gt; M3[&amp;#34;要点三&amp;#34;]
    M1 --&amp;gt; D1[&amp;#34;支撑材料&amp;lt;br/&amp;gt;数据、事实、细节&amp;#34;]
    M2 --&amp;gt; D2[&amp;#34;支撑材料&amp;lt;br/&amp;gt;数据、事实、细节&amp;#34;]
    M3 --&amp;gt; D3[&amp;#34;支撑材料&amp;lt;br/&amp;gt;数据、事实、细节&amp;#34;]
    subgraph INTRO[&amp;#34;序言：SCQA&amp;#34;]
        S[&amp;#34;S 情境&amp;lt;br/&amp;gt;无争议的背景&amp;#34;] --&amp;gt; CC[&amp;#34;C 冲突&amp;lt;br/&amp;gt;打破稳定的变化&amp;#34;]
        CC --&amp;gt; QQ[&amp;#34;Q 疑问&amp;lt;br/&amp;gt;读者自然产生的问题&amp;#34;]
        QQ --&amp;gt; AA[&amp;#34;A 答案&amp;lt;br/&amp;gt;等于塔尖结论&amp;#34;]
    end
    INTRO -.-&amp;gt;|&amp;#34;引出&amp;#34;| TOP
    style TOP fill:#fff3cd&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;纵向关系：塔尖让读者问&amp;quot;为什么&amp;rdquo;，下一层必须正好回答；横向关系：要点之间要么演绎成链，要么归纳成组，同层不混用。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;八合流工程现场的双向管道&#34;&gt;八、合流：工程现场的双向管道&lt;/h2&gt;
&lt;p&gt;两本书单独看都是好书，但真正的威力在合流。我自己在三个场景里把它们焊成了固定动作。&lt;/p&gt;
&lt;h3 id=&#34;81-评审别人的技术方案rfc用学会提问做解剖&#34;&gt;8.1 评审别人的技术方案/RFC：用《学会提问》做解剖&lt;/h3&gt;
&lt;p&gt;拿到一份方案，先不当&amp;quot;读者&amp;quot;而当&amp;quot;解剖师&amp;rdquo;，按四件套走一遍：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;论题对齐&lt;/strong&gt;：这份方案在回答什么问题？描述性（现在系统行不行）还是规定性（要不要做）？很多评审争吵的根源是方案在答规定性问题，评审人在挑描述性毛病。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;理由与证据分级&lt;/strong&gt;：每条理由后面垫的是什么？压测报告（研究级）还是&amp;quot;业界都这么干&amp;rdquo;（公众诉求 + 证词级）？debug 级证据支撑的结论，当场标记。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;挖假设&lt;/strong&gt;：这个方案没写出来的前提是什么？&amp;ldquo;流量还会涨三倍&amp;quot;是描述性假设，&amp;ldquo;性能优先于交付速度&amp;quot;是价值观假设——把它们摆到台面上，争论才有焦点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;替代原因与省略信息&lt;/strong&gt;：同样的现象有没有别的解释？方案里为什么没提失败案例和回退成本？被省略的部分往往比写出来的部分更能预测评审结果。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这套清单的产出不是&amp;quot;毙掉方案&amp;rdquo;，而是一张问题清单——评审意见的质量，取决于你替作者把他没写的那部分补出了多少。&lt;/p&gt;
&lt;h3 id=&#34;82-写设计文档复盘报告晋升答辩用金字塔做搭建&#34;&gt;8.2 写设计文档、复盘报告、晋升答辩：用金字塔做搭建&lt;/h3&gt;
&lt;p&gt;输出侧反过来，用金字塔原理搭自己的论证：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;设计文档&lt;/strong&gt;：第一段就是结论（选方案 X），然后三条理由（成本、风险、收益），调研过程和对比表全部进附录——被追问时才翻开。思考顺序是推理的，表达顺序必须是结论先行的，你受过的苦读者没兴趣陪受。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;故障复盘&lt;/strong&gt;：塔尖是根因结论，第二层是时间线（时间顺序）、影响面（结构顺序）、改进项（程度顺序）三个 MECE 分组；替代原因的证伪过程单独一组——这一组既是金字塔的分组纪律，也是《学会提问》替代原因要求的落点，两本书在这里直接会师。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;晋升答辩 PPT&lt;/strong&gt;：第一页就是&amp;quot;我达到了下一级标准&amp;quot;这个结论，后面每页一个支撑论点，每页内部是&amp;quot;挑战 - 动作 - 结果&amp;quot;的迷你 SCQA。评委的疑问 - 回答链条，必须在你的页序里，而不是在评委的脑子里。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;83-开会汇报结论先行的-30-秒版本&#34;&gt;8.3 开会汇报：结论先行的 30 秒版本&lt;/h3&gt;
&lt;p&gt;口头汇报是金字塔原理最残酷的考场——没有翻页机会，第一句话就决定了听众这 30 秒在听还是在等。固定句式：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;我的结论是 X。理由三条：一、二、三，各一句话。细节我准备了材料，随时可以展开。&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;第一句必须是结论，不是背景——背景是 SCQA 里的 S，它存在的意义是引出 Q，而不是展示你做过的功课。30 秒内对方没抓到结论，后面再精彩都是补救。&lt;/p&gt;
&lt;h3 id=&#34;84-顺序不能反&#34;&gt;8.4 顺序不能反&lt;/h3&gt;
&lt;p&gt;最后也是最重要的一条纪律：&lt;strong&gt;先拆后搭，先想清楚再说明白&lt;/strong&gt;。用金字塔包装一个没经过批判性检验的结论，短期说服力反而更强——结构会替内容背书。所以评审会上最危险的方案，往往是结构最漂亮的那些：漂亮到没人愿意当那个扫兴的人。强势批判性思维的价值就在这——对自己，先过安检再打包；对别人，越漂亮的包装越要拆开看。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;九带走的清单&#34;&gt;九、带走的清单&lt;/h2&gt;
&lt;p&gt;如果只能记住几件事，记这些：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;输入侧（《学会提问》）：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;读到任何结论，先拆四件套：论题、结论、理由、假设。&lt;/li&gt;
&lt;li&gt;证据分等级：研究 ＞ 专家 ＞ 案例 ＞ 证词 ＞ 个人经历 ＞ 直觉。低等级证据不触发决策。&lt;/li&gt;
&lt;li&gt;没说出口的假设是论证的承重墙，挖出来再谈信不信。&lt;/li&gt;
&lt;li&gt;关键词没定义，等于什么都没说；先问&amp;quot;你说的 X 是什么意思&amp;rdquo;。&lt;/li&gt;
&lt;li&gt;看数据先问三件事：是哪个平均数、基数是多少、谁被排除了。&lt;/li&gt;
&lt;li&gt;主动找替代原因；检查被省略的信息；警惕&amp;quot;在这之后&amp;quot;被当成&amp;quot;因为这个&amp;rdquo;。&lt;/li&gt;
&lt;li&gt;拒绝二分：问一句&amp;quot;还有没有更多可能的结论&amp;rdquo;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;输出侧（《金字塔原理》）：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;结论先行：第一句话、第一段、第一页，永远是结论。&lt;/li&gt;
&lt;li&gt;以上统下：每层概括下层，每层完整支撑上层，不许有孤儿论点。&lt;/li&gt;
&lt;li&gt;归类分组 MECE：一次只用一个分类维度；空着的分组就是遗漏的信号。&lt;/li&gt;
&lt;li&gt;逻辑递进：组内按时间、结构或重要性排序，说不出排序依据就是没归对类。&lt;/li&gt;
&lt;li&gt;纵向要让上一层的每句话激起疑问、下一层正好回答；横向塔尖附近用归纳，演绎链条放低层。&lt;/li&gt;
&lt;li&gt;序言用 SCQA：先把读者的疑问逼出来，再给答案。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;合流纪律：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;评审别人：用解剖清单，产出问题而非情绪。&lt;/li&gt;
&lt;li&gt;表达自己：用金字塔搭建，先想清楚再说明白。&lt;/li&gt;
&lt;li&gt;汇报口头：30 秒结论先行，细节收进&amp;quot;我准备了&amp;rdquo;。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;M. Neil Browne &amp;amp; Stuart M. Keeley, &lt;em&gt;Asking the Right Questions: A Guide to Critical Thinking&lt;/em&gt;, Pearson（批判性思维经典教材，多次再版，中文版《学会提问》）。&lt;/li&gt;
&lt;li&gt;Barbara Minto, &lt;em&gt;The Minto Pyramid Principle: Logic in Writing, Thinking, and Problem Solving&lt;/em&gt;（中文版《金字塔原理》，麦肯锡写作与思考方法论）。&lt;/li&gt;
&lt;li&gt;George A. Miller, &amp;ldquo;The Magical Number Seven, Plus or Minus Two&amp;rdquo;, &lt;em&gt;Psychological Review&lt;/em&gt;, 1956（《金字塔原理》引用的工作记忆上限研究）。&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>《程序员修炼之道》读书笔记：把五种逻辑能力焊进日常工程动作</title>
      <link>https://ftmao.com/blog/bookstore/pragmatic-programmer-notes/</link>
      <pubDate>Mon, 05 Sep 2022 16:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/bookstore/pragmatic-programmer-notes/</guid>
      <description>&lt;h1 id=&#34;程序员修炼之道读书笔记把五种逻辑能力焊进日常工程动作&#34;&gt;《程序员修炼之道》读书笔记：把五种逻辑能力焊进日常工程动作&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;逻辑思维书单合读笔记的收官篇。前两篇：《&lt;a href=&#34;https://ftmao.com/blog/blog/bookstore/asking-questions-pyramid-principle-book-notes/&#34;&gt;〈学会提问〉与〈金字塔原理〉&lt;/a&gt;》（想清楚 + 说明白）、《&lt;a href=&#34;https://ftmao.com/blog/blog/bookstore/how-to-solve-it-thinking-in-systems-notes/&#34;&gt;〈怎样解题〉与〈系统之美〉&lt;/a&gt;》（解点状问题 + 看系统结构）；总纲见《&lt;a href=&#34;https://ftmao.com/blog/blog/posts/programmer-logical-thinking-training/&#34;&gt;程序员逻辑思维训练手册&lt;/a&gt;》。&lt;br&gt;
《程序员修炼之道》（The Pragmatic Programmer）在这个书单里位置特殊：前四本书练的是「脑」，这本书练的是「手」——&lt;strong&gt;它把抽象的思维能力，翻译成 DRY、正交性、曳光弹这样一条一条可以当天就用起来的工程纪律。&lt;/strong&gt;&lt;br&gt;
这篇笔记不按原书章节抄，按训练手册里的五种能力重新归类。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    BOOK[&amp;#34;《程序员修炼之道》&amp;lt;br/&amp;gt;几十条 tips 散在十章里&amp;#34;] --&amp;gt; A[&amp;#34;概念清晰&amp;lt;br/&amp;gt;DRY / 命名 / 需求之坑&amp;#34;]
    BOOK --&amp;gt; B[&amp;#34;推理链条&amp;lt;br/&amp;gt;橡皮鸭调试 / 不要假定要证明&amp;lt;br/&amp;gt;拒绝巧合式编程&amp;#34;]
    BOOK --&amp;gt; C[&amp;#34;抽象分层&amp;lt;br/&amp;gt;正交性 / 得墨忒耳法则&amp;lt;br/&amp;gt;解耦与时间耦合&amp;#34;]
    BOOK --&amp;gt; D[&amp;#34;边界意识&amp;lt;br/&amp;gt;契约式设计 / 断言&amp;lt;br/&amp;gt;防御式编程 / 资源有始有终&amp;#34;]
    BOOK --&amp;gt; E[&amp;#34;因果辨析&amp;lt;br/&amp;gt;曳光弹与原型 / 估算&amp;lt;br/&amp;gt;重构的时机&amp;#34;]
    style BOOK fill:#e8f4e8&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;能力一-概念清晰dry-的本质不是别复制粘贴&#34;&gt;能力一 概念清晰：DRY 的本质不是「别复制粘贴」&lt;/h2&gt;
&lt;p&gt;书中被引用最多也误解最深的一条是 DRY（Don&amp;rsquo;t Repeat Yourself）。它说的不是「代码别重复」，而是——&lt;strong&gt;每一个知识点，在系统中必须有唯一、权威、无歧义的表示&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑故事 #1（三处复制的校验逻辑，一次资损）&lt;/strong&gt;：订单金额的校验规则（起购金额、优惠券叠加上限）在三个服务里各写了一份。规则调整时改了两处漏了第三处，一个边缘渠道绕过了叠加上限，被羊毛党薅了一晚上。复盘时发现三份代码&lt;strong&gt;长得并不一样&lt;/strong&gt;——不是复制粘贴，是同一个「知识」被各自实现了三遍。DRY 管的就是这个：校验规则收敛成一份配置 + 一个共享库，三处引用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑故事 #2（需求之坑：做了用户「说要的」，不是「要的」）&lt;/strong&gt;：运营说「要一个导出全量订单的按钮」。我们做了，导出 800 万行 Excel，系统卡死，运营崩溃。追问之下，真实需求是「每周一看上周各渠道的退款率」——一张定时推送的报表就能解决。书中的原话值得抄在墙上：&lt;strong&gt;「需求很少躺在表面上，它们深埋在层层假设、误解和政治之下。」&lt;/strong&gt;「我们要 X」这个陈述本身，就是需要被挖掘的假设。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实践清单：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 评审时先问：这个「需求」背后要解决的问题是什么？（至少往下挖一层）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 同一个规则/知识在系统里有几处表示？超过一处就要收敛&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 名字说得出准确含义吗？说不清含义的命名（&lt;code&gt;data&lt;/code&gt;、&lt;code&gt;temp&lt;/code&gt;、&lt;code&gt;handle&lt;/code&gt;）是概念没清晰的信号&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;能力二-推理链条调试的哲学与巧合式编程&#34;&gt;能力二 推理链条：调试的哲学与「巧合式编程」&lt;/h2&gt;
&lt;p&gt;书里调试章节只有两条核心纪律：&lt;strong&gt;「不要恐慌」&lt;strong&gt;和&lt;/strong&gt;「不要假定，要证明」（Don&amp;rsquo;t Assume It — Prove It）&lt;/strong&gt;。配合著名的橡皮鸭调试法（把问题逐行讲给一只鸭子听，讲着讲着自己就找到了答案），构成一套完整的 debug 心法——和波利亚的四步法互为表里。&lt;/p&gt;
&lt;p&gt;它给一种常见病起了名字：&lt;strong&gt;巧合式编程（Programming by Coincidence）&lt;/strong&gt;——代码能跑，但你不知道为什么能跑；改了一行，测试过了，至于为什么过，不知道。这种代码的每次成功运行都是运气贷的款，利率很高。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑故事 #3（「能跑就行」的代码，凌晨随机爆炸）&lt;/strong&gt;：接过一段遗留代码：发送消息后 sleep 500ms 再查状态，「因为不 sleep 偶尔查不到」。没人知道 500ms 是怎么来的——它就是巧合式编程的活标本：把「碰巧没失败」当成了「正确」。大促流量上来，下游延迟抖动到 600ms，状态查询大面积误判，凌晨两点报警群爆炸。根因是消息状态要轮询或回调确认，sleep 是用运气对抗时延。&lt;strong&gt;凡是「不知道为什么能跑」的代码，上线前必须弄懂，或者重写。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑故事 #4（橡皮鸭的实战版）&lt;/strong&gt;：一个诡异的并发 bug 查了两天，最后是在给同事复述问题的时候自己发现的——讲到「这个计数器只在这里加……」突然意识到「不对，还有一个地方也加」。语言化会强迫推理补全所有跳步。&lt;strong&gt;讲不出来 = 没想完整&lt;/strong&gt;，这是橡皮鸭有效的底层原因。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实践清单：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 修复前能一句话说清根因吗？说不清就还没找到&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 代码里有没有「不知道为什么能跑」的部分？找出来，弄懂或重写&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 卡住超过 30 分钟？找人（或 AI）把问题从头讲一遍&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 修复后问：这个 bug 依赖的「巧合」还有哪些？（同类巧合一起清掉）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;能力三-抽象分层正交性改-a-不坏-b的工程学&#34;&gt;能力三 抽象分层：正交性，「改 A 不坏 B」的工程学&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;正交性&lt;/strong&gt;：两个组件，改一个不影响另一个，就叫正交。这是全书对「分层」最硬核的定义——不是画几张架构图，是「改动的爆炸半径有多小」。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    subgraph BAD[&amp;#34;非正交：牵一发动全身&amp;#34;]
        A1[&amp;#34;业务逻辑&amp;#34;] --- A2[&amp;#34;日志组件&amp;#34;]
        A2 --- A3[&amp;#34;配置格式&amp;#34;]
        A3 --- A1
        A1 -.-&amp;gt;|&amp;#34;改日志库版本&amp;lt;br/&amp;gt;业务发布受阻&amp;#34;| X1[&amp;#34;爆炸半径: 全系统&amp;#34;]
    end
    subgraph GOOD[&amp;#34;正交：各改各的&amp;#34;]
        B1[&amp;#34;业务逻辑&amp;#34;] --&amp;gt; B4[&amp;#34;稳定接口&amp;#34;]
        B2[&amp;#34;日志组件&amp;#34;] --&amp;gt; B4
        B3[&amp;#34;配置&amp;#34;] --&amp;gt; B4
        B4 -.-&amp;gt;|&amp;#34;改动被接口吸收&amp;#34;| X2[&amp;#34;爆炸半径: 单组件&amp;#34;]
    end
    style GOOD fill:#e8f4e8&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;配套的两条：&lt;strong&gt;得墨忒耳法则&lt;/strong&gt;（只跟直接朋友说话，别 &lt;code&gt;a.getB().getC().doSomething()&lt;/code&gt; 层层穿透）和&lt;strong&gt;时间耦合&lt;/strong&gt;（A 必须发生在 B 之前？那顺序本身就是依赖，要显式化或消除）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑故事 #5（升级日志库，阻塞了业务发版）&lt;/strong&gt;：安全部门要求全公司升级某个日志组件版本。我们的业务代码里直接 import 了它的十几个类，牵一发动全身，业务迭代被迫停了一周。有防腐层的团队半天就升完了。&lt;strong&gt;依赖第三方时永远隔一层自己的接口&lt;/strong&gt;——这是正交性最朴素的形式，也是最常被偷懒跳过的一层。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实践清单：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 问每个改动：它的爆炸半径到哪里？（能答上来，说明边界是清楚的）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 代码里有没有 &lt;code&gt;a.b.c.d()&lt;/code&gt; 式穿透调用？有就收口&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 有没有「必须先调 X 再调 Y」的隐性顺序？显式化（状态机/工作流）或消除&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 第三方依赖隔了自己的接口层吗？&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;能力四-边界意识契约断言与防御式编程&#34;&gt;能力四 边界意识：契约、断言与防御式编程&lt;/h2&gt;
&lt;p&gt;书中的边界三板斧：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;契约式设计&lt;/strong&gt;：每个方法声明「调用前你必须保证什么（前置条件），我保证返回什么（后置条件），过程中什么不会变（不变式）」&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;断言&lt;/strong&gt;：「不可能发生」的情况就用断言挡住——&lt;strong&gt;它不可能发生的意思是，如果发生了，一定是 bug，要让系统立刻响铃&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;资源有始有终&lt;/strong&gt;：谁分配谁释放，成对出现&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;踩坑故事 #6（「不可能为空」的字段，空了）&lt;/strong&gt;：订单下游默认「支付成功的订单必有支付流水号」，没做校验。一次支付渠道故障，回调丢了流水号但状态是「成功」，空流水号一路穿透到对账任务，对账差异报警在三天后才被人注意到。如果入口有一条断言，事故时长是三分钟。&lt;strong&gt;「不可能」三个字是边界意识最危险的敌人——线上专治各种不可能。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑故事 #7（资源泄漏：谁打开的连接没还）&lt;/strong&gt;：压测时连接数缓慢上涨，八小时后服务假死。定位到一个异常分支里 &lt;code&gt;connection.close()&lt;/code&gt; 被跳过——正常路径成对，异常路径裸奔。教训和书中的完全一致：&lt;strong&gt;资源的分配与释放要在同一个视野里可见&lt;/strong&gt;（try-with-resources / defer / RAII），跨函数传递所有权的设计，十个里有九个会漏。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实践清单：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 关键方法的契约写得出来吗？（前置/后置/不变式各一句）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 「不可能发生」的假设有没有断言守着？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 外部输入（用户、上游、回调）全部按「不可信」校验了吗？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 资源的打开和关闭在同一个代码块视野内吗？&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;能力五-因果辨析曳光弹估算与重构的时机&#34;&gt;能力五 因果辨析：曳光弹、估算与重构的时机&lt;/h2&gt;
&lt;p&gt;这一组 tips 回答的是「决策」问题——怎么在信息不足时往前推进：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    subgraph TRACER[&amp;#34;曳光弹 Tracer Bullets&amp;#34;]
        T1[&amp;#34;端到端打通一条最薄链路&amp;lt;br/&amp;gt;登录→下单→支付 各只实现 5%&amp;#34;] --&amp;gt; T2[&amp;#34;架构/集成/部署&amp;lt;br/&amp;gt;风险第一时间暴露&amp;#34;]
        T2 --&amp;gt; T3[&amp;#34;之后每一枪&amp;lt;br/&amp;gt;都沿着弹道修正&amp;#34;]
    end
    subgraph PROTO[&amp;#34;原型 Prototype&amp;#34;]
        P1[&amp;#34;用纸板/脚本验证&amp;lt;br/&amp;gt;某个具体问题&amp;#34;] --&amp;gt; P2[&amp;#34;验证完就扔掉&amp;lt;br/&amp;gt;代码使命是学习&amp;#34;]
    end
    Q[&amp;#34;面对一个新系统&amp;#34;] --&amp;gt; TRACER
    Q --&amp;gt; PROTO
    style TRACER fill:#e8f4e8&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;曳光弹 vs 原型&lt;/strong&gt;是书中最精妙的区分：原型是「用后即弃的实验」，回答局部问题；曳光弹是「会一直发光的骨架」，端到端打通整条链路，让集成风险第一天就暴露。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑故事 #8（三个月大设计，集成第一天就崩）&lt;/strong&gt;：早年一个项目，前两个月各模块分头开发，接口全靠文档约定。联调第一天：认证方式对不上、时间格式两套、错误码语义相反——三个月的工期，联调吃掉一个月。后来所有新项目第一周的硬指标改成：&lt;strong&gt;端到端曳光弹必须打通&lt;/strong&gt;（登录→一个空接口→落库→前端显示一个 hello），哪怕薄如蝉翼。集成风险从「最后一个月的惊喜」变成「第一周的日常」。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;估算&lt;/strong&gt;一节也值得单独记：估算前先问「精度要求是什么」——「两周左右」和「14 个工作日」是两种承诺；估算要带上依据（「参照上次的 X 项目」），否则就是报数字占卜。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实践清单：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 新项目第一周：曳光弹打通了吗？（端到端，再薄也算）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 验证性代码标记「原型」了吗？原型有没有被当成产品上线？（常见事故）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 估算带依据和精度范围了吗？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 重构是「顺手做」（童子军军规：离开时比来时干净）还是攒成了「重构专项」？后者通常永远不会排期&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;收官五本书拼起来是一张完整的图&#34;&gt;收官：五本书拼起来是一张完整的图&lt;/h2&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[&amp;#34;《学会提问》&amp;lt;br/&amp;gt;结论要过安检&amp;#34;] --&amp;gt; THINK[&amp;#34;想清楚&amp;#34;]
    B[&amp;#34;《金字塔原理》&amp;lt;br/&amp;gt;结论站塔尖&amp;#34;] --&amp;gt; SAY[&amp;#34;说明白&amp;#34;]
    C[&amp;#34;《怎样解题》&amp;lt;br/&amp;gt;四步解题法&amp;#34;] --&amp;gt; SOLVE[&amp;#34;解得掉&amp;#34;]
    D[&amp;#34;《系统之美》&amp;lt;br/&amp;gt;找结构不找人&amp;#34;] --&amp;gt; SOLVE
    E[&amp;#34;《程序员修炼之道》&amp;lt;br/&amp;gt;工程纪律清单&amp;#34;] --&amp;gt; DO[&amp;#34;落得下去&amp;#34;]
    THINK --&amp;gt; DO
    SAY --&amp;gt; DO
    SOLVE --&amp;gt; DO
    style E fill:#e8f4e8&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;思考与感悟之一&lt;/strong&gt;：这本书出版二十多年，具体技术在书中已经老（CVS、CORBA），纪律一条没过时。这印证了训练手册里那句判断——框架三个月过期，思维能力跟你三十年。&lt;strong&gt;读老书读「不变的部分」，是技术人对抗知识折旧的最优策略。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;思考与感悟之二&lt;/strong&gt;：全书的隐藏主线是「责任感」——对自己的代码负责（不妥协于巧合式编程）、对后来者负责（DRY、正交）、对用户负责（挖掘真需求）。所谓「修炼」，练的不是绝技，是&lt;strong&gt;把每一条朴素的纪律在 deadline 压力下依然执行到位&lt;/strong&gt;。知道和做到之间，隔着的不是天赋，是一百次「这次就算了」的拒绝。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;思考与感悟之三（系列收尾）&lt;/strong&gt;：五本书读下来，它们的交集惊人地小，合力惊人地大：学会提问管「别信错」，金字塔管「别说不清」，波利亚管「别卡住」，系统之美管「别复发」，修炼之道管「别妥协」。逻辑思维不是一个器官，是一套工具箱——&lt;strong&gt;工具箱的意义不在于拥有，在于每个场景知道伸手拿哪一件。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;附落地清单贴工位版--全书精选&#34;&gt;附：落地清单（贴工位版 · 全书精选）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 这个知识在系统里有几处表示？（DRY）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 代码能跑，但我说得清为什么吗？（拒绝巧合式编程）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 这次改动的爆炸半径到哪？（正交性）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 「不可能发生」的假设有断言守着吗？（契约）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 资源的打开和关闭在同一视野内吗？（有始有终）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 新项目第一周打通曳光弹了吗？（端到端骨架）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 原型代码被当成产品上线了吗？（用后即弃）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 今天离开代码时，比来时干净一点了吗？（童子军军规）&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>《怎样解题》与《系统之美》读书笔记：点状的 bug 用四步法，反复发作的病用反馈回路</title>
      <link>https://ftmao.com/blog/bookstore/how-to-solve-it-thinking-in-systems-notes/</link>
      <pubDate>Mon, 05 Sep 2022 10:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/bookstore/how-to-solve-it-thinking-in-systems-notes/</guid>
      <description>&lt;h1 id=&#34;怎样解题与系统之美读书笔记点状的-bug-用四步法反复发作的病用反馈回路&#34;&gt;《怎样解题》与《系统之美》读书笔记：点状的 bug 用四步法，反复发作的病用反馈回路&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;这是逻辑思维书单合读笔记的第二篇（第一篇：《&lt;a href=&#34;https://ftmao.com/blog/blog/bookstore/asking-questions-pyramid-principle-book-notes/&#34;&gt;〈学会提问〉与〈金字塔原理〉&lt;/a&gt;》，总纲见《&lt;a href=&#34;https://ftmao.com/blog/blog/posts/programmer-logical-thinking-training/&#34;&gt;程序员逻辑思维训练手册&lt;/a&gt;》）。&lt;br&gt;
这两本放在一起读，因为它们恰好覆盖程序员面对的两类问题：&lt;br&gt;
&lt;strong&gt;《怎样解题》管「点状问题」——一个 bug、一道算法题、一次明确的优化；《系统之美》管「系统问题」——为什么同类的坑换个姿势反复出现。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    Q[&amp;#34;问题来了&amp;#34;] --&amp;gt; A{&amp;#34;第一次见？&amp;#34;}
    A --&amp;gt;|&amp;#34;是 点状问题&amp;#34;| P[&amp;#34;《怎样解题》&amp;lt;br/&amp;gt;四步解题法&amp;lt;br/&amp;gt;弄清→计划→执行→回顾&amp;#34;]
    A --&amp;gt;|&amp;#34;不 换个姿势&amp;lt;br/&amp;gt;反复出现&amp;#34;| S[&amp;#34;《系统之美》&amp;lt;br/&amp;gt;存量流量 + 反馈回路&amp;lt;br/&amp;gt;找结构 不找替罪羊&amp;#34;]
    style P fill:#e8f4e8
    style S fill:#e8f4e8&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;这个分流判断本身就是两本书合读的最大收获：&lt;strong&gt;一个 bug 修三次还没死，它就不是 bug 了，是系统结构在持续生产 bug。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;上篇-怎样解题波利亚的四步就是-debug-的标准流程&#34;&gt;上篇 《怎样解题》：波利亚的四步，就是 debug 的标准流程&lt;/h2&gt;
&lt;h3 id=&#34;1-全书骨架四步--启发法工具箱&#34;&gt;1. 全书骨架：四步 + 启发法工具箱&lt;/h3&gt;
&lt;p&gt;波利亚 1945 年写的这本小书，名义上教解数学题，实际上教的是「面对任何陌生问题时的元流程」：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    S1[&amp;#34;第一步 弄清问题&amp;lt;br/&amp;gt;未知量是什么？&amp;lt;br/&amp;gt;已知条件是什么？&amp;lt;br/&amp;gt;条件够用吗？有矛盾吗？&amp;#34;] --&amp;gt; S2[&amp;#34;第二步 拟定计划&amp;lt;br/&amp;gt;见过类似的问题吗？&amp;lt;br/&amp;gt;能倒推吗？能简化吗？&amp;lt;br/&amp;gt;能画个图吗？&amp;#34;]
    S2 --&amp;gt; S3[&amp;#34;第三步 执行计划&amp;lt;br/&amp;gt;每一步都检查&amp;lt;br/&amp;gt;我能看出这步是对的&amp;#34;]
    S3 --&amp;gt; S4[&amp;#34;第四步 回顾&amp;lt;br/&amp;gt;能验证结果吗？&amp;lt;br/&amp;gt;方法能用到别处吗？&amp;lt;br/&amp;gt;这题教会我什么？&amp;#34;]
    S4 -.-&amp;gt;|&amp;#34;回顾的产出&amp;lt;br/&amp;gt;变成下次的经验&amp;#34;| S2&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;映射到 debug 上严丝合缝：弄清问题 = 精确复现现象；拟定计划 = 假设与验证路径；执行 = 二分定位；回顾 = 写复盘、沉淀 checklist。四步里最反常识的是：&lt;strong&gt;波利亚认为第四步「回顾」才是能力增长的唯一来源&lt;/strong&gt;——题解完就走人，等于白做。&lt;/p&gt;
&lt;h3 id=&#34;2-启发法工具箱书中最实用的部分&#34;&gt;2. 启发法工具箱（书中最实用的部分）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;倒推法&lt;/strong&gt;：从期望的结果往回推「要达到它，上一步必须是什么」&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特殊化&lt;/strong&gt;：先解一个简化版（数据量从 1000 万缩到 10 条，并发从 1000 缩到 2）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;类比&lt;/strong&gt;：「这和哪个我解决过的问题像？」&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重新表述&lt;/strong&gt;：换一组词描述问题，经常一换就通&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-踩坑故事&#34;&gt;3. 踩坑故事&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;踩坑故事 #1：没弄清问题就动手，优化了错的接口。&lt;/strong&gt; 产品反馈「首页慢」，我凭直觉认为是商品列表查询慢，花两天给列表接口加索引、上缓存，上线后首页还是慢。最后用 APM 工具一拉调用链：慢在首页首屏的&lt;strong&gt;个性化推荐接口&lt;/strong&gt;，列表接口根本不是瓶颈。波利亚第一步的原话是「弄懂问题比解决问题更花时间，而这时间是值得的」。我跳过第一步省下的半小时，用两天的无效劳动还了债。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑故事 #2：跳过「回顾」，同一个坑摔两次。&lt;/strong&gt; 一个时区 bug：存入用本地时间、读出按 UTC 解析，差了 8 小时。修完发版，谁都没写复盘。三个月后另一个同事在另一个模块踩了&lt;strong&gt;一模一样的坑&lt;/strong&gt;——因为第一次修复时没有任何沉淀，知识只存在于当时的聊天记录里。现在团队的规矩：&lt;strong&gt;bug 修复的 PR 描述里必须有一节「回顾」：根因一句话、为什么防线没拦住、同类问题怎么预防。&lt;/strong&gt; 没有这一节，CR 不予通过。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑故事 #3：不会特殊化，在 1000 万数据里捞针。&lt;/strong&gt; 排查一个「偶发数据错乱」，我盯着生产日志看了半天毫无头绪。带教我的老同事只做了一件事：&lt;strong&gt;把并发从 500 缩到 2，把数据缩到 10 条，在本地用脚本循环触发&lt;/strong&gt;——二十分钟后稳定复现，是个竞态条件。特殊化不是「缩小问题的怂办法」，是把信噪比从 1:10000 拉到 1:1 的工程手段。最小复现 demo 的价值，怎么强调都不过分。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑故事 #4：倒推法救了一次订单状态机改造。&lt;/strong&gt; 订单状态迁移改造，正着推「从待支付出发能到哪」越推越乱。换成倒推——&lt;strong&gt;从终态「已完成/已关闭」往回推「谁有资格流转进来」&lt;/strong&gt;，状态机的约束条件一次就清晰了。波利亚说的倒推，在状态机、数据血缘、接口依赖分析里屡试不爽。&lt;/p&gt;
&lt;h3 id=&#34;4-实践方法论两份可抄的模板&#34;&gt;4. 实践方法论：两份可抄的模板&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;模板 A：debug 四步卡（贴在工位）&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;【弄清问题】现象是什么？期望 vs 实际，精确到字段/时间/用户。
          100% 复现还是偶发？偶发的触发条件有什么共性？
【拟定计划】假设是什么？（写下来！）怎么证伪？
          能缩小范围吗？（二分 / 缩数据量 / 缩并发）能倒推吗？
【执行计划】每一步验证都记录，不许「改一下试试」。
【回顾】根因一句话。为什么防线没拦住？同类问题 checklist +1。&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;模板 B：算法题/技术方案四步&lt;/strong&gt;（同理可套，重点是把「回顾」写成题解/方案文档的固定一节）&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;思考与感悟之一&lt;/strong&gt;：波利亚这本书最让我震动的是它对「聪明」的祛魅。会解题的人不是脑回路不同，而是&lt;strong&gt;手里有一套启发法清单，在卡住的时候逐条试&lt;/strong&gt;。卡住时不是「我不行」，是「我的清单还没试完」。清单可以学，天赋不能学——这对自评「逻辑弱」的人是最大的好消息。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;下篇-系统之美别找替罪羊找结构&#34;&gt;下篇 《系统之美》：别找替罪羊，找结构&lt;/h2&gt;
&lt;h3 id=&#34;1-全书骨架存量流量反馈回路&#34;&gt;1. 全书骨架：存量、流量、反馈回路&lt;/h3&gt;
&lt;p&gt;梅多斯的这本书只给你三个概念，但这三个概念能解释线上事故的半壁江山：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    subgraph 基础[&amp;#34;两个基础概念&amp;#34;]
        ST[&amp;#34;存量 Stock&amp;lt;br/&amp;gt;池子里的水：队列长度&amp;lt;br/&amp;gt;连接数 在途订单 技术债&amp;#34;]
        FL[&amp;#34;流量 Flow&amp;lt;br/&amp;gt;水位变化率：请求速率&amp;lt;br/&amp;gt;消费速率 需求涌入速度&amp;#34;]
        FL --&amp;gt;|流入/流出| ST
    end
    subgraph 回路[&amp;#34;两种反馈回路&amp;#34;]
        B[&amp;#34;调节回路&amp;lt;br/&amp;gt;让系统回到目标&amp;lt;br/&amp;gt;如: 自动扩容 限流&amp;#34;]
        R[&amp;#34;增强回路&amp;lt;br/&amp;gt;自我强化 滚雪球&amp;lt;br/&amp;gt;如: 重试风暴 谣言传播&amp;#34;]
    end
    D[&amp;#34;时延 Delay&amp;lt;br/&amp;gt;反馈总是迟到的&amp;lt;br/&amp;gt;多数振荡的元凶&amp;#34;] -.-&amp;gt; B
    D -.-&amp;gt; R&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;一句话版本：&lt;strong&gt;看任何系统，先问「池子（存量）是什么、进出水管（流量）多粗、有没有回路、反馈迟到多久」。&lt;/strong&gt; 时延是隐藏主角——调节回路配上长时延，就会从「稳定器」变成「振荡器」。&lt;/p&gt;
&lt;h3 id=&#34;2-踩坑故事三个概念解释三个事故&#34;&gt;2. 踩坑故事：三个概念解释三个事故&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;踩坑故事 #5：重试风暴——增强回路的教科书。&lt;/strong&gt; 下游服务响应变慢，我们的客户端配置是「超时 3 秒，失败重试 3 次」。下游越慢 → 超时越多 → 重试越多 → 下游请求量放大 4 倍 → 更慢。典型的增强回路，三十分钟内把一个「有点慢」滚成了「全站挂」。解法书上写得明白：&lt;strong&gt;增强回路必须靠回路外的力量打断&lt;/strong&gt;——我们加了熔断（连续失败直接拒绝）+ 指数退避 + 重试预算（每分钟最多重试 N 次），等于在回路上装了一个「断路器」。没读过这本书之前，我们的复盘结论写的是「下游不稳定，下次注意」——注意是没用的，结构不改变，回路下次照样滚起来。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑故事 #6：缓存雪崩——调节回路被同时失效。&lt;/strong&gt; 一批缓存 key 设了同样的 TTL，凌晨同一时间集体过期，请求全部打到数据库；数据库变慢 → 请求堆积（存量暴涨）→ 连接池耗尽 → 更多超时。本应是调节回路的「数据库兜底」在流量尖峰面前完全失效。解法是给 TTL 加随机抖动（错开过期时间）+ 热点 key 永不过期用异步刷新 + 数据库前加请求合并。教训：&lt;strong&gt;凡是「大家一起同时做同一件事」的设计，都是定时引爆的雪崩&lt;/strong&gt;——TTL、定时任务、证书过期，全都要加抖动。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑故事 #7：告警阈值节节高——目标侵蚀回路。&lt;/strong&gt; 某接口错误率告警最初定在 0.1%，老是误报，调成 0.5%；又吵，调成 1%……半年后错误率日常 0.8%，没人觉得有问题，直到一次资损复盘才发现它早就烂了。这是书中「目标侵蚀」陷阱的标准形态：&lt;strong&gt;系统表现差 → 下调标准 → 表现更差 → 再下调&lt;/strong&gt;，温水煮青蛙。对策：阈值变更必须走评审并记录理由，且只允许绑定到「误报率治理动作」上，不允许单独上调。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;踩坑故事 #8：加机器治不了慢查询——杠杆点选错。&lt;/strong&gt; 接口变慢，第一反应是扩容。机器翻倍，延迟纹丝不动——因为瓶颈是一条全表扫描的 SQL，&lt;strong&gt;流量（请求）再大，存量（未优化的工作单元）处理能力没变&lt;/strong&gt;。书中最反直觉的一章是「杠杆点」：在错误的地方用力，越努力越糟。扩容改的是流量侧的参数，建索引改的是系统结构——后者才是杠杆点。&lt;/p&gt;
&lt;h3 id=&#34;3-实践方法论系统问题分析清单&#34;&gt;3. 实践方法论：系统问题分析清单&lt;/h3&gt;
&lt;p&gt;遇到「反复发作」的问题，别急着修，先画一张图：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;strong&gt;存量是什么？&lt;/strong&gt;（队列、连接数、在途任务、技术债——先找到那个「池子」）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;strong&gt;进/出流量各由什么决定？&lt;/strong&gt;（谁往里灌？谁在消费？瓶颈在哪一侧？）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;strong&gt;有没有增强回路？&lt;/strong&gt;（A 导致更多 A？——重试、挤兑、恐慌都算）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;strong&gt;调节回路为什么失效了？&lt;/strong&gt;（兜底被打穿？阈值被侵蚀？容量跟不上？）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;strong&gt;反馈时延有多长？&lt;/strong&gt;（监控多久才发现？扩容多久才生效？）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;strong&gt;如果只能改一处，改参数、改结构、还是改目标？&lt;/strong&gt;（杠杆点从大到小：目标 &amp;gt; 结构 &amp;gt; 参数）&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;思考与感悟之二&lt;/strong&gt;：读完这本书我改了一个用词习惯——复盘时不再说「谁的问题」，改说「什么结构持续产生这个问题」。&lt;strong&gt;个人的失误是一次性的，结构的缺陷是生产性的&lt;/strong&gt;：不重试风暴的锅给「下游不稳定」，下次换个下游照样风暴。把「人」换成「回路」，复盘才真正开始有产出。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;合读什么时候用哪本&#34;&gt;合读：什么时候用哪本&lt;/h2&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    P[&amp;#34;问题出现&amp;#34;] --&amp;gt; F[&amp;#34;先走波利亚四步&amp;lt;br/&amp;gt;弄清→计划→执行→回顾&amp;#34;]
    F --&amp;gt; R{&amp;#34;回顾时问:&amp;lt;br/&amp;gt;这类问题出现过几次？&amp;#34;}
    R --&amp;gt;|&amp;#34;第一次&amp;#34;| D[&amp;#34;修完收工&amp;lt;br/&amp;gt;checklist +1&amp;#34;]
    R --&amp;gt;|&amp;#34;三次以上&amp;#34;| S[&amp;#34;切换《系统之美》&amp;lt;br/&amp;gt;画存量流量图 找回路&amp;lt;br/&amp;gt;改结构 不是改人&amp;#34;]
    style S fill:#e8f4e8&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;两本书的分工一句话说清：&lt;strong&gt;波利亚教你把单个问题解干净，梅多斯教你看出哪些问题根本不是「单个」的。&lt;/strong&gt;「回顾」这一步恰好是两本书的接口——波利亚让你在回顾时问「这题教会我什么」，系统之美接着问「这类题为什么总出现」。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;思考与感悟之三（收尾）&lt;/strong&gt;：程序员的成长里有个隐形分水岭——从「解决问题的人」变成「改造产生问题的系统的人」。波利亚的书把你送到分水岭，梅多斯的书带你翻过去。翻过去之后你会发现，&lt;strong&gt;最好的修复往往不在代码里&lt;/strong&gt;：一个加了抖动的 TTL、一个装在回路上的熔断器、一份不许跳过的回顾模板。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;附落地清单贴工位版&#34;&gt;附：落地清单（贴工位版）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;《怎样解题》侧——解单个问题时：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 问题弄清了吗？（期望 vs 实际，精确到可复现）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 假设写下来了吗？验证方式写下来了吗？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 卡住了？试启发法清单：倒推 / 特殊化 / 类比 / 重新表述&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 回顾写了吗？（根因一句话 + 防线为什么没拦住 + checklist +1）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;《系统之美》侧——问题反复发作时：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 池子（存量）找到了吗？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 有增强回路吗？断路器装在哪？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 调节回路为什么失效？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 反馈时延多长？振荡是时延造成的吗？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 我在改参数、改结构，还是改目标？（别在参数层用力过猛）&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>程序员逻辑思维训练手册：书单、方法与 12 周刻意练习计划</title>
      <link>https://ftmao.com/blog/posts/programmer-logical-thinking-training/</link>
      <pubDate>Sun, 04 Sep 2022 10:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/posts/programmer-logical-thinking-training/</guid>
      <description>&lt;h1 id=&#34;程序员逻辑思维训练手册书单方法与-12-周刻意练习计划&#34;&gt;程序员逻辑思维训练手册：书单、方法与 12 周刻意练习计划&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;写这篇的动机很直接：「我感觉自己逻辑思维很弱」是我听过最多、也最难回答的自我评价。它太大了，大到无从下手。&lt;br&gt;
这篇的思路：&lt;strong&gt;先把「逻辑思维」这个模糊的大词拆成五种具体的、可单独训练的能力，再给每种能力配书、配练习、配检查清单&lt;/strong&gt;，最后拼成一份 12 周计划。跟着清单做就行，不用自己设计训练方案。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第一篇-先诊断逻辑思维不是一个东西是五个东西&#34;&gt;第一篇 先诊断：逻辑思维不是一个东西，是五个东西&lt;/h2&gt;
&lt;p&gt;「逻辑思维弱」是个无法改进的表述——就像说「我身体不好」而不说「我 5 公里跑不下来」。先拆开：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    L[&amp;#34;逻辑思维&amp;#34;] --&amp;gt; A[&amp;#34;1 概念清晰&amp;lt;br/&amp;gt;说的每个词都有明确所指&amp;lt;br/&amp;gt;症状: 需求评审说不清&amp;lt;br/&amp;gt;变量命名含糊&amp;#34;]
    L --&amp;gt; B[&amp;#34;2 推理链条&amp;lt;br/&amp;gt;从前提一步步走到结论&amp;lt;br/&amp;gt;症状: 排查 bug 靠猜&amp;lt;br/&amp;gt;改 A 坏 B 想不到为什么&amp;#34;]
    L --&amp;gt; C[&amp;#34;3 抽象分层&amp;lt;br/&amp;gt;能切换粒度看问题&amp;lt;br/&amp;gt;症状: 代码揉成一团&amp;lt;br/&amp;gt;说不清系统架构&amp;#34;]
    L --&amp;gt; D[&amp;#34;4 边界意识&amp;lt;br/&amp;gt;看到输入就想边界与异常&amp;lt;br/&amp;gt;症状: 上线后被空指针/&amp;lt;br/&amp;gt;越界/并发打脸&amp;#34;]
    L --&amp;gt; E[&amp;#34;5 因果辨析&amp;lt;br/&amp;gt;区分相关/因果/巧合&amp;lt;br/&amp;gt;症状: 复盘归错因&amp;lt;br/&amp;gt;优化没效果&amp;#34;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;对照一下，你的「弱」大概率集中在其中两三个上。&lt;strong&gt;诊断的意义在于：五种能力的训练方法完全不同&lt;/strong&gt;，混着练等于白练。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;能力&lt;/th&gt;
					&lt;th&gt;最痛的日常场景&lt;/th&gt;
					&lt;th&gt;对应训练&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;概念清晰&lt;/td&gt;
					&lt;td&gt;需求理解偏差、命名糟糕&lt;/td&gt;
					&lt;td&gt;定义练习、费曼讲解&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;推理链条&lt;/td&gt;
					&lt;td&gt;debug 靠蒙、日志看不出因果&lt;/td&gt;
					&lt;td&gt;假设-验证法、画调用链&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;抽象分层&lt;/td&gt;
					&lt;td&gt;代码越写越乱、讲不清架构&lt;/td&gt;
					&lt;td&gt;分层画图、重构练习&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;边界意识&lt;/td&gt;
					&lt;td&gt;边界 bug 反复出现&lt;/td&gt;
					&lt;td&gt;防御性 checklist、测试先行&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;因果辨析&lt;/td&gt;
					&lt;td&gt;复盘甩锅、优化玄学&lt;/td&gt;
					&lt;td&gt;五问法、对照实验&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;思考与感悟之一&lt;/strong&gt;：编程本质是「用精确的语言描述精确的推理」。IDE 不会因为你概念模糊而报错，编译器不会因为你因果搞错而拒绝构建——&lt;strong&gt;代码能跑通和逻辑是对的之间，隔着一万个线上事故&lt;/strong&gt;。这也是为什么逻辑思维的训练必须在代码之外单独进行。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第二篇-书单按能力分级别从离散数学开始&#34;&gt;第二篇 书单：按能力分级，别从《离散数学》开始&lt;/h2&gt;
&lt;h3 id=&#34;21-入门层先把讲道理的基本功补上&#34;&gt;2.1 入门层：先把「讲道理」的基本功补上&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;书&lt;/th&gt;
					&lt;th&gt;练什么&lt;/th&gt;
					&lt;th&gt;怎么读&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;《简单逻辑学》（D.Q. 麦克伦尼）&lt;/td&gt;
					&lt;td&gt;概念清晰 + 推理链条&lt;/td&gt;
					&lt;td&gt;薄，一周读完。重点看「论证的前提与结论」「常见谬误」两章&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;《学会提问》（尼尔·布朗）&lt;/td&gt;
					&lt;td&gt;因果辨析&lt;/td&gt;
					&lt;td&gt;批判性思维入门，重点看「证据的效力」「有没有替代原因」&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;《金字塔原理》（芭芭拉·明托）&lt;/td&gt;
					&lt;td&gt;抽象分层（表达侧）&lt;/td&gt;
					&lt;td&gt;结论先行、以上统下。对写技术方案、汇报、写博客立竿见影&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;22-进阶层直接长在编程上的思维&#34;&gt;2.2 进阶层：直接长在编程上的思维&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;书&lt;/th&gt;
					&lt;th&gt;练什么&lt;/th&gt;
					&lt;th&gt;怎么读&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;《怎样解题》（波利亚）&lt;/td&gt;
					&lt;td&gt;推理链条&lt;/td&gt;
					&lt;td&gt;数学书的外壳，debug 的内核。「弄清问题→拟定计划→执行→回顾」就是排查 bug 的标准流程&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;《系统之美》（德内拉·梅多斯）&lt;/td&gt;
					&lt;td&gt;抽象分层 + 因果辨析&lt;/td&gt;
					&lt;td&gt;库存、流量、队列都是系统。看完你会用「反馈回路」的眼光看重试风暴、缓存雪崩&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;《程序员修炼之道》&lt;/td&gt;
					&lt;td&gt;全部五种&lt;/td&gt;
					&lt;td&gt;工程场景化的思维训练，DRY、正交性、曳光弹，每一条都在教你怎么把问题切干净&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;23-硬核层可选别勉强&#34;&gt;2.3 硬核层：可选，别勉强&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;《离散数学及其应用》：命题逻辑、集合、图论——编程的数学地基。只建议读前三章，当工具书查。&lt;/li&gt;
&lt;li&gt;《思考，快与慢》：知道大脑什么时候在骗你。和编程不直接相关，但和「复盘归错因」直接相关。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;选书原则：一次只读一本，读完一本书的每一章都要落到「这周我在代码里用了它哪一点」。&lt;/strong&gt; 读而不用的思维书，和收藏夹里的技术文章没有区别。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[&amp;#34;入门层&amp;lt;br/&amp;gt;讲道理的基本功&amp;#34;] --&amp;gt; B[&amp;#34;进阶层&amp;lt;br/&amp;gt;长在编程上的思维&amp;#34;]
    B --&amp;gt; C[&amp;#34;硬核层&amp;lt;br/&amp;gt;数学地基 可选&amp;#34;]
    A -.-&amp;gt;|&amp;#34;每章落到&amp;lt;br/&amp;gt;一次代码实践&amp;#34;| P[&amp;#34;不是读完&amp;lt;br/&amp;gt;是用完&amp;#34;]
    B -.-&amp;gt; P
    style P fill:#e8f4e8&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;第三篇-日常训练法把练习藏进你每天都在做的事里&#34;&gt;第三篇 日常训练法：把练习藏进你每天都在做的事里&lt;/h2&gt;
&lt;p&gt;刻意练习的关键不是额外抽两小时，而是&lt;strong&gt;改造已有的工作动作&lt;/strong&gt;。五个场景，每个配一个可检查的动作：&lt;/p&gt;
&lt;h3 id=&#34;31-写代码前先说清再动手练概念清晰&#34;&gt;3.1 写代码前：先说清，再动手（练概念清晰）&lt;/h3&gt;
&lt;p&gt;接到需求后，强制自己写三句话再开编辑器：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 这个功能的&lt;strong&gt;输入&lt;/strong&gt;是什么？（精确到字段和类型）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; &lt;strong&gt;输出&lt;/strong&gt;是什么？什么情况算成功？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 有哪三种&lt;strong&gt;必然失败&lt;/strong&gt;的情况？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;写不出来，就是概念还没清晰，回去问。这一步能拦掉一半的返工。&lt;/p&gt;
&lt;h3 id=&#34;32-排查-bug假设-验证法练推理链条&#34;&gt;3.2 排查 bug：假设-验证法（练推理链条）&lt;/h3&gt;
&lt;p&gt;禁止「改一下试试」。用 debug 日志模板强制走流程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 写下&lt;strong&gt;假设&lt;/strong&gt;：「我认为是 X 导致 Y，因为 Z」&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 写下&lt;strong&gt;验证方式&lt;/strong&gt;：看什么日志/加什么断点能证实或证伪&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 验证结果与假设&lt;strong&gt;不符时，先怀疑假设，不要怀疑现象&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 修复后写下：根因是什么？为什么之前的推理没走到这？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;波利亚的「回顾」一步，90% 的人会跳过——而推理能力的增长恰恰只发生在这一步。&lt;/p&gt;
&lt;h3 id=&#34;33-讲清楚一个模块费曼技巧练抽象分层&#34;&gt;3.3 讲清楚一个模块：费曼技巧（练抽象分层）&lt;/h3&gt;
&lt;p&gt;每月一次，挑你负责的一个模块，画一张三层图讲给同事（或 AI）听：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 第一层：一句话说清它是干什么的&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 第二层：三个以内的子模块 + 它们之间的关系&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 第三层：被追问时才能展开的细节&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;讲卡壳的地方，就是你分层的薄弱处。&lt;strong&gt;能给 AI 把一个需求描述到它一次生成正确代码，是概念清晰度的绝佳试金石&lt;/strong&gt;——prompt 写不清楚，多半是自己也没想清楚。&lt;/p&gt;
&lt;h3 id=&#34;34-code-review五问清单练因果辨析&#34;&gt;3.4 Code Review：五问清单（练因果辨析）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 这个改动解决了什么&lt;strong&gt;问题&lt;/strong&gt;？（还是先有的方案？）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 问题和改动之间是&lt;strong&gt;因果&lt;/strong&gt;还是&lt;strong&gt;相关&lt;/strong&gt;？（「上次加了缓存就好了」是相关，不是因果）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 有没有&lt;strong&gt;替代原因&lt;/strong&gt;能解释这个现象？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 这个改动的&lt;strong&gt;副作用边界&lt;/strong&gt;在哪？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 如果它是错的，我们&lt;strong&gt;多快能发现&lt;/strong&gt;？&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;35-复盘只问为什么链练因果辨析&#34;&gt;3.5 复盘：只问「为什么链」（练因果辨析）&lt;/h3&gt;
&lt;p&gt;线上事故复盘禁用「我疏忽了」「运气不好」这类不可证伪的词。只允许五问法往下钻，直到钻出一个&lt;strong&gt;可执行的流程或工具改进&lt;/strong&gt;为止。「粗心」不是根因，「为什么粗心能穿过所有防线到达线上」才是。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;思考与感悟之二&lt;/strong&gt;：所有训练法的共同点是「把隐式思维变成显式文字」。脑子里的推理可以偷步、可以跳步、可以自我欺骗，&lt;strong&gt;落在纸上的推理不能&lt;/strong&gt;。写作是逻辑思维最便宜的压力测试。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第四篇-12-周刻意练习计划&#34;&gt;第四篇 12 周刻意练习计划&lt;/h2&gt;
&lt;p&gt;每周一个主题。规则：&lt;strong&gt;周末用 30 分钟对照自检清单打分，三项里两项不达标，下周重复同一主题&lt;/strong&gt;。宁可 12 周练成 6 项，不要 12 周路过 12 项。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    subgraph P1[&amp;#34;第 1-4 周 概念与推理&amp;#34;]
        W1[&amp;#34;W1 定义练习&amp;lt;br/&amp;gt;读《简单逻辑学》&amp;lt;br/&amp;gt;给 10 个日常用词写精确定义&amp;#34;]
        W2[&amp;#34;W2 需求拆解&amp;lt;br/&amp;gt;每个需求先写输入/输出/失败&amp;lt;br/&amp;gt;再动手&amp;#34;]
        W3[&amp;#34;W3 假设-验证 debug&amp;lt;br/&amp;gt;每个 bug 走完整模板&amp;#34;]
        W4[&amp;#34;W4 谬误识别&amp;lt;br/&amp;gt;读《学会提问》&amp;lt;br/&amp;gt;在技术讨论里找出 5 个逻辑谬误&amp;#34;]
    end
    subgraph P2[&amp;#34;第 5-8 周 抽象与边界&amp;#34;]
        W5[&amp;#34;W5 金字塔表达&amp;lt;br/&amp;gt;读《金字塔原理》&amp;lt;br/&amp;gt;写 2 篇结论先行的技术方案&amp;#34;]
        W6[&amp;#34;W6 费曼讲解&amp;lt;br/&amp;gt;画 1 张三层模块图并讲出来&amp;#34;]
        W7[&amp;#34;W7 边界清单&amp;lt;br/&amp;gt;给负责的接口建防御性 checklist&amp;#34;]
        W8[&amp;#34;W8 测试先行&amp;lt;br/&amp;gt;一个完整功能 TDD 写下来&amp;#34;]
    end
    subgraph P3[&amp;#34;第 9-12 周 因果与系统&amp;#34;]
        W9[&amp;#34;W9 复盘训练&amp;lt;br/&amp;gt;读《系统之美》&amp;lt;br/&amp;gt;找 1 个旧事事故做五问法复盘&amp;#34;]
        W10[&amp;#34;W10 对照实验&amp;lt;br/&amp;gt;一次性能优化用基准数据说话&amp;#34;]
        W11[&amp;#34;W11 解题流程&amp;lt;br/&amp;gt;读《怎样解题》&amp;lt;br/&amp;gt;按四步解 5 道算法题并写回顾&amp;#34;]
        W12[&amp;#34;W12 综合输出&amp;lt;br/&amp;gt;写 1 篇技术博客&amp;lt;br/&amp;gt;把 12 周里最有体感的一条讲透&amp;#34;]
    end
    P1 --&amp;gt; P2 --&amp;gt; P3&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;每周自检清单通用模板&#34;&gt;每周自检清单（通用模板）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 本周的书读了吗？哪一章的观点我这周&lt;strong&gt;真的用了&lt;/strong&gt;？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 本周的练习动作做了几次？（写次数，不写「做了」）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 有没有一个具体场景，我能说出「如果没有这周的训练，我会做错」？&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;两个提醒&#34;&gt;两个提醒&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;不要同时练多项&lt;/strong&gt;。认知资源有限，一周一个主题已经很难。觉得慢，说明做对了——肌肉记忆的形成从来是慢的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;输出强制闭环&lt;/strong&gt;。第 12 周的博客不是可选项。能把「我怎么练的」讲清楚，本身就是五种能力的综合考试。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;思考与感悟之三&lt;/strong&gt;：逻辑思维不是天赋，是&lt;strong&gt;可分解、可练习、可度量&lt;/strong&gt;的技能组——和学一门框架没有本质区别。区别在于框架三个月过期，这套东西跟你三十年。投资回报率不在同一个数量级上。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;附一句话总纲&#34;&gt;附：一句话总纲&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;诊断先行&lt;/strong&gt;：先弄清弱在五种能力的哪几种，再选训练。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;书不在多&lt;/strong&gt;：一本一用，每章落到代码里才算读过。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;改造日常&lt;/strong&gt;：练习藏进写需求、debug、CR、复盘里，不靠额外抽时间。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;显式化&lt;/strong&gt;：把推理写下来，写下来就不能骗自己。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;12 周起评&lt;/strong&gt;：周末自检，不达标就重复，最后以一篇博客闭环。&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
  </channel>
</rss>
