一鼓作气冲上去
我终于想到一个比喻来描述我遇到不少 问题/任务 时的感觉了!——
需要完成的任务是「到达前面那个坡坡顶的平台」;现在「我在坡底的平地站着」。
好了我先随便跑上去看能不能冲到顶端… 嗯,是可以的——问题就解决了。
但是事情往往没有那么顺利——要是有的话,那件事情多半也就不是什么值得一提的事情了。想想大家说的各种 learning curve 之陡峭,你应该可以想像到——眼前这个坡可以是 很陡峭 的。结果就是,很可能你跑向那个坡,但是还没到达坡顶的时候你的动能已经为零了——当然也就重新滑到了坡底。下次若要重新尝试挑战这个坡,还得从原来的坡底开始。貌似是需要解决的问题本身的某个特性决定了事情的发展是这个样子的。(也有可能是因为做着做着这个问题「时间不够用了」,然后转移注意力到别的问题上了;于是回到这个问题的时候,自己已经不怎么记得上回干啥了、遇到了什么问题等等。)
情况有时候会令人惊讶地好:有些仍未克服的「坡」,在时隔比较长的一段时间之后,不作什么别的特别的准备,重新挑战,竟也莫名其妙地能够克服之。我想,这种情况是因为「自己体能变好了」——在编程的角度讲,这可以是「对编程概念的认识更加深刻了」,或者(在 Wikipedia-级的认识层面上)「听说过了更多的概念」。这种时候往往也就是「XX 无非就是 A, B, 和 C 那么一回事!」的时候。
有时候有点奇怪,我可以明确地感到这个(冲坡要么能冲上,要么冲的力气基本白费下次还得重来的)问题不存在。用同一个比方来说,就是那个坡其实不是 一个 坡,而是同一个方向上,首尾通过一些小平地连接的一系列的坡。每次冲如果冲到了高一级的平台上的时候,由于是平的,所以不会滑会下去,所以冲上来所花的力气显然没有白费;而下次朝着这一系列坡的方向抬头看看高处的几个坡顶,准备挑战去到下一个「小平地」的时候,可以从已经来到了的这块「小平地」起步——而不用从地面开始重头来过。一个其实不太好的例子就是上回尝试学 Haskell 的时候,未能成功冲上 "functor" 这个坡,但是动能减为零的时候脚底大概已经是类型系统、curried 函数之类的坡以上的某快小平地了,所以下回可以直接从那里开始。
这个比方 inspire 了一个学习窍门——改变要冲上的坡使其具有更多的「小平地」。其实虽然是现在想到的这个比方,但是类似的 idea 早就存在了——那些「小平地」其实又叫作 "checkpoint". 明确定义好自己要冲上的坡,顺便人为地在坡上凿出那些可以落脚的小平地,一步一步(其实更应该说「一冲一冲)地朝某一系列的坡的坡顶进发——一定是会逐渐、稳定地有所收获的——而且收获的平均速度肯定比「退后几步,加速加速一次冲到一条很长很陡的坡的坡顶」的思路要快。