如何处理分析瘫痪?


60

很多时候,我在选择最佳设计决策时陷入困境。即使对于小的细节,例如函数定义,控制流和变量名,我也会花费很长的时间仔细研究我所选择的收益和权衡。

我觉得我花了很多时间在诸如此类的无关紧要的细节上而失去了很多效率。即使我知道,如果当前的设计无法解决,我可以更改这些内容,但我很难确定一个选择。

我应该怎么做才能解决这个问题?



与whiteboard上的一位同事讨论。这通常有助于澄清问题,如果您可以同意,那么它就有很好的机会成为一个不错的选择

Answers:


34

两个简单的规则:

  1. 做可能可行的最简单的事情。
  2. 不断重构。

当您开始做所有这些事情时,您将获得信心,您现在就可以做出简单的决定,而不会影响您以后对变化做出响应的能力。

请记住,面向未来的证明意味着使代码易于更改,而不是试图预期代码可能需要更改的所有可能方式。


4
仅当您具有良好的测试覆盖率时,连续重构才是合理的。所以我会说“编写单元测试。然后做最简单的事情使测试通过。重构。重复。”
凯文·克莱恩

绝对同意。“红色,绿色,重构”是必经之路。
Rein Henrichs

5
XP手册中的小知识点很可爱,但是如果脱离上下文,确实不是很好的建议。
亚罗诺(Aaronaught)2011年

2
在上下文之外,它实际上等同于牛仔编码。参见福勒的《设计死了吗?谨防XP和类似方法中的挑剔原则。也许您是一位优秀的设计师和编码人员,并且在重构时内在地和内在地具有能力和动机来保持概念的完整性,但是大多数程序员却不是,并且不考虑上下文提供这些建议是不负责任的(尽管他们都喜欢听到它,因为对他们来说意味着更少的工作)。
亚罗诺(Aaronaught)2011年

1
“做可能可行的最简单的事情”不需要任何额外的上下文。重构确实可以,但是不了解上下文的人如何通过学习上下文来学习如何重构?
Rein Henrichs

9

通常,当我有这种感觉时,这意味着我需要尝试:

  1. 站起来,四处走走,并确保所有生物学工作正常。
  2. 转到白板上绘画,直到我感到自信为止。
  3. 找到一个“设计投诉伙伴”,您可以与之讨论问题。

如果问题涉及语法和小片段,则:

  1. 让您满意的是,即使它很丑陋,也可以很好地封装在某个地方,并且代表着纯粹的本地杂物。
  2. 添加TODO标记或仅注释,这些注释说明了代码使您感到烦恼的原因
  3. 转到下一个任务。

第一和第二#2均为+1。绘制框,线,贴标签并获得大图片通常可以帮助我在选项之间做出选择。如果您有一个不错的代码分析器来跟踪任务(Hudson可以跟踪TODO并在您的版本中很好地显示它们),则可以轻松跟踪不​​喜欢的事情。
兰迪(Randy)

5

认为自己无所作为非常容易。即使你管理,不知何故,拿出最佳的解决方案,现在,可以轻松改变之前完成该项目,然后呢?

最好选择一个不错的解决方案并与其一起运行,而不是坐视最佳解决方案。最好的解决方案是难以捉摸,更糟糕的是,主观的。如果需求变化甚微,您的解决方案可能会比您放弃的解决方案更糟糕,因为当时它不是最好的。


我知道这一点,但是我仍然很难选择任何一个选择。
Anne Nonimus 2011年

@anne:最好立即做一些有建设性的事情,而不是做正确的事情为时已晚。唯一肯定是错误的事情是什么也不做。
Satanicpuppy 2011年

4

我也在学习避免分析瘫痪,因此对我们表示敬意=)这种情况经常发生是因为我们要进行“最佳设计”。实际上,“最佳”在情人眼中。我的公式避免分析瘫痪,是应用足够好的设计原则。我该怎么做?我带来了诸如时间约束,日程安排之类的变量,并问自己,在不影响质量的情况下,能完成工作的最简单的设计是什么(这并不意味着最简单),但与此同时,我确保这是可测试的,并且一对扩展开放,对修改关闭(OCP)设计。可测试和OCP是什么意思?好吧,我没有去寻找我认为最好的东西,而是考虑了一种设计,该设计可以告诉我情况何时会变差,并尝试执行足够的代码以使我能够在以后进行重构和改进。另外,请尝试将要更改的代码与保持不变的代码分开。重构变得更加容易,因为不应该更改的代码从您自己或其他人的将来变得更加安全。


