早上七点半,我被雨声叫醒,不是闹钟。窗外灰蒙蒙一片,雨点打在玻璃上,发出”沙沙”的声响,像极了我那台老机械键盘的敲击声。我翻了个身,猫已经抢先一步占据了床尾的最佳位置,眯着眼看我,仿佛在说:”今天不用通勤,对吧?”

我笑了。是啊,周六,而且这雨势,显然是要下一整天的节奏。手机上有几条工作消息,我瞥了一眼,都是些不紧急的bug,索性标记为”稍后处理”。这一刻,我突然想起年轻时那个倔强的自己——曾经在一个台风天,硬是拖着笔记本去公司,因为”线上环境有问题”,结果整栋楼就我一个人,对着服务器发呆。二十年过去了,我终于学会了在雨天给自己按个暂停键。

程序员这个职业,说起来有点讽刺。我们创造了无数让人”上瘾”的产品,自己却最容易陷入那种”永远在线”的焦虑。Push通知、Issue追踪、CI/CD流水线……这些本该是工具的东西,慢慢变成了枷锁。而雨天,尤其是那种不紧不慢、没有雷暴的细雨,反而成了我最好的”断网”理由。

我煮了杯咖啡,深烘的豆子,苦味重一些。猫闻了闻,嫌弃地走开了。我窝在书房那张已经坐出凹痕的扶手椅里,从书架上抽出一本书。这个动作本身就有仪式感——不是打开Kindle,不是点开PDF,而是真实地触摸纸页,感受它的重量和温度。书架是我去年亲手打的,用的松木,边角处理得有点粗糙,就像我早期写的那些代码,能用,但不够优雅。

那些陪我度过雨天的书

《代码大全》——我的”技术圣经”

这本书我买了两本。第一本在2010年,那会儿还在写VB6,书是影印版的,纸张薄得能透光。我像个刚学会翻墙的少年,如饥似渴地读着里面关于”防御性编程”的章节,然后在公司的老旧系统里疯狂实践,结果因为过度设计被组长骂了一顿。第二本是前年买的正版,精装,厚实。重读时我发现,真正重要的不是那些设计模式,而是前言里的一句话:”好的代码首先是写给人看的,其次才是给机器执行。”

雨天读它,有种奇妙的反差。窗外是混沌的、无序的自然,而书里是严谨的、可预测的逻辑。我会拿支铅笔,在页边做批注,有时候是赞同,有时候是吐槽(”这条在微服务架构下已经不适用了”)。这种慢条斯理的阅读,和工作中那种”Stack Overflow驱动开发”完全是两个世界。后者是求生,前者是生活。

《禅与摩托车维修艺术》——当理性遇上意义

这本书是当年一个产品经理推荐给我的。说实话,第一次读我完全没看懂,只觉得作者修车那段写得挺细致,适合我这种喜欢拆东西的人。直到五年前,我经历了一次特别严重的职业倦怠——连续三个月加班,项目上线即下线,团队解散。那个冬天,我把自己关在家里,重读这本书,突然懂了。

文章插图

“良质”(Quality)这个概念,听起来玄乎,但放在我们这个行业,其实就是那种”写代码时的手感”。你知道的,有时候你写完一段逻辑,跑通测试,提交PR,整个过程如行云流水,心里有种说不出的舒坦。那就是良质。而更多时候,我们在赶工期、改需求、填坑,代码只是代码,没有灵魂。雨天读这本书,雨声成了白噪音,让我能慢慢思考:我到底是在”修摩托车”,还是在”制造噪音”?

《三体》——宇宙尺度的浪漫

我知道,推荐《三体》有点cliché,尤其对我们这个群体。但我要说的不是黑暗森林,不是降维打击,而是第一部里那个”不要回答”的警告。2015年,我在一个外包项目里,客户是某国企,需求文档写得像天书。我每天的工作就是”回答”那些莫名其妙的要求,然后看着系统越来越臃肿。那段时间,我每晚睡前读《三体》,读到叶文洁按下发射键时,心里一惊——我们不也经常这样吗?明明知道某个方案是饮鸩止渴,但迫于压力还是点了”Merge”。

