很多人把山野比作production环境,但我觉得更准确的类比是:一个observability为零、network partition常态、且你无法ssh进去debug的分布式混沌系统。敏捷开发那套方法论在这里会失效,不是因为不能回滚,而是因为你连故障根因都定位不了。
1. Observability Crisis
代码挂了你有一整套遥测:log, metric, trace。但在山野,你唯一的monitoring agent就是自己的身体,而大多数人的agent配置是有bug的。失温(hypothermia)和低钠血症(hyponatremia)不会先给你发PagerDuty告警,它们的指标表现是高度ambiguous的——症状可能都是"头晕、恶心、认知模糊"。这就像on-call时收到CPU和IO同时飙高的alert,如果你不带体温计、不看血氧、不记录饮水和排尿量,你根本不知道是系统过热还是资源泄漏。最危险的是,core temperature下降曲线是非线性的,等你主观感觉到"有点冷",你的cognitive function可能已经降频到无法执行正常判断了。你的service已经OOM,但外部探针还在返回200 OK。
2. 分布式共识陷阱
组队进山的人常以为节点多了就是高可用。但分布式系统的铁律是:节点越多,consensus越难。山野里没有Raft协议,没有heartbeat。一个队伍在浓雾中岔路口分开,就是典型的split-brain。更隐蔽的风险是"羊群效应"——全队把决策权delegate给最敢冲的那个人,本质上是在用一个未经选举的leader节点承担所有写入压力。这个节点一旦出错,就是cascading failure。真正的failover不是人多,而是每个节点都具备独立的graceful degradation能力:单兵能认路、能扎营、能发signal。否则你只是把单点故障包装成了分布式单点故障。
3. Circuit Breaker > Failover
3楼说关键gear要双份,这是data redundancy。但山野里最稀缺的resource不是gear,而是cognitive bandwidth和physiological reserve。高海拔、低温和缺觉会让你的前额叶皮层进入throttling状态,这时候做的任何路线决策基本都是坏commit。所以比起"出了问题怎么恢复",更应该在问题发生前设置circuit breaker。我的硬规则是:登顶窗口只设一个timeout,到点自动触发shutdown,绝不hotfix路线。很多事故不是因为没有plan B,而是因为没给plan A设置deadline。户外圈有个很坏的anti-pattern叫"下撤羞耻",好像提前终止就是deployment失败。但在工程里,承认SLO达不到而主动降级是senior表现。
4. Body Debt是最高利贷
楼主提到瑜伽学员把高难度体式当KPI。这种心态在工程里叫premature optimization——还没跑通base case就去追求p99 latency。我追星站坑能扛三小时mosh pit,但第一次重装徒步时差点把自己搞成级联故障,因为心肺耐力和肌肉耐力是两个不同的namespace。装备可以dry run…,身体更需要dry run。其实没有base fitness就进山,相当于把alpha版本直接全量灰度给用户,而且你没有feature flag可以关。体能债(body debt)的利息比技术债高得多,它不会在Jira里提醒你,只会在某个垭口直接把你的QOS降成0。
其实
5. 关于极简的重新定义
楼主说极简不是砍掉安全冗余,我想补充:极简的真正目标是降低accidental complexity,而不是砍掉essential fault tolerance。多带一件防风层、多留两小时余量,这不是accidental complexity,是system requirement。就像代码里必要的错误处理不是technical debt,是spec的一部分。你背包里那件救生毯占用的体积,本质上是给不可控系统交的availability tax,不交这笔税,你的SLA就是废纸。
你下次进山会带血氧仪吗?我现在的EDC里已经塞不下了,但取血氧读数的三十秒,比刷十条短视频有用得多。