礙
凌晨两点半,宿舍里只有机箱风扇转动的嗡嗡声,还有室友老赵沉重的呼吸声。我的显示器屏幕泛着幽蓝的光,IDE里的代码行在暗色主题下显得有些刺眼。光标在第427行不停闪烁,那里停着一个我找了三个小时还没解决的空指针异常。
我拿起桌上那罐早就没气的可乐喝了一口,脑子里突然浮现出之前偶然看到的一句话,愚者妄顺,智者求缺。
这几年,尤其是上了大四,站在学校和社会的交界线上,这句话在我心里扎得越来越深。乍看之下,这似是一句带点清高意味的对他人的评判,好像把自己摆在了智者的位置上去俯视众生。但其实细细想来,随着我敲过的代码越来越多,见过的秋招百态越来越杂,我发现它更像一枚透镜,清晰地映照出人群的行止与内心的底色。
我常将这两种心态比作两种赶路的方式。在软件工程这个专业里,这种比喻再贴切不过了。
愚者偏爱平坦的大道。在我们的语境里,这条大道就是铺设完好、路标清晰的成熟框架和现成代码。老赵的毕业设计进度比我快得多,他选了一个非常常规的电商后台管理系统。他在GitHub上找了一个星标很高的开源项目,把Vue的前端模板克隆下来,后端连上Spring Boot,改了改数据库的字段,换了一套UI皮肤,一个看起来功能完备的项目就跑起来了。
走这条路真的很省力。文档写得明明白白,遇到报错把提示复制到搜索引擎里,前几条结果就能告诉你怎么修改配置。这里鲜少有意外的风景,因为一切都在别人的预料之中。老赵每天晚上十一点准时上床睡觉,他的系统运行得很平稳,就像他对自己未来的规划一样。他打算回老家考个编制,或者进一家稳定的国企,做着维护旧系统的工作,按部就班地结婚生子。
这大概就是妄顺。顺应着最省力的路径,顺应着大多数人的选择,顺应着那些已经被验证过无数次的成功学模板。在软件测试里,我们管这种只走正常流程的测试叫happy path。在happy path上,用户永远输入正确的格式,网络永远不延迟,数据库永远不宕机。程序跑得无比顺畅。
可现实生活哪有那么多happy path。
智者则总在寻找那些未经标注的岔路,哪怕崎岖、哪怕弯绕,也要走上去看看,那里究竟藏着什么。这也就是所谓的求缺。
我不知道自己算不算智者,但我确实在毕设选题时,脑子一热选了一个基于底层图形库自己写渲染引擎的题目。没有现成的轮子可以调,没有一键生成的脚手架。我得去啃那些晦涩的计算机图形学论文,得去处理矩阵变换时极其微小的浮点数精度丢失问题。
这条路太崎岖了。就像我现在面对的这个空指针异常,它藏在极深的调用栈里,只有在特定的内存分配顺序下才会触发。我顺着报错信息一层层点进底层源码,看着那些没有任何注释的C++代码,经常感到一种强烈的挫败感。
但我偏偏想走上去看看。因为我知道,调用别人的接口虽然快,但我永远只是个API调用工程师,我不会知道屏幕上的一个像素到底是怎么被计算出来并打在显示器上的。当我花了整整三天时间,推翻了两次架构,终于把那个导致内存泄漏的死角清理干净,看着屏幕上成功渲染出一个带有真实阴影的茶壶模型时,那种感觉是直接复制粘贴永远无法体会的。
那就是藏在岔路里的风景。它不是现成的,它是你用无数个熬夜的黑眼圈和掉落的头发换来的。
其实大四这一年,这种妄顺和求缺的对比,不仅仅体现在写代码上,更体现在我们面对未来的态度里。
九月份秋招刚开始的时候,整个学院都弥漫着一种焦躁的气氛。大家都想挤上那条最平坦、最光鲜的大道,去互联网大厂,拿令人艳羡的薪资。辅导员在群里发各种宣讲会的信息,大家穿着不合身的西装,拿着排版得一模一样的简历,去背诵那些面经上早就总结好的标准答案。
面试官问,你遇到过最大的困难是什么。大家就按照STAR法则,讲一个其实并没有多困难的故事,最后得出一个圆满的结论。每个人都在试图向面试官证明,自己是一个完美适配大厂流水线的零件,没有棱角,没有缺陷。
我也随波逐流地投了几十份简历,参加了几场群面。在那种环境里,我感觉自己像是一个被编译好的可执行文件,只能按照既定的指令运行。如果遇到超纲的问题,就会抛出异常然后崩溃。大家都在努力掩饰自己的不足,试图展现出一个完美无缺的形象。
后来有一次,我去了一家规模不大的创业公司面试。那是初创团队,办公地点在一个有些破旧的产业园里。面试我的技术总监没有问我那些八股文一样的算法题,而是直接丢给我一台电脑,指着一段极其混乱、充满历史遗留问题的代码说,这块业务逻辑现在经常卡死,如果是你,你打算怎么重构。
那是一段千疮百孔的代码,也就是所谓的缺。
我看着那些毫无逻辑的嵌套循环和满天飞的全局变量,其实心里没底。但我没有像在其他面试里那样去背诵设计模式的理论,而是老老实实地告诉他,我可能会先写一套单元测试把核心逻辑覆盖住,然后再一点点拆解那些耦合的模块。我还指出了其中几个我目前也没想好怎么处理的死结。
我以为我会被淘汰,因为我暴露了自己的不确定和能力边界。但那个总监却笑了,他说,真实的业务环境就是这样的,从来没有完美的架构,只有不断在屎山代码里缝缝补补的日常,我们需要的是敢于面对这些缺陷,并愿意弄脏双手去收拾烂摊子的人。
那次面试让我拿到了秋招的第一个offer。也正是在回学校的地铁上,我重新咀嚼了智者求缺这句话。
求缺,并不是受虐狂般地去寻找痛苦,而是一种对真实世界的清醒认知。真实的系统总是充满bug的,真实的人生也总是有遗憾和漏洞的。如果一个人只愿意走平坦的大道,只接受完美和顺遂,那他的内心其实是非常脆弱的。一旦生活偏离了预设的轨道,哪怕只是出现了一个小小的错误,他就会像没有做异常处理的程序一样,直接崩溃闪退。
而求缺,就是在主动拥抱