问题即空间
每个问题都勾勒出一个空间
一个问题不仅仅是在询问某一样东西。它开启了一个可能的答案空间,而每一个候选答案都是该空间中的某一点。
“选个地方吃饭”开启了一个巨大的空间:地球上每一家餐厅、咖啡馆、食品摊和厨房。“选一家步行可达、现在营业、人均十五美元以下的素食餐厅”则开启了一个极小的空间:可能只有三个点。
意图相同,但几何形状截然不同。第二个问题做了真正的工作:它在任何人开始搜索之前,就缩小了空间。
这就是整节课的一句话总结:一个好问题,是将答案空间缩小到值得搜索区域的问题。 模糊的问题会留下一个巨大的空间,迫使搜索变得缓慢且漫无目的。而精准的问题则交给你一个可以一眼扫过的小空间。
我们将用四个几何概念来使这一点精确化:对空间进行划分,用约束条件切割空间,以及通过精心设计的“是/否”问题将空间减半。
宽泛与狭窄
考虑两种请求帮助调试程序的方式:
- Q1: “为什么我的代码不工作?”
- Q2: “为什么在 Python 3.12 中,这个循环打印了 9 个项目,而列表中有 10 个?”
将空间分割为区域
将大问题拆解为区域
当一个空间大到无法直接搜索时,你可以对其进行划分:将其分割为互不重叠的区域,这些区域合起来覆盖整体。回答一个子问题意味着选定其中一个区域,并忽略其余部分。
假设问题是“为什么上季度收入下降了?”答案空间巨大。将其划分:(a) 客户数量减少,(b) 相同客户消费减少,(c) 定价或计费变更,(d) 数据错误。这四个区域覆盖了整个空间且互不重叠。每个区域都是一个你可以独立攻克的小问题。
一个好的划分具有两个直接借自几何学的性质:这些区域覆盖整个空间(没有遗漏)且它们互不相交(没有重复计算)。如果遗漏了空间的一部分,真实答案可能就隐藏在缺口里。如果区域重叠,你就会浪费精力在同一块地面上搜索两次。
每个子问题都将你限定在一个区域内。回答它,你就排除了该区域之外的一切:这是一种大幅且低成本的搜索缩减。
清晰的划分
一个城市提出疑问:“为什么紧急响应时间正在上升?”
一位分析师建议将其拆分为:(a) 呼叫到达救援队伍的时间变长,(b) 队伍被派遣后到达现场的时间变长,以及 (c) 队伍完成任务并释放的时间变长。
每个需求都在切割空间
约束作为半平面
把答案空间想象成一个平坦的平面,平面上的每个点都是一个候选答案。约束就是一项需求,& 每项需求都会在平面上画出一条线 & 只保留其中一侧。在几何学中,这个被保留的一侧称为半平面。
“十五美元以下”是一条线;保留便宜的一侧。“步行可达”是第二条线;保留较近的一侧。“现在营业中”是第三条。你每增加一项需求,就多一次切割。
满足所有需求的答案,存在于所有保留侧的交集之中。将足够多的半平面相交,你会得到一个小的有界区域:一个整齐的区域,其中包含唯一正确的答案。
两种失效模式
欠约束(切割太少):区域保持无界。它延伸至无穷远,因此无限多个模糊的答案都“符合”。“给我一个好主意”是无界的。你得到的是噪声,因为没有任何东西被排除在外。
过约束(切割太多,或相互矛盾):区域变得为空。这些半平面没有公共点,因此没有任何答案符合。“一个既是偶数又是奇数的数”将空间切割至一无所有。
一个良构的问题位于这两者之间:有足够的约束来界定区域,但不至于多到相互矛盾并使区域变空。
有界、无界、为空
经理向设计师索要“一个标志”。后来他们索要“一个标志,它是单个字母,单色,在16像素下可用,& 同时至少使用四种颜色。”
最佳切割将空间一分为二
二分查找:每个是/否都将空间减半
有些问题是“是/否”问题。从几何上看,一个“是/否”问题画出一条线,并告诉你答案在哪一侧:它在一笔之间丢弃了整个区域。
最佳的是那种能将空间一分为二的“是/否”问题,因为无论得到什么答案,你都恰好排除了剩余可能性的一半。反复询问“它在上半部分吗?”,搜索空间会以几何级数的速度迅速缩小。
这就是二分查找。从 N 个候选项开始。提出一个好问题后,剩下 N/2 个。两个问题后,剩下 N/4。k 个问题后,剩下 N / 2^k。当只剩一个候选项时即完成,因此你需要找到满足 2^k 至少为 N 的最小 k 值。
这个最小的 k 值就是 log2(N) 的向上取整。对于一千个候选项:2^9 = 512(不够)& 2^10 = 1024(足够),所以 log2(1000) 约为 9.97 & 你需要 10 个问题。十亿个候选项呢?十亿的 log2 约为 30。减半的力量如此强大,以至于从一千增加到十亿,仅仅增加了大约二十个问题。
提问的启示是:一个精准的“是/否”问题在将剩余空间均匀分割时价值最大。一个不平衡的问题如果只能排除极小部分,就浪费了这次提问机会。
确保找到目标
你正在玩一个猜数游戏。某人从 1 到 1000 中选择一个整数。你只能问“是/否”问题,& 你以最优策略进行(每个问题都将剩余候选项尽可能均匀地分割)。
当答案变得廉价,切割才显珍贵
提问即工作
将这四个要素结合起来。一个问题打开一个空间。分解将其划分。约束将其切割为有界的可行区域。好的是/否问题将其减半。这些中的每一个都是在寻找答案之前缩小搜索范围的行为。
在历史上大部分时间里,答案才是昂贵的部分。你需要支付专家费用、进行实验或翻阅档案。因此,我们珍视那些能产出答案的人。
这种平衡已经被打破。自动化系统现在能以极低的成本批量生成看似合理的回答。当回答变得廉价且 abundant 时,多生产一个回答已不再是成就。真正稀缺的是知道哪个回答值得拥有:这是一种提问技能,而非回答生成技能。
在几何视角下:机器会乐意为你提供空间中的任意一点。你所增加的价值在于绘制约束条件,将空间切割到良好答案必然存在的那一个区域。约束不足,你就会被看似合理的噪音淹没(无界区域);约束过度,你将一无所获(空区域)。提出恰好将区域边界限定在合适大小的切割条件,才是稀缺的人类技能。
因此,杠杆点不在于“获取一个答案”,而在于“提出约束条件,使答案空间足够小,以至于其中任意一点都值得拥有”。
价值转移之处
如今,分析师可以在几分钟内以几乎零成本生成一百份策略草案。
问题的几何学:总结
你学到了什么
一个问题不仅仅是在索取一个答案。它是一个可能答案的空间,而提问的艺术,就是缩小这个空间的艺术:
- 搜索空间: 每个问题都会打开一组候选答案。一个精准的问题打开的是一个很小的集合;而一个模糊的问题则会打开一个巨大的集合,让你在其中迷失方向。
- 分解即划分: 将一个大的空间分割成互不重叠且完全覆盖该空间的区域;每个子问题都能将你引导至其中一个区域。
- 约束即边界: 每个要求都是一个半平面;答案存在于这些半平面的交集中。切割太少会留下一个无界区域(意味着有无穷无尽的模糊答案);相互矛盾的切割则会留下一个空区域(意味着没有任何答案符合要求)。
- 通过减半来缩小范围: 一个精心设计的“是/否”问题可以将搜索空间一分为二。要在 1 到 1000 之间确定一个数字,需要 ceil(log2(1000)) = 10 个问题;而在一亿(a billion)中确定一个数字,仅需大约 30 个问题。
而其回报在于:当自动化系统使获取答案变得廉价时,稀缺的技能不再是生产答案,而是提出那些能将空间削减至唯一值得拥有的区域的约束条件。学会画出这些切割线,& 你就能将一场庞大、漫无目的的搜索转变为一次简短的搜索。