晚上十一点。屏幕右下角“啪”地跳出来个红字弹窗,写着“运行时错误”。我盯着那行字发愣。鼠标箭头悬在“调试”和“结束”中间,就是不敢往下落。说实话,那一刻我挺恍惚的。生活里那些让人干着急、转不过弯的瞬间,跟卡在这行代码里的感觉,真他妈一模一样。
上周收拾书桌,在一堆过期的发票和半包受潮的抽纸底下,刨出本老掉牙的书,《Visual Basic程序设计习题集与上机指导》。纸页黄得跟旧报纸似的,书角卷得跟咸菜干一样,扉页上还歪歪扭扭写着“2012年秋,及格万岁”。几年前赶计算机等级考试的时候,这玩意儿陪了我整整一个学期。里头塞满了习题、上机步骤、错误排查指南,外加三套上机模拟。那时候我特迷信“标准答案”,觉得写代码就是非黑即白。多敲个空格,漏掉个分号,程序直接罢工。非得照着指导书,一步不敢错地往下走,直到绿色进度条走完,跳出个预期的结果,才敢喘口气。这事儿大概就是这么个意思。当年我总觉得,只要步骤对,人生就不会翻车。
后来进了社会,踩了坑才发现,日子压根没有“编译通过”这回事。咱们老爱用敲代码的那套规矩去套生活:找份工作,得按预期来;处段感情,逻辑得自洽;连周末去哪儿吃,都得精确到几点几分。前年我换工作,非按着招聘JD里的条条框框去硬套自己,简历改了八版,面试时脑子跟死机似的,最后连个面试邀请都没捞着。谁不怕报错啊?怕进度条死死卡在99%,怕别人瞅见咱们“运行失败”的丑态。于是天天熬夜回溯、死磕修改,非要把自己硬生生塞进那份严丝合缝的“标准答案”里。真挺累的,是吧?
其实那本破书里,早就写着解法。翻到“程序调试与错误处理”那一章,作者压根没教你怎么避开报错,只手把手教怎么看错误提示、怎么揪出毛病、怎么让程序在崩了的情况下还能接着跑。当年只顾着背考点、刷模拟卷,这话左耳进右耳出。现在回头看,才咂摸出那股子耐心。代码多宽容啊。允许你改来改去。允许你拿注释把某段代码盖住。允许你在控制台里打印中间变量去瞎探路。人活着,凭什么不行?我觉得吧,可能未必是长大让我们学会了调试,倒可能是生活逼着我们习惯了带病运行。那些黄了的项目、嘴瓢说错的话、选岔的路口,都不是致命伤。它们顶多是系统在敲你脑袋:这儿逻辑得重新盘一盘。或者,这路本来就不该这么走。当然,我也知道,不是所有报错都能靠耐心调好。有时候就是底层架构不行,硬改只会崩得更惨。这时候承认“暂时跑不通”,反而能喘口气。
前阵子接了个新活儿,进度卡了半个月,连个毛都没见着。每天盯着电脑屏幕上一长串待办事项发呆,脑子里全是“完了,搞砸了”的警报声。后来干脆一闭电脑,下楼买了瓶冰水。站在自动贩卖机前面,看着玻璃上自己那张垮着脸的倒影,心里那块石头突然就落地了。咱们老觉得,长大就是得一次写出完美运行的代码。扯淡。长大是学会了在报错的时候,不急着关窗口,耐着性子读一行提示,然后老老实实按下F8,一步一步往下跟。中间变量算错就错呗。循环多转两圈又怎样。某个函数暂时吐不出值也随它去。生活又不是个一次性交付的成品,它就是个永远在迭代的开发环境。
书的后半截全是模拟考和发布指南,教人怎么把程序打包成可执行文件,怎么让它脱离开发环境自己跑。当年我天真得很,以为“发布”就是大结局。现在才懂,所谓发布,不过是把一段还没跑顺的代码,先扔服务器上挂着。它照样会报错。照样得修。照样有人半夜爬起来查日志。咱们拼命想把自己包装成“稳定运行”的样子,却忘了那些看着顺风顺水的日子,背后全是一行行被打断、重写、重新编译的痕迹。
屏幕上的红字还在闪。我没点“结束”,切进了调试窗口。外头已经黑透了。城市像台闷头转的后台机器,偶尔蹦出几条无关紧要的日志。明天能不能顺当,我现在卡在这儿是不是非得走的一遭,谁说得清呢。管他呢。至少今晚,我认了。允许自己暂时跑不通,就这一次。