1#


谈一谈我对能力的体会。作为一名软件设计者,能力是自己的立身之本,也是养家糊口的必须技能。我常常觉得,作为一名还算不错的技术人员,要挣大钱还是不容易的,但心里至少不会有失业的恐慌,总觉得自己身有一技之长,到哪里不能混口饭吃呢。所以只要不是被刺激,心态总还是比较淡定的。然而,这其中暗藏的风险就是,我的生活、我的家庭乃至我的未来就完全绑在这一根绳子上了。如果能力跟不上时代的发展,我们就会成为死在沙滩上的前浪,连一个印子都留不下来。这么一想,能力的打磨就至关重要了。那么,要成为一名优秀的Dev,需要具备哪些技能呢?在这一周通过和美国的同事Pair,我的一些观点得到了实践的印证。


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测试计划中增加了一个等待时间,问题就迎刃而解了。

整体来看,解决问题需要耐心、细致,善于从普遍性中找到特殊性,可能这个特殊性隐藏得非常深,那么就需要去比较正常和异常情况下,它们的环境、前置条件究竟有何不同?在什么情况下,这个问题会反复出现?只要找到了这种特殊性,往往就能发现端倪,进而想到解决问题的方案。就这一点而言,我还存在许多不足。



4、部署环境的能力

毫无疑问,这是我的短板。我最讨厌的就是配置、安装与部署。我甚至没有耐心去看安装指南、配置向导。尤其是对于一些开源框架或工具,在文档极度缺乏的情况下,我总是难以快速地完成框架或工具的搭建。相对而言,我更喜欢一键式安装的傻瓜做法。可是在现在的软件项目开发中,我们常常不限于只使用一个工具,而且使用的工具也不只限于图形化界面。也许有人会说,开发人员只需要关注自己的编码能力就可以了。可是我们开发出来的软件总是需要部署才能正常工作的,如果对软件的部署不了解,怎么交付给客户使用呢。也许有人又会说,这可以交给专门的部署人员来做啊!那么,作为实现功能的你而言,你怎么给你的部署人员说明整个部署流程?而且,若要顺利地进行软件开发,没有一个完整的开发环境,开发人员又该怎样开展工作呢?因此,开发人员应该具备一定的部署环境的能力。尤其随着DevOps变得越来越重要,这项能力也会扮演着越来越关键的角色。



5、交流能力

不可避免,还是要提到交流能力。可以说,对于这一能力,无论如何强调都不过分。我在LA工作的这两周,因为语言问题已经强烈地感受到了这一点。就在本周四,我需要完成Story 271,但我对Story的业务逻辑了解得不够,所以就找到我们的BA Jacky。他是一位台湾人,不过几乎已经不怎么会说国语了。由于我对这一部分业务缺乏足够的了解,所以我们之间的交流从我事先想象的10分钟,延长到了半个小时,并在Jacky连说带画的努力阐释下,我才弄明白了这个Story要求我们做的到底是什么。这就是交流的必要性。我曾经接触过一些刚刚踏入这个行业的程序员,他们都愿意努力的学习,但在交流能力上普遍欠缺。一个问题难以表达清楚,也很难获得正确的理解。

整体而言,无论是哪方面的能力,提升都是无止境的。能力是我们的立身之本,提升能力就能提升我们的价值,同时,也能够改善我们的生活,进而改善我们这个行业。这就是我的一点体会。


改编自:http://www.cnblogs.com/wayfarer/archive/2011/11/09/2241887.html