我"只是"一个业余爱好者程序员,但我发现随着我的程序变得越来越长,bug越来越烦人 - 而且更难跟踪.就在所有事情似乎都顺利进行的时候,会出现一些新的问题,似乎是自发的.我可能需要很长时间才能找出导致问题的原因.其他时候我会添加一行代码,它会破坏另一个单元中的某些东西.如果我认为一切运转良好,这会让人感到沮丧.
这对每个人来说都是常见的,还是更像新手呢?我听说过"单元测试","设计框架"以及各种其他概念,听起来会减少烦恼,使我的应用程序"健壮",一切都很容易理解:)
那么,对于接受过专业培训的人来说,这笔交易有多大错误?
谢谢 - Al C.
"做出修复,在其他地方引起问题"的问题是众所周知的,并且确实是单元测试背后的主要动机之一.
我们的想法是,如果您为系统的每个小部分独立编写详尽的测试,并且每次在任何地方进行更改时在整个系统上运行它们,您将立即看到问题.然而,主要的好处是,在构建这些测试的过程中,您还将改进代码以减少依赖性.
解决这些问题的典型方法是减少耦合; 使不同的部分相互依赖.更有经验的开发人员有时会有习惯或设计技能来以这种方式构建系统.例如,我们使用接口和实现而不是类; 我们将模型 - 视图 - 控制器用于用户界面等.此外,我们可以使用有助于进一步减少依赖性的工具,如"依赖注入"和面向方面编程.
所有程序员都会犯错误.优秀且经验丰富的程序员可以构建他们的程序,以便更容易找到错误并限制其影响.
这对每个人来说都是一件大事.大多数公司在维护上花费的时间多于编写新代码.
你自动化测试了吗?如果你不这样做,你就是在没有找到错误的情况下注册创建错误.
您在修复错误时是否添加了错误测试?如果您不这样做,那么您正在注册一遍又一遍地创建相同的错误.
你在写单元测试吗?如果没有,则在测试失败时注册长调试会话.
你是在先写单元测试吗?如果没有,当您的单位紧密耦合时,您的单元测试将难以写入.
你是无情地重构吗?如果没有,每次编辑都将变得更加困难,并且更有可能引入错误.(但首先要确保你有好的测试.)
修复bug时,你修复了整个类吗?不要只是修复bug; 不要只修复代码中的类似错误; 改变游戏,这样你再也不会创造那种bug了.
有两种方法可以编写无错误的程序; 只有第三个有效.~Alan J. Perlis
在程序中发生错误的唯一方法是由作者放在那里.没有其他机制是已知的.程序无法通过与其他有缺陷的程序坐在一起来获取错误.〜哈伦米尔斯
错误对每个人都很重要.我总是发现编程越多,我对编程的了解就越多.我对几年前写的代码感到畏缩!我最初是一个爱好者,非常喜欢它,所以我去了工程学院,获得了计算机科学工程专业(我在最后一个学期).这些是我学到的东西:
我需要时间来实际设计我要编写的内容并记录设计.它确实消除了很多问题.设计是否就像写下我要编写的内容或完整的UML建模(:()一样简单无关紧要.它是思想和目的的清晰度,当我来的时候有回顾的材料一段时间后最重要的回到代码.
无论我写什么语言,保持我的代码简单易读都很重要.我认为不要过度复杂化代码同时不要过度简化代码是非常重要的.(艰苦的学习课!!)
效率优化和花哨技巧应该在最后应用,仅在必要时才应用,并且只在需要时才应用.另一件事是我只应用它们如果我真的知道我在做什么,我总是测试我的代码!
学习语言相关的细节可以帮助我保持代码bug的免费.例如,我了解到scanf()在C中是邪恶的!
其他人已经评论过编写测试的禅宗.我想补充一点,你应该总是进行回归测试.(即编写新代码,测试代码的所有部分以查看它是否中断)
保持代码的精神图片有时很难,所以我总是记录我的代码.
我使用方法来确保代码的不同部分之间存在最小的依赖关系.接口,类层次结构等(解耦设计)
在我编写代码之前思考并在我写的任何内容中受到纪律处分是另一个关键技能 我知道没有格式化代码的人所以它的可读性(Shudder!).
阅读其他人的来源以学习最佳实践是好的.制作我自己的清单更好!在团队中工作时,必须有一组共同的.
不要因分析而瘫痪.编写测试,然后编写代码,然后执行并测试.冲洗洗涤重复!
学习阅读我自己的代码并将其与错误相结合非常重要.提高我的调试技能库是一项很好的投资.通过帮助我的同学定期修复错误,让他们保持敏锐.
当我的代码中有错误时,我认为是我的错误,而不是计算机和那里的工作.这是一种真正帮助我的心态.
一双新眼睛有助于调试.程序员在疲惫时往往会错过自己代码中最明显的错误.有人展示你的代码是伟大的.
有人提出想法并且不被评判是重要的.我和我的妈妈(不是程序员)交谈,向她提出想法并找到解决方案.她帮我反复反复思考并改进它们.如果她不在,我会跟我的宠物猫说话.
我不再被臭虫沮丧了.我已经学会了喜欢删除bug几乎和编程一样多.
使用版本控制确实帮助我管理编码时获得的不同想法.这有助于减少错误.我建议您使用git或您可能喜欢的任何其他版本控制系统.
正如Jay Bazzuzi所说 - 重构代码.我刚刚在阅读完答案后添加了这一点,以保持我的清单完整.所有的功劳归于他.
尝试编写可重用的代码.重用代码,包括您和代码库.使用无错误的库来执行一些常见任务确实可以减少错误(有时).
我认为以下引用最好说 - "如果调试是删除错误的艺术,编程必须是将它们放入的艺术."
不同意的任何人都没有冒犯.我希望这个答案有所帮助.
注意
正如Peter所指出的那样,如果您正在编写大量代码,请使用面向对象编程.代码长度是有限的,在此之后,如果以程序方式编写,则变得越来越难以管理.我喜欢程序化较小的东西,比如玩算法.