几十年来,我一直在给我的团队讲一些“标准技巧”;我正在努力将它们写下来,以使它们更易于访问。这三个规则可能是我最常重复的规则。我经常称它们为“设计”规则,但实际上这些是解决任何类型问题的工具——从机器到人类。
Med Badr Chemmaoui在Unsplash上拍摄的照片
吨关于如何解决问题,我经常向我的团队重复以下三个规则,通常每周重复几次。它们中的每一个表面上都很简单,甚至陈腐,但是当您深入了解遵循它们的意义时,您会意识到它们通常是违反直觉的并且需要您积极努力。但我的经验是,只要遵循它们,就可以解决看似棘手的问题。
这三个规则按重要性降序排列:
如果你想去某个地方,首先要弄清楚你想去哪里,然后再想办法到达那里。
爱上你正在解决的问题,而不是你建立的具体解决方案;第一个是持久的,第二个是短暂的。
任何与魔法不同的技术都不够先进。
这是对它们每个含义的简要解释,并附有一个关于击剑的故事,可以解释为什么我选择这三个。
第一条规则
如果你从这篇文章中只记得一件事,那就是这个;我发现它对于实际解决任何问题都是完全必要的。这看起来简单明了,但遵循它可能会非常具有挑战性。
如果你想去某个地方,首先要弄清楚你想去哪里,然后再想办法到达那里。
其中的关键词,一个不像看起来那么明显的词,是“然后”。这些步骤是有顺序的,不要将它们混为一谈至关重要。
当你试图解决一个问题时,总是很想考虑你现在所处的位置——所有当前情况、你过去所做的权衡、你发现自己擅长的事情、你的客户拥有的事情历史上爱 - 并问“我怎样才能调整我正在做的事情让事情变得更好?” 这似乎是一件明显正确的事情。
这样做的问题是,如果你这样计划,你也在暗中计划你今天所处的所有坏事。你正在寻找你所处位置的最佳小变化,这可能不会带你接近你真正想去的地方。这就像在迷宫中走来走去:最靠近出口的转弯不一定能让您真正到达出口。更有可能的是,它会让你沿着一连串不断改进的近似值走下去,但最后却走到了死胡同。
在工程项目中,我一遍又一遍地看到这种情况:团队进行了一系列的小改动,却没有意识到他们构建的系统甚至不再满足客户的基本需求,而那些留下来的客户只是这样做是因为他们自己害怕改变的代价——他们一直这样做,直到有一天他们没有这样做。然后客户离开了,而你没有办法让他们回来,因为你没有为到达你真正需要去的地方做任何投资。
避免这种情况的方法是清楚地区分这两个步骤. 首先,弄清楚你想去哪里:需要解决的问题是什么?谁在乎你解决它们?他们实际上想要从解决方案中得到什么?一个好的解决方案是什么样的?违反直觉的技巧,感觉就像你在作弊甚至“做错了工程”,是做一个干净的设计,完全忽略你有什么,只限制你自己能做什么而不参考什么你有。它的输出是你想去的地方的清晰画面。只有当你的脑海中有了清晰的画面后,你才会问你应该如何从这里移动到那里——现在这是一个更具体的问题,而且通常与你只是调整当前解决方案时的移动方式大不相同。
更详细地说,我通常希望团队在每个阶段中采取具体步骤。每当考虑下一步做什么时,我们首先会进行全新的设计阶段。在这个阶段,要问三个关键问题:
我们试图解决的问题是什么?
关心我们解决(或不解决!)问题的人是谁?他们同意我们对问题的构想吗?
好的(但可实现的)解决方案是什么样的?这些人是否同意拥有它实际上是解决问题的好方法?它遗漏了什么吗?
您按此顺序询问他们,并特别强调这些协议检查。以书面形式执行这些步骤,而不仅仅是口头:根据我的经验,两个人谈论他们的想象并将他们对另一个人的想法强加于谈话而不是明确表达的想法太容易了。以静态形式向人们展示答案,其中对正在讨论的内容没有歧义,这是不可替代的。
(我见过的最严重的组织错误归结为做错了这个。在较好的情况下,团队投入多年的工作和数亿美元来构建一个没有人真正想要的解决方案;在较差的情况下,人们做积极破坏性的事情,因为每个人都有一种模糊的协议,没有人意识到实际要做的事情。如果你做一件事来改进你作为一个组织的流程,那就是确保当你试图解决一个问题,你总是从这三个问题开始,总是以书面形式,并且总是迭代,直到所有各方都同意这里所说的内容。)
一旦你对这三个问题有了答案,并且知道你想去哪里,你就进入了规划阶段。下次我会更深入地介绍这个阶段,但关键思想是将这项工作分成多个里程碑。
一个好的里程碑的定义特征并不直观:“启动产品”不是一个好的里程碑。相反,您的目标是每个里程碑都获得真正的价值。如果你在达到任何里程碑后停止整个项目,你会觉得几乎没有时间被浪费——你在那个里程碑上取得的成就,无论是对问题的更好理解还是对问题某些方面的解决方案,本身是有价值的。
为什么?因为当你达到任何特定的里程碑时,情况可能已经改变,优先级可能已经转移,整个问题可能不再是你想要关注的事情。有很多很好的理由可以说明放弃该项目是明智的。但是,如果每个里程碑都标志着成功获取价值,那么这并不是浪费。
第二条规则
这种放弃的可能性将我们带到了设计的第二条规则,它再次看似简单但实际上违背了一些非常深刻的本能。
您构建的系统是达到目的的手段;它们中的每一个都是暂时的,总有一天会成为您正在与之抗争的阻碍性垃圾。不要爱上你的系统;爱上你正在解决的问题。
这是很诱人的,尤其是当我们花了多年的努力,爱上我们建立的系统,并对任何应该更换它们的建议感到防御。但这是对过去和未来的混淆:这些系统之所以受到喜爱,是因为它们让事情变得更好,因为它们真正改善了世界。如果他们已经到了可以被替换的地步,那并不意味着他们失败了——远非如此,这意味着他们已经成功了,他们已经跑完了,是时候享受光荣的退休生活了。他们的继任者是他们的知识分子的孩子,他们是根据我们从制造和使用它们中学到的所有东西创造出来的;我们希望他们的继任者比他们更好,就像我们希望自己的孩子有朝一日超越我们一样。
想想很有趣,但到目前为止,我职业生涯中最快乐的日子之一是当我构建的一个系统——这个系统为谷歌搜索中显示的 20 份文档中的 19 份提供服务超过十年——是退休了。该系统做得非常出色;它的构建和维护非常微妙,迫使我们改变了对搜索工作方式的理解,推动了软件和硬件架构的各种变化。它正在被一个新系统所取代,该系统由原始团队的继任者构建,该系统吸收了我们从那个十年、那个系统和其他系统中学到的一切,并构建了一个新系统,该系统以均匀的速度解决了新一代问题更好的方法。那个新系统真是太漂亮了。而且我毫不怀疑,出于同样的原因,即使在今天,这个系统也正在接近它自己的替代品。这一天不是葬礼;这是一个毕业典礼,一个总结的时刻,反思这些成就并展望未来。
因为它已经实现了它的目标:我们如何搜索比“传统”搜索引擎大一百倍的互联网?它解决了当时的所有问题,新系统将解决下一代的问题。我们致力于解决能够发现事物和综合知识的问题;我们构建的工具是解决该问题的关键一步,但问题仍然存在。
老实说,大多数问题仍然存在,而不仅仅是在工程方面。拉比 Tarfon 常说:“完成工作不是你的事;但你也不能随意把它放在一边。生命中最值得解决的问题往往是无限期的,不会在我们有生之年解决,也不会在我们孩子的有生之年解决。这意味着我们可以做的是朝着他们的解决方案迈进,解决他们在我们这个时代出现的各个方面,并继续朝着我们的后代可能(inshallah!)实现的最终目标迈进。
第三条规则
Arthur C. Clarke 有句名言:“任何足够先进的技术都与魔法无异。” 他的话有很多意思,但我想提请你注意它的反义词:
任何与魔法不同的技术都不够先进。
这条线,有时被称为本福德定律,起初看起来只不过是一句妙语,一个聪明的文字游戏,告诉我们“做得更好!” 但它有一个真正的含义,当我们问自己“魔法”这个词在这种情况下的实际含义以及与之不同的含义时,这一点就会变得很清楚。
虽然这个词有很多定义,但这句话中“魔法”的关键方面显然不是它的超自然起源——如果有的话,克拉克陈述的全部要点是“魔法”可以有一个明确的自然起源,并且仍然服务于相同的目的。相反,我首先要问的是是什么让魔法变得令人向往:支配世界的能力,可以这么说,让它以你想要的形式出现。
这个概念实际上包含在著名的魔法词“abracadabra”中,它不是(与普遍的看法相反)胡言乱语;它是阿拉姆语,意思是“让它如我所说的那样发生”。从这个角度来看,魔法的核心方面是它可以将一个人对世界应该如何的内在愿景直接转化为物理现实。
这就是这句话很重要的意义。当一个人的内心愿景没有直接转化为现实,而是需要用户方面费力的步骤才能转换时,一项技术就变得“有别于魔法”。例如,我的视觉想象力比我的艺术天赋要生动得多;我可以想象出许多我没有能力将其写在纸上的图像,即使是一点也没有。我可能可以通过几十年的努力学习这些技能,然后花几天、几个月或几年来创作一幅画,但这与魔术截然不同。
一项技术要真正“神奇”,它需要做几件事:
它应该让你用你构思它时所用的语言来描述你正在想象的东西;
它应该让你看到世界的当前状态,就像你用来描述其期望状态的语言一样;和
它应该让你用同一种语言来操纵世界的状态,说“让它像这样”。
这在我的三个设计规则中占有一席之地的原因是,尽管它比其他两个更狭窄和更具体,但它说明了我们如何思考我们解决的问题。回到第一条规则,当我们执行它的第三步——描述好的解决方案——这条规则就成为定义“好”的关键。更重要的是,它使得与利益相关者进行对话以确定这是否真的解决了他们的问题变得更有可能,因为一个需要大量思考和抽象才能使用的系统可能会或可能不会做你想象的事情,并且在这些对话中,双方可能并不真正了解如果系统没有此属性,系统将能够做什么。
一个魔法设计的三个属性的分离也是有意的。描述、查看和操作是需要共享语言的三种不同行为——就定义里程碑而言,能够完成其中任何一项来解决问题已经是一个重大进步。以我的经验,一个能够用一种易于理解的语言简单地描述现有现实的系统已经是对人们生活的巨大改善,如果它能增加改变现实的能力,那就更好了。
密切关注这些属性的文本也很重要。例如,“查看当前状态”与“查看系统已设置的状态”不同。这是三哩岛的教训:核反应堆的操作员有显示系统当前设置的仪表,在阀门卡住并且系统的实际状态与设定状态不同的那一天之前,这些仪表非常有用。(有关这方面的更多详细信息,请参阅 Mahaffey 的Atomic Accidents的第 9 章,自原子发现以来每一次重大核事故的详细事后分析。我的朋友兼同事 Lea Kissner 很长一段时间以来一直向年轻工程师推荐这本书,我衷心支持将其作为了解工程如何出错的一种方式。)
最后,还有一个关于击剑的故事
这三个规则单独来看很简单,但实际上仔细执行它们比看起来要难得多。对这一挑战最好的解释是我从另一位朋友和同事 Nelia Mann 那里了解到的,她曾经是一名高水平的竞技击剑手。她向我解释说,每个击剑学生的职业生涯都会经历三个阶段:
首先,他们被教导严格的规则,并努力遵守;
然后,他们到达了一个阶段,他们意识到通过改变这些规则他们可以获得一堆胜利,并找到所有改变它们的方法;
最后,当他们接近精通时,他们会重新遵循他们作为初学者被教导的相同规则——只是这一次,他们正确地遵循了这些规则。
第一阶段和第三阶段的区别在于对规则为何存在的深刻理解,以及正确或错误执行规则时的感觉。您了解到有些规则实际上更像是指南——您通常会做的事情,但在某些情况下可能会有所不同,并且您可以随时解释为什么它们适用或不适用——而其他规则实际上是铁定的规则,你永远不会考虑在你的工作中打破的事情。
自从听到这个故事以来,我多年来的经验是,这三个阶段不仅适用于击剑,而且适用于所有技能。在软件工程中,我在过去几十年中一直在专业学习的技能,你会看到这种模式和其中的非显而易见性:例如,关于互斥锁的部分排序的“规则”是你偶尔会看到的做违反,虽然有非常丰富的代码注释来向未来的读者解释正在发生的事情和原因,但是关于注释代码、记录资源所有权转移或遵循代码风格指南的规则变成了你不会想到违反的事情您会向后输入所有代码。在初学者看来更基本且不太重要的规则实际上是最重要的,需要始终完美遵循。
我在上面提出的三个规则,我列出来是因为它们都属于第二类:这些不是你大致遵循的规则,而是你花时间和精力完善你的技术的规则,直到它们成为你的第二天性。上面的框架与我理解它们的第一种方式相去甚远;它本身就是我花费数年时间试图提炼和提高我对它们、它们的含义和应用的理解的结果。我完全希望这些框架会随着时间的推移继续发展和改进,并且(完全符合第二条规则)它们甚至可能及时被更好的框架所取代。
我期待着这种改进,并希望与此同时,这些规则对您有用。