If you want to get smart, the question you have to keep asking is “why, why, why?”
— Charlie Munger
想写这篇文章是因为去年夏天我读了这篇互联网提问圣经《How to Ask Questions the Smart Way》(也曾在旧博文里推荐过此文)。文章自然是值得多次推荐的好文章;但我在读过两遍之后,始终觉得有哪里不太对,这点“不对劲”直到最近才慢吞吞地想明白——
奔着想知道⎡如何正确地提问 & 提正确的问题⎦的目的去读这篇文章,但读完后却愈发觉得作者在教人⎡如何尽量少向别人提问⎦——因为你应该尽量靠自己 + 搜索引擎解决 99% 的问题喔!
“学会不做伸手党”当然也是很有价值的课题(其实这才是作者的本意,误读了标题是我的错),但我最初的疑问却并未被这篇题为《如何聪明地提问》的文章所拯救:我并不是伸手党,也懂得如何搜索有效信息,但我还是需要知道应该如何真正地提出一个好问题。
《如何聪明地提问》作者Eric写各种提问的技术性细节时,显然假设了读者已知自己的问题是什么——可是如果,我还不知道呢?
那就回到这个原始动机问题上了:本无问题为什么还偏要提问呢?
我的回答有两个。
一是,生活中很多时候需要你来提问,而且你提问的质量高低很重要。
比如,在找工作面试时,面试官最后往往会加一句,“那你有什么问题要问吗?”再比如,和别人聊天交谈(面对面or通过通讯工具)时,如果你想尽量和别人多聊会儿,或想要引导对话的走向,那也常需要以合适的问题来结尾——这样才能最大限度地保证会收到下一条回复。
二则是因为,提问是学习的最佳姿势。
《学会提问——批判性思维指南》一书中把人的思维方式主要分成的两种:海绵式思维与淘金式思维。
海绵式思维(the sponge):不假思索地尽量接收所有信息,简单地说就是靠记忆力来处理信息、认识世界。
淘金式思维(panning for gold):除了记忆力还需要其他思维能力(分析、推理、归纳、总结……)来判断一条信息是否有价值。
把这两种思维方式具体化到学习(广义的⌈学习⌋,指习得任何新知识与技能)上,不难发现,大部分人大部分时候都是在海绵式地学习——求知欲就像是一块儿海绵,目标是在知识(多数时候还不是知识,只是信息而已)的海洋里尽可能地吸收更多的水。虽然较为简便易行,可是海绵吸水式被动记下的信息,很难内化为自己能拿来用的知识,因为吸收时没有判断过信息的真伪、优劣、等级和价值——再多的信息也像一堆砖头,不成体系,难以发挥价值。
而通过淘金式思维学习到的技能,才最终有可能在复杂的现实中运用起来。淘金式学习,主要依靠不断提问来帮助、引发自己主动思考分析信息的真伪与价值,建立与已有知识体系的联系。由此可见,提问的质量必定与学习的效果成正比。
就算只考虑提问的第二种价值(即⌈提问是学习的最佳姿势⌋),任何没放弃进步的人也都应该关心⎡如何提出好问题⎦这个课题。
(终于写到重点!)那如何才能提出一个有价值有潜力的好问题呢?
不妨试试WHAT - HOW - WHY三段进阶式提问法!
WHAT: 对”是什么”进行初级提问,如,基础概念、表面现象、特征重点等;
HOW: 对“如何做”进行中级提问,如,运作机制、内部结构、报错分析等;
WHY: 对”为什么”追根究底,“为什么要这么做而不是那样做?”,“为什么是主导因素是这个而不是那个?”等等。
在不同领域内,所能提出的三阶问题不同,不过大道相通。
比如,在学习Python 数据结构时,你的问题也许会从“整型值与浮点值在 Python 里的表达方式与运算形式有哪些?(WHAT)”变化为“在 Python 中 0.1 + 0.2 ≠ 0.3,这个运算结果的背后机制是什么?(HOW)”再升级到“为什么用机器语言无法准确地存储一些十进制浮点值?(WHY)”
再比如,在读人类历史时,你的问题可能从“是哪个人种、在什么时间、以什么方式首次到达并殖民了美洲大陆?(WHAT)”升级到“智人到达美洲后,大批动植物纷纷灭绝,这个过程是如何发生的?智人在其中扮演了怎样的角色?(HOW)”再联想到“为什么是欧洲人再次发现并占领了美洲,而不是印第安人占领了欧洲?(WHY)”。
举一个与编程有关的具体例子(但与具体知识关系不大,没有编程背景也能看懂)——
以前在公司实习时,老板曾交给我一个菜鸟级任务:写一个脚本(script),删掉一系列文档内数据的排列组合在其他文档内的重合。
任何人的第一反应,肯定是先问WHAT级别的初级问题,比如,
❒ WHAT
❍ 具体要解决什么问题?最简化的任务:假设只有3个文档,文档1中数据未知,文档2内只有a, b, c这三个数据,文档3只有x, y两个数据;需要“抠掉”文档1中所有可能出现的文档2&3内数据的全部排列组合(有ax, ay, xa, ya, bx, by, xb, yb, cx, cy, xc, yc 共322=12种组合),并且不改变文档1内数据原本次序。现实中,有一系列的文档1,以及与文档1配套的一系列文档2&3,并且每个文档内有几十到上万行数据。
❍ 想要什么结果?得到一系列处理干净的文档1,以及一个可供后人审阅、升级、继续使用的好用脚本。
❍ 预测可能会出现什么难点?文档本身是多语种的,也许会遇到 encoding(编码)的问题;怎样最有效率地找到多对文档间的全部排列组合。
搞清楚我要做什么了之后,就要进入下一步思考HOW的问题了,比如,
❒ HOW
❍ 怎么解决我的问题?先建立最简任务模型,调试成功后再用到真正的问题上。
❍ 通过什么方式来解决?写个Python脚本。
❍ 需要设计什么步骤?批量读取文档,获取不同文档内数据的全部排列组合,找到需要处理的文档1们中重合的部分,删除重合并生成新文档;测试结果。
想清楚 HOW 之后,就可以动手写脚本了。或者边写边调整具体策略,都没什么问题。
接下来WHY的问题,其实对解决当下问题的帮助不大,因此大部分人也不会去多想。但问出重要、关键的WHY有助于优化解决方案,加深对 HOW 的理解(“为什么要那样做、不这样做?分别有什么影响?那影响重要吗?”),最终加速技能学习过程。
❒ WHY
❍ 为什么要写几十行代码的脚本,而不是直接在命令行用sed, AWK之类专门处理文本的小工具、仅花两三行就把问题解决掉?因为不止想要处理干净的文档,还想要一个可供别人审阅、升级、整合到其他程序中使用的脚本;还因为需要处理的文档并不是只有现在这些,未来还会不断更新,需要反复处理。(我处理这个小任务时想到的一个WHY)
第二天,老板来看我写的脚本时,提出了更多我从未考虑到的、也更有价值的 WHY,比如,
❍ 为什么选择用循环结构(loop / iteration)去除重合?我当下愣了一秒,然后就老实承认:我没想过为什么要这样写,只是第一反应知道循环+遍历可以达到自己的目的,就用了……但在实际问题中呢,假如要处理的文档很大,用循环结构就会降低效率;此时换成 set(集)则是更好的选择。
根据二八定律,能从 WHAT 进阶到 HOW 再到 WHY 的人仅占人群中的 4% (20%*20%)。因为,问出更高阶的好问题的前提是要先研究透彻低阶问题;如果试图越过 WHAT/HOW 阶段的思考与实践而直接提出 WHY,那个问题往往会显得很傻很天真——最后又回到我上一篇文章中提到的,自学编程最重要的三句话之一:
Do Your Homework!
引申阅读:
《How to ask questions the smart way》by Eric Steven Raymond
《读书不止“读”那么简单》博客旧文
《学会提问——批判性思维指南》by 布朗 & 基利