我永远记得那个下午,办公室里其他人都在安静地敲代码,只有我盯着一台老旧的收银机终端代码发呆。需求很简单:把支付接口的超时时间从5秒改成3秒。结果我愣是花了两个小时,因为原来的代码里嵌套了七层if,还混着一堆全局状态。那一刻我想起自己刚刚在力扣上穿着紫衣战胜了三百个并发,感觉讽刺得想笑。刷了五百多道题,最高纪录周赛前两百,我竟然连改个超时都不敢下重手。
后来我想明白了,力扣的所有题目都是被设计好的闭环。输入有限制,输出有标准,复杂度有天花板,就连让你优化的方向都写在题名里。但现实里的代码是开放的,数据会迟到,字段会为空,依赖会崩,经理会催,甚至需求本身每天都不一样。在力扣上你追求最优解,但工作中往往只能选择最不坏的解。我开始怀疑,自己每天花两小时刷题,到底是在锻炼脑力,还是在逃避那种不确定性和毫无章法的真实。
不过,现在让我彻底否认力扣也不对。它确实给了我一种难得的习惯,就是拿到任何问题都先想边界条件。空数组怎么办,越界怎么处理,极端输入会不会爆栈。这种肌肉记忆在很多次代码评审里救了我的脸面。而且刷题练出来的复杂度敏感度,让我在设计数据库索引或者选择缓存策略时,本能地估算数据规模与时间线之间的关系。只是这些能力并不会自动映射到工程里,就像你在健身房练出了漂亮的胸肌,但真实的冲撞中你可能连站位都不会。
于是我开始换一种方式刷题。不盯排名,也不再追求每日打卡,而是把每一道题当成一次思维游戏的复盘。我会刻意去想,这个问题的解法如果放在真实系统里会有什么缺陷,内存占用会不会太高,缓存淘汰策略是不是太理想化。我也会把工作中遇到的烂代码提取成小例子,在脑子里抽象出一个可解的问题,再尝试用学过的数据结构去重新组织。这样折腾了几个月,我再也不为了AC而兴奋,却能在面对一堆乱麻时更冷静地把线头挑出来。
所以如果你问我,力扣值不值得刷?我觉得值得,但千万别把它当成万能钥匙。它是一副很好的哑铃,可以练出结实的逻辑肌肉,可它不会教你如何在球场上跑位,也不会替你跟队友沟通。真正的编程能力,是在混乱的需求里保持清晰,是在别人的烂摊子上重建秩序,是在时限和资源之间做取舍。刷题只是很小的一部分,甚至可以被视作一种高级的娱乐——比打游戏上瘾,也比打游戏更让人产生自己变强的错觉。但只有当你回到现实项目,狠狠摔一跤之后,才会分清虚拟分数和真实能力之间的那条鸿沟。