你可以不聪明,但是你绝对不能不用心。

——《女人公敌》

程序员求职是本是一件只要“郎有情女有意”,一拍即合的事情,可是企业与求职者却总是看不对眼,进而导致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#非常熟悉。

优秀程序员在编程的时候,总是会不断的思考这样一些问题:程序的算法合理吗?异常情况都考虑了吗?程序写的够简单吗?执行速度够快吗?占用空间足够少吗?代码写的规范吗?语句写的标准吗?程序之间的结构合理吗?类定义的合适吗?方法和属性合理吗?接口合理吗?等等,而不是仅仅实现功能。所以,要想称为金字塔尖的那一部分精英,对于大多数程序员而言,还有很长一段时间的路要走。

优秀程序员不是嘴说出来的,而是靠努力干出来的,她需要辛勤地耕耘,没有付出,也就没有收获。正如莫泊桑所说,天才不过是不断的思索,凡是有脑子的人,都有天才。国际知名纳米材料专家王中林院士曾经说过:“天才应该是灵感乘以汗水,年轻人总希望一夜成名,只看见了成功的光环,但没看见辛劳的背景。”

转自:http://blog.csdn.net/xdhehao/article/details/10010175

优秀程序员应该具备哪些素质?相关推荐

  1. 程序员应该具备的素质(来自csdn)

    程序员是一种技术工作,在IT的发展中有相当重要的地位,从底层硬件通讯协议的建立, 到数据传输层的处理,到操作系统的建设,到数据库平台的建设,一直到应用层上各种数 据营销平台的搭建,程序员在里面都扮演着 ...

  2. 程序员应该具备哪些素质

    趁着这几天无事,好好总结一下从事软件开发以来的一些想法,这篇blog尝试从我自身的一些经历来谈谈程序员应该具备哪些素质.如有不足之处,还请不吝赐教! 下面,我将列出并展开所有我认为程序员必须具备的素质 ...

  3. 一个合格的程序员所具备的素质和修养

    程序员基本素质: 作一个真正合格的程序员,或者说就是可以真正合格完成一些代码工作的程序员,应该 具有的素质. 1:团队精神和协作能力 把它作为基本素质,并不是不重要,恰恰相反,这是程序员应该具备的最基 ...

  4. 程序员应具备的素质-拨乱反正篇(转)

    程序员是一种技术工作,在IT的发展中有相当重要的地位,从底层硬件通讯协议的建立,到数据传输层的处理,到操作系统的建设,到数据库平台的建设,一直到应用层上各种数据营销平台的搭建,程序员在里面都扮演着举足 ...

  5. 程序员应具备的素质-拨乱反正篇

    程序员是一种技术工作,在IT的发展中有相当重要的地位,从底层硬件通讯协议的建立,到数据传输层的处理,到操作系统的建设,到数据库平台的建设,一直到应用层上各种数据营销平台的搭建,程序员在里面都扮演着举足 ...

  6. 成为优秀程序员需要具备的15种编程技巧

    来源 | https://www.linuxmi.com/chengxuyuan-15-jiqiao.htm 编程是一个告诉计算机如何工作的术语.通过编程,我们可以轻松操作任何技术.就像所有人在特定地 ...

  7. 优秀程序员所具备的7个好习惯

    当我们被采访的时候,常常会问及这样一个问题--一个伟大的程序员需要具备哪些特质.大多数人回答的是逻辑.机智.耐心以及勤奋.对于这个问题,其实并没有标准答案,但是除了这些特质,习惯也是非常重要的因素.而 ...

  8. Linux之父和Redis之父,Redis之父:10x程序员应该具备哪些素质

    Fred Brooks(<人月神话>的作者)最早在他的论文"没有银弹--软件工程的本质和偶然性(No Silver Bullet - Essence and Accidents ...

  9. 每个优秀程序员必须具备的技术技能

    王巍的博客:王巍目前在日本横滨任职于LINE.工作内容主要进行Unity3D开发,8小时之外经常进行iOS/Mac开发.他的陈列柜中已有多款应用,其中番茄工作法工具非常棒. http://onevca ...

最新文章

  1. [CTO札记]MM晕倒地铁中--最适合的活动未必是阅读
  2. js调用python脚本_javascript – 如何从NodeJs调用python脚本
  3. java中动态代理实现机制
  4. Oracle数据库升级与补丁
  5. 从没想到监控可以这么做!阿里云RDS智能诊断系统首次公开
  6. deb下载路径、apt下载路径(deb路径、apt路径)、自定义打包deb文件、安装deb文件、解压deb文件
  7. 萌新的Python练习菜鸟100例(十二)判断101-200之间有多少个素数,并输出所有素数
  8. 合作式智能运输系统 车用通信系统应用层及应用数据交互标准 第二阶段_为什么一定要了解OPC UA TSN——未来的工业通信标准...
  9. 如何在 Mac 上使用任务控制空间?
  10. vue组件,通过props父组件给子组件传值,WTF, 子组件报错undefined???
  11. java 父子级json组装不用递归_揭秘java中无数人伤透脑筋最为神秘的技术之一——ClassLoader...
  12. XP的故障恢复控制台
  13. Spring Data Redis 实践
  14. 双排四点接触球转盘轴承的有限元分析
  15. 面包店利用拼团模式面包免费送-月销售30万 !
  16. 总线揭密 串行传输VS并行传输
  17. 蒲公英 · JELLY技术周刊 Vol.12 尤雨溪新作 Vite, 你会支持么?
  18. 无法连接计算机,超过最大连接数
  19. 长微博工具开发者称遭新浪无故封号
  20. 计算机与技术专业学e语言庅,计算机科学与技术专业课程有哪些 主要学什吗

热门文章

  1. 从希拉里“邮件门”看桌面系统的安全
  2. 4、netty编写http服务器、增加压缩支持、netty编写client、netty添加SL/TLS保护https支持
  3. java中main方法的作用是什么_java中main方法是什么
  4. python爬取vnd.openxmlformats-officedocument.spreadsheetml.sheet类型数据
  5. 怎样实现微信打开网址后自动调用手机自带默认浏览器或提示选择浏览器,微信跳转手机浏览器打开指定页面
  6. Centos中mysql修改密码策略并修改密码
  7. 69-C语言-判断数组升序降序
  8. 如何理解目标价值?学会这招即可快速设定并达到目标
  9. 大学不迷茫读书之笔记篇
  10. 数据挖掘——预测未来销售