2

让您的直觉决定其中一种选择怎么样?这应该非常快,并且可以与ammoQ也提出的时间框完美结合。如果已建立选项,则可以尝试限制为1分钟;如果必须先定义它们,则可以尝试限制为2分钟。或任何合适的东西(预先定义)。当学习倾听您的直觉时,实践将使您的直觉选择变得越来越快

如果您担心选择不完全的可能性,请考虑以下几点:

  • 如果某个选项在其他选项上有明显优势,则您不会问自己要选择哪个选项。因此,根据这种推理,只要您对不太复杂的事情不确定某个选择,就表明这些选择总的来说是相当平等的。因此,仅选择其中之一就没有太多放松的余地。
  • 话虽如此,直觉根本不是随机的,而是对最佳解决方案的很好的,有根据的猜测。通常比无休止的翻箱倒柜要好得多。
  • 迎合完美主义,当半自觉地评估一个人的表现时,可以将决策的敏捷性评价为高于选择的最优性。对于不重要的选择,这是完全有道理的,但牢记这一点并非不重要。

祝好运!:)


2

我认为一点经验就可以解决。我的大部分瘫痪发生是因为我试图想象代码库看起来比我需要的要远得多,因此为了克服它,我只是做了最简单的可行的事情,然后继续前进。一旦项目具有确定的形状,重复的代码单元便开始脱颖而出,并且很容易抽象出重复的模式并简化代码。


1

为了克服您不愿做出的决定,请应用时间:将闹钟设置为在几分钟后关闭;直到那时,您的脑筋才会折磨,但是当闹钟响起时,请选择直到那时为止找到的最佳选择。


3
然后他可以花几个小时折磨自己,确切地知道闹钟应该设置多长时间!:)
乔丹

1
乔丹:对于这个问题也有几种可能的解决方案。不幸的是,我无法决定要提出哪个建议。
user281377 2011年

0

创建一个原型。记住,原型是要扔掉的,所以无论您使用什么功能,变量名甚至是宏大体系结构都没关系。您只是构建它来证明它有效。

一旦您创建了它,并把它扔了出去,我愿意打赌您会更轻松地做出那些决定。


永远不要扔掉原型,因为也许以后在添加功能时可以对其进行扩展。或者,也许您需要使用SSCCE测试错误。我总是在单独的地方进行所有原型的源代码控制。
maple_shaft

2
我认为“扔掉”背后的想法不是丢失数据,而是您不应使用原型作为程序的基础,因为原型的全部目的是尝试犯错误的自由。
Darien

在分支中创建原型,进行必要的测试,然后在核心中创建一个干净的版本。
zzzzBov 2011年

0

我也遭受这个问题。我要说的是,您没有足够的完成动机。

例如,当我编写渲染代码时,我就有很大的完成动机,因为我知道,如果继续进行下去,我将能够看到该系统的运行情况,并想出我对四边形进行纹理化的能力如何,或转换一个顶点 但是现在我要进行重构(尝试4,如果您想知道),那么我就受苦了,因为这需要大量的工作,即使我完成了,我也会看到相同的旧四边形。而且我真的不想再进行重构,而且我讨厌一次又一次地看到相同的四边形,这对我来说不再是什么奖励。

您需要将其分解为各个组件,并为完成这些组件而奖励自己,即使只是通过某些控制台I / O即可显示其正常工作。


0

我正在阅读您的问题,并按照其他海报的思路思考问题:您不适合这份工作;给自己一个时间限制;暂时做点其他事情。经过一番思考,我不确定任何答案是否真的有帮助

诸如此类的精神问题的麻烦在于它们不容易解决,它们是您的一部分,并且显然您(可能对工作)过于在意,也没有信心与自己达成共识缺乏经验的人一直以来都认为您是第一选择,否则就会过分强调完美的选择。你为什么还要担心这些琐事呢?

