作者认为,尽管职业生涯中处理过许多复杂环境(如优化网约车匹配),但在谷歌工作的经历(SRE,负责ML基础设施)让他对"复杂性"有了更深刻的认识。
本文旨在剖析复杂性的概念,区分复杂(Complex)与繁杂(Complicated)环境,并探讨有效驾驭复杂系统的模式。
作者认为,尽管职业生涯中处理过许多复杂环境(如优化网约车匹配),但在谷歌工作的经历(SRE,负责ML基础设施)让他对"复杂性"有了更深刻的认识。
本文旨在剖析复杂性的概念,区分复杂(Complex)与繁杂(Complicated)环境,并探讨有效驾驭复杂系统的模式。
理解繁杂与复杂问题的区别至关重要,因为它们需要根本不同的方法。
繁杂问题:错综复杂但可预测。它们遵循结构化、可重复的解决方案。(例如:报税)
复杂问题:错综复杂但独特。它们需要适应性的、通常是新颖的解决方案。(例如:气候变化缓解)
作者举例:在Uber的竞争对手公司,为乘客找到最近的司机是繁杂的(有现有解决方案如Geo-hashing);而在谷歌SRE工作中,ML基础设施的挑战是复杂的(需要新范式和调度方法,尤其在谷歌的规模下)。
识别系统是繁杂还是复杂非常重要。将通用解决方案应用于复杂问题可能不会产生有效结果。
复杂系统通常表现出以下至少某些特征:
系统整体行为无法仅通过分析其独立组件来预测。这些行为难以预测、调试和管理。(例如:Gemini产生意外结果)
行动并非总有立竿见影的效果,后果可能在很久之后才显现,使根本原因识别更难。仅依赖即时反馈可能产生虚假稳定感。
优化一个部分不一定改善整个系统,有时甚至可能使情况恶化。局部收益不总能转化为全局改进,整体大于部分之和。
即使原始原因已消除,系统过去的状态仍继续影响其行为。(例如:事故清除后交通拥堵持续;分布式系统中故障修复后,依赖系统因缓存、重试等原因恢复缓慢)
仅修复根本原因可能不够,需评估系统是否易受滞后效应影响并预测其效果。
小变化可能产生不成比例的巨大或不可预测的影响。系统常有"临界点",行为突变,使过去趋势不可靠。(例如:队列接近饱和时,请求小幅增加导致响应时间指数级飙升)
传统线性假设(输入可预测地映射到输出)在设计、测试和推理复杂系统时可能无效。
总结特征:难以通过孤立部分理解;后果可能延迟;局部优化不总带来全局改善;受过去状态持续影响;对小变化反应可能巨大或不可预测。
规模本身并不能使系统复杂:小系统也可能表现出复杂行为。
以下是作者认为有效的策略:
尽可能倾向于可逆决策(亚马逊的"双向门"),允许快速行动、迭代和低风险学习。并非所有决策都应可逆(如安全策略),关键在于何时优化速度,何时谨慎。
定义正确的成功指标与所做更改同等重要。过度关注孤立的局部指标可能掩盖系统其他地方的负面影响。
变更前应定义局部和全局指标,以获得系统健康的整体视图,确保系统级改进。
复杂系统常需独特解决方案,必须跳出固有思维,拥抱创新。作者引用谷歌同事的话:"但我们是谷歌,我们应该能搞定!"——强调心态的重要性。
面对复杂问题,应假设其可解,然后分解、实验、迭代。
依赖成熟的最佳实践来最小化风险:
这些技术减少故障影响范围,提高变更信心,加快迭代。
作者定义:能够通过切割高基数、高维度遥测数据来理解系统的任何状态(无论多么新奇或怪异),而无需发布新代码。
缺乏可观测性:系统更脆弱,调试更难,创新减缓。在未知不可避免的复杂环境中至关重要。
没有适当的可观测性,变更只是"观点"而非"明智的决策"。
预测复杂系统行为困难,有时不可能。模拟变更可能比仅依赖预测更有效。
方法包括:
模拟也高度依赖可观测性。
在复杂环境中,基于规则的方法常因难以预测所有场景而达到极限。此时ML特别有效。
ML模型能:基于反馈循环持续适应;从真实数据学习;检测未明确编程的新兴模式;动态适应变化;进行概率决策。
在复杂环境中,团队协作绝对必要。清晰传达变更的复杂性、讨论方案、权衡利弊等技能至关重要。
复杂系统通常没有唯一正确答案,有效协作的团队能更好决策。
繁杂问题可用可重复方案解决,而复杂系统需适应性和不同思维方式。识别系统是繁杂还是复杂至关重要,它决定了解决问题的方法。
许多环境中的系统并非纯粹繁杂或复杂,而是混合体。关键在于学会识别何时需要适应性,何时结构化方案足够。