当您遇到编程时要遵循的技巧

时间:2008-11-30 10:48:25

标签: debugging

当我遇到问题时:

  • 我在Google上搜索代码段。
  • 我考虑隔离问题,以便我可以更好地向其他人解释,以便得到答案。

您使用哪些搜索技术来找到问题的解决方案?

我开始在Stack Overflow中提问。

您还有哪些其他技巧或方法可以更快地解决问题?

17 个答案:

答案 0 :(得分:24)

去做其他事情。不完全是。我发现将问题排除在我的脑海后面会有所帮助。我无法计算在我从事其他工作,看电视或吃东西时,我一直在努力解决的问题。看来你的大脑仍然在后台处理这个问题。

如果这无法解决您的问题,请尝试与某人交谈。你会惊讶地发现其他人可以为你的问题提供解决方案,这些解决方案非常简单。

答案 1 :(得分:9)

那就是:

  • 谷歌
  • 谷歌
  • 谷歌
  • Stack Overflow
  • 谷歌
  • 谷歌
  • 如果我有一本书,也许是一本书。

说真的,我在20世纪80年代开始(爱好)编程,甚至在90年代中期你必须了解事情并拥有技术库。然后谷歌出现了谷歌更容易看起来(书签!)API文档(谷歌“java stringbuilder”将让我在那里比导航更快)更不用说实际的书(电子或纸张)。

您尝试解决的大多数问题都已解决过。很多次。

其余的调试归结为分解,可能是单元测试(与分解有关)并验证您的假设。

通过“分解”,我的意思是您的解决方案的结构使得小件可以单独测试并易于理解。如果你有7000行方法,你(可能)做错了。

了解您所做的假设也是关键所以您可以验证它们。例如,当我开始使用PHP时,我写了一段代码:

$fields = $_SESSION["fields"]; // $fields is an associative array
$fields["blah"] = "foo";

我正在试图弄清楚为什么它不起作用(下次我查询$ _SESSION时数组没有更新)。我来自Java背景,您可以这样做:

Map fields = (Map)httpSession.get("fields");
fields.put("blah", "foo");

这绝对有效。然而,PHP 复制数组。一个有效的解决方案是使用参考文献:

$fields =& $_SESSION["fields"]; // $fields is an associative array
$fields["blah"] = "foo";

或简单地说:

$_SESSION["fields"]["blah"] = "foo";

关于调试和编写健壮代码的最后一件事就是了解解决方案的界限。我的意思是,如果你要实现一个链表,那么边界条件将围绕列表为空。

答案 2 :(得分:4)

向同事解释问题,或将其写下来描述。从不同的角度来看,这会让你以不同的方式思考。为了更准确,并描述问题的背景,你将退后一步,更高层次地看待问题,你可能会发现你认为你忽略了一些实际上很重要的东西。

有时,您甚至可以在结束描述之前找到的解释。

答案 3 :(得分:3)

多年来我最好的朋友一直骑着自行车回家。多年来,离开键盘已经解决了许多问题。

答案 4 :(得分:2)

如果问题持续到一天结束,我会尝试在睡觉前有意识地解决问题。

我意识到这听起来有点不合适,但在我的经验中,如果不是全面的解决方案,我会至少采用另一种方法来解决问题。这个想法不是要强调它 - 而是积极地决定在一夜之间解决它。这样你就可以安心入睡。

我认为吃得好,经常运动和良好的睡眠是解决问题过程的重要因素。

答案 5 :(得分:1)

通常我会尝试将问题解决几个小时左右,尝试将不同的东西写在纸上,制作图表。如果这些都不起作用,我通常会通过以下选项。

  1. 在我的显示器上放一个便利贴,继续使用别的东西
  2. 在接下来的几个小时内查看笔记,以便将问题置于脑海中
  3. Google针对类似问题和使用的方法
  4. 咨询同事或朋友
  5. 在诸如stackoverflow之类的论坛上提问
  6. 放弃并设计问题或设计解决问题的方法,以便可以在其他时间处理并在所述解决方法的网站上贴上TODO说明

答案 6 :(得分:0)

