有时候,对人性的思考让我感到难过。我们试图与他人分享自己的想法,就好比在一个没有月光的夜晚试图从茂密的森林中找到一条出路,只能用激光笔瞄准。你唯一能向别人展示的就是一小点随机来回跳跃的光点,自然地出现和消失。你怎么能用这么弱的工具找到一条小径呢?你怎么能说服你的同伴跟随它呢?你怎么能理解这条小径是否应该把你带出森林呢?
这就是为什么人们试图创造新词来解释相同的概念。每个人都希望他/她的解释足够好,让其他人理解“事物的内在本质”。大多数时候,这是没有价值的:其他人看到的只是混乱的跳光点。
然而,这是我自己的尝试,这里写的话不是事实,只是我根据有限的经验对它的偏见反映,我不知道是包含了一些智慧,还是一堆无用的陈词滥调,那是由你来评判的。
有一种观点认为,编程与武术或音乐表演有许多相似之处。在所有这些领域,你都可以在相对较少的练习后取得一些成效,但如果你想达到真正意义上的水平,就需要多年的学习和训练。往往你甚至必须在自己的能力边缘表演。
当你想要达到这样的水平时,你必须意识到你职业的方方面面。今天我想谈谈指导你完成日常工作的一些小的、往往是看不见的决定。
在我们的工作中,你每天需要做很多小决定。只要在工作过程中照顾好自己,很快你就会注意到这些决定。
想象一下,你刚刚开始做一些功能。小的决定会立刻出现。你将如何开始工作?通过阅读文档,或者签出代码,或者通过询问你的同事?首先更改一些代码,或者考虑测试用例?实现简单的更改,或者预先推出一些重构?
你会如何应对“糟糕的代码”挑战你的方式:忽略它,或者现在试着修复它,或者把修复推迟到“更好的时候”?当你感到震惊时,你会怎么做:问问你的队友(如果你有几个人的话,是哪一个),用谷歌搜索你的问题,然后把它堆积起来?或者干脆等到你脑子里有答案(也被称为“拖延”)?或者可能是等到有人问你进展情况?
这就是我所说的“小决定”的意思。你在工作中做出的很多(每天几十个,甚至几百个)微小的选择。有时你会有意识地做出这样的选择,但往往不是!你甚至没有想过自己的道路,甚至没有意识到选择的事实。
让我们把你想象中的“工作任务”画出来。我喜欢画图表,所以把它描绘成一个图表。
这里的每一个节点都是你所做的一个小选择。箭头代表它们之间的“移动”。一些中间步骤是任意的,取决于你自己对“小决定”的定义。当你缩小时,它们几乎消失了。当你放大时,一个决定甚至可能小到“哪个手指应该按下给定的键盘按钮?”。这里我选择一些中间步骤。
现在让我们想象一下更多可能的动作,这些动作也可以解决你的任务。
这里我们看到了一个可能的决策网络。如果你一开始选择另一个步骤会发生什么?一些替代方法可能更短(包含的跳数更少),有些可能会更长!当然,我在这里把问题简化了很多。但我需要这个简化来向你展示几个重要的东西。下面是几个关键点:
你必须做出很多决定。几乎每一项需要你做出决定的任务都有一些要点。例如,你至少需要问自己一次:“我达到目标了吗?”然后要么完成它,要么继续工作。
即使是很小的决定也可能产生很大的影响。当你一开始选择了错误的道路时,它可能会让你远离目标。你不得不沿着非最优的道路前进,或者回到起点。
每一个决定都会耗费你的时间和精力。决定的延迟通常来自两到三个原因之一。第一个原因是问题和答案之间的延迟。说你被打击了,不知道下一步该怎么做。你试着通过IM向你的同事寻求帮助。但他/她目前很忙。而且只能在20分钟内回答你。这个延迟是你做出决定的代价。第二个原因是自己选择的延迟。当你看到两条或更多的替代路径,并且犹豫应该遵循哪条路径时,可能会发生这种情况(这里可能用一个“沮丧”这个词比较合适)。第三个原因是需要记住一个已知的、但目前被遗忘的解决方案(下一章将详细介绍这一点)。
所有这些让我得出结论,重要的是要考虑决策对我们工作的影响。低质量的决策每天都会降低你的工作效率,让你在没有帮助的情况下迷失在黑暗中。
令人惊讶的是,即使在阅读了大量关于程序员生产力的书籍和文章之后,我仍然没有发现对这个主题的足够关注(如果我错了,请纠正我!),这就是我开始写这篇文章的主要原因。
好吧,也许决策的质量很重要。但我们怎么管理它们呢?这里我推荐一个简单的模型。和任何其他模型一样,它不描述事物的本来面目,而是使用更简单(更易于管理)的观点。建模的主要力量在于它能够预测我们行动的效果,但我们永远不要忘记它的边界。外部边界,我们的模型将是错误的-我不知道它们在哪里。我真诚地希望您的反馈能帮助确定它们。
这个模型很大程度上受到了工作[1]的启发。想一想:这篇论文已经40年了!为什么还没有人像我一样把它发展到类似的方向呢?我不知道(也可能是我错了--如果是这样的话,请让我知道)。
这个前奏是必要的--但现在让我们继续模型。假设我们每个人的头部都有某种类型的表(我警告过您,这是一个简化的视图),它包含两列:
触发器。可能激活当前“表行”或规则的外部刺激。例如:您正在查看的一段代码、CI服务器发来的一封信、同事发来的消息、您当前对任务的想法等等。
运行git二等分来查找引入它的地方的提交。然后分析代码。
它会随着时间的推移而变化,这取决于你自己的经验和知识。当你发现新的技巧时,它们有机会留在你的记忆中。另一方面,即使是没有重复的最佳实践也会从你的记忆中消失。当然,它们并不总是被完全抹去。相反,它们会从你记忆中最快的部分--“缓存”中删除。你必须努力记住把它带回来。
它的规模有限,你不可能无所不知,也不可能对你可能面临的每一种情况都有最好的解决方案。
对于一种情况,它可能有几条规则。在这种情况下,您的最终选择可能取决于当前的上下文。有时,您甚至可能需要花费额外的时间和精力来在可选操作(“解决冲突”)之间做出选择。
它只为小的决定建模。只有那些经常通过你的聚光灯并自动执行的小选择才能以这种方式建模。就“思考,快与慢”[2]而言,它只依赖于“系统1”。
您正在处理的项目的直接规则(比如“使用./gradlew检查来验证代码的正确性”)。
我希望在接下来的文章中写更多关于它的文章,但现在的文章已经足够大了。看起来我必须要下结论了。
首先,你应该考虑到你的记忆力有限。为了做出更好的决定,你需要有意识地“调整”你的规则表。怎么可能做到这一点呢?
记住你的好的(有效的)决策规则。时不时地练习它们,这样它们就不会留下你的工作记忆。把它们写在已知的地方,这样在需要的时候就可以有效地记住它们。
试着把你的记忆从不必要的决策规则中解放出来。如果不需要它们,就把它们忘掉。如果它们可能仍然有用,就把它们放在一个外部的地方。例如,设想你有一个由7-8个步骤组成的复杂的任务管理仪式,需要每周执行一次。你不应该试图把这个仪式留在你的记忆中。用简单的说明或核对表的形式写下来要好得多。现在,你只需要记住一件事:你的核对表所在的地方。
尽量避免同时处理多项任务。不同的任务需要不同的决策规则。当你在一项任务和另一项任务之间来回切换时,这些规则会在你的工作记忆中争夺一席之地。没有人能保证它们都能放在一起。它们很可能不能。
定期回顾你的工作习惯。它们足够有效吗?其中一些已经过时了吗?随着时间的推移,情况会发生变化,你一两年前有效的习惯现在可能会拖累你的表现。
检查一下你要花多少时间来解决几种可能的行动之间的冲突。试着总结出严格而明确的规则,在哪种情况下你应该选择哪种行动。这应该会减少你下次面临类似困境时的时间和精力的浪费。
如果我们暂时回到模型的第一部分(“选择/移动”):
尽量减少你在一项任务中需要做的决定。把大任务分成几个小的、定义明确的步骤,这样你就不需要在它们之间做一些小的决定。清除那些让你或你的队友远离流水线的障碍(肮脏的代码、小但嘈杂的错误等等)。
提高你的工具的速度。他们给你的反馈越快,你浪费在等待上的时间就越少。
记住:几乎所有地方都有另一种方法。当你感到震惊,看不到朝着目标前进的任何好的下一步时,想一想。也许有一种方法适合你,但你的思维模式阻止了你去发现它?
在专业音乐和武术中,一个重要的角色都是“最大限度地减少能量浪费”的概念。吉他大师的手指不会自发闪烁,他们完全被控制。功夫大师不会随意击打。你也不应该。
从锦标赛记录中观察他的动作。他看起来动作缓慢,甚至懒惰,但没有人能击败他-因为他没有过度的动作,没有过度的小决定。
对我来说,所描述的模型已经取得了令人惊讶的成果。它很好地“描述”了在IT领域观察到的许多影响和问题。我很好奇为什么会发生这种情况:要么是因为它真的很好,很有预测性,要么是因为它太模糊了,可以得到任何你想要的答案(例如,它实际上是无用的)。这就是为什么我想把它提供给你的球场。
团队表现。所谓的“10倍程序员”,结对和暴徒编程,一种多样化的效果。
如果你愿意,试着把这个模型应用到你自己给定的主题上。我们的结论是否一致?
我很高兴收到你对这个话题的反馈!这个模型对你有用吗?它提供了错误的结果吗?这篇文章是不是太抽象了?它是不是充满了显而易见的东西?
目前还不能在这个博客上发表评论(对不起!),所以我想请你在下面的推文下发表评论:
“解决物理问题的能力模型”。吉尔·H·拉金、约翰·麦克德莫特、多萝西娅·P·西蒙和赫伯特·A·西蒙