雨天读科幻有种特殊的沉浸感。窗外的世界被雨水模糊了边界,书里的宇宙却异常清晰。我会想起年轻时熬夜写MUD游戏的日子,那时候觉得代码能创造世界,现在……嗯,现在依然这么觉得,只是世界更复杂了,bug也更多。

《瓦尔登湖》——离线生活的模板

这本书是老婆送的,她说我”需要一点非电子的东西”。我当时的反应是:”梭罗有考虑过网络延迟问题吗?”但某个雨夜,我因为服务器宕机被on-call吵醒,处理完问题后睡不着,随手翻开这本书,读到”我步入丛林,因为我希望生活得有意义”,突然有点破防。

我们总在追求”高效”,毫秒级的响应,99.99%的可用性,但自己的生活呢?梭罗在湖边两年,我连两个小时的专注都做不到。现在,雨天成了我的”瓦尔登湖”。不刷GitHub Trending,不看Twitter上的技术撕逼,就单纯地读几页书,听一会儿雨。猫在旁边打呼噜,咖啡凉了,但心里是满的。

雨天的阅读方法论(伪)

作为程序员,我本能地想总结一套”雨天阅读最佳实践”,但试了好几次都失败了。因为阅读这事儿,和写代码不一样,它不需要优化,不需要重构,甚至不需要目标。不过我还是想分享几个”模式”(pattern),仅供参考:

  • 单线程模式:只读一本书,不并行。就像单核CPU时代的程序,简单,但专注。
  • 事件驱动模式:让雨声、咖啡香、猫的呼噜成为触发点,读到哪算哪,不预设进度条。

文章插图

  • 离线模式:手机扔客厅,电脑合盖。真正的”飞行模式”是物理隔离。

当然,bug总会有的。有时候读着读着,脑子里突然蹦出一个解决方案,赶紧找纸笔记下来。这时候纸笔的优势就体现出来了——不会弹窗,不会自动更新,不会突然死机。

写在雨停之前

雨还在下,但小了很多。猫已经换了个姿势,肚皮朝上,四脚朝天。我看了看表,下午三点,窗外天色暗得像傍晚。今天一行代码没写,但脑子里莫名清爽。

前几天和同事聊天,他说现在在学Rust,”因为不想被时代抛弃”。我理解那种焦虑,二十年来我见过太多技术浪潮,从ASP到AJAX,从jQuery到React,从虚拟机到容器……我们这个行业,”保持更新”是一种生存本能。但有时候,我也想对自己宽容一点。不是所有时间都需要”变现”,不是所有输入都必须有输出。

雨天读书,就是我最奢侈的”无用之用”。它不会让我成为更好的程序员(也许吧),不会提升我的KPI,但它让我记得,在”高级工程师”、”技术专家”、”架构师”这些标签之外,我首先是一个喜欢听雨声、摸纸页、偶尔发呆的普通人。

书架上还有几十本没拆封的书,像一个个待开发的模块。我知道,有些会让我失望,有些会惊艳我,有些会永远停留在”想读”状态——就像我的side project文件夹。但那又怎样呢?重要的是,它们在那里,而我有雨天的下午。

好了,猫醒了,过来蹭我的腿,该去添粮了。雨还没停,但我的”系统”已经重启完成。明天太阳升起,我还会继续写代码,会继续在Issue里battle,会继续为那个0.1%的性能优化绞尽脑汁。但至少今天,我拥有了一场完美的雨天,和几页被铅笔划过的好书。

这就够了,不是吗?


窗外的雨声渐渐稀疏,远处传来汽车驶过积水路面的声音。我合上书本,发现最后一页夹着一张十年前的火车票,那是我第一次去北京面试的车票。背面用铅笔写着:”Hello, World!”