遵循帕累托规则,程序员仅将20%的时间用于真正有用的事情。
我花了80%的时间进行调试,修复一些小问题,以使所有工作正常进行。
有没有办法花费更少的时间进行调试?
遵循帕累托规则,程序员仅将20%的时间用于真正有用的事情。
我花了80%的时间进行调试,修复一些小问题,以使所有工作正常进行。
有没有办法花费更少的时间进行调试?
Answers:
用Agda或Coq编码。一旦您的代码编译,它将起作用。如果过于刻板,请选择类型系统较弱的语言,例如Haskell或F#。
但是,在大多数情况下,您将在20%的时间用于编码以及80%的时间在测试和调试上花费更多,从而提高生产力。一周100%远远超过一个小时的20%。如果您需要完成调试工作,那么调试并不是浪费时间,并且您不应该为“提高”这一比例而烦恼。
单元测试。
在开始进行单元测试之后,我发现编写的代码结构更好。这样就更容易避免和发现错误。我花了更少的时间进行调试,但是花了更多的时间来编写单元测试。
我还认为,在单元测试上投入的时间要比调试好。在调试会话后,我只修复了代码。同一错误可能会在几周后出现,我必须再次调试。如果我编写了单元测试,则该错误将记录为单元测试,之后又充当回归测试。如果该错误再次出现,则单元测试将向我显示此错误。
a + b
对代码单元进行单元测试(除非您的测试涵盖了算术数据类型的整个范围)。
如果您引入了错误,它们会在您的生产代码之前被打破,因此单元测试将对您有所帮助-编写得当的单元测试还将告诉您到底是什么导致了错误。
这将为您提供大部分帮助,但是对于99.999%的项目,您仍然需要定期调试。我发现这里要做的最好的事情是做4件事:
在编译之前,请仔细阅读代码。请仔细阅读语法和功能。如果一段代码太复杂,它可能会提供令人惊讶的信息,并且也是一个很好的指示。
大多数答案似乎都集中在如何减少必须调试的问题上,这很有价值。但是,调试总是必不可少的,因此研究提高调试速度的方法很有用。
知道如何使用版本控制软件。
增进您对所用编程语言的了解。
保持逻辑
添加到单元测试的注释中,但这仅在您的代码已被分离以支持它的情况下才是真正的好选择(例如MVC)。如果您无法实现MVC(或类似的项目)(旧项目),则单元测试根本不适用于您的UI。然后,我将添加自动化的UI测试(Microsoft编码的UI测试,WaitN),因为这将减少代码那部分中的错误。
我也强烈建议运行静态分析工具(例如,FxCop / Microsoft代码分析,Resharper,MS World的JustCode)。这些可以发现各种常见的编码问题,这些问题可以减少繁琐的调试任务,而将更多精力放在调试业务逻辑上。
最近,我对这个问题有了很多思考-简单的答案是去读唐·诺曼的《日常事物的设计》;像设计产品一样编写代码。
换句话说,好的设计可以最大程度地减少错误。这意味着,您已经完成了一些事情(尽管您可能并不确切知道为什么)。
-名称功能直观。这正式称为负担。也就是说,可以按下按钮,可以切换操纵杆,可以拉动手柄等。
-很难编写错误的代码。请检查输入是否有问题,并尽早(而不是稍后)引发错误,并在适当的时候使用匈牙利语的应用程序,等等。这些称为锁定功能。
-在适当的地方使用抽象。短期记忆力较弱。
-文档显然很重要,但是确保代码正确使用的效率最低。简而言之,精心设计的产品不需要任何文档。(最明显的观察方法是看一些不好的例子:即带有推手的门。)
-单元测试。这些并不能真正防止错误,而要使错误在哪里清晰可见并提供理智。
我确定我缺少更多的原则,但重点是,请阅读有关错误设计的内容。
尽管我完全支持上述建议的单元测试,但是TDD或BDD将非常有价值,因为您需要首先考虑问题和解决方案。
但是对我个人而言,花几分钟时间静静地坐下来思考问题以及如何解决该问题,以及每种方法的优缺点,确实对我的代码质量感到惊讶,并帮助我清除了混乱的头脑。
有时,在纸上快速书写可以帮助您查看拼图中较大的连接部分。
当我刚开始潜水并敲击键盘时,我会编写最糟糕的代码。一点点的思考和沉思就可以改变世界。
PS。我的意思是可能要花5分钟到10分钟,而不是花几个小时编写一个庞大的规范。
我的两个主要想法是:1)编写更好的代码,当您执行意外操作时该代码将失败2)变得更好地进行调试
我的代码乱七八糟
if(value!=null) throw new NotImplementedException();
if(obj.v>0) throw new Exception(); //sometimes i dont write NotImplementedException
if(value=="thing") throw ...;
每当我执行那段代码时,都会引发异常,这会导致调试器停止运行,这使我可以使用新功能进行编码或避免出现这种情况,而后对正在发生的事情感到困惑/存在错误
为了更好地调试调用堆栈,断点(带有条件),立即窗口(也称为提示或repl窗口),“监视”变量以及其他任何东西,会产生混乱。