一个优秀的程序员应该具备什么呢?
一个优秀的程序员应该具备什么呢?
-----
网友解答:
-----
1、哲人般的深度思考能力。
2、诗人般的coding艺术追求。
3、学者般深厚的理论修养。
4、名医般深厚的专业功底。
5、名律般逻辑分析推理能力。
6、社会活动家般的沟通协调能力。
7、工人般的搬砖能力。能像农民工一样,吃苦耐劳。
8、以上的文档扯淡能力。
9、都不及会写300个动态规划算法的实际能力
[大笑]
-----
网友解答:
-----
程序员的水平高低,不是靠语言或外在表现就能看出来的,不是看他会多少技术、参加过多少项目、写了多少博客,而是看他在实际业务场景中解决问题的能力。
尤其是面对一些特别复杂的问题,或在高强度、高压工作状态下解决问题的能力与态度。
技术可以通过学习掌握,但是解决问题、定位问题的能力却不是一蹴而就。
那么,要想成为一个合格的程序员,你还需要具备哪些能力呢?
能高效率写出扩展性、可读性强的代码
会写出满足需求的代码,早就不是评判程序员水平的标准了。
代码编写既要满足业务需求,同时还要考虑后续的软件维护,一个优秀的程序员,会致力于写出更简单、更效率、可读性强、扩展性强的程序代码。
作为一名优秀的程序员,你需要经常性地进行代码优化,把自己编写的代码当成是一件艺术品,精益求精。如果真的有让你忍无可忍的代码,麻烦请重构。
有一个临危不乱的良好心态
如果你碰到项目着急上线,发布时出现问题?
业务高峰时段,系统突然宕机了?
业务催、运营催、用户催、老板催!
各种形态的bug,各种着急的心情,背后无数双眼睛盯得内心慌慌......
你怎么应对?
这些都是程序员需要面对的日常。但不同的程序员,在解决问题的方法、效率、质量等方面,却各有千秋。
一个经验丰富的程序员,能够扛住各方压力,在复杂条件下找到核心问题,通过抽丝剥茧的分析来找到产生问题的原因,并快速进行应对处理,事后及时复盘总结,减少同类问题出现的概率。
时刻保持终身学习的热情
在 IT 行业,技术迅速转变、业务要求不断变化,这使得重塑职业道路成为一个关乎生存的问题。
随之互联网的发展,越来越多的人涌入程序员这个赛道,竞争日益激烈,加之新技术层出不穷,更新迭代快,程序员所使用的语言、框架、模式都会发生天翻地覆的变化。如果不主动学习,有可能很快就会被落伍淘汰。
避免自己在职场上走入死胡同,最稳妥的办法就是欣然接受新技术,从不停止学习。
要想成为一个优秀的程序员,基础一定要打好,这就需要有优秀的老师带你,并且做好努力付出的准备;其次,要有良好的项目实践经验,有基础有实践,能力基本不会太差!
-----
网友解答:
-----
程序员=打字员+工匠+ 作家
有人说程序员是像带安全帽的工程师形象,也有人说像前端工程师一样有文艺气息。 其实一个优秀的程序员必须有两者合一的能力,说白了,必须文科和理科都要好。
程序员是输入程序的工作。首先是个编辑editor,而编辑首先是个打字员typer。 那么对于文本的要求和格式的编写必须严谨优雅,不能有Miss,很有可能成为Bug。
打字员只是誊写,程序员需要像作家一样冥思苦想,设计框架结构,处理细节。这需要很深的功底。
只是程序员的"文学性"是用程序文法和词法实现的,同样具有"美感"。程序员的艺术素养可以捕捉和构建出美的程序。
最后,程序员需要像工匠一样,探究未知的状况,严谨科学验证,逻辑严密,需要懂得数学论证。
当然这是我自己的理解。推荐一本书《黑客与画家》更能体会之间的奇妙融合。
-----
网友解答:
-----
一名程序员优秀的程序员,需要具备多方面能力
耐心:写代码和调试极其令人沮丧。要想做好,你得保持冷静,至少冷静到能够保持清晰的头脑。
精力:处理棘手问题,编写大量代码容易使得身心俱疲。最重要的是要有“坐能量(tushie power)”。也就是屁股不离座直到工作完成的能力。
逻辑思维:这条看似明显,其实不然。一般的程序员在碰到棘手问题的时候一般是靠猜来解决的。运气好可能猜得中。但运气不好就难搞了。问题是猜并不能有效缩小可能原因的范围。好的程序员会提出猜想然后进行测试,从而排除掉一堆的可能性。比方说,屏蔽一段代码,看看问题是不是还出现。
不可自负:编程不是你自己的事。这跟你的团队、代码、客户、利益攸关者等等都有关系。(eShare CEO Henry Ward 说自己永远都不会要自负的人。)
自学能力:当今互联网发展越来越快,技术的更新也非常快,程序员要面临着随时学习新知识的准备,当一个新技术出现时,你是否能快速的掌握,否则的话就容易被技术所淘汰。
-----
网友解答:
-----
对于一个技术人员来说,编程技能毋庸置疑是很重要的。
但是,除了基本的编程开发能力,其他方面的能力也是体现一个程序员的能力的很重要因素。
比如,问题排查能力、线上运维能力、项目管理能力、协调沟通能力等。
类开发技能
第一类,并不是纯coding技能,但是也和开发相关,称之为类开发技能。
Linux系统很多人的开发机器是windows,所以平时也基本都是图形化开发界面。但是,这并不意味着你就不需要基本的Linux技巧。
因为,你开发出来的应用可能部署在一台Linux机器上,很多时候你要和这台线上的Linux服务器打交道,所以,Linux系统的安装、开发环境的搭建、Linux常用命令以及Linux环境下项目的部署启动和调试等都是必备技能。
否则,一旦线上出点什么问题,你就会束手无策了。
单元测试单元测试是很重要的,而且,好的单元测试可以帮助我们节省很多开发时间。单元测试是保证软件可以更好的持续集成和持续交付的一个基本前提。
单元测试也涉及到很多技巧等,比如使用Mock进行单测、使用内存数据库进行单测等。
一个开发人员,要有写单测的习惯,也要掌握基本的单测写法技巧。这样可以尽早的发现问题。
版本管理我相信基本上所有的公司的代码都会通过版本管理工具进行托管的,不管是Git还是SVN。
而且,现在很多技术都通过GitHub进行开源和共建的,版本管理工具的使用也是一个Java开发必备的基本技能。
版本管理也有很多学问在的,比如到底什么时候应该提交、提交的时候 Commit message 应该如何书写,如何解决代码冲突等都需要熟练掌握的。
构建工具和版本管理一样,企业级开发的依赖管理也不再是那种原始的进行Jar包的导入导出。而是借助于像maven或者gradle等工具。
构建工具的使用同样重要,而且一个合格的开发人员,要掌握如何进行依赖冲突的检查、如何进行依赖仲裁等。
代码调试有人调侃程序员,一半的时间在写bug,另外一半的时间在debug。这句话听起来挺扎心的,但是也恰恰说明了debug的重要性。
虽然说程序员花费一半的时间在写bug是有点过分的,但是,任何程序员的代码也不可能一气呵成,越大型的项目bug可能就会越多,在线下开发的时候,debug是最有效的问题发现和解决的手段。
代码调试其实比较简单,只要设置好端点,跟着程序一步一步的执行看效果就好了。只要学会运用IDE提供的工具就可以了。
问题排查与解决关于问题排查,这个能力真的是非常非常重要的。
发生问题的时候,就是检验程序员能力的时候。这是最能区分程序员的水平的技能了。一个问题往往可能会涉及到很多个方面的知识。
阿里有一个神级人物,花名多隆。在淘宝初期,不管遇到什么问题,他基本都能解决。他之所以被称之为神,就是因为他的问题排查和解决能力。如果你能在两天内解决一个组两周都没解决的问题,那么你也会被称之为神。
很多时候,解决问题并不难,难的是定位问题。这会涉及到很多知识,知识储备很重要,但是,在知识储备还不够的情况下,至少可以从以下几个方面来提升自己的能力。
1、日志的查看
2、分析Java的堆栈信息
3、集群监控指标的查看
非开发技能
还有一类技能,可能就和开发完全没有关系的,称之为非开发技能。这些技能往往决定着一个开发人员到底能够走多高。
目标导向我把目标导向称之为一种能力,是一种一个人应该具备的基本能力。而且,也是可以锻炼和培养出来的。
目标导向型的人,就是做事之前先明确目标,再寻找实现目标的方法,最后动用一切可以利用的资源通过各种方法来实现目标。
目标导向型的人,目标是明确的。
目标明确的人,做事的时候,不会轻易动摇或者放弃,为了目标能克服困难坚持到最后。
目标明确的人,做事的时候,会去思考、尝试实现目标的各种方法。
目标明确的人,做事的时候,会去发现、创造、借用一切能够实现目标的资源。
不断给自己设定目标,做一个目标导向的程序员吧。如果,你非要把目标导向理解为KPI导向也可以。主要是有目标,为之而努力,我觉得就是OK的。
时间管理对于任何人来说,时间管理都是很重要的,对于程序员来说,尤其重要,因为我们可支配的时间并不多。
如何正确的管理自己的时间,是一门很深的学问。有些人加班加点,甚至996的工作方式。但是最终还是得不到一个好的结果,这很大程度上是由于时间管理的不够好,大部分时间都在“瞎忙”。
很多时候,苦劳在功劳面前会略显沧桑。
一个程序员的一天会有很多事情要忙,在工作上,一天可能排了几个需求评审、设计评审、交互评审、TC评审等,还要排查问题,还要写代码,有的时候还要充当产品、运营、甚至客服的角色。在生活中,还要陪伴家人、充实自己,锻炼身体等。如何安排好自己的时间是十分重要的。
关于时间管理,我有个建议,那就是把自己的手上的事情排列好,一段时间只做一件事。
快速学习在这个技术高速发展的时代,每天都有新技术在推出。一个好的开发人员要保证自己永远不会被淘汰,就需要不断的去学习。
而学习无疑是要花费很多的时间的。那么,快速的学习能力对于一个时间本就不多的程序员来说也是至关重要的。
英语能力首先,我们的日常开发的代码都是基于英文的,目前很多技术也都是外国人发明的。也就是说很多技术刚出来的文档都是英文的。
拿最近最火的区块链举例,不管中本聪是不是日本人,他发布的区块链白皮书也是英文的,英语能力好的人可以马上学习到新的知识,英语能力不好的,可能看到的都是二手翻译资料了。
英语好的技术人员,靠翻译书籍也能赚很多钱。而英语不好的程序员,给变量命名都费劲。
科学上网这一点我觉得对于开发人员来说是至关重要的。就像前面那条英语能力一样。很多资料都是发布在国外的网站上的。
无论是Google、维基百科这些都需要科学上网。而且很多国外的网站,如StackOverflow、GitHub等科学上网也能更快的访问到。
项目管理每一个程序员,都有做PM的那一天,不管负责的是大项目还是小项目。都需要很好的项目管理能力才行。
要知道如何预估风险、如何预估成本、如何保证项目按时上线、如何管理项目团队,这都是有很多学问在的。
任何一点掌握不好,都有可能导致项目风险甚至项目失败。
项目管理这种事情,项目如期发布可能并没有功劳,但是一旦项目delay,那就有罪过了。
不会项目管理的程序员,最多也就是一个高级程序员,无法晋升为专家及以上级别。
协调沟通在一个项目中,除了项目经理角色外,开发人员之间也并不是独立的。很多时候都需要跨团队、跨部门甚至跨公司之间合作。
在项目中,你和其他参与的同学是同一个角色的,大家之间的关系在层级上可以算是平级,那么如何很好的横向管理会很重要了。
为什么很多人解决一件事情很快,有些人却要绕很多弯子。因为有些人懂得协调沟通的技巧,说白了就是出去办事有时候光靠“刷脸”就可以解决问题了。那么,之所以可以“刷脸”,就是因为平时的协调沟通能力强。
理解能力理解能力不好,就不能很好的理解需求。不能很好的理解需求,就可能浪费很多时间。很多时候,PD给的需求文档并不都是合理的,这种情况下,如果开发的理解能力再差一些,无法在需求评审阶段正确的理解需求,那么这个项目的结果可想而知。
理解能力不好,就没办法快速的学习新的知识,同样也要比别人多花费一些时间。同样是学习Java 9的Jigsaw,有些人就能很快的理解模块化的原理,有些人就怎么都想不通。这就是因为理解能力的不同。
表达能力前面说的几项能力,都或多或少的要依赖表达能力。如果表达能力不好,协调沟通肯定出问题,更别提项目管理了。
除了日常工作需要表达能力和别人沟通外,很多公司要写日报、周报或者月报等。表达能力好的就可以很清楚的写明白自己做了什么,有什么贡献,这样领导看的也舒服。工作成果自然不会很差。
还有,就是很多公司的晋升制度是靠答辩的。那么如何很好的把自己过去一段时间的工作成果和收获表达的清楚很大程度上决定着晋升的结果。
还有些时候,开发人员也要参与演讲,无论是团队内部、公司内部还是参与业内会议。表达能力都至关重要。很多时候,别人了解一个人,首先就是通过他的表达能力。
------------------
推荐阅读: