思考软件开发中的快与慢
英文原文:Software Development: Fast and Slow
本文作者 Michael Dubakov 从事软件开发方面的工作,他在读了 Daniel Kahneman 的《思考,快与慢》后,思考了软件开发中的快与慢,并且把书中的一些思想应用到实际的软件开发中。下面是笔者对原文的翻译:
最近,我在阅读 Daniel Kahneman 的《思考,快与慢》,这本书非常令人着迷。里面拥有大量的真知灼见,给读者带来一场思维之旅。目前,我在一家软件公司工作,书中所学到的部分自然而然地可以应用到我们的工作中。下面,我将分享自己从这本书的所感、所知。
系统 1 和系统 2
这本书包括两个部分,系统 1 和系统 2 。在书中,卡尼曼会带领我们体验一次思维的终极之旅。他认为,我们的大脑有快与慢两种作决定的方式。常用的无意识的“系统 1”依赖情感、记忆和经验迅速作出判断,它见闻广博,使我们能够迅速对眼前的情况作出反应。但系统 1 也很容易上当,它固守“眼见即为事实”的原则,任由损失厌恶和乐观偏见之类的错觉引导我们作出错误的选择。有意识的“系统2”通过调动注意力来分析和解决问题,并作出决定,它比较慢,不容易出错,但它很懒惰,经常走捷径,直接采纳系统1的直觉型判断结果。
如果你是一名软件工程师,你会快速抓住系统 1 和系统 2 的特质。系统 1 相当于缓存,而系统 2 则相当于业务层。缓存是廉价和快速的,而业务操作则比较慢和昂贵。
下面我将会用书中的一些概念来理解软件开发中遇到的一些实例。
眼见为实(WYSIATI)
通常,人们不会怀疑他们所看到的事情(从广义上来讲)。而如果你有一些信息,你很有可能会产生质疑,并且去查证。人们往往会基于现有的事实和有限的证据来做出决定。这样很有可能会导致一个偏差:
在软件开发中,估算并不是件容易的事,我们有可能一直在犯错,估算就是一个分布(Estimation is a distribution)。
过分自信
软件估算是过度挥舞自信的产物。
如果你问“我们需要整合 Twitter,需要显示特定标签下的所有推文,完成这些需要多久?”开发人员不会问其他额外的问题,通常都会直截了当的给出答案,2 天。这明显是系统 1 里的心理反应。而答案也非绝对正确,尽管缺乏信息,但这并不影响估算。开发人员应该聪明点和自信点,但他们也应该摆脱 WYSIATI,并且认真仔细地思考一些未知数。
框架效应
描述问题的措辞很重要,同一个问题,用不同的语言描述,很有可能会产生不同的解决方案和反应,看下面这两个问题:
你认为,我们需要一个非常有经验的开发人员来解决这么简单的问题吗?
你认为,我们需要一个非常有经验的开发人员来解决这么复杂的问题吗?
问题好像被设置了框架一样。第一个问题,你很难去回答 Yes,相反,第二个却很容易回答 Yes。
忽视基础概率
有些事件可能会比其他的更容易些。然而,人们并不具备好的直觉和数据统计。
比方说,你的产品被 1000 家公司采用,你接收到一封客户的邮件,该客户认为他们的想法很棒,而且必须马上实施。存在这样的争论是很好的,而且非常有意义。你感受到了客户的痛苦,并且集中全力快速启动新功能的开发。好吧,你可能错过了什么,那就是,你有想过其他 999 位客户是否需要吗?或许他们就不需要这样的解决方案呢。你忘记了产品要基于更大的客户群,而对于单个请求是否要进行重新审查。
在平时开发中,这种错误很常见,并且我会反复提醒自己。现在,我会非常认真仔细地考虑每一个请求。而不是冲动。
回答一个简单的问题
当我们对一个复杂的问题难以回答时,我们通常都会用简单的思维来替代复杂,其实书中系统 1 就可以处理,大家来看下面这个例子。
你常常会听到这样的问题:“该项目在 3 个月内会有哪些进展?”对于这个问题,你可以这样理解:“这个项目会有哪些进展?”。
通过做这样的替换,你无需用系统 2 的思维来回答,直接使用系统 1 的就可以了。有趣地事,我们并未意识到替代,并且会很好地回答这个问题。
情绪启发式
人们的情绪往往会对决定产生很大的影响。例如,如果你喜欢 Node.js,那么你会很乐意采用它来开发新的 Web 应用程序,而如果你不喜欢 Node.js,你会列出许多反对的理由,并且支持使用另一门语言来开发。
这种情绪化的启发式是很难克服的。虽然有时候是不合理的,甚至是不理智的。有时,这种基于直观喜好的选择并不是最好的。
我只是列举了一些表面例子,但很显然,在软件开发过程中,我们很容易基于这种情绪或某种偏见来做一些决定。
直觉 vs. 模型
事实上,在我们决定一些东西的时候,可以应用模型。
Kano 模型是一个非常好的例子,它可以帮助我们对新功能做出更加明智的决定。
模型似乎一直好于直觉。模型会迫使你去思考领域,问题的方方面面,以及从各个不同的角度看它——使用系统 2 思维。
这里有一些简单的问题:“下面,我们该从哪个功能做起?”,你可能会根据直觉回答说:“高级搜索”。但实际上,这个功能可能并不重要,而是有数十个更重要的功能。你可以构建一个简单的模型,并且进行评估。例如,在制作模型的时候,可以采用以下选项作为参数:
- Kano 模型(基础、delighter、性能)
- 投票:客户的需求有多大。
- 频率:客户使用的频率有多大。
- 传播:有多少人会使用这个功能。
- 成就:(S, M, L, XL, …)
- 复杂性:它会增加使用的复杂性吗?
通过制作这样的模型,你会很容易做出决定。
模型除了可以应用在软件领域,它还可以应用在许多地方。实践告诉我们,直觉很少能带来正确的决定和很好地解决问题,除非你是史蒂夫·乔布斯。