燃
这几年,总能听到一种说法:人长大了,就会慢慢失去对事物的感知力。我们不断重复着某些动作,直到它们变成肌肉记忆,变成简历上冷冰冰的熟练度。很多人说,那种因为做成了一件小事而激动得整夜睡不着觉的“燃”的感觉,只会留在十几岁的青春期里。
有时候,看着这些略带遗憾的论调,我会觉得好像我们注定要走向一个麻木的成年世界。可真的是这样吗?我并不这么认为。
粗糙的闭环
大一第一个期末周。2022年的12月。
晚上十一点半,图书馆的闭馆音乐准时响起。那是萨克斯版的《回家》,音质不太好,透过天花板上泛黄的广播喇叭传出来,带着一点轻微的电流底噪。
我是赶在关门前最后一批出来的。广州一月份的冬天,风是湿冷的,带着一种能穿透外套直接贴在皮肤上的黏糊感。从图书馆有暖气的大厅走到室外,温差让人忍不住打了个冷颤。同行的人脚步都很快,有人把连帽衫的帽子兜在头上,双手插兜,缩着脖子往宿舍楼的方向赶,大概是为了赶在阿姨锁门前回去,又或者是急着去后街买一份热腾腾的炒粉。
只有我慢吞吞地走在最后面。路灯的光透过两旁榕树的叶子打在水磨石地砖上,碎成一小块一小块的斑驳。我手里攥着几张打印出来的复习资料,A4纸的边缘已经被手汗捏得有些发皱。上面密密麻麻地用红蓝黑三色水笔标注着C语言的指针概念和几道必考的离散数学大题。我应该在背这些东西的,期末的绩点对一个民办三本的学生来说,是为数不多能握在手里证明自己没有彻底摆烂的筹码。
但我脑子里此刻完全没有那些复杂的公式和语法规则。
我的思绪还停留在几个小时前,或者说,停留在过去这一整个星期的某个幽暗的角落里。在这个学期即将结束、所有人都在为考试焦头烂额的节点,我第一次独立完成了一个有点像样的小项目。那是一个留言板。说它“像样”,其实只是对我自己而言,如果把它放在任何一个成熟的开发者面前,它大概连一个玩具都算不上。
后端是用 Node.js 写的。那时候我连 Express 框架的路由机制都还没完全搞明白,只是照着网上的教程,用最原始的 http 模块,写了一堆冗长且毫无结构可言的 if-else 来处理不同的请求路径。前端就更别提了,纯手敲的 HTML,没有任何 CSS 样式的修饰。默认的宋体字,一个生硬的长方形输入框,下面跟着一个灰扑扑的、带有 Windows 98 风格的“提交”按钮。
没有数据库。那时候我还不知道 MySQL 或者 MongoDB 是什么东西,连 SQL 语句都没写过。为了让留言能保存下来,我用 Node.js 的 fs 模块,把用户输入的数据硬生生地写入一个叫 data.json 的本地文件里。每次有人提交,程序就要笨拙地把整个 JSON 文件读取出来,解析成数组,把新的留言 push 进去,然后再重新序列化,覆盖写入原文件。
只要同时有两个人提交,这个破程序大概率就会因为文件锁死而崩溃报错。
但就在那天晚上,当我在那个丑陋的输入框里敲下“Hello World”,点击那个灰扑扑的按钮,看着浏览器标签页转了半个圈,然后页面刷新,那行字真真切切地出现在了输入框下方时,我愣住了。
那是一个极其粗糙的闭环,但它跑起来了。
意料之中的冷场
我记得我当时的心跳很快,那种感觉很难用语言准确描述。就像是你一直在看别人变魔术,突然有一天,你自己在家里用两个破纸杯和一根旧皮筋,也变出了同样的效果。
我迫不及待地想要分享这种喜悦。因为项目只跑在我的 localhost:3000 上,别人访问不到,我就用电脑自带的录屏软件,录了一段大概十秒钟的视频。视频里,鼠标移动到按钮上,点击,页面刷新,出现文字。我把这段画质被压缩得有些模糊的视频,发给了三个平时关系不错的朋友。
在按下发送键的那一刻,我甚至在脑海里预演了他们的反应。他们可能会问:“卧槽,这是你自己做的?”或者“牛啊,怎么弄的?”
但现实总是比想象来得平淡。
十分钟过去了,二十分钟过去了。走在回宿舍的冷风里,我时不时掏出手机看一眼微信。
两个朋友始终没有回复。那个时间点,他们大概率在打游戏,或者也在为明天的考试熬夜背书,一条没头没尾的短视频,显然不足以打断他们的节奏。
快走到宿舍楼下时,手机震了一下。第三个朋友回了消息。
“还不错哦。”
后面跟着一个微信自带的、戴着墨镜叼着烟的笑脸表情。
我看着屏幕上的这四个字,停在了一盏路灯下。那一瞬间,我确实有一丝隐秘的失落。这就像是你捧着一块自以为是金子的石头去给人看,别人只觉得这是一块形状稍微有些特别的鹅卵石。
但很快,这种失落就被一种更深沉的平静取代了。我突然意识到,他的反应其实是最真实的,甚至是我应该预期的。在他们眼里,这不过是一个没有任何美感可言的网页,是一个随时可以在网上找到无数替代品的无聊工具。他们看不到那堆乱七八糟的 if-else,看不到我为了解决跨域问题熬的两个大夜,更看不到那个被反复读写、随时可能崩溃的 data.json 文件。
心理学里有个词叫“宜家效应”,人们总是会对自己亲手制作的东西赋予不成比例的高价值。我当时大概就是陷入了这种偏误里。
可是,这有关系吗?
我站在风里笑了笑,把手机揣回兜里。没关系的。因为那个晚上真正让我感到“燃”的,并不是别人眼里的惊艳,而是我自己在那个瞬间确认了一件事:只要我愿意,我是可以通过一行行代码,在虚无中创造出一点实实在在的东西的。
这种确认,不需要任何人的点赞来背书。
第一百次的熟练
后来,日子就像按下了快进键。
大二,大三,大四。随着时间的推移,我写过的代码越来越多。我不再是那个连路由都搞不清楚的新手了。我学会了用 Vue 和 React 构建复杂的单页应用,学会了用 Spring Boot 或者 Go 语言写高并发的微服务,学会了用 Redis 做缓存,学会了写复杂的 SQL 联表查询,甚至学会了把项目打包成 Docker 镜像,通过 CI/CD 流水线自动部署到云服务器上。
我的绩点维持在了 4.02,拿了两次国家奖学金,简历上填满了各种竞赛的奖项和看起来颇具规模的商业级项目。我终于在这个不那么起眼的民办三本里,用一种近乎严苛的方式,证明了自己并没有随波逐流。
但我发现了一件很有意思的事。
当我后来完成那些比当年的留言板复杂一百倍、一千倍的项目时,当我看着成千上万条数据在数据库里平稳流转,看着监控大屏上的各项指标绿灯常亮时,我再也没有了那种想要录屏发给别人的冲动。
哪怕是完成了一个极具挑战性的架构重构,我通常也只是默默地 git push,关闭终端,伸个懒腰,然后去洗澡睡觉。
是技术变得无聊了吗?还是我变麻木了?
我花了一段时间去思考这个问题。后来我明白,第一次完成一件事的感觉,之所以和后来的第一百次截然不同,并不是因为第一次的技术含量有多高,而是因为“第一次”打破了一种极其坚固的认知边界。
在写出那个留言板之前,我潜意识里是一个“消费者”。我使用别人写好的软件,浏览别人做好的网页,遇到问题去搜索引擎上找别人给出的答案。代码对我来说,是一种存在于教科书和屏幕另一端的神秘力量。
但那个丑陋的、用 JSON 存数据的留言板跑起来的那一刻,那层壁垒碎了。
第一次做成一件事,它的核心命题从来不是“我做得有多好”,而是“我竟然能做出来”。它是一次对自我可能性的确权。那种“燃”,是火星第一次点燃干柴时的爆裂。
而到了第一百次,命题已经变成了“我如何能做得更好、更优雅、更健壮”。这是一种属于工匠的克制与打磨。火已经生起来了,它在炉膛里稳定地燃烧着,提供着持续的温度。它不再需要爆裂的声响来证明自己的存在。
熟练,并不意味着麻木。它只是激情换了一种更深沉、更持久的表达方式。
瘾
现在回想起来,2022年12月的那个冬夜,其实是我大学四年,甚至可能是我整个人生轨迹的一个隐秘的分水