1、专和博的决择能力
毫无疑问,专是必须的。没有专,只有博,就好比建在沙滩上的城堡,经不得风吹雨打,很容易坍塌。若要具备专的能力,就需根据自己的性格、兴趣以及工作特征来选择需要攻坚的方向,例如算法、网络、数据库、业务分析、架构设计等。这个无需多言。那么博呢?或许对于某些软件开发工作而言,“博”并非必备,但就一般的项目开发来说,确实需要具备更为广博的知识。这年头,只知道编码的程序员很难获得更好的机会。编码能力是基本,但如果不了解许多与编码有关的知识,例如设计、测试、数据库、构建脚本、工具,就很难参与到项目开发中。这些能力并不需要程序员一定要掌握、精通,但必须有所了解,并根据项目情况,决定是否需要深入学习。例如,在前一个项目中,我第一次接触到Cucumber,学会如何编写Regression Test的Feature。到了这个项目中,我要编写Twist的Test就要容易许多了。至少我不会茫然。当然,对于Regression Test而言,我还有很多困惑与体会要说,希望能有时间就这个问题专门写一篇博客。又例如对于编程语言。也许作为主流语言而言,了解Java或C#其中一门就已经很不错了。如果你一直从事.NET开发,似乎也没有学习Java的必要。可是为什么不去尝试一下呢。即使无需使用Java开发项目,了解Java的实现机制,对于开拓自己的眼界总是有好处的。何况对于项目开发而言,不定哪一天就需要你开发Java项目了。同理,我们不能只局限于一类语言。例如了解动态语言,函数语言等,了解它们的新奇之处,一定会对自己的编码能力有很大的帮助。现代的软件项目开发,越来越向着多语言开发的方向前进了,掌握多个语言,多个开发平台已经成为了程序员的必备要求。
2、学习能力
正是因为需要博,学习能力才显得如此的重要。坦白说来,现在有多少开发人员运用的知识都是自己的教师传授的呢?具备超强自学能力的程序员,即使起点很低,将来一定会走在其他程序员的前面。这是一场马拉松赛跑,比的是耐力、韧劲,当然还要有好的方法。在LA的第二周,我和Thoughtworks美国的一位老员工Sheroy一起Pair。我们需要对项目进行性能测试。我们选择了JMeter作为性能测试工具。这个工具我们事先都没有用过。不过,另外一个团队的成员曾经使用JMeter写过一个Test Plan。我们就参照着这个Test Plan以及JMeter提供的文档,开始学着使用JMeter来编写性能测试的计划。经过一天的实践,我们很好地了解JMeter的基础知识,并能够比较好的完成任务。这样的例子在我们公司俯首即是。人人皆善于学习,乐于学习。我们有很好的学习氛围,我们每天有Lunch Session,我们愿意在项目开发中尝试一些新工具或者新框架,我们愿意为新的技术去做Spike。正是因为这种学习的劲头,我们可以快速地进入项目,快速地掌握新的知识。坦言之,我在进入公司之后,曾经以为自己还算不错的学习能力,在公司同事面前就显得相形见拙了。我觉得自己的学习能力不够用了。这个压力是个好事,因为它可以促进我不断前进。
3、解决问题的能力
事实上,这个能力与学习能力一脉相承。然而,它们又不完全相同。若要具备相当强的解决问题的能力,必然具备好的学习能力。因为很多问题是我们不曾遇见过的,也可能是我们在使用新工具、新语言、新框架中面临的问题。如果没有好的学习能力,就很难找到解决问题的钥匙。然而,仅有学习能力是不够的,解决问题需要方法。例如通过调试,通过查看日志,或者有效地搜索Google。解决问题还需要经验,具有丰富经验的开发人员即使面临新问题,也能够根据过去的经验找到快速解决问题的途径。仍然是这一周的开发工作。我和Sheroy在用JMeter写性能测试时,发现同时启动多个线程模拟并发用户登录时,有的登录行为出现了错误。我们对于登录的设置是正确的。如果单独执行JMeter的测试计划,也没有任何问题;但在Jenkins上执行时,就会出现这样的错误。我没有想到任何解决办法。但Sheroy通过分析执行日志,敏锐地发现登录行为的错误总是发生在上一个持续集成任务执行完毕之后。这个任务是用于完成性能测试环境的部署。这个部署任务与性能测试任务是串行执行的,性能测试在部署之后执行。Sheroy认为,可能是部署刚刚完成,性能测试任务就立刻执行,导致登录的请求未能得到服务端的正确响应。他尝试在JMeter测试计划中增加了一个等待时间,问题就迎刃而解了。
整体来看,解决问题需要耐心、细致,善于从普遍性中找到特殊性,可能这个特殊性隐藏得非常深,那么就需要去比较正常和异常情况下,它们的环境、前置条件究竟有何不同?在什么情况下,这个问题会反复出现?只要找到了这种特殊性,往往就能发现端倪,进而想到解决问题的方案。就这一点而言,我还存在许多不足。