Home Resources

Rich Hickey - Hammock-driven Development

Table of Contents

概述

这次演讲,按 Rich Hickey 的说法,是聊闲篇,讲他日常考虑问题的一种方式。主要想法来自科学美国人的一项研究结果,即你睡觉时,大脑会处理白天接收的信息,这也是演讲的名字来源,《吊床驱动开发》。

视频在 https://www.youtube.com/watch?v=f84n5oFoZBc,也可以去看 transcript.

从软件开发讲起

关于 BUG,有几点事实:

  • 流入生产环境的 BUG 修复起来最为昂贵
  • 流入 QA 流程的 BUG 修复起来也比较昂贵,离开发流程还是太远
  • 而开发环节就把 BUG 修复了比较划算
  • “修复” BUG 最划算的方式是在软件设计的时候

软件开发中很大一部分问题来自于错误的想法(misconception),而不是软件实现;在这种问题上,测试和类型系统并不能给出太多帮助,它们可能能协助处理一些实现过程中的问题。

接下来 Rich Hickey 讨论分析与设计,用他一贯的幽默说辞强调,需求分析与软件设计(analysis and design)的核心在于两点:

  • 识别我们要解决的问题
  • 评估我们的方案,看它能否解决该问题

分析设计无关与这两点外的其它事情,跟你画不画 UML,给不给出完整的执行计划无关。重点在于解决问题,在于解决实际想要解决的问题。

它无关与特性,特性是什么?特性是一件事的一些属性;特性是镀铬旋钮之于汽车,它很好看,但它不是汽车的目标。特性不是软件开发的目标,软件开发关乎挖掘用户的问题,给出解决方案。有时候,我们太过聪明,可以想出一些办法绕过问题,不过,我们得明白,绕过问题和解决问题不是一回事。

解决问题

Rich Hickey 推荐了 How To Solve It 这本关于问题解决的书,其中描述了问题解决过程中一些关键点。

  1. 陈述问题
  2. 理解问题
    • 确定你知道的东西
      • 事实
      • 上下文
      • 约束
    • 确定你不知道的东西,这有两种:
      • 你知道你不知道的东西,比如用到的某个技术,你还不清楚是如何使用、或者实现的
      • 你不知道你不知道的东西;考虑我们大部分时候处理的并不是完全全新的问题
        • 你要做的便是大量摄入相似甚至相同问题他人的方案
        • 去了解这个领域中你从未接触过的东西,挖掘你不知道的东西
    • 找到关联问题
    • 记录所有这些东西
  3. 辨别能力
    • 找到你当前解决方案中的问题,解决这些问题
    • 考虑各种方案的得失权衡,你的问题不太可能只有一种解决方案,当存在多个选择时,你得考虑不同方案的得失
    • 当你理解了你的问题,应该存在一些你不知道的东西,你得提出一些解答它们问题
    • 同样,记录这些东西
  4. 输入更多东西
    • 很简单,你不可能对不知道的东西产生连接,形成解题灵感
    • 做大量阅读,你可能不能记住所有信息,没关系,重要的是你得去尝试大量摄入信息,与问题相关的那些信息
    • 很关键的是,尽可能理解那些已存在的解决方案
  5. 做出权衡取舍
    • 注意,因为你不知道某个方案所以没选择它,这不是取舍
    • 要做出取舍,你至少得已经发现至少一种方案了
    • 记录你做出的决策
  6. 专注

吊床驱动

解决问题,很关键的一部分便是保持专注。注意力是一项稀缺资源,你不可能同时专注于所有事情。

清醒的大脑:

  • 擅长分析型,战术策略性思考
  • 它倾向于做出本地最优的结果

而 Background mind —— 记住,Rich Hickey 说了,这个演讲只是他的一些经验,一些夸夸奇谈,一些概念没有特别严格的定义 —— 与清醒大脑相对的一种状态,也不完全等同于睡觉时的大脑,

  • 擅长综合型,战略层面的思考,擅长抽象、类比
  • 给出很多不那么简单问题的方案,就是睡了一觉突发灵感的那类事情;不过很不幸,你并不能控制它

于是,Rich Hickey 综合他的经验,和科学美国人的那个研究结果,说,最好的方式就是利用你清醒的大脑将任务灌输给 background mind,然后再分析它的产出。

他给出了一些步骤

  1. 加载你要处理的问题
    • 首先,考虑人的短期记忆一般只能处理 7+/-2 个事项,所以保证同一时刻只关注最多这么多问题最好
    • 然后,写下可能的解决方案,大脑擅长处理视觉记忆,所以,必要的话,可以画出它们
    • 其后,不断重复过关于这些问题的这些信息,以各种顺序重复
    • 闭上眼睛,通过你的“大脑之眼”看这些信息;有些人可能能够进行视觉化思考,很多人可能没有,不过当你闭上眼睛思考的时候,那种有点视觉化的感受,Rich Hickey 称为 "mind's eye".
  2. 等待
    • 至少过一晚上
    • 对于那些真正的难题,可能要几个月;所以为自己多准备一些这样的问题,当一个问题卡壳了,可以试着先处理其它的
  3. 起来工作
    • Eureka! 当灵感出现,处理它们
    • 有时候,这些灵感并不是直接结果,甚至可能是其它问题的结果
      • 记住,这很正常,你的 background mind 不受控制,这是它的特性,它就是这么天马行空
      • 既然有灵感,也记得好好利用,至少记录下;甚至先切换下思路,就着灵感先处理相关问题
  4. 尝试
    • 有了灵感,得到了想法,你可以做更多分析,不过,很多时候还是需要去尝试
    • 对于软件,意味着你需要编码;当你编码开始验证想法时,你发现你在尝试一种新的方法,然后逐渐开始验证你的想法时,这非常棒;当你写着写着,发现,这也许不太对,也没关系;尝试过程中的这种反馈循环非常重要
  5. 你可能会出错
    • 当你在解决一些较难的问题的时候,出错毕竟难以避免;不要放弃,总有更好的想法
    • 在你深入思考的时候,一些事实也会发生改变,要么你得出一些新结论;要么你摄入了更多相关信息;甚至是需求本身也发生了变化
    • 所以,不要害怕出错

最后总结一下,没有总结。Rich Hickey 说了,这只是扯一些闲篇。

Author: lotuc, Published at: 2023-02-11 Sat 00:00, Modified At: 2023-02-11 Sat 13:00 (orgmode - Publishing)