上个月,我报名了一场黑客松。新建了一个文件,命名为 ideas.md。四十八小时后,它还是空的。没有崩溃,没有摔键盘退出,只有一个闪烁的光标,和一个什么都给不出的大脑。真正吓人的不是空文件,而是我说不清它为什么是空的。

打开网易新闻 查看精彩图片

我曾经是那个点子多到用不完的人。有一个版本的我,笔记应用里塞满了半成品副业项目;有一个版本的我,凌晨一点还在写代码,因为好玩,不是因为截止日期在催。后来生活给了我一些没预料到的个人变故,这里不展开细节,但它把我击倒了。我离开了代码。那算不上一个决定,生存模式本来就不给副业留空间。

等事情平息得差不多了,我试着回来。我以为会像骑自行车一样。并不是。

  • 黑客松以前像游乐场,现在像一场我没复习过的考试。
  • 我的信息流里全是别人在发布、上线、公开构建,而我连给一个变量命名都费劲。
  • 生产力系统?全试过了。番茄钟、Notion 面板、习惯追踪器。事实证明,你没法靠番茄钟把自己从空虚里番茄出来。
  • 专注力时有时无。我打开一个教程,二十分钟后意识到什么都没进去。我打开一个标签页,忘了为什么打开。

在这一切底下,有一个很轻的声音:万一这从来就不是你擅长的事呢?很长一段时间里,我相信了它。我曾经拥有的东西消失了,被删除了,404 Not Found。

后来我意识到,我读错了状态码。404 Not Found 的意思是那里什么都没有。你一直问,答案一直是不。(较真的人会说,严格讲 410 Gone 才是“大概率永久”的那个。但没有人会在灵魂深处感受到一个 410。)

503 Service Unavailable 的意思完全不同。服务器还在。你要的东西还在。只是它现在处理不了请求。HTTP 规范 RFC 9110 这样描述它的成因:“……临时过载或计划内维护,很可能在一段延迟后得到缓解。”把这句话读成关于一个人的,而不是关于一台服务器的。这可能是我在一份规范里读到过的最安慰人的话。

503 甚至可以带一个 Retry-After 头。那是服务器在说:不是现在,晚点再试。不是永别,只是还不是时候。这些描述的不是一个失去了热情的人,而是一个在艰难季节里以 100% CPU 跑了很久、没有维护窗口、还纳闷为什么每个响应都很慢的人。

这让我意识到一件有点难堪的事:我们从不会像对待自己那样去运营一台生产服务器。我们给系统健康检查、限流、自动扩缩容和维护窗口。我们给自己咖啡因和愧疚。所以我开始把自己当成一个我真正在乎的系统来对待。

别再在紧循环里重试

每个开发者都知道,当客户端用重试猛砸一台吃力的服务器会发生什么:变慢会变成宕机。所以好的客户端用指数退避。等一等,重试,等更久,再重试。我做的恰好相反。每周我都往自己身上扔新东西:又一场黑客松、又一门课、又一个 30 天挑战、又一套闪亮的新装备。每次没对上,我就把它当成自己坏了的证据,然后更用力地重试。那不是自律,那是从四面八方对自己发起 DDoS。

所以我在让队列排空:更少的“应该”,更长的尝试间隔,不再把一个状态不好的日子当成判决。退让不是放弃。休息是协议的一部分。

问题大概率不在代码里

如果数据库着火了,刷新前端修不好它。我消失的火花感觉像是一个编码问题,所以我一直尝试编码层面的修复。新框架、新项目、新编辑器主题(这个我不太自豪)。但根因在上游:睡眠、压力,还有那些为了“回归正常”而被我压下去的个人问题。你的大脑会做你手机内存不足时做的事:杀掉后台应用,保住核心运转。创造力、好奇心、那种只为好玩而做点东西的冲动?都是后台应用。最先被干掉。这不是性格缺陷,这是资源分配。

所以解药不是又一个框架。是睡眠、食物、运动、人,以及真正去处理那些难的事。如果难的事很重,找个人聊聊(朋友、心理咨询师、医生)不是软弱。那是去读日志,而不是靠猜。

冷启动就是慢,这是规范,不是 bug

如果你部署过无服务器函数,你就知道冷启动。长时间闲置后的第一个请求又慢又笨拙。没有人会看着一次冷启动,就断定这个函数永远坏了。但我对自己做的正是这件事。回归后的头几次写代码,感觉迷糊、缓慢、毫无乐趣,我把这当成了火花已死的证据。

我慢慢接受的是:动机是一个滞后指标。我一直等着先有感觉再开始。但感觉通常出现在你开始之后,而不是之前。心理学家甚至给这种工作方式起了名字:行为激活——先行动,让感觉追上来。你不会等实例预热完再发请求。请求本身就是让它热起来的东西。

发 ping,别发 payload

当一台服务器很吃力时,你不会把最重的请求发给它。但那正是我一直对自己提的要求。“为这场黑客松想出点创新的东西。”“做一个拿得出手的副业项目。”“开始一个 100 天连续打卡。”那是瞄准一台连 ping 都应答困难的服务器的 50MB 载荷。所以现在我在发 ping:

  • 在旧项目里修一个小 bug。
  • 重做一个我以前做过的东西,完全不要求它新。
  • 写一个 20 行的脚本,唯一的工作就是让我笑一下。(免费点子:一个吐槽你提交信息的命令行工具。)
  • 读别人的代码,而不是写自己的。
  • 25 分钟就停,哪怕进展顺利。给明天留点东西。

小。能完成。低风险。目标不是生产力,是一个 200 OK。每一个成功的响应都在告诉系统:可以再多承担一点负载了。

点子不来自空文件

我以前以为有创造力的人身上装着一台魔法点子生成器。他们没有。他们只是在留意东西。点子来自输入。当你被掏空时,没有什么可以重新混合,所以 ideas.md 当然是空的。垃圾进,垃圾出。什么都不进,什么都不出。

我在试的是:一份烦人清单。每次有什么东西惹到我,我就写下来:一个要点六下才能做一件事的应用,一个我每周手动做的任务,一个差一点就对了的工具。不要求去构建其中任何一个。每一个烦人之处,都是来自真实生活的一个功能请求。为一个人构建。忘掉“创新”。解决你自己的小问题。Git 之所以存在,是因为林纳斯·托瓦兹(Linus Torvalds)需要给自己的项目做版本控制。别有压力。有目的地消费。读一个奇怪的仓库,看别人直播写代码,读一份宕机复盘。让别人点子撞上你的。

下一场黑客松,我不会带着一个空的 ideas.md 走进去。我会带着我的烦人清单。

如果我有状态页,它现在会这样写:STATUS: DEGRADED PERFORMANCE。调查中——这是 503,不是 404。已定位——过载,不是能力问题。监控中——发 ping,需要时退让。已解决——还没有。“还没有”比“永远不”好太多了。

我不确定火花具体什么时候回来。也许它会看起来不一样:少一点烟花,多一点余烬。我开始觉得这没什么。热情从来就不该是一个硬依赖。好奇心足够用来开始。有些日子,出现就够了。 publishing 这篇文章,是我很久以来返回的第一个 200 OK。

HTTP/1.1 503 Service Unavailable,Retry-After: 86400,X-Still-Here: true。86,400 秒是一天。明天再试。这就是全部计划。