现在我有类似的问题,但是代码却没有那么多..通常它的晚餐用..披萨或咖喱..嗯...披萨,但是咖喱很好,但是我感觉像咖喱吗,比萨更便宜,但是您会得到更多的咖喱,但是...等等。:)

所以我想-为什么我在编码方面没有类似的问题,我认为这仅仅是因为我有一组经常使用的模式。如果我需要一个函数定义,那么它很简单..它将与我曾经编写的所有其他函数定义保持一致。如果需要控制流,首先要确定是需要for循环还是while循环,然后创建与上次我需要这些东西之一使用的相同的旧代码。一切都一样,我要排队吗?当然-让我们剪切并粘贴我的“标准”队列代码(从我从事的上一个项目中窃取,或者使用这些东西中的任何一个我都记得)。最终结果...我只为新事物而烦恼,说实话,这是一种荣幸。

因此,我的建议是开始建立代码片段库-我曾经通过电子邮件将它们发送给自己,然后将它们放在文件夹中,但是无论您做什么工作都是最好的-然后您将开始每次都知道该怎么做。您将始终使用以前编写的旧代码,将问题排除在外,为下一个问题做好准备。您会发现自己成为一名更快的开发人员(认真地讲,这是提高程序员工作效率的唯一方法),并希望能找到时间来玩一些有趣的事情,而不是已经解决了很多遍的沉闷的日常工作过度。

当然,所有这些的后半部分也很重要-工作量越大,花在思考上的时间就越少。


摘要编程是最糟糕的错误做法
Neil Butterworth

@Neil:将别人的代码片段用作代码片段编程,而不知道他们在做什么,这是不好的做法。使用您自己的代码段通常是很好的,因为您很可能理解您所写的内容。如果没有,那么您可能就没有希望了。
乔丹

@Neil,您今天的心情特别糟糕!无论如何,大多数高级编码人员的脑海中都有大量的摘要库,您只是不会注意到自己在使用它们。对于初中生来说,写下他们可以帮助他们建立起来。
gbjbaanb

0

这是一种结合 Rein Henrichs(从简单开始,重构)和ammoQ(定时装箱)建议的策略:

  1. 给自己一个非常严格的时间限制,以便第一个可行的解决方案。例如,30秒表示一个变量名。您可以先想出类似的东西x,然后将其优化为string,然后name直到时间到了。
  2. 然后在指定的时间(例如10分钟)内执行其他任务
  3. 然后,再给自己一个时间框来进一步改善您的决定,例如userHandle

这种方法可能带来的好处

  • 稍后再讨论的知识可能会缓解目前的问题
  • 在执行其他任务的同时,您可能会想出一个令人满意的解决方案,而无需花费大量时间
  • 在步骤1松开之后,进入步骤2流程,可以很容易地使步骤3真正迅速地进行,因为您想继续执行步骤2,因此很高兴只选择一种合适的解决方案并接受它

这个答案似乎比您以前的答案更加具体和完整,但是它们似乎涵盖了相同的领域。请将它们合并为一个,或者选择您想要保留的。
亚当李尔

@Anna我做了两个不同的帖子,因为我发现它们包含不同的概念想法,应该独立地投票:这一个:通过推迟最终决定来放手。上一个:直觉。确实,这两种技术结合得很好,但是彼此之间也可以互不相干。
亚伦·托马

0

当我完成研究并没有明确的最佳选择时,我给自己一个时间限制(通常为5分钟)以选择一个,然后继续前进。 即使您遇到障碍,也无法保证在这一点上做出不同的决定也不会遇到同样的障碍。我想不出我后悔自己的决定的时候了。


0

通常,您无法确定差异不大的原因,或者您没有足够的信息。

在以下情况下:a)设置时间限制,以考虑合理的选择。尚未决定哪一个。最后,选择一个(如果没有明确的偏好,则随机选择)已确定的选项,并选择另一个时限。如果最后没有做出明确的决定,则为已经选择的决定。开始编码,如果您发现错误,则进行重构。如果老板问为什么,请说“我掷硬币,您有更好的方法吗?”

