你可以不聪明,但是你绝对不能不用心。 ——《女人公敌》 |
程序员求职是本是一件只要“郎有情女有意”,一拍即合的事情,可是企业与求职者却总是看不对眼,进而导致IT市场上总是会出现结构性失衡的现象。一方面,社会每年培养几十万的程序员,他们却找不到好的工作,但另一方面,企业却招不到好的程序员。问题出在哪?问题出在程序员越来越多,但优秀的程序员却不是这样。
著名书籍《人月神话》里面对优秀程序员的特性进行了一个深入分析,认为优秀程序员必须具备以下几个方面的素质:
(1)对编程有浓厚的兴趣,而不是因为乔丹(备注:乔丹曾经给NIKE代言,广告词为“Just do IT”)才入行,由兴趣能驱动自己的探索和钻研精神,优秀程序员一般喜欢用业余时间探索和自己琢磨点东西,研究点开源框架和源代码。
(2)优秀程序员一般善于重构,懒于做重复的事情,对于重复事情有独有的程序员思维,即通过程序或其它自动化方式解决重复问题,而留更多时间去思考。达到一种多约束下的良好平衡。
(3)优秀程序员更多的会从简单功能实现,花哨的界面转移到对安全,性能,可扩展等底层架构的关注。
(4)优秀程序员一般有较明显的自恋和偏执特征。
(5)优秀程序员一般对计算机底层知识非常了解,有较为扎实的算法,数据结构等理论知识的基础。
对于优秀程序员而言,编程不是一份工作,而是一项充满激情的事业,编者比较认同这个观点,同时,编者也觉得,一名优秀程序员除了具备这些素质外,如果还能具有以下一些能力,必将锦上添花。
(1) 身体壮如牛
想成为一名优秀的程序员,身体不好肯定不行。本章第4.5节对程序员的身体健康有比较详细的论述,此处不再赘述。
(2) 心理素质好
众所周知,编程是一项劳心劳力的活,程序员也因此需要承受巨大的精神压力。有的人沉不住气,尽管实力不俗,但面对压力,却会瞬间崩溃,立马变成软蛋,而有的人面对困境,能够越战越勇。而优秀程序员属于后者。
(3) 团队精神和协作能力
失败的团队没有成功者,成功的团队成就每一个人!真正优秀的程序员应学会怎样和别人工作与合作,因为团队精神和协作能力是程序员应该具备的最基本的能力,也是最重要的安身立命之本。很多人误认为优秀程序员是独行侠,不食人间烟火,喜欢把自己关在一个小黑屋子里面,一待就是几个月,然后突然出关,向世界宣布自己已经如何武艺高强了,其实不然。如果没有团队精神,任何一个程序员也不可能有真正的成功,即使成功也是渺小的、暂时的。
随着软件系统的规模越来越大,计算机软件的发展已经度过了早期的依靠个人能力的单兵作战时代,“孤胆英雄”也早已成为传说,即便如LinusTorvalds(Linux核心的创作者)这样的天才,也需要通过组成强大的团队来才能创造奇迹。现在的软件已经朝着大型化、商业化、定制化方向发展,因此要获得事业上的成功,必须要依靠团队的力量才能达到,就更加需要程序员的团队精神与合作能力了。
(4) 书写注释与文档的能力
很多人以为编程就是写代码,其实,这是对编程的一种误解。软件由代码与文档组成,优秀的程序员绝不仅仅只是会写代码,而是应该具有很强的注释与文档书写能力。良好的注释与文档是正规研发流程中非常重要的环节,如果软件缺少注释与文档,那么这个软件就会缺乏生命力,在未来的升级、排故以及模块的复用时就都会遇到极大的麻烦,有可能是毁灭性的灾难。
作为一名普通程序员,花费30%的工作时间写技术文档是很正常的事情,而作为优秀程序员,这个比例会更高。
(5) 严格遵循编码规范与标准的编码能力
什么样的代码是最烂的?别人写的代码。真正阅读程序的是人,而不是给计算机,所以代码具有良好的可读性,是优秀程序员必备的素质之一。在大型的系统开发中,往往需要很多人的通力配合,例如,开源软件Linux之所以能够为全球顶尖程序员共享、协作开发,也得益于规范化和标准化的编码规范。
虽然注释是编程中很重要的一部分,但是能够不言自明的代码却更胜一凑,它能让其他人在阅读代码的时候,不用阅读注释或是手册就可以明白它的意思,而编码规范正是能够提高代码可读性的有效方式之一。代码规范一般包括代码的变量命名,代码内注释格式,甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定等内容,良好的编码规范,不仅有助于代码的移植和纠错,也有助于不同技术人员之间的协作。
(6) 经常自测试的能力
在一个正规化的软件研发团队中,尽管配备有专职的测试工程师,但并不能以此为借口,程序员就不进行自测试。对于软件研发而言,问题发现的越早,解决的代价就会越低,整体系统建设的效率和可靠性就有了最大的保证。
只有注重质量的程序员,才能写出鲁棒稳定的大型软件。所以优秀的程序员知道自己的代码能做什么,所以经常会对程序进行自测试,自测试主要包括正常测试与异常测试两种。正常测试看程序是否能在正常调用下完成基本功能,异常测试主要包括压力负载测试,异常输入测试,边界值测试、特殊值测试等。
(7) 善于学习与总结的能力
优秀的程序员绝不会安于现状,因循守旧,固步自封,靠吃老本度日。善于学习,对于任何职业而言,都是前进所必需的动力,对于程序员,这种要求就更加高了。有人说:以一万年为单位来思考,那是神人;以一千年为单位来思考,那是圣人;以一百年为单位来思考,那是大师;以十年为单位来思考,那是名人。按此逻辑,程序员可以称得上是世间最不幸的人了。因为程序员主要从事的是高新技术相关工作,需要了解太多知识,而知识又在不断地更新,一种技术可能仅仅在三两年内具有领先性,很快会被其他更新、更好的技术所取代,所以优秀的程序员总是会不断地主动跟进新的技术,学习新的技能,在最快的时间内,掌握最新的技术,应用在最适合的场合,最大程度地提高软件研发的效率。除了对知识的学习以外,还要善于学习其他优秀程序员,学习他们思考问题的方式,学习他们的编码风格。
善于总结,也是优秀程序员必备的一种能力。苦干不如巧干,但是如何巧干,不是人人都知道的。否则就不会干同样的事情,常人一天忙到晚都来不及;而优秀程序员却可能活的很潇洒。每次完成一个研发任务,完成一段代码,都应当有目的的跟踪该程序的应用状况和用户反馈,随时总结,找到自己的不足,这样逐步提高,一个程序员才可能成长起来。如果只是在按部就班地写代码、凑代码,只能成为Coder,江湖叫“码农”、“码畜”。为了使自己不至于沦为Coder,一定要对自己的代码,自己的设计不停地反思和总结,并精益求精。编程就像创作,人人都会写,但并非人人都写得好。
(8) 逆向思维能力与换位思考能力
当工作中遇到的新问题,一时又找不到解决方法时,优秀程序员擅长用逆向思维办法去探索解决问题的途径。他们清楚具体业务执行者比上司更容易找出问题的节点,是人为的,还是客观的;是技术问题,还是管理漏洞。采用逆向思维找寻问题的解决方法,会更容易从问题中解脱出来。
同时,他们也会自觉地站在企业或老板的立场去考虑解决问题的方案。作为公司或老板,解决问题的出发点首先考虑的是如何避免类似问题的重复出现,而不是头疼医头,脚疼医脚的就事论事方案。能始终站在公司或老板的立场上去酝酿解决问题的方案,逐渐地他们便成为可以信赖的人。
(9) 知识迁移能力
知识迁移能力是一种特殊的学习能力,它可以避免对知识的死记硬背,实现知识点之间的贯通理解和转换,有利于认识事件的本质和规律,构建知识结构网络,提高解决问题的灵活性和有效性。优秀程序员能够把已经掌握的知识迁移到其他领域,学习新技术或者解决新问题对于他们而言,并不是那么困难。例如,如果他们理解了面向对象的思想,并且能够熟练使用C++语言,即使他们从来没有学习过Java、C#语言,他们也会在非常短的时间内对Java、C#非常熟悉。
优秀程序员在编程的时候,总是会不断的思考这样一些问题:程序的算法合理吗?异常情况都考虑了吗?程序写的够简单吗?执行速度够快吗?占用空间足够少吗?代码写的规范吗?语句写的标准吗?程序之间的结构合理吗?类定义的合适吗?方法和属性合理吗?接口合理吗?等等,而不是仅仅实现功能。所以,要想称为金字塔尖的那一部分精英,对于大多数程序员而言,还有很长一段时间的路要走。
优秀程序员不是嘴说出来的,而是靠努力干出来的,她需要辛勤地耕耘,没有付出,也就没有收获。正如莫泊桑所说,天才不过是不断的思索,凡是有脑子的人,都有天才。国际知名纳米材料专家王中林院士曾经说过:“天才应该是灵感乘以汗水,年轻人总希望一夜成名,只看见了成功的光环,但没看见辛劳的背景。”