这几年项目管理的事情做了不少,管理过不少程序员,有一些程序员确实会比其他人突出一些,他们在升职加薪方面确实会快很多,如果你也想成为优秀的程序员,个人提几点小建议: 程序员的本职工作,还是把代码写好,所以先说说代码的事儿,主要讲两个方面: 关注实现,也要关注效率和性能:我见过的程序员,大部分都可以把功能实现,只有部分程序员会关注性能问题,并且肯为提高代码执行效率投入大量的时间;因为很多项目组在开发过程中,测试环境和生产环境的数据量差别很大,测试中没有问题的代码,一上线就会出问题。 关注代码的可复用性和扩展性:代码写的好不好,可复用性和扩展性很重要,这个关系到项目后期的迭代,有些项目换了几波开发人员之后,就留有很多谁也不敢动的"祖传代码"了。 以上两点,可以说是对项目的责任心:有些额外的付出,可能并不会在短期内得到回报,比如两个人实现相同的需求,外表上看实现的功能都是一样的,但是你写的代码,后期扩展起来很简单,不过也有可能几个月、几年后才需要扩展,才能见识到"你代码的好";在这方面,我希望大家能够"笨一些",多花些时间在这些事情上; 首先,大家一定要认清:"我做好工作,不是为了公司,而是为了自己";千万不要抱着"给多少工资,出多少力"的想法; 代码的复用性、扩展性,不是看几本书就能提高的,需要长期的实战积累; 你做的这些工作,领导会看在眼里的;如果真遇到了忽视代码、轻视开发的领导,把东西学会了,跳槽就好了。 除了一门心思敲代码,还有很多重要的事情要注意: 沟通能力、表达能力、演讲能力,总之就是要"会说话"; PPT能力,很多程序员对年中、年终述职嗤之以鼻,建议大家千万要重视起来,有时候大领导不一定知道你的工作内容和成果,这真的是一个很好的机会展示自己。 多和直属领导交流,千万不要等着领导找你;可以定期主动汇报一下最近的工作,不用很正式,时不时地找领导聊几句:最近做了什么,有什么成果,遇到什么问题... 如果遇到问题,要拿着解决方案去找领导,方案A or 方案B,让领导做选择题;如果没有解决方案,要说自己的思路;总之,要证明自己思考过; 进一个从0到1的项目,更容易出成绩,如果有机会进新项目的话,一定要把握住机会。 我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。 在我看来,大多数程序员是属于宅男类型,一天到晚编码,特深奥。但总会有所差别,我觉得优秀的程序员,除了在编码上能力超群以外,他们不会像普通的程序员一样疯狂地找插件,类库和框架,而是更在学习钻研、吃苦耐劳、精益求精、态度谦虚上做的更好。 就在最近一两年,仿佛雨后春笋一般,身边开始涌现出很多年薪百万的程序员朋友,清一色集中在阿里、腾讯、京东、头条这些公司。其中有一个程序员朋友对我说:"技术大牛是怎么来的,你绝对想不到。" 出于好奇,我开始了解了这群特别的程序员,他们的工作总是和人工智能、IE工业大脑、大数据这些字眼挂钩,充满了高大上的感觉,没想到朋友口中的程序员,居然还亲自养猪、到深山里搞研究、在车间写代码,太接地气了。 其实这几年,ET工业大脑已经是大热门,阿里云让程序员进入工厂、实地考察交流,将人工智能和大数据技术嫁接到生产线,帮助企业实现生产流、数据流与控制流能协作,提升产能,实现工业智造,也不是稀罕事儿了。 在这些程序员之中,不仅有海归博士、高学历90后,还有来自金融界、咨询公司的跨界人士。他们可以除了帮中策橡胶将良品率提升了3%-5%,让天合光能电池片A品率提升7%,营收增值超过2000万;还提升了京信通信产品调试定标工序35%的生产效率,让迪森热能的锅炉健康能提前6-12小时发出预警...... 普通公司的程序员可做不到。 在我看来,这些看似不善言辞的优秀程序员,绝不像普通的程序员一样码字交任务,他们既能爬8米高的锅炉看看运作流程,也能不怕碱中毒做试验,用数据优化企业工作流程、提升效率及产能,背后靠的除了能吃苦、能钻研、能学习的个人能力,还有受到了阿里云强大的感召力,才能得到我们看起来不可能达到的成绩。 作为普通人,也由衷感谢这些程序员用每一行代码改变了世界。 我带软件软件开发团队多年,接触过不少程序员,其中有一些非常优秀的程序员,简单的总结一下,这些优秀的程序员往往具备以下特征: 第一:健全的知识结构。 程序员是一个对基础知识结构要求比较高的工作岗位,健全的知识结构能够充分的体现在工作能力上,所以对于普通程序员来说,要想成为优秀的程序员就一定要从健全自身的知识结构开始,尤其是基础内容,包括数学、计算机操作系统、计算机网络、算法设计等。 第二:较强的学习能力。 学习能力较强是优秀程序员的重要特征之一,能根据不同的项目采用不同的解决方案,而且能够紧跟技术发展的脚步,这些都需要较强的学习能力。学习会伴随着程序员整个职业生涯,学习能力往往决定了程序员能够达到的高度。 第三:较强的理解能力。 理解能力体现在很多方面,简单的说就是能把握住问题的关键部分,在研发一个产品的过程中,能够把握住产品的关键所在,不被旁枝错节所影响,这对程序员来说是一个较大的挑战。 第四:较强的沟通能力。 优秀的程序员往往能进行有效的沟通,简单的说就是有结果的沟通,沟通一定要达成一个共识,这是沟通的基本原则。优秀的程序员往往具备进行有效沟通的能力,问题往往都会得到圆满的解决。 第五:强烈的责任心。 责任心是职业素养的重要体现,优秀的程序员往往都具备强烈的责任心,把软件产品看成是一件艺术品,不断的进行打磨进而追求一种完美。所以,很多人也把程序员看成是艺术家。 第六:有团队合作意识。 优秀的程序员不仅要具备较强的个人能力,同时也要具备团队合作意识,能够带领团队不断突破难点。 作者简介:中国科学院大学计算机专业研究生导师,从事IT行业多年,研究方向包括动态软件体系结构、大数据、人工智能相关领域,有多年的一线研发经验。欢迎关注作者,欢迎咨询计算机相关问题。 苏联著名的物理学家朗道提出了一种按照水平和贡献划分物理学家的方法,被称为物理学家的等级:物理学家可以分为五个等级,第一级最高,第五级最低,每一级之间能力和贡献相差十倍。 吴军博士仿照朗道的理论,将工程师划分为了五个等级:第五级:能独立解决问题,完成工程工作;第四级:能指导和带领其他人一同完成更有影响力的工作;第三级:能独立设计和实现产品,并且在市场上获得成功;第二级:能设计和实现别人不能做出的产品,也就是说他的作用很难取代;第一级:开创一个产业。 下面我们就按照这个标准来看看各个级别的程序员之间有什么差别: 一个合格的工程师至少是五级工程师,对于计算机专业的学生,毕业后经过一段时间的锻炼,能够熟练应用代码知识解决问题,独立完成所分配的工作,而不需要他人指导,就算是一个合格的五级程序员了。 第四级的工程师需要有领导能力和在工程上把大问题化解为小问题的能力。他们能够寻找出实现比较大的目标的道路,在现有的条件下考虑好和坏的解决方案。在软件开发环节,第四级程序员需要考虑用户需求的特点、平台的选择、不同方案的效率和人员投入等多种因素,并根据公司能提供的现实条件选择最合适的方案。 第三级的工程师就应该能够独立带领人做出一个为公司挣得利润的产品了。第三级的工程师,本身也必须是一个非常好的产品经理。 第三级程序员除了要具备上述两个等级的能力外,还必须具备对市场的判断和营销能力。除了要考虑一个产品最佳的实现方案,还必须能够判断这个产品是否被市场需要,是否能为公司带来利润。 第二级是能够做出先前没有的东西的人,世界因为他们多少有点不同。比如,Google云计算的发明人迪恩(Jeff Dean),他和他的搭档盖莫沃特一起开创了云计算时代。迪恩等人发明了GFS文件系统(Google File System),让一个大文件能够分布地存储到成百上千台服务器中,解决了大量数据存储效率低的问题。我们熟知的AlphaGo背后的Google深度学习算法也是迪恩发明的。 第一级是开创一个产业的人。众所周知,计算机的出现大大促进了科学技术和社会生活的进步。冯·诺依曼对人类的最大贡献就是对计算机科学、计算机技术和数值分析的开拓性工作。计算机的逻辑图式,现代计算机中存储、速度、基本指令的选取以及线路之间相互作用的设计都受到了冯诺依曼思想的影响;他还积极参与了推广应用计算机的工作,对如何编制程序及搞数值计算都作出了杰出的贡献。 按照这个等级划分原则,吴军博士将自己定位为2.5级,那么2.5级是什么样的一个概念呢?吴军曾任职于Google公司,和同事一同开创了搜索反作弊研究领域,成立了中、日、韩文产品部门,设计了Google中、日、韩文搜索算法,领导了Google自然语言分析器、自动问答等研究型项目。除此之外,他也是著名的学者,风险投资人,著有《数学之美》、《浪潮之巅》、《文明之光》等畅销著作,并多次获得包括文津奖、中国好书奖、中华优秀出版物在内的国家级图书大奖。 各位程序员也可以分析一下自己目前正处在哪一个等级,离下一个等级还有多远。有了清晰的努力方向,距离目标的实现也就不远了。 由于本人从事互联网行业,平时接触到的程序员比较多,不仅有本公司的同事,还有一些合作公司的朋友。同样是程序员,有的特别优秀,有的很平庸,他们之间的差距有上百万吧。现在社会上有些声音说,程序员的门槛很低,随随便便上个培训班就能入行。我觉得,这种说法就是对大牛程序员的侮辱。 按照个人能力,我们可以把程序员大致分为以下几类(能力从低到高排名): 1)会基本的语法,能写一般的功能函数,对于复杂的逻辑,就有点 hold 不住了,要么性能太差,要么可读性差。遇到一些不常用的排序算法,比如归并等,就要去网上 copy 了。入行较早,可能也没刷过 leetcode,基本的数据结构和算法能力都没有,一招 if else / for 走天下。 2)新时代的码农,刷过无数的算法题,校招笔试信手拈来。但是,对如何写出优雅的代码以及高性能的代码缺少经验。 3)这一档次的程序员算法能力合格,编码时能够遵循编码规范,对计算机硬件、操作系统和编译原理有一定研究,对性能有较深的理解。而且掌握软件工程的构建原理,理解重构和设计模式。 4)这类程序员在 3)的基础上多了一项开源能力,阅读过一定量的开源代码,能够把开源框架引入到项目工程里。而且,能够从软件工程可扩展性、后期好维护等角度全局考虑问题。 5)最牛逼的程序员,也就是所谓的架构师了。在一家公司工作年限很长,亲眼目睹一个大型软件产品从诞生到成熟(包括优化、支持高并发、可运维)的整个过程,而且负责过关键模块的设计和编码。对该产品中所用到的先进框架及技术了解透彻。 最后:一个程序员会多种编程语言不定牛逼,但如果他精通一门语言,注意是精通,那么他真的很厉害。 优秀的程序员与普通的程序员之间的差别,体现在二者的态度、代码习惯、学习、总结以及思考等多方面。 1.一个优秀的程序员,对待任务态度十分谨慎。在接到需求时,会多次对需求进行确认,并多次确认需要达成的结果,而并不是无言地听着需求毫无反馈;其次他们的思维十分细致,在对需求进行开发的时候,会站在客户的角度进行思考,不是单纯为了实现功能而实现功能,更多的是为了满足客户的需求,而不是只闷头开发功能,最后在交付的时候再对开发的产品进行反复修改、调试;再者他们的思路十分清晰,他们很明确地知道如果想要实现所需的功能,应该进行哪些步骤,每一步需要完成什么操作,接下来的步骤会实现什么,目光长远,而不是走一步看一步,只能看到脚下。 2.一个优秀的程序员,代码的编写有良好习惯,所写的代码少而精炼,他的代码读起来会感到赏心悦目;他的代码并不是单纯只让计算机去执行的代码,同时也是便于让他人进行阅读以及理解的代码。 3.一个优秀的程序员,总是勤于学习。科技发展十分迅速,如果不能让自己掌握新知识的脚步紧跟科技的发展,就会被时代无情抛弃。 4.一个优秀的程序员,总是勤于对自身的知识进行总结,并形成文档,一篇文档不仅仅可以帮助程序员进行知识回顾,也可以帮助程序员梳理所掌握的知识,同时如果文档发布到微信公众号、今日头条等对外营销平台上,可以让外部了解公司情况,提高公司知名度。 5.一个优秀的程序员,在出现问题之后,会对问题出现的原因进行思考,而不是出现问题就盲目去猜,去尝试各种方法对问题进行解决(并不是所有非优秀程序员都是通过盲目尝试去解决问题),一个优秀的程序员在解决问题之后,会对问题进行扩展思考,思考做其他的事情时是不是也会出现该问题。 总体来说,优秀的程序员接到需求的时候,总是会比普通的程序员思考更多,在编写代码的时候,总是会注意代码编写的美观度以及对于代码的观看者的友好度,也会不断提升他们个人的综合素质,不断学习新的知识,紧跟时代脚步。 数通畅联专注于企业IT架构、SOA综合集成、数据治理分析领域,感谢您的阅读与关注。 我们从程序员的日常工作来简单地聊一下吧:1、任务(需求)来临的时候: 优秀程序员:跟对方(产品经理)不断的确认注意事项以及想到达到的效果,提前规避一些问题; 普通程序员:表示知道,然后看着需求列表,直接开始埋头敲代码。2、开始写代码时: 优秀程序员:脑海中思维清晰,他的脑海是有一系列详细步骤的,按部就班,一步步向前; 普通程序员:写代码的时候只管敲,出现了什么问题另说。3、改BUG时: 优秀程序员:遇见bug的时候,会详细的研究问题出在哪,在解决之后,还会思考是否存在着相似的问题; 普通程序员:基本解决BUG就靠运气了。4、写注释时: 优秀程序员:优秀程序员的代码,看起来是非常赏心悦目的,而且会有给代码加上注释的良好习惯,理解起来也非常容易; 普通程序员:普通程序员的代码,基本上写的时候只要自己看的懂就行了,而且还很多不写注释,可能过几个月,自己也不认识了。 希望以上的回答对你有帮助! 作为一个工作十几年的老程序员,感觉程序员与其他行业从业人员中不同的地方在于,一个差程序员不仅仅不能帮忙,还可能会帮很大的倒忙的。所以普通程序员与优秀程序员真的会有几十倍的效率差异,一点都不奇怪! 其他行业,如建筑行业,如果你技术不行,不懂电焊,不会弯钢筋,不会开塔吊,那你可以搬搬砖,扫扫地。 但是在软件开发领域,一个不合格的程序员开发的程序可能会给你埋一个很大的雷。然后有可能会拉上一个团队的力量来挖这个雷。你说这是不是帮倒忙。 普通程序员自然要比帮倒忙的差程序员要好很多,但是跟优秀程序员还是有很大差别的。这个差别最终是体现在开发效率上。 除了开发效率外,另外一个就是开发质量了。这就好比开三只小猪盖房子的故事,一个是草房子,一个是木房子,一个是砖房子。虽然外形都差不多,实现的功能也差不多,但质量差别确实巨大的。程序员开发的软件也是如此,虽然实现功能相同,但普通程序开发的程序在某些非常规流程可能会无法运行,而优秀程序员更能考虑各种异常场景。 当然,我们这里只是列举了几个例子。实际情况还要复杂的多。否则也就不会出现有些程序员年薪百万,而有些连10万都到不了了。 作为一个工作多年的程序员,在工作中也接触了很多大牛,也接触过很多菜鸟程序员,当然大部分都是接触的一般的普通程序员,通过对比我发现,我感觉优秀程序员和一般程序员的差别有以下几种能力。持续的学习力 程序员都知道,我们这个行业是一个快速发展的行业,技术更新迭代的速度很快,所以,如果不想被时代抛下,不想落伍,就必须保持一个持续的学习能力,能够不断的去研究新技术,学习新技术,尝试新技术。 优秀的程序员大部分都是对编程痴迷,执着的一批人,他们对编程的兴趣非常浓厚,所以绝对是喜欢学习,持续学习的一批人。而大部分普通的程序员,一般学会了某种技术之后,能够满足工作需要就行,不会主动的去努力学习,除非快被时代淘汰的时候,被倒逼着去学习。 优秀的程序员总会主动持续的去学习,而普通的程序员都是被倒逼着去学习的。 解决问题的能力 解决问题的能力,最能提现一个程序员之间的差别,是否优秀与否。一个优秀的程序员,经验丰富,定位问题的能力快速准确,debug 能力强,有技巧,有经验,而普通的程序员可能受限于经验的缘故,解决bug的能力,比较差,比较慢,很多时候,都是靠着搜索引擎来解决的。 研究能力 见识多了大牛之后,你会发现,他们做事情,遇到问题,总是会较真的,必须知道知其人知其所以然,喜欢研究原理性的东西,必须搞懂这其中的原理,可以做到举一反三,搞出新东西来。 而普通的程序员,一般就比较容易满足,遇到问题,找到解决方法之后,知道怎么用就行了,不太会去深究其中的一些原理或者根本性的问题,反正我知道这么用,就不会用问题,容易满足。 我感觉这是普通程序员和优秀程序员之间的差别,所以,我们今后如果从事这个行业,就应该必须保持主动的持续学习力,解决问题的能力以及研究能力。 最明显的地方就是发型数量