Answers:
橡皮鸭。对真的。
http://en.wikipedia.org/wiki/Rubber_duck_debugging
橡皮鸭调试,橡皮鸭和橡皮鸭测试是软件工程中使用的非正式术语,用于指代调试代码的方法。该名称是对一个可能的伪经故事的引用,在该故事中,一位未具名的专家程序员将橡皮鸭一直放在桌子旁,并强迫他自己逐行向鸭子解释,从而调试代码。
为了使用此过程,程序员会向无生命的对象(例如橡皮鸭)解释代码,并期望在到达一段不正确的代码并尝试解释它时,程序员会注意到该错误。在描述代码应该执行的操作并观察其实际执行的操作时,这两者之间的任何不一致都变得很明显……
笔和笔记本。
比较平面文本文件中的日志输出或数据时,似乎未充分使用Diff工具。也许那只是一个利基?我似乎发现它对于调试比较程序执行的大量日志并查明已更改的一两个细节非常有用且很有帮助。
性能分析工具也非常有用,尤其是当您遇到严重的僵局时,但是似乎很少有人对此感到熟悉(我承认自己在这个类别中有一定的学历)。
好的XML工具至关重要-如果您使用的XML文件有十几行或多行模式。有时,您不仅需要突出显示其他编辑器提供的基本语法。同样,在使用XML时,学习XSL可能非常有用。很多次,我看到在应用程序代码的多行中完成的简单XSL转换中可以完成的工作。尽管要澄清一下:我并不是说XML本身是一个“被低估的编程工具”。我建议,根据我所看到的,好的XML编辑器的价值被低估了。
diff
未被重视。关于概要分析,并不是只有您一个人认为它们必须有用,但是您自己却不知道如何使用。检查一下。
<Problem:Worsening> <Problem:TimeDescription>Now</Problem:TimeDescription> <Problem:Posessive>they have</Problem:Posessive> <Problem:Quantity>many, many</Problem:Quantity> <Problem:WorseningDescription>more problems</Problem:WorseningDescription></ProblemWorsening>
常用表达
它们是如此有用。它们在搜索日志文件,解析文本等时会有所帮助。它们非常有用。
我感到奇怪的是,我知道有多少人从未使用过它们,因为与它们相关的学习曲线有些许。很多时候,我看到人们用一个简单的正则表达式就可以迅速解决问题时,人们会用困难的方式做事(注:在regex之前我就用困难的方式做事)。
谷歌。很少有尚未解决和记录的问题。精心调整的Google查询可以为每个人节省很多时间。
在调试器中,查找“瓶颈”最不为人知的工具是Ctrl+ C或“暂停”按钮。
检查的最后一段这篇文章,和这个职位,而这个职位,对于初学者。
我经常听到/听到有人说“程序太慢了!我该怎么办?我尝试了探查器(如果他们这样做了),但我听不懂它的意思。有人猜到了吗?帮助! ” 好吧,猜测仅仅是这样。我一直做着的,其他人也做了,就是去做,打断它,并检查调用堆栈。如果问题真的很严重,那么bingo就在您的面前。如果问题只是轻微的,请重复几次。您可以避免的一个以上示例中出现的任何问题都是可以解决的瓶颈。
是的,这是诱饵,但可以。
您认为哪种编程工具是最被低估的?激励你的答案。
编译器。
大多数人不花时间去了解他们选择的编译器的功能。他们只是觉得这使代码成为一个可运行的程序,这是他们所能做到的。在大多数现代配置中,您可以将几种配置添加到其中,以使其按需完成。这是一个示例,我敢打赌,您办公室中的一半开发人员都不知道如何将警告设置为错误级别(假设警告实际上有一个)。您必须输出输出调试符号的哪些选项?您希望它进行哪些优化(或优化的级别)。清单继续。
-pedantic -Wall -Wextra -Werror
...虽然可能很难构建任何东西,然后:p
你的脑。没有它,其他工具将没有太多意义。
好老:
print
有时,调试器或探查器或UML流程图很有用。有时它们会让您发疯。我总是发现自己不愿意使用打印语句(或trace或NSLog或您拥有什么),只是为了确保我的代码在做自己想做的事情。
普通的旧脚本 ...无论我们开发多少种下一代语言,我们仍然严重依赖脚本,而且大多数日常任务都可以通过编写几行脚本来完成。
我大量使用AgentRansack。这是非常有用的帮助,可以快速搜索成千上万个文件。它为我节省了很多时间,但是我不了解很多了解或使用它的程序员。
正式方法。
http://www.amazon.com/Discipline-Programming-Edsger-W-Dijkstra/dp/013215871X
http://www.amazon.com/Science-Programming-Monographs-Computer/dp/0387964800/ref=pd_sim_b_1
很难夸大其重要性。每个循环和每个if语句都以需要某种“证明”的想法开始。大多数程序员大部分时间都是在脑海里做这种证明。您问if语句做什么,并且它们可以(从逻辑上和逻辑上)阐明选择是什么,以及为什么选择是完整,一致和排他的。
但是有些似乎只是随机猜测。他们需要更多帮助,而正规方法可能是他们需要的那种帮助。
它只是代码的代数(和微积分)。没有什么太复杂或复杂的。
断言和良好的alwaysAssert()
功能。恕我直言,这些比单元测试更重要,因为单元测试只能在您认为要测试的特定情况下找到错误。如果同一位程序员编写代码和测试,则他/她可能会错过这两种情况。此外,有时单元测试是不切实际的,因为组件功能和/或其上运行的数据所处的环境太复杂而无法提出人为的测试用例。
断言的美丽之处在于它们能够记录假设并在非人为的输入上对其进行测试。如果这些假设中的任何一个错误,您的代码都会大声失败,而不是“有效”,但会产生不正确的结果。与没有断言相比,它更接近问题的根源。实际上,如果您明确声明了一段代码的假设,而所有这些假设都是正确的,则该代码通常是正确的。
关于断言的一个常见抱怨是可以将其关闭。恕我直言,每种语言或标准库都应具有与该alwaysAssert()
功能相同的功能或大致等效的功能,assert
但不能将其关闭。这可用于检查非性能关键代码区域中的假设,在这些区域中,关闭断言的好处可忽略不计。
我曾经一起混淆了一个Perl调用图生成器。它非常有用,但是在非过程代码或文件外例程上却落伍了。