凌晨两点。屏幕上的 NullPointerException 还在死循环。红字晃眼。手指头悬在键盘上,僵得跟个生锈的零件似的。调参数,加日志,死磕。绕不出去。真没辙了,合上电脑。顺手从书架最里头拽出本落灰的《计算机算法与实践教程》。本来寻思随便翻两页,找点灵感。结果一屁股坐下,咖啡凉透了,直接耗到天亮。人呐,有时候就得靠点“笨”东西,把自己硬拽出泥潭。

刚翻开那会儿,心里直打鼓。又是满屏干巴巴的伪代码?还是冷冰冰的时间复杂度公式?没成想,徐保民偏不这么干。他把每个算法的运行过程,掰开,揉碎,全摊在你眼皮子底下。不急着把结论拍你脸上。倒像领着你在这迷宫里瞎转悠。哪条道通,哪个变量在这儿拐弯,哪儿是坑,标得明明白白。现在市面上算法书太多了。恨不得翻过三页就甩你个“终极答案”。或者干脆拿现成题解糊弄。这本不一样。它就愿意陪你,一步一步蹚。翻到贪心法那儿,作者直接上完整程序。跑一遍。中间某个变量咋跳变的,都标得清清楚楚。我读得慢。干脆扯张草稿纸,拿笔在旁边跟着画状态图。说实话,现在谁还手画啊?可把那些看着头大、理不清的东西,拆到能看清纹理,这事儿,真挺解压。

读到回溯法。手指头停了。书里写得挺直白:撞了南墙,退回上一步。撤销刚才的选择。换条道试试。听着像废话?落到自个儿身上,谁乐意轻易认栽啊?我们总爱一条道跑到黑。好像承认走错了一步,就等于把之前的汗水全泼了。可书里那段代码,一步步演示着“试错—记下—回退”。代码是冷的。可那种“允许你走弯路,也允许你停下来重选”的劲儿,挺扎心。脑子里立马跳出前年做方案那档子事。数据明明指着反方向了。我还硬着头皮往下推。最后连整个团队都跟着陪跑。要是当时能像回溯算法那样,干脆利落地“剪枝”撤回来。能省下一大半头发。算法当然替不了你拿主意。现实里也没个 Ctrl+Z。可它好歹把试错的底牌,亮给你看了。有时候,承认走错路,比硬着头皮往前拱,难多了。也更需要勇气。

贪心法那章,作者特意搁了个注脚:眼下捡到的便宜,未必是最后的赢家。我又想起前年接的那个项目。为了赶进度,全按“贪心”路子走。能省一步,绝不多走。能拿眼前的指标,绝不管长远。结果呢?后期维护跟填无底洞似的。团队连熬几个大夜,才勉强把坑填上。书里没扯什么职场厚黑学。就老老实实跑了一遍程序。可那种“局部最优换不来全局胜利”的憋屈,我算是真切地咽下去了。算法不跟你玩虚的。它只把取舍的账本摊在桌上。剩下的苦果,自己吭哧吭哧嚼。有时候我们自以为在高效推进。说白了,不过是用战术上的瞎忙,糊弄战略上的偷懒。当然,这话放商场上未必全对。毕竟有些时候,“先活下来”就是最大的全局。但纯走程序逻辑的话,贪心,确实最容易翻车。

分治法教人怎么把大麻烦拆成小疙瘩。分枝定界法教人怎么在一大堆可能性里,咔嚓剪掉没用的枝丫。读到这儿。我突然咂摸出味儿了。这本书最戳我的,压根不是塞给我多少解题套路。而是它递过来一种对付烂摊子的态度:别慌。面对一团乱麻。拆开。揉碎了看。试错了就退回原处。眼下的捷径,多留个心眼。再大的难题,就一刀一刀慢慢切。它不给你画大饼说能抄近道。只拍胸脯保证:只要你按着步骤走,总能摸到出口。在这什么都恨不得踩风火轮的时代。这种不赶时间的踏实感,反倒成了抢手货。不过话说回来,真到线上流量洪峰的时候,哪有时间慢慢分治?但心里有这套逻辑。至少崩的时候,不至于连锅端。

书盖上。窗户外头已经透进点鱼肚白。屏幕上的报错还在那儿挂着。但我心里那根弦,松了。日子大概本就没有什么完美算法。无非是在分治里理顺头绪。在回溯里学会撒手。往后要是再撞上解不开的题。真没必要拿头去撞。退半步。瞅瞅能不能劈出条新道。行了。就写到这。代码还得继续调去。