在尚未画完的路径上——Meet in the middle!
好久没有这么正式地说话了。在梦熊讲了三周课约谈了好多好多人,感觉吃下了好多好多 Mindset,想说说关于思考的一些想法。
关于我们如何思考一个"题"。以及在更宏大的时间上,我们如何思考一个——"问题"。
前言
我们常常讨论怎样做出一道题。——对于规定对象、条件和答案的形式,我们需要做的,形如有限时间里找到一条通向答案的路。这是我们必须知道的,也是本文想讨论的:如何思考一道题。
以及更广泛地,研究一个现象、学习一门陌生的理论、处理一个生活中的困境,面对的其实是同一种动作:怎样把一个暂时不知道如何处理的问题,推进到一个我们能够理解、验证或行动的状态。
第一人称迷宫
我们可以把思考过程想象成遍历,而在上帝视角看,问题的推理关系是一张图。只是我们在探索的过程中并不能看到完整的图结构,即第一人称迷宫。
问题最初呈现出来的状态是源点 ,我们希望抵达的状态是汇点 (解决)。思考和演绎推理就是尝试在这张图上找到一条从 S 到 T 的路径。
例如,最经典的应试的证明题中,题目会给出有限且确定的条件,这些已知条件作为推理的起点,即源点(或多个源) S,我们根据数理逻辑做演绎推理,转化条件,导出结论就是在图中扩张 S 集合的的 “可达性”,不断扩张直至存在 S 到 T 的演绎路径。
在不断的做题中,我们又会积累到许多套路("Trick"),比如高中数学背下来的那一大堆”二级结论“,或是答题模板、做题思路、上来就要对题目做的转化…… 经验主义对解决问题有着重要的作用,并且它是可训练的。我把这些 Tricks 简要地归纳为两类,条件反射与问题库。
条件反射指的是,看到某种特征时,能迅速想到其可能有效的转化,即将已知条件可以推导出的已知结论快速抵达。条件反射增大的是源点 S 周围的已知区域,让我们更快看清问题,更快把问题变为形式化、结构化的形式。
问题库指的是,当问题被转化、推理、排除到某一种确定的,熟悉的结构时,能匹配到相似问题并将其解决。问题库增大的是可以直达汇点 T 的区域,让我们知道“什么样的问题是可以被快速解决的”。更重要的是,它能让我们知道,我们想往什么方向走。
因此从 S 到 T 的能力,大致可以从三个角度训练:锻炼本能与条件反射、积累问题库、硬思考的耐心与条理。
本能、条件反射
解决问题中条件反射,是看到某种特征时,能迅速想到其可能有效的转化。
一大堆刻在 DNA 里的本能反应: 看到极值点偏移,想到构造函数;看到对称性,会想到能否减少变量或改变坐标;看到周期性,会想到能否把无限过程折叠到一个周期里;看到 数据范围和 ,想想根号分治。看到一件事长期无法推进,会想到目标是否太大、下一步是否根本没有被定义。
这些反应被刻进 DNA 里的方式就是“熟悉”。它们来自过去一次次把“某个特征”与“某种转化”联系起来。做过的题、读过的论文、失败的实验、与人的谈话,都会留下这样的匹配关系。下一次出现相似特征时,大脑便能快速给出一个方向。
训练这种能力时,可以在每次解决问题后留下一句话:
我看见了什么特征,因此尝试把它转化成什么?
尤其是在依靠外力(寻求指导、题解、AI 等工具)解决问题后,问问自己
我为什么没有看见这个特征。
尝试对这些反复出现的特征建立本能反应,就是在利用脑子的可塑性扩大源点 S 可以到达的集合,再下一次遇到问题时,直接做出这个反应,避免再花时大量的时间去做可以被提前处理好的思考。
第一反应很重要,但它只是一条候选路线。经验越丰富,第一反应有时越强,也越容易受到它的限制。(这也是为什么 BFS 往往在稀疏图上比 DFS 更快到达汇点)。 也许有时我们也需要同时保留几种解释,让几条思路并行生长。 先出现的想法可以先试,却不能垄断整个问题。
问题库、积累
如果说本能反射回答“这个问题可以变成什么”,问题库回答的就是“问题变成什么以后,我就会做了”。
问题库不应该成为答案的仓库,也不应该成为对已知问题的生搬硬套。真正有用的经验是:一个问题在什么时刻开始变得可处理。
也许是变量从许多个减少到了两个;也许是一个连续过程被拆成了若干独立阶段;可能是两个维度可以拆解成无关的维,各自解决;也许是一个庞大的目标被分成了几个能够独立验证的假设。 这些问题在做出转化后,可能就变成了你熟悉的形态,或者已经证明、解决过的问题。
我们要记住这些“已经可以动手”的形状。
算法竞赛中 OI 的数据结构思维就是问题库的一种典型模式,一个数据结构高手往往精通哪些形式化的问题可以做到什么复杂度——就像大家都知道 区间加 区间查 max 可以简单做到 ;而区间加 区间查 kth 就不能做到 polylog。
这也是为什么只记结论往往没有用。结论位于路径的末端,我们真正卡住的地方却通常更早:不知道怎样表示,不知道该保留哪些信息,不知道推导应该进行到什么程度,也不知道什么时候已经可以停止变形,开始计算、实验或行动。
整理一次经历时,不仅记录“这个问题最后是怎样解决的”,更记录:
做到哪一步以后,剩下的部分变成了一个我熟悉的问题?它为什么可以被解决?
还有满足什么条件的类似问题可以被解决?
有时候一个问题套了一层壳,会很难直接匹配到原问题,因此,问题库的模式匹配方式往往也需要多样化。
图像提供空间直观,符号演算把关系压缩成可以操作的形式,表格暴露重复的模式,模拟手操让我们观察一种模式的行为,寻找反例可能帮助我们发现从未意识到的变量。如果某种表示长时间没有产生新信息,就换一种表示,换一种视角,甚至换一个拥有完全不同问题库的人去解决这个问题。
硬思考
即使积累了许多反射和问题,S 与 T 之间仍然会留下空白,暂且把它叫作硬思考。
硬思考是解决一个问题最困难,也最难以训练的部分。它只能由你在这个”现在“中完成,不能直接依赖各种条件反射与模式匹配。
硬思考也并不完全是没有经验可用,只是经验不能直接给出答案,需要在这个特定的当下重新选择、组合、检验已有工具。
完全没有思路时,怎么做?
可以从问题最简单的例子出发。寻找最小、最规则、最极端的情况中是否有已经解决的特例——如一个数论题中 是质数的情况,或是一个图特殊情况下树是一条链的情况。 然后比较:这个特例与原问题有什么相同?它少了哪个条件,多了哪个自由度?这个条件缺失后我们应该如何调整。特例的解决方法在原问题中可能承担什么角色?很多新的观察,恰好藏在特例与原问题的差异里。
另一个方向是泛化。这个问题是否属于一个更一般的模型?它与其他熟悉的问题是否共享某种结构?特例让问题缩小,泛化让问题换到更高的层次。两种动作的目的相同:离开原始表述,获得新的关系。
勇敢地去猜测。在不断的硬思考中锻炼直觉,根据这个直觉去提出猜测,不要害怕这个猜测是假的,尝试去证明它。即使猜测是错误的,我们能从尝试证明它的过程中寻找到一些更弱但有用的。
主动攻击自己的想法(Hacker's Mind)。找反例,改变参数,画出极端情形,用小规模实验检查直觉,如果可以的话也许试试让别人复述你的假设。一个猜想被推翻并不意味着思考失败。只要它排除了一片区域,我们就知道下一步不必再往那里走。
退一步。检查自己是否忽略信息,无意中加强问题,或误解问题。有些时候在前面的思维过程中,我们对问题的转化可能无形中加强了问题,这一个问题是否完全等价于它的转化?它作为它背后的泛化问题,具有怎样的特殊性,该性质应该如何被利用?
思维的链条很长时,中途出错和遗忘的机会指数级的上升。因此要把已经得到的观察清晰、形式化地写下来,把一个很大的跨越拆成更小的中间命题,把已经发现的东西牢牢抓住。在这个过程中,尽可能避免用模糊的语言和感觉来描述。(除非你的感觉足以让你确认某个命题的正确性~)
思维受到阻碍难以推进时,尝试形式化地写下已知的进度后,强制进行短暂的放空与强制抽离,一段时间后(也许是五分钟,也许是几个月)再回归到问题本身,重置一下脑子的第一反应,跳出惯性思维,再会一下这个问题。
(不知道大家有没有玩过那个色度表找不同颜色的测试,一个有趣的技巧就是眨眼重置视觉)
硬思考的速度也非常依赖于大脑本身的内存和频率,这个感觉就很吃天赋了,关于后天锻炼大脑本身的方式,也许就只有好好吃饭好好睡觉,多运动多冥想。以及更可控的那一部分——多思考问题。
时刻知道自己正在怎样前进
思考最危险的时候,不一定是没有想法,而是做了很多事情,却不知道这些动作与问题有什么关系。
”有时候人很忙,但是不知道自己在忙什么。“
对着一个问题焦头烂额而不做出尝试的状态往往是低效的,为尽可能避免这种情况,尝试在思考时能够回答三个问题:我现在沿着哪条路线走?这一步准备验证什么?做到什么程度以后,我会继续、换路或者停下?
对。需要知道什么时候应该换一条路。
解决完一个复杂问题后,可以画一根时间轴。什么时候在理解问题,什么时候在尝试一种表示,什么时候被错误假设拖住,什么时候出现了关键转折,什么时候只是在重复没有信息的动作。
复盘的目的不是从此不走弯路。弯路无法避免,弯路的价值,是让我们下一次走进相似的弯路时,更快意识到自己正在走弯路。
判断是否换路时,也不要被已经付出的时间绑住。已经投入的时间能够成为经验,却不应该成为继续的理由。下一步怎么走,只需要比较从现在开始的成本、成功的可能和能够获得的信息。
沉没成本不参与重大决策。
从题走向问题
一道题通常替我们固定了 S 和 T。真实的问题没有这份便利。
面对一个问题,我们可能有许多不同的起点。问题也可能同时存在几个合理的表述。随着理解加深,我们还会不断修改自己希望抵达的 T,甚至调整 S 的设定——比如收紧或放松问题的一个界,增设条件,排除干扰,或是改变研究的目标。
因此,问题相比于题,我们多了一项工作:维护问题本身。
隔一段时间重新写一次问题,区分已经确认的事实、暂时的解释、未知的领域和自己希望得到的结论。检查原来的目标:我们离它有多远,是否存在其它抵达的路径,有没有一个更容易验证的中间目标。以及最重要的——它是否仍然值得抵达还是只是海市蜃楼。(“这个结论对吗?”)
在生活中仍是如此,不断尝试去维护那个一直困扰你的问题,然后观察它的条件的改变,已知的事实和需要推进的方向。一个遥远的最终目标也会被分成若干阶段性的终点;每到达一个 T,它又成为下一轮的 S。
面向更广阔的时间轴
在长期思考中,我们不必等待完整的道路突然出现。先辨认自己在哪里,想清楚希望把问题推进到什么状态,再制造一个能够带来信息的下一步。
保持清醒,时刻知道自己的思路朝着什么方向进展,现有的进度是什么。保持斗志与耐心,深思熟虑,然后相信自己在成功的道路上一步一步走着。