独立开发者

一个人做发布时,我先给自己补边界,而不是补胆量

很多时候,独立开发者不是缺行动力,而是太依赖临场记忆。真正让发布更稳的,往往不是更勇,而是更早把边界补进系统。

一个人做发布时,最大的错觉往往不是无知,而是“我大概记得”

独立开发做发布最危险的状态,往往不是完全不知道下一步该做什么,而是每一步都大概知道一点。你知道要跑测试,知道要看 build,知道最好去点几条关键路径,也知道环境变量和 rollout flag 不能想当然。问题正出在这个“大概”上:只要当天节奏快一点、上下文切换多一点,或者你刚好对当前版本比较有信心,就很容易把某一步继续留给临场记忆。

一开始这种方式甚至不太容易出问题,因为系统规模还小,你也确实能记住大部分东西。但随着公共站、workspace、auth、payment、发布门禁、Cloudflare 构建这些层都开始叠上来,只靠脑子里的流程就一定会漏。独立开发真正的风险不是没人催你发,而是你对系统越来越熟,于是会不自觉地高估自己对风险的掌控感。

我后来发现,发布稳定性首先是边界问题,而不是情绪问题

以前我更容易把发布理解成行动力问题:胆子够不够、会不会拖延、是不是敢按下 deploy。后来做得越久,我越确认发布稳定性首先是边界问题。也就是:哪些步骤必须自动挡住,哪些事情必须人工确认,哪些检查没有完成就不该继续往前,哪些风险不能因为“这次应该没事”就被跳过。

这个项目最近几轮工作其实很典型地说明了这件事。表面上很多门槛都通过了:lint 绿、test 绿、next build 绿,support pages 和 taxonomy 也都验过,内容系统护栏也补齐了。如果只看这些,你会很容易产生一种“差不多了”的感觉。但一旦真正拉入目标平台检查 build:cf,Cloudflare / OpenNext 的 proxy 兼容边界就会把你从这种自信里拽回来。也就是说,真正危险的不是你不努力,而是你太容易被前面的大量绿灯说服。

真正重要的,是把关键步骤从勇气里拿出来

我现在越来越在意的是:哪些事情不能继续放在“我记得就做,不记得也许问题不大”的状态里。比如目标平台 build 必须单独跑,关键 smoke 必须单独过,前端入口 flag 和服务端能力 flag 必须一起看,人工 smoke checklist 上列的东西必须真的点到,而不是口头上知道就算完成。只要这些步骤还在靠临场记忆,长期一定会出差错。

自动化门禁负责挡住工程层误判

release:gatetest:smokebuildbuild:cf 这种层,最大的价值不是显得专业,而是把那些最昂贵、最常见、也最容易被“差不多”放过去的失败提前挡住。尤其当目标平台链路和本地默认链路不一致时,自动化门禁能提醒你:本地通过感不等于正式可发。

人工 checklist 负责承认仍然有些责任不能外包

环境变量、第三方登录生产配置、支付和微信开关、真实浏览器 smoke,这些事情不能因为脚本跑了就自动成立。它们仍然需要人在最后一层亲自承担判断。对我来说,这不是流程不够自动化,而是成熟地承认:有些责任本来就应该由人来接住。

独立开发者真正需要的不是英雄主义,而是稳定的收口方式

一个人做产品时很容易被一种叙事诱导:好像你只要再勇一点、再猛一点、再顶一下,就能把版本推出去。可长期看,英雄主义对发布几乎没有帮助。因为发布不是一次性的逞强动作,而是要能重复。今天靠胆量发出去,也许侥幸没事;下次规模再大一点、上下文再复杂一点,问题只会更严重。

真正让发布可持续的,是知道哪些事情必须由系统接管,哪些事情必须由你亲自确认,哪些风险不能被“我很熟”这件事抵消。换句话说,独立开发者最该补的不是更猛,而是更有边界。只有边界清楚了,你才既不会因为过度谨慎而什么都不敢发,也不会因为过度熟练而开始轻视关键检查。

我现在更愿意把“可发布”理解成一套被验证过的状态

对我来说,一个版本现在能不能发,不再只是看它是不是“差不多好了”,而是看它有没有经过那套我愿意长期相信的收口方式:自动化门禁有没有过,目标平台检查有没有过,人工 smoke 有没有按 checklist 真正做,文档和风险是不是留在系统里而不是留在脑子里。只要这些边界没有成立,我就不会再把“再勇敢一点”当成推进方式。

这其实也是独立开发成熟的一部分。因为一个人最危险的时候,并不是不知道风险,而是太熟悉风险,于是开始拿经验替代流程。可一旦规模继续增长,经验会越来越不够用,只有边界能留下来。对我来说,发布真正需要补的从来不是胆量,而是让胆量不再成为必要条件的那些边界。