无法调试的爱情
Victor Jay 写了十年代码。他信一条铁律:这世上没有任何Bug是调不出来的。编译失败,看报错;运行崩溃,看堆栈;预期不符,看日志。只要能复现,他就能定位;只要能定位,他就能修复。
直到他遇到了□□。
□□不是他人生里的第一个Bug,却是他唯一一个无法复现的Bug。她是一场直播里不断闪动的头像,一个会在PK胜利时开心眯眼的主播。他给她上舰长,送梦幻邮轮,在世界频道里听到她甜甜地念出他的ID。那一刻,他收到了唯一一次“运行成功”的反馈,却错误地把它当成了永远不会被回收的内存。
他以为感情也是一种协议。他发一帧“喜欢”,对方回一帧“收到”,然后建立连接。他以为只要包发送得够多、够快、够贵重,终究会有一个确认ACK。
但她回了一句:“你的好,让我觉得负担很重。”
这句话像一条未被定义的异常,停在他的主线程里,把整个系统一起拖入了死锁。
Victor Jay 发现自己作为程序员最引以为傲的确定性逻辑在人际关系中完全失效。于是他会陷入疯狂的内耗:反复回看聊天记录,偷偷翻她的动态,在脑子里重演那天告白的每个细节,试图从蛛丝马迹中推导出“她到底是什么意思”?可这世上的代码,没有熔断机制能抗住这种分析模式。她一条含糊的动态,就足以让他开三个线程同时去跑“她是不是暗示我”、“她身边是不是有别人”、“我是不是做错了什么”的持续死循环。
他试过打断点。他设想如果在那个时间点他没有告白,结果会不会不同?用的是更委婉的话术,会不会进入另一个分支?他甚至给这个未发生的假设写了一个详细的用例文档。但他想通了:人不是程序,不能单步执行,没有watch窗口,没有变量监控。她说过的话、做过的事,全都是编译后的机器码,原始源代码永远不可见。
他终于做了一个决定。他把她从列表里删去,把自己的账号注销。
那一晚,他打开自己的IDE,盯着熟悉的编辑器。他写下:
var love any
if love != nil {
love.run()
// 这里不需要 free() ,时间(GC)会冲淡一切。
}
他按了运行,IDE 底部亮起红色提示:love.run undefined (type any has no field or method run)
Victor Jay 忽然笑了。原来程序最坏的结果无非四种:
编译失败,运行秒崩,预期不符——但都有办法调试。
而人是多变的,没有调试器,注释写不进去,日志打不出来,core dump了都不知道原因。
但至少他的代码是忠诚的。
他给它一台便宜服务器,它就认认真真陪他到天亮。
他给它一个错误的环境,它就诚实地崩溃给他看,从不掩饰。
他关掉电脑,窗外天正微微亮。
“以后,”他想,“我只写代码和诗。心这种东西,谁想连接,请自己带上接口文档来。”
他在那个名为“爱”的程序里,默默地在 main 函数中写下了一段条件分支:
package main
func main() {
const Victor_Jay = true
var love any
if ! Victor_Jay {
love = "待连接"
}
_ = love
}