灭火与战略
2020年3月15日 作者:Max Kanat-Alexander
最近我向工程师们强调的一个观点,我认为值得更广泛地分享。
在进行工程工作时,你会接到不同类型的任务。有些任务是紧急或短期工作。我们有时称之为"灭火",特别是当工作涉及紧急修复或立即需要的任务时。
其他任务则具有战略性。你收集了用户需求和期望的信息,设计了解决方案,并正在有条不紊地推进工作。
理解你正在处理哪种类型的工作,并以不同的方式思考它们,这一点非常重要。
灭火
当你灭火时,目标就是扑灭火焰。你基本上希望用最少的工作量来解决问题,以便能够回到长期战略工作。你不应该为了灭火而构建庞大复杂的永久性系统。紧急情况正是进行"快速而粗糙"工作的时机。这并不意味着你应该做糟糕的工作,但你不应该围绕灭火构建长期高维护的系统。
火灾有不同类型。有时高管或其他团队会向你提出立即需求——必须在接下来几周内完成的任务。你应该想办法完成这个任务并把它处理掉,以便回到长期战略工作。
其他时候,你会遇到真正的紧急情况,比如系统中断。这种情况下更清楚地表明你应该只修复中断,而不是做一堆其他事情。中断不是你说"好吧,让我们等待编写设计文档,下周与高级工程师一起评审"的时候。任何火灾都是如此——火灾不是应用长期软件设计方法和系统的时机。
示例
让我们用一个更具体的例子来说明我的意思。假设一位高管来找你说:“我们有个客户想在下周给我们一百万美元,但在此之前,我们必须制作一个显示服务器在高负载下表现的图表。“但是,假设你甚至没有任何记录服务器负载的系统。
如果你以长期战略的方式思考,你可能会说:“啊,我们应该建立一个跟踪服务器负载的系统。我们需要详细研究存储如何工作,如何确保准确性,如何监控,以及如何测试。然后我们应该与用户体验设计师合作,通过标准用户研究并据此制定UI设计,确保生成的图表能被用户很好理解。”
这在一周内无法完成。而且,这是浪费时间。你实际上不知道这种火灾是否会再次发生。仅仅有人向你提出紧急需求一次,并不意味着这将成为长期需求。它可能看起来会,你可以猜测会,但为什么要猜测长期战略设计呢?没有必要猜测长期工作——当进行长期工作时,你有时间进行研究以了解实际用户需求和需求。所以应该这样做,并基于此构建东西,而不是基于猜测。
相反,你应该说:“好的,我明天会制定一个非常基本的负载测试,可以从我机器上的脚本手动运行。我将推出一个新版本的服务器,只是将其负载信息写入日志文件,然后我将基于解析该日志手动制作图表。“所有这些基本上都是解决问题所需的最小工作量。
然而,即使这个解决方案也带有风险——你修改了服务器以记录与负载相关的内容。有可能后来有人会认为你打算将其作为长期支持的机制来跟踪系统负载,并依赖它经过良好设计和深思熟虑,而实际上并非如此。这凸显了一个非常重要的点:在灭火期间永远不要做出长期决策或实施长期解决方案。
事实上,你可能甚至想有意撤销在灭火期间所做的所有工作,比如删除该日志行,以免其他人认为你做出了某种长期决策。
这个规则不仅适用于技术实现细节,也适用于组织变更或任何决策。例如,假设正在发生中断。中断期间不是讨论如何防止未来发生类似事件或如何改变日常流程的时候。
唯一可以基于火灾做出长期决策的安全时机是进行"事后分析"时——在火灾被"扑灭"后对情况进行理性审查。然后你可以坐下来讨论:“好的,我们想进行什么样的战略工作来防止此类火灾再次发生?“或"我们从中学到了什么可以用来改变工作方式?”
这个规则极其重要。违反它会积累疯狂,可能摧毁团队。如果你仅基于极端紧急情况下做出的决策来建立公司的所有政策和工作模式,最终公司会看起来完全疯狂,并可能失败。
战略工作
与"灭火"相对的另一端(这是一个频谱,不是非黑即白)是:进行战略工作。基本上,你有一个已知目标并朝着它努力,应用所有软件设计的基本原则,确保考虑长期性,并与团队智能合作创建可持续的东西。
类似地,如果将"灭火"的方法和系统应用于战略工作,会导致灾难。如果你将每个项目都视为紧急情况,仅仅因为"必须明天完成”(即使实际上不需要)而"快速粗糙"地完成,最终会一团糟。实际发生的是你会制造火灾!你的系统设计如此糟糕,以至于会崩溃,引起麻烦,难以维护,最终完全消耗你在围绕这个设计糟糕的混乱中灭火。
当将灭火原则应用于战略工作时,你实际上永远无法完成战略工作。如果你看到一个工程组织似乎长期无法完成任务,这通常就是原因——他们一直把一切都当作世界着火一样对待,因此永远无法真正前进。
战略工作需要经常说:“好的,我们理解你的需求。感谢告诉我们你的问题。我们正在为你构建解决方案,我们正在以正确的方式做事,这需要一点时间。不是永远,但需要一些时间来完成。”
我认为有时高管会担心,如果告诉工程师"花足够时间”,工程师会变得懒惰,永远无法完成工作。在一些公司,这可能是合理的担忧,当然高管有兴趣保持事情进展,以便公司能够交付产品!但在鼓励人们按时交付和确保他们遵循长期软件开发流程之间必须取得平衡。一般来说,在进行战略工作时,最好在设计和评审等方面稍微多做一点。我不是说过度行事停止构建东西,或让每个人都经历不必要的评审,只是因为某事"可能需要”。我只是说如果你不确定,这是你应该偏向的方向。
兼顾两者
只要你应用上述一般原则,一个团队(或一个人)有可能同时处理战略工作和火灾(至少在同一周或月内)。技巧在于对火灾做最少的工作,确保紧急情况得到处理,业务继续运转,然后在火灾扑灭后重新专注于战略工作。
毕竟,如果你做得对,战略工作应该是对业务最重要的东西——你经过研究并知道长期交付会产生最大影响的事情。所以扑灭火灾,回到长期真正重要的事情上。
-Max