Answers:
该错误位于您的代码中,而不是编译器或运行时库中。
如果看到不可能发生的错误,请检查是否已正确构建并部署了程序。(特别是如果您使用的是复杂的IDE或构建框架试图向您隐藏杂乱的细节……或者您的构建涉及很多手动步骤。)
并发/多线程程序很难编写,也很难正确测试。最好将尽可能多的委派给并发库和框架。
编写文档是您作为程序员的一部分工作。不要把它留给“别人”做。
编辑
是的,我的第一点被夸大了。即使是设计最好的应用程序平台,也确实存在许多错误,并且一些设计欠佳的应用程序也泛滥成灾。但是即使这样,您也应该始终首先怀疑您的代码,并且只有在您有明确的证据证明您的代码没有错误时才开始指责编译器/库错误。
早在我进行C / C ++开发的时候,我还记得一些情况下,所谓的优化程序“错误”是由于我/其他一些程序员完成了语言规范所说的未定义结果而导致的。这甚至适用于Java之类的安全语言。例如,仔细研究一下Java内存模型(JLS第17章)。
浮点计算是不准确的。
不要停止学习。
故障排除和调试技巧
在我参加的任何编程课程中,他们几乎都不会花任何时间在这个主题上,而根据我的经验,这是决定程序员生产力水平的最大决定因素之一。不管您喜不喜欢,与新开发阶段相比,您在应用程序的维护阶段花费的时间更多。
我与许多程序员合作,他们通过随机更改事物进行调试,而没有发现问题的任何策略。我已经进行过数十次对话。
其他程序员:我认为我们应该尝试看看它是否可以解决问题。
我:好的,假设可以解决问题。这能告诉您问题的根源在哪里?
其他程序员:我不知道,但是我们必须尝试一些。
基础。当前,程序员学习的技术不是概念。这是不对的。
Its wrong
应该it's wrong
为。
每个程序员都应该知道他一直在代码中进行假设,例如“这个数字将是肯定的和有限的”,“此代码将能够在眨眼之间一直连接到服务器”。
而且他应该知道他应该为这些假设破裂做准备。
assert()
随处可见的人。 assert()
将帮助您记录您的假设并在出现错误时挽救您。
学习概念。您可以使用Google语法。
批判和逻辑思维。没有它,你将无能为力。
那比你想的要难。
虽然将正常使用时可以正常工作的东西放在一起很容易,但要应对错误的输入,所有边缘和拐角情况,可能的故障模式等都是很耗时的,并且可能是工作中最困难的部分。
然后,您还必须使应用程序看起来也不错。
领域知识。规格永远不会100%;了解您要开发的实际领域将始终提高产品质量。
指针,显然。:)
代码完整2-掩盖
分而治之。这通常是解决从调度到调试的任何类型的实际问题的最佳方法。
真正的技能反映在良好执行简单设计的能力上,而不是完全完成复杂设计的能力。
该技能来自对基础知识的更好掌握,而不是对奥术的掌握。高素质的程序员的定义并不在于他们是否具备编写其他人无法做到的能力(使用高级功能,高级功能编程,随您所想),而是在于其完善平凡的编码的能力。选择类之间功能的适当分解;建立稳健性;使用防御性编程技术;并使用可带来更多自我证明的模式和名称,这些都是高水平编程的基础。
编写您或其他人可以在一个月或一年的一周内恢复工作并了解如何使用,修改,增强或扩展该代码的良好代码至关重要。它可以节省您的时间和精力。通过消除以前可能遇到的障碍(可能打断了思路,或者可能需要花费数小时或数天的时间来完成其他工作,等等),它可以提高生产率,从而更加轻松地专注于难题,有时会使棘手的问题消失。
一言以蔽之:优雅。每个类,每个方法,每个条件,每个块,每个变量名:追求优雅。
每个程序员都应该知道如何使用调试器,并且知道如何很好地使用它。
短路评估,尽管这是他们教您有关布尔运算符的第一件事。