<?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/%E7%A8%8B%E5%BA%8F%E5%91%98%E4%BF%AE%E7%82%BC%E4%B9%8B%E9%81%93/</link>
    <description>AI 视频、AI Agent 与工程实践笔记</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Mon, 05 Sep 2022 16:00:00 +0800</lastBuildDate><atom:link href="https://ftmao.com/blog/tags/%E7%A8%8B%E5%BA%8F%E5%91%98%E4%BF%AE%E7%82%BC%E4%B9%8B%E9%81%93/index.xml" rel="self" type="application/rss+xml" /><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>
    
  </channel>
</rss>