在b)情况下-您需要更多信息,坐在大胖A上。退出设计模式,进入信息收集模式。原型,提出问题,阅读技术杂志。无论如何,不​​要睡太久。


0

通常,最好的解决方案是尝试向同事解释您的决定。但是,由于您不想经常这样做,因此,下一个最好的选择是在纸上思考-用纸/笔或空的记事本窗口。

首先要写任何东西-只是为了进入写作的节奏。在记事本窗口中,您可以只键入“我在纸上思考”,然后继续保持意识流。几秒钟后,您将处于写作节奏中,因此请按Enter几次,然后开始解释您的困境。

陈述问题,然后陈述可能的解决方案,每个解决方案的优点等等。

尽管这种方法并不总是有效,但通过将想法浮出头脑(RAM)并转移到外部介质(记事本文档)的过程中,您可以更加自由地建立新的连接并从不同的角度查看决策。


0

我也遇到同样的问题。对于小问题,我尝试解决的方法是采用我认为并不愚蠢的第一个设计。试图找到最佳设计没有任何意义。如果没有写下来,您很难甚至不可能就您可能想到的任何设计的所有细微差别进行推理。在编写代码时,您会发现您可以进行一些小的改进。做对了,我发现以这种方式收敛到一个相当好的解决方案是很容易的。

对于更大的问题,我认为首先考虑您的选择是有好处的,但要在时间上加以考虑。大问题有很大的解决方案空间,您无法评估所有可能性,也不要尝试。

TLDR;选择一个合理的解决方案,并随时进行改进。

这也相关:

陶艺老师在开幕日宣布,他将课堂分为两组。他说,工作室左侧的所有人员仅根据他们制作的作品的数量进行评分,右侧的所有人员仅根据其作品的质量进行评分。他的程序很简单:在上课的最后一天,他将带上浴室磅秤并称量“数量”组的工作:五十磅的锅被评为“ A”,四十磅的杯子称为“ B”,依此类推。但是,那些按“质量”评分的人只需生产一个锅(尽管是一个完美的锅)即可获得“ A”。

好吧,来了分级时间,一个奇怪的事实浮出水面:最高质量的作品都是由按数量分级的小组制作的。看起来,虽然“数量”小组忙于进行大量工作,并从错误中吸取教训,但“质量”小组却对完美理论进行了理论探讨,最后,他们的努力除了宏大的理论和一堆枯死的粘土。

来自http://www.codinghorror.com/blog/2008/08/quantity-always-trumps-quality.html


-8

我从来不明白这一点。当我是一名讲师时,我会说:

"OK, create an integer variable and assign the return value of strlen() to it."

您可能会想,这不太复杂,其中95%的人写的是:

int x;   // or y, or len, or whatever
x = strlen( s );

但是偶尔会有人像一只兔子一样瘫痪在大灯下。我会同情地问问题出在哪里,他们会说“我不知道该怎么称呼!”。

这些人应该寻找另一个职业。也许你应该。


2
@Anne我没有做任何假设-您自己说过,您很难为事物取个名字-“经常,在选择最佳设计决策时,我经常被困住。即使是细微的细节,例如...变量名”
尼尔·巴特沃思

3
又为什么我在命名某些东西时遇到困难,为什么还要另谋高就?并非每个概念都有对自然语言的清晰,简短的映射。
Anne Nonimus 2011年

2
@Anne在我看来,您最初提出的问题的主旨是,您在执行优秀程序员所固有的工作时遇到了问题。这没有什么可耻的-大多数人(甚至大多数程序员!)都很难做到这些事情。但是,假设像我一样,您只能乐于做自己真正擅长的事情,我建议编程可能不是您想要的。我成年后的头十年是微生物学家。我不是很擅长,而当我成为一名程序员时,我感到更加快乐。
尼尔·巴特沃思

3
对所有人的友善提醒:如果您不同意答案,请随时使用下注表示。双方的人身攻击将被删除。
亚当李尔

3
最终,我觉得答案相当苛刻,但是这些评论使我觉得它并不那么苛刻。也许你应该编辑英寸
DeadMG
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.