从小白到入门,从入门到进阶,从进阶到高级,从高级到资深,再从资深走不一样到路线。这条路能够说是大多数程序员的发展路线,在这个过程当中经验就显得尤其重要,尤为是后期,经验能够占据很大的优点。程序员
1. 从小事作起,而后再扩展编程
不管是建立一个新的系统,仍是在现有的系统中添加新的功能,我老是从一个简单到几乎没有任何所需功能的版本开始,而后再一步一步地解决问题,直到满意为止。我历来没有妄想过可以一步登天。相反,我一边开发一边学习,同时新掌握的信息还能够用于解决方案中。 我很喜欢 John Gall 的这句话:“复杂系统老是源于简单系统的演化。”框架
2. 一次只作一件事函数
当咱们在开发时,碰到测试失败和功能无效的状况,若是你一次只研究一个问题,那将会更容易找到问题的关键。换言之,就是使用短迭代。必须确保这个问题解决以后,再转移到另外一个问题上。这适用于向下提交。若是在你添加新功能以前须要先重构代码,那么先提交重构,而后再添加新的功能。学习
3. 尽早地添加日志和错误处理测试
在开发新系统时,我作的第一件事就是添加日志和错误处理,由于这二者从一开始就很是有用。对系统来讲它比一大把代码更有用,你须要一些了解程序状态的方法。若是系统不能照常工做,那么你就须要知道程序中发生了什么——这是日志的做用。错误处理也是如此——错误和异常越早处理越好。编码
4. 每一行新代码必须至少执行一次设计
在你真正完成一个功能以前,你必须对它进行测试。否则,你怎么知道它是否是按照你的想法在执行呢?一般状况下,最好的方法是经过自动测试,但并不是老是如此。不过,无论怎么说,每一行新代码必须至少执行一次。 通常,咱们想触发某种条件很难。但幸运的是,咱们能够做弊。例如,数据的错误处理能够经过临时拼写错一个列名来触发。或者,一个if语句能够暂时颠倒过来(从 if error 变成 if not error),这样来触发那些平时很难触发的条件,这样只是为了肯定代码是否正常运行和它会出现什么结果。有时,我发现有一些行代码永远都不会被运行。当咱们作代码检查是它看起来没有什么问题,但就是不工做。你要避免这样的尴尬情况,若是你想你的每一行新代码都会被执行。日志
5. 在总体测试以前先进行模块测试blog
先进行部分模块测试能够节省时间。一般说来,咱们在整合不一样的模块时也会出现问题,例如模块之间的接口不匹配。可是若是咱们可以信任各个组件的话,那么跟踪集成问题就会变得简单得多。
6. 全部事情所花费的时间老是比你预期的要长
特别是在编程中,即便一切进展顺利,咱们也很难对功能所需的时间作出正确的预算。而且,开发软件时碰到各类意想不到的问题是很是常见的。一个简单的合并操做会致使一系列小bug,一次框架升级意味着一些函数必须改变或者一些API不按照你想象的那样工做。
Hofstadter Law( 霍夫施塔特定律)其实道出了真谛:作事所花费的时间老是比你预期的要长,即便你在预期中已经考虑了 Hofstadter Law( 霍夫施塔特定律)。
7. 先了解现有的代码
大多数的编码都须要以某种方式改变现有的代码。即便是新功能,也须要适应现有的程序。因此,在你加进去新的内容前,首先须要了解当前的解决方案。不然,你一不当心就颇有可能会打破现有的功能。这意味着,阅读代码和编写代码都是必要的技能。这也是为何看似微小的变化仍可能须要很长时间才能解决的缘由之一,由于你首先必须了解上下文。
8.阅读和运行代码
幸运的是,对于理解代码,咱们有两种互补的方法。你能够阅读代码,也能够运行代码。运行代码的确是个很是棒的好方法。因此,请确保充分利用这两种方法。
9. Bug 老是不免的
我不喜欢那些宣称软件开发能够“一蹴而就”的高谈阔论。不论你再怎么努力,bug老是不免的(BUG的定义基本上是:“咱们没有想到”)。最好可以作成能够快速故障排除、修复bug和部署修复的系统。
10. 解决故障报告
每一个开发人员都应该花时间去处理来自客户的故障报告,并修复bug。这能让你更好地理解客户的意图,明白如何使用系统,知道排除故障的难易程度,了解系统的设计状况。这也是为本身的开发成果负责的好方法。不要错过这些好处。
11. 重现问题
修复bug的第一步就是重现问题。而后你得确保修复以后,问题可以不折不扣地消失。这样一个简单的规则,能够确保你不会误将非问题看成是问题,并确保解决方案真的可以奏效。