我使用的主要技术(应按顺序进行,以便您可以重复使用之前步骤中所做的更高效):

  1. 定义问题:尝试明确定义问题所在,以及预期的内容。请参阅2以帮助您。

  2. 收集有关错误的数据:记录所有内容:您的尝试,预期结果,观察结果。这样可以避免重复几次相同的测试(因为你的大脑无法记住它),并且可能有助于你看到更大的图景。

  3. Reduce your problem。对于任何自然现象的抽象建模,这都是正确的,但对于编程来说更是如此,因为程序是非常复杂的实体。您应该尝试将代码减少到可以重现问题的最小程序。 Automated tools exist

  4. 与某人交谈:几个轶事确认,只有通过谈论才能解决大约2/3的错误。请参阅Helpful Teddy Bear anecdote。如果您之前已将程序缩减为最小程序,并对问题有明确的定义,则两者都对您的解释有用。

  5. 寻求协作帮助:在Google和StackOverflow上进行搜索,如果您找不到能解决问题的任何内容,请发帖(但首先看1,您必须有明确的定义你的问题)。

  6. 正如您所看到的,我将协作帮助作为最后一步,因为您应该在明确定义问题并尝试减少问题并自行修复之后寻求帮助。如果您在尝试前面的步骤之前找到了协作帮助,那么您最终会得到一个糟糕的帮助,或者在您发布后立即自行解决。

    此外,您可能对Coursera Software Debugging课程感兴趣,该课程还介绍了几种自动调试方法。

答案 7 :(得分:0)

如果我无法弄清楚如何解决实际问题,我会尝试考虑问题的简化版本。举一个简单的例子:我最近遇到了一个问题,就是找不到一个从A点到B点的物品的运输路线,当时不一定有从A到B的直接路线,但可能有A到C然后C到B,或A到C,C到D,然后是D到B.(我确信航空公司和铁路公司一直这样做。)这是相当复杂的,所以我试着先看看简单案例:直接A到B.这很容易。然后考虑我一路上一站式处理它。然后考虑两站。那时我能够看到解决方案的模式。

问题的简化版本的解决方案可能最终成为更大解决方案的一部分,其中包含一些额外的复杂性。但即使不是,解决更容易问题的练习往往会给你如何解决真正问题的想法。

答案 8 :(得分:0)

再一次,浏览我认为可能相关的内容,然后小睡一会儿。 还有另外两个提到睡眠或午睡的答案,但这值得更多重视。现在已经知道那里有精密的机器可以在你睡觉时上班。谷歌((CBS SCIENCE SLEEP))将为您提供精彩的免费视频。

答案 9 :(得分:0)

你被卡住的事实可能是'代码嗅觉'。建议他们在其他地方的设计或方法有问题。试着指出造成这种情况的原因并改为修复它。

当你回到你的问题时,它可能不再存在。

答案 10 :(得分:0)

通常情况下,我会得到笔和纸,并尝试找出问题的细节。如果这没有帮助,谷歌。如果做不到这一点,我会做一段时间的其他事情,或者在线询问。到目前为止为我工作。

答案 11 :(得分:0)

问问自己:解决这个特别棘手的问题对你所做的事情非常重要吗?

出于您的应用目的(或者无论大图是什么),您可以解决类似但更容易的问题,以便大致完成同样的事情。

答案 12 :(得分:0)

首先尝试解决问题的小得多的版本,看看你是如何继续这样做的。 一旦你完成了这个,那么更大的问题就不会那么可怕。

答案 13 :(得分:0)

通常我会尝试解决它,直到我进入睡眠状态。有时候我在纸上写下代码正在做什么然后我将它分成几部分;我试着知道程序变量在运行时是如何变化的。

答案 14 :(得分:0)

除了编程一段时间之外,通常最好先清除头脑。请参阅this answer以获取示例 - 我在遇到一个特别棘手的bug时做到了这一点,当我回到问题时,我在大约一分钟内解决了它。

答案 15 :(得分:0)

不要忘记Google Code Search

答案 16 :(得分:-1)

去厕所。 你移动,所以你的大脑得到氧气。 你放松,所以你专注于其他事情。

小便创新! :)