<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>胡皓 - 枪炮与代码</title>
  
  <subtitle>从士兵到软件匠人的侃侃而谈</subtitle>
  <link href="https://huhao.dev/atom.xml" rel="self"/>
  
  <link href="https://huhao.dev/"/>
  <updated>2021-04-04T09:42:01.000Z</updated>
  <id>https://huhao.dev/</id>
  
  <author>
    <name>胡皓</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>8x Flow 业务建模法（二）：再看什么是业务逻辑</title>
    <link href="https://huhao.dev/posts/a7c771dd/"/>
    <id>https://huhao.dev/posts/a7c771dd/</id>
    <published>2021-04-04T09:42:01.000Z</published>
    <updated>2021-04-04T09:42:01.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>在上一篇文章<a href="/posts/2932e594/">《8x Flow 业务建模法（一）：你能分清业务和领域吗？》</a>中，向大家介绍了8x Flow背后的关键思想，即“业务逻辑和领域逻辑”分离，并介绍了业务逻辑和领域逻辑的区别。</p><p>从本篇文章开始，我将逐步为大家介绍8x Flow从分析、建模、架构再到实现的具体方法。</p><p>原计划这次讲一讲如何基于“合约上下文”进行业务分析和业务逻辑提取，但是因为收到了很多读者的反馈，希望能够更多的讲讲业务逻辑是什么意思，以便更好的“分离业务和领域”。</p><p>所以在开始进行业务分析之前，我们需要再来一篇多聊一聊：<strong>到底什么是业务？</strong></p><span id="more"></span><h2 id="什么是业务"><a href="#什么是业务" class="headerlink" title="什么是业务"></a>什么是业务</h2><p>在上一篇文章中，我们对于业务逻辑的定义是：</p><blockquote><p>业务逻辑：源自业务运营的逻辑，是领域中立且运营特定的，其复杂度来自于流程本身，关注的是如何盈利和成本结构（或者可以理解为对外体现为利润或现金，对内体现为成本和绩效承诺），常见于：合同、法务、会计、审计等。</p></blockquote><p>这个一眼看上去还是会比较抽象，尤其是对经验较少的人来说。</p><p>我们先来回归一下“业务（Business）”这个词的定义，在<a href="https://en.wikipedia.org/wiki/Business">维基百科</a>上有着比较贴切的解释：</p><blockquote><p>Business is the activity of making one’s living or making money by producing or buying and selling products (such as goods and services). Simply put, it is “any activity or enterprise entered into for profit.” 业务是指通过生产或买卖产品（如商品和服务）来谋生或赚钱的活动。简单地说，它是“以盈利为目的的任何活动或企业”。</p></blockquote><p><em>（PS：<code>Business</code>有时候也被翻译成“商业”，但是”商业“还有另一个单词，即<code>Commerce</code>。<code>Commerce</code>一词更偏向具体的贸易、交易，而<code>Business</code>则偏向更广泛的（商业）业务。）</em></p><p>结合对于以上概念解释，以下几个8x Flow对于业务逻辑的定义，就更加容易理解了：</p><ul><li><strong>业务逻辑关注的是如何盈“利”的特定运营流程</strong></li><li><strong>“利”对外关注的是如何通过提供商品或服务盈利</strong></li><li><strong>“利”对内关注的是如何控制成本结构和绩效</strong></li></ul><p>另外，更为重要的是：<strong>在现实中，业务活动作为企业运营的一部分，还天然的受到合同法的保护。而另外的一部分则是不涉及合同法的，这些部分往往是领域活动。</strong></p><h2 id="业务流程即业务凭证的追溯过程"><a href="#业务流程即业务凭证的追溯过程" class="headerlink" title="业务流程即业务凭证的追溯过程"></a>业务流程即业务凭证的追溯过程</h2><p>在介绍完业务一词的意思之后，我们再来看一看前面说的“特定运营流程”和“领域中立”是什么意思。</p><p>其实这个非常好理解——只需要我们往回倒退几十年，回到那个没有电子信息化辅助的年代，排除软件系统在当代对于我们的认知干扰。</p><p>让我们回想一下，如果没有软件，那个纯纸质的年代，去公对公订购或销售一件商品，那个过程是怎样的？</p><blockquote><p>甲方：决定询价（过程） → 甲方：给出询价单（纸质凭证） → 乙方销售：决定报价（过程） → 乙方销售：给出报价单（纸质凭证） → 甲方：决定订购（过程） → 甲方：下订单或签署采购合同（纸质凭证） → 乙方销售：审验订单或采购合同（过程） → 乙方销售：订单或采购合同确认回执（纸质凭证） → 甲方财务：支付订单款项（过程） → 甲方财务：给出支付凭证（纸质凭证） → 乙方财务：核验支付记录（过程） → 乙方财务：出具收据或发票（纸质凭证） → 乙方销售：协调出库（过程） → 乙方库房：出库（过程） → 乙方库房：出库单（纸质凭证） → 乙方物流：安排运输（过程） → 乙方物流：发货单（纸质凭证）……</p></blockquote><p>以上就是一个大概的不完整过程举例。</p><p>当这样一个商品的交易过程结束之后，人们怎么确认发生过这样一个交易呢？很简单，通过<strong>追溯交易过程中所产生的凭证</strong>：</p><blockquote><p>甲方：询价单（纸质凭证） → 乙方销售：报价单（纸质凭证） → 甲方：订单或采购合同（纸质凭证） → 乙方销售：订单或采购合同确认回执（纸质凭证） → 甲方财务：支付凭证（纸质凭证） → 乙方财务：收据或发票（纸质凭证） → 乙方库房：出库单（纸质凭证） → 乙方物流：发货单（纸质凭证）……</p></blockquote><p>如果更进一步的消除一些相关文字信息而聚焦凭证本身的话，那么就是：</p><blockquote><p>询价单 → 报价单 → 订单或采购合同 → 订单或采购合同确认回执 → 支付凭证 → 收据或发票 → 出库单 → 发货单……</p></blockquote><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/20210404150458-2021-04-04-15-04-59.png" alt="还记得纸质凭证的样子吗？"></p><p><strong>当追溯这些凭证的时候，所有的“过程”，也就是凭证是如何产生的，已经可以忽略不计了甚至记不清了（或者说不关注），这就是“领域中立”。</strong></p><p><strong>而这些可追溯凭证所串起来的流程，即“特定运营流程”，也就是“业务流程”。</strong></p><p>而在今天这个信息化的时代，由于软件带来的过程管理和交互的便利性，过去的相当一部分线下过程逐步被搬到了线上，所以很多时候大家都会被在线操作的众多过程记录模糊了“业务凭证”的概念和边界。</p><p>正是由于基于凭证的业务过程追溯是天然产生且客观存在的，所以我们可以说：<strong>业务流程即业务凭证的追溯过程</strong>。</p><h2 id="业务凭证不可变且不可抛弃"><a href="#业务凭证不可变且不可抛弃" class="headerlink" title="业务凭证不可变且不可抛弃"></a>业务凭证不可变且不可抛弃</h2><p>既然我们现在澄清了业务流程实际上就是对于业务凭证的追溯过程，那这里不得不强调由“可追溯”所带来的一个业务凭证的特征，即：</p><p><strong>业务凭证具有不可变性和不可抛弃性</strong></p><p>什么意思呢？其实理解起来也很简单：<strong>业务凭证代表了历史上的每一个关键业务事件的结果，历史事件一经发生，不可篡改，若篡改则是秽史；不可丢失，若丢失则不可追溯。</strong></p><p>拿现实中的例子来举例，例如财务记账中的开发票：</p><p>当开出一张发票后，如果发票信息有误，是不能直接作废丢纸篓的，也是不能直接修改或重开的。做出补偿的办法是先要进行“发票冲红”，即通过开具一张与原有蓝字发票一模一样的红字的“红冲发票”，来进行冲抵，然后再重新开具一张正确的蓝字发票。</p><p>（红字发票的图片太不好找了，只好找个记账的例子说明一下……）</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/20210404154019-2021-04-04-15-40-19.png" alt="记账中蓝字和红字的区别"></p><p>这个场景就是一个非常典型的“不可变”和“不可抛弃”的例子。</p><p>换句话说：<strong>作为业务凭证，只存在创建，不存在修改和删除</strong>（Event Sourcing也具有一样的特征，这就是“可追溯”的本质）。</p><p><strong>为什么我们要强调业务凭证的不可变和不可抛弃呢？因为从架构设计视角来看，如果我们给业务系统实现了CRUD（Create &#x2F; Read &#x2F; Update &#x2F; Delete）的API，那显然就做错了，因为基于以上理论，业务系统的对外API应当只有CR，没有UD。</strong></p><p>如果我们不能准确的认知业务逻辑的特征，并显性的做出区分，架构上怎么能体现并满足业务的这个特点呢？从API上都无法“隔离变化”对吧？</p><h2 id="业务逻辑即履约过程"><a href="#业务逻辑即履约过程" class="headerlink" title="业务逻辑即履约过程"></a>业务逻辑即履约过程</h2><p>在澄清了业务、业务流程、业务凭据等概念之后，让我们回到文章想要说明的关键问题上：<strong>到底什么是业务逻辑？</strong></p><p>我先抛结论：</p><p><strong>业务逻辑，即业务的甲乙双方，基于业务合约的权责约定，进行履约的过程。在现实中，相关的履约过程在合约上下文内受法律保护。</strong></p><p>这句话怎么理解呢？让我们回过头来看之前的业务一词的概念，以及商品订购的那个流程：</p><blockquote><p>业务是指通过生产或买卖产品（如商品和服务）来谋生或赚钱的活动。</p></blockquote><blockquote><p>甲方：询价单（纸质凭证） → 乙方销售：报价单（纸质凭证） → 甲方：订单或采购合同（纸质凭证） → 乙方销售：订单或采购合同确认回执（纸质凭证） → 甲方财务：支付凭证（纸质凭证） → 乙方财务：收据或发票（纸质凭证） → 乙方库房：出库单（纸质凭证） → 乙方物流：发货单（纸质凭证）……</p></blockquote><p>我们会发现，所有的业务和业务凭证，都必然存在“甲乙方”，也就是“权责双方”。现实中所有的业务，都是建立在某种合约关系之上的，根据其法务严肃程度的不同，可以分为<code>合同（Contract）</code>或<code>协议（Agreement）</code>等形式，为了统一语言，我们可以统称为<code>合约（Contracts）</code>。</p><p>让我们快速脑补一下签署合同并履约的一个常见的完整过程（对于经常参与售前和投标的朋友来说应该非常熟悉）：</p><ol><li>甲方先要进行<code>询价（Request for Proposal，简称RFP）</code>，然后乙方给出<code>报价（Proposal）</code>，随后双方根据报价方案签订<code>合约（Contract）</code>。</li><li>合约签订之后，双方就会根据合约中的权责条款进行逐项<code>履约（Fulfillment）</code>。</li><li>每次履约实际上分成了两类，一个是<code>履约申请（Fulfillment Request）</code>，一个是<code>履约确认（Fulfillment Confirmation）</code>，分别由甲乙双方的其中一方执行，其中履约申请是一个时间段，而履约确认是一个或多个时间点（因为履约总是需要个过程，不可能瞬间完成）。</li></ol><p>我们可以根据以上的合约签订和履约逻辑，抽象出以下的<code>合约上下文（Contract Context）模型</code>：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/%E5%90%88%E7%BA%A6%E4%B8%8A%E4%B8%8B%E6%96%87%E6%A8%A1%E5%9E%8B-2021-04-04-16-54-59.png" alt="合约上下文模型"></p><p><strong>需要特别注意的是：其中的<code>RFP、Proposal</code>、<code>Contract</code>、<code>Fulfillment Request</code>、<code>Fulfillment Confirmation</code>，都是<code>凭证（Evidence）</code>，所以是需要留存和可追溯的。同时也体现了之前说的“业务流程即业务凭证的追溯过程”。</strong></p><p>如果以之前所说的商品订购流程来举个例子的话，其中<strong>订单部分不完整的模型</strong>会是这个样子：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/%E5%90%88%E7%BA%A6%E4%B8%8A%E4%B8%8B%E6%96%87%E4%B8%8D%E5%AE%8C%E5%85%A8%E4%B8%BE%E4%BE%8B-2021-04-04-17-03-01.png" alt="合约上下文不完全举例"></p><p>有的人可能注意到了，之前模型图上RFP和Proposal被标记为了可选的（Optional），这是因为现实业务中确实存在没有询价或报价过程的情况，例如：</p><ul><li>京东、天猫等电子商城的在线商品下单，是有直接定价的，所以可被视为没有RFP，有Proposal。</li><li>免费的用户注册协议，没有询价和定价的过程，所以没有RFP也没有Proposal。</li></ul><p><strong>是否有RFP和Proposal，必须实事求是的结合实际业务来看，我们将会在后续的文章中对此进行深入探讨。</strong></p><p>由于现实的业务是非常复杂的，所以通常根据甲乙方的不同，以及甲乙双方合约所处的上下文边界不同，所以相对完整的履约过程通过模型来呈现的话，大体上会呈现出类似如下的结构：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/%E6%8B%A5%E6%9C%89%E4%B8%8D%E5%90%8C%E5%90%88%E7%BA%A6%E4%B8%8A%E4%B8%8B%E6%96%87%E7%9A%84%E5%A4%8D%E6%9D%82%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91-2021-04-04-17-25-58.png" alt="拥有不同合约上下文的复杂业务逻辑"></p><p>但不管不同的合约上下文有多少，业务逻辑有多复杂，总是有一个关键点，那就是：</p><p><strong>完整的端到端业务逻辑，是不同的合约上下文的组合联系，是可以按照业务凭证的相互关系，实现完全可追溯的。</strong></p><h2 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h2><p>在这篇文章中，我们对于什么是业务逻辑进行了更多的介绍，这将有助于了解8x Flow的后续内容。</p><p>另一方面，从本文的介绍中，我相信大家一定会意识到：</p><p>作为一名系统架构师或分析师，正确的理解什么是业务是面向业务实施系统架构设计的第一步，也是最为重要的一步。</p><p><strong>需要再一次特别强调的是：业务逻辑具有天然的基于合约的法律约束，这一点是现实中的客观事实。领域逻辑则往往不涉及合同法的约束。</strong></p><p><strong>而以DDD为代表的一些分析和建模理论，则天生的忽略了这一客观事实，从而易于陷入单纯的“发散-收敛”过程，忽略了清晰的问题边界。虽然DDD号称基于问题的分解来解决“核心系统复杂性”，并且事件风暴的过程比较炫酷，但实则造成了业务与领域不清，“眉毛胡子一把抓”的尴尬情况。</strong></p><p><strong>8x Flow能够识别并基于该客观事实进行分析和建模，则具有更清晰的分析和认知边界，以及更强的针对性。</strong></p><p>下一篇，我们将进一步利用“合约上下文”和本文最后几种“合约（Evidence）”的定义，向大家介绍如何业务进行分析并提取以凭证构成的业务逻辑，敬请期待！</p><blockquote><p><strong>内容声明：</strong>“8x Flow业务建模法”为ThoughtWorks中国区CTO——徐昊先生研究并设计的原创方法论，本系列相关文章的目的是对外宣传和推广，并得到了徐昊本人的许可。文章内容为作者的个人理解和补充，如有偏差，相关权威解释以徐昊为准。</p></blockquote><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ul><li><a href="/posts/2932e594/">《8x Flow 业务建模法（一）：你能分清业务和领域吗？》</a></li></ul><h2 id="欢迎关注我的个人公众号"><a href="#欢迎关注我的个人公众号" class="headerlink" title="欢迎关注我的个人公众号"></a>欢迎关注我的个人公众号</h2><p>微信搜索：<code>枪炮与代码</code>，或者搜索公众号ID：<code>guns_n_code</code></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-wechat.png" alt="枪炮与玫瑰"></p>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;在上一篇文章&lt;a href=&quot;/posts/2932e594/&quot;&gt;《8x Flow 业务建模法（一）：你能分清业务和领域吗？》&lt;/a&gt;中，向大家介绍了8x Flow背后的关键思想，即“业务逻辑和领域逻辑”分离，并介绍了业务逻辑和领域逻辑的区别。&lt;/p&gt;
&lt;p&gt;从本篇文章开始，我将逐步为大家介绍8x Flow从分析、建模、架构再到实现的具体方法。&lt;/p&gt;
&lt;p&gt;原计划这次讲一讲如何基于“合约上下文”进行业务分析和业务逻辑提取，但是因为收到了很多读者的反馈，希望能够更多的讲讲业务逻辑是什么意思，以便更好的“分离业务和领域”。&lt;/p&gt;
&lt;p&gt;所以在开始进行业务分析之前，我们需要再来一篇多聊一聊：&lt;strong&gt;到底什么是业务？&lt;/strong&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="软件工程实践" scheme="https://huhao.dev/categories/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5/"/>
    
    
    <category term="业务建模" scheme="https://huhao.dev/tags/%E4%B8%9A%E5%8A%A1%E5%BB%BA%E6%A8%A1/"/>
    
    <category term="8x Flow" scheme="https://huhao.dev/tags/8x-Flow/"/>
    
    <category term="业务逻辑" scheme="https://huhao.dev/tags/%E4%B8%9A%E5%8A%A1%E9%80%BB%E8%BE%91/"/>
    
  </entry>
  
  <entry>
    <title>8x Flow 业务建模法（一）：你能分清业务和领域吗？</title>
    <link href="https://huhao.dev/posts/2932e594/"/>
    <id>https://huhao.dev/posts/2932e594/</id>
    <published>2021-03-31T15:35:40.000Z</published>
    <updated>2021-03-31T15:35:40.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>最近两年，以“事件风暴（Event Storming）”为代表的“领域驱动设计（Domain Driven Design，以下简称DDD）”分析建模方法红遍大江南北。<strong>伴随着按照DDD思想指导微服务拆分的流行，“搞微服务必用DDD，用DDD必做事件风暴，写代码必用六边形架构”的做法已几乎成为了某种所谓的“最佳实践”。</strong></p><p><strong>虽然我们一边反复强调“DDD不是银弹，事件风暴也不是DDD”，但是还是眼睁睁的看着DDD被用成了银弹，用了事件风暴也被等同于做了DDD。</strong></p><p>这两年，我也做了不少DDD的实践和咨询服务，也写过一些文章和组织过DDDChina峰会上的工作坊。但是在持续的解决不同的客户需求的过程中，确实经历了一个从“忽视到真香，再从真香到疑惑”的过程。其中在使用DDD和事件风暴的过程中，经常困惑的一些典型案例（也是经常被问到的问题）包括：</p><ul><li>数据类应用的设计和开发如何应用DDD思想？</li><li>客户交易系统和GIS这样的系统，DDD应用上有何区别？</li><li>很明显的流程类功能或系统适合DDD吗？还是用个工作流引擎就完了？</li><li>以上这些系统的分析建模都能应用事件风暴吗？还是说可以用其它方法？</li></ul><p>如果一定要收敛一下以上的问题，那就是经常会被大家问到的一句话：</p><blockquote><p>问：“DDD到底在什么情况下适用什么情况下适用？”<br>答：“业务逻辑复杂的系统。”</p></blockquote><p>DDD的这个回答就很诡异了——**到底什么是业务逻辑？到底什么是复杂？**这回答面对上述4个问题基本就等于什么都没讲。</p><p>虽然我在之前的实践中，尝试过进行更加明确的说明，但是在业务和复杂性的关键定义上，基本上没有质的变化。我的相关解释请参看：<a href="/posts/58fe0824/#%E6%9B%B4%E5%90%88%E7%90%86%E7%9A%84%E2%80%9CDDD%E5%88%86%E6%AE%B5%E5%BC%8F%E8%AE%BE%E8%AE%A1%E2%80%9D">《领域驱动实战思考（二）：用分段思想改进那些混乱的战略设计和战术设计》</a></p><p>换句话说，我认为DDD并没有真正的清晰定义和解答什么是“软件核心复杂性”，而是绕过了这个关键点，认为“问题都需要澄清和定义”，然后在所谓“战略设计”和“战术设计”的包装下，打着“澄清问题”的旗号，直接切进了“统一语言”和“协作设计”，以及系统架构和实现细节——有一种“别问，问就是需要澄清”的甩锅嫌疑。</p><p>而遗憾的是，在持续多年的修修补补之下，DDD的这个核心问题却丝毫未被解决。</p><p>那么，到底有没有什么方法能对于以上问题（业务、领域、复杂性）做出相对更加清晰的澄清和解答呢？</p><p>幸运的是，在和<strong>ThoughtWorks中国区CTO徐昊</strong>一起推动本公司工程效能变革的过程中，我了解并学习到了一套<strong>基于徐昊对于软件工程和架构设计多年的实践和思考，由他总结沉淀的，从“四色建模”所发展出来的，被称之为“8x Flow”的业务建模方法</strong>，有效的解答了我的困惑。</p><p>在此，我将利用一系列文章，将相关的思想、方法和配套的工程效能实践分享给大家，希望能够对大家有所帮助，同时也希望得到更多的碰撞和反馈。</p><span id="more"></span><h2 id="8x-Flow核心思想"><a href="#8x-Flow核心思想" class="headerlink" title="8x Flow核心思想"></a>8x Flow核心思想</h2><p>在介绍基于8x Flow的业务建模过程之前，大家需要先了解8x Flow背后的关键思想。</p><p>（有关于徐昊本人对于这些思想的说明，我作为参考资料附在了文章结尾，欢迎大家参阅。在此，更多的是基于我与徐昊的多次讨论和我个人的理解，来向大家予以介绍。）</p><h3 id="业务逻辑与领域逻辑分离"><a href="#业务逻辑与领域逻辑分离" class="headerlink" title="业务逻辑与领域逻辑分离"></a>业务逻辑与领域逻辑分离</h3><p>首先，我们来关注什么是“业务逻辑（Business Logic）”，什么是“领域逻辑（Domain Logic）”。</p><p>在DDD的解释中，“领域”指的是：</p><blockquote><p>Domain: A sphere of knowledge, influence, or activity. The subject area to which the user applies a program is the domain of the software.（领域：知识、影响或活动的范畴，用户应用了程序的主题领域就是软件的领域。）<br>—— 2015，Eric Evans《Driven Design Reference》</p></blockquote><p>这句话有点拗口，但是通常大家对于DDD所说的领域的白话理解就是：</p><blockquote><p>领域就是问题的集合。</p></blockquote><p>然而，徐昊在8x Flow中对于“业务”和“领域”进行了更为清晰的区分和解释，即：</p><p><strong>业务逻辑：源自业务运营的逻辑，是领域中立且运营特定的，其复杂度来自于流程本身，关注的是如何盈利和成本结构（或者可以理解为对外体现为利润或现金，对内体现为成本和绩效承诺），常见于：合同、法务、会计、审计等。</strong></p><p><strong>领域逻辑：源自问题域的逻辑，是运营中立而领域特定的，其复杂度来自于问题本身，关注的是如何解决问题，常见于：算法、计划、统计、优化等。</strong></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/business-and-domain-2021-03-30-16-05-34.png" alt="业务逻辑与领域逻辑分离"></p><p>直接看以上定义可能并不好理解，让我们基于一个简单的医院门诊就诊流程，通过事件风暴和以上解释的视角区别来看一下。</p><p>下图为我们接下来要用到的医院门诊就诊流程：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/%E5%8C%BB%E9%99%A2%E9%97%A8%E8%AF%8A%E5%B0%B1%E8%AF%8A%E6%B5%81%E7%A8%8B-2021-02-07-23-02-25.png" alt="医院门诊就诊流程"></p><p>如果我们使用事件风暴来进行DDD分析建模的话，基本上会围绕事件得到如下的分析结果：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/%E5%8C%BB%E9%99%A2%E9%97%A8%E8%AF%8A%E5%B0%B1%E8%AF%8A%E6%B5%81%E7%A8%8B-%E4%BA%8B%E4%BB%B6%E9%A3%8E%E6%9A%B4-2021-02-07-23-02-37.png" alt="医院门诊就诊-事件风暴"></p><p>我们会发现，以上事件风暴的分析结果和原始流程看起来似乎没有什么不同，只是更多的关注了每一步的结果。</p><p>但是按照8x Flow对于业务和领域的区分视角，重新分析这个就诊流程的时候，就会发现，按照前面所说的业务和领域的定义进行分别标注，其实这个流程中的不同过程，是不一样的：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/%E5%8C%BB%E9%99%A2%E9%97%A8%E8%AF%8A%E5%B0%B1%E8%AF%8A%E6%B5%81%E7%A8%8B-%E4%B8%9A%E5%8A%A1%E4%B8%8E%E9%A2%86%E5%9F%9F%E8%AF%86%E5%88%AB-2021-02-07-23-02-48.png" alt="医院门诊就诊-业务与领域识别"></p><p>为什么是这样呢？我们来拿其中的几个环节来说明一下。</p><p>回顾之前的定义，“业务逻辑的复杂度来自于流程本身，关注的是如何盈利和成本结构“，在现实中，其实更多的关注的是甲乙双方，基于某种具有权责关系的合作约定的<strong>过程凭证留存和追溯</strong>。</p><p>那么大家脑补一下门诊就诊这件事，这里面门诊挂号单、检查单、检查报告……等等这些单据，就是现实中（假设没有IT系统）非常重要的“可追溯业务凭证”。</p><p>那么我们再看“领域逻辑的复杂度来自于问题本身，关注的是如何解决问题”这件事儿，结合门诊流程来看，那么门诊如何挂号（线下还是线上，窗口还是挂号机），医生如何根据其专业技能和经验进行检查和诊断……等等，其实就是非常复杂和专业的“如何解决问题”。</p><p>说了这么多，区分了这两种不同的逻辑，到底有什么用呢？</p><p>当我们把这两种逻辑从图像上进行显式的区分后，就能看出来有什么不一样了，见下图：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/%E5%8C%BB%E9%99%A2%E9%97%A8%E8%AF%8A%E5%B0%B1%E8%AF%8A%E6%B5%81%E7%A8%8B-%E4%B8%9A%E5%8A%A1%E6%B5%81%E7%A8%8B-2021-02-07-23-03-00.png" alt="医院门诊就诊-业务流程"></p><p>图中灰色的部分就是业务流程（业务逻辑），而每一个领域（领域逻辑）则是形成业务流程中每一个“可追溯业务凭证”的具体过程（可以想象一下“计算结果”和“算法”的区别，虽不准确但可以感觉出来）。</p><p>有经验的架构师会明显的发现，以上例子中，所分析出来的<strong>业务逻辑和领域逻辑，具有明显不一样的变化原因和变化频率</strong>，如果不能理解的话，可以想象一下折扣总额（业务）和促销活动（领域）。</p><p>那么，反观DDD和事件风暴现有的分析和建模方法，如果我们都不能识别业务和领域的明显的变化边界，那如何能够有效的隔离变化呢？</p><blockquote><p><strong>识别并区分业务与领域的变化边界，这是8x Flow的第一个显著的优点。</strong></p></blockquote><p>除了这个优点之外，对于架构设计来说，有什么样的好处呢？我们来对图片做个小小的调整，将领域变成“接口（Interface）”：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/%E5%8C%BB%E9%99%A2%E9%97%A8%E8%AF%8A%E5%B0%B1%E8%AF%8A%E6%B5%81%E7%A8%8B-%E6%89%A9%E5%B1%95%E7%82%B9-2021-03-30-23-35-43.png" alt="医院门诊就诊流程-扩展点-2021-03-30-23-35-43"></p><p>铛铛！有没有发现所有的Domain都可以是系统架构的扩展点？从而实现可替换？</p><p>从这里也能看出一个道理，往往业务的变化相对较慢，而领域的变化，是可以很快的。</p><blockquote><p><strong>通过抽象领域逻辑，提升业务系统的可扩展性和灵活度，这是8x Flow的第二个显著优点。</strong></p></blockquote><p>最后，结合以上两个优点，我们再来回顾一下门诊就医这件事情。</p><p>医院的业务，就是提供医疗服务，与盈利有关，他的业务模式是相对比较稳定的：挂号、检查、出具检查报告、出具诊断书、出具处方笺、拿缴费单缴费、拿缴费证明取药……</p><p>不论是看眼科、特诊科还是骨科，医院的业务流程是不变的，而具体要看哪个科室，医生怎么看病出诊断等等，都是领域专有的问题。</p><p>正是因为业务的相对稳定和领域的可变性，才共同建立起了医院的多样化医疗服务。</p><h3 id="分离了，然后呢？"><a href="#分离了，然后呢？" class="headerlink" title="分离了，然后呢？"></a>分离了，然后呢？</h3><p>到现在，应该把什么是业务什么是领域这个问题说清楚了，但是然后呢？分的这么清楚，除了前面所说的隔离变化和识别扩展点，还有什么用呢？</p><p>这里，其实特别要说的就是我的感受最为重要的一个：</p><blockquote><p><strong>业务与领域分离后，能够让我们分清问题，并应用不同的分析、建模和设计方法，防止出现把单一方法论当银弹。</strong></p></blockquote><p>首先，针对业务逻辑，历史上有过多种分析建模法，其中更加贴近“业务可追溯性”的一个就是四色建模，而通过徐昊的改良后，我们可以采用8x Flow实施更加套路化的业务分析和建模。</p><p>这里需要强调一下，我们后面介绍的8x Flow只适合业务建模！只适合业务建模！只适合业务建模！</p><p>而领域系统的分析、建模和设计就很特别了，因为没有唯一方案。</p><p>这是因为不同的领域问题往往是”专有的“，具备很强的专业性质，解决这些问题的时候，通常需要以下几种解决方法：</p><ol><li>相关问题可以找到行业内已有的解决方案，拿过来直接借鉴即可；</li><li>需要依据专业研究或领域专家经验，结合研究成果和经验来设计解决方案；</li><li>没有已知解决方案，需要不断的调整和尝试。</li></ol><p>在通过软件解决领域问题的时候，连编程范式都不是唯一的，例如要按需选择是使用面向对象还是函数式编程语言进行实现。</p><p>通常来说，当遇到一些领域系统的时候，如果想用DDD和事件风暴来分析建模的话，一定会犯难，例如：</p><ul><li>数据处理模块</li><li>算法引擎</li><li>工作流</li><li>地理信息系统（GIS）</li></ul><p>说了这么多，其实就是想说：</p><p><strong>当面对一个软件系统的时候，请不要一上来就DDD拆微服务，麻烦先搞清哪里是业务，哪里是领域。</strong></p><p>当然，我也不是说DDD和事件风暴不能用，就拿我来说，我这俩也玩儿的挺溜呀，武器库里多一些兵器来解决不同的问题不好吗？</p><p>PS：当遇到大规模、无共识、技术复杂度不高、同时又不知道还有啥别的更好的方法的场景时，我觉得事件风暴这种建模过程还是能尝试用的，毕竟相对比传统的面向对象设计更套路化一点。</p><h2 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h2><p>这一篇文章，重点在于说明业务与领域的区别，算是热热身。我会在后续的文章，逐步为大家介绍如何对于业务进行分析，并使用8x Flow进行建模。</p><p>在此，先给出8x Flow建模的一个例子仅供提前过过眼瘾（和以上门诊就医无关）：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/%E8%A7%92%E8%89%B2%E5%88%86%E6%9E%90%E5%92%8C%E6%8A%BD%E8%B1%A1-2021-02-07-19-05-30.png" alt="8x Flow 举例"></p><p><strong>而下一篇，我会来讲讲如何通过“合约上下文”分析并提取业务逻辑，敬请期待。</strong></p><blockquote><p><strong>内容声明：</strong>“8x Flow业务建模法”为ThoughtWorks中国区CTO——徐昊先生研究并设计的原创方法论，本系列相关文章的目的是对外宣传和推广，并得到了徐昊本人的许可。文章内容为作者的个人理解和补充，如有偏差，相关权威解释以徐昊为准。</p></blockquote><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ul><li><a href="https://www.infoq.cn/article/xh-four-color-modeling">《运用四色建模法进行领域分析》（作者：徐昊）</a></li><li><a href="https://www.bilibili.com/video/BV1Rf4y1Q7Y4">《八叉说 - 我们到底要微服务还是业务能力？》（作者：徐昊）</a></li><li><a href="https://www.bilibili.com/video/BV1MT4y1M7Kv">《八叉说DDD - 领域驱动还是业务模型驱动？》（作者：徐昊）</a></li><li><a href="https://www.bilibili.com/video/BV1Rz4y1S7oW">《八叉说DDD - 统一语言的坏味道》（作者：徐昊）</a></li><li><a href="https://www.bilibili.com/video/BV1mf4y1k75k">《八叉说DDD - 为什么说《领域驱动设计》已经过时了》（作者：徐昊）</a></li><li><a href="https://www.bilibili.com/video/BV1Ep4y1W7Ku">《八叉说 - 当DDD遇到业务系统，还是最佳实践吗？》（作者：徐昊）</a></li></ul><hr><h2 id="欢迎关注我的个人公众号"><a href="#欢迎关注我的个人公众号" class="headerlink" title="欢迎关注我的个人公众号"></a>欢迎关注我的个人公众号</h2><p>微信搜索：<code>枪炮与代码</code>，或者搜索公众号ID：<code>guns_n_code</code></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-wechat.png" alt="枪炮与玫瑰"></p>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;最近两年，以“事件风暴（Event Storming）”为代表的“领域驱动设计（Domain Driven Design，以下简称DDD）”分析建模方法红遍大江南北。&lt;strong&gt;伴随着按照DDD思想指导微服务拆分的流行，“搞微服务必用DDD，用DDD必做事件风暴，写代码必用六边形架构”的做法已几乎成为了某种所谓的“最佳实践”。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;虽然我们一边反复强调“DDD不是银弹，事件风暴也不是DDD”，但是还是眼睁睁的看着DDD被用成了银弹，用了事件风暴也被等同于做了DDD。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这两年，我也做了不少DDD的实践和咨询服务，也写过一些文章和组织过DDDChina峰会上的工作坊。但是在持续的解决不同的客户需求的过程中，确实经历了一个从“忽视到真香，再从真香到疑惑”的过程。其中在使用DDD和事件风暴的过程中，经常困惑的一些典型案例（也是经常被问到的问题）包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据类应用的设计和开发如何应用DDD思想？&lt;/li&gt;
&lt;li&gt;客户交易系统和GIS这样的系统，DDD应用上有何区别？&lt;/li&gt;
&lt;li&gt;很明显的流程类功能或系统适合DDD吗？还是用个工作流引擎就完了？&lt;/li&gt;
&lt;li&gt;以上这些系统的分析建模都能应用事件风暴吗？还是说可以用其它方法？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果一定要收敛一下以上的问题，那就是经常会被大家问到的一句话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;问：“DDD到底在什么情况下适用什么情况下适用？”&lt;br&gt;答：“业务逻辑复杂的系统。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;DDD的这个回答就很诡异了——**到底什么是业务逻辑？到底什么是复杂？**这回答面对上述4个问题基本就等于什么都没讲。&lt;/p&gt;
&lt;p&gt;虽然我在之前的实践中，尝试过进行更加明确的说明，但是在业务和复杂性的关键定义上，基本上没有质的变化。我的相关解释请参看：&lt;a href=&quot;/posts/58fe0824/#%E6%9B%B4%E5%90%88%E7%90%86%E7%9A%84%E2%80%9CDDD%E5%88%86%E6%AE%B5%E5%BC%8F%E8%AE%BE%E8%AE%A1%E2%80%9D&quot;&gt;《领域驱动实战思考（二）：用分段思想改进那些混乱的战略设计和战术设计》&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;换句话说，我认为DDD并没有真正的清晰定义和解答什么是“软件核心复杂性”，而是绕过了这个关键点，认为“问题都需要澄清和定义”，然后在所谓“战略设计”和“战术设计”的包装下，打着“澄清问题”的旗号，直接切进了“统一语言”和“协作设计”，以及系统架构和实现细节——有一种“别问，问就是需要澄清”的甩锅嫌疑。&lt;/p&gt;
&lt;p&gt;而遗憾的是，在持续多年的修修补补之下，DDD的这个核心问题却丝毫未被解决。&lt;/p&gt;
&lt;p&gt;那么，到底有没有什么方法能对于以上问题（业务、领域、复杂性）做出相对更加清晰的澄清和解答呢？&lt;/p&gt;
&lt;p&gt;幸运的是，在和&lt;strong&gt;ThoughtWorks中国区CTO徐昊&lt;/strong&gt;一起推动本公司工程效能变革的过程中，我了解并学习到了一套&lt;strong&gt;基于徐昊对于软件工程和架构设计多年的实践和思考，由他总结沉淀的，从“四色建模”所发展出来的，被称之为“8x Flow”的业务建模方法&lt;/strong&gt;，有效的解答了我的困惑。&lt;/p&gt;
&lt;p&gt;在此，我将利用一系列文章，将相关的思想、方法和配套的工程效能实践分享给大家，希望能够对大家有所帮助，同时也希望得到更多的碰撞和反馈。&lt;/p&gt;</summary>
    
    
    
    <category term="软件工程实践" scheme="https://huhao.dev/categories/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B%E5%AE%9E%E8%B7%B5/"/>
    
    
    <category term="业务建模" scheme="https://huhao.dev/tags/%E4%B8%9A%E5%8A%A1%E5%BB%BA%E6%A8%A1/"/>
    
    <category term="领域驱动设计" scheme="https://huhao.dev/tags/%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="8x Flow" scheme="https://huhao.dev/tags/8x-Flow/"/>
    
    <category term="事件风暴" scheme="https://huhao.dev/tags/%E4%BA%8B%E4%BB%B6%E9%A3%8E%E6%9A%B4/"/>
    
  </entry>
  
  <entry>
    <title>10倍团队（二）：在家办公是软件研发组织的“敏捷试金石”之项目管理篇</title>
    <link href="https://huhao.dev/posts/4f3996e/"/>
    <id>https://huhao.dev/posts/4f3996e/</id>
    <published>2020-02-06T13:58:40.000Z</published>
    <updated>2020-02-06T13:58:40.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>在<a href="https://huhao.dev/posts/e2efaab2/">上一篇文章（沟通篇）</a>中，我们讲了有关软件研发组织“在家办公”受到的沟通方面的挑战。</p><p>可能是在一家敏捷的公司待得久了，所以我很长一段时间认为“敏捷”在中国已经是家喻户晓不需要再去谈的东西。可是直到我后来做了技术顾问，开始为客户提供架构和工程能力的咨询服务时才发现，<strong>绝大多数技术架构和持续交付实践难以落地的问题，最后都会遇到团队不够敏捷这个关键障碍，而真正敏捷的团队，在整个中国的IT行业中，则是极少的。</strong></p><blockquote><p><strong>因为不够敏捷，所以能够用于改进的带宽就不足，因为改进的带宽不足，所以就难以应用更好的技术实践，如此反复就变成了死循环……</strong></p></blockquote><p>而在众多导致不敏捷的原因中，首当其冲的，就和软件研发组织的项目管理方法和项目管理人员的能力有直接的关系。</p><p><strong>而本次新型冠状病毒（2019-nCoV）疫情导致的“在家办公”的要求，则瞬间放大了相关影响——尤其是那些依赖于传统项目管理方法的软件研发组织。</strong></p><p>那么，在这一篇中，我们就聚焦“传统的项目管理方法”和“敏捷的项目管理方法”的区别，来谈谈对于在家办公的影响：</p><ul><li>传统管理方法的缺陷</li><li>敏捷管理方法为什么更适合在家办公？</li></ul><span id="more"></span><h2 id="传统管理方法的缺陷"><a href="#传统管理方法的缺陷" class="headerlink" title="传统管理方法的缺陷"></a>传统管理方法的缺陷</h2><blockquote><p><strong>传统的项目管理方法以资源投入为着眼点，强调按约定进行交付</strong></p></blockquote><p>说起项目管理三角形（Project Management Triangle），我相信很多学过项目管理的人，都会脱口而出：<code>时间（Time）</code>，<code>范围（Scope）</code>，<code>成本（Cost）</code>。</p><p><em>PS：在实际中，很多团队的项目管理人员过去都是从开发人员干上来的，我特别喜欢在客户现场问这个问题，相当一部分团队所谓的项目管理人员，则根本回答不上来这个项目管理的基本概念，这也是一个国内软件研发企业很有意思的一个现象，屡试不爽……</em></p><p>但是在“脱口而出”的时候，却很少有人记得或者忽略了，作为“传统的项目管理三角形”，时间、范围、成本所构成的三角形中间，是非常重要的：<code>质量（Quality）</code>。</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/20200206211914.png" alt="项目管理三角形"></p><p>这个三角形告诉我们了这样一个相互影响的关系：</p><blockquote><p>在项目质量要求不变的情况下（一般来说，在传统的工程类项目中质量要求都是一经确定难以变更的）：</p><ul><li>如果需要缩短项目时间，那么就要减少项目范围或增加项目成本投入；</li><li>如果要节约项目成本，那么就需要减少项目范围或延长项目时间；</li><li>如果要增加项目范围，那么就要增加项目成本或延长项目时间。</li></ul></blockquote><p>这个“传统的项目管理三角形”非常科学，就拿这次抗击新型冠状病毒（2019-nCoV）的“雷神山”和“火神山”两个医院的神速建设来说：</p><blockquote><p>首先，两个医院的建设标准和质量是不可妥协的，同时，施工范围是不可变的，工期也是不可变的，那么在这个基础上，只能不计成本的动用体制优势进行建设。</p></blockquote><p>是不是特别有道理！</p><p><strong>但是呢？这个“传统的项目管理三角形”（注意我一直在用引号强调“传统”二字），在我们的软件工程中，则通常是不能正常工作的！</strong></p><p>为什么呢？<strong>因为传统的工程项目，其项目本身的<code>范围</code>更加可控，经验或资源的“复用性”更强，项目过程中的变化相对稳定；而软件工程，是属于“知识型工作”，其“创新性”更高，项目过程中的变化往往非常频繁，所以项目的<code>范围</code>则通常很难控制。</strong></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/20200206185526.png" alt="“雷神山”和“火神山”这样的工程规模和速度在软件行业中非常困难"></p><p>所以，这也是为什么“雷神山”和“火神山”两个医院的建设工程，能够在2天左右的时间出图纸，然后在5-7天基本完工的关键，因为这里面有大量现成的经验和方案组合，完全依据设计图纸进行施工的方式，以及固定的施工工艺和预制件的使用——这一切能够确保所有参战工人和施工队，按照统一的标准进行快速的建设工作。</p><p>而作为一个软件项目，想要从0开始，做到这两个医院的建设方式，则是极其困难的。首先我们就很难完全按照详尽的设计图纸或者严格的工程标准进行工作——除非此类软件所解决的问题已经在业内属于通用型问题，有大量的现成产品、开发套件或者开源方案拿来改改就能用（嗯，尤其是开发套件这个东西，往往是误入歧途，成为未来变更瓶颈的开始）。</p><p>一般来说，<strong>如果一个软件研发组织，在平时进行项目管理的时候，是基于“甘特图”的管理方式，那么大概率的就是在用以资源为核心的传统管理方法，来错误的管理以价值为核心的软件研发项目。</strong>（嗯，曾经做项目管理时的我也年少轻狂甘特图过……）</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/20200206141705.png" alt="基于Microsoft Project的甘特图式项目管理"></p><p>在实际中，“甘特图式”的项目管理，与强调精准管控，基于严格阶段划分和详尽文档的瀑布式软件开发流程往往密不可分。在这种开发流程中，一个可工作的软件，往往只有在某个开发节点到达后，其全部的功能才有可能被集成完毕，然后进行批量测试和验收。而在这个节点前的过程中，是难以集成甚至是“可工作”的，所以更不用提测试和验收了。正所谓越是想精确，越是十万八千里。</p><p>在这种管理模式下，由于项目精准管控的需要，往往项目管理人员都具备相当的管理权力或职级，属于比较强势的管理人员，而很多程序员八卦中那些对于项目管理人员声嘶力竭和官僚式的管理风格的描述，往往也是反映的这种管理风格下的研发团队。</p><p>而一旦转入在家办公，随着现场办公的便利性的消失，工作透明度的降低，以及各种协作难度的增加，软件研发的进度将变得愈发不可控，能否按时完成所有工作项的开发、集成、测试和验收，就变成了一个更加“烧香拜佛听天由命”的事情。</p><p>到时候项目管理人员怎么办呢？嗯……买套非常“好用”的在线协作工具，靠更多的视频会议来继续“声嘶力竭”和“追着屁股”的“连环Call”吗？</p><p>（你要是再不赶紧搞定，就在家里永远不要来公司上班了！！！手动滑稽……）</p><h2 id="敏捷管理方法为什么更适合在家办公？"><a href="#敏捷管理方法为什么更适合在家办公？" class="headerlink" title="敏捷管理方法为什么更适合在家办公？"></a>敏捷管理方法为什么更适合在家办公？</h2><blockquote><p><strong>敏捷的项目管理方法以价值交付为着眼点，强调适应变化。</strong></p></blockquote><p>与“传统的项目管理方法”相比，“敏捷”类的软件项目管理办法，强调“以价值交付为核心”，通过“适应”的方式，着眼提升应对需求变化的能力。</p><p><em><strong>PS：我的同事，ThoughtWorks中国区CTO徐昊曾经总结过针对“敏捷”价值观的经典一句话描述，就是“Value delivery over follow practice（价值交付优于循规蹈矩）”，这也体现了“适应”的精髓。换句话说，如果有人告诉你，敏捷就一定要做……（例如迭代式开发），那就是有问题的了，必须要综合多方考虑，在不同的环境下，找到最利于价值交付的方式，才是真正的敏捷。</strong></em></p><p>如何做到“以价值交付为核心”和“适应”呢？仅就项目管理的方式来讲，在我看来，这里面有两个非常关键的区别，我们分别来讲一讲：</p><ul><li>敏捷三角形（Agile Triangle）</li><li>可视化卡片系统（kanban）</li></ul><h3 id="敏捷三角形"><a href="#敏捷三角形" class="headerlink" title="敏捷三角形"></a>敏捷三角形</h3><p>首先，我们来讲一讲用“敏捷三角形（Agile Triangle）”代替“传统的项目管理三角形”。</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/20200206211612.png" alt="从传统的项目管理三角形到敏捷三角形"></p><p>如上图所示，“敏捷三角形”所关注的三个角是：<code>价值（Value）</code>、<code>质量（Quality）</code>和<code>约束（Constraints）</code>，其中<code>约束</code>就是以前的“传统项目管理三角形”。从这张图上我们可以看到，敏捷三角形在传统三角形的基础上将<code>质量</code>和<code>价值</code>进行了显式的关注。</p><p>简单来说（我所总结的）：</p><blockquote><p>因为在软件领域，随着时间的推移，影响<code>约束</code>变化的东西太多了，敏捷的项目管理，应该在<code>约束</code>的条件下，优先关注以适合的<code>质量</code>为客户交付优先级最高的<code>价值</code>。而另一方面，由于精准的度量实在是太难了，所以我们应当以更轻量级的手段，来跟踪和度量<code>价值</code>的交付速度（例如燃烧图、燃尽图、累积流图等等），从而获得虽然模糊但是相对更准的预测。</p></blockquote><p><em>PS：有关敏捷三角形的相关概念，这里不展开讲，感兴趣的话可以参考这篇文章：<a href="https://www.infoq.cn/article/2009/08/agile-triangle">https://www.infoq.cn/article/2009/08/agile-triangle</a></em></p><p>那么这样做的好处是什么呢？</p><p>首先，敏捷的管理办法，强调整个团队关注价值交付的进度，发挥团队中每个个体的优势，通过集体的力量来跟踪和度量项目交付。这样能够降低中心化管理的依赖，不再依赖由具体的一个人来进行项目的管理（嗯，就是那个权力很大的项目管理人员)，为更松散的管理方式提供便利。<strong>（这对在家办公时的分布式协作提供了一个关键保障，少一个吼叫的人是一件多么令人开心的事情啊！）</strong></p><p>其次，以价值交付为导向，能够降低过去关注资源的利用的复杂性，使得管理方法更加轻量和易于操作，进一步降低了项目管理的工作量和学习成本。<strong>（这会有助于降低在家办公所增加的管理压力）</strong></p><p>同时，另一个好处，就是更轻量级的管理方式，能够更容易应用让整个团队（而非少数项目管理人员）共享和关注的可视化手段，来增强团队工作的透明度，让每个人的工作暴露在阳光之下——这个就是基于“可视化卡片系统”的管理办法。<strong>（嗯，上一篇说了，工作的透明度是在家办公特别重要的依赖）</strong></p><h3 id="可视化卡片系统"><a href="#可视化卡片系统" class="headerlink" title="可视化卡片系统"></a>可视化卡片系统</h3><p>由于以关注“价值的交付”代替了“关注资源的使用”，所以我们可以用以卡片为可视化单元的“可视化卡片系统”进行项目进度的跟踪和度量，也就是我们常说的“卡墙”或者“看板”，如图所示：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/20200205214837.jpg" alt="看板方法的拉动式看板"></p><p>有关可视化的好处，我们在<a href="https://huhao.dev/posts/e2efaab2/">上一篇文章（沟通篇）</a>中已经有过介绍，这里不再展开讲。</p><p>在基于卡片的可视化系统中，我们所关注的，主要是：</p><ul><li>团队的工作流程（纵向分栏）</li><li>当前的卡片数量（累积工作）</li><li>卡片的状态（工作的进度）</li></ul><p>而我们所要做的事情，就是要去想办法让卡片系统中的卡，尽快的从左边一步一步的挪到右边的“完成（Done）”一栏。</p><p>这种只需要便利贴和大白板的管理办法，比基于“甘特图”这种需要依赖重量级管理工具（Microsoft Project等）还不直观的方式，简直是轻量级太多啊！嗯，而且这种轻量级的办法，特别有利于协作，让对于项目管理这件事变成团队每个人都可以关注和参与的事情！</p><p>正因为敏捷的可视化卡片系统具有这样的好处，所以大家会注意到当今以Trello和Jira为代表的在线可视化项目管理工具，都是以卡片系统的方式来实现的（嗯，包括最近因为在家办公大火的各种在线协作产品也是这样的）。</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/20200206213655.png" alt="Trello"></p><p><em>PS：特别需要注意的是，敏捷的卡片系统一定是以价值交付为核心的，卡片代表的是价值。我曾经在客户现场见过一种非常典型的“伪敏捷看板”（很可惜因为保密原因不能拍照）——在看板的左侧从上往下以每个人的名字为一栏进行拆分（横列俗称泳道），然后跟踪每个人所负责的卡片，这种就是一种典型的将人作为关注的核心（把人当资源用），将卡片系统用成了甘特图。（嗯，各位赶紧回去自查一下自己的看板是不是这种……）</em></p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>洋洋洒洒围绕项目管理说了这么一大堆，综上所述，<strong>如果一个软件研发组织，不能以敏捷的项目管理方法来管理项目，如何能够降低在家办公的项目管理成本呢？</strong></p><p>最起码的就是：你就算现买一个在线协作办公的产品，也用不起来嘛！</p><p>但很遗憾，现实中，我们还是能够看到大量的软件研发组织，还是依靠传统的项目管理方法来管理软件开发，或者使用错误的方式来应用敏捷的项目管理方法。</p><p>按理来说，以上内容但凡是看过基本敏捷方法相关的书籍都应该知晓，但是非常残酷的是，通过我在实际咨询工作中的观察，现实中的绝大多数软件研发团队项目管理人员，除了是从开发人员转过来的以外，还有大量的是从传统的项目管理转过来的（或者学的是传统的项目管理方法论），所以能够说清楚以上项目管理方法论区别的人，则属于少数。</p><p>由于篇幅原因，我无法对影响在家办公的项目管理问题进行一一讲解，这里只能专注于最基本的传统项目管理与敏捷项目管理的差异，但还是那句话：</p><blockquote><p><strong>以绝大多数软件研发组织的敏捷实践水平之低，还谈不上如何在家办公。</strong></p></blockquote><p>希望本文能为众多因为“被在家办公”搞得鸡飞狗跳的软件研发组织提供一些参考和帮助。</p><p>后续文章，我会从另外的方面，来继续讲一讲，为什么在家办公是软件研发组织的“敏捷试金石”。</p><h2 id="相关阅读"><a href="#相关阅读" class="headerlink" title="相关阅读"></a>相关阅读</h2><ul><li><a href="https://huhao.dev/posts/e2efaab2/">在家办公是软件研发组织的“敏捷试金石”之沟通篇</a></li></ul><hr><h2 id="欢迎关注我的个人公众号"><a href="#欢迎关注我的个人公众号" class="headerlink" title="欢迎关注我的个人公众号"></a>欢迎关注我的个人公众号</h2><p>微信搜索：<code>枪炮与代码</code>，或者搜索公众号ID：<code>guns_n_code</code></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-wechat.png" alt="枪炮与玫瑰"></p>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;在&lt;a href=&quot;https://huhao.dev/posts/e2efaab2/&quot;&gt;上一篇文章（沟通篇）&lt;/a&gt;中，我们讲了有关软件研发组织“在家办公”受到的沟通方面的挑战。&lt;/p&gt;
&lt;p&gt;可能是在一家敏捷的公司待得久了，所以我很长一段时间认为“敏捷”在中国已经是家喻户晓不需要再去谈的东西。可是直到我后来做了技术顾问，开始为客户提供架构和工程能力的咨询服务时才发现，&lt;strong&gt;绝大多数技术架构和持续交付实践难以落地的问题，最后都会遇到团队不够敏捷这个关键障碍，而真正敏捷的团队，在整个中国的IT行业中，则是极少的。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;因为不够敏捷，所以能够用于改进的带宽就不足，因为改进的带宽不足，所以就难以应用更好的技术实践，如此反复就变成了死循环……&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;而在众多导致不敏捷的原因中，首当其冲的，就和软件研发组织的项目管理方法和项目管理人员的能力有直接的关系。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;而本次新型冠状病毒（2019-nCoV）疫情导致的“在家办公”的要求，则瞬间放大了相关影响——尤其是那些依赖于传统项目管理方法的软件研发组织。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;那么，在这一篇中，我们就聚焦“传统的项目管理方法”和“敏捷的项目管理方法”的区别，来谈谈对于在家办公的影响：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;传统管理方法的缺陷&lt;/li&gt;
&lt;li&gt;敏捷管理方法为什么更适合在家办公？&lt;/li&gt;
&lt;/ul&gt;</summary>
    
    
    
    <category term="10倍团队" scheme="https://huhao.dev/categories/10%E5%80%8D%E5%9B%A2%E9%98%9F/"/>
    
    
    <category term="10倍团队" scheme="https://huhao.dev/tags/10%E5%80%8D%E5%9B%A2%E9%98%9F/"/>
    
    <category term="敏捷" scheme="https://huhao.dev/tags/%E6%95%8F%E6%8D%B7/"/>
    
    <category term="在家办公" scheme="https://huhao.dev/tags/%E5%9C%A8%E5%AE%B6%E5%8A%9E%E5%85%AC/"/>
    
    <category term="项目管理" scheme="https://huhao.dev/tags/%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>10倍团队（一）：在家办公是软件研发组织的“敏捷试金石”之沟通篇</title>
    <link href="https://huhao.dev/posts/e2efaab2/"/>
    <id>https://huhao.dev/posts/e2efaab2/</id>
    <published>2020-02-05T15:43:35.000Z</published>
    <updated>2020-02-05T15:43:35.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>最近“新型冠状病毒（2019-nCoV）”汹汹来袭，一时间**“在家办公（Working From Home，简称WFH）”**成了一个非常现实和火热的话题。我心想着：“这时候理应有篇写在家办公的文章”，但是又一想：“想必一定有很多人写”，所以一直没动笔。</p><p>结果呢，各种渠道和平台的在家办公类文章铺天盖地，无奈的是，里面大量的都是在卖自家产品，没几个在认真说在家办公的挑战和问题的。似乎买了某家的在线协作平台产品，就能真正实现在家办公了一样——<strong>如果真的靠买产品就能实现在家办公，那岂不是绝大多数的软件研发团队平时都应该在家办公吗？为啥还要天天车马劳顿的赶去公司上班？</strong></p><p>这次突如其来的疫情所带来的在家办公一事，更像是一次针对软件研发组织敏捷程度的“国考”。在家穿着睡衣披头散发的办公，还都只是大家呵呵一笑找点乐子，但是如果长时间下去，还有多少软件研发组织能够笑到最后呢？</p><p>在IT行业，在家办公一直是一个非常火热的话题。我在加入ThoughtWorks之前，有过半年时间的在家办公尝试。在加入ThoughtWorks之后，在做培训、做开发、做咨询的过程中，阴差阳错的竟然实现了相当时间比例的在家办公。在我看来：</p><blockquote><p><strong>以绝大多数软件研发组织的敏捷实践水平之低，还谈不上如何在家办公。</strong></p></blockquote><p>从这篇文章开始，我将围绕制约在家办公的一些关键挑战，以多篇文章（每篇关注一个维度的方式）来谈一谈为什么在家办公是软件研发组织的“敏捷试金石”。</p><p>本篇，我们优先说一说：<strong>沟通成本</strong>。</p><span id="more"></span><h2 id="沟通成本带来的挑战"><a href="#沟通成本带来的挑战" class="headerlink" title="沟通成本带来的挑战"></a>沟通成本带来的挑战</h2><p>在众多制约在家办公的挑战中，沟通成本是首当其冲的，很多人第一个反应就是：“都不在办公室了我咋沟通啊？”当然这也是众多在线协作产品的核心服务之一。</p><p>当然，这也是“就算是买了在线协作产品也用不好”的关键方面之一。正所谓“治标不治本”。并不是说你有个在线视频会议软件，你就可以在家办公了。影响团队沟通成本的主要因素有很多，我们很难全部都讲一遍，在这里我主要基于我在咨询过程中的观察，讲一讲我所认为非常重要的几个“本”：</p><ul><li>团队规模</li><li>会议种类</li><li>可视化程度</li></ul><h3 id="团队规模"><a href="#团队规模" class="headerlink" title="团队规模"></a>团队规模</h3><blockquote><p><strong>团队规模越大，沟通成本越高。</strong></p></blockquote><p>我曾经在20个人左右的开发团队从事过开发工作，在从事咨询的工作中也看到过客户存在接近30人左右的开发团队（嗯，没错，20-30人共同开发一个产品模块）。在这种规模的团队中，沟通成本简直难以忍受，每天要么需要通过各种会来沟通和对齐工作，要么当出现一个问题之后，需要四处找人寻找问题发生的原因。而当团队转入在家办公之后，由于缺少了办公室里“吼一声”就能解决的便利，最直接的，就是每天会被各种即时通讯软件的提醒和视频会议的提醒淹没……</p><p>在客户现场，我亲眼看到过和我结对编程的客户方开发人员，每天平均只有1个小时能够安静的坐在那里和我一起写写代码，其他时间他要么在开会，要么就是在去开会的路上。那什么时候他才能专心的写代码呢？答案很简单：晚上啊！996求福报，很多人只能利用晚上加班这个大家已经疲惫开不动会的时间来写写代码。对于这样的团队来说，在家办公简直是不可接受的，于是就有这样的疑惑：“在家办公怎么能解决好团队沟通的问题？”</p><p>而从敏捷的视角出发，我们首先应该做的，就是通过约束团队的规模，来从根本上降低沟通成本。</p><p>我相信很多人都听说过亚马逊CEO贝索斯所提倡的“2 Pizza Team”这个概念，也就是一个团队适合的规模，应当在2个披萨刚好够吃的人数范围内（嗯……然而我一直不知道这个里面对于披萨尺寸和饭量的约束……手动滑稽……）。</p><p><strong>很多人都只记住了“2 Pizza Team”的结论，就是要小，大概在6-10人左右（Scrum提倡开发团队规模应当控制在9个人左右），但是却忽略了其中的一个非常重要的计算公式，就是（其中N代表人数）：</strong></p><blockquote><p><strong>人与人之间的沟通管道数量 &#x3D; N(N-1) &#x2F; 2</strong></p></blockquote><p>如果以图来举例（图片来自于<a href="https://www.calcey.com/blog/why-the-two-pizza-team-rule-is-the-name-game-at-calcey">https://www.calcey.com/blog/why-the-two-pizza-team-rule-is-the-name-game-at-calcey</a>），就是：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/20200205211839.png" alt="人员沟通管道关系图"></p><p>让我们举例来说：</p><ul><li>一个7个人的团队，会有21个沟通管道；</li><li>一个12个人的团队，会有66个沟通管道；</li><li>一个20个人的团队，会有190个沟通管道；</li><li>一个30个人的团队，会有435个沟通管道；</li><li>……</li></ul><p>所以，<strong>如果一个软件研发组织，不能基于“特性团队（Feature Team）”，或者不能依据“逆康威定律（组织适配架构）”和“领域驱动设计（DDD）”思想来划分和组件小团队，怎么能防止在家办公不会加剧提升沟通成本？</strong></p><h3 id="会议种类"><a href="#会议种类" class="headerlink" title="会议种类"></a>会议种类</h3><blockquote><p><strong>会议种类越多，时间越长，沟通成本越高。</strong></p></blockquote><p>在团队足够小之后，会不会开会，则成了影响在家办公沟通成本的下一个关键因素。</p><p>在当下，随着Scrum等敏捷方法论已经在中国推广了快20年，很多软件研发组织都已经在实践“敏捷”方法论了，为什么我要把“敏捷”打上引号呢？是因为这里面有很多的“伪敏捷”，这里就拿火遍天南地北的Scrum来说。</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/20200205214550.png" alt="Scrum Framework"></p><p>几乎所有实践过Scrum的团队都知道有个“每日Scrum（Daily Scrum）”，很多人都习惯叫“站会（Stand-up Meeting）”因为站会在很多的敏捷方法论中都存在，只是具体内容可能有所不同。</p><p>在Scrum中，对于这个会议的时长要求，是每天不超过15分钟，平均每人发言在1-2分钟，而每个人在会议上所讲述的内容则聚焦在三个问题:</p><ul><li>昨天，我为帮助开发团队达成Sprint目标做了什么？ </li><li>今天，我为帮助开发团队达成 Sprint 目标准备做什么？ </li><li>是否有任何障碍在阻碍我或开发团队达成Sprint目标？</li></ul><p>那如果是在Kanban中，则每个人的发言内容则是：</p><ul><li>有哪些障碍阻碍了我的价值流动？</li><li>（看板从左至右）当前的流动情况如何？</li></ul><p><strong>但不论是哪种方法，对于15分钟的时间控制，平均1-2分钟的每人发言时间，以及对发言内容的聚焦和约束，都是不同敏捷方法论中对于站会的相同要求。</strong></p><p>但是在实际中，我亲眼看到过以下几种令人“印（dang）象（chang）深（pen）刻（fan）”的在某个号称是Scrum Master的人带领下的站会：</p><blockquote><p>团队A：十几个人围绕电子看板站成了一个圈（嗯，姿势正确……），然后每个人走到电子看板前（嗯，没什么毛病……），然后和项目负责人窃窃私语，其他人则发呆（噗……你等会儿……）……</p><p>团队B：七八个人站在白板前（嗯？等下，板上咋啥都没有？），然后每个人开始长篇大论（噗……你等会儿……），以及各种艰难问题的探讨和扯皮（唉……喊不住……），最后每天站会在一个多小时的时间结束……</p></blockquote><p>要不是我亲眼所见（以至于屡见不鲜），我真的不能理解，为什么一个简单的站会要求，最后能被执行成各种五花八门的方式。</p><p>嗯，好吧，那么如果是这样子的团队，变成在家办公会是什么样子呢？脑补一下：</p><blockquote><p>一群人，在冷冷的屏幕后方，穿着各类服饰，披头散发，不修边幅，以各种姿势，刷着网页，会议语音中的各种内容从左耳朵进右耳朵出……（那句话咋说来着？坐姿嚣张，工作不慌？）</p></blockquote><p>当然了，可能会有人说可以开视频，可是，你面对面站着都能发呆开视频有个毛线的用……</p><p>综上，可见虽然有团队号称是“敏捷团队”，但是实际中真的是花样百出的“伪敏捷”。而提升会议效率，降低会议对于沟通成本和研发效能的障碍，是所有敏捷方法所强调的重点（当然也是最容易被忽视的重点）。</p><p>我们说“<strong>个体和互动高于流程和工具</strong>”，其实某个方面就是在强调，在合理的团队规模下（别忘了前面讲的小团队和沟通管道数量计算），应该充分的发挥个体间的交流来解决问题，而不是依靠开例会的方式。那么当处于在家办公的情况下，我们完全可以按照每日站会的要求，围绕电子看板，在15分钟内开完站会，然后利用Slack等交流工具，由问题的相关方去单独解决。（现实中我们也是强调会后由问题的相关人员去单聊）</p><p>所以，<strong>如果一个研发组织，连最起码的敏捷类例会都开不好，怎么能防止在家办公不会加剧提升沟通成本？</strong></p><h3 id="可视化程度"><a href="#可视化程度" class="headerlink" title="可视化程度"></a>可视化程度</h3><blockquote><p><strong>工作的可视化程度越低，沟通成本越高。</strong></p></blockquote><p>正所谓，工作中最害怕的事情，就是“你在那里天天加班到天亮，然而我却不知道你在干什么”……</p><p>原先呢，很多软件研发组织，都是希望以各种会议，来拉通和对齐每个人的工作内容和进度，但是呢，君不见一个人做一个需求，一做就是一周多不见合并代码的……</p><p>再加上平时也不做每日代码检视（Code Review），也没做好前面所说的每日站会，所以在做咨询的过程中，看到的绝大多数软件研发组织，都是普遍缺乏工作透明度的。</p><p>一旦缺乏了工作透明度，那么各种偷奸耍滑，以偷懒和加班表达自己很努力很用功的方式就成了相当一部分人应对工作的日常操作（反正需求天天加班都做不完，那我为什么要做那么快嘛……）。</p><p>而到了在家办公的时候，那……岂不是就更开心了！！！之前在办公室，总还是抬头不见低头见，哪怕坐在格子间。现在可好了，我在我家我是爷，你管我咋工作？</p><p><strong>而应对这种问题的方式也非常简单，就是：赶紧把工作透明出来，赶紧把有效可视化看板建起来。</strong></p><p>有了可视化的看板（不管是物理板还是电子板），我们就能围绕可视化的看板来跟踪每个人的工作进度（至于怎么做才对，留待后面的文章去讲），也就能让我们前面说的每日站会有了可视化的依据。</p><p><em>PS：这里面需要特别注意的是，看板一词是有二义性的，在英文中，<code>kanban</code>指的是可见的卡片，而大写开头的<code>Kanban</code>则指的是“看板方法”。在日常沟通中，当我们说到“看板”的时候，绝大多数指的是可视化的卡片系统，而“看板方法”则指的是以精益思想为基础的方法论。</em></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/20200205214837.jpg" alt="看板方法的拉动式看板"></p><p>在办公室内，我们一般提倡同时维护物理看板和电子看板，这样的好处是，物理看板大家抬头就能看到，可以在平时路过的时候就关注一眼当前的工作情况，而电子看板的优势是可供记录、追溯和分析计算。</p><p>那么当在家办公的时候，遇到的很麻烦的情况是缺失物理看板，而并不是每个人都有多个显示器，拿其中一个来展示电子看板，因为操作系统窗口切换很麻烦，很容易造成大家忽略了对于工作进度的关注。那么这时候的解决办法，是可以将电子看板和我们的即时消息通讯工具（例如Slack）集成起来，设置通知的规则，当电子看板进行更新的时候，能够依据策略通知相关的人员，以便提醒关注。或者，还可以通过在当日的某个时刻，增加一次快速的看板检视会议的方式，来让全体人员关注整体的项目进度和每个人的工作情况。</p><p>建立可视化的看板，是最为快速有效的增加工作透明度的方式。除此之外，还可以坚持每日的远程代码检视来补充解决这个问题；以及充分发挥持续集成流水线，集成更多的可视化工具来进一步增强工作的透明度。</p><p>所以，<strong>如果一个研发组织，连最起码的工作可视化都做不好，怎么能防止在家办公不会加剧提升沟通成本？</strong></p><h2 id="后话"><a href="#后话" class="headerlink" title="后话"></a>后话</h2><p>由于篇幅原因，我们无法对影响在家办公沟通成本的全部挑战进行一一讲解，我只是找出了我所认为的最关键的三个重点关注的内容进行了介绍。</p><p>还是那句话：</p><blockquote><p><strong>以绝大多数软件研发组织的敏捷实践水平之低，还谈不上如何在家办公。</strong></p></blockquote><p>希望本文能为众多因为“被在家办公”搞得鸡飞狗跳的软件研发组织提供一些参考和帮助。</p><p>后续文章，我会从另外的方面，来继续讲一讲，为什么在家办公是软件研发组织的“敏捷试金石”。</p><hr><h2 id="欢迎关注我的个人公众号"><a href="#欢迎关注我的个人公众号" class="headerlink" title="欢迎关注我的个人公众号"></a>欢迎关注我的个人公众号</h2><p>微信搜索：<code>枪炮与代码</code>，或者搜索公众号ID：<code>guns_n_code</code></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-wechat.png" alt="枪炮与玫瑰"></p>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;最近“新型冠状病毒（2019-nCoV）”汹汹来袭，一时间**“在家办公（Working From Home，简称WFH）”**成了一个非常现实和火热的话题。我心想着：“这时候理应有篇写在家办公的文章”，但是又一想：“想必一定有很多人写”，所以一直没动笔。&lt;/p&gt;
&lt;p&gt;结果呢，各种渠道和平台的在家办公类文章铺天盖地，无奈的是，里面大量的都是在卖自家产品，没几个在认真说在家办公的挑战和问题的。似乎买了某家的在线协作平台产品，就能真正实现在家办公了一样——&lt;strong&gt;如果真的靠买产品就能实现在家办公，那岂不是绝大多数的软件研发团队平时都应该在家办公吗？为啥还要天天车马劳顿的赶去公司上班？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这次突如其来的疫情所带来的在家办公一事，更像是一次针对软件研发组织敏捷程度的“国考”。在家穿着睡衣披头散发的办公，还都只是大家呵呵一笑找点乐子，但是如果长时间下去，还有多少软件研发组织能够笑到最后呢？&lt;/p&gt;
&lt;p&gt;在IT行业，在家办公一直是一个非常火热的话题。我在加入ThoughtWorks之前，有过半年时间的在家办公尝试。在加入ThoughtWorks之后，在做培训、做开发、做咨询的过程中，阴差阳错的竟然实现了相当时间比例的在家办公。在我看来：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;以绝大多数软件研发组织的敏捷实践水平之低，还谈不上如何在家办公。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;从这篇文章开始，我将围绕制约在家办公的一些关键挑战，以多篇文章（每篇关注一个维度的方式）来谈一谈为什么在家办公是软件研发组织的“敏捷试金石”。&lt;/p&gt;
&lt;p&gt;本篇，我们优先说一说：&lt;strong&gt;沟通成本&lt;/strong&gt;。&lt;/p&gt;</summary>
    
    
    
    <category term="10倍团队" scheme="https://huhao.dev/categories/10%E5%80%8D%E5%9B%A2%E9%98%9F/"/>
    
    
    <category term="10倍团队" scheme="https://huhao.dev/tags/10%E5%80%8D%E5%9B%A2%E9%98%9F/"/>
    
    <category term="敏捷" scheme="https://huhao.dev/tags/%E6%95%8F%E6%8D%B7/"/>
    
    <category term="在家办公" scheme="https://huhao.dev/tags/%E5%9C%A8%E5%AE%B6%E5%8A%9E%E5%85%AC/"/>
    
    <category term="团队沟通" scheme="https://huhao.dev/tags/%E5%9B%A2%E9%98%9F%E6%B2%9F%E9%80%9A/"/>
    
  </entry>
  
  <entry>
    <title>软件技术顾问的培养（一）：新技术顾问必读的十本书以及背后的思考</title>
    <link href="https://huhao.dev/posts/56bcf73b/"/>
    <id>https://huhao.dev/posts/56bcf73b/</id>
    <published>2020-02-01T12:56:46.000Z</published>
    <updated>2020-02-01T12:56:46.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>我在2014年入职ThoughtWorks后，做了近4年的人才培养。在2018年底，我开始从事对外咨询和培训工作，然后又带着一群新技术顾问去对顾问要求比较“严苛”的客户那里做咨询。在这个过程中，一个让我割舍不掉，并且在潜意识中也无法停止思考的问题就是：<strong>怎么培养人？</strong></p><p>尤其是与教毕业生和Junior的员工如何写代码和做项目相比，带Senior的人做咨询工作是有非常大的不同的。</p><p><strong>这篇文章，就围绕我所精挑细选的“新技术顾问必读的十本书”出发，来给大家分享我在培养“通用型软件技术顾问”的过程中的一些思考。</strong></p><p>也希望能够以这篇文章开始，将“如何培养软件技术顾问”这个问题进行不断的探索和总结，来补全我们过去一直以来所进行的“软件人才培养”的研究。以期日积月累，最后成书。</p><span id="more"></span><h2 id="通用型软件技术顾问的基线能力"><a href="#通用型软件技术顾问的基线能力" class="headerlink" title="通用型软件技术顾问的基线能力"></a>通用型软件技术顾问的基线能力</h2><p>首先，我需要对我所指的“软件技术顾问”做一个约束，即：<strong>通用型软件技术顾问</strong>。</p><p>所谓“通用型软件技术顾问”，我给出一个定义，就是：</p><blockquote><p>具备软件技术咨询基线需要的技术知识广度，同时基于自身过去的积累和沉淀，在某一专项领域有知识深度的技术顾问。</p></blockquote><p><em>PS：在这里，我主要聚焦的是“知识广度”，而非“知识深度”，并不是说知识深度不重要，而是知识深度这件事儿，取决于每一个领域知识的具体内容，在做基线化要求的时候，将会非常的专项和细节，这些属于未来进行专项基线化的内容，在此就不赘述。</em></p><p>**对于通用型软件技术顾问来说，软件工程的端到端实践知识是其非常重要的能力基础。**换句话说，如果不知道，也没有亲自实践过一个软件是如何通过现代的软件开发方法论开发出来的，那么就无法从全局视角出发，在为客户实施技术咨询服务的时候，进行全局分析和思考，非常容易陷入某个非常狭窄的局部问题出不来。</p><p>在这里，我把上面这句话拆成三个关键词：</p><ul><li><strong>现代软件工程</strong></li><li><strong>端到端实践经验</strong></li><li><strong>端到端知识体系</strong></li></ul><p>**首先，我们来说一说什么叫“现代软件工程”。**所谓“现代”其实就是相对于我们这个行业，尤其是国内的广大“传统”IT组织来说的。现代的软件工程方法论，一方面以当下最火的DevOps运动为代表，该运动以跨部门和角色协作、持续交付、敏捷&#x2F;精益思想以及构建生机型文化为核心，通过对软件研发过程的全局性优化，加速IT组织的响应力。另一方面，以设计思维（Design Thinking）和领域驱动设计（Domain Driven Design）的日趋火热为代表，强调通过协作设计来消除传统软件工程部门墙（角色墙）高筑的工作方式。</p><p><em>PS：这里需要强调的是，对于一个技术顾问来说，不光要知道现代的方法怎么做，更需要知晓方法的演变历史，和不同方法在其特定历史时期的优势和劣势。</em></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-15-050456.png" alt="例图：领域驱动设计与传统面向对象设计方法的对比"></p><p>**其次，来说一说什么叫“端到端实践经验”。**其实就是一个技术顾问，是否在过去的工作中，从事过并熟悉软件开发从需求分析、设计、实现、测试、上线及运维的全过程。通常来说，一个工作经验在5-8年左右，并且担当过开发团队技术负责人（Tech Lead）的全栈软件工程师（至少是要在了解一定前端开发知识的基础上，熟悉后端开发。这里不是对前端开发有什么偏见或者歧视，主要是我遇到过的绝大多数纯粹的前端开发工程师都不太了解系统架构知识，或者都不太具备系统架构的经验），理应在实际项目中实践过并具备这些能力。</p><p><strong>最后，来说一说什么叫“端到端知识体系”。<strong>其实就是说：</strong>“干过很重要，但是干过却不能系统化的说出来为什么这么干，那就是纯粹的片面经验主义，是缺乏体系支撑和说服力的。”</strong>——这个是软件技术顾问与普通软件技术开发人员最为关键的区别之一，也是本文“必读的十本书”的核心理由。我相信，但凡是善于总结抽象，并且通过长期的实践、思考和总结，很多优秀的软件架构师或工程师都能够形成一套自己的体系化思想和方法。但是与其“自己重复造轮子”，不如“站在巨人的肩膀上”，如果能够阅读足够多必要的经典书籍，那么就能够快速的积累和匹配自己的经验和思考，一方面降低知识总结和沉淀的成本，另一方面则能够与业内的绝大多数人统一语言和认知，通过引经据典等方式更好的提升咨询过程中的说服力。</p><p>而对于一个通用型的软件技术顾问来说，其应该具备的知识体系，就好比应该了解如何能够建一座大楼：</p><ul><li>**知道如何画图纸：**知晓现代的系统架构能力</li><li>**知道施工的流程：**知晓现代的工程实践能力</li><li>**知道施工的工艺：**掌握现代的编码基本手艺</li></ul><p>根据我在技术咨询工作中的经验和观察，我将这三个维度的基线能力定义如下（如图所示）：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-23-%E9%80%9A%E7%94%A8%E5%9E%8B%E6%8A%80%E6%9C%AF%E9%A1%BE%E9%97%AE%E7%9A%84%E5%9F%BA%E7%BA%BF%E8%83%BD%E5%8A%9B%EF%BC%88%E6%8A%80%E6%9C%AF%E4%BE%A7%EF%BC%89.png" alt="通用型技术顾问的基线能力（技术侧）"></p><p>总结一下，对于一个通用型技术顾问来说：</p><blockquote><p>应当能够在<strong>云原生</strong>的背景下，通过<strong>领域驱动设计</strong>的方式，基于业务边界进行架构，选用以<strong>微服务架构</strong>和<strong>分层架构</strong>为代表的，不同层面的恰当架构风格承载架构设计，结合<strong>康威定律或逆康威定律</strong>实现组织与架构相匹配，最后利用<strong>演进式架构</strong>的思想，对架构进行度量、守护和演进。</p><p>在帮助客户落地架构设计的过程中，需要构建<strong>全功能团队</strong>，落实<strong>XP</strong>（极限编程）、<strong>Scrum</strong>、<strong>Kanban</strong>（看板方法）等以价值交付为核心的软件工程实践，通过<strong>持续交付</strong>的方式交付可工作的软件，最终匹配<strong>DevOps</strong>所倡导的研发运营一体化价值观。</p><p>最后，“Talk is cheap, show me the code.”——在代码级别应用适合的<strong>编程范式及其原则</strong>，帮助客户应用<strong>测试驱动开发</strong>实现增量式设计减少冗余，并将<strong>重构</strong>植入开发团队的DNA变成编程的基本功，最终达成<strong>整洁代码</strong>的要求。</p></blockquote><h2 id="通用型软件技术顾问必读的十本书"><a href="#通用型软件技术顾问必读的十本书" class="headerlink" title="通用型软件技术顾问必读的十本书"></a>通用型软件技术顾问必读的十本书</h2><p>当我们定义了通用型软件技术顾问的基线能力后，就可以针对这些基线能力应该具备的基本知识寻找相应的书籍来学习和构建相应的体系化知识了。</p><p>这里，我结合了我的阅读体验和对实际工作需要的观察，精挑细选出来了10本我认为通用型软件技术顾问必读的书，并按照基线能力进行分类，在这里推荐给大家。</p><p>在实际带领新技术顾问进行咨询工作的过程中，经过验证，如果一个新技术顾问能够认真阅读（并且真正领会）过书单中的5本左右的书籍，那么在理论层面上，就能够具备相当丰富的知识储备。结合其在项目上所积累的经验和特长，就能够很好的应对客户现场的大多数问题和挑战，从全局出发思考和分析问题。</p><p><em><strong>PS：当然还有一个屡试不爽的方式，就是当我去面试和判断一个人是否适合做技术咨询工作的时候，我只需要快速的问一下他读过书单上的几本书，然后针对读过的书问他的总结和理解就基本上能够快速过滤掉绝大多数的不胜任者了。</strong></em></p><p>同时，我也在豆瓣上，通过豆列的方式记录了这些书籍，为了也会根据实际需要进行持续的更新或增减：</p><p><a href="https://www.douban.com/doulist/119965864/">https://www.douban.com/doulist/119965864/</a></p><h3 id="编码能力"><a href="#编码能力" class="headerlink" title="编码能力"></a>编码能力</h3><p>在编码能力方面，我们的关注核心为<strong>重构（Refactoring）</strong>，因为重构是能够将面向对象设计原则（OOP）、测试驱动开发（TDD）、整洁代码（Clean Code）、设计模式（Design Patterns）等关键编程基本手艺串起来的主线，同时重构也是技术顾问最为关键的咨询内容，以及验证咨询师编码基本功的法宝。</p><p>所以，我在这里为大家推荐了两本书（按照阅读的递进顺序）：</p><ul><li>《重构2：改善既有代码的设计》</li><li>《数据库重构》</li></ul><p>而至于设计模式，我的建议是别看重量级的书了，推荐个我觉得非常不错的网站便于速查，言简意赅还配备伪代码和多种语言的示例代码（当然也包括中英文版在线内容和付费电子书）：</p><p><a href="https://refactoringguru.cn/design-patterns">https://refactoringguru.cn/design-patterns</a></p><h4 id="《重构2：改善既有代码的设计》"><a href="#《重构2：改善既有代码的设计》" class="headerlink" title="《重构2：改善既有代码的设计》"></a>《重构2：改善既有代码的设计》</h4><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-02-01-051700.jpg" alt="《重构2：改善既有代码的设计》"></p><p>无需太多赘述，《重构》一书作为Martin Fowler所编著的程序员圣经级书籍，是每一个程序员都应该阅读的。如果没读过的话，那么很遗憾，基本上我觉得也不太能把代码写好。</p><p>这里需要注意的是，作为《重构》一书的第二版，老马同志在减少了大量现在已经不太常见的重构手法的同时，用JavaScript改写了所有的代码示例。作为普通的程序员来说，直接看第二版问题不大，但是作为一名技术顾问来说，还是需要把第一版和第二版都看一遍的，尤其是要知道两本书对比调整了什么，而且也便于与很多读过第一版的客户进行交流。</p><h4 id="《数据库重构》"><a href="#《数据库重构》" class="headerlink" title="《数据库重构》"></a>《数据库重构》</h4><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-02-01-051712.jpg" alt="《数据库重构》"></p><p>除了代码本身之外，不论是现在的云原生、微服务还是代码重构本身，一个永远绕不过去的问题就是：数据库如何进行迁移和重构？这本书会为你补全重构在数据库层面的方法。</p><p>幸运的是，很多重构相关的书里，老马等人都提到过《数据库重构》这本很多年前出版的书，这也是目前市面上能够找到的少有的数据库重构相关的书（中文版的纸质版也已经绝版了，只能买二手或者下载到PDF的扫描版）。同时也比较幸运的是，数据库，尤其是关系型数据库的基本理论也已经非常稳定和成熟，所以老书依然不过时。</p><h3 id="架构能力"><a href="#架构能力" class="headerlink" title="架构能力"></a>架构能力</h3><p>在架构能力方面，我们需要关注的维度和层次非常多，这也是一个系统架构师和普通软件工程师的关键能力区别。</p><p>我在这里为大家推荐了六本书（按照阅读的递进顺序）：</p><ul><li>《领域驱动设计模式、原理与实践》</li><li>《架构整洁之道》</li><li>《微服务架构设计模式》</li><li>《演进式架构》</li><li>《数据密集型应用系统设计》</li><li>《企业IT架构转型之道：阿里巴巴中台战略思想与架构实战》</li></ul><h4 id="《领域驱动设计模式、原理与实践》"><a href="#《领域驱动设计模式、原理与实践》" class="headerlink" title="《领域驱动设计模式、原理与实践》"></a>《领域驱动设计模式、原理与实践》</h4><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-02-01-051724.jpg" alt="《领域驱动设计模式、原理与实践》"></p><p>为什么要推荐这本名不见经传的《领域驱动设计模式、原理与实践》，而不是更加有名的《实现领域驱动设计》呢？</p><p>是因为这本书相对于《实现领域驱动设计》来说更新一些，体系和理论更加完善，并且配图和解释也很经典，我知道很多做DDD的顾问都很推荐这本书，我的很多疑惑也是在看这本书的时候得到了解答。所以如果只推荐一本书的话，我肯定则只推荐这一本，只是这一本的中文翻译水平实在是太差，而且中文纸质版也已经绝版了（也还是能下载到扫描版），最好的方式是弄本英文原版PDF对照着看。</p><p>当然，如果你是一个准备深耕DDD的技术顾问，我还是建议DDD有过的书都看一遍，这样能够了解其中很多概念的演变，以及不同作者的不同理解，以便形成自己的思考。有关于概念上的混乱问题，我写过一个相关文章请见：</p><p><a href="https://huhao.dev/posts/58fe0824/">https://huhao.dev/posts/58fe0824/</a></p><h4 id="《架构整洁之道》"><a href="#《架构整洁之道》" class="headerlink" title="《架构整洁之道》"></a>《架构整洁之道》</h4><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-02-01-051731.jpg" alt="《架构整洁之道》"></p><p>人称“Bob大叔”的Robert C. Martin堪称实践出真知的“我辈楷模”，《代码整洁之道》、《敏捷软件开发：原则、模式和实践》、《UML：Java程序员指南》等书都堪称程序员必看书籍。而《架构整洁之道》这本书则记录了Bob大叔对于架构设计，尤其是耦合关系的处理的思考。是分层架构思想方面不可缺少的重要读物。</p><p>当从Clean Code再到Clean Architecture，是一个非常重要的程序员自我追求的关注视角从代码向架构的转变，也能够补充解答很多在阅读DDD相关书籍后，对于分层架构实现方面的疑惑。同时，2019年，Bob大叔出版了他的Clean Agile一书，视角再次转向了软件开发过程，也可以作为补充阅读。</p><h4 id="《微服务架构设计模式》"><a href="#《微服务架构设计模式》" class="headerlink" title="《微服务架构设计模式》"></a>《微服务架构设计模式》</h4><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-02-01-051744.jpg" alt="《微服务架构设计模式》"></p><p>微服务的概念自从老马在2014年以博客的形式炒火之后，相关实践和经验已经有了突飞猛进的发展。如果希望以一本书来全面了解微服务比较新的理论和实践，那么《微服务架构设计模式》这本书是非常适合的。</p><p>抛开书中作者夹带了一些自己的私货不谈，这本书最令我印象深刻的是作者将微服务架构的关键方面抽象为模式，然后介绍了各种模式的适用场景和优劣势，以及相互之间的关系。这种将经验抽象为模式，再用模式去匹配和解决所遇到的问题的方式，是每一个技术顾问最需要具备的能力，希望本书能够给你以启发。</p><h4 id="《演进式架构》"><a href="#《演进式架构》" class="headerlink" title="《演进式架构》"></a>《演进式架构》</h4><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-02-01-051803.jpg" alt="《演进式架构》"></p><p>作为业内端到端交付能力的典范ThoughtWorks，以Rebecca Parsons和Martin Fowler为代表的业内方法论的倡导者，提出了演进式架构（Evolutionary Architectures）的思想，通过“适应度函数”、“增量变更”和“架构耦合”三个维度，为我们介绍了如何能够以业务运营指标等多维度对我们的系统架构进行基于持续交付的度量和评估，从而实现架构的持续演进的思想。</p><p>虽然这本书所承载的演进式架构思想非常的高阶，还缺乏一些可操作的具体指导，但是对于一名技术顾问来说，则已经能够指导我们去思考如何对我们辛辛苦苦做的架构设计进行守护和演进了。这本书也是为了给技术顾问的知识基线拔高一个层次。</p><h4 id="《数据密集型应用系统设计》"><a href="#《数据密集型应用系统设计》" class="headerlink" title="《数据密集型应用系统设计》"></a>《数据密集型应用系统设计》</h4><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-02-01-051754.jpg" alt="《数据密集型应用系统设计》"></p><p>是的，如果说重构要有数据库，架构更要有数据库相关的书籍！那么这本中文版刚刚上市不久的《数据密集型应用系统设计》就是一本能够较为全面的学习和了解数据处理和应用相关知识的必读读物。（如果想更多的了解数据库的话……考虑下《七周七数据库》？）</p><p>这本书和我前述所推荐的众多架构书籍一样，都是超脱了具体技术栈或工具，专注讲理论和思想的书籍，是通用型技术顾问透过实现细节，了解背后完整思想体系的好书。</p><h4 id="《企业IT架构转型之道：阿里巴巴中台战略思想与架构实战》"><a href="#《企业IT架构转型之道：阿里巴巴中台战略思想与架构实战》" class="headerlink" title="《企业IT架构转型之道：阿里巴巴中台战略思想与架构实战》"></a>《企业IT架构转型之道：阿里巴巴中台战略思想与架构实战》</h4><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-02-01-051811.jpg" alt="《企业IT架构转型之道：阿里巴巴中台战略思想与架构实战》"></p><p>如今做咨询，尤其是在中国做软件咨询，完全绕不开“中台”这件事情，几乎所有的客户都在建“中台”（至于大家理解和做的到底是不是中台，那是另外一件事儿……）。如果没有阅读过中台相关的第一本书，你就很难去将铺天盖地的中台相关文章和资料联系起来，去伪存真的理解中台到底是个什么东西，所以这也是一本非常典型的市场需求拉动的读物。</p><p>当然，这本书里有关中台的思想主要集中在前几章，后面大量的篇幅都在讲阿里巴巴在实践中台过程中所实践的技术解决方案和产品的由来。所以，在看完这本书之后，我还是强烈推荐大家阅读<a href="https://insights.thoughtworks.cn/category/zhongtai/">我的同事王健所写的《白话中台》系列</a>，便于快速的获取和更新中台相关的思考和认识。</p><h3 id="工程能力"><a href="#工程能力" class="headerlink" title="工程能力"></a>工程能力</h3><p>在工程能力方面，我们更聚焦技术侧所关注的内容，这里面就是以持续交付为核心，以DevOps来拔高，至于敏捷&#x2F;精益相关的管理侧书籍，由于非常多，所以暂时不纳入，未来我会写另一个管理侧的书籍推荐。</p><p>我在这里为大家推荐了两本书：</p><ul><li>《持续交付：发布可靠软件的系统方法》</li><li>《DevOps实践指南》</li></ul><h4 id="《持续交付：发布可靠软件的系统方法》"><a href="#《持续交付：发布可靠软件的系统方法》" class="headerlink" title="《持续交付：发布可靠软件的系统方法》"></a>《持续交付：发布可靠软件的系统方法》</h4><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-02-01-051825.jpg" alt="《持续交付：发布可靠软件的系统方法》"></p><p>都在说持续集成和持续交付，如果没有看过《持续交付》这本书的话，就别谈什么持续集成和持续交付了……</p><p>这本书可以说是持续交付的基础理论读物，好比“语数外数理化”，是每一个软件开发工程师的必读书籍。这本书也是下一本书《DevOps实践指南》的前置读物，如果不能打好基本的理论基础，将很难理解DevOps的很重要的一个理论基础。</p><h4 id="《DevOps实践指南》"><a href="#《DevOps实践指南》" class="headerlink" title="《DevOps实践指南》"></a>《DevOps实践指南》</h4><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-02-01-051836.jpg" alt="《DevOps实践指南》"></p><p>《DevOps实践指南》是《持续交付》的作者Jaz Hamble与其他人一起合著的DevOps代表性书籍，也是横向的向大家介绍了DevOps的思想和相关的知识。换句话说，如果没看过《持续交付》和《DevOps实践指南》，就别给我提DevOps了……</p><p><em>PS：需要注意的是，这本书的中译本最后部分被夹带了某公司DevOps认证的私货，正如DevOps被炒的非常火爆一样，我们还是在阅读的时候关注其核心内容，不要被认证课程带偏了。</em></p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>在这里，把以上十本书再罗列一下（按照推荐阅读顺序）：</p><ul><li>编码能力类<ul><li>《重构2：改善既有代码的设计》</li><li>《数据库重构》</li></ul></li><li>架构能力类<ul><li>《领域驱动设计模式、原理与实践》</li><li>《架构整洁之道》</li><li>《微服务架构设计模式》</li><li>《演进式架构》</li><li>《数据密集型应用系统设计》</li><li>《企业IT架构转型之道：阿里巴巴中台战略思想与架构实战》</li></ul></li><li>工程能力类<ul><li>《持续交付：发布可靠软件的系统方法》</li><li>《DevOps实践指南》</li></ul></li></ul><p>如果记不住没关系，再提醒一下，我将这些书收录到了我的豆瓣豆列中，并在未来会持续维护：</p><p><a href="https://www.douban.com/doulist/119965864/">https://www.douban.com/doulist/119965864/</a></p><p>而很多时候，我相信对于很多人，最大的挑战来自于：<strong>“我坚持不下去读书啊！”</strong></p><p>针对这个问题，推荐你阅读我曾经写过的一篇文章<a href="https://huhao.dev/posts/c0297a43/">《44天读8本书——习惯养成不能靠信念和鸡汤》</a>，对于想要成为一名技术顾问的朋友，我也就只能帮你到这里了，是走是留都是你自己的事情。</p><p>最后，我还是要强调这样一句话：</p><blockquote><p><strong>“Talk is cheap, show me the code.”</strong> - Linus</p></blockquote><p>读书和理论固然重要，实践和实操不可分。大家切莫忘了去将自己所学到的知识进行实践，或者刻意练习。</p><p><strong>愿你做一名又会讲理论又会写代码的技术顾问，不要做只会靠说的技术顾问，也不要做不会说的技术顾问。</strong></p><p>希望本文对希望成为技术顾问的朋友有所帮助。</p><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ul><li><a href="https://huhao.dev/posts/c0297a43/">44天读8本书——习惯养成不能靠信念和鸡汤</a></li><li><a href="https://huhao.dev/posts/58fe0824/">领域驱动实战思考（二）：用分段思想改进那些混乱的战略设计和战术设计</a></li><li><a href="https://insights.thoughtworks.cn/category/zhongtai/">ThoughtWorks洞见：白话中台系列</a></li></ul><hr><h2 id="欢迎关注我的个人公众号"><a href="#欢迎关注我的个人公众号" class="headerlink" title="欢迎关注我的个人公众号"></a>欢迎关注我的个人公众号</h2><p>微信搜索：<code>枪炮与代码</code>，或者搜索公众号ID：<code>guns_n_code</code></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-wechat.png" alt="枪炮与玫瑰"></p>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;我在2014年入职ThoughtWorks后，做了近4年的人才培养。在2018年底，我开始从事对外咨询和培训工作，然后又带着一群新技术顾问去对顾问要求比较“严苛”的客户那里做咨询。在这个过程中，一个让我割舍不掉，并且在潜意识中也无法停止思考的问题就是：&lt;strong&gt;怎么培养人？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;尤其是与教毕业生和Junior的员工如何写代码和做项目相比，带Senior的人做咨询工作是有非常大的不同的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这篇文章，就围绕我所精挑细选的“新技术顾问必读的十本书”出发，来给大家分享我在培养“通用型软件技术顾问”的过程中的一些思考。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;也希望能够以这篇文章开始，将“如何培养软件技术顾问”这个问题进行不断的探索和总结，来补全我们过去一直以来所进行的“软件人才培养”的研究。以期日积月累，最后成书。&lt;/p&gt;</summary>
    
    
    
    <category term="软件技术顾问的培养" scheme="https://huhao.dev/categories/%E8%BD%AF%E4%BB%B6%E6%8A%80%E6%9C%AF%E9%A1%BE%E9%97%AE%E7%9A%84%E5%9F%B9%E5%85%BB/"/>
    
    
    <category term="阅读" scheme="https://huhao.dev/tags/%E9%98%85%E8%AF%BB/"/>
    
    <category term="人员培养" scheme="https://huhao.dev/tags/%E4%BA%BA%E5%91%98%E5%9F%B9%E5%85%BB/"/>
    
    <category term="软件技术顾问" scheme="https://huhao.dev/tags/%E8%BD%AF%E4%BB%B6%E6%8A%80%E6%9C%AF%E9%A1%BE%E9%97%AE/"/>
    
    <category term="咨询" scheme="https://huhao.dev/tags/%E5%92%A8%E8%AF%A2/"/>
    
  </entry>
  
  <entry>
    <title>神器推荐：用asdf-vm将你从各种语言的版本管理器之中解救出来</title>
    <link href="https://huhao.dev/posts/61efd12a/"/>
    <id>https://huhao.dev/posts/61efd12a/</id>
    <published>2020-01-22T10:34:46.000Z</published>
    <updated>2020-01-22T10:34:46.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>你是不是和我一样，是一个会使用一大堆编程语言的软件开发工程师？例如：</p><blockquote><p>Java、C#、JavaScript、Ruby、Python、Go……</p></blockquote><p>你是不是和我一样，会在电脑上装一大堆以上各种语言的“版本管理器（Version Mananger）”，为了管理和切换不同项目的运行时（Runtime）版本？例如：</p><blockquote><p>sdkman、nvm、rvm、pyenv、gvm……</p></blockquote><p>你是不是和我一样，是一个浪费了大量时间在选择某种语言的版本管理器上的“强迫症患者”？例如：</p><blockquote><p>到底应该用sdkman呢还是jabbar呢？</p><p>到底应该用nvm呢还是n呢？</p><p>到底应该用rvm呢还是rbenv呢？</p><p>……</p></blockquote><p>你是不是和我一样，被各种语言的版本管理器污染了硬盘还整的精神分裂呢？</p><p>你是不是和我一样，期待能够有种能够管理所有语言的版本管理器，从而“一统江湖”呢？</p><p>你是不是和我一样，平时使用macOS或者Linux操作系统呢？</p><p>如果以上答案都和我一样，那这篇神器推荐就是写给你的，让我们隆重介绍这款“一统江湖的语言版本管理器”：<a href="https://asdf-vm.com/"><strong>asdf-vm</strong></a>！</p><p>（对不起，我也用Windows，只是神器不支持……囧）</p><span id="more"></span><h2 id="asdf-vm介绍"><a href="#asdf-vm介绍" class="headerlink" title="asdf-vm介绍"></a>asdf-vm介绍</h2><p>asdf-vm是一个能够按项目管理多种语言运行时版本的命令行工具，当前以插件的方式已经支持150+的语言或常用开发工具。</p><p>官网地址为：<a href="https://asdf-vm.com/">https://asdf-vm.com</a></p><p>并且，这个工具已经在<a href="https://www.thoughtworks.com/cn/radar/tools/asdf-vm">2019年11月的“ThoughtWorks技术雷达”</a>中被第一次纳入雷达范围，当前处于“评估”状态。</p><blockquote><p>评估：在了解它将对你的企业产生什么影响的前提下值得探索。</p></blockquote><p>相比于安装一大堆“专款专用”的版本管理工具来说，asdf-vm具备以下特点：</p><blockquote><ul><li>用一个命令行工具支持多种编程语言</li><li>用完全一致的命令管理所有的编程语言</li><li>可以通过一个配置文件在一个地方保持全局的默认配置</li><li>可以通过一个 <code>.tool-versions</code> 配置文件按工程进行单独配置</li><li>支持现有的配置文件以方便迁移现有版本管理工具的使用，例如： <code>.node-version</code>, <code>.nvmrc</code>, <code>.ruby-version</code></li><li>在目录切换的时候自动切换运行时的版本</li><li>通过简洁的插件系统添加多种编程语言的支持</li><li>由插件自身管理命令行自动完成脚本，而不需要你自己去配置！</li></ul></blockquote><p>而且这个工具的名字起的也很有特色——<code>asdf</code>对应的就是标准键盘上左手默认放在上面的<code>A</code> <code>S</code> <code>D</code> <code>F</code>四个按键，又好按又好记。</p><h2 id="使用方法"><a href="#使用方法" class="headerlink" title="使用方法"></a>使用方法</h2><p>工具的安装方法非常简单，在这里就不过多介绍了，可以看官网说明。在这里主要给大家快速展示下常用的使用方法。</p><h3 id="安装语言插件"><a href="#安装语言插件" class="headerlink" title="安装语言插件"></a>安装语言插件</h3><p>安装完成后，可以首先通过以下命令列出所有支持的语言插件：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">asdf plugin list all</span><br></pre></td></tr></table></figure><p>当然，如果想快速知道某种语言是否已被支持，可以用grep根据关键字进行快速查找，例如：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">asdf plugin list all | grep golang</span><br></pre></td></tr></table></figure><p>每种语言的一些特殊使用要求和注意事项，可以查看该语言的插件页面。</p><h3 id="安装某种语言的可用版本"><a href="#安装某种语言的可用版本" class="headerlink" title="安装某种语言的可用版本"></a>安装某种语言的可用版本</h3><p>在安装了某种语言的插件之后，可以通过<code>asdf list all &lt;name&gt;</code>命令查看所有在线的可用版本，例如：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">asdf list all golang</span><br></pre></td></tr></table></figure><p>然后，根据自己的需要，通过<code>asdf install [&lt;name&gt; &lt;version]</code>命令安装指定的语言版本，例如：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">asdf install golang 1.13.6</span><br></pre></td></tr></table></figure><p><strong>PS：小心点，如果你没有加版本号，则默认安装的是该语言的所有可用版本！</strong></p><p>在安装完成后，可以通过以下命令显示所有已安装的语言和版本：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">asdf list</span><br></pre></td></tr></table></figure><h3 id="使用某种语言的已安装版本"><a href="#使用某种语言的已安装版本" class="headerlink" title="使用某种语言的已安装版本"></a>使用某种语言的已安装版本</h3><p>在日常使用时，切换指定的语言版本非常简单。</p><p>如果仅仅是在当前的shell会话中临时进行切换，可以使用<code>asdf shell &lt;name&gt; &lt;version&gt;</code>命令，例如：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">asdf shell golang 1.13.6</span><br></pre></td></tr></table></figure><p>如果希望设置在某个目录之下使用特定的版本，可以使用<code>asdf local &lt;name&gt; &lt;version&gt;</code>命令，这个命令能够在当前文件夹下生成一个<code>.tool-version</code>文件记录指定的语言和版本号，这样下回再从命令行访问改目录的时候，就会自动切换到对应的语言版本（同时还兼容常见的其他版本管理器的配置文件），例如：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">asdf local golang 1.13.6</span><br></pre></td></tr></table></figure><p>如果希望在全局设置默认的语言版本，则可以使用<code>asdf global &lt;name&gt; &lt;version&gt;</code>命令，这个命令能够在用户的<code>$HOME</code>文件夹下生成一个<code>.tool-version</code>文件记录默认的语言和版本号，例如：</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">asdf global golang 1.13.6</span><br></pre></td></tr></table></figure><p>怎么样？以上命令是不是非常简单好用？</p><p><strong>从现在开始，用asdf-vm来挨个替换你电脑上各种专用的运行时版本管理器吧！</strong></p><hr><h2 id="欢迎关注我的个人公众号"><a href="#欢迎关注我的个人公众号" class="headerlink" title="欢迎关注我的个人公众号"></a>欢迎关注我的个人公众号</h2><p>微信搜索：<code>枪炮与代码</code>，或者搜索公众号ID：<code>guns_n_code</code></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-wechat.png" alt="枪炮与玫瑰"></p>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;你是不是和我一样，是一个会使用一大堆编程语言的软件开发工程师？例如：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Java、C#、JavaScript、Ruby、Python、Go……&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;你是不是和我一样，会在电脑上装一大堆以上各种语言的“版本管理器（Version Mananger）”，为了管理和切换不同项目的运行时（Runtime）版本？例如：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;sdkman、nvm、rvm、pyenv、gvm……&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;你是不是和我一样，是一个浪费了大量时间在选择某种语言的版本管理器上的“强迫症患者”？例如：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;到底应该用sdkman呢还是jabbar呢？&lt;/p&gt;
&lt;p&gt;到底应该用nvm呢还是n呢？&lt;/p&gt;
&lt;p&gt;到底应该用rvm呢还是rbenv呢？&lt;/p&gt;
&lt;p&gt;……&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;你是不是和我一样，被各种语言的版本管理器污染了硬盘还整的精神分裂呢？&lt;/p&gt;
&lt;p&gt;你是不是和我一样，期待能够有种能够管理所有语言的版本管理器，从而“一统江湖”呢？&lt;/p&gt;
&lt;p&gt;你是不是和我一样，平时使用macOS或者Linux操作系统呢？&lt;/p&gt;
&lt;p&gt;如果以上答案都和我一样，那这篇神器推荐就是写给你的，让我们隆重介绍这款“一统江湖的语言版本管理器”：&lt;a href=&quot;https://asdf-vm.com/&quot;&gt;&lt;strong&gt;asdf-vm&lt;/strong&gt;&lt;/a&gt;！&lt;/p&gt;
&lt;p&gt;（对不起，我也用Windows，只是神器不支持……囧）&lt;/p&gt;</summary>
    
    
    
    <category term="神器推荐" scheme="https://huhao.dev/categories/%E7%A5%9E%E5%99%A8%E6%8E%A8%E8%8D%90/"/>
    
    
    <category term="asdf-vm" scheme="https://huhao.dev/tags/asdf-vm/"/>
    
    <category term="version manager" scheme="https://huhao.dev/tags/version-manager/"/>
    
  </entry>
  
  <entry>
    <title>领域驱动实战思考（三）：DDD的分段式协作设计</title>
    <link href="https://huhao.dev/posts/61190ae2/"/>
    <id>https://huhao.dev/posts/61190ae2/</id>
    <published>2020-01-18T10:05:28.000Z</published>
    <updated>2020-01-18T10:05:28.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>在我的<a href="https://huhao.dev/posts/58fe0824/">上一篇文章</a>中，给大家介绍了我在实践中对于DDD设计过程进行梳理的思考。本篇则是向大家整体介绍一下我的“DDD分段式协作设计”的步骤和内容。</p><p>同时，该方法的基准化操作手册，也在曾经的一篇文章中<a href="https://huhao.dev/posts/130bb570/">公开提供了下载</a>，可以作为更细化的内容进行参考和使用。</p><p><strong>由于DDD的相关概念和设计方法极多，相比其他市场上所能见到的操作手法，我在这里向大家所介绍的方法，更加聚焦如何能够确保达到“绝大多数人的60分”， 而非“极少数人的100分”，也就是说，我更加注重的是：</strong></p><ul><li><strong>步骤间的连贯性</strong></li><li><strong>方法的可操作性</strong></li><li><strong>实践的可落地性</strong></li><li><strong>与新技术的匹配性（例如云原生）</strong></li></ul><p><strong>为此，我尽可能的通过实战检验，在一些需要凭借经验进行综合判断的场景，尽可能的提供虽然不完美但是可以降低选择成本的唯一选项或解释，从而争取让一线实施人员避免“二选一”或“看具体情况再说”这样莫能两可的纠结。</strong></p><p>需要说明的是，不同的咨询师在实施DDD的设计过程中手法都不一样，我仅是从我所实施过的咨询项目出发，提供了一种经反复验证可工作的方式，并不代表本方法是唯一正确的。</p><p>在这里仅供参考，也欢迎大家进行交流。</p><span id="more"></span><h2 id="DDD解决的问题和办法"><a href="#DDD解决的问题和办法" class="headerlink" title="DDD解决的问题和办法"></a>DDD解决的问题和办法</h2><p>在介绍分段式设计之前，让我们回顾一下DDD希望解决的问题：</p><blockquote><p><strong>软件核心复杂性</strong></p></blockquote><p>所谓“复杂”，我根据实际观察总结的理解是：</p><ul><li>业务场景多</li><li>业务流程长</li><li>业务概念多</li></ul><p><strong>而具备以上这种特征的业务问题，其复杂度往往都会超出任何单独一个人的大脑所能够理解和处理的范围。</strong></p><p>在过去的单体架构时代，由于业务复杂度和技术复杂度都还处于与今天相比更加“简单”的阶段，所以很多时候，我们可能能够依赖少数“聪明的”系统架构师或者“十倍工程师”来通过“拍脑袋”解决问题。</p><p>而在今天，这个迈向“第四次工业革命”的时代，当“唯一不变的就是变化”所带来的高业务响应力要求，使得业务问题的复杂度越来越高，而技术复杂度也随着云原生和微服务架构产生了几何增长，甚至催生出了DevOps这样的运动时。对于一个要应对复杂业务挑战的大规模企业来说，依赖少数“聪明人”通过“拍脑袋”来解决问题则变得越来越不现实。</p><p>那怎么办才好呢？</p><p>这时候，我们需要做的事情，就是<strong>通过集体的力量来解决问题：</strong></p><ul><li><strong>通过协作的方式消除部门墙和角色墙，共同应对和分析复杂业务问题，设计解决方案，避免少数人“拍脑袋”；</strong></li><li><strong>通过领域驱动的方式，依据业务问题的边界（业务变化的边界）、人员沟通一致性的边界（概念变化的边界）以及弹性伸缩的边界（云原生需求的边界）来架构软件系统，实现业务架构和技术架构相匹配，从而通过业务变化来拉动架构，通过架构来响应业务变化。</strong></li></ul><p>这种设计方式所提倡的方法，与过去的“传统设计方法”（嗯，没错，说的就是瀑布式或者伪敏捷）的区别，如下图所示：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-15-050456.png" alt="DDD与传统设计方法的对比"></p><p>而聚焦到DDD本身，DDD首先强调的就是我们应当从过去一上来就先考虑“数据模型和数据库表怎么设计”这种“面向技术进行架构”的方式，改为优先考虑“我们要解决的问题是什么”这种“面向业务进行架构”的方式。</p><p>为此，Eric Evans提出了如下三个DDD的核心原则，原文（《Domain-Driven Design Reference: Definitions and Pattern Summaries》）和我的解释图如下：</p><blockquote><ol><li><strong>Focus on the core domain.</strong>（聚焦核心域）</li><li><strong>Explore models in a creative collaboration of domain practitioners and software practitioners.</strong>（领域专家和软件专家通过创造性的协作探索模型）</li><li><strong>Speak a ubiquitous language within an explicitly bounded context.</strong>（利用明确且有边界的上下文统一语言）</li></ol></blockquote><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-15-050540.png" alt="DDD核心原则"></p><p>而在DDD思想出现之前，人们进行基于面向对象思想（OO）的系统架构设计的时候，更多的是通过“用例分析法 + SOLID原则 + UML”的方式，基于业务描述中的名词和动词，利用近似“拍脑袋”和“凭经验”的方式来进行建模的，相信但凡长期从事面向对象设计的同行都会有所体会。</p><p>而在DDD思想出现和逐渐发展后，该思想使得人们能够从业务抽象、统一语言和问题域划分等多维度进行“更有套路”的面向对象分析，所以DDD被业内人士评价为：<strong>OO Done Right</strong>（正确的完成面向对象设计），如下图所示：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-15-050542.png" alt="DDD是更有套路的设计方式"></p><h2 id="DDD的分段式协作设计"><a href="#DDD的分段式协作设计" class="headerlink" title="DDD的分段式协作设计"></a>DDD的分段式协作设计</h2><p>在回顾了DDD所解决的问题和办法之后，让我们来看一看如何通过分段式的协作设计来驱动DDD在设计阶段的落地。</p><p>在我所使用的方法中，核心思想是：</p><blockquote><p><strong>通过协作设计，从问题澄清和统一共识出发，逐层递进和细化，实现从业务抽象，到领域建模，再到技术实现的阶段性落地。</strong></p></blockquote><p>由此思想出发，我将分段式设计过程拆分为以下几个阶段：</p><ul><li>**战略设计阶段：**业务驱动，忽略技术实现细节，为系统架构设计提供业务边界对齐、弹性边界对齐和投资优先级的信息输入。</li><li>**战术设计阶段：**基于战略设计的信息输出，进行进一步的抽象设计，作为战略设计和技术实现的过渡阶段，为技术实现提供基于抽象模型和业务服务划分的输入。</li><li>**技术实现阶段：**基于战略设计和战术设计的信息输出，进行技术实现相关的设计，例如：技术性组件补全，技术选型，业务API详细设计，分层架构设计，领域模型类设计，数据库设计，制定测试策略……等等。</li></ul><p>接下来，我来分别说一说各个阶段的内容。</p><h3 id="战略设计"><a href="#战略设计" class="headerlink" title="战略设计"></a>战略设计</h3><p>在战略设计阶段，我们优先关注的是：<strong>开发团队对于业务问题理解上的一致性</strong>。</p><p>在这个过程中，“开发团队”指的是包含了“领域专家”在内的所有软件开发相关的关键角色，例如：客户、产品经理 &#x2F; 项目经理、用户体验设计师、系统架构师、开发工程师、测试工程师、运维工程师、数据库管理员、安全专家……等等。</p><p>而“领域专家”，则是一个能力上的称呼，而非职务上的某种角色，“领域专家”指的是：<strong>对需要解决的业务问题具备最丰富的领域知识，能够帮助和指导开发团队进行分析和设计的那个人（也可能是多个人的组合）</strong>。</p><p>之所以需要这么完备的人员构成，是因为协作设计的核心是需要将设计过程“前置（Shift Left）”到软件开发价值流的早期，通过深入的碰撞、讨论来形成<strong>共识</strong>，通过共识驱动整个开发的价值流，减少因为缺乏共识导致的扯皮、返工等浪费。</p><p>在该阶段，这些人聚在一起，<strong>忽略技术实现细节</strong>，通过通力协作关注以下几件事：</p><ul><li>**业务梳理和抽象：**通过事件风暴工作坊，对现实业务流程进行以系统实现为目的的抽象。</li><li>**限界上下文识别：**通过统一语言（消除语言二义性），对抽象概念进行澄清、分类和查漏补缺，从而识别业务边界。</li><li><strong>问题子域识别</strong>：通过对问题域进行识别和澄清，划分问题边界和问题域类型，对架构设计提供投资优先级的参考。</li></ul><h4 id="业务梳理和抽象"><a href="#业务梳理和抽象" class="headerlink" title="业务梳理和抽象"></a>业务梳理和抽象</h4><p>首先，团队需要保证所有人对于业务所要解决的问题、业务场景和业务流程的理解是一致的，而这一点在实际中恰恰是绝大多数团队最为明显的“软肋”。在现实中，每个人脑子里面对于业务的理解都是不一致的，而每个人又无法看到对方的理解长什么样。所以，我们需要通过一种可视化的协作设计方式，利用不同颜色的便利贴、马克笔在大白纸上进行沟通和交流（俗称“糊墙”，我们这些DDD顾问经常自嘲为“糊墙师”）。</p><p>业务抽象可视化的方式有很多种，其中比较著名的是<a href="https://en.wikipedia.org/wiki/Object_Modeling_in_Color">“四色建模（Color Modeling in Color）”</a>和<a href="https://en.wikipedia.org/wiki/Event_storming">“事件风暴（Event Storming）”</a>。在这里，我所使用的是入门门槛更低，更“傻瓜”的事件风暴。</p><p>事件风暴是一种用于DDD的协作设计方法。该方法基于现实业务流程，以系统实现为视角，基于领域事件的发生时间线，通过一次只关注一个维度（分离关注点）的分层抽象方式，将现实业务流程进行抽象并转化为系统实现的业务逻辑，这些步骤包括：</p><ul><li>识别领域事件</li><li>识别决策命令</li><li>识别领域名词</li></ul><p><strong>通过使用事件风暴对业务进行梳理和抽象，能够统一团队认知，并为战术设计阶段的领域建模提供直接输入。</strong></p><p><em>PS：我所使用的事件风暴实施过程，由于经过了大量的实战检验、总结和持续调整，已经与事件风暴创造者Alberto Brandolini先生的现有方法大不相同，有关于Alberto版本的事件风暴相关信息，可以<a href="https://www.eventstorming.com/">查看他的网站</a>。</em></p><p>业务梳理和抽象的产出物，如下图所示：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-15-050210.png" alt="事件风暴"></p><h4 id="限界上下文识别"><a href="#限界上下文识别" class="headerlink" title="限界上下文识别"></a>限界上下文识别</h4><p>在业务梳理和抽象完成后，团队接下来需要做的，是将事件风暴工作坊过程中产出的领域名词和外部系统拿出来，根据概念的相关性和理解上的“二义性”，将它们分门别类，按照“限界上下文（Bounded Context）”划分清楚他们的概念边界。</p><p>限界上下文，是概念的边界，在该边界内，当我们去交流某个业务概念时，不会产生理解和认知上的歧义（二义性），限界上下文是统一语言的重要保证，同时也是业务问题最小粒度的划分。</p><p>然后，团队需要根据限界上下文间概念的依赖关系，对限界上下文进行进一步分析，画出它们之间的依赖关系，以便发现和识别一些典型的“设计坏味道”，例如：</p><ul><li>双向依赖：上下文之间缺少一层未被澄清的上下文，或者两个上下文其实可被合为一个；</li><li>循环依赖：任何一个上下文发生变更，依赖链条上的上下文均需要改变；</li><li>过深的依赖：自身依赖的信息不能直接从依赖者获取到，需要通过依赖者从其依赖的上下文获取并传递，依赖链路过长，依赖链条上的任何一个上下文发生变更，其链条后的任何一个上下文均可能需要改变；</li></ul><p><strong>通过对于限界上下文的划分和依赖关系的识别，团队能够实现软件架构在概念边界上的内聚和解耦。</strong></p><p><em>PS：我使用了限界上下文依赖关系，代替了人们常用的“限界上下文映射（Context Mapping）”，因为限界上下文的7种上下游映射关系，所反映的是团队间的各种协作关系，这一步是一个非常细化的分析过程，在战略设计这种宏观分析阶段，实际中非常难以提前识别和分析，因为很多时候团队都还没有。而绝大多数情况下，我们做限界上下文分析的时候，都是为了能够快速的指导系统业务模块或服务的划分，所以我从<a href="https://c4model.com/">C4模型（C4 Model）</a>中找到了灵感，进行了简化和代替。</em></p><p>限界上下文识别过程的产出物，如下图所示：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-15-050302.png" alt="限界上下文依赖关系"></p><h4 id="问题子域识别"><a href="#问题子域识别" class="headerlink" title="问题子域识别"></a>问题子域识别</h4><p>在战略设计阶段的最后，团队需要根据限界上下文识别的产出，按照“一个子域负责解决具有一个独立业务价值的问题”的原则，将限界上下文以“切蛋糕”的方式，划分到不同的问题子域（Subdomain）中，并按照以下三种不同的子域类型进行标注：</p><ul><li>**核心域（Core Domain）：**是当前产品的核心差异化竞争力，是整个业务的盈利来源和基石，如果核心域不存在，那么整个业务就不能运作。对于核心域，需要投入最优势的资源（包括能力高的人），和做严谨良好的设计。</li><li>**通用子域（Generic Subdomain）：**该类问题在界内非常常见，所以很可能有现成的解决方案，通过购买或简单修改的方式就可以使用。</li><li>**支撑子域（Supporting Subdomain）：**该类问题解决的是支撑核心域运作的问题，其重要程度不如核心域，又不属于通用子域，具备强烈的个性化需求，难以在业内找到现成的解决方案，需要专门的团队定制开发。</li></ul><p>问题子域，是对业务问题的澄清和划分，同时也是对于资源投入优先级的重要参考，相对限界上下文来说，是对业务问题更大粒度的划分。</p><p><strong>通过对于子域进行识别、划分和类型标注，团队能够实现软件架构在业务边界上的内聚和解耦。</strong></p><p><em>PS：在DDD的概念中，限界上下文和问题子域是两个不同维度的概念，理论上来说并没有相互的依赖关系，为了能够方便操作和降低落地成本，依据实践效果，我刻意的选择了“一个子域包含多个限界上下文，一个上下文不得存在于多个子域”的方式。</em></p><p>问题子域识别过程的产出物，如下图所示：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-15-050316.png" alt="问题子域划分"></p><h3 id="战术设计"><a href="#战术设计" class="headerlink" title="战术设计"></a>战术设计</h3><p>在战术设计阶段，我们优先关注的是：<strong>通过抽象模型和业务模块划分来承载业务抽象，为DDD从战略到实现进行过渡</strong>。</p><p>这时候，团队已经在战略设计阶段完成了对于业务问题的澄清和抽象，需要深入建模细节，探讨软件架构的更细粒度的设计。</p><p>在该阶段，开发团队需要<strong>继续忽略技术实现细节</strong>，做以下几件事：</p><ul><li>**领域建模：**针对核心域内的业务概念进行领域建模，通过聚合、实体、值对象的识别，为技术实现中的面向对象设计提供参考。</li><li>**业务服务划分：**基于战略设计的输出，结合“云原生思想”、“康威定律”和“逆康威定律”，划分具体的业务服务单元。</li><li>**业务服务接口能力识别：**根据领域建模和业务服务划分的输出，确定每一个业务服务单元对外暴露的“必要”接口能力清单（忽略具体的协议、地址和数据结构）。</li></ul><h4 id="领域建模"><a href="#领域建模" class="headerlink" title="领域建模"></a>领域建模</h4><p>领域建模，是通过将业务抽象为以下几种抽象模型的方式，利用模型承载和响应业务的变化：</p><ul><li>**聚合（Aggregate）：**负责封装业务逻辑，通过一致性边界和统一语言，内聚决策命令和领域事件，容纳并识别领域名词为以下不同的抽象模型：<ul><li>**实体（Entity）：**是聚合的主干，具有唯一标识和生命周期。</li><li>**聚合根（Aggregate Root）：**是一种实体，是聚合的根节点。</li><li>**值对象（Value Object）：**是实体的附加业务概念，用来描述实体所包含的业务信息。</li></ul></li></ul><p>以上抽象模型，同属领域模型（Domain Model），是对业务的高度抽象，利用抽象模型作为业务和系统实现的核心联系，领域模型封装和承载了全部的业务逻辑，并通过聚合的方式保持业务的“高内聚，低耦合”。</p><p>在后续的技术实现过程中，聚合就是一种文件目录结构（例如：包、命名空间、模块），里面存放了领域模型相关组件及其他的领域层组件，例如：领域服务（Domain Service），工厂（Factory），仓储接口（Repository）等。</p><p>领域建模中的聚合，在承载业务逻辑的同时，是对业务问题最细粒度的澄清和划分，一个限界上下文可能包含多个聚合，一个聚合不能存在于多个限界上下文。</p><p><strong>通过领域建模和对聚合的设计，团队能够实现软件架构在模型层面上的内聚和解耦。</strong></p><p>领域建模过程的产出物，如下图所示：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-15-050342.png" alt="领域建模"></p><h4 id="业务服务识别"><a href="#业务服务识别" class="headerlink" title="业务服务识别"></a>业务服务识别</h4><p>业务服务识别，是为后续系统实现进行的基于业务边界的模块拆分分析，业内常见的拆分方法有：</p><ul><li>**基于限界上下文进行拆分：**每个限界上下文为一个服务，优点是每个服务都很小，代码量少；缺点是拆分粒度太细，导致服务数量过多，增加架构设计的复杂度和运维成本。</li><li>**基于子域进行拆分：**每个子域为一个服务，优点是服务数量相对较少，架构复杂度和运维成本相对更低；缺点是拆分粒度在某些场景下会非常大，导致单个服务变成“小单体”，增加开发成本和代码分层复杂度。</li><li>**基于弹性边界进行拆分：**这个方式是云原生时代新的拆分方式，通过针对服务实例的弹性伸缩的功能性需求或非功能性需求，以弹性边界为决定性参考，结合子域和限界上下文的分析，进行模块拆分。这种方式的优点是，服务粒度和数量适中，更贴近实际需要，开发和运维成本均衡；缺点是引入了一个更贴近运营需求和技术实现的参考维度，增加了系统架构的能力要求和复杂度（这种方法我取自于ThoughtWorks中国区CTO徐昊）。</li></ul><p>从我的实战检验来看，我刻意的选择“基于弹性边界进行拆分”的方式，因为这种方式的说服力更高，性价比也最高，至于对于架构能力和复杂度的要求嘛……对于一个技术顾问和云原生时代的架构师来说，这应该都不是问题才对……</p><p><strong>通过对于业务服务进行划分，团队能够获得对软件架构模块拆分的直接指导，并且还能够依据“逆康威定律”依据架构结果进行开发团队的划分和组建。</strong></p><p>业务服务识别过程的产出物，如下图所示：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-15-050358.png" alt="业务服务划分"></p><h4 id="业务服务接口能力识别"><a href="#业务服务接口能力识别" class="headerlink" title="业务服务接口能力识别"></a>业务服务接口能力识别</h4><p>在识别和划分了业务服务之后，我们需要针对每一个业务服务，基于领域建模时聚合的决策命令，补全和定义每一个业务服务对外暴露的接口能力，这种接口能力一般就是两类：</p><ul><li>写类型的接口能力</li><li>读类型的接口能力</li></ul><p>而在这个过程中，由于我们还是处于协作设计的阶段，忽略具体技术实现细节，所以我们并不关心接口的实现方式，例如：接口的设计风格、接口的协议、接口的地址、接口的数据结构、是否是事件驱动、是否用消息队列、是同步接口还是异步接口等。这些东西都是在后续技术实现阶段进行的更详细的设计过程。</p><p><strong>通过对业务服务的接口能力进行识别，团队能够提前定义业务服务的接口概要设计方案，为后续负责具体开发的团队提供直接的输入，方便他们进行接口的详细设计。</strong></p><p><em>PS：很多老的DDD设计方式，在这时候往往都会使用Swagger来定义基于RESTful Web API的接口，来实现“API驱动开发（API Driven Development）”。一方面正如前述所说，这都是技术实现细节，提前考虑技术实现细节一方面会增加协作设计阶段的成本，另一方面会干扰领域驱动设计的过程。另一方面，当今的微服务，RESTful Web API这种同步接口的设计，已经不再是最优的默认接口设计风格，内部服务间通过gRPC或消息队列进行通信，对前端服务使用GraphQL等技术实现查询式接口，已经逐渐成为了新的趋势，而RESTful Web API则主要用于对外部服务暴露开放接口的场合。所以，我改为了只对接口能力进行识别，忽略技术实现细节。</em></p><p>业务服务接口能力识别过程的产出物，如下图所示：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-15-050408.png" alt="业务服务接口能力识别"></p><h3 id="技术实现"><a href="#技术实现" class="headerlink" title="技术实现"></a>技术实现</h3><p>在完成了战略设计和战术设计之后，需要众多关键角色集中投入的协作设计过程，就告一段落了。剩下的与具体技术要求更紧密的详细设计过程，刻意交由具体负责业务服务开发的团队去进行后续的设计和实现。</p><p>技术实现阶段要做的事情，包括且不限于：</p><ul><li>补全技术组件：补全为了支撑系统实现的关键技术型组件，例如客户端、BFF（Backend for Frontend）、ACL（Anticorruption Layer，防腐层）等，完善系统应用类组件（需要分清应用和基础设施的区别）。</li><li>技术选型：选择适合的技术栈或工具。</li><li>API详细设计：选择适合的通讯方式、API设计风格和开发框架，利用契约测试或可视化文档对API进行详细设计。</li><li>分层架构设计：采用符合领域驱动设计风格（或者其它符合整洁架构思想的）的分层架构思想，设计单个服务的架构。</li><li>领域模型类设计：参考领域模型的设计，利用面向对象的语言设计具体的类。</li><li>持久化设计：参考领域模型的设计和实际的持久化相关指标，对持久化组件（例如数据库）进行选型和设计。</li><li>制定测试策略：针对实际需要和性价比，设计适合的测试策略，以守护架构设计。</li><li>……（其它）</li></ul><p><strong>需要特别注意的是：哪些东西属于技术实现细节？哪些东西属于抽象业务？这个判断将会贯穿整个DDD的分段式协作设计过程，任何过早进行技术实现细节的思考和讨论，都有极大的风险导致领域驱动走偏。</strong></p><p>所以，在实战过程中，我通常采用一个非常有效的方式来提醒大家：</p><p>拉一个写着“绝不提前考虑技术实现”的横幅贴在墙上……</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>以上内容，就是关于我的“DDD分段式协作设计”的介绍，具体的操作步骤和注意事项，欢迎参考<a href="https://huhao.dev/posts/130bb570/">先前文章中提供的操作手册</a>。</p><p>当然，从2020年起，我也开始组织公开的“领域驱动设计练功房”培训课程（收费课程），在这个培训课程中，我们不但会通过实战的方式让大家体会协作设计的过程，也会通过测试驱动开发（TDD）的方式带领大家体验DDD技术实现过程中有关分层设计的方式。</p><p>当然，有任何问题和建议，欢迎大家通过文章下方的评论进行交流，同时关注后续文章。</p><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ul><li><a href="https://huhao.dev/posts/130bb570/">领域驱动实战思考（一）：用TDD思想对DDD的协作设计过程进行基准化</a></li><li><a href="https://huhao.dev/posts/58fe0824/">领域驱动实战思考（二）：用分段思想改进那些混乱的战略设计和战术设计</a></li></ul><hr><h2 id="欢迎关注我的个人公众号"><a href="#欢迎关注我的个人公众号" class="headerlink" title="欢迎关注我的个人公众号"></a>欢迎关注我的个人公众号</h2><p>微信搜索：<code>枪炮与代码</code>，或者搜索公众号ID：<code>guns_n_code</code></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-wechat.png" alt="枪炮与玫瑰"></p>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;在我的&lt;a href=&quot;https://huhao.dev/posts/58fe0824/&quot;&gt;上一篇文章&lt;/a&gt;中，给大家介绍了我在实践中对于DDD设计过程进行梳理的思考。本篇则是向大家整体介绍一下我的“DDD分段式协作设计”的步骤和内容。&lt;/p&gt;
&lt;p&gt;同时，该方法的基准化操作手册，也在曾经的一篇文章中&lt;a href=&quot;https://huhao.dev/posts/130bb570/&quot;&gt;公开提供了下载&lt;/a&gt;，可以作为更细化的内容进行参考和使用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;由于DDD的相关概念和设计方法极多，相比其他市场上所能见到的操作手法，我在这里向大家所介绍的方法，更加聚焦如何能够确保达到“绝大多数人的60分”， 而非“极少数人的100分”，也就是说，我更加注重的是：&lt;/strong&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;/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;p&gt;&lt;strong&gt;为此，我尽可能的通过实战检验，在一些需要凭借经验进行综合判断的场景，尽可能的提供虽然不完美但是可以降低选择成本的唯一选项或解释，从而争取让一线实施人员避免“二选一”或“看具体情况再说”这样莫能两可的纠结。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;需要说明的是，不同的咨询师在实施DDD的设计过程中手法都不一样，我仅是从我所实施过的咨询项目出发，提供了一种经反复验证可工作的方式，并不代表本方法是唯一正确的。&lt;/p&gt;
&lt;p&gt;在这里仅供参考，也欢迎大家进行交流。&lt;/p&gt;</summary>
    
    
    
    <category term="领域驱动实战思考" scheme="https://huhao.dev/categories/%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E5%AE%9E%E6%88%98%E6%80%9D%E8%80%83/"/>
    
    
    <category term="领域驱动设计" scheme="https://huhao.dev/tags/%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="战略设计" scheme="https://huhao.dev/tags/%E6%88%98%E7%95%A5%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="战术设计" scheme="https://huhao.dev/tags/%E6%88%98%E6%9C%AF%E8%AE%BE%E8%AE%A1/"/>
    
  </entry>
  
  <entry>
    <title>领域驱动实战思考（二）：用分段思想改进那些混乱的战略设计和战术设计</title>
    <link href="https://huhao.dev/posts/58fe0824/"/>
    <id>https://huhao.dev/posts/58fe0824/</id>
    <published>2020-01-13T14:30:28.000Z</published>
    <updated>2020-01-13T14:30:28.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>2019年，在我<a href="https://huhao.dev/posts/130bb570/">对DDD进行基准化</a>的过程中，遇到过非常多的挑战，其中一个便是：</p><p><strong>DDD的设计过程，到底应该分为多少个阶段？每个阶段做什么事情？</strong></p><p>这个困惑来自于书本上，以及其他咨询师在咨询过程中对于DDD设计和操作的差异：</p><ul><li>有的人会从电梯演讲和用户地图开始做设计和分析；</li><li>有的人会从事件风暴开始做设计和分析；</li><li>有的人会从子域开始做设计和分析；</li><li>有的人会从限界上下文开始做设计和分析；</li><li>有的人会直接从领域建模的聚合、实体、值对象开始做设计和分析；</li><li>当然，还有的人会使用“名词动词法”直接从用例描述开始做设计和分析。</li></ul><p>对于实际的学习者和使用者来说，这种混乱的操作手法所形成的不一致和不流畅体验，对于坚持进行DDD设计和减少吵架来说，简直是一种毁灭性的影响。</p><p>在这个过程中，最让我感触深刻的，是在于大家在落地DDD的时候，使用了大量具有“二义性”的词汇，讽刺的是，这与DDD所强调的统一语言是背道而驰的。</p><p>其中对于上述混乱影响最大的因素之一，就是大家对于DDD的“战略设计”和“战术设计”认知不一致（甚至说是混沌）的问题。</p><p>所以，这篇文章，就是围绕这两个概念，来说一说我是如何在基准化的过程中解决这个问题，统一并形成较为流畅的分段式的设计过程的。</p><span id="more"></span><h2 id="混乱的战略设计和战术设计"><a href="#混乱的战略设计和战术设计" class="headerlink" title="混乱的战略设计和战术设计"></a>混乱的战略设计和战术设计</h2><p>一谈起“战略设计”和“战术设计”，你一定会听到“问题域”、“方案域”、“实现域”等名词。</p><p>我的同事肖然在经过反复理解和提炼之后，曾经提出过一个用于解释“问题与方案”、“战略与战术”的“元模型”：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-13-DDD-Essence.png" alt="从问题&#x2F;解决方案和战略&#x2F;战术维度分析DDD元模型的元素"></p><p>这个模型其实对于具备多维思维和对DDD有着深入理解的人来说，是一种不错的可视化辅助理解手段（划分的合理性仅供参考）。但是在成为更多的咨询师做DDD咨询或培训时开篇必用的材料之后，事情就变得诡异了。因为这个元模型对于咨询师或者培训师是一个比较好的记忆工具，而不是用来给别人解释的适合的工具。</p><p>当没有意识到这一点的人在使用这个模型给客户解释的时候，会向客户描述成：“问题域的战略设计”、“问题域的战术设计”、“解决方案域的战略设计”以及“解决方案的战术设计”。</p><p>经过实战证明，这种方式不到1分钟，就能让客户及对DDD理论没有深入了解的人晕菜，屡试不爽。</p><h3 id="它们是从哪儿来的？"><a href="#它们是从哪儿来的？" class="headerlink" title="它们是从哪儿来的？"></a>它们是从哪儿来的？</h3><p>在搞清楚这个问题之前，我们先要追本溯源，看看这些概念是从哪里来的。</p><h4 id="问题域-方案域-实现域"><a href="#问题域-方案域-实现域" class="headerlink" title="问题域 &#x2F; 方案域 &#x2F; 实现域"></a>问题域 &#x2F; 方案域 &#x2F; 实现域</h4><p>什么是问题域？什么是方案域？什么是实现域？</p><p>非常有意思的是，以上名词在我搜索的过程中，能够搜到的结果绝大多数都是和软件系统的业务分析及领域驱动设计相关的，当然他们还有很多不同的翻译或者别称。具体到底最初是哪里定义了这三个词汇，我目前还无从查证。但仅从字面上来说，<strong>这是其实是一个非常自然的，人类解决问题的过程</strong>。</p><p>我不想用书本上或者别人博客里的概念进行重复介绍，我更喜欢用我在做咨询的时候总是会用一个屡试不爽的小测试来让大家体会。</p><p>首先，我会问：</p><blockquote><p>我：“我饿了。”</p></blockquote><p>然后，我会让大家根据这个问题来接一句话去将对话接下去，这时候很多人会这样说：</p><blockquote><p>客户A：“你吃什么？”<br>客户B：“走，一起吃饭去？”<br>客户C：“你想什么时候吃？”<br>……</p></blockquote><p>以上就是绝大多数人所习惯的基于方案而非问题进行回答的方式。但一个更正确的，体现问题驱动的答法应该是：</p><blockquote><p>某善于问题驱动的客户：“你为什么饿了？”</p></blockquote><p>这时候，接下来我的回答有可能是：</p><blockquote><p>我：“我中午加班开会，时间比较紧，下午还要来给大家做工作坊，所以中午没吃饭，现在感觉有些低血糖。”</p></blockquote><p>最后，得到的答案往往就会跟之前有很大不同：</p><blockquote><p>客户A：“要不要我给你找点吃的你先垫一垫？”<br>客户B：“要不我们先暂停工作坊你去吃点东西？”<br>……</p></blockquote><p>在这个例子中，包含几个不同的部分：</p><ul><li>待解决问题：我饿了</li><li>问题澄清的结果：中午加班开会，时间比较紧，下午还要来给大家做工作坊，所以中午没吃饭，现在感觉有些低血糖</li><li>解决方案：先垫一垫 or 暂停工作坊去吃东西</li><li>实现细节：先吃块儿巧克力 or 去外面吃快餐</li></ul><p>让我给予一个简单而非严谨的总结：</p><p><strong>问题需要被澄清，问题澄清的结果决定解决方案，问题往往会有多种解决方案，每种解决方案的落地过程是实现细节。</strong></p><p>那么，所谓的“问题域”无非就是“待解决问题的集合”，“方案域”便是“解决方案的集合”，“实现域”便是“实现细节的集合”。而**“领域驱动”<strong>，其实就是</strong>“问题驱动”**——<strong>从澄清关键业务问题开始，逐渐寻找适合的解决方案，再到确定实现细节的过程。</strong></p><h4 id="战略设计-战术设计"><a href="#战略设计-战术设计" class="headerlink" title="战略设计 &#x2F; 战术设计"></a>战略设计 &#x2F; 战术设计</h4><p>说到“战略设计”和“战术设计”，这两个词的来源也非常有意思，让我们来说说。</p><p>（以下仅以国内翻译过的书籍来介绍）</p><h5 id="Eric-Evans最初的解释"><a href="#Eric-Evans最初的解释" class="headerlink" title="Eric Evans最初的解释"></a>Eric Evans最初的解释</h5><p>“战略设计（strategic design）”一词最早来自于2004年Eric Evans最初的《领域驱动设计：软件核心复杂性应对之道》一书的最后一个部分（第四部分：战略设计）。</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-13-book-ddd.jpg" alt="《领域驱动设计：软件核心复杂性应对之道》"></p><p>他的原意是：</p><blockquote><p>战略设计：一种针对系统整体的建模和设计决策。这样的决策影响整个项目，而且必须由团队来制定。</p></blockquote><p>在Eric Evans的书中，战略设计会优先关注限界上下文以及限界上下文之间的协作关系，然后通过精炼的方式得到核心域和通用域等“模式”。而在整个书中，其实有关于统一语言和建模的细节都是在全书的前三个部分讨论的，</p><p>也就是说，在最初的这本书中，并没有“战术设计”一词，而Eric Evans是先说的“战术”后说的“战略”。因为他认为：</p><blockquote><p>随着系统的增长，它会变得越来越复杂，当我们无法通过分析对象来理解系统的时候，就需要掌握一些操纵和理解大模型的技术了。本书的这一部分将介绍一些原则。遵循这些原则，就可以对非常复杂的领域进行建模。大部分这样的决策都需要由团队来制定，甚至需要多个团队共同协商制定。这些决策往往是把设计和策略综合到一起的结果。</p></blockquote><p>换句话说，其实他先是介绍的“简单”的系统的领域驱动设计和建模方法，而在最后才介绍的是“复杂”的系统的领域驱动设计和分析方法。</p><h5 id="Vaughn-Vernon的发展"><a href="#Vaughn-Vernon的发展" class="headerlink" title="Vaughn Vernon的发展"></a>Vaughn Vernon的发展</h5><p>2013年，Vaughn Vernon在实施了很长时间以“实现领域驱动设计”为核心内容的工作坊之后，出版了《实现领域驱动设计》一书，在这本书中，他按照从宏观到微观，从问题到方案再到实现的方式进行了叙述，发展并完善了DDD的理论和概念，当然也引入了“问题空间”和“解决方案空间”这两个词。</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-13-book-iddd.jpg" alt="《实现领域驱动设计》"></p><p>他认为，在DDD的“战略设计中”，还需要考虑“问题空间”和“解决方案空间”这样的维度，其中子域（他在“核心域”和“通用域”之间加入“支撑域”来避免两个极端）属于“战略设计”对于“问题空间”的分析方式，而限界上下文则是属于“战略设计”对于“解决方案空间”的分析方式。</p><p>至于“战术设计”一词，hum……当时还没出现呢……</p><p>那么“战术设计”这个词，到底是什么时候才出现的呢？</p><h5 id="Scott-Millett与Nick-Tune被“忽略”的澄清"><a href="#Scott-Millett与Nick-Tune被“忽略”的澄清" class="headerlink" title="Scott Millett与Nick Tune被“忽略”的澄清"></a>Scott Millett与Nick Tune被“忽略”的澄清</h5><p>说实话，“战术设计”这个大家看到现在基本都已经感受到是什么了的东西，到底什么时候由谁提出的，已经难以追溯，但是，至少有一本书出现了……</p><p>在2015年，Scott Millett和Nick Tune出版了《领域驱动设计模式、原理与实践》一书，这本书更加全面和细致的介绍了在实现DDD的过程中的思考和方法。</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-13-book-3pddd.jpg" alt="《领域驱动设计模式、原理与实践》"></p><p>然而很可惜的是，这一本书的中文版已经“绝版了”，说明至少在中国，大家的注意力都被《实现领域驱动设计》带跑了，逢人便提IDDD（书名的缩写），却很少有人提到前述的这一本（当然，我强烈建议对照看英文版，中文版翻译的实在是……）。</p><p>在这本书中，作者将全书分为了四个部分:</p><ol><li>领域驱动设计的原则与实践</li><li>战略模式：在限界上下文之间通信</li><li>战术模式：创建有效的领域模型</li><li>有效应用程序的设计模式</li></ol><p>至此，在DDD的系列书籍中，终于出现了“战术设计&#x2F;模式”一词，Scott Millett和Nick Tune把领域模型的设计全部清晰的纳入到了“战术设计”之中。</p><h3 id="为什么大多数人会难以理解？"><a href="#为什么大多数人会难以理解？" class="headerlink" title="为什么大多数人会难以理解？"></a>为什么大多数人会难以理解？</h3><p>好吧，大家能看到这里已经很不容易了，让我来为大家做总结并回答一下为什么大多数人会难以理解前述的两个维度的概念呢？</p><p>我是这么看的，之所以难以理解，问题来自于两个方面，让我们分别来说。</p><h4 id="DDD“依然年轻”"><a href="#DDD“依然年轻”" class="headerlink" title="DDD“依然年轻”"></a>DDD“依然年轻”</h4><p>DDD虽然从2004年开始，截止到刚刚过去的2019年，已经有15年的发展，但是15年来，虽然软件架构和设计的新思想层出不穷，复杂度也越来越高。</p><p>直到2014年，以Martin Fowler为代表，在博客上彻底点燃微服务设计这个“燎原之火”之后，微服务所带来的软件系统的复杂度成倍提升才使得人们又重新关注，并开始根据新的形势认真思考DDD如何落地（到如今，几乎逢领微服务设计的书，必谈DDD）。</p><p>从前面的介绍和几本书的内容发展我们可以看到，DDD思想发展的时间跨越很大，语言和理解的统一也并不顺畅，很多概念的清晰化都是最近几年才密集出现。</p><p>尤其在中国，发展更为滞后。这个圈子里，有机会深入思考和深耕DDD规模化落地的人也不多。</p><h4 id="概念理解有难度"><a href="#概念理解有难度" class="headerlink" title="概念理解有难度"></a>概念理解有难度</h4><p>让我们回顾这些概念和抽取其中的关键词语，我们会看到这两波东西是完全不同维度的东西：</p><ul><li>解决问题的层次：战略、战术</li><li>解决问题的步骤：问题、方案、实现</li></ul><p>之所以难以理解，是因为这些概念在现有的书籍、文章和实际操作中，是交织在一起的（可以想象一个概念的“大泥球”），而绝大多数人并不擅长（或者说并不熟练）以下三种思维方式：</p><ul><li>问题驱动的思考</li><li>分层思维</li><li>多维思考</li></ul><p>所以我们需要甩开这些概念上的反复纠缠，以更加清晰的阶段划分和渐进式的方法来降低门槛，从而让大多数人能够更加容易的理解和入门。</p><h2 id="更合理的“DDD分段式设计”"><a href="#更合理的“DDD分段式设计”" class="headerlink" title="更合理的“DDD分段式设计”"></a>更合理的“DDD分段式设计”</h2><p>为了更好的对DDD的设计过程进行优化，我们必须要重新审视DDD希望解决的问题：</p><blockquote><p><strong>软件核心复杂性</strong></p></blockquote><p>所谓复杂（Complex），按照<a href="https://en.wikipedia.org/wiki/Cynefin_framework">Cynefin框架</a>的解释是这样的（这里使用了我的同事李彤欣的版本）：</p><blockquote><p><em>“复杂系统：代表可能有，也可能没有解决方案的系统，充满未知和不确定性。因果关系往往在事后才能感知，刚开始可能毫无头绪。应对方式是探索 - 感知 - 响应。在允许试错的前提下，先做小范围实验和尝试，等待某些规律和指导涌现出来后，再来认知和评估，然后响应。”</em></p></blockquote><p>而从我的观察和理解来说，这种复杂问题最直接的影响就是：<strong>其复杂程度已经超出了个人所能够理解、分析和解决的范围</strong>。我总结了三个针对“复杂性”的典型特征：</p><ul><li>业务流程长</li><li>业务场景多</li><li>业务概念多</li></ul><p>要想解决复杂的问题，首当其冲的不是如何进行分析，而是引入更多的人，利用更多的大脑来共同解决复杂问题。当从一个人变成多个人的时候，那么问题就来了：别人的大脑长在别人的脑袋里，我怎么知道他想的是什么？他所理解的和我理解的一样吗？</p><p>正因为多人共同做事情时，会出现沟通和理解上的障碍，所以，DDD给出了一个关键思想：<strong>统一语言（Ubiquitous Language）</strong>。</p><p><strong>而统一语言的方式，则是通过领域专家与技术专家通力合作，针对业务问题进行协作分析和设计，通过迭代式的探索、发现和碰撞得来的</strong>。</p><p>所以，以统一语言为核心，通过协作设计的方式，对业务问题进行分析和澄清，就应该是DDD设计过程的第一个阶段。在这个阶段中，我们围绕业务问题、场景和流程来进行探索，通过限界上下文寻找概念二义性的边界，划分问题子域，从而在宏观（战略）层面降解系统理解上的复杂度。</p><p>我将这第一个阶段称之为：<strong>DDD分段式协作设计的战略设计阶段</strong>。</p><p>在这个过程中，我们首先需要使用“事件风暴工作坊”的方式，对业务流程进行系统实现视角下的抽象分析。然后，根据分析的结果，对领域概念的二义性边界进行识别，最终划定问题子域。</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-13-ddd-3step-1.png" alt="DDD分段式协作设计：战略设计"></p><p>当这一宏观层的分析和设计结束后，我们就需要降低（细化）一个层面，对问题子域和限界上下文内部进行更细化的分析和抽象，通过领域建模的方式，将业务抽象为以“聚合（Aggregate）”进行封装和隔离的一系列领域模型进行承载。然后，基于系统实现的高阶视角出发，参考云原生的弹性边界需求等输入，初步识别出业务服务的划分，并且识别每个业务服务的对外接口能力。</p><p>我将这第二个阶段，称之为：<strong>DDD分段式协作设计的战术设计阶段</strong>。</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-13-ddd-3step-2.png" alt="DDD分段式协作设计：战术设计"></p><p>需要注意的是，在前两个阶段，我们都依然是通过从宏观到微观（从战略到战术）的方式，对业务问题进行了分层的分析和设计。所以在这两个阶段中，我们是忽略了一切技术实现细节，以防止技术实现细节干扰“领域驱动”的。</p><p>同时，由于“协作设计”需要投入一定的人天进行集中式的封闭设计，所以在成本上难以长时间进行投入，而技术实现的维度和方式又是种类繁多和及其详细的（例如API详细设计、UML设计、数据库设计、运维与部署方案……等等）。</p><p>所以，可以将前两个阶段的产出，交由根据“逆康威定律”划分的不同特性&#x2F;产品团队，由这些团队进行进一步的详细分析和设计，最终予以实现。</p><p>我将这第三个阶段，称之为：<strong>DDD分段式协作设计的技术实现阶段</strong>。</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-13-ddd-3step-3.png" alt="DDD分段式协作设计：技术实现"></p><p>至此，便有了更加平顺的DDD设计方法。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>根据实践中的思考，以“统一语言”为解决复杂问题的核心目标，以“协作设计”为关键手段，我将DDD的设计过程重新梳理和优化为了以下三个阶段：</p><ol><li><strong>战略设计阶段</strong>：对业务问题进行宏观分析和设计。</li><li><strong>战术设计阶段</strong>：根据战略设计分析结果进行细化和建模。</li><li><strong>技术实现阶段</strong>：根据实现需要进行细化分析和设计。</li></ol><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-13-ddd-3step-0.png" alt="DDD分段式协作设计总览"></p><p>在这个过程中，主要的改进方式，首先就是利用分层的手法，通过聚焦从宏观到微观再到具体的方式，降低对抽象的分类方法的关注，化解对两类概念维度的交叉。然后，再通过定义每个阶段要解决的问题，内聚相关的分析方法，使得每个阶段都能有一些在阶段内闭环性的产出。</p><p>这样的话，因为阶段目标清晰且产出内聚，所以可以根据实际需要选择协作设计的深入程度——我遇到过有些客户，因为种种原因，只希望能够先快速的知道我需要根据DDD的思想拆分多少个模块，那么就可以先只做战略设计阶段。如果其中某个模块希望进一步细化指导建模和接口设计，那么就可以继续局部进入到战术设计阶段。最后，再根据实际需要去分团队进行技术实现。</p><p>我们一定要记住：<strong>DDD是通过协作来达成统一语言从而应对复杂性的，组织背景下的软件开发是一种团队集体运动</strong>。</p><p>所以基于以上观点，我会比较刻意的不提倡以下几种DDD的设计过程：</p><ul><li>先分析子域 &#x2F; 先分析限界上下文：业务都未澄清，理解和语言都还没统一，怎么能拆明白？</li><li>名词动词法 &#x2F; 直接进行领域建模：大规模吵架和拍脑袋……</li></ul><p>对于以上的分段式设计方法，经过了一年多的实战检验，证明能够被在绝大多数场景下适配和快速复用。在这里给大家分享了我在这个过程中的思考，抛砖引玉，希望能够有更多DDD的推动者提出宝贵的建议，共同推动DDD在中国的成熟和发展。</p><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ul><li><a href="https://huhao.dev/posts/130bb570/">用TDD思想对DDD的协作设计过程进行基准化</a></li><li><a href="https://insights.thoughtworks.cn/subdomain-and-bounded-context/">当Subdomain遇见Bounded Context</a></li><li><a href="https://en.wikipedia.org/wiki/Cynefin_framework">Cynefin Framework</a></li></ul><hr><h2 id="欢迎关注我的个人公众号"><a href="#欢迎关注我的个人公众号" class="headerlink" title="欢迎关注我的个人公众号"></a>欢迎关注我的个人公众号</h2><p>微信搜索：<code>枪炮与代码</code>，或者搜索公众号ID：<code>guns_n_code</code></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-wechat.png" alt="枪炮与玫瑰"></p>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;2019年，在我&lt;a href=&quot;https://huhao.dev/posts/130bb570/&quot;&gt;对DDD进行基准化&lt;/a&gt;的过程中，遇到过非常多的挑战，其中一个便是：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DDD的设计过程，到底应该分为多少个阶段？每个阶段做什么事情？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这个困惑来自于书本上，以及其他咨询师在咨询过程中对于DDD设计和操作的差异：&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;有的人会从限界上下文开始做设计和分析；&lt;/li&gt;
&lt;li&gt;有的人会直接从领域建模的聚合、实体、值对象开始做设计和分析；&lt;/li&gt;
&lt;li&gt;当然，还有的人会使用“名词动词法”直接从用例描述开始做设计和分析。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于实际的学习者和使用者来说，这种混乱的操作手法所形成的不一致和不流畅体验，对于坚持进行DDD设计和减少吵架来说，简直是一种毁灭性的影响。&lt;/p&gt;
&lt;p&gt;在这个过程中，最让我感触深刻的，是在于大家在落地DDD的时候，使用了大量具有“二义性”的词汇，讽刺的是，这与DDD所强调的统一语言是背道而驰的。&lt;/p&gt;
&lt;p&gt;其中对于上述混乱影响最大的因素之一，就是大家对于DDD的“战略设计”和“战术设计”认知不一致（甚至说是混沌）的问题。&lt;/p&gt;
&lt;p&gt;所以，这篇文章，就是围绕这两个概念，来说一说我是如何在基准化的过程中解决这个问题，统一并形成较为流畅的分段式的设计过程的。&lt;/p&gt;</summary>
    
    
    
    <category term="领域驱动实战思考" scheme="https://huhao.dev/categories/%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E5%AE%9E%E6%88%98%E6%80%9D%E8%80%83/"/>
    
    
    <category term="领域驱动设计" scheme="https://huhao.dev/tags/%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1/"/>
    
  </entry>
  
  <entry>
    <title>领域驱动实战思考（一）：用TDD思想对DDD的协作设计过程进行基准化</title>
    <link href="https://huhao.dev/posts/130bb570/"/>
    <id>https://huhao.dev/posts/130bb570/</id>
    <published>2019-12-21T08:30:28.000Z</published>
    <updated>2019-12-21T08:30:28.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>在这一年聚焦DDD设计，尤其是DDD的协作设计工作坊的咨询工作中，我发现客户同很多咨询顾问之间总是存在以下冲突：</p><ul><li><strong>体验的“一致性”冲突</strong><ul><li>客户：希望不同的顾问在售卖方法论的时候解释能一致；</li><li>顾问：认为每个人对方法论的认识和理解本身就不同，很难做到一致。</li></ul></li><li><strong>服务的“标准化”冲突</strong><ul><li>客户：希望顾问能够将所售卖的方法论进行标准化；</li><li>顾问：认为顾问所售卖的方法论本身非常灵活，需要 By Experience 依据不同的情况进行适配，标准化是做不到，并且也是不应该做的。</li></ul></li></ul><p>结合我曾经在ThoughtWorks近4年的人员培养和教学经验，和这几年来的咨询经验，我能够理解客户这样要求，是因为希望能够实现方法论的规模化落地。而<strong>在方法论规模化落地的过程中，一个很重要的问题，就是绝大多数能力一般的人，都更习惯于依据“明确的指令”进行工作，而不是依赖自己“有限的经验”和“莫能两可的方法论”</strong>。</p><p>这篇文章就是记录我是如何来解决这个问题的。</p><span id="more"></span><h2 id="我的基准化思维框架"><a href="#我的基准化思维框架" class="headerlink" title="我的基准化思维框架"></a>我的基准化思维框架</h2><p>对DDD这样的方法论进行“按部就班”式的基准化梳理，从而形成“基准化的操作”，以提供“明确的指令”，说起来简单，做起来却没有想象中容易。绝大多数的顾问虽然能够对方法论进行阶段性拆分，但是却没有能够将方法论进行细粒度的拆分和验证。</p><p>从我的观察来看，之所以造成这个问题，主要原因来自几个方面：</p><ul><li>**对方法论的深入研究不够：**在售卖方法论的时候，现学现卖。</li><li>**缺乏反复的思考和打磨：**缺乏机会进行反复验证和优化，或者注意力不够聚焦。</li></ul><p>还有一个很重要的原因，就是<strong>绝大多数技术顾问可能脱离写代码这件事情太久了，没有意识到对方法论基准化非常像我们开发软件的过程</strong>：</p><ul><li>首先，都是需要从客户需要出发，明确交付目标的价值和内容。</li><li>然后，以Tasking思想和阶段性验收条件为着眼点，将目标拆解为不同的阶段。</li><li>接下来，对每个阶段进行细化的实现，保证每个阶段的验收条件在实现过程中可以通过最简单的方式达成。</li><li>最后，产出第一版最小基准化内容，通过不断的适配和打磨，进行迭代式的改进，或者较大幅度的修改（类似需求变更）。</li></ul><p>更重要的是，以上这个过程，是可以用“测试驱动开发（Test Driven Development）”的思想来做的！</p><h2 id="利用TDD的方式进行DDD设计过程的基准化"><a href="#利用TDD的方式进行DDD设计过程的基准化" class="headerlink" title="利用TDD的方式进行DDD设计过程的基准化"></a>利用TDD的方式进行DDD设计过程的基准化</h2><p>那么，我是怎样用TDD的思想，对DDD的设计过程进行基准化的呢？在这一年，通过大大小小十数个咨询项目，我是这样做的：</p><ul><li>第一步，我通过在不同客户项目的实践中打磨和定义了每个阶段清晰的输出件，产出了《DDD工作坊准入条件和产出物图例》。<strong>这一步就相当于通过Tasking确定程序的输入和输出，以及定义测试驱动开发中的测试用例。</strong></li><li>第二步，在确定了输入输出后，我继续通过不同项目的不断打磨，基准化了每一个阶段的操作步骤，并把每一步细化到概念介绍、操作步骤、过程图例、要点提示四个部分，产出了《DDD工作坊操作手册》。<strong>这一步就相当于通过测试驱动的方式，进行了程序“处理”过程的实现，并且还通过小步迭代的方式，对操作过程进行了一遍又一遍的迭代。</strong></li><li>第三步，在整个操作手册完成之后，基于操作手册，重新梳理抽象出了适配这个操作手册的最简单和通常的概念，并从整个宏观上优化和定义了新的DDD分段式设计（战略设计阶段、战术设计阶段、技术实现阶段），解决了之前所有我所参与过的DDD培训所看到的知识体系凌乱，不统一，不顺畅等问题，让概念讲解部分最小化，产出了《DDD工作坊概念讲解》课件。<strong>这一步就相当于程序设计和开发过程中，通过高度抽象，进行分层架构并实现架构演进的过程。</strong></li><li>第四步，通过项目开发实践和进一步总结，结合多种以领域为核心的分层架构思想，不断打磨形成了适配整个基准化DDD的基准化代码样例（<a href="https://github.com/howiehu/ddd-architecture-samples%EF%BC%89%E3%80%82%E5%AE%9E%E7%8E%B0%E4%BA%86%E4%BB%A3%E7%A0%81%E5%8C%96%E8%90%BD%E5%9C%B0%E3%80%82">https://github.com/howiehu/ddd-architecture-samples）。实现了代码化落地。</a></li><li>第五步，继续通过不断的实践、打磨和总结，产出《DDD成熟度评估标准》。</li></ul><p>这样，就通过实战验证的方式，从确定交付物开始，一步一步的增量式的完成了DDD设计过程的基准化，<strong>这也很像我们做软件设计时通过TDD而达到的“简单设计（增量式设计）”思想。</strong></p><h2 id="结果"><a href="#结果" class="headerlink" title="结果"></a>结果</h2><p><strong>DDD的思想和设计过程，是公开并且没有什么保留意义的，所以，我在这里也选择分享给大家，以便为DDD在中国的落地和完善贡献一份力量。</strong></p><p><strong>同时，我也正在建立一系列的DDD基准化公开材料、社区和培训，我未来会将这些内容逐步发布到Github的“领域驱动”组织之中，地址如下：</strong></p><ul><li><strong><a href="https://github.com/domain-driven">https://github.com/domain-driven</a></strong></li></ul><p>而文章中所说的基准化的领域驱动设计产出物如下，未来我会继续进行不断的打磨和优化：</p><ul><li><a href="https://pan.baidu.com/s/10eVNdJ0kN5dPZX1On7V5bg">《DDD工作坊准入条件和产出物图例》</a>（提取码: 9jza）</li><li><a href="https://pan.baidu.com/s/16zP-QFuljJqQeE4PWovG4g">《DDD工作坊操作手册》</a>（提取码: uu1d）</li><li><a href="https://pan.baidu.com/s/1PnXfqr1RsGG-z9QXTGY4Uw">《DDD工作坊概念讲解》</a>（提取码: b4ft）</li><li><a href="https://github.com/howiehu/ddd-architecture-samples">《DDD基准化代码结构样例》</a></li><li>《DDD成熟度评估标准》(还在完善中，请期待)</li></ul><p>对于这些基准化的产出，我已经通过带领7个新咨询师进行了可复用性的验证，这些新咨询师只需要通过我讲解或示范一遍，就能够独立承担后续的DDD设计咨询工作，并且还能够实现概念和手法的一致性。</p><p>至于“By Experience”，则只剩操作者个人经验的高低，和智商的天花板了。</p><hr><h2 id="欢迎关注我的微信公众号"><a href="#欢迎关注我的微信公众号" class="headerlink" title="欢迎关注我的微信公众号"></a>欢迎关注我的微信公众号</h2><p>微信搜索：<code>枪炮与代码</code>，或者搜索公众号ID：<code>guns_n_code</code></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-wechat.png" alt="枪炮与玫瑰"></p>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;在这一年聚焦DDD设计，尤其是DDD的协作设计工作坊的咨询工作中，我发现客户同很多咨询顾问之间总是存在以下冲突：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;体验的“一致性”冲突&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;客户：希望不同的顾问在售卖方法论的时候解释能一致；&lt;/li&gt;
&lt;li&gt;顾问：认为每个人对方法论的认识和理解本身就不同，很难做到一致。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务的“标准化”冲突&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;客户：希望顾问能够将所售卖的方法论进行标准化；&lt;/li&gt;
&lt;li&gt;顾问：认为顾问所售卖的方法论本身非常灵活，需要 By Experience 依据不同的情况进行适配，标准化是做不到，并且也是不应该做的。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;结合我曾经在ThoughtWorks近4年的人员培养和教学经验，和这几年来的咨询经验，我能够理解客户这样要求，是因为希望能够实现方法论的规模化落地。而&lt;strong&gt;在方法论规模化落地的过程中，一个很重要的问题，就是绝大多数能力一般的人，都更习惯于依据“明确的指令”进行工作，而不是依赖自己“有限的经验”和“莫能两可的方法论”&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这篇文章就是记录我是如何来解决这个问题的。&lt;/p&gt;</summary>
    
    
    
    <category term="领域驱动实战思考" scheme="https://huhao.dev/categories/%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E5%AE%9E%E6%88%98%E6%80%9D%E8%80%83/"/>
    
    
    <category term="领域驱动设计" scheme="https://huhao.dev/tags/%E9%A2%86%E5%9F%9F%E9%A9%B1%E5%8A%A8%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="测试驱动开发" scheme="https://huhao.dev/tags/%E6%B5%8B%E8%AF%95%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91/"/>
    
    <category term="基准化" scheme="https://huhao.dev/tags/%E5%9F%BA%E5%87%86%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>契约测试拨乱反正：最简介绍</title>
    <link href="https://huhao.dev/posts/28ca5398/"/>
    <id>https://huhao.dev/posts/28ca5398/</id>
    <published>2019-08-18T15:50:11.000Z</published>
    <updated>2019-08-18T15:50:11.000Z</updated>
    
    <content type="html"><![CDATA[<p>一段时间以来研究和实践契约测试，发现如过去大家对于单元测试、集成测试、端到端测试等等测试理解不一致一样，绝大多数情况下都把契约测试理解或应用错了。</p><p>为了统一认知，写了个简介，以求被拍砖和拍人。</p><span id="more"></span><h2 id="目的（解决的问题）"><a href="#目的（解决的问题）" class="headerlink" title="目的（解决的问题）"></a>目的（解决的问题）</h2><p>契约测试是一种以自动化测试作为技术手段，解决团队间因存在明显沟通边界，由沟通不畅和代码变更而造成的系统间接口不匹配问题的最佳实践。</p><h2 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h2><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-115501.png" alt="https:&#x2F;&#x2F;martinfowler.com&#x2F;articles&#x2F;practical-test-pyramid.html"></p><p>通过测试驱动生成服务间的契约文档，利用该契约文档和Mock Server（银行业常称之为“挡板”）分别对契约的消费者和提供者进行自动化测试，以确保双方能够按照契约实现满足规格要求的接口，并利用持续集成流水线实现对双方变更影响的快速反馈。</p><h2 id="原则"><a href="#原则" class="headerlink" title="原则"></a>原则</h2><ul><li>快速反馈<ul><li>契约测试应当聚焦对于接口规则的验证，能够易于编写，快速运行，最简验证。所以通常采用测试替身（Test Double）来代替集成组件加快运行速度（速度与单元测试相当）。</li></ul></li><li>测试运行时使消费者与提供者解耦（分别运行测试）<ul><li>对于接口的功能验证，应当由接口集成测试来保证。</li><li>对于系统间的协作验证，应当由系统间集成测试，或端到端测试来保证。</li></ul></li><li>消费者驱动设计优于提供者驱动设计<ul><li>符合需求拉动和简单设计思想，减少冗余设计。</li></ul></li></ul><h2 id="适用场景-条件"><a href="#适用场景-条件" class="headerlink" title="适用场景 &#x2F; 条件"></a>适用场景 &#x2F; 条件</h2><ol><li><strong>契约测试属于进阶自动化测试实践，团队需具备基本的自动化测试和持续集成实践能力，并了解微服务基本知识和概念。</strong></li><li>系统间采用松耦合的通讯和开发方式，例如HTTP+JSON。而非紧耦合的通讯和开发方式，例如共享接口文件的RPC类框架。</li><li>A团队与B团队间存在明显的沟通边界，但二者均可控（可采用统一实践并坚持）。</li><li>提供者提供的接口被多个消费者消费，需要快速反馈代码变更所造成的影响。</li></ol><h2 id="前置知识与能力"><a href="#前置知识与能力" class="headerlink" title="前置知识与能力"></a>前置知识与能力</h2><ul><li>自动化测试基础<ul><li>单元测试</li><li>集成测试</li><li>端到端测试</li></ul></li><li>测试替身</li><li>简单设计（增量式设计）&#x2F; 测试驱动开发</li><li>API测试方法</li><li>版本控制</li><li>持续集成 &#x2F; 持续交付</li><li>微服务</li></ul><h2 id="可用工具"><a href="#可用工具" class="headerlink" title="可用工具"></a>可用工具</h2><ul><li><a href="https://docs.pact.io/">Pact</a>（推荐）<ul><li>消费者驱动</li><li>Pact Specification 契约规范 + 多技术栈实现</li><li>基于JSON的契约文件</li><li>支持HTTP+JSON的接口实现 &#x2F; 消息队列</li></ul></li><li><a href="https://spring.io/projects/spring-cloud-contract">Spring Cloud Contract</a><ul><li>提供者驱动 &#x2F; 消费者驱动</li><li>JVM + Spring 技术栈，可与Pact Broker集成</li><li>基于JAR的契约文件</li><li>支持HTTP+JSON的接口实现 &#x2F; 消息队列</li></ul></li></ul><hr><h2 id="欢迎关注我的微信公众号"><a href="#欢迎关注我的微信公众号" class="headerlink" title="欢迎关注我的微信公众号"></a>欢迎关注我的微信公众号</h2><p>微信搜索：<code>枪炮与代码</code>，或者搜索公众号ID：<code>guns_n_code</code></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-wechat.png" alt="枪炮与玫瑰"></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;一段时间以来研究和实践契约测试，发现如过去大家对于单元测试、集成测试、端到端测试等等测试理解不一致一样，绝大多数情况下都把契约测试理解或应用错了。&lt;/p&gt;
&lt;p&gt;为了统一认知，写了个简介，以求被拍砖和拍人。&lt;/p&gt;</summary>
    
    
    
    <category term="自动化测试之道" scheme="https://huhao.dev/categories/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E4%B9%8B%E9%81%93/"/>
    
    
    <category term="自动化测试" scheme="https://huhao.dev/tags/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/"/>
    
    <category term="契约测试" scheme="https://huhao.dev/tags/%E5%A5%91%E7%BA%A6%E6%B5%8B%E8%AF%95/"/>
    
  </entry>
  
  <entry>
    <title>DevOps转型手记（二）：关注价值流</title>
    <link href="https://huhao.dev/posts/bbbc99b/"/>
    <id>https://huhao.dev/posts/bbbc99b/</id>
    <published>2018-11-12T17:11:22.000Z</published>
    <updated>2018-11-12T17:11:22.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>A：“能麻烦您给我讲一讲你们的工作流程吗？”</p><p>B：“哦，这个呀，就是需求分析、设计、开发、测试、上线呗！”</p><p>A：“Hum…”</p><p>B：（心里不爽：明知故问嘛！）</p><p>B：“你不是来给我们解决技术问题的嘛？你了解这些东西对我们有什么用？”</p><p>A：“哦，但凡能用技术解决的问题都不是什么问题……不知道您听说过这句话吗？”</p><p>（陷入尴尬）</p></blockquote><p>这是个我曾经在做各种调研时，为了了解对方的端到端工作流程而习惯问的问题，当然收到的回答也是如上面一样相当的一致。</p><p>后来，我逐渐发现这种问问题的方法是基本上难以收获我想要的满意答案的，<strong>尤其是在同一个团队中不同的人使用的词汇和对流程理解不一致的情况下，但是从实际来说，这种认知不一致恰恰就是最普遍甚至可以说是几乎100%存在的情况。</strong></p><span id="more"></span><p>而在DevOps转型的开始和过程中，从全局视角出发，持续跟踪和关注端到端流程（有时候两端可能还会延伸到当前团队的范围之外）中的瓶颈是DevOps非常重要的一个基本要求和能力，正所谓：</p><blockquote><ul><li>全局优化高于局部优化。</li><li>将局部经验转化为全局改进。</li></ul></blockquote><p>（这两句是我拼在一起的，他们有非常强烈的联系并持续相互作用，是一个持续改进的过程。）</p><p>在遇到DevOps之前，我遇到了“精益思想”，从中学会了“价值流”这样一个重要的视角和工具，所以从那时起就开始习惯从价值流的角度出发去思考和分析，逐渐觉得自己的视角开始不一样了，会不自觉的从全局优化的角度思考问题和寻找瓶颈。</p><p>庆幸的是，“精益思想”恰恰就是DevOps的重要思想基础之一，让我们回顾一下DevOps的“三步工作法”：</p><blockquote><p>第一步：实现开发到运维工作快速地从左向右流动；</p><p>第二步：在从右向左的每个阶段中，应用持续、快速的工作反馈机制；</p><p>第三步：建立具有创意和高度信任的企业文化，支持动态的、严格的科学实验；</p></blockquote><p>其中第一步的“……从左向右……”，和第二步的“……从右向左……”就是相对于价值流流动的方向来说的，所以“价值流”也是DevOps重要的思考工具和可视化工具。</p><p>如果能够利用好价值流这个工具，则能够使我们快速的统一团队语言和认知，并发现潜在的瓶颈点。</p><p>接下来，我便从精益思想的基础概念、精益思想在软件行业中的特点以及我在日常工作中的实践三个部分，来说一说“价值流”在DevOps转型工作中的重要作用。</p><h2 id="什么是精益思想？"><a href="#什么是精益思想？" class="headerlink" title="什么是精益思想？"></a>什么是精益思想？</h2><p>精益思想来源于以“丰田生产方式”为代表的传统制造行业，在过去的几十年中已经被大量引入并被各行各业所实践。</p><p>“精益（Lean）”所针对并致力于消除的反义词是“浪费（Muda）”，至于为啥浪费的英文是是Muda？正是因为来源于“丰田生产方式”，用的是日语的音译。</p><p>什么是“浪费”？在《精益思想》一书中给出了如下定义：</p><blockquote><p>浪费（Muda），专指消耗了资源而不创造价值的一切人类活动。</p></blockquote><p>比如<a href="%E6%9D%A5%E8%87%AA%E4%BA%8E%E3%80%8A%E7%B2%BE%E7%9B%8A%E6%80%9D%E6%83%B3%E3%80%8B%E4%B8%AD%E6%96%87%E7%89%88">^1</a>：</p><blockquote><ul><li>需要纠正的错误。</li><li>生产了无需求的产品。</li><li>因生产了无需求的产品而造成的库存和积压。</li><li>不必要的工作。</li><li>员工的盲目走动。</li><li>货物从一地到另一地的盲目搬运。</li><li>由于上道工序发送传递不及时，使下一道工序的人只能等待。</li><li>商品和服务不能满足客户的要求。</li></ul></blockquote><p>那什么又是“价值（Value）”呢？简单来说就是：</p><blockquote><p>那些对最终客户有积极意义和有用处的东西。</p></blockquote><p>而精益思想的核心目标则是：</p><blockquote><p>通过及时的反馈消除或将浪费转化为价值。</p></blockquote><p>为了实现这个目标，精益思想总结归纳了5个基本的步骤或者说是原则<a href="%E6%9D%A5%E8%87%AA%E4%BA%8E%E3%80%8A%E7%B2%BE%E7%9B%8A%E6%80%9D%E6%83%B3%E3%80%8B%E4%B8%AD%E6%96%87%E7%89%88">^1</a>：</p><blockquote><ol><li>定义<strong>价值</strong>；</li><li>识别<strong>价值流</strong>，并消灭明显的浪费步骤；</li><li>并使保留下来的、创造价值的各个步骤<strong>重新流动</strong>起来；</li><li>按客户需要<strong>拉动</strong>价值；</li><li><strong>尽善尽美</strong>。</li></ol></blockquote><p>以上用粗体标注的文字都是非常重要基础概念，但由于篇幅有限并且本文重点不是给大家讲精益思想，而是希望把注意力放在价值流图对于开展DevOps转型工作的作用上，所以不再进一步解释，大家可以通过阅读《精益思想》这本书去进行系统性的了解。</p><p>说了那么一大堆，现在终于该说什么是价值流了……咳咳……</p><blockquote><p>价值流是指从原材料转变为成品、并给它赋予价值的全部活动。</p></blockquote><p>通常，我们用“价值流图”来对价值流进行可视化。</p><h3 id="价值流图（Value-Stream-Map，简称VSM）"><a href="#价值流图（Value-Stream-Map，简称VSM）" class="headerlink" title="价值流图（Value Stream Map，简称VSM）"></a>价值流图（Value Stream Map，简称VSM）</h3><p>以可口可乐公司生产罐装的可口可乐为例，对于一提盒罐装可乐来说，粗略的价值流图大概长这样<a href="%E6%9D%A5%E8%87%AA%E4%BA%8E%E3%80%8A%E7%B2%BE%E7%9B%8A%E6%80%9D%E6%83%B3%E3%80%8B%E4%B8%AD%E6%96%87%E7%89%88">^1</a>：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-114858.png" alt="生产一提盒罐装可乐的价值流"></p><p>（虚线部分展示的是罐体回收并重新创造价值的过程。）</p><p>为什么说是“粗略”呢？是因为其中的每一个步骤都如同电子地图可以缩放，都有其内部的价值流动过程，所以“缩放”的思维在对待价值流这件事儿上非常重要，你必须知道在不同的场合下，需要关注的工作的粒度是怎样一个大小。</p><p>另外一个方面需要注意的是，价值流的每一个步骤都是有输入物和产出物的，换句话说：如果没有原料，你不可能凭空生产出任何东西。（其实就是管道思维）</p><p>那什么时候这些可乐才会真正的交付价值呢？其实就是在最后时刻——被最终客户（消费者）买回家喝进肚子里的时候。在那之前，这些可乐都处于“创造价值（增值）”或“产生浪费”的阶段。换句话说：</p><blockquote><p>未被喝掉的可乐是没有价值的。</p></blockquote><h2 id="软件开发过程中的价值流"><a href="#软件开发过程中的价值流" class="headerlink" title="软件开发过程中的价值流"></a>软件开发过程中的价值流</h2><p>精益思想诞生于传统的生产制造行业，价值流图在展现传统生产制造行业的价值流动时是非常醒目和易于识别浪费的（精益思想在软件行业的落地最有名的就是“看板方法”，篇幅所限，就不在此介绍了，感兴趣的可以阅读《看板方法》一书）。</p><p>但是，在我们所处的IT行业，尤其是软件开发工作，与传统生产制造行业有相当大的区别，在我看来主要有以下不同：</p><blockquote><ul><li>软件开发没有“原料”，流入软件开发价值流的是“需求”。</li><li>软件开发是创造性的脑力工作，通过创新来产生价值，所以软件开发及其易变，而制造业则具有低变异性。</li><li>软件天然是“软”的，相比“硬”的制造业来说，软件更易于以低成本进行变化。</li><li>软件交付的价值是：满足最终客户需要，并且可以工作的软件。</li></ul></blockquote><p>软件交付的价值流，一般是从获得需求开始，到成功上线结束。如果要用价值流来表达一个较为常见的粗粒度的软件开发过程，大概是这样：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-114923.png" alt="粗粒度的软件开发价值流"></p><p>我想你应该会说：“这不就是瀑布式的流程吗？这有什么好画的？”</p><p>别急嘛！我就是简单表示一下，还记得我之前所说的“缩放”吧？来让我们展示个细粒度的价值流图——以我所就职的ThoughtWorks的交付实践为例，一个迭代中的价值流是这样的（只展现了Happy Path的情况，因为任何测试检查环节只要不通过，就会回退到开始开发的阶段）：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-114942.png" alt="ThoughtWorks的软件交付实践价值流"></p><p>哇咔咔！怎么样？是不是很多步骤？这还不是最细呢！</p><p>你可能会问：“步骤这么多？不累吗？交付速度能快吗？”</p><p>放心，不累，也很快，因为这一切都建立在自动化的基础之上。</p><p>而这些自动化的基础设施又是怎么来的呢？</p><p><strong>正是由这张图上所看不见，但是其实处处都在的幕后工作者——Ops（运维工程师）所构建的。</strong></p><p>在DevOps的世界里，运维工程师从项目的一开始就进入，并与其他角色紧密协作：评估未来上线后的运维环境，制定相应的对策和计划，搭建能够让其他角色快速开展工作的基础设施，并在整个开发过程中从运维侧解决阻碍价值快速流动的瓶颈。</p><p>这就是与过去传统的开发与运维相分离的工作方式本质上的不同。</p><h2 id="价值流分析工作坊"><a href="#价值流分析工作坊" class="headerlink" title="价值流分析工作坊"></a>价值流分析工作坊</h2><blockquote><p>说了这么多，这东西在做DevOps转型的时候怎么用啊？</p></blockquote><p>我觉得主要体现在两个方面：</p><ol><li>在咨询师刚刚接触一个新团队的时候，利用价值流去快速了解团队现有的端到端交付现状，统一团队成员的认识；</li><li>应用看板方法，团队定期进行价值流分析，不断寻找新的瓶颈，从而“尽善尽美”，持续改进。</li></ol><p>后者在看板方法中有更多的描述，所以这里我主要讲一讲前者。</p><p>最近在帮助客户开展DevOps转型工作的时候，需要同时应对5个试点团队，如何能够在一开始快速了解5个试点团队的现状，并且尽可能减少因为沟通中目标角色单一所造成的信息收集不全面的挑战呢？</p><p>答案就是：开展价值流分析工作坊。（经实践，2个小时就够，2个小时以上嘛……你能约出对方这么多时间吗？什么？能？那就做的更细致一些喽！）</p><p>工作坊的流程如下（这是我个人设计和在实践中完善的，不代表其他同仁的做法）：</p><blockquote><ol><li>所有人做自我介绍。</li><li>简要介绍什么是价值流地图及其作用。</li><li>介绍产出物的要求（价值流图、前置时间、实际完成时间），统一预期。</li><li>每个角色使用便利贴按照时间顺序书写和排列自己的工作，相互不要进行交流，绘制时关注过程的输入和输出以及时间。</li><li>所有人按照时间线从第一个人的价值流图开始尝试通过讨论将全部工作串起来，并根据流动（关注输入和输出）进行分析。如果有缺失的就补上，如果有重复的就合并，如果有并行的就分开，如果有BAU工作而不会在流动中流经的就去掉。</li><li>归类并划分大的阶段，比如需求分析、开发、测试、部署、发布等等。</li><li>对每一个大的阶段进行时间估算，最终推出前置时间和实际完成时间，尝试大致分析核心瓶颈的位置。</li><li>讨论答疑，产出下一步的Action。</li></ol></blockquote><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-115006.jpg" alt="价值流分析工作坊"></p><p>在工作坊的过程中，作为组织者，应当针对大家所贴的内容多问如下问题以便澄清和统一大家的认知：</p><blockquote><ul><li>这是什么？能举个例子描述一下场景吗？</li><li>所依赖的输入是什么？</li><li>这一步的输出是什么？</li><li>多长时间会发生一次？</li><li>一次大概需要多长时间？</li><li>有什么遗漏的吗？</li><li>……</li></ul></blockquote><p>通过工作坊，经常能够发现一些普遍性的问题，比如：团队中各个角色对于当前的交付流程理解不一致，实际实践与所绘制的价值流中的表现不一致等等。</p><p>另外还会发现一些让人哭笑不得的做法，比如：</p><ul><li>因为畏惧合并代码出问题，所以虽然有使用版本控制，但是在测试的时候是使用开发人员修改后的本地代码进行打包，然后用FTP拷到测试环境进行手动测试，测试完成后才敢把本地的代码变更提交进代码库。（测试时所使用的代码和部署生产所使用的代码压根不是同一个代码）</li><li>使用了版本控制，但是测试环境和生产环境的代码不是从代码仓库拉取的，而是通过参照一份详细罗列了修改过的文件的Word文档，然后手工把这些修改过的文件通过FTP拷贝到不同环境的。（如果是这样的话，那我们使用版本控制的目的到底是什么呢？仅仅是不需要使用QQ传吗？）</li></ul><p>这里有两张照片，也很有意思：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-115028.jpg" alt="运维工程师在哪里？"></p><p>上图是梳理出来的价值流，下图是运维工程师们贴出来的自己的很多工作，这些工作压根就没有出现在价值流图上（正如之前在介绍价值流的时候所说的，运维工程师们是幕后英雄，他们的工作实际上贯穿了整个价值流流动过程，为价值流的流动构建了基础设施和条件）。</p><p>当时，当大家梳理完价值流之后，其中一位员工很肯定地说：“这样整个工作就做完了，剩下就是运维了，也就没啥事儿了！”</p><p>话毕，几个运维工程师站在旁边沉默不语……眼中似乎有晶莹的东西在闪烁……</p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>价值流是能够让我们进行全局观察和优化的重要工具，在进行DevOps转型的过程中必不可少，学会很容易，但是需要坚持、自觉和重复的使用。</p><p>同时，通过价值流分析工作坊，我发现当前对于绝大多数团队来说，制约DevOps落地的最关键问题无外乎：</p><ol><li>需求变更没有节奏，需求实例化差；</li><li>没有自动化测试；</li><li>人员能力弱，学习能力差。</li></ol><p>这是这个行业老大难的问题，同时让我感到可悲的是，国内很多知名大厂和IT服务公司依旧如此，还有那些号称十几年工作经验的人们，也依旧如此。</p><blockquote><p><strong>学习，真的有那么难吗？</strong></p></blockquote><hr><h2 id="欢迎关注我的微信公众号"><a href="#欢迎关注我的微信公众号" class="headerlink" title="欢迎关注我的微信公众号"></a>欢迎关注我的微信公众号</h2><p>微信搜索：<code>枪炮与代码</code>，或者搜索公众号ID：<code>guns_n_code</code></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-wechat.png" alt="枪炮与玫瑰"></p>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;A：“能麻烦您给我讲一讲你们的工作流程吗？”&lt;/p&gt;
&lt;p&gt;B：“哦，这个呀，就是需求分析、设计、开发、测试、上线呗！”&lt;/p&gt;
&lt;p&gt;A：“Hum…”&lt;/p&gt;
&lt;p&gt;B：（心里不爽：明知故问嘛！）&lt;/p&gt;
&lt;p&gt;B：“你不是来给我们解决技术问题的嘛？你了解这些东西对我们有什么用？”&lt;/p&gt;
&lt;p&gt;A：“哦，但凡能用技术解决的问题都不是什么问题……不知道您听说过这句话吗？”&lt;/p&gt;
&lt;p&gt;（陷入尴尬）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这是个我曾经在做各种调研时，为了了解对方的端到端工作流程而习惯问的问题，当然收到的回答也是如上面一样相当的一致。&lt;/p&gt;
&lt;p&gt;后来，我逐渐发现这种问问题的方法是基本上难以收获我想要的满意答案的，&lt;strong&gt;尤其是在同一个团队中不同的人使用的词汇和对流程理解不一致的情况下，但是从实际来说，这种认知不一致恰恰就是最普遍甚至可以说是几乎100%存在的情况。&lt;/strong&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="DevOps转型手记" scheme="https://huhao.dev/categories/DevOps%E8%BD%AC%E5%9E%8B%E6%89%8B%E8%AE%B0/"/>
    
    
    <category term="DevOps" scheme="https://huhao.dev/tags/DevOps/"/>
    
    <category term="价值流" scheme="https://huhao.dev/tags/%E4%BB%B7%E5%80%BC%E6%B5%81/"/>
    
  </entry>
  
  <entry>
    <title>DevOps转型手记（一）：你以为你以为的DevOps就是你以为的DevOps吗？</title>
    <link href="https://huhao.dev/posts/ec6461d/"/>
    <id>https://huhao.dev/posts/ec6461d/</id>
    <published>2018-10-23T13:13:07.000Z</published>
    <updated>2018-10-23T13:13:07.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>自接触并学习DevOps起，到交付DevOps相关的培训和咨询服务至今已差不多一年时间。</p><p>最近一段时间正在帮助我们的一个重要客户实现DevOps转型，在此过程中，每一天都会有新的发现和新的感悟。</p><p>客户方的负责人开玩笑给我说：“如果我们能成功，固然很好，但是如果不尽如人意，大不了写本书呗！”</p><p>我觉得好有道理！</p><p>于是，秉着“到此一游总要留下点什么”以及“写不了一本书也要写个册子”的精益思想，开始把感悟到的东西都记录下来写成文章，一方面供自己总结精进，一方面供他人参考借鉴。</p><p>这些文章不会有严格的顺序，纯粹想到了就写，容日后编撰成册吧。</p><span id="more"></span><h2 id="你以为你以为的DevOps就是你以为的DevOps吗？"><a href="#你以为你以为的DevOps就是你以为的DevOps吗？" class="headerlink" title="你以为你以为的DevOps就是你以为的DevOps吗？"></a>你以为你以为的DevOps就是你以为的DevOps吗？</h2><blockquote><p>“您对DevOps一定有误解……”</p></blockquote><p>我每次我在面对需要做转型的团队的时候，我都会先问在场的所有人一个问题：“大家所理解的DevOps到底是什么？”</p><p>得到的答案五花八门，常见的主要有以下几种：</p><ul><li>“没听说过。”</li><li>“听说过但是不了解。”</li><li>“DevOps就是要做敏捷。”</li><li>“DevOps是一种套路。”</li><li>“DevOps就是让开发人员（Dev）和运维人员（Ops）一起工作。”</li><li>“DevOps就是CI&#x2F;CD。”</li><li>“DevOps就是做一个平台，让我们能够在上面方便开发。”</li><li>“DevOps就是一大堆工具做自动化。”</li></ul><p>这些回答，与前些年“敏捷”一词风风火火的时候，对于大多数人“敏捷就是Scrum”的理解是何其相像！</p><p>其实，这也不能完全怪大家，尤其是DevOps在今天来说，依然处于一场“迷之盛宴”的阶段。</p><h2 id="DevOps的迷之盛宴"><a href="#DevOps的迷之盛宴" class="headerlink" title="DevOps的迷之盛宴"></a>DevOps的迷之盛宴</h2><p>这场“迷之盛宴”中有几类典型的“教派”在其中“群魔乱舞”：</p><ul><li>忽悠神教</li><li>套路神教</li><li>平台神教</li></ul><p>接下来，让我们挨个说起。</p><h3 id="忽悠神教"><a href="#忽悠神教" class="headerlink" title="忽悠神教"></a>忽悠神教</h3><blockquote><p>“你们这些方面与DevOps的要求相比，还有很大差距……（没了）”</p></blockquote><p>正如“敏捷”火爆时候的满大街各种连敏捷实践都没做过的所谓“认证敏捷教练”，还有“区块链”出来以后满大街套着“区块链”字眼招摇撞骗的创业项目。每一次某种概念突然火爆的时候，总是少不了这样一些人：</p><ul><li>他们以炒作概念为生，但绝不负责落地。</li><li>他们喜欢制定种种度量或认证标准敛财，然后到处去做评估赚钱。</li><li>他们夸夸其谈，但是怂于实践。</li></ul><p>这些人干的事情就是：到处“念歪经”、“传歪经”，钱到手了立刻拍拍屁股走人。</p><p>记得我所接触的第一个试点团队，团队看到我们的第一个反应是：“怎么又来了一波搞DevOps的”。在初期的几次接触中，明显能够感受到团队对于这一次工作抱有相当的抵触和不信任感。</p><p>当我拿到“某国际知名咨询公司（该公司压根没啥技术实践）”之前针对该团队的评估报告的时候，我的第一个反应就是：“WTF?”</p><p>该评估报告本质上就是一个基于打分表的问卷调查，寥寥几个维度加上不同的标准，做了做问卷调查和简单的访谈，就为团队打了个分，定了个性。然后到了该有改进方案部分，直接粘贴了几个不知道从哪里找来的广告般的可视化面板的截图，然后标注了一个醒目的单词“Sample”。然后就再也没有然后了……</p><p>团队告诉我们，大家根据这份评估结果，努力的在可视化和自动化方面做了很多尝试，但是“并没有感到有太大的变化”。</p><p>后来，随着和团队几次深入的交流、对实际代码和实践进行分析，我们发现该团队的开发环节完全掌控在一个以产品垄断为基础的强势供应商手上，产品的封闭程度也非常之高（纯Win32图形化操作，所有的中间数据和最终数据都被存为了专有格式的二进制文件，合同限制团队只能得到开发之后编译的二进制文件而不是代码）。如果不能把开发环节控制在自己手上的话，永远都难以优化Dev而只能优化Ops，这显然是不能实现从Dev到Ops顺畅的价值流动的。而团队在其他环节上已经根据自身的理解采取了多方面的努力和尝试，采购了专门针对图形化应用的测试工具编写了自动化验收测试，甚至还每人都购买和阅读了《凤凰项目》一书。</p><p>所以我们的最终评估认为，该团队已经做出了很多努力，受制于现实约束，进一步优化的空间十分有限。</p><p>以上就是一个我亲眼见到的“拍拍屁股就走”的例子，如果按照他们的方式再来一次“忽悠”型的咨询，还真不知道会对这个团队造成怎样的伤害。</p><h3 id="套路神教"><a href="#套路神教" class="headerlink" title="套路神教"></a>套路神教</h3><blockquote><p>“我听不懂，我就只想知道怎么验收？什么时候能做完？”</p></blockquote><p>我相信有很多人同我一样会经常遇到上面这样的提问，往往出自于某个具有领导角色的人口中。在他们的心中，DevOps是一种工具性的存在，只要按照说明书操作，就理应能够“实现”。</p><p>而从“DevOps三步工作法”来看，DevOps的最终目标之一，是对组织文化进行改造，建立一种相互信任、持续改进和不断创新的组织文化[^1]：</p><blockquote><p>第一步：实现开发到运维工作快速地从左向右流动；</p><p>第二步：在从右向左的每个阶段中，应用持续、快速的工作反馈机制；</p><p>第三步：建立具有创意和高度信任的企业文化，支持动态的、严格的科学实验；</p></blockquote><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-114446.png" alt="DevOps三步工作法"></p><p>（我习惯将以上三步简称为：优化价值流动；优化反馈机制；建立持续改进的文化）</p><p>而既然说到了组织，我们知道每一个组织他们所面对的自身实际、目标和挑战是不同的，所以这个世界上并不存在“DevOps灵丹妙药”，每个组织都需要严肃认真的对待和分析自身实际，走出满足自身需要的转型之路。</p><p>另一方面，持续改进告诉的是让我们变得“更好”，所以并不会出现“做完了”的情况。</p><p>但可惜的是，这个行业里有太多不顾核心问题而急于赚钱的人，他们最擅长的就是提供一套“标准化”的解决方案去迎合这种急功近利的心态，并建立一种“只要按照这种套路做下去，就能实现DevOps”的迷信。</p><p>心急吃不了热豆腐，天下也没有免费的午餐。相比“摸着石头过河”来说，好在我们还有很多行业标杆可以参考。</p><h3 id="平台神教"><a href="#平台神教" class="headerlink" title="平台神教"></a>平台神教</h3><blockquote><p>“没有什么DevOps的问题是用一套平台不能解决的！”</p></blockquote><p>之前参加了大大小小不同的DevOps社区活动，也去不同类型的企业做过DevOps方面的培训或交流，最让我印象深刻的是，几乎各大企业都在做自己的DevOps平台，并且各种服务商也在大力的推销自己的产品。</p><p>首先，DevOps平台本身并没有什么问题，通常将运维融入日常开发工作的方式有以下三种[^1]：</p><blockquote><ul><li>创建共享服务，提高开发生产力。</li><li>将运维工程师融入服务团队。</li><li>为每个服务团队分派运维联络人。</li></ul></blockquote><p>其中“创建共享服务”指的就是通过创造集中式平台或者工具链的方式，通过自动化的方式降低开发过程中开发人员对于基础设施的注意力损耗，建立更快速的反馈和响应力。</p><p>在这种指导思想下，开发工程师最好能够在运维工程师的帮助下实现这样一种理想中的工作状态：</p><ol><li>随便找到一台能够使用Web浏览器的设备，通过浏览器打开云端集成开发环境。</li><li>使用云端集成开发环境针对实例化需求编写测试代码并实现。</li><li>将编写完成的代码提交进本地版本控制的变更集，同时触发属分布式持续集成和自动化构建流水线。</li><li>当分布式流水线无误通过后，触发后续的自动化&#x2F;手动测试、部署等环节并交付上线。</li><li>在整个过程中，开发人员应当保持对业务实现的高度关注，而尽可能的不去关注基础设施可能产生的干扰。</li></ol><p>然而，这种看似理想的工作状态在引入人工智能后将会产生另一个“黑暗的”版本：</p><ol><li>在所使用的框架和平台不断进步的情况下，开发人员所编写的代码将越来越多的由胶水代码构成。</li><li>基于大量的人工智能学习和训练，需求分析人员开始使用基于业务场景的自动化测试用例生成工具生成测试用例。</li><li>人工智能学习和抽象更多的胶水代码案例，根据测试用例自动生成胶水代码。</li><li>最终只会写胶水代码的开发工程师被人工智能所取代，“码农”终于失业了。</li></ol><p>当然了，“黑暗”是针对“只会写胶水代码”的人而言的，如果是一个具有分析、设计能和驾驭整个端到端交付能力的“高级开发人员”来说，甭提有多爽快了。</p><p>话说回来，既然平台的前景这么广阔，哪里有问题呢？</p><p>问题恰好就出在了盲目夸大平台的作用，而忽略了“实现开发到运维工作快速地从左向右流动”这个地方。</p><p>根据我的观察，目前绝大多数的集中式品台都是由各大公司的运维部门主导开发完成的，我见过完成度非常高的平台，也见过完成度比较低的平台，但是他们都具有一个关键的基础，就是自动化构建和部署流水线（Pipeline），而流水线的一个必要条件就是：要有自动化测试。</p><p>那么问题来了：<strong>有多少公司的开发和测试团队具备良好的自动化测试能力？</strong></p><p>对不起，亲眼所见，仅就国内而言，不多……</p><p>上到知名互联网企业，下到中小型传统IT企业，先姑且不说测试驱动开发，仅是有自动化测试的连过半都没有。</p><p>没有自动化测试兜底，你告诉我，开发到运维咋个快速流动嘛！更别谈持续反馈了，要不要用手点的方式表演个快速回归看看？</p><p>所以，这也是我们所见到的大多数所谓“DevOps平台”很难落地的原因。至于为啥今天做平台那么火爆，我个人有个非常不负责任的理解就是：</p><p>作为长期被忽视的运维工程师们，好不容易打了一次翻身仗，愈战愈勇用，加上之前所说的套路化迷思，最后从上到下集体妄图用工具和平台一统天下……最终促进人工智能替代胶水代码工程师的伟大未来。<strong>（我就是开个玩笑，别打我！）</strong></p><p>说到这里，我就想起了之前评估过的一个团队，做了大量基础设施搭建工作的运维工程师用非常无奈的眼神看着我说的话：</p><blockquote><p>“我们工具都搭好了，可是开发就是不用……”（因为没有自动化构建也没有自动化测试）</p></blockquote><p>阻挡平台落地的因素有很多，自动化测试是我见到的最惨烈的一个。</p><h2 id="DevOps到底是什么？"><a href="#DevOps到底是什么？" class="headerlink" title="DevOps到底是什么？"></a>DevOps到底是什么？</h2><p>穿过浮躁，回归本质，让我们来看看：DevOps到底是什么？</p><p>其实DevOps思想是建立在软件行业经过实践验证的一系列旨在提升响应力的思想和实践的融合过程之上的（所谓“DevOps大融合”），它们包括且不限于[^1]：</p><blockquote><ul><li>精益运动</li><li>敏捷运动</li><li>Velocity大会运动（最为有名的就是演讲“每日10次部署：Dev和Ops在Flicker的协作”）</li><li>敏捷基础设施运动</li><li>持续交付运动</li><li>丰田套路运动</li><li>精益创业运动</li><li>精益用户体验运动</li><li>Rugged Computing运动</li></ul></blockquote><p>所以，DevOps即是一种“融合思想”，里面含有了大量需要长期学习、理会、实践的东西。</p><p>而其中最为核心且占主导地位的，在我看来就是“精益思想”和“持续交付”。我们在DevOps转型过程中能够看到的绝大多数问题都基本不超出这两种思想的范围（当然他们也是建立在一系列思想和实践之上的）。换句话说，如果你所遇到的问题在这两种思想中找不到答案，那你的DevOps实践水平已经相对其他组织来说非常高了。</p><p>另一方面，DORA团队在近4年的研究基础上，总结了5类共24项能够影响和推动软件交付效能的关键能力，并且绘制了关系图，这5类能力为[^2]：</p><blockquote><ul><li>持续交付<ul><li>对所有生产工件使用版本控制</li><li>自动化部署过程</li><li>实现持续集成</li><li>使用基于主干的开发方法</li><li>实现自动化测试</li><li>管理测试数据</li><li>将安全性集成到软件和测试阶段</li><li>实现持续交付</li></ul></li><li>架构<ul><li>使用松耦合架构</li><li>构建自治团队</li></ul></li><li>产品和流程<ul><li>收集和实施客户反馈</li><li>通过价值流可视化工作流动</li><li>小批量工作</li><li>培养和支持团队实验</li></ul></li><li>精益管理和监控<ul><li>使用轻量级变更审批流程</li><li>监控应用和基础架构以支持业务决策</li><li>主动检查系统健康状况</li><li>通过限制在制品改进流程和管理工作</li><li>可视化工作以便监控质量和促进团队沟通</li></ul></li><li>文化<ul><li>支持生机型文化</li><li>鼓励和支持学习</li><li>鼓励和支持团队间的合作</li><li>提供使工作有意义的资源和工具</li><li>支持或体现变革型领导力</li></ul></li></ul></blockquote><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-114505.jpg" alt="Overall Research Program"></p><p>怎么样？是不是感觉24项关键能力每个拿出来都够喝一壶的？</p><p>你看，DevOps融合了这么多种实践和思想，还需要锻炼这么多关键能力，那些希望能够有个“明确完成时间”的想法是不是显得很可笑了？</p><p>总而言之，DevOps所代表的就是一种追求能够从组织、文化、技术角度等多个方向上，利用新的思想和工具，全面提升IT组织响应力，同时让客户和员工都满意的价值追求。</p><p>当然，如果一定要问我DevOps转型到一个理想状态需要多长时间的话，我会说：</p><blockquote><p>“谁知道呢，根据统计，一个企业完成精益转型需要5年时间，作为DevOps转型来说，没个奋战3-5年的心理准备，还是洗洗睡吧……”</p></blockquote><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>作为DevOps转型的推动者，在这喧嚣浮躁的阶段，我们应当看清现实，树立正确的DevOps价值观，用实践检验真理，我相信喧嚣过后，总是会大浪淘沙，去伪存真。</p><p>而对于那些正因为各种原因“被转型”的人们，我想说：莫急，不慌，多学习。</p><p>[^1]: 出自《DevOps Handbook》，文字来自中译版《DevOps实践指南》。<br>[^2]: 内容和图片出自《Accelerate》: The Science of Lean Software and DevOps》。</p><hr><h2 id="欢迎关注我的微信公众号"><a href="#欢迎关注我的微信公众号" class="headerlink" title="欢迎关注我的微信公众号"></a>欢迎关注我的微信公众号</h2><p>微信搜索：<code>枪炮与代码</code>，或者搜索公众号ID：<code>guns_n_code</code></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-wechat.png" alt="枪炮与玫瑰"></p>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;自接触并学习DevOps起，到交付DevOps相关的培训和咨询服务至今已差不多一年时间。&lt;/p&gt;
&lt;p&gt;最近一段时间正在帮助我们的一个重要客户实现DevOps转型，在此过程中，每一天都会有新的发现和新的感悟。&lt;/p&gt;
&lt;p&gt;客户方的负责人开玩笑给我说：“如果我们能成功，固然很好，但是如果不尽如人意，大不了写本书呗！”&lt;/p&gt;
&lt;p&gt;我觉得好有道理！&lt;/p&gt;
&lt;p&gt;于是，秉着“到此一游总要留下点什么”以及“写不了一本书也要写个册子”的精益思想，开始把感悟到的东西都记录下来写成文章，一方面供自己总结精进，一方面供他人参考借鉴。&lt;/p&gt;
&lt;p&gt;这些文章不会有严格的顺序，纯粹想到了就写，容日后编撰成册吧。&lt;/p&gt;</summary>
    
    
    
    <category term="DevOps转型手记" scheme="https://huhao.dev/categories/DevOps%E8%BD%AC%E5%9E%8B%E6%89%8B%E8%AE%B0/"/>
    
    
    <category term="DevOps" scheme="https://huhao.dev/tags/DevOps/"/>
    
  </entry>
  
  <entry>
    <title>44天读8本书——习惯养成不能靠信念和鸡汤</title>
    <link href="https://huhao.dev/posts/c0297a43/"/>
    <id>https://huhao.dev/posts/c0297a43/</id>
    <published>2017-03-19T10:03:08.000Z</published>
    <updated>2017-03-19T10:03:08.000Z</updated>
    
    <content type="html"><![CDATA[<p><em><strong>我是一个超级不爱看书的人，同时还觉得成天看书的人往往纸上谈兵，很傻。</strong></em></p><p>但是，从 2017 年 2 月 2 日下定决心培养阅读习惯开始，我坚持每天读书至少 1 个小时，截至2017 年 3 月 18 日，在这 44 天里，我已经读完了 8 本书，这比我 2016 年整整一年所读过的书都要多。</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-113713.jpg" alt="44 天读完的 8 本书"></p><p>然而，这个过程并不是心中时刻默念：“我要培养阅读习惯！加油！”，然后靠着信念一本接一本读下去的过程，如果是这样，我肯定如之前所有失败了的坚持一样——早就半途而废了。</p><span id="more"></span><h2 id="一、信念和鸡汤不靠谱，动机和方法最重要"><a href="#一、信念和鸡汤不靠谱，动机和方法最重要" class="headerlink" title="一、信念和鸡汤不靠谱，动机和方法最重要"></a>一、信念和鸡汤不靠谱，动机和方法最重要</h2><p>正因为之前一次又一次的“从下定决心到放弃”，让我越来越相信，信念作为一个虚幻的存在，绝不是一个靠谱的东西，必须进行自我剖析并对症下药才行。</p><p>所以，与以往不同，在这“又一次开始”的时候，我认真思考了以下几个问题：</p><ul><li>我最希望通过习惯养成改进的是什么？</li><li>在开始阶段，最容易让我中断这个习惯的挑战是什么？我如何克服？</li><li>有什么真正有效的方法吗？</li></ul><h3 id="动机：都是因为读书少"><a href="#动机：都是因为读书少" class="headerlink" title="动机：都是因为读书少"></a>动机：都是因为读书少</h3><p>当走过 2016 年，我感到职业生涯遇到了天花板，这个天花板看不见摸不着，但给我的感受是：随着工作的复杂度和对沟通的要求越来越高，我越来越看不清方向，也越来越说不服别人，过去从当兵开始积累的 14 年工作和社会经验越来越不能奏效，这种事业和成就上的危机感比越来越臃肿的身体更令人沮丧。</p><p>而与此同时，随着我接触到越来越多眼界和水平非常高的人，我也越来越感叹：“论工作时间长短，我们差不了几年（甚至我比其中很多人工作时间还久），但是为什么他们很轻易的就能说出这么有深度，也很有说服力的话？我为什么做不到？”</p><p>向公司的 Managing Director 和团队的 Lead 请教，他们清晰的指出：“其实，就是因为读书少，导致箱子里面的工具，尤其是新工具太少，当遇到新问题的时候，可选择的办法或道路有限。”</p><p>我所谓之瓶颈，就是积累的经验已不够用，经验的积累速度赶不上环境的变化，而一直以来野蛮生长式的成长经历不但忽略读书的重要性，反而还对读书这事儿有点瞧不上。</p><p>如今，唯有一种办法能解决——大量的阅读，靠快速获得新的知识来应对。</p><p>所以，我最希望通过习惯养成改进的，就是培养阅读习惯了。</p><h3 id="尝试：读书少就赶紧读"><a href="#尝试：读书少就赶紧读" class="headerlink" title="尝试：读书少就赶紧读"></a>尝试：读书少就赶紧读</h3><p>既然阅读习惯已经成为了我职业生涯的瓶颈，那还不立刻开始读？</p><p>且慢，如何才能“立刻”开始？这，是一个很重要的问题。</p><p>做做反思，过去导致我不能“立刻”开始阅读的“绊脚石”主要有四个：</p><ol><li>想读书的时候，书不在身边，有了给自己形成借口的机会；</li><li>“完美主义”带来的“选择强迫症”：我到底是应该读电子书还是纸质书？如果是电子书，应该用“多看阅读”，还是“微信读书”，还是“豆瓣阅读”？</li><li>容易被难读的书打败，看不下去；（其实是阅读能力不够高，后面会说到）</li><li>容易被干扰，换句话说就是容易分神。（其实这是最根本原因）</li></ol><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-113718.png" alt="选择强迫症"></p><p>怎么办？如何才能减少或避免以上三点对我这“又一次开始”的影响？我必须给自己立个“规矩”，或者说是个“操作规范”，以便“照此执行，不纠结”。</p><p>针对以上的第一个“绊脚石”：我决定优先购买和阅读电子书，一来是获取容易和快速，二来是容易携带，实在没有电子书，那就买纸质书。</p><p>针对第二个“绊脚石”：由于确定了电子书优先，所以我横向对比了各种阅读 App 及其书城的书籍丰富程度，发现亚马逊的 Kindle 阅读依然还是书籍最全的，而“多看阅读”则是排版和制作质量最好的，“微信阅读”越来越火，但是书籍数量和质量还有提升空间。所以我决定，如果某电子书只有某个 App 有，那就用这个 App 看，否则优先选择“多看阅读”上的看（或者对排版要求高的），“多看阅读”没有的，就选择“微信阅读”看，其次是“豆瓣阅读”，再次是“京东阅读”。</p><p>针对第三个“绊脚石”：为了防止遇到难读的书看不下去导致阅读中断，特意找了一些自己非常感兴趣并且阅读起来不费脑细胞的书（比如<a href="https://www.amazon.cn/dp/B00NSGUFCQ">《人类简史》</a>），当看不下去难读的书或者看完一本难读的书的时候，就看看这些书换换脑子。（习惯养成中一个很重要的要素就是防止中断，哪怕是中断一天）</p><p>最后来说说这第四个“绊脚石”，就是容易被干扰而导致分神这事儿：这毛病治起来可不容易，而且还挺贵……</p><p>对我干扰最大的一个因素就是声音，首先环境噪音不能吵杂，而且凡是一丁点儿与环境噪音不协调的声音出现时，都会让我分神。（后面会讲到，其实就是自控力差）</p><p>而由于刚刚有了小孩儿，加上房子不大，想要有个安静的书房看书是不太可能了；而乘坐交通工具时这么好的碎片时间，也不安静。怎么办？只好花钱买了个降噪神器：<a href="https://www.bose.cn/zh_cn/products/headphones/over_ear_headphones/quietcomfort-35-wireless.html">Bose QuietComfort 35</a> 降噪耳机（后来因为出差和天气变热的缘故，又买了个易于便携的 <a href="https://www.bose.cn/zh_cn/products/headphones/earphones/quietcontrol-30.html">Bose QuietControl 30</a>，两个手都剁没了……），神器就是神器，世界顿时清净了！</p><p>好啦，规矩立好，开始捧起 iPad Mini 看书！</p><p>果然效果显著，在坚持每天读书之后，差不多一周半的时间（其中有几天休假，所以读书时间比较多），就读完了 3 本书—— 1 本难读的，2 本好读的。</p><p>看完这三本书，让我对于读书这件事的信心大增！我从来没有在这么短的时间内读了这么多书。</p><p>但是，<strong>与此同时，我也对如何能够更科学的培养阅读习惯产生了疑惑，因为到目前为止，主要还是依靠的我的个人意志和智慧（咦？……），而不是科学有效的方法——这依然还是不靠谱的。</strong></p><p>另外，在这个过程中，我很明显的感到以我微弱的自控力，iPad Mini 这个东西依然会让我分神，我总会不自觉的想要去看看其他 App，刷刷网页什么的；而且，iPad Mini 的屏幕当看书久了以后，眼睛会疼，也更容易犯困。所以我把脚也剁了，买了第三件神器：<a href="https://www.amazon.cn/kindle-store/dp/B00QJDOLIO/">Kindle Oasis</a>，而且 Kindle 还有个好处，就是它的客户端从电脑到移动设备一应俱全，即使没带 Kindle，也依然能够让我随时随地的看书，这是其它阅读产品所达不到的。所以 Kindle 接下来就成了我的个人阅读中心。</p><p><em><strong>在这里，我特别想要给正在看本文的人说一句：“可以学我的思路，但是不要学我的剁手。设备诚可贵，金钱价更高！切记！切记！切记！”</strong></em></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-113828.jpg" alt="剁手三神器，莫学我！"></p><h3 id="科学方法：果然还是读书少"><a href="#科学方法：果然还是读书少" class="headerlink" title="科学方法：果然还是读书少"></a>科学方法：果然还是读书少</h3><p>事实证明，果然还是读书少，当我寻找并阅读了两本书后，我对如何科学有效的培养阅读习惯才有了更加科学和完整的认识，这两本书，一本叫<a href="https://www.amazon.cn/dp/B008AGHPM2">《自控力》</a>，另一本叫<a href="https://www.amazon.cn/dp/B00IX8NX5A">《如何阅读一本书》</a>。</p><h4 id="先说说《自控力》"><a href="#先说说《自控力》" class="headerlink" title="先说说《自控力》"></a>先说说《自控力》</h4><p>首先，《自控力》这本书不是一本让人一口气读完的书，而是应该按照作者所推荐的那样“慢慢来”：在每个周日的清晨，阅读完读一章，然后用这一章所讲述的自控力策略，对自己做一周的训练，不要跳跃，也不要着急（因为作者实际上是把他实际中 10 周的课程写在一本书里了），10 周以后如果还没有放弃，那自控力就有了质的改变。</p><p>《自控力》的核心思想是：</p><blockquote><p>“为了成功做到自控，你必须知道自己为何失败。”</p></blockquote><p>作者从脑神经科学原理和关注影响自控力的因素的角度出发，从事情的本质上告诉我们这样一个道理：自控力是以物质为基础的，是唯物主义的，我们的自控力是由我们自身的进化过程所决定的，同时受各种科学研究证明了的因素影响。所以我们应当正视影响自控力的原因，并采用可行的办法去训练和改善，从而：</p><blockquote><p>“成为自控力科学家。”</p></blockquote><p>从这本书中，我得到了一个非常重要的概念：</p><p><strong>自控力的核心是人的意志力强弱，而人意志力是一种有限的储备，是物质的存在，所以它可以被消耗（有时可以被瞬间消耗光），也可以被补充（通过合理的手段），其储备量也可以增加（通过科学的训练）。</strong></p><p>所以，如果不去训练意志力的话，任何习惯都难以养成，这也是为什么我说信念和鸡汤是不靠谱的原因。</p><h4 id="再说说《如何阅读一本书》"><a href="#再说说《如何阅读一本书》" class="headerlink" title="再说说《如何阅读一本书》"></a>再说说《如何阅读一本书》</h4><p>作者写这本书的目的是：</p><blockquote><p>这是一本为阅读的人，或是想要成为阅读的人而写的书。尤其是想要阅读书的人。说得更具体一点，这本书是为那些想把读书的主要目的当作是增进理解能力的人而写。</p></blockquote><p>《如何阅读一本书》关注的是根本的阅读能力的问题，在没有对阅读能力做出提高之前，谈论阅读速度是不现实的。因此，我非常不推荐大家一开始就看<a href="https://www.amazon.cn/dp/B00XOGDCLQ">《如何高效阅读》</a>这本书，因为我们绝大多数人遇到的是能不能有效“看懂”的问题，还谈不上“高效”。</p><p>《如何阅读一本书》通过对四种阅读层次及每种层次的阅读方法进行论述，同时配以对阅读不同类型书籍的指导，完整的告诉读者：**我该如何读懂一本书，并在此过程中提高我的阅读能力。**当然，这一本书读起来也是比较费劲的。</p><p>但是这本书让我明白了一个重要的道理：</p><p><strong>我之所以觉得有些书读起来很难，很痛苦，很费脑细胞，正是因为我的理解能力不够高。而根本的解决办法就是去用正确的方法，坚持阅读下去，每当阅读完一本这样的书，我的理解能力就会得到提高。这样，当我再阅读下一本比较难读的书的时候，我就会越来越轻松了。（其实听不懂一些高水平的人所说的话的原因也与此有关）</strong></p><p>如果说《自控力》让我认识到我之所以会“放弃”的原因是因为意志力的储备和训练不够，从而明确了需要关注的核心问题。那么《如何阅读一本书》则消除了我对阅读有难度的书的恐惧，反而变成了一件让我乐于持续挑战的事情。</p><h4 id="目标：一石-N-鸟"><a href="#目标：一石-N-鸟" class="headerlink" title="目标：一石 N 鸟"></a>目标：一石 N 鸟</h4><p>当读过这两本书后，以上启发使我最终明确了我的目标：</p><p><em><strong>所谓培养阅读习惯，就是通过有效的意志力训练，提升自己的自控力，并通过持续阅读那些有难度的书，让自己的阅读和理解能力越来越强，知识储量越来越多，最终达到全方位的个人提升。</strong></em></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-113855.png" alt="在一开始就应该阅读的两本书"></p><h2 id="二、所谓习惯养成，根本在意志力的训练"><a href="#二、所谓习惯养成，根本在意志力的训练" class="headerlink" title="二、所谓习惯养成，根本在意志力的训练"></a>二、所谓习惯养成，根本在意志力的训练</h2><p>正如上面所说，习惯养成的根本，在于意志力的训练。所以，我便按照《自控力》中所说的部分方法，每天都坚持做以下四件最容易开始做，也是对意志力影响最为明显的事情，来训练我的意志力，目前已经坚持了有一个月，效果非常明显。</p><h3 id="意志力武器之一：睡眠"><a href="#意志力武器之一：睡眠" class="headerlink" title="意志力武器之一：睡眠"></a>意志力武器之一：睡眠</h3><p>睡眠是意志力的根本，作为一个成年人，每天保证 7 - 8 个小时的睡眠是非常必要的，否则，人的意志力储备就会极度下降，直接影响其他各个需要消耗意志力的事情。最重要的是，除了睡眠和放松这两件事情以外，其他意志力训练的方法本身也都是要消耗意志力储备的。可见，睡眠不论是对我们的健康还是对于我们意志力的根本来说，都是最重要的活动。</p><p>那么既然如此重要，我就要保证睡足 7 个小时应该是一天当中最高优先级的事情，一切其他事情都要基于此目标来安排相应的时间。</p><p>而且，由于人的一天当中，意志力是随着时间的推移而降低的，所以早睡早起就非常重要——把那些更需要意志力的事情尽可能放在早上去做。</p><p>所以我要求自己每天晚上 11:30 前必须上床，每天早上 7:30 前必须起床。</p><p>这里需要特别提醒注意的是，7 个小时的睡眠，并不是指卧床时间，而是指的有效睡眠时间。所以我需要工具来对我的睡眠进行监控和调整，这里我推荐一个 App，叫做 <a href="https://www.sleepcycle.com/">Sleep Cycle</a>， 这是一款智能闹钟应用。</p><p>Sleep Cycle 能够调用 iPhone 上的各种传感器来检测睡眠，只需要按照它的要求，将手机连接数据线，手机正面朝下，然后用话筒一端对准我，放在靠近枕头的床头柜上就好了（如果是安卓手机，则只能放在床上）。</p><p>它会持续监控我的睡眠情况，分析我什么时候醒着，什么时候进入深度睡眠，并且在我设置的时间范围之内（没错，是时间范围，这个很赞），保证用轻柔的音乐唤醒我。如果我想小睡，只需翻个身或动一下，他就进入小睡状态，然后隔一会儿提醒一下，直到我设置的时间时不可中断的叫醒我。并且在醒来以后，用手指遮住摄像头，它会用闪光点和摄像头对我的心率进行光学检测。</p><p>以上所有数据都会输入 iPhone 的“健康”应用，从而让我持续跟踪和调整睡眠情况已达成有效睡眠 7 个小时的目标。</p><h3 id="意志力武器之二：健身"><a href="#意志力武器之二：健身" class="headerlink" title="意志力武器之二：健身"></a>意志力武器之二：健身</h3><p>健身是增加意志力储备的重要手段，之前我之所以用错了，是因为我把健身当做减肥的手段了，所以急于求成，也不容易坚持——意志力强，自然会更好的坚持健身。</p><p>所以，在理清了“我健身是为了训练我的意志力，而不是为了减肥”这个目标之后，我对于健身所投入的时间和强度就有了更加合理，并易于坚持的规划。</p><p>而在利用了《自控力》中的方法，对影响坚持健身的原因进行分析后，发现：不能立即开始健身（比如健身房太远，就容易给自己找借口），没有场地健身（家里或酒店空间太小），健身时间太长（业余时间本来就紧张）是重要的三个原因。</p><p>这时候，就需要一个能够在室内，且不使用器械，并且时间在 20 - 30 分钟的健身方案。</p><p>对此，我找到并使用的工具是 <a href="https://www.gotokeep.com/">Keep</a> 这个 App。</p><p>Keep 的好处是，能够根据指引设计为期两周的针对性室内无器械课程，课程安排循序渐进，每天课程控制在 20 分钟左右，易于操作和坚持。支持 Apple Watch，能够有效监测运动情况并做记录。</p><h3 id="意志力武器之三：冥想"><a href="#意志力武器之三：冥想" class="headerlink" title="意志力武器之三：冥想"></a>意志力武器之三：冥想</h3><p>冥想（也叫正念）也是增加意志力储备的重要手段，其核心内容是通过观察和控制思绪，保持专注。</p><p>但是需要意识到的是，冥想是一种训练，所以也需要长期坚持才能见效。</p><p>最简单的冥想就是《自控力》里所说的：</p><blockquote><p>5 分钟大脑训练冥想。在脑海中默念“呼”和“吸”，把注意力集中在呼吸上。当开始走神的时候，重新集中注意力。</p></blockquote><p>简单且易于操作，只需要找个安静的地方挺直腰背坐好（此时降噪耳机又成神器），下颚微收即可。</p><p>每天抽空做 3 - 4 次，就会有非常好的效果。</p><p>这里我不太推荐去购买或使用时间较长、技巧要求更高的正念训练课程，因为作为初学者来说，在意志力有限的情况下（要记得冥想也是会消耗意志力的哦），这些课程反而会坚持不下去。</p><p>冥想本身不需要任何工具帮助，但是如果有 Apple Watch，则最新版本中内置的“呼吸”应用就很好，可以指导呼吸并记录冥想过程中的时间和心率。</p><h3 id="意志力武器之四：简单的时间管理"><a href="#意志力武器之四：简单的时间管理" class="headerlink" title="意志力武器之四：简单的时间管理"></a>意志力武器之四：简单的时间管理</h3><p>以上包括阅读在内的活动都需要占用时间，如果没有时间，就不可能做好意志力训练。</p><p>在还没有学习和掌握高级的时间管理方法的时候，我采取了更轻量级的两个活动。</p><h4 id="方法一：减少看手机的时间，尽量远离手机"><a href="#方法一：减少看手机的时间，尽量远离手机" class="headerlink" title="方法一：减少看手机的时间，尽量远离手机"></a>方法一：减少看手机的时间，尽量远离手机</h4><p>在手机越来越成为我们生活一部分的时候，我们绝大多数人都没有意识到手机在我们获取信息的同时，谋杀了我们大量的时间。我周围的很多人，一有时间就抱着手机不放，甚至连工作时间都被占用了，如果仔细算一算，除了工作和睡觉，估计就是看手机的时间最多。</p><p>所以，我要求自己尽可能的少看手机，最简单的方式就是把手机放远点并静音。</p><p>比如上厕所的时候，经实测，上厕所的时候将手机放远或不看手机可以大大减少上厕所的时间。</p><p>只要腾出 25 分钟，就能用来看书、健身或冥想！</p><h4 id="方法二：番茄工作法，阅读和冥想的绝佳搭配"><a href="#方法二：番茄工作法，阅读和冥想的绝佳搭配" class="headerlink" title="方法二：番茄工作法，阅读和冥想的绝佳搭配"></a>方法二：番茄工作法，阅读和冥想的绝佳搭配</h4><p>所谓番茄工作法，就是保持 25 分钟专注做一件事情，任何其它事情都不要去打扰这件事，然后休息 5 分钟，再继续。</p><p>这个方法和我的一系列计划简直就是绝配：阅读 25 分钟，然后休息 5 分钟或做 5 分钟的冥想，再继续阅读。</p><p>作为工具，其实只要设置个闹钟就好了，如果非要用 App，也是有一大堆，这里推荐一个 iOS 上的 App：<a href="https://appsto.re/cn/Tkdp-.i">嘀嗒番茄钟</a>，好处是功能专一，并且支持 Apple Watch 和播放白噪音（和降噪耳机是绝配，用来遮蔽无法消除的噪音部分，比如人声）。</p><h3 id="效果"><a href="#效果" class="headerlink" title="效果"></a>效果</h3><p>在坚持使用了以上意志力武器近一个月之后，我感到意志力有了明显的提升，最明显的表现就是：</p><ul><li>由于坚持了每日睡眠时间和健身，我之前因为晚睡导致的心慌再也没有出现了，并且每天的精神非常好。</li><li>不管是看书还是做别的事情，都比以前要更加专注了。</li><li>阅读量直线提升，而且随着自控力的提升，其中几本难读的书都是纸质书，对设备没有那么依赖了。（什么？我们手都剁了你才说！）</li><li>由于 App 都对 Apple Watch 友好，Apple Watch 再也不那么鸡肋了！（到底有多少手可以砍？）</li></ul><h2 id="三、身边的人：一个不可忽视的催化剂"><a href="#三、身边的人：一个不可忽视的催化剂" class="headerlink" title="三、身边的人：一个不可忽视的催化剂"></a>三、身边的人：一个不可忽视的催化剂</h2><p>已经写了很多了，想必那些意志力比较差的人都早已看不下去了吧，所以这些人是没有希望的，接下来就写给能继续看的人了！（哼哼哼哼……）</p><p>这里要说一个我在这个过程中觉得非常重要的一个因素，就是我们身边的环境——那些我们每天接触到的人。</p><p>我之所以能认清自身的问题，开始培养自己的阅读习惯，不能离开我所在的组织：<a href="https://www.thoughtworks.com/cn/about-us">ThoughtWorks</a>，一家规模不大，但是在 IT 服务和咨询领域卓有成效，也很有名气的公司。在这个组织中，有着许许多多追求卓越，有着良好阅读习惯的同事。他&#x2F;她们使得这个组织朝气蓬勃，积极向上。</p><p>在这个组织中，可以找到许许多多榜样，也可以找到许许多多和我一样不断努力改进自己的人。当我有所成绩，他们会为我点赞，并且效仿，然后很可能比我走的更快更远。</p><p>周围的人群，时刻在提醒、督促、并鼓励着我不能懈怠，不断前行——这绝对是一个重要的催化剂。</p><p>而我也知道，有很多人的周围环境不是这样子，更多的是停滞不前，消极，没有生气。因此，他们也长时间没什么进展或成长。</p><p>所以，如果不能立刻改变环境，就应该去主动寻找那些能够让我们变得更加积极的人，然后和他做朋友。</p><h2 id="四、在路上"><a href="#四、在路上" class="headerlink" title="四、在路上"></a>四、在路上</h2><p>在读完了 8 本书之后，我开始感觉到我越来越能够用书上所蕴含的知识去阐明我的观点或理解他人，从而比之前更好的达成共识。同时，也能够越来越顺利的看懂那些蕴含大量复杂概念的书籍。</p><p>44 天只是开始，2017 年，争取读完 50 本书。</p><p>洋洋洒洒说了这么一大堆，其实：</p><p><em><strong>“我之所以这么能说，无非就是多读了几本书而已。”</strong></em></p><hr><h2 id="欢迎关注我的微信公众号"><a href="#欢迎关注我的微信公众号" class="headerlink" title="欢迎关注我的微信公众号"></a>欢迎关注我的微信公众号</h2><p>微信搜索：<code>枪炮与代码</code>，或者搜索公众号ID：<code>guns_n_code</code></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-wechat.png" alt="枪炮与玫瑰"></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;em&gt;&lt;strong&gt;我是一个超级不爱看书的人，同时还觉得成天看书的人往往纸上谈兵，很傻。&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;但是，从 2017 年 2 月 2 日下定决心培养阅读习惯开始，我坚持每天读书至少 1 个小时，截至2017 年 3 月 18 日，在这 44 天里，我已经读完了 8 本书，这比我 2016 年整整一年所读过的书都要多。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-113713.jpg&quot; alt=&quot;44 天读完的 8 本书&quot;&gt;&lt;/p&gt;
&lt;p&gt;然而，这个过程并不是心中时刻默念：“我要培养阅读习惯！加油！”，然后靠着信念一本接一本读下去的过程，如果是这样，我肯定如之前所有失败了的坚持一样——早就半途而废了。&lt;/p&gt;</summary>
    
    
    
    <category term="习惯培养" scheme="https://huhao.dev/categories/%E4%B9%A0%E6%83%AF%E5%9F%B9%E5%85%BB/"/>
    
    
    <category term="习惯" scheme="https://huhao.dev/tags/%E4%B9%A0%E6%83%AF/"/>
    
    <category term="阅读" scheme="https://huhao.dev/tags/%E9%98%85%E8%AF%BB/"/>
    
  </entry>
  
  <entry>
    <title>软件技术顾问的培养（零）：绩能主义社会下的教育不公平</title>
    <link href="https://huhao.dev/posts/d337dc1c/"/>
    <id>https://huhao.dev/posts/d337dc1c/</id>
    <published>2016-09-25T12:07:30.000Z</published>
    <updated>2016-09-25T12:07:30.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>之前我们发表过一篇名为<a href="https://mp.weixin.qq.com/s/0vzRl8bSFop1BqK8mCx8Yw">《先定个小目标，比如6周培养100人》</a>的文章，详细回顾了ThoughtWorks思沃学院团队今年所举办的“2016年ThoughtWorks暑期特训营”活动，可以作为我们公司在教育领域探索实践的信息输入，便于大家更好的理解背后的故事。由于篇幅所限，所以此文中不对“暑期特训营”做更多描述。</p><p>如果你想了解更多的上下文，则可以阅读：</p><ul><li><a href="http://zhaosheng.xupt.edu.cn/info/1059/1466.htm">ThoughtWorks“卓越女生计划”</a></li><li><a href="https://mp.weixin.qq.com/s/0vzRl8bSFop1BqK8mCx8Yw">《先定个小目标，比如6周培养100人》</a></li></ul><h2 id="一个意料之中的震撼"><a href="#一个意料之中的震撼" class="headerlink" title="一个意料之中的震撼"></a>一个意料之中的震撼</h2><p>ThoughtWorks西安办公室的2017年校招内推专场面试刚刚结束，思沃学院团队根据六周时间的观察而推荐的24名“ThoughtWorks暑期特训营”学生也参与了全程的面试。</p><p>记得曾经在暑假前，很多相关同事问我：“你觉得今年思沃学院培养的这近100名学生，最终能有多少个能顺利通过面试加入ThoughtWorks？”</p><p>我当时的回答是：“首先，我们并不是为ThoughtWorks招聘来做这件事情，但是根据前两年的经验，以我们公司的校招标准来看，能有5个就算相当不错了吧！”</p><p>可是结果是怎样的呢？</p><p>4个。</p><p>而且，在这4个人中，所有面试官无争议通过的只有2个人，其中之一还是985&#x2F;211院校的学生。</p><p>所以，从严格意义上来说，对于一直以非985&#x2F;211院校学生作为培养目标的思沃学院团队，最终毫无争议通过我司面试的只有1个人（最后，公司根据思沃学院团队在整个学生培养过程中的观察和评价情况，在此4人基础上又补录了11名同学）。</p><p>作为曾经就只抱5个人希望的我来说，虽然总的数字差别不大，但是最终结果还是给我带来了不小的震撼。</p><p>为什么呢？因为与其他内推的学生相比，我们推荐的学生基本呈现出了垫底的状态，最终结果有点令人遗憾。</p><p>记得在面试官讨论过程中，有面试官提出过这样一个疑惑：“从面试观察来看，本科生普遍不能与研究生正面抗衡，存在很明显的差距，把他们放在一起面试是不是有些不公平？”</p><p>有另外的面试官回答说：“我们的标准都是一样的，所以不管是本科生还是研究生，我们不分学历，只要达到标准我们都会录取，所以很公平啊！”</p><p>也有面试官回答说：“差距明显很正常，毕竟他们之间差了三年呢。”</p><p>看似以上的讨论每一句都很有道理，但是真正的原因到底是什么呢？</p><p>其实对我们来说，这个结果在带来震撼之外，更应该是激动的——因为这个结果进一步验证了某种我们一直以来所“亲身发现”和不断研究的客观规律的合理性。</p><p>这个客观规律是什么？接下来就让我慢慢道来。</p><h2 id="一些我们观察到的事实"><a href="#一些我们观察到的事实" class="headerlink" title="一些我们观察到的事实"></a>一些我们观察到的事实</h2><p>近三年多来，我们团队不断接触在校生，开展各种校园活动，参与公司校招及试用期评价，实施毕业生入职前培训。在这期间，我们充分观察了学生的在校表现、培训期表现、面试表现、试用期表现，进行了Buddy访谈、面试改革访谈等访谈工作，同时还与公司外部的其他公司、院校及培训机构做了许多的沟通和交流。</p><p>在这些活动不断开展的过程中，我们越来越清晰的发现，在当前，不管是怎样的IT公司，在录取和评价毕业生时，不管是用怎样的流程或方法，都会产生如下的客观事实：</p><p><strong>什么样的毕业生更容易通过校招面试，或者能够获得更好的评价？</strong></p><ul><li><strong>研究生</strong>普遍优势于<strong>本科生</strong></li><li><strong>985&#x2F;211院校的学生</strong>普遍优势于<strong>非985&#x2F;211院校的学生</strong></li><li><strong>留学生</strong>普遍优势于<strong>非留学生</strong></li><li><strong>专业对口的学生</strong>普遍优势于<strong>非专业对口的学生</strong></li><li><strong>男生</strong>普遍优势于<strong>女生</strong>（这一点在ThoughtWorks由于坚持男女校招比例1:1，所以对于ThoughtWorks来说是不存在的）</li></ul><p>以ThoughtWorks为例，按照学生毕业院校来看，在ThoughtWorks的2015届校招毕业生中，985&#x2F;211院校以及海外院校的毕业生所占比例为：</p><ul><li>西安办公室：77%，其中来源院校人数遥遥领先的是西安电子科技大学（西电），其次是西安交通大学；</li><li>成都办公室：68%，其中来源院校人数最多的是电子科技大学（成电），其次是西南交通大学和四川大学。</li></ul><p>**ThoughtWorks作为一个“不看学历，不看学校，还坚持男女平等”的公司，该数据要比其他公司有更强的说服力。**而作为那些动辄只招985&#x2F;211院校学生，也不太愿意招女生的公司来说，数据肯定就没办法参考了。</p><p>所以，从以上观察事实角度出发，你可以简单粗暴的得出一个不是很精准但很容易理解的推论：</p><p><strong>“从概率上来说，如果你是研究生及以上学历的名校毕业海归，只要不故意犯错，想不通过各大公司的校招面试都难，对你来说只是能不能进500强企业的问题；但如果你是一个非名校毕业非海归的本土本科及以下学历的学生，尤其是女生，想要通过各大公司的面试要么压根没机会，要么基本上靠运气。”</strong></p><h2 id="你为什么考不上好的大学？"><a href="#你为什么考不上好的大学？" class="headerlink" title="你为什么考不上好的大学？"></a>你为什么考不上好的大学？</h2><p>既然我们已经看到了**“越是好学校毕业的学生，越容易找到好的工作”**这个现实，那么让我们再来思考另一个问题：</p><p><strong>“一个人考不上好的大学的根本原因是什么？”</strong></p><p>我想很多人都会熟悉这样一个对话：</p><p>“你为什么没考上更好的大学？”</p><p>“唉，没别人努力呗！”</p><p>包括我自己在内，很多人都曾把不能获取更好机会的原因归结于自身的不努力，但是我们如何去衡量和比较“努力”还是“不努力”呢？难道是拿晚上不睡觉学习的时间来计算吗？那对于两个都认认真真学习了同样时间但考试成绩却不一样的人来说，到底谁更努力呢？</p><p>很显然，“不努力”是一个非常主观的评价，虽然这种主观的东西确实会影响，甚至是从很大程度上影响一个人的高考成绩，但是如果拿这样一种主观的指标去衡量这个社会上所有的考生，未免有点太不靠谱。</p><p>而且通过我们与在校大学生的实际接触，大量非985&#x2F;211的一本和二本类院校中，充满热情并努力学习的人还是占了大多数的。</p><p>尤其是在我们的“卓越女生计划”中，在这近一年的时间里，有很多的同学不畏严寒和酷暑，也不怕所在学校东西校区之远，天天坚持在实验室刻苦学习。她们还放弃了暑假时间，投入到为期六周，每周六天，高强度的“ThoughtWorks暑期特训营”训练中，并一直坚持到最后，可还是不能在本次校招内推面试排名中进入前列，这绝不是“不努力”三字能够解释的了的。</p><p><strong>那么到底是什么原因导致这些非常努力的学生依然无法正面PK那些更好学校的学生呢？</strong></p><p>有人会说：“从源头上来说，那应该就是‘智商’或者‘天赋’这样与生俱来的东西了吧？我们必须承认人与人之间确实是存在这方面的差距的。”</p><p>这句话似乎要比单纯讲“努力”更靠谱一些，但是，<strong>什么是“与生俱来的东西”呢？</strong></p><h2 id="“绩能主义”社会的双刃剑"><a href="#“绩能主义”社会的双刃剑" class="headerlink" title="“绩能主义”社会的双刃剑"></a>“绩能主义”社会的双刃剑</h2><p>为了解答我们心中的疑惑，我们最近一段时间查阅了许多社会科学及教育领域的资料，在众多的资料中，我们找到了一个共识性的结论：</p><p><strong>高等教育机会与家庭背景之间存在着正相关的关系。</strong></p><h3 id="什么是“家庭背景”？"><a href="#什么是“家庭背景”？" class="headerlink" title="什么是“家庭背景”？"></a>什么是“家庭背景”？</h3><p>关于家庭背景，人们往往会很快想到“经济收入”，或者“父母社会地位”这样的东西，但是这些是不够的。</p><p>根据这些资料所使用的调查数据，我们分析并归纳了以下几种衡量家庭出身的参考依据：</p><ul><li>家庭经济条件</li><li>父辈的文化程度</li><li>父辈的职业类型</li><li>城乡地区差别</li></ul><p>从以上四种维度我们可以看到，对于家庭背景的定义要比想象中更复杂。</p><p>所以，像回答“家庭背景是好还是差”这样的问题来说，是不能以任何一种单一维度来衡量的。</p><h3 id="家庭背景与能力"><a href="#家庭背景与能力" class="headerlink" title="家庭背景与能力"></a>家庭背景与能力</h3><p>清华大学社会学系教授<strong>刘精明</strong>在 2014 年的一项名为<a href="http://www.usc.cuhk.edu.hk/PaperCollection/webmanager/wkfiles/2012/201501_40_paper.pdf">《能力与出身：高等教育入学机会分配的机制分析》</a>的研究中，详细的研究了“绩能主义”社会下家庭背景与高等教育机会分配不平等的问题。</p><blockquote><p><strong>绩能主义（Meritocracy）：<strong>与“社会再生产”（Social Reproduction）相对立。自 1958 年迈克尔·扬发表（The Rise of Meritocracy）一书以来，“绩能主义”一词被迅速广泛地应用到经济不平等领域的研究，其中“绩能”（Merit）是指个人能力（或智力）与努力的结合，而“能力”或“才能”通常以智商（IQ）、认知能力、教育水平等为重要的测量指标。社会学关于“社会再生产”与“绩能主义”间的争论发端于约20世纪七八十年代，其焦点是，一个更为开放的社会的社会分层原则是否会更多地以绩能主义为主导？<br>博特早年关于智力与社会阶级关系的研究是这场争论较早的一个来源。他指出，在智力测验中，平均而言，管理与专业技术人员得分高于低阶非体力者，低阶非体力者智力水平高于体力工人。虽然后来有学者指出，这种智力差异部分源于教育对智力的影响，部分源于智力对职业地位获得的直接效应，但</strong>这一发现产生了一个基本悖论：在一个更为开放的社会中，智力的阶级差异更大。这意味着，如果阶级或种族背景对职业成功的影响较大，有能力但处于不利阶级位置的人将被越来越限制在低层次的工作岗位上，而能力较差但处于有利阶级背景中的人将获得较高的工作职位。相反，在平等的阶级基础上相互竞争的人们，最有能力的人将赢得最好的职业位置，这样的社会即被称为“绩能主义”社会。在以“绩能”为原则的社会分层体系中，收入、权力、声望等与个人的能力具有正向关联。</strong></p></blockquote><p>这段解释比较烧脑，在这里我把以上对于“绩能主义”社会的解释总结成一句话就是：<strong>“绩能主义”社会，即“唯才是举”的社会。</strong></p><p>根据刘精明教授的调查研究，形成了这样一幅“出身与能力效应系数的层级差异”图像：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-22-171510.png"></p><p>对于这幅图像，他指出：</p><blockquote><p>图2显示，沿着二本大学、一本大学（不含“211”）、“211”学校（不含“985”）、“985”学校（不含顶尖学校）向顶尖大学这一学校层级序列，能力效应值和出身效应值几乎都是线性递增的。这表明，学校的层级越高，相应的能力要求也越高，同时出身效应（或家庭背景优势）表现得也越强烈。<br>总体来说，研究结果表明，就不同层级的普通本科入学机会的分配而言，学生个人的能力作用较大程度地高于先天禀赋效应和出身效应，进入更高层级的大学，对能力要求非常明确地逐级提升。这说明，由于我国现行高等教育体系坚持以统一高考为工具、以学业能力为主要衡量标准，在年轻一代人才的选拔过程中，个人的能力（特别是学生的学业能力）是更为重要的。<br>在此前提下，上述分析还显示，如同能力效应一样，出身效应也同样具有较为明确的层级化特征。从出身效应内部来看，构成出身效应的两个子效应——家庭文化资本和社会经济地位对子代获得不同层次的普通本科教育机会的重要性程度几乎是相同的。这一结果表明，进入更好或更高层级的大学，家庭文化资本优势和社会经济地位方面的优势同样要求也更高。</p></blockquote><p>最后，他得出了三个主要结论：</p><blockquote><p>首先，就目前普通本科教育机会分配而言，能力标准占绝对主导地位；<br>其次，随着本科层次的提升，能力效应和出身效应同时扩大；<br>最后，无论何种层次的高等教育机会，能力效应和出身效应之间的相对关系或基本格局维持在一个较为稳定的状态。</p></blockquote><p>同时，还引出了一些很有意义的讨论：</p><blockquote><p>研究结果表明，由于我国大学主要采取以统一高考制度为主的人才选拔方式，因此就不同层级的大学机会分配机制而言，表现了较为明确的绩能主义社会“唯才是举”的典型特征。<br>不过，若以本研究的发现来评价高等教育领域中的教育公平问题时，仍需持谨慎态度。首先，本文强调的是，所谓“唯才是举”的典型特征是相对我国高等教育的招生体制而言的，在各层级大学本科的招生过程中或招生行为发生时，个人能力在其中确实起到了决定性的作用。但如果将这一结论引申到更为广泛的教育公平问题时，仍需考虑能力形成过程中的家庭背景或出身的影响。虽然本研究刻意回避了对这一过程的追究和讨论，但能力是如何形成的？家庭的社会经济地位资源和文化资本对它的影响如何？学校与班级、家校互动、社区环境等对儿童成长和发展的影响如何？这一系列问题正是引导我们关于教育公平问题的讨论进一步深化的更为重要的研究议题。<br>其次，本研究发现的出身效应的影响是控制了能力效应后的净影响，尽管它相对于能力而言重要性程度较小，但其出现在招生环节中就不可小觑，应引起足够重视。<br><strong>最后，也是最为重要的，应该认识到绩能主义的人才选拔制度对于社会公平的意义所具有的两面性，它对更广泛的社会公平而言是一柄“双刃剑”。绩能主义社会奉行的是优胜劣汰的基本原则，在“强分类、低赋权与高训诫的科层制教育”中，绩能主义更容易成为一部分家庭条件优越、能力强者的“社会炼金术的利器”，一个完全的绩能主义社会往往会沿着智力或能力水平的高低而形成社会不平等阶梯，如果缺乏对弱者的保护则将产生更为严重的社会分离，这也是当初迈克尔·扬警示人们“绩能主义只会导致永久性不平等”的原因。</strong></p></blockquote><h2 id="一次有意思的对比调查"><a href="#一次有意思的对比调查" class="headerlink" title="一次有意思的对比调查"></a>一次有意思的对比调查</h2><p>当看到了更多与刘精明教授所做研究和所得出结论非常相近的调查研究结果之后，我们觉得有必要亲自做一次对比调查。</p><p>我们都知道，ThoughtWorks 被社会上称为“世界上最难面试的 IT 公司”，先不论这个称呼是否真的合理，但是我们知道我司的招聘面试标准对于人的能力要求和面试表现是非常高的。</p><p>所以，如果我们把我们的最近一次毕业生家庭背景情况与一所非 985&#x2F;211 院校的学生家庭背景情况进行对比，会不会得出与这些调查数据相吻合的结果？</p><p>恰好，当时我们正在西安邮电大学开展“2016 年 ThoughtWorks 暑期特训营”活动，所以有了极佳的调查样本。</p><p>经过调查，为了排除地区性干扰，我特别使用西安办公室的数据与特训营数据做了对比，对比结果如下：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-22-171537.png"></p><p>结果是不是很震撼？非常鲜明的印证了上述调查研究的可信性，同时还能够说明：</p><p><strong>以强调人员综合能力表现为核心的 ThoughtWorks 招聘面试，也符合“绩能主义”社会下的典型做法。</strong></p><p>为了大家更方便的查看完整的调查数据，我将相关报表共享在此，密码统一都是 <code>twer</code>：</p><ul><li><a href="https://jinshuju.net/f/LwAQVn/results">ThoughtWorks 2016 届校招员工家庭背景调查</a> </li><li><a href="https://jinshuju.net/f/2pUVnl/results">ThoughtWorks 暑期特训营学员家庭背景调查（2016）</a></li><li><a href="https://jinshuju.net/f/scy2wz/results">ThoughtWorks 欧亚学院学生家庭背景调查（2016）</a></li></ul><p>当看到这些数据后，我们开始集体回忆并反思团队成员之前所参与过的所有校招面试和毕业生试用期评价，我们惊讶的发现：<strong>曾经那些在评价中获得好评的毕业生，往往家庭背景都相对于其他同批毕业生来说更加优越。</strong></p><p>我们非常想再更详细的去做更深入的调查研究，但是考虑到可能会触及个人隐私，还需要更多的权衡利弊和设计调查方法。</p><p>记得在得出这个调查结果之后，我同公司一位非常出色也在公司待了很久的校招同事聊起此事，当时她听到以上内容之后说：</p><p>“我是农村家庭，上的也是 985&#x2F;211 类院校，父母的月收入也非常低，而我当时读研究生所在的实验室，也有不少同学家庭条件并不是太好啊？我觉得应该没这么严重吧？”</p><p>然后，她思考了一下，说道：</p><p>“哦！虽然如此，但是我的父母都是高中学历！”（言下之意：从这点来看，要比很多高中以下学历的农村家庭要优越一些）</p><p>再举一个我个人的例子：</p><p>我没有上过大学，至今仍是高中学历，虽然经历了很多挫折，但是反思我的家庭：城市户口，父母电大自学的大专学历，军人世家，虽然父母最终都是进了工厂，但是祖父却是司令员，亲戚都是管理岗位，从 1980 年代末开始，家里就有电脑。</p><p>虽然我确实通过自己的努力不断走到了今天，有一份自己喜欢也还不错的工作。但是，以上家庭背景注定了：我比我的同龄人和我的战友们的翻盘的能力强太多，如果我的那些经历放在一个普普通通的农村孩子身上，绝无太大可能走到现在，只能退伍、回家、种地或找个别的工作。因为他不可能靠家人朋友给予的机会走上程序员的道路，也不可能通过从小到大对于计算机的理解快速学习编程。</p><p>这就是一个即使“努力”也很难从士兵变成程序员的例子。</p><p>所以，大家看到这里，可以套用之前那几个家庭背景的衡量条件对自己做做分析，估计能得到不少有意思的发现。</p><h2 id="问题与思考"><a href="#问题与思考" class="headerlink" title="问题与思考"></a>问题与思考</h2><p>基于以上“学生就读的院校质量、学生个人能力的高低与学生的家庭出身正相关”，以及“绩能主义社会的双刃剑”这两方面的讨论，我提出两个问题以供大家思考：</p><ul><li>虽然我们无法彻底的去改变当前的教育不公平现状，但是我们可以凭借对 IT 技术的掌握，尽自己的可能为那些处于教育不公平下的群体提供更多的机会和帮助，让他们能够多一些选择，改变自己的命运。那么，作为这个时代的佼佼者们，我们可以利用自身所长做一些什么事情？</li><li>根据2016年最近的一些报道，最近几年，中国每年的高校毕业生人数呈逐渐放缓趋势，甚至江苏等部分省份出现了毕业生人数负增长的情况，但是整个IT市场对于人才的需求却呈高速增长的态势。所有公司挤破头去招“最优秀的毕业生”的人才战争将会打的越来越激烈。坚持这种“绩能主义”社会下的人才招聘手法，会对各个公司的未来造成怎样的影响？</li></ul><h2 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h2><p>前几天，我们再次前往我们位于西安邮电大学的卓越女生实验室，同正在四处奔波参加各大公司校招的同学交流谈心，回来之后，我的心情十分沉重，因为从她们的倾诉和最近的经历中，我看到了这样一幅画面：</p><p>因为那些社会上比较好的 IT 公司基本不在西安邮电大学这样的非 985&#x2F;211 类院校开宣讲会，所以这些勤奋努力的孩子们一大早爬起来顾不得吃早饭就要跑到很远的西安电子科技大学、西安交通大学、西北工业大学等学校去跑一场接一场的宣讲会。</p><p>早上赶公交车前，买了个饼夹菜放到包里想着到了车上再吃，上了车却因为前一日同样的奔波劳累睡着了，结果等到醒了的时候才发现做过了站，又要急匆匆的赶紧换车往回赶。</p><p>忙碌了一天，直到晚上才拖着疲惫的身躯回到宿舍，这时打开包才发现，早上买的饼夹菜已经冰冰凉了。</p><p>“终于，可以吃‘午饭’了……”</p><p>我问她们，这么辛苦，面的怎么样？</p><p>她们沮丧的对我说：“我们根本过不了那些各种各样的逻辑题测试和笔试，进不到面试环节，即使进了面试，对方也说我们只能去做测试，做不了软件工程师。”</p><p>我问正在实验室里埋头做在线逻辑题测试和技术笔试的同学，看看这些题长什么样子。</p><p>然而我发现，我也不会做……</p><p>此时，肯定会有少部分人嘲笑我的智商或技术水平，但是我想告诉你们的是：<strong>这些就是“绩能主义”社会下，最廉价也是最高效的筛人方法——摆在学生们面前的第一座大山，这座大山用“智力”先划出一道分水岭。</strong></p><p>他们的学识，只有翻过这第一座大山之后，在翻越第二座大山时才有可能被人看到——**“绩能主义”社会下另一种相对高效的筛人方法：面试。这座大山用“能力”划出了第二道分水岭。**那些“与生俱来”的应对面试的能力缺失，将成为“宣判”他们未来命运的“判决书”，任何面试官都不能看到他们日常的真实表现。</p><p>而正在办公室中阅读此文的各位，则是越过这两道分水岭后的“胜利者”，此时此刻，如果回头看看已经望不见的山的那一边，你的心情是怎样的呢？</p><h2 id="参考文献"><a href="#参考文献" class="headerlink" title="参考文献"></a>参考文献</h2><ul><li>刘精明，2014：<a href="http://www.usc.cuhk.edu.hk/PaperCollection/webmanager/wkfiles/2012/201501_40_paper.pdf">《能力与出身：高等教育入学机会分配的机制分析》</a></li><li>李春玲，2010：<a href="http://www.cngdsz.net/d/img/upfiles_8/51727446817eb812c3d90e01776ed864.pdf">《高等教育扩张与教育机会不平等：高校扩招的平等化效应考查》</a></li><li>李春玲，2014：<a href="http://blog.sina.com.cn/s/blog_5ffc2d870102v85y.html">《“80 后”的教育经历与机会不平等》</a></li><li>张兆曙 、陈奇，2013：<a href="http://wenku.baidu.com/view/ea21cbe0c8d376eeaeaa3134.html">《高校扩招与高等教育机会的性别平等化——基于中国综合社会调查（CGSS2008）数据的实证分析》</a></li><li>叶华、吴晓刚，2011：<a href="http://www.usc.cuhk.edu.hk/PaperCollection/webmanager/wkfiles/8356_1_paper.pdf">《生育率下降与中国男女教育的平等化趋势》</a></li><li>网易数读，2016：<a href="http://data.163.com/16/0719/03/BSACD45R00014MTN.html">《过半农村学生初中后辍学，考大学难进名校》</a></li><li>熊丙奇，2014：<a href="http://news.sina.com.cn/zl/zatan/2014-01-01/0854836.shtml">《农村大学生为何就业更难？》</a></li><li>知乎：<a href="https://www.zhihu.com/question/31507793">《农村孩子读一个二本甚至三本大学的意义何在？》</a></li><li>知乎：<a href="https://www.zhihu.com/question/30232584">《知乎上有哪些“何不食肉糜”的言论？》</a></li><li>网易教育：<a href="http://edu.163.com/special/ky_xlqs/">《只招 211、985！院校歧视何时休？》</a></li><li>金陵晚报，2015：<a href="http://js.qq.com/a/20151119/013190.htm">《高校毕业生人数下降，信息、软件专业需求量大》</a></li><li>教育在线，2016：<a href="http://www.eol.cn/html/c/2016gxbys/">《2016 年全国高校毕业生人数 765 万，史上“更难就业季”，大学生就业形势分析》</a></li></ul><hr><h2 id="欢迎关注我的微信公众号"><a href="#欢迎关注我的微信公众号" class="headerlink" title="欢迎关注我的微信公众号"></a>欢迎关注我的微信公众号</h2><p>微信搜索：<code>枪炮与代码</code>，或者搜索公众号ID：<code>guns_n_code</code></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-wechat.png" alt="枪炮与玫瑰"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;之前我们发表过一篇名为&lt;a href=&quot;https://mp.weixin.qq.com/s/0vzRl8bSFop1BqK8mCx8Yw&quot;</summary>
      
    
    
    
    <category term="软件技术顾问的培养" scheme="https://huhao.dev/categories/%E8%BD%AF%E4%BB%B6%E6%8A%80%E6%9C%AF%E9%A1%BE%E9%97%AE%E7%9A%84%E5%9F%B9%E5%85%BB/"/>
    
    
    <category term="思沃学院" scheme="https://huhao.dev/tags/%E6%80%9D%E6%B2%83%E5%AD%A6%E9%99%A2/"/>
    
    <category term="人员培养" scheme="https://huhao.dev/tags/%E4%BA%BA%E5%91%98%E5%9F%B9%E5%85%BB/"/>
    
    <category term="卓越女生计划" scheme="https://huhao.dev/tags/%E5%8D%93%E8%B6%8A%E5%A5%B3%E7%94%9F%E8%AE%A1%E5%88%92/"/>
    
  </entry>
  
  <entry>
    <title>我对“组织文化”的认识（二）：组织文化的产生和可视化</title>
    <link href="https://huhao.dev/posts/4fb029fe/"/>
    <id>https://huhao.dev/posts/4fb029fe/</id>
    <published>2016-06-25T16:20:03.000Z</published>
    <updated>2016-06-25T16:20:03.000Z</updated>
    
    <content type="html"><![CDATA[<p>在<a href="https://huhao.dev/posts/31c74ef4/">上一篇文章</a>中，我对我所认知的“组织文化”的定义和作用进行了论述，而这一篇，我将来聊一聊我对“组织文化”的产生和可视化的认识。</p><hr><h2 id="组织文化的产生"><a href="#组织文化的产生" class="headerlink" title="组织文化的产生"></a>组织文化的产生</h2><p>“组织文化究竟是如何产生的？”</p><p>这是一个非常容易引起争论的问题，尤其是在我们公司这样一个“扁平化”的组织中。</p><p>在每一次公司内部关于“公司文化”问题的争论中，我都会发现有这样相当一部分同事会非常强烈的表达出这样一种“基于情感出发的”认识：</p><p><strong>“我认为公司文化是自然而然形成的，如果公司文化是被‘几个人’设计或制定出来的，我可能不会在这里继续待下去！”</strong></p><p>作为我个人来讲，我必须承认，我的情感中或多或少也会有这样的“表达”存在。但是，作为一个研究“组织文化”问题的人，在开始研究这个问题的时候，我基于批判性思维，针对这句话提出了一个问题：</p><p><strong>“组织文化真的是自发形成的吗？”</strong></p><span id="more"></span><h3 id="『组织文化的产生是一个变化的过程』"><a href="#『组织文化的产生是一个变化的过程』" class="headerlink" title="『组织文化的产生是一个变化的过程』"></a>『组织文化的产生是一个变化的过程』</h3><p>在我翻阅了一些有关于“组织文化”的书籍和资料后，我惊讶的发现，在相当大一部分的论述中，组织文化的产生都倾向于这样一种解释：</p><blockquote><p>组织文化是在组织战略设定后，为了在行为准则上确保组织战略成功实现而被选择或创造出来的。</p><p>当组织战略发生改变之后，组织文化也应及时的调整或改变，以符合组织战略的要求。</p></blockquote><p>这个解释的关键表达是：</p><ul><li>组织文化要符合组织战略的要求。</li><li>组织文化是可以被选择或创造的。</li><li>组织文化需要被调整或改变，以适应组织战略的变化。</li></ul><p>基于这样的解释，我开始对因这样一种解释而可能产生的“论战”而感到了担忧——如果真的是这样，岂不是真的要有很多人“待不下去”了？</p><p>于是我又开始翻阅其他更强调“文化应该是自然而然形成”的观点的资料。</p><p>在后续发现的资料，尤其是我司同事翻译的《精益企业：高效能组织如何规模化创新》一书中，我看到了这样非常有代表性的描述：</p><blockquote><p>精益思维方式在一个集中式 、命令与控制的管理模式中是难以生根发芽的 。尽管如此 ，我们还是需要看到每个人在做什么 ，保持透明度 。对大型组织来说 ，要找到这个平衡不容易 ，我们必须意识到这需要持续的调整 。组织中有些人会将这种文化转变视为一种威胁 ，并试图阻止 。命令与控制很简单 ：我遵循规则 ，可如果这个规则无效 ，那也不是我的错 。然而如果你要我来做决定并对其负责 ，那么就会有人来追究我犯错的责任 ，而这种犯错的可能性很大 。还是给我命令与控制吧 ！<br>如果我们成功建立了一家精益企业 ，那么所有层级的所有人都有可能遭遇失败和挫折 。如果不是这样 ，那就意味着我们还没有建立起一个高度信任 、高绩效的文化 ，仍继续以虚荣指标在评判我们的表现 ，而不是基于真实的成效 。<br>……<br>文化是一个组织是否有能力适应快速变化的环境的最关键因素。然而，文化是无形的，很难进行分析，更难去改变。每个组织都有其独特的文化，有人说，“有多少家成功的企业，就有多少种成功的文化”。<br>……<br>文化在每个组织中都是在不断变化的 。新的雇员和领导者在加入 ，现有的员工离职 ，组织战略和产品在不断演进或终止 ，市场也在不断变化之中 。因而 ，最重要的问题是 ：为了适应环境的各种改变 ，我们是否能够按我们的意愿去改进组织文化 ？<br>……<br>即使文化是无形的，它也可以被度量，有一项大型的研究正是致力于该任务。当然每一种方法都是基于某个基础模型，而所有模型都有各自有限的适用范围。尽管如此，这样的度量能够将文化变得可见并鼓励人们更多去关注文化，还是有重要意义的。</p></blockquote><p>这句话中有几个对于我们很有用的关键表达：</p><ul><li>需要建立适合本组织的良好文化。</li><li>文化是无形的，虽然很难进行分析，更难去改变，但它可以被度量，使其变得可见。</li><li>文化在每个组织中都是在不断变化的 。</li><li>为了适应环境的各种改变 ，我们需要去改进组织文化 。</li></ul><h3 id="『组织文化必须符合组织战略的需要』"><a href="#『组织文化必须符合组织战略的需要』" class="headerlink" title="『组织文化必须符合组织战略的需要』"></a>『组织文化必须符合组织战略的需要』</h3><p>对照前后两种解释的核心表达内容，你会发现其实它们并没有相互排斥的地方。相反，它们更是一种相互补充的关系！</p><p>基于这种发现，我得出了以下结论：</p><p><strong>一个组织的文化是“被创建”还是“自发形成”并不是绝对的，而且文化是会不断变化的。重要的是，这个文化应当适合该组织的组织战略需要，并且根据组织战略的调整而做出相应的改进。为了便于我们关注、交流、传承和改进，文化应当被度量，从而实现可视化。</strong></p><hr><h2 id="组织文化的可视化"><a href="#组织文化的可视化" class="headerlink" title="组织文化的可视化"></a>组织文化的可视化</h2><p>如果我们对于要关注、交流、和讨论的内容“看不清”也“摸不着”，会怎样？</p><p>我不能知道大家该具体如何开始下一步，但是至少我知道接下来肯定会是“一锅粥”。</p><p>组织文化的可视化就是为了解决这个问题。</p><p>通过思考，在我看来：</p><p><strong>为了能“看清楚”，组织文化的具体内容应该被相对清晰定义。为了能够“可操作”，组织文化内容应当有其相应的明确解释。</strong></p><p><strong>为了“可操作性”，对于组织文化内容的解释不应追求“大而全”，而更加重要的是“明确底线”，换句话说，就是“什么不能做”。</strong></p><p>有了组织文化的“内容”和“解释”，我们才能讨论“如何保持和传承”。</p><p>而对于组织文化的度量，是一个非常复杂的过程，也是一次挑战，目前有许多的专家和机构在从事这个领域的研究，也产生了非常多的成果和办法。</p><p>对于这方面的内容，由于非常专业和繁多，在此便不做过多的讨论。</p><hr><h2 id="部分参考书籍"><a href="#部分参考书籍" class="headerlink" title="部分参考书籍"></a>部分参考书籍</h2><ul><li><a href="https://zh.wikipedia.org/wiki/%E7%BB%84%E7%BB%87%E6%96%87%E5%8C%96">维基百科</a></li><li><a href="http://wiki.mbalib.com/wiki/%E7%BB%84%E7%BB%87%E6%96%87%E5%8C%96">MBA 智库</a></li><li>《领导力必读十二篇》</li><li>《精益企业》</li></ul><hr><h2 id="欢迎关注我的微信公众号"><a href="#欢迎关注我的微信公众号" class="headerlink" title="欢迎关注我的微信公众号"></a>欢迎关注我的微信公众号</h2><p>微信搜索：<code>枪炮与代码</code>，或者搜索公众号ID：<code>guns_n_code</code></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-wechat.png" alt="枪炮与玫瑰"></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;在&lt;a href=&quot;https://huhao.dev/posts/31c74ef4/&quot;&gt;上一篇文章&lt;/a&gt;中，我对我所认知的“组织文化”的定义和作用进行了论述，而这一篇，我将来聊一聊我对“组织文化”的产生和可视化的认识。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;组织文化的产生&quot;&gt;&lt;a href=&quot;#组织文化的产生&quot; class=&quot;headerlink&quot; title=&quot;组织文化的产生&quot;&gt;&lt;/a&gt;组织文化的产生&lt;/h2&gt;&lt;p&gt;“组织文化究竟是如何产生的？”&lt;/p&gt;
&lt;p&gt;这是一个非常容易引起争论的问题，尤其是在我们公司这样一个“扁平化”的组织中。&lt;/p&gt;
&lt;p&gt;在每一次公司内部关于“公司文化”问题的争论中，我都会发现有这样相当一部分同事会非常强烈的表达出这样一种“基于情感出发的”认识：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“我认为公司文化是自然而然形成的，如果公司文化是被‘几个人’设计或制定出来的，我可能不会在这里继续待下去！”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;作为我个人来讲，我必须承认，我的情感中或多或少也会有这样的“表达”存在。但是，作为一个研究“组织文化”问题的人，在开始研究这个问题的时候，我基于批判性思维，针对这句话提出了一个问题：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“组织文化真的是自发形成的吗？”&lt;/strong&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="组织的领导与管理" scheme="https://huhao.dev/categories/%E7%BB%84%E7%BB%87%E7%9A%84%E9%A2%86%E5%AF%BC%E4%B8%8E%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="组织文化" scheme="https://huhao.dev/tags/%E7%BB%84%E7%BB%87%E6%96%87%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>我对“组织文化”的认识（一）：组织文化的定义与作用</title>
    <link href="https://huhao.dev/posts/31c74ef4/"/>
    <id>https://huhao.dev/posts/31c74ef4/</id>
    <published>2016-06-23T17:05:02.000Z</published>
    <updated>2016-06-23T17:05:02.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>由于论述相关问题的书籍和资料特别多，文字描述也五花八门，所以本文会基于我目前所分析总结的认知，以相对比较好理解的文字来进行阐述。</p><p>为了避免某些无意义的争论，我刻意在文章中去掉了“<strong>企业</strong>”二字，因为这个名词可能让一部分人反感，所以我使用了更加本质和“纯洁”的“<strong>组织</strong>”二字，因为，<strong>“企业文化（Corporate Culture）”即“组织文化（Organisational Culture）”，它是“组织文化”在企业管理领域的一个具体的领域名词</strong>，这种词汇上的选择有助于让我们思考问题的时候回归本源。</p><span id="more"></span><h3 id="『为什么我会写这些文章？』"><a href="#『为什么我会写这些文章？』" class="headerlink" title="『为什么我会写这些文章？』"></a>『为什么我会写这些文章？』</h3><p>我正在接受公司领导力行动学习的训练，而我所属的领导力学习小组接受了一个非常“棘手”的挑战：</p><p><strong>“如何保持&#x2F;传承公司文化，重塑技术领导者形象？”</strong></p><p>之所以称之为“挑战”而不是“问题”，是因为领导力行动学习的一个开始环节是“澄清问题”。也就是说，这句话所真正隐含的那个问题是什么？需要被严肃认真的澄清。</p><p>作为分工研究前半句话的我，在近一个多月的时间里一直非常纠结和痛苦，因为：</p><p>如果不搞清楚这篇文章标题中一堆名词或概念的意思，以及它们之间的关系，我就无法继续思考，即使思考了，也无法判断我的思考是否是合理的。（这就好比我们做项目没有验收标准，写代码没有单元测试。）</p><p>让我来从一个预言说明这个问题，另外，我还想对“共识”这个词的理解做出一些说明。</p><h3 id="『从“盲人摸象”的寓言说起』"><a href="#『从“盲人摸象”的寓言说起』" class="headerlink" title="『从“盲人摸象”的寓言说起』"></a>『从“盲人摸象”的寓言说起』</h3><blockquote><p>盲人摸象的故事取自《涅槃经》、《长阿含经》，大概起源于印度，可能是耆那教或佛教，有时也归于苏菲派和印度教。</p><p>《涅槃经》卷三载：“其触牙者，即言象形如莱茯根（萝卜）；其触耳者，言象如箕；其触头者，言象如石；其触鼻者，言象如杵；其触脚者，言象如木臼；其触脊者，言象如床；其触腹者，言象如瓮；其触尾者，言象如绳。”</p><p>《长阿含经·卷十九·龙鸟品》、《百喻经》、《菩萨处胎经》亦载此一故事。在各种不同的版本中一群盲人触摸大象希望可以了解到他们正在摸什么。每个人都只触摸一部分。每个人在触摸到不同的部位后得到完全不同的结论，产生争执。故事基本上说：事实往往由于各人角度不同而被给以不同的解释。</p><p>波斯版本的五名男人都是视力正常，只不过在黑暗里摸象，直至灯亮了，五人才能见到大象的真面目。</p></blockquote><p>这个寓言故事我想应该绝大多数人都听过，但是有多少人注意到了这样一个<strong>隐含其中的根本前提</strong>：</p><p><strong>不管是哪一个故事版本，也不管他们是不是真的视力有问题，但是他们确实都从未见过，也未曾了解过大象应该长什么样子！</strong></p><p>对此，我们动用批判性思维，可以产生这样一个问题：</p><p><strong>“如果这五个人在摸象之前，有了解过，或者有人给他们说过大象应该长什么样子、都有哪些部位的话，那他们最后产生争论的可能性有多大？”</strong></p><p>显然，大象是可以被描述的，而“企业文化”作为一个已被人长期研究并使用的东西也是可以被描述的。</p><p>联系到我们自身，在我们对企业文化问题展开激烈争论的时候，有谁认真思考过这样一个问题：</p><p><strong>“在我们讨论企业文化之前，甚至产生莫名恐惧之前，大家究竟了解什么是企业文化吗？如果不了解，那我们究竟在争论什么？”</strong></p><p><strong>这，就是我写这些文章的目的。</strong></p><h3 id="『避免误解“共识”这个词』"><a href="#『避免误解“共识”这个词』" class="headerlink" title="『避免误解“共识”这个词』"></a>『避免误解“共识”这个词』</h3><p>另外，从之前每一次公司同事对于我司企业文化问题的的争论中，我总是能够发现有一部分同事对于“共识”的理解是有错误的，即：</p><p><strong>“共识”就是让“所有人”都接受并满意，所以，如果“企业文化”不能让“所有员工”都接受，哪怕是 90%，那都是“邪恶”的。</strong>（注意，这是个错误的理解。）</p><p>产生这个错误的根源在于，这部分同事没有意识到：</p><p><strong>组织是一个集体，由于其中的个体存在多样性，所以很难产生 100% 的事物，随着组织规模的增加，产生 100% 的难度也越来越大。</strong></p><p>而在这里我们特别要注意对于“共识”这个词汇的理解：</p><p><strong>“共识”这个名词，恰恰是建立在一个有差异的群体之上的。如果一个群体完全没有差异，那不可能存在“共识”这个东西，那个东西叫“相同”或“完全一样”。</strong></p><p>所以，在讨论“组织文化”这个问题之前，请先清除的认识到，我们所讨论的对象是基于一个组织的，我们所需要得到的东西是基于“最多数”人的，所以任何追求 100% 的思考，都很有可能是错误的，需要特别留意。</p><hr><h2 id="组织文化的定义与作用"><a href="#组织文化的定义与作用" class="headerlink" title="组织文化的定义与作用"></a>组织文化的定义与作用</h2><p>那么，到底什么是“组织文化”？我翻阅资料和书籍，经过思考和总结，得出了以下的定义：</p><p><strong>“组织文化”不是“规章制度”，而是一种“无限趋近”于组织中绝大多数个体的“行为准则”，它对组织的影响无处不在，而这种“行为准则”对组织外部和组织内部会产生不同的作用。</strong></p><h3 id="『外部作用』"><a href="#『外部作用』" class="headerlink" title="『外部作用』"></a>『外部作用』</h3><p><strong>对组织外部来说，“组织文化”是该组织对外展现的符号或印记，是一种组织整体向外辐射的信号和影响。它所起到的作用是：吸引更多认同这种文化的外部个体的加入。</strong></p><p>但是，新加入组织的个体，有可能对组织产生以下三种影响：</p><ol><li>正面的影响</li><li>没有明显的影响</li><li>负面的影响</li></ol><p>前两种影响因为对组织不会产生什么负面作用，所以对组织的健康并没有什么威胁或风险，而最后一种能够产生“负面影响”的个体，则需要被改变。</p><p>这时候，“组织文化”的内部作用就开始产生效果了。</p><h3 id="『内部作用』"><a href="#『内部作用』" class="headerlink" title="『内部作用』"></a>『内部作用』</h3><p><strong>对组织内部来说，“组织文化”是一种在组织中被绝大多数个体所认同，并会影响组织活动各个方面的，自觉性的“行事底线”，为组织起到了保护作用：对能够改进的个体进行同化，对难以完全同化的个体进行包容，对于完全无法同化的个体予以排斥。</strong></p><p>打个比方来说，若把组织视作一个生命体，那么“组织文化”便是组织机体的免疫器官，能够保障组织机体的健康运作。</p><p>这里面特别需要强调的是，就好比现实中的免疫器官一样：</p><blockquote><p>免疫器官对于那些有危险性的物质并不是全部进行“清除”的，它会对一些还未产生作用的危险性物质进行“忽略”。</p><p>比如乙肝病毒，如果乙肝病毒存在于人体中，既没有复制，也没有产生伤害，那么免疫系统则会与其“和平相处”，这时候产生的结果就是“乙肝病毒携带”。</p><p>如果乙肝病毒被某种因素激发，开始复制并对机体产生伤害，这时候免疫系统就会毫不留情的展开“清除”行动，而这个“清除”的过程所展现出来的病症就是“乙型肝炎”，如果不能有效的治疗和控制这个过程，最终就会导致“肝硬化”，甚至“肝癌”。</p></blockquote><p>为了避免拿“病毒”举例而导致争论，我特别要科普一下：</p><blockquote><p>并非所有的病毒都会导致疾病，因为许多病毒的复制并不会对受感染的器官产生明显的伤害。</p><p>一些病毒，如艾滋病毒，可以与人体长时间共存，并且依然能保持感染性而不受到宿主免疫系统的影响，即“病毒持续感染”（viral persistence）。</p><p>但在通常情况下，病毒感染能够引发免疫反应，消灭入侵的病毒。而这些免疫反应能够通过注射疫苗来产生，从而使接种疫苗的人或动物能够终生对相应的病毒免疫。</p><p>还有许多病毒对人类则产生过重大的帮助，比如众所周知的牛痘病毒，它帮助了人类消灭了天花，挽回了无数人的性命。甚至还有艾滋病毒，它是极其有用的基因治疗载体，应用 HIV 载体的 CAR-T 疗法已经在癌症治疗表现出巨大的潜力。</p></blockquote><p>看到了吧？<strong>“病毒”是一个名词，并无褒贬之意</strong>，所以无需产生不必要的反感。</p><p>而上面这个科普是有意义的，它恰恰通过生命体与病毒的关系，反应了“组织文化”对待“不合群个体”的方式：</p><ul><li><strong>改进</strong>——通过组织文化的影响力，借助正确的方法，去改进“不合群个体”，或发现其长处并合理利用，</li><li><strong>包容</strong>——接受那些看似“不合群”却不会对组织产生威胁或伤害的个体，并与其共存。</li><li><strong>排斥</strong>——对于那些努力进行“改进”和“包容”却依然无法改变的，会对组织 产生威胁或伤害的个体予以排斥。</li></ul><p><strong>在现实中，基于组织文化的“排斥”并不是一种直接的动作，而是一种无声无息的间接影响。</strong></p><p>例如：</p><ul><li>因为一个团队基于组织文化所产生的共识，一位处于试用期的个体未能通过试用期。</li><li>一个不能认同组织文化的个体，自行选择了离开。</li></ul><p>你会发现，组织文化并没有直接对上述个体进行“排斥”，而是间接产生的影响。</p><p>但是，不同组织的“组织文化”对那些“不合群个体”的“包容”和“排斥”是一样的吗？</p><h3 id="『组织文化的包容和排斥程度』"><a href="#『组织文化的包容和排斥程度』" class="headerlink" title="『组织文化的包容和排斥程度』"></a>『组织文化的包容和排斥程度』</h3><p>根据观察和总结，不同组织之间，其“组织文化”对于“不合群个体”的“包容”和“排斥”的方式及程度差异非常大。</p><p>而且，即使是同一个组织，其方式和程度还会因为一系列复杂因素而产生变化。</p><p>拿人类历史上最为久远、稳定和科学的两个组织——“军队”和“宗教”来举例：</p><blockquote><p>军队的“组织文化”基于其存在目的、高度集中的组织结构和命令式的作风，对于“不合群个体”的相对其他组织来说更加“难以包容”，往往会使用非常严厉的强制性方法进行“改进”。在和平时期，那些违反“行为准则”的官兵可能收到“训斥”或“关禁闭”，但是在战争中，则很有可能被“枪毙”。</p><p>宗教的“组织文化”相对于军队来说，则更加的“包容”，其组织形式相对而言更松散，也更多使用说服式的方式。但是，不同的宗教，基于其信仰和价值观，对待本教中那些“异端”的方式则截然不同，有些宗教会非常的极端，有些宗教则会更加的“宽容”。</p></blockquote><p>从上面两个例子来看，就能发现，<strong>“组织文化的包容和排斥程度”会基于时间、环境、价值观等因素而产生差异和变化。</strong></p><p>所以，一定要记住：</p><p><strong>在讨论一个组织的“组织文化”时应当保持足够的客观，也要全面的了解各种因素可能产生的影响。</strong></p><hr><h2 id="部分参考资料"><a href="#部分参考资料" class="headerlink" title="部分参考资料"></a>部分参考资料</h2><ul><li><a href="https://zh.wikipedia.org/wiki/%E7%BB%84%E7%BB%87%E6%96%87%E5%8C%96">维基百科</a></li><li><a href="http://wiki.mbalib.com/wiki/%E7%BB%84%E7%BB%87%E6%96%87%E5%8C%96">MBA 智库</a></li><li>《领导力必读十二篇》</li><li>《精益企业》</li></ul><hr><h2 id="欢迎关注我的微信公众号"><a href="#欢迎关注我的微信公众号" class="headerlink" title="欢迎关注我的微信公众号"></a>欢迎关注我的微信公众号</h2><p>微信搜索：<code>枪炮与代码</code>，或者搜索公众号ID：<code>guns_n_code</code></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-wechat.png" alt="枪炮与玫瑰"></p>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;由于论述相关问题的书籍和资料特别多，文字描述也五花八门，所以本文会基于我目前所分析总结的认知，以相对比较好理解的文字来进行阐述。&lt;/p&gt;
&lt;p&gt;为了避免某些无意义的争论，我刻意在文章中去掉了“&lt;strong&gt;企业&lt;/strong&gt;”二字，因为这个名词可能让一部分人反感，所以我使用了更加本质和“纯洁”的“&lt;strong&gt;组织&lt;/strong&gt;”二字，因为，&lt;strong&gt;“企业文化（Corporate Culture）”即“组织文化（Organisational Culture）”，它是“组织文化”在企业管理领域的一个具体的领域名词&lt;/strong&gt;，这种词汇上的选择有助于让我们思考问题的时候回归本源。&lt;/p&gt;</summary>
    
    
    
    <category term="组织的领导与管理" scheme="https://huhao.dev/categories/%E7%BB%84%E7%BB%87%E7%9A%84%E9%A2%86%E5%AF%BC%E4%B8%8E%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="组织文化" scheme="https://huhao.dev/tags/%E7%BB%84%E7%BB%87%E6%96%87%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>打造基于Linux的高效学习和工作环境：发行版选择篇</title>
    <link href="https://huhao.dev/posts/f6d4160c/"/>
    <id>https://huhao.dev/posts/f6d4160c/</id>
    <published>2016-06-03T04:19:33.000Z</published>
    <updated>2016-06-03T04:19:33.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="什么是-Linux-发行版？"><a href="#什么是-Linux-发行版？" class="headerlink" title="什么是 Linux 发行版？"></a>什么是 Linux 发行版？</h2><p>我默认看此文章的是初学者水平的朋友，所以，看到“发行版”三个字的时候，我默认你是两眼一抹黑的状态……</p><p>所以，为了节省篇幅，我首先引入一篇科普性介绍，另外也强烈推荐文章中的各种相关名词解释，有助于你更好的了解 Linux 及其相关的背景知识：</p><p><a href="https://zh.wikipedia.org/wiki/Linux%E5%8F%91%E8%A1%8C%E7%89%88">维基百科：Linux 发行版</a></p><p>Ok，如果你看完了上面这个介绍，我来总结一句话表达下什么是发行版：</p><p>“我们通常所说的 Linux ，从严格意义上来讲，指的是 <strong><a href="https://zh.wikipedia.org/wiki/Linux%E5%86%85%E6%A0%B8">Linux 操作系统内核</a></strong>。由于 Linux 是一套开源、自由的操作系统，所以我们最终使用的所谓的 Linux 操作系统，是由许许多多个人爱好者、开源组织或商业公司在此内核之上构建的形形色色的，让用户直接可用的最终版本。”</p><p>从维基百科上的发行版关系图就能看出现有的 Linux 发行版到底有多么“形形色色”：</p><p><a href="https://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg">点此查看大图</a></p><p>怎么样？怕了吧？哈哈哈哈哈哈哈哈哈哈哈……（幸灾乐祸的笑声……）</p><span id="more"></span><h2 id="初学者应当选择怎样的发行版？"><a href="#初学者应当选择怎样的发行版？" class="headerlink" title="初学者应当选择怎样的发行版？"></a>初学者应当选择怎样的发行版？</h2><p>基于我们近两年来 Linux 的软件开发训练实践，为了选择一个最适用于大学生群体的 Linux 发行版，我们在众多流行的发行版中进行了长期的试用和筛选，包括 <a href="http://cn.ubuntu.com/">Ubuntu</a>、<a href="https://www.linuxmint.com/">Linux Mint</a>、<a href="https://getfedora.org/">Fedora</a>、<a href="https://www.opensuse.org/">openSUSE</a>，以及国产的优秀发行版 <a href="https://www.deepin.org/">Deepin</a> 等。</p><p>为了更好的让大家了解它们的背景，而不在此文中加入大量别的地方都有的每个发行版的介绍，我在此引入一些维基百科上这些发行版的资料：</p><ul><li><a href="https://zh.wikipedia.org/wiki/Ubuntu">维基百科：Ubuntu</a></li><li><a href="https://zh.wikipedia.org/wiki/Linux_Mint">维基百科：Linux Mint</a></li><li><a href="https://zh.wikipedia.org/wiki/Fedora">维基百科：Fedora</a></li><li><a href="https://zh.wikipedia.org/wiki/openSUSE">维基百科：openSUSE</a></li><li><a href="https://zh.wikipedia.org/wiki/%E6%B7%B1%E5%BA%A6%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F">维基百科：Deepin</a></li></ul><p>通过不断的实践和总结（踩过无数的坑），我们认为一款适用于中国在校大学生的 Linux 发行版应当具备以下特性：</p><ul><li>硬件兼容性要强，以便应对学生手中形形色色的笔记本所带来的挑战。</li><li>社区资源、学习资料要丰富，网上获取资料要方便。</li><li>在足够流行的前提下，要足够的纯粹和国际通用化，避免使用衍生版或者类似某些所谓国产操作系统那样低级的加壳版本，以便在遇到问题时能够排除不一致因素的干扰。</li><li>稳定性要高，不要三天两头的折腾系统上的各种问题。</li><li>易用性要强，要让初学者易于上手，同事也要具备充足的快捷键来辅助熟练后的进阶使用需求。</li><li>软件资源，尤其是自身软件仓库（软件源）中的应用软件要足够丰富，版本足够新，如果自身软件仓库中没有，也要方便从第三方源获取，或者有足够多现成的二进制安装包。</li><li>中文支持要好，这并不是指中文界面（相反，我们教学时推荐甚至要求使用英文环境，以便提升学生的英文水平和适应未来工作需要，英语是一个优秀软件工程师的必备要求），而是指对于中文显示和中文输入的支持是否良好，尽可能避免折腾中文或输入法的配置。</li></ul><p>有了这几个维度作为评价参考，我们在选择上就会变的相对容易了（然而依然非常的纠结）。而需要注意的是，随着各大发行版的持续更新，最符合以上标准的发行版是一个持续变化的过程，所以大家应当与时俱进，选择最适合的发行版。</p><p>而为了尽可能以不变应万变，我们强烈推荐初学者使用基于 <a href="https://zh.wikipedia.org/wiki/Debian">Debian</a> 系的 Linux 发行版：</p><ul><li><a href="http://cn.ubuntu.com/">Ubuntu</a>（写这篇文章的时候最新版为 Ubuntu 16.04 LTS）</li></ul><p>另外，对于学习能力和动手能力更高，略微极客范的同学，我们还推荐另一个基于 <a href="https://zh.wikipedia.org/wiki/Red_Hat_Linux">Red Hat</a> 系的 Linux 发行版：</p><ul><li><a href="https://getfedora.org/">Fedora</a>（写这篇文章的时候最新版为 Fedora 23）</li></ul><p>以上两个发行版都各有优势，它们在使用上的差别主要是由以下几个方面造成的：</p><ul><li>源于不同的鼻祖（Debian 和 Red Hat）</li><li>使用了不同的包管理器（APT 和 DNF）</li><li>官方默认内置了不同的图形化桌面环境（Unity 和 GNOME）</li></ul><p>然而在统一的 Linux 内核之下，它们本质上都是一样的，而作为一个有经验的人，其实用什么发行版都只是个人兴趣而已。</p><p>在后续的文章中，我会同时以这两个操作系统来作为基础环境，来对文章内容进行说明。</p><h2 id="为什么选择-Ubuntu-而不是-Linux-Mint？"><a href="#为什么选择-Ubuntu-而不是-Linux-Mint？" class="headerlink" title="为什么选择 Ubuntu 而不是 Linux Mint？"></a>为什么选择 Ubuntu 而不是 Linux Mint？</h2><p>首先，我必须要强调的是 Linux Mint 作为一个主要版本基于 Ubuntu（也有直接基于 Debian 的版本）并且几乎是目前关注度排行第一的发行版，确实是非常优秀的！并且我们曾在长达一年的在校训练中采用了此发行版。</p><p>但是，由于其作者出于稳定性的原因，将当前 Linux Mint 17 系列锁定在基于 Ubuntu 14.04 LTS 的基础之上，所以导致它的软件源中的软件及 Linux 内核版本都不够新，尤其是后者，虽然能通过手动更新的方式更新至较新的 Linux 内核，但是由于安装包所内置内核版本的原因，会导致在很多较新的硬件环境下遇到安装时的问题。</p><p>另外，作为 Linux Mint 默认使用的广受好评的 Cinnamon 图形化桌面环境，截至到目前为止都还未很好的处理高分辨率屏幕的 DPI 多级缩放（只能在 1x 和 2x 中选择），所以这一点要比 Ubuntu 的 Unity 差了许多（现在高于 1080p 分辨率的笔记本电脑越来越多，在笔记本的小尺寸屏幕上，如果不能多级调节 DPI 缩放，比如 150%，是非常痛苦的）。</p><p>而当前的 Ubuntu 16.04 由于各方面表现的都要比 Linux Mint 17.3 要好，所以我们“暂时”刻意的选择了 Ubuntu 而不是 Linux Mint。</p><p>但是，就和之前所说的一样，我们需要与时俱进，在未来灵活的去选择最适合的发行版。</p><h2 id="为什么不选择-Deepin？"><a href="#为什么不选择-Deepin？" class="headerlink" title="为什么不选择 Deepin？"></a>为什么不选择 Deepin？</h2><p>Deepin（深度操作系统）是目前国内原创 Linux 发行版中表现最为出色，也是最为“原创”的。我们对于该发行版及其团队的开源精神也保持着非常高的敬佩之心。</p><p>但是，客观来说，当前 Deepin 还需要在兼容性和稳定性上进行更多的提升。另外，Deepin 社区也需要时间进行更大的发展。</p><p>所以，基于“向学习软件开发的 Linux 初学者”推荐最适合的发行版的原因，我们也“暂时”搁置了 Deepin。</p><p>虽然如此，我们依然强烈推荐大家去尝试一下 Deepin，并多多向其开发团队提供反馈和改进意见，以便让 Deepin 变得更好。</p><p>我们希望终有一天，能够用国产的优秀 Linux 发行版进行教学实践，Deepin，任重而道远！</p><h2 id="为什么不选择-openSUSE？"><a href="#为什么不选择-openSUSE？" class="headerlink" title="为什么不选择 openSUSE？"></a>为什么不选择 openSUSE？</h2><p>openSUSE 也非常优秀，但是无奈相对于以上的发行版，openSUSE 太小众（国内更小众），而且确实不太适合初学者，所以没有采用……</p><p>但是，我们依然还是推荐大家去尝试包括 openSUSE 在内的众多其它 Linux 发行版，以便大家对于 Linux 社区有更加全面的认识。</p><hr><h2 id="欢迎关注我的微信公众号"><a href="#欢迎关注我的微信公众号" class="headerlink" title="欢迎关注我的微信公众号"></a>欢迎关注我的微信公众号</h2><p>微信搜索：<code>枪炮与代码</code>，或者搜索公众号ID：<code>guns_n_code</code></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-wechat.png" alt="枪炮与玫瑰"></p>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;什么是-Linux-发行版？&quot;&gt;&lt;a href=&quot;#什么是-Linux-发行版？&quot; class=&quot;headerlink&quot; title=&quot;什么是 Linux 发行版？&quot;&gt;&lt;/a&gt;什么是 Linux 发行版？&lt;/h2&gt;&lt;p&gt;我默认看此文章的是初学者水平的朋友，所以，看到“发行版”三个字的时候，我默认你是两眼一抹黑的状态……&lt;/p&gt;
&lt;p&gt;所以，为了节省篇幅，我首先引入一篇科普性介绍，另外也强烈推荐文章中的各种相关名词解释，有助于你更好的了解 Linux 及其相关的背景知识：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zh.wikipedia.org/wiki/Linux%E5%8F%91%E8%A1%8C%E7%89%88&quot;&gt;维基百科：Linux 发行版&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ok，如果你看完了上面这个介绍，我来总结一句话表达下什么是发行版：&lt;/p&gt;
&lt;p&gt;“我们通常所说的 Linux ，从严格意义上来讲，指的是 &lt;strong&gt;&lt;a href=&quot;https://zh.wikipedia.org/wiki/Linux%E5%86%85%E6%A0%B8&quot;&gt;Linux 操作系统内核&lt;/a&gt;&lt;/strong&gt;。由于 Linux 是一套开源、自由的操作系统，所以我们最终使用的所谓的 Linux 操作系统，是由许许多多个人爱好者、开源组织或商业公司在此内核之上构建的形形色色的，让用户直接可用的最终版本。”&lt;/p&gt;
&lt;p&gt;从维基百科上的发行版关系图就能看出现有的 Linux 发行版到底有多么“形形色色”：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg&quot;&gt;点此查看大图&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;怎么样？怕了吧？哈哈哈哈哈哈哈哈哈哈哈……（幸灾乐祸的笑声……）&lt;/p&gt;</summary>
    
    
    
    <category term="打造基于Linux的高效学习和工作环境" scheme="https://huhao.dev/categories/%E6%89%93%E9%80%A0%E5%9F%BA%E4%BA%8ELinux%E7%9A%84%E9%AB%98%E6%95%88%E5%AD%A6%E4%B9%A0%E5%92%8C%E5%B7%A5%E4%BD%9C%E7%8E%AF%E5%A2%83/"/>
    
    
    <category term="Linux" scheme="https://huhao.dev/tags/Linux/"/>
    
  </entry>
  
  <entry>
    <title>我和思沃学院（二）：缘起</title>
    <link href="https://huhao.dev/posts/8c4d00f3/"/>
    <id>https://huhao.dev/posts/8c4d00f3/</id>
    <published>2016-05-29T16:19:00.000Z</published>
    <updated>2016-05-29T16:19:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="新人报到"><a href="#新人报到" class="headerlink" title="新人报到"></a>新人报到</h2><p>入职第一天，一群同一天入职的同事们坐在会议室里，等待接下来去加入新的工作岗位，每个人脸上和眼中都洋溢着喜悦的憧憬。</p><p>在那个时候，办公室中的新人入职，会到每一个团队那里相互进行自我介绍，了解每一位在办公室里的同事，让新人快速融入公司。（很可惜后来公司人越来越多，这种介绍花费的时间成本太高，所以取消了）</p><p>漂亮大方的 HR 妹子像一个快乐精灵一样带着一群懵懂的新人从这个桌子走到那个桌子，在每个桌子前大家起立并相互自我介绍，然后从 15 楼转到 11 楼……</p><p>就在我们转到 11 楼一张略显空荡的桌子的时候（那时候 11 楼基本一半以上是空的），我注意到一个满脸大胡子，造型非常个性，却显得很有内涵和技术大牛范儿的人，我的第一印象觉得他可能是个老外，或者是华裔，再或者是个港澳同胞吧！</p><p>他略显羞涩并且带着京腔自我介绍到：</p><p>“大家好，我是来自北京办公室的仝键，现在正在西安出差，我现在正在从事教育和培训相关的工作，大家以后应该能经常见到我！”</p><p>我靠，他居然是个中国人！</p><span id="more"></span><h2 id="初识仝键"><a href="#初识仝键" class="headerlink" title="初识仝键"></a>初识仝键</h2><p>入职的第二天我就赶上了西安办公室的 New Hire Orientation。</p><p>而这位大胡子仝键，居然也在 New Hire Orientation 上有一个分享（现在在公司混久了才明白，哪里有啥居然，分明就是他那会儿最闲，被抓壮丁了嘛！哈哈哈！哈哈！哈……！），分享的主题我已经记不起来了，分享的主要内容是公司的P3业务（追求社会公平与公正），另外结合他自身的经历，来讲一讲他对 ThoughtWorks 文化的认识以及个人在公司的成长，再有一个就是他正在从事的“教育事业”。</p><p>具体的细节也已经记不起来了，除了公司的 P3 业务（积极提倡社会和经济公正）的由来，到现在我的记忆中只记住了印象深刻，并且反复出现的一些片段：</p><blockquote><p>“我之前平均一年跳一家公司”，<br>“ThoughtWorks 是我呆的最长的一家公司”，<br>“在自由与平等之间，ThoughtWorks 永远优先选择平等”，<br>“王侯将相宁有种乎？”，<br>“人与人之间天分上的差异究竟真的会导致人不能干好工作吗？我们又不是在争夺诺贝尔奖”，<br>“现在的计算机相关教育与工作实际脱节太大”，<br>“每个人的机会是不均等的”，<br>“很多人上不了好的学校真的就是因为不够聪明吗？”，<br>“我就是想去通过实践去验证并改变这些事情”……<br>……<br>……<br>“ThoughtWorks 这个公司相比‘如果……怎样……’，更加看重‘既然……怎样……’，也就是说如果你在某一个领域已经有所产出，并且这件事情符合公司的三个使命，那么公司就会去想办法支持你做”，<br>“在一个扁平化的公司，决定一个人地位就要靠领导力，用领导力去吸引其他人追随你的脚步”，<br>（注意，以上两句对我和后续的工作中的各种做事方法影响特别大。）<br>……<br>……<br>……</p></blockquote><p>忽略前面公司 P3 业务（然而这确实是让我对公司 P3 业务产生震撼认识的开始）、公司文化和个人成长的部分，当时我对他正在从事的工作的认识就是：他从他的经历出发，看到这个世界上有很多人将人生的不如意，尤其是这个行业中个人成长的差异归结为“天分”造成的差异，然而他认为造成这些问题的主要原因是因为每个人成长经历和成长环境造成的机会不均等的问题。那么从公司所追求的三大使命之一——追求社会和经济的公平与公正出发，我们应当去做一些事情来改变这种情况（并且他已经在石家庄等地实践了一年的人才培养）。</p><p>一番充满激情的演讲之后，大胡子说道：</p><p>“如果你也对我正在做的事情感兴趣，欢迎你来和我聊一聊，我现在正在寻找志同道合的团队成员，我就坐在  11楼一进门右手边的桌子上。”</p><p>哎呀，我去！这事儿是我的菜！</p><h2 id="埋在心底的“不爽”"><a href="#埋在心底的“不爽”" class="headerlink" title="埋在心底的“不爽”"></a>埋在心底的“不爽”</h2><blockquote><p>话题又被残忍的扭到了另一边</p></blockquote><p>我要来说说为啥这事儿是我的菜？</p><p>看过我上一篇和我博客的朋友应该已经了解了我过去的人生经历：一个考了三次高考都没考上军校的熊孩子，在总装当了5年汽车兵，然后自学编程北漂4年，再然后回西安干了一年多 Offshore，再再然后 SOHO 了没多久来到了 ThoughtWorks。</p><p>我在北京漂着的那四年（2008年至2012年），恰好正是中国“屌丝”文化崛起并“大行其道”的四年，而这种屌丝文化的背后推手不是别人，恰恰是我们自己这个行业。</p><p>PS: 最近我在北京面试“女生特训营”的女生时，一个非技术背景女生用这样一段话给我描述了我们这个行业给她的印象：</p><p>“我觉得你们这个行业特别有意思，我看其它行业都是被别人黑，只有你们这个行业是自己把自己往死里黑！”</p><p>我真是哭笑不得，IT 行业社会影响力可见一斑。</p><p>因为我的军人世家出身，从小接受的教育就是要坚强，要勇敢，出了错要敢于自己承担。再加上个人经历相对曲折，同时又是个坚定的唯物主义者，我总结并特别信奉这样几个道理：</p><p>“凡事预则立，不预则废。”</p><p>“自己混得不好，别怪别人，别怪社会，要怪只怪自己不努力，这世界上因为‘点儿背’而悲惨的人就好比大海中的沙粒。”</p><p>“人最重要的是成就感，最需要警惕的是自卑感，我们需要不断地用自己一点点的成就感去一点点的战胜自己的自卑感。”</p><p>所以我特别不能接受这种“屌丝”文化，尤其是“码农”这个词语所带来的负能量，尤其我认为“码农”二字就是对于这个职业从本质和精神上的双重亵渎！</p><p>尤其是当以下两种事情发生的时候，几乎可以让我火冒三丈：</p><p>父母的各种朋友经常问：“哎呀，你看你没上过大学还在程序员这行业混得这么好，我家孩子拿的工资那么少还成天加班，平时也不见他学习，连个对象都找不到，都快成屌丝了，你要不给他教教呗？”<br>问同事，尤其是工作经验和资历都比我久的同事：“你这代码这样写以后会有 XXXX 的问题啊！（大家不需要我举例了吧？我相信大家知道很多可以填进去的例子）”，然后对方答道：“我这么写现在又没出 Bug，你操心个毛啊？”</p><p>每当这样的时候，我都会在心理大骂：</p><p>“活该你屌丝！谁让你不努力！谁让你做事儿不专业！”</p><p>加上我以前从部队养成的暴脾气，我好几次因为此类争吵差点与同事动手……</p><p>随着天南海北的出差，工作的不断变动，从观察别人到面试别人，接触了越来越多的人和事儿，久而久之，我心里就产生了这样几个疑问：</p><ul><li>编程这事儿真的就那么难学吗？觉得难学的原因到底是什么？</li><li>为什么这么多计算机专业的学生，优秀的，或者能达到做事儿靠谱这么低要求的人却看起来很少？</li><li>为什么这个行业充满了负能量？而正能量却压不住这些负能量？</li><li>我们这个行业与别的行业相比，在对人的做事方式和对人的素质要求上到底有什么区别？</li></ul><p>我开始不断的思考，并通过主动提升自己的知识和能力来尝试自己寻找这些问题的答案……</p><h2 id="我的答案"><a href="#我的答案" class="headerlink" title="我的答案"></a>我的答案</h2><p>首先，我认为社会上存在的很多客观的经济、政治、体制因素确实是导致一些机会不均等或者行业现状的重要原因，因为对于这部分的因素来说我的力量太过渺小，所以我能够理解、接受并且适应这些情况，在下面也不会集中大篇幅去说，毕竟我不是个在社会学或者经济学方面有深入研究的人，没有多少这些方面的专业用语和词汇去形成文字表达和论证自己的想法（但是我会在以后文章中一些重要的节点去讲这些东西）。</p><p>但是，在以下两个与我们个人本身更加相关的方面，我认为我是可以做出一些事情去影响别人的，哪怕只有一个公司，一个团队，或者几个人：</p><ol><li>我们每个人出生时的那一刻，就决定了每个人的不平等，即使我们很努力，也依然很难消除这种不平等所带来的差异。但是，努力总是比不努力有大得多的几率获得回报，唯一的问题应该是，如何努力才是效率最高的？</li><li>我们自己如何认识我们这个行业（ IT 行业）？在我看来，我们说到底就是个服务行业和科研行业的混合体，而且从市场占有率来看，服务性质的比重占得更大，那既然是这样，仅在服务这个领域来说，和其它服务行业并没有什么不同。说到底，“客户就是上帝”这句话已经决定了我们的做事方式，那就是：“出了问题，请从自己身上找问题，不要从客户身上找问题。”但是，绝大多数人却认识不到这一点，总是觉得软件工程师是一个很“傲娇”或者“高贵”的行业，认为我们自己才是真正的“专家”，所以可以去肆意的无视业务需求，无视客户需求。如何才能改变这样“与身份不符”的认识？</li></ol><p>这两个问题萦绕在我脑海之中，回想我自己的成长道路，我仔细思索这两个问题最根本的原因，最后形成了自己的两个答案（虽然现在看起来，还是比较简单和单纯的，但是这却是后续一系列认识爆炸的“奇点”）：</p><p>首先，我这一路走来，98% 的时间都是自己一个人在学习和寻找方向，剩下的 2% 是来自长辈和前辈的重要帮助和引导，虽然比重不大，但是节省了不少的时间。在过去的日子里，自己走过数不清的坑，周围的同事并不会主动来帮助我，甚至还有人会开心的看着我掉下去，但幸好我最终都自己爬出来了。在那四到五年的时间里，如果我能在关键的几个时间点和问题点上得到及时的指引和帮助，我相信我至少能够节省30%的混沌时间来让我有更大的进步和成就。所以，第一个问题的答案就是：</p><p>“<strong>对于一个很努力，或者之前不努力但是只要找到方法就能激发努力潜能的人，他需要的是一个合格的人生导师，这位导师只需要有能力在他混沌的时候告诉他前方怎么走就好了，这个人必然会自己很好的走下去，所谓出身或者天分，影响的无非只是需要耗费的时间。”</strong></p><p>接下来，第二个问题。影响人们的认识，尤其是影响一大群人的认识太难。那么我为什么会有这样的认识呢？嗯，是家庭教育，是成长环境，是人生经历，问题是这些并不能复制到别人身上啊？每个人的成长都是不同的，换句话说，每个人的三观是不同的，除非干一件事情，尤其是作为一个久经共产主义信仰熏陶的人（我是很认真的在说这句话）特别能想到的一件事情：</p><p>“<strong>洗脑！”</strong></p><p>从谁开始洗？</p><p>“<strong>从祖国未来的花朵开始洗！”</strong></p><p>所以，第二个问题的答案就是：</p><p>“<strong>从学生开始，用‘正确’的三观（加引号代表其实是我的，然而我的也是来自于社会的）来影响他们，用正能量去引导和鼓励他们，战胜负能量，告诉他们怎样做事是正确的！总有一天，世界是他们的！”</strong></p><p>所以，从有了这两个答案之后（我已经记不起具体是啥时候了），我开始留意是否有机会能够让我去接触和帮助学生。</p><p>幸运的是，我接触到好几个正在上学的学生，并且各种巧合的给与了他们帮助，而且自己写了前一篇提到的《从士兵到程序员再到 SOHO 程序员》<br>这样的系列博客，从互联网上去影响更多的人。</p><p>而一个更重要的机会，是因为 Google Developer Group 中好基友谢凌、金天等人的关系，我专门在欧亚学院的 GDG 活动中给学生们做过一个叫做《我的程序员之路》的演讲，那天老师把整个信息工程学院大一大二的学生都叫到了阶梯教室，这也是我第一次在这么多学生面前做分享。细节不再描述，但这次演讲让我看到了学生们眼中唤起的希望，让我有了极大的动力去做更多类似这样的事情。</p><p>比较有意思的是，后来我们培养的第一批欧亚学院的学生刚好就是当时大二的这批学生，他们告诉我，这次演讲对他们影响是很大的，至少，他们知道原来写代码这事儿并不是那么难以挑战。</p><p>下面用当时唯一在微博上留下过感叹的学生，也就是我们培养的今年入职的毕业生杜颖同学拍的照片和微博截图来纪念一下那一天，那一天是 2013 年 12 月 29 日，离我加入 ThoughtWorks 还有四个月：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-112126.png" alt="《我的程序员之路》@西安欧亚学院"></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-112134.jpg" alt="与杜颖同学的对话"></p><h2 id="投名状"><a href="#投名状" class="headerlink" title="投名状"></a>投名状</h2><blockquote><p>话题终于被拽回了主线……</p></blockquote><p>New Hire Orientation 的第二天中午，我来到11楼办公室，进门右手边的那张桌子上，找到了正在埋头打字的仝键，告诉了他我的经历和我的来意，在一番沟通之后：</p><p>仝键：“加入我这个事业，要保证至少三年不能上项目。”</p><p>我：“没问题，我已经把项目做腻了。”</p><p>仝键：“如果你加入，什么时间能来？”</p><p>我：“我希望完成我现在的项目，了解更多的 ThoughtWorks 文化和做事方式。”</p><p>仝键：“好，我会去了解你的项目安排，接下来的时间我们可以先做一些教育方面的尝试（这事儿下一篇会说到），balabalabala……”</p><p>我：“没问题。”</p><p>在我离开的时候，我看到了仝键那长长的睫毛下眼睛里的闪光，还有大胡子下隐隐约约神秘的微笑。</p><p>后来，我才明白，这就是传说中那种：</p><p>守株待兔般的快感啊！我@#￥%……</p><hr><h2 id="欢迎关注我的微信公众号"><a href="#欢迎关注我的微信公众号" class="headerlink" title="欢迎关注我的微信公众号"></a>欢迎关注我的微信公众号</h2><p>微信搜索：<code>枪炮与代码</code>，或者搜索公众号ID：<code>guns_n_code</code></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-wechat.png" alt="枪炮与玫瑰"></p>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;新人报到&quot;&gt;&lt;a href=&quot;#新人报到&quot; class=&quot;headerlink&quot; title=&quot;新人报到&quot;&gt;&lt;/a&gt;新人报到&lt;/h2&gt;&lt;p&gt;入职第一天，一群同一天入职的同事们坐在会议室里，等待接下来去加入新的工作岗位，每个人脸上和眼中都洋溢着喜悦的憧憬。&lt;/p&gt;
&lt;p&gt;在那个时候，办公室中的新人入职，会到每一个团队那里相互进行自我介绍，了解每一位在办公室里的同事，让新人快速融入公司。（很可惜后来公司人越来越多，这种介绍花费的时间成本太高，所以取消了）&lt;/p&gt;
&lt;p&gt;漂亮大方的 HR 妹子像一个快乐精灵一样带着一群懵懂的新人从这个桌子走到那个桌子，在每个桌子前大家起立并相互自我介绍，然后从 15 楼转到 11 楼……&lt;/p&gt;
&lt;p&gt;就在我们转到 11 楼一张略显空荡的桌子的时候（那时候 11 楼基本一半以上是空的），我注意到一个满脸大胡子，造型非常个性，却显得很有内涵和技术大牛范儿的人，我的第一印象觉得他可能是个老外，或者是华裔，再或者是个港澳同胞吧！&lt;/p&gt;
&lt;p&gt;他略显羞涩并且带着京腔自我介绍到：&lt;/p&gt;
&lt;p&gt;“大家好，我是来自北京办公室的仝键，现在正在西安出差，我现在正在从事教育和培训相关的工作，大家以后应该能经常见到我！”&lt;/p&gt;
&lt;p&gt;我靠，他居然是个中国人！&lt;/p&gt;</summary>
    
    
    
    <category term="从士兵到程序员再到咨询师" scheme="https://huhao.dev/categories/%E4%BB%8E%E5%A3%AB%E5%85%B5%E5%88%B0%E7%A8%8B%E5%BA%8F%E5%91%98%E5%86%8D%E5%88%B0%E5%92%A8%E8%AF%A2%E5%B8%88/"/>
    
    
    <category term="ThoughtWorks" scheme="https://huhao.dev/tags/ThoughtWorks/"/>
    
    <category term="思沃学院" scheme="https://huhao.dev/tags/%E6%80%9D%E6%B2%83%E5%AD%A6%E9%99%A2/"/>
    
  </entry>
  
  <entry>
    <title>我和思沃学院（一）：成为 ThoughtWorker</title>
    <link href="https://huhao.dev/posts/8a2f70fd/"/>
    <id>https://huhao.dev/posts/8a2f70fd/</id>
    <published>2016-05-29T15:58:00.000Z</published>
    <updated>2016-05-29T15:58:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>2015 年 12 月 1 日</p><p>再有四个半月，我来到 ThoughtWorks 就有两年了（2014年04月08日入职），新的 MacBook Pro 正在冲我招手，突然觉得，时间过得如飞速一般，我当义务兵的那两年咋就没觉得时间有这么快呢？这说明，我度过的这两年是相当充实且有意义的。</p><p>在加入 ThoughtWorks 三个月后，我就从国内交付项目上转入了思沃学院团队（那时还是个没有名字且加上我只有三个人的团队），到现在已经一年零五个月了，所以，这篇文章注定篇幅短不了。<br>为了能够给大家补充更多的上下文，更加全面的从我的角度去了解思沃学院，所以，接下来将从我加入 ThoughtWorks 开始，来讲述这个故事。</p><span id="more"></span><p> ##SOHO 工作的结束</p><p>其实，加入 ThoughtWorks 是个“机缘巧合”与“念念不忘”各占50%的事情。为什么这么说呢？</p><p>这要先从我之前 SOHO 的经历说起，这部分过于漫长，所以直接推荐大家阅读我之前写过，影响过很多拥有 SOHO 梦想的人，同时还被“大胡子校长”仝键计算并评价为“影响力换算成 GDP 足有千万”的系列博客：</p><p><a href="https://huhao.dev/categories/%E4%BB%8E%E5%A3%AB%E5%85%B5%E5%88%B0%E7%A8%8B%E5%BA%8F%E5%91%98%E5%86%8D%E5%88%B0%E5%92%A8%E8%AF%A2%E5%B8%88/">《从士兵到程序员再到 SOHO 程序员》</a></p><p>为什么仝老师会说这篇博客“影响力换算成GDP足有千万”呢？请看以下截图，这只是众多被影响者中的一个：</p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-26045-aa9bf9e3f4b7074e.png" alt="一次意外的 Skype 对话"></p><p>OK，如果看完这个系列博客，你就会明白我接下来说的事情（我这样夹带私货究竟好吗？）。</p><p>在我 SOHO 工作的最后阶段，我正经历着两件事情对于我是否要继续 SOHO 的考验：</p><p>结婚第一年，磨合比较激烈，正在和老婆吵架闹离婚（现在我们感情非常稳定，不用担心）；</p><p>我发现我是个宅不住的人，缺少直接面对面社交的机会使得人无法发泄某种骨子缝里的东西，同时也很难在面对不顺心的事情时，将注意力转移到其它地方。</p><p>身边的朋友们（尤其是 Ruby 社区和 SOHO 圈子的朋友们）看到我每天情绪低沉，注意力无法集中，成天生活在负能量中的样子，纷纷劝我先放弃 SOHO，重新走进办公室，以便分散注意力和调整好状态。在听从了大家诚恳且友好的建议之后，我说：</p><p>“好吧，让我先去面一面 ThoughtWorks。”</p><h2 id="了解-ThoughtWorks"><a href="#了解-ThoughtWorks" class="headerlink" title="了解 ThoughtWorks"></a>了解 ThoughtWorks</h2><blockquote><p>这里先跑偏一下</p></blockquote><p>说起来很有意思，ThoughtWorks 这个名字是我从北京回到西安以后才知道的，这作为一个在自学过程中看过很多敏捷相关的书，但是却有个看书从来不记人名和公司名这样一个坏习惯的人来说，是个很容易让人理解的事情。</p><p>我记得很清楚，当时我还在 S 公司，一家也在做欧美 Offshore 并且提倡敏捷的公司上班。有一天，大家在下午茶时间一起聊天，当时大家在点评西安这个地方各个能够叫上名来的软件公司，作为一个前北漂，为了知道一个一直想要了解的事情，开启了这样一个让本地土著们笑了半天的对话：</p><p>我：“西安最牛的软件公司是哪个？”</p><p>众人：“ThoughtWorks!”</p><p>我：“啥？骚啥沃克斯？”</p><p>众人笑翻：“ThoughtWorks 嘛！就是：Thought! Works!”</p><p>众人继续：“你看了那么多敏捷的书，居然不知道 ThoughtWorks？”</p><p>我：“呃……不要欺负没上过大学的人……”</p><p>好吧，于是乎，这样一个看起来似乎牛逼闪闪的公司名就记在了我的脑海中（现在看来，那时的我真的是有点井底之蛙……）：</p><p>ThoughtWorks，很厉害的样子，改天领教一下！</p><p>然而真正对 ThoughtWorks 有了更加全面和深入的了解，则是因为技术社区活动。</p><p>那时的我，经常混迹于 Open Party，Google Developer Group，还有我们一手推动并建立起来的西安 Rubyist 社区中，在这些社区里，我结识了一大票来自 ThoughtWorks 的员工，也正是因为他们，让我建立起了对 ThoughtWorks 的第一印象：充满技术热情，充满人生追求，充满正能量，充满专业态度。总结成一句话就是：</p><p>“这公司的人真TM专业，我太TM喜欢了！”</p><p>也正是因为他们，我才开始主动了解 ThoughtWorks，了解她的历史，了解她的文化，了解她的现状。最后，当时已经满脑袋想 SOHO 的我又总结并感叹了一句话：</p><p>“西安这地方，要是选择继续坐办公室的话，除了自己创业当老板，也就只能选 ThoughtWorks 了。”</p><h2 id="加入-ThoughtWorks"><a href="#加入-ThoughtWorks" class="headerlink" title="加入 ThoughtWorks"></a>加入 ThoughtWorks</h2><blockquote><p>话说回来</p></blockquote><p>做完去 ThoughtWorks 面试的决定之后，我给好基友王琰打了个电话说明了我的想法，王琰开（cai）心（mi）的（de）用“骚窝”标准的大众招聘用语回答了我：“想来 ThoughtWorks 啊！好啊好啊！我来帮你内推！”（可惜的是，当时没有赶上内推奖金制度调整，好亏啊……）</p><p>接下来，在接到“HR 男神”史小锋的电话不久之后，我来到了西安办公室进行面试。那天心情非常轻松，进到办公室后一票已经认识了的好友向我打招呼，并预祝我面试顺利。坐定之后，小峰哥用他迷人的笑容和嗓音对我说：“胡皓，我之前见过你（Rails Girls），我也知道你一点都不紧张（认识的人多）。”</p><p>也就是在这种状态下，我开始了我的面试。</p><p>然而，面试时逻辑题只做了8道，压力测试题木有做完（所以后来大家讨论了半天这人能不能要……），Pair 时发现之前的面试作业有个业务实现上没考虑全的 Bug，Office Interview 的时候自己发现因为野路子出身，之前光实践，却从来不咋记理论，只能从自己的理解出发来回答问题。一天结束后，我走出软件园大楼，感叹道：</p><p>“靠……这是我第一次做面试啊！”</p><p>是的，没错，这真的是我第一次做正式的面试，之前所有的公司都是内推、空降或者远程面试（然而绝大多数是笔试，面试只是谈人生谈理想），所以自己对于面试的感觉完全是：没有对比，没有感觉……</p><p>一个星期后，我收到了 ThoughtWorks 的 Offer ——一个白色的大信封袋，里面还有一条特别甜的德芙巧克力。那天西安的空气和阳光特别的好，阳光透过车窗照在身上，温暖舒适，却不猛烈。<br>在家，我拿着这个略显沉甸甸的信封袋，看了看其它三个可能性很大的 Remote 工作，脑子里几个词语不断地在激烈碰撞：“收入”、“梦想”、“机会”、“状态”……</p><p>经过了一晚上的认真思考，我对自己说：</p><p>“回办公室去吧。”</p><p>后来我问了几个当时参加了我的面试的同事，我面试的时候表现是怎样的？他们这样回答：</p><p>史小锋：“从现在开始到你离职以后，你都不会知道你逻辑题得了多少分的。”</p><p>刘尧：“你这三观太正了！”</p><p>王晓峰：“话太多……”</p><p>王琰：“你自学的经历还是很有说服力的。”</p><p>就这样，我加入了 ThoughtWorks，开始努力成为一名 ThoughtWorker。</p><hr><h2 id="欢迎关注我的微信公众号"><a href="#欢迎关注我的微信公众号" class="headerlink" title="欢迎关注我的微信公众号"></a>欢迎关注我的微信公众号</h2><p>微信搜索：<code>枪炮与代码</code>，或者搜索公众号ID：<code>guns_n_code</code></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-wechat.png" alt="枪炮与玫瑰"></p>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;2015 年 12 月 1 日&lt;/p&gt;
&lt;p&gt;再有四个半月，我来到 ThoughtWorks 就有两年了（2014年04月08日入职），新的 MacBook Pro 正在冲我招手，突然觉得，时间过得如飞速一般，我当义务兵的那两年咋就没觉得时间有这么快呢？这说明，我度过的这两年是相当充实且有意义的。&lt;/p&gt;
&lt;p&gt;在加入 ThoughtWorks 三个月后，我就从国内交付项目上转入了思沃学院团队（那时还是个没有名字且加上我只有三个人的团队），到现在已经一年零五个月了，所以，这篇文章注定篇幅短不了。&lt;br&gt;为了能够给大家补充更多的上下文，更加全面的从我的角度去了解思沃学院，所以，接下来将从我加入 ThoughtWorks 开始，来讲述这个故事。&lt;/p&gt;</summary>
    
    
    
    <category term="从士兵到程序员再到咨询师" scheme="https://huhao.dev/categories/%E4%BB%8E%E5%A3%AB%E5%85%B5%E5%88%B0%E7%A8%8B%E5%BA%8F%E5%91%98%E5%86%8D%E5%88%B0%E5%92%A8%E8%AF%A2%E5%B8%88/"/>
    
    
    <category term="ThoughtWorks" scheme="https://huhao.dev/tags/ThoughtWorks/"/>
    
    <category term="思沃学院" scheme="https://huhao.dev/tags/%E6%80%9D%E6%B2%83%E5%AD%A6%E9%99%A2/"/>
    
  </entry>
  
  <entry>
    <title>打造基于Linux的高效学习和工作环境：硬件篇</title>
    <link href="https://huhao.dev/posts/e0bc865f/"/>
    <id>https://huhao.dev/posts/e0bc865f/</id>
    <published>2016-05-29T14:07:10.000Z</published>
    <updated>2016-05-29T14:07:10.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="程序员应该使用怎样的操作系统？"><a href="#程序员应该使用怎样的操作系统？" class="headerlink" title="程序员应该使用怎样的操作系统？"></a>程序员应该使用怎样的操作系统？</h2><p>我们日常所能够接触到的主流操作系统无非就是微软的 Windows 系列，苹果的 OS X 系列，以及基于 Linux 或其它“类 Unix”（Unix-Like） 操作系统的各种<a href="https://zh.wikipedia.org/wiki/Linux%E5%8F%91%E8%A1%8C%E7%89%88">发行版</a>。</p><p>那么，究竟应该选择何种操作系统作为你的首选操作系统呢？</p><p>这是一个旷日持久的论战，而我不准备把这个战火引入到这篇文章中，因为这个问题受到以下三个因素的影响：</p><ul><li>使用者的水平</li><li>使用的目的</li><li>经济条件</li></ul><p>所以，任何一种忽略了以上三个因素而得出的“XXX 才是王道，其它都是垃圾！”的结论都是错误的，这个问题是个适用性的问题，而不是好与坏的问题。</p><span id="more"></span><p><del>而回到“程序员应该使用怎样的操作系统？”这个问题上，并且排除了使用虚拟机这个选项以后，我需要直接给出的结论是（你也可以理解为我强行注入给你的观点）：</del></p><p><del><strong>“在当前，每一个程序员都应该想尽办法拥有一台苹果的 MacBook Pro 并且使用 OS X 操作系统。如果你实在是经济条件不够，请使用 Linux。如果你必须且主要从事 Windows 相关技术的开发，请使用 Windows，或者考虑用虚拟机运行 Windows。”</strong></del></p><p><del>形成以上结论的事实是：</del></p><ul><li><del>我们的互联网和你周围的智能设备 90% 运行在非 Windows 环境中。</del></li><li><del>基于上一条理由，作为一名程序员，如果你只工作或生存在 Windows 环境中，那么你将很有可能丢失 90% 的世界和机会，所以我们应当优先选择 OS X 或者 Linux。</del></li><li><del>基于上一条理由，OS X 由于兼容 <a href="https://zh.wikipedia.org/wiki/POSIX">POSIX</a> 标准，能够兼容绝大多数的 Unix-Like 开发需求，即使不行，也能凭借高性能的硬件在虚拟环境中运行 Linux 或 Windows，而 OS X 却难以在虚拟环境中运行，所以从兼容性和全面性的角度来说，应当优先选择 OS X。</del></li><li><del>基于上一条理由，因为 OS X 只能在苹果的硬件设备上运行，且考虑软件及硬件的性能、易用性和使用体验几个因素，目前无人能够打败苹果的 Mac 和 OS X。</del></li></ul><p><del>同时给出一个可以颠覆以上结论的可能：</del></p><p><del><strong>“除非 Linux 或 Windows 能够比 OS X 更顺畅的兼容一切，并且硬件设备买得起。”</strong></del></p><p><strong>微软以大局出发，在最新的 Windows 10 周年更新中已经包含了 Linux 子系统，所以，在我看来系统之争终于有了一个相对完美的解决方式。</strong></p><h2 id="为什么我们选择了-Linux？"><a href="#为什么我们选择了-Linux？" class="headerlink" title="为什么我们选择了 Linux？"></a>为什么我们选择了 Linux？</h2><p>因为苹果的 Mac 系列真的很贵，绝大多数人买不起，尤其是学生（而普遍用机械硬盘的学生笔记本用 Windows 10 装了一大堆流氓软件后也卡到毁天灭地），所以我们选择了 Linux。</p><p><del>换句话说，如果你买得起 MacBook Pro 笔记本电脑，请一定要买！请一定要使用 OS X！并且你可以忽略这个系列的文章。</del>（如果你的笔记本能流畅的跑 Windows 10 并更新了 2016 年的周年更新，可以使用 Linux 子系统并无视这句话）</p><p>另外，还要特别提醒：</p><p><strong>那个超轻薄的 MacBook 千万别买！那个性能不是用来搞软件开发的！</strong><br><strong>那个超轻薄的 MacBook 千万别买！那个性能不是用来搞软件开发的！</strong><br><strong>那个超轻薄的 MacBook 千万别买！那个性能不是用来搞软件开发的！</strong></p><h2 id="如何选择适合-Linux-的笔记本电脑？"><a href="#如何选择适合-Linux-的笔记本电脑？" class="headerlink" title="如何选择适合 Linux 的笔记本电脑？"></a>如何选择适合 Linux 的笔记本电脑？</h2><p>首先，基于便携性和可靠性考虑，我们排除了台式机，因为台式机的硬件种类更加复杂，不可控因素太多。</p><p>其次，搞清楚你买笔记本电脑的目的，比如如果你喜欢玩游戏并且无法割舍，那么请买一个带独显的笔记本电脑，并且考虑有一个大一点的固态硬盘，以便双系统安装 Windows 和 Linux，也能够尽可能的发挥出全部的硬件性能。</p><p>但是，基于 Linux 对于独立显卡兼容性较差的事实（虽然现在有了长足的进步，但是真的依然很差，经常动不动就黑屏无法进入系统什么的……），以及专心研究技术和好好学习的理由，我们还是优先推荐使用 Intel 技术架构和集成显卡（现在笔记本所采用的 Intel 的 CPU 都集成了显示芯片，并且对 Linux 兼容非常好）。</p><p>再有，绝不要买各种能够当平板使用并且配备触摸屏等新型硬件的笔记本电脑，因为对 Linux 的兼容性目前真的太差。</p><p>我不想再详细论述具体的需求和硬件选择依据，毕竟我们不是硬件评测文章，所以我直接给出当前适用于 Linux 操作系统并且兼顾开发和性能需要的<strong>最低配置底线</strong>：</p><ul><li>Intel i5 移动处理器（搞软件开发的最低底线，不解释）</li><li>8G DDR3 内存（流畅运行虚拟机跑 Windows 的最靠谱底线，关键是这年头内存条不值钱……）</li><li>128G 固态硬盘（当今世界机械硬盘是造成系统的性能低下的最大瓶颈，而且十分严重，和固态硬盘相比简直一个天上一个地下，珍爱生命，远离机械硬盘！）</li></ul><p>至于笔记本电脑的品牌，从对 Linux 的兼容性为根本出发，同时考虑质量和口碑，我们刻意的推荐（绝对不是打广告，也绝非利益相关）：</p><ul><li>联想的 ThinkPad 系列</li></ul><p>是的，ThinkPad 系列，一方面是因为 ThinkPad 一直以来的口碑和“真正的笔记本电脑”的评价，更重要的是 ThinkPad 系列对 Linux 的支持真的是目前最好的。其次是戴尔的笔记本电脑，但是根据我们长期校园教学的经验，戴尔的笔记本电脑对 Linux 的兼容性真的参差不齐，所以不推荐。</p><p>你可以前往 ThinkPad 官方商城选购自己喜欢的型号：</p><p><a href="http://www.thinkworldshop.com.cn/">http://www.thinkworldshop.com.cn/</a></p><p>型号参考请参阅：</p><p><a href="https://www.zhihu.com/question/21299566">https://www.zhihu.com/question/21299566</a></p><p><strong>但是我要特别强调的是：</strong></p><ol><li>配置请一定不要低于前面说的最低标准。</li><li>对于 Linux 来说，硬件选择上的保守比激进更稳妥。</li><li>如果价钱已经和 MacBook Pro 相当了，请不要犯傻，改买 MacBook，除非你特别强调玩游戏。</li></ol><h2 id="对于现有设备如何进行改造？"><a href="#对于现有设备如何进行改造？" class="headerlink" title="对于现有设备如何进行改造？"></a>对于现有设备如何进行改造？</h2><p>由于绝大多数的人都已经拥有了各种型号的笔记本电脑，所以考虑如何以较低的成本改造手中的笔记本电脑是最佳选择。</p><p>在此，我基于经验和认真思考，给予以下建议：</p><ul><li>我默认你将会以 Linux 作为主要的操作系统。</li><li>购买一块儿符合自己笔记本电脑接口的128G或更大的固态硬盘，换掉现有的机械硬盘。</li><li>购买一个 USB 3.0 的笔记本硬盘盒，用来将换下来的机械硬盘存放并作为移动硬盘使用，这样不但可以备份了资料，未来还可以当作数据盘或者备份盘使用，以应对因 Linux 使用不当造成的需要重装系统的可能性。</li><li>如果内存容量低于 8G，请将内存扩充到 8G，买内存条之前请看清自己的笔记本内存插槽有几个，以及现有内存的规格和品牌，尽可能保持一致，这样兼容性和稳定性比较好。</li></ul><p>根据以上建议，我给出几个举例，再次强调，我不是托儿：</p><ul><li><a href="http://item.jd.com/2010277.html">http://item.jd.com/2010277.html</a></li><li><a href="http://item.jd.com/407729.html">http://item.jd.com/407729.html</a></li><li><a href="http://item.jd.com/1066754.html">http://item.jd.com/1066754.html</a></li></ul><p>如果不考虑内存，只需要不到 350 块钱就能将你现有的笔记本升级到一个顺畅的状态！并且经过合理的设置和搭配合理的应用，还能使其易用性达到一个非常理想的水平。</p><h2 id="我的电脑已经达标了，我该怎么开始使用-Linux？"><a href="#我的电脑已经达标了，我该怎么开始使用-Linux？" class="headerlink" title="我的电脑已经达标了，我该怎么开始使用 Linux？"></a>我的电脑已经达标了，我该怎么开始使用 Linux？</h2><p>推荐一个基于我们的教学经验而总结的简单的 Linux 安装及设置指南，使用了比较适合新手的发行版 Ubuntu：</p><p><a href="http://thoughtworks-academy.github.io/linux-guide/">http://thoughtworks-academy.github.io/linux-guide/</a></p><p>仅适用于新手，并且只是建议，后续文章中我会推荐许多易于新手使用的炫酷 Linux 软件，敬请关注！</p><hr><h2 id="欢迎关注我的微信公众号"><a href="#欢迎关注我的微信公众号" class="headerlink" title="欢迎关注我的微信公众号"></a>欢迎关注我的微信公众号</h2><p>微信搜索：<code>枪炮与代码</code>，或者搜索公众号ID：<code>guns_n_code</code></p><p><img src="https://huhao-dev.oss-cn-beijing.aliyuncs.com/2020-01-20-wechat.png" alt="枪炮与玫瑰"></p>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;程序员应该使用怎样的操作系统？&quot;&gt;&lt;a href=&quot;#程序员应该使用怎样的操作系统？&quot; class=&quot;headerlink&quot; title=&quot;程序员应该使用怎样的操作系统？&quot;&gt;&lt;/a&gt;程序员应该使用怎样的操作系统？&lt;/h2&gt;&lt;p&gt;我们日常所能够接触到的主流操作系统无非就是微软的 Windows 系列，苹果的 OS X 系列，以及基于 Linux 或其它“类 Unix”（Unix-Like） 操作系统的各种&lt;a href=&quot;https://zh.wikipedia.org/wiki/Linux%E5%8F%91%E8%A1%8C%E7%89%88&quot;&gt;发行版&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;那么，究竟应该选择何种操作系统作为你的首选操作系统呢？&lt;/p&gt;
&lt;p&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;/ul&gt;
&lt;p&gt;所以，任何一种忽略了以上三个因素而得出的“XXX 才是王道，其它都是垃圾！”的结论都是错误的，这个问题是个适用性的问题，而不是好与坏的问题。&lt;/p&gt;</summary>
    
    
    
    <category term="打造基于Linux的高效学习和工作环境" scheme="https://huhao.dev/categories/%E6%89%93%E9%80%A0%E5%9F%BA%E4%BA%8ELinux%E7%9A%84%E9%AB%98%E6%95%88%E5%AD%A6%E4%B9%A0%E5%92%8C%E5%B7%A5%E4%BD%9C%E7%8E%AF%E5%A2%83/"/>
    
    
    <category term="Linux" scheme="https://huhao.dev/tags/Linux/"/>
    
  </entry>
  
</feed>
