Answers:
对于那些真正可怕的问题,我的策略通常如下。
实验和谷歌。继续尝试解决问题。在大多数情况下,这可以在一小时或更短的时间内解决问题。
所以那没有用。休息一下。喝咖啡,谈论与同事无关的事情。将问题排除在外。当您在5或10分钟后查看问题时,您是从稍微不同的角度查看问题。在大多数情况下,这是可行的。
在这种情况下,没有。因此,请再花10到30分钟查看一下。然后打电话给同事。但是在做之前,请做一些笔记;您想演示问题,重现问题,然后列出您尝试过的事情,最重要的是证明您已经尝试过。因此,请先进行空运行。在代码中设置一些书签,关闭所有多余的打开文档等。通过这种方式,您可以自己解决问题,也可以在演示问题时避免浪费时间。
请您的同事让您证明所有假设。该setter实际上是被调用的吗?该方法真的返回您所声称的内容吗?您认为该对象不是null-向他们显示它不是null。
在大多数情况下,要么演示问题,要么使您意识到您没有尝试所有可能,否则您的同事将看到您的错误。
如果那不起作用,那么它的时间就会变得严肃起来。准确记录您正在尝试做的事情,尝试过的事情以及为什么行不通。通过电子邮件发送给您的所有同事。将其发布在SO上。此时,文档应该是一个完美的SO问题。
当您等待回复时,google google google。尝试对问题进行所有排列。打开一堆标签。到那时您可能无法获得答案,但是您正在寻找想法,可能性和解决问题的不同方法。
如果您在某个问题上花费了5个小时,则可以将其留给另一天。也许您会得到有用的答复。也许第二天当您攻击该问题时,它将很明显。
如果这些都不起作用,那就该寻找其他解决方案了。也许您可以使用不同的方法,不同的技术。也许您应该考虑暂时放弃此功能。您是按小时向客户收费吗?您在内部应用程序的公司工作吗?您需要将此问题上报给所有者,然后告诉他们:“看,我花了x个小时在此上却没有取得进展,这样做是否值得呢?” 您不想去找老板,告诉他们您在问题上花了16个小时,只是让他们转身说,没那么重要,请在此版本中跳过它。您需要更早发现。
如果那不起作用?那么,您唯一的选择就是不断地解决问题或寻求行业专业知识。在Twitter上询问技术专家。给您的技术提供商发送电子邮件。
退出。不,不是你的工作!刚起床回家。您白天或周末都做完了。接下来的20个问题中有19个问题会在一个小时内显示出来。
在十小时之前,我会得到一些帮助。
向其他人解释这个问题。
通过向其他人解释问题,您必须加以澄清:这通常可以使您看到解决方案。
(英国一本专业的计算机杂志曾经提议专门为此目的出售高级程序员的真人大小的纸板切口。)
我发现在一个问题上睡觉(有时几天)也可以有所帮助。
编辑:
简短的答案:
问:您如何解决真正奇怪的错误,使您困惑10多个小时?
答:请确保它们永远不会发生:了解您的设计,了解您的代码,了解如何使用调试器。
说明:
“好像鬼怪弹跳到了筹码的深处,弄乱了东西”
这永远都不会发生。如果是您的代码,则在尝试修复该错误之前,您应该对导致该错误的原因有很好的了解。
此外,在编写代码时,您应该已经知道它可能在哪里以及为什么会失败。
话虽如此-询问同伴,在SO上发帖,追溯和回滚您的步骤并休息一下-上述所有建议都将有所帮助。
另一件事是,您必须了解自己的工具-调试工具包。在代码中的可疑点记录消息,仔细检查调用堆栈,使用条件断点和监视等等,等等。调试技能不是多余的-它们是编程的一部分。
我有一个类似的问题,就是在Objective-C中出现明显的内存损坏,这让我苦苦挣扎了许多小时。但是后来我和我的同事们散步去吃午餐,然后我解释了这个问题(其中一个特定的问题与init方法中对象的反序列化有关),并向我自己基本上解释了整个问题。
(技术细节:基本上,我初始化了一个对象并将其返回到除self之外的其他对象上,所以有两个alloc,但是仅返回了一个对象。内存移动并发疯,崩溃,并且调试器并不真正知道该怎么做它要么)。
我真的不喜欢投票率最高的答案,因为尽管有时这个答案可行,但有时候您只需要在当天找出答案,所以我建议按以下顺序进行:
确认这不仅是发生在您身上。这样可以节省很多时间。也许您卸载了必需的组件,或者在您的环境中进行了更改,并且代码中的某个地方吞下了异常。如果只发生在您身上,我将使用环境比较工具。最近,我读到一个名为Envy的软件,尽管它不是免费软件,但允许您执行此操作,但它的价格为10美元。
发生在每个人身上?很好,现在在代码上执行“查看历史记录”,并验证直接或间接导致错误的最近更改。
最近没有变化吗?如果是非常具体的错误(异常),请“ stackoverflow it”。现在,这听起来不比“ google它”好,但是我要说我比Google第一次搜索stackoverflow来进行编程研究。如果这是一个真正已知的问题,很可能会在这里找到解决方案。如果不是,则在相关的stackexchange网站上发布问题。您可能会得到非常快速的答案,或者即使您没有,也可以在进行更多研究时找到问题。那是一个好处。
如果您没有在线找到答案或不是一般性错误,那么请逐步浏览代码,检查每个步骤所获得的结果是否符合您期望的结果。开始每种方法的完成,然后从下至上选择分层解决方案。(即,如果要对性能进行故障诊断,请从检索记录的代码开始。如果可以快速确定第一步是否有问题,那么从UI中开始就没有意义了)。
如果经过几次代码仍未发现问题所在,请致电他人进行讨论。正如已经提到的,大声谈论它可以点亮灯泡。再加上配对编程真的很有用。
此时,如果可行,请走一段时间或一天。我昨天读了一条非常真实的推文,上面写着:“我上床睡觉时想着'怎么fck',然后醒来就想'但是当然'”。如此真实。
如果您仍然没有答案,我敢说您可以尝试将其重构为较小的任务/方法/功能。亨利·福特(Henry Ford)表示,“没有一项任务如此复杂,无法将其分解为较小的任务来完成”。在这一点上,如果解决方案过于复杂,并且您自己或在其他人的帮助下还没有弄清楚,请将代码重构为较小的任务。即使您最终没有提交它,它也可以帮助您找到原因。
将检测添加到您的代码中。
关于它的推文?