你是否发现,在我们身边的那些优秀程序员身上总是能找到一些共同的特质,这些特质并非与生俱来,但却逐渐在他们身上留下深深的烙印,这也使得他们变得与众不同,更成为我们心目中的佼佼者。
至少深入理解一门编程语言
学习编程和学驾驶很像,你很容易就能学会驾驶,比如,经过一个月的驾校培训,你就能获得驾照,但要真正成为一名优秀的司机,却必须经过长时间的驾驶实践才行,这将帮助你在头脑中形成一套完整意识体系以应对驾驶中所遇到的不同情况。编程也是一样,当程序员们作出那些优秀的程序设计时,看似自然,但它的背后却是程序设计者们经过长时间编程实践之后所构建起来的编程思维。
优秀的程序员不仅熟练掌握一门编程语言的语法和语义,他们还会
-
掌握这门语言的使用哲学,包括那些***实践、设计模式以及它们背后所蕴含的原则
-
深入理解语言的特性,每一门语言都有各自的特性,而很多新的特性还会被不断加入到语言的***版本之中,充分了解这些特性,能够帮助程序员更准确、高效地使用它们
-
了解语言的局限,任何程序语言都会有其局限性,这会让我们在解决某些问题时产生麻烦,我们需要了解这些限制,并知道如何使用一些方法或技巧去绕过这些限制并解决问题。
-
理解语言的缺陷,有些语言在设计之初就存在一些先天不足,比如JAVA语言中的日期处理,那些原始数据类型,可能会给你带来一些疑惑,了解这些缺陷,并尽可能在编程中避免涉及这些缺陷,会让你的程序在日后更易于维护。
-
了解语言的未来,有些编程语言如新生儿般茁壮成长,如Swift、Go,有些则如青壮年般看上去年富力强,比如Java、PHP、Python,而有些则已进入暮年,不再受到关注,比如VB、Pascal。优秀的程序员能很快掌握一门新的编程语言,但只有了解语言的发展方向,才能让你更有信心地去应对未来。
看上去有些“傻”
听起来或许有些可笑,但那些出色的程序员往往容易给人留下“傻”的印象。他们对某些事物的看法可能显得单纯而幼稚,他们的待人接物经常会闹出笑话。但这些并不会阻碍他们成为一名优秀的程序员,因为“傻”——知道自己不够聪明,反而能使他们变得更加强大。
-
不会停止学习的脚步:认为自己不够聪明才会通过不断学习去提高自己。而一旦你停止了学习的脚步,你将无法得到那些能够让你变得更加优秀的方法和技能。
-
使得他们在工作中变得更加严谨:他们会花更多时间review自己的代码,进行测试以保证交付的质量。虽然过程可能并不轻松,但他们却总是能交出令人满意的结果,这也让大家对他们充满信任。
-
帮助他们获得更好的想法:在软件开发领域,那些***的解决方案,往往需要你通过深入思考并探索尽可能多的可行方案后才能获得。这意味着你必须具有开放的思维,而不是那些聪明人的自以为是。
他们都是现实主义者
相信每个人都有一颗追求***的心,程序员也不例外。然而在软件开发中***并不存在,所谓的***只是想象中的一个瞬间状态,而它是无法达到或者即使达到也极易被摧毁的。任何一段新的代码,一个新的功能中所存在的缺陷都可能将这种***的状态打破,而为了达到***所付出的代价更是我们所无法承受的。那些成熟的程序员更加现实,他们关注于如何高效地解决问题,并在此基础上给用户带来好的感受。
优秀的程序员懂得平衡,他们理解时间、人员等资源都是受限的,因此他们会选择最简明有效的方法去实现需求或解决问题。而非为了不必要的完善和未知的将来,把一切想得过于***,反而增加了系统的开发和维护成本。他们不会把代码写得过于复杂,因为他们知道团队中大部分的程序员都处于中等水平,过于复杂的代码会让他们产生困惑。优秀的程序员也深知完成即是价值的道理,他们知道从来没有绝对的对与错,与其长时间的关在会议室里,去讨论或设想产品,倒不如尝试用较小的代价去实现出某一个功能或产品,然后通过用户的实际使用去证明它,然后在反复的迭代中不断完善。他们尊重流程,但会灵活应用。每个公司或团队都会有自己定义的开发、测试、发布流程,优秀的程序员们尊重这些流程,但在某些时候他们也会对流程中阻碍自己效率的部分作适当的裁剪。
优秀的程序员都很现实,这使得他们在不同的环境、团队、项目中都能快速获得成功。他们所开发出的系统往往处于“较好”的状态之下,它并不***,但却非常稳定。
从自己的失败中学习
作为程序员,你不可能总是对的,你或许会错误地选择了某个技术或框架,你或许错误理解了用户提出的需求。但不经过这些失败,你可能永远无法得到那些正确的方法。
诚实地面对自己的错误非常重要,这意味着你或者你的同伴能够及时地去修复错误,而这对你、对团队、对项目都是最有益的。而每一次的失败也会成为一次自我提升的良机,造成失败的原因是什么?如何有效地避免失败?通过及时反思,并果断采取措施,那些失败将成为你获得进步的***途径。
然而,承认失败往往需要极大的勇气,特别是在一些软件公司,他们营造了一些不良的文化,当产品出现问题时总是对用户掩盖搪塞,并想方设法蒙混过关。这对你个人无益,甚至可能因为延误了问题的***解决时机,而导致更惨重的失败。如果你希望变得更加优秀,那你必须具备直面失败的勇气,并学会从每一次失败中获得进步。
很懒却又很高效
那些优秀的程序员有时看上去很懒,他们会在上班时间做那些与工作毫无关系的事情,比如在纸上随意地乱涂乱画,长时间坐在那里发呆,甚至玩手机。但一旦他们进入编程状态,你又会发现他们变得像打字员般,指尖飞舞,瞬间完成他们的工作。
优秀的程序员非常珍视自己的时间,他们会利用一切手段提高效率:
-
常年的编程工作使他们都能熟练操作键盘,往往从一个程序员的打字速度上就能判断他是否优秀。
-
他们能够熟练地使用IDE,他们不依赖菜单,而是使用快捷键来操控代码,从查找文件,文本编辑到格式化代码,文本替换都尽可能使用快捷键,这使得他们的开发工作更加连贯,也更高效。
-
他们善于使用或发明工具,他们寻找一切能提高效率的工具,必要时他们还自己编写自动化脚本、发明新的工具,从而彻底抛开那些恼人的重复劳动或机械性工作。
编程的过程是一个深入思考的过程,而非简单的不断敲出代码。那些看上去很懒的优秀程序员,他们的思维却可能一刻不停地在运转着,这也是他们总是能够给我们带来惊喜的原因。
善于发现并改造轮子
今天几乎每个程序员都知道不要重复发明轮子的道理,但问题往往是他们无法找到那个需要的轮子,或者他们无法很好地使用他们。
优秀的程序员知道如何找到他们想要的轮子:
-
他们会用几个与待解决问题相关的关键字在互联网上进行搜索。他们不仅使用国内的搜索引擎还会想方设法借助Google、Bing等国外搜索引擎,因为很多解决方法、意见、建议往往会出现在国外的技术论坛中。
-
他们会利用社交网络进行搜索,因为那里往往包含着***的信息,相比传统互联网搜索,你往往会得到那些更具时效性的解答。
-
他们善于提问,互联网上很少有人认识你,所以你完全不必害羞,在Stackoverflow等社群提出你的问题,你很快就会获得热心人的回复。当然对任何回复都保持友好和善意也很重要,否则没人会愿意帮助你。
优秀的程序员善于组合和改造轮子:
虽然我们比以往任何时候都更容易得到轮子,但如何用好它们却是另一个学问。我们往往需要一些技巧将几个轮子组合在一起使用,必要时还需要对它们进行一些改造。优秀的程序员往往能通过阅读相关的文档、API以及代码,快速地判断一种技术、框架、工具是否适合自己的需要。并且凭借扎实的技术功力,他们还能基于这些轮子,改造出更强大、更适合自己需要的轮子。
并行工作,有效利用时间
效率可能是优秀程序员与那些普通程序员之间***的区别,优秀的程序员总能更快、更好地完成布置给他们的任务。这背后当然有技术熟练度方面的原因,但我看到的另一个重要原因是,他们更善于将工作进行切分,并充分利用时间并行地去完成他们。
程序员每天都会参与很多活动,比如参加需求讨论会议,和其他开发者讨论设计方案,大量的阅读学习,当然还有编码。很多时候,我们会按照别人的意愿,去安排自己的工作,但这对我们来说可能并不是最有效的工作方式。工作中充满了选择,你不可能一下子完成所有的事情,在开始之前想一想如何把时间最有效地利用起来对你来说非常重要。
优秀的程序员非常善于多线程工作,他们能够如项目经理一般,拆分并安排好自己的每一项工作。如果你长时间做一件事,很容易会觉得疲劳,但把几件事切分成更小的任务后,交错并行地去完成它们,你便能更轻松地完成它们。就像我们在生活中,会利用坐地铁,等公交的时间,拿出手机来获得咨询一样。优秀的程序员能将所有的可支配的时间碎片化,利用这些时间片段,他们阅读、学习、开发、做个人项目......他们并不比任何人有更多的时间,只是他们更会利用时间。
具备不错的软技能
你可能是一个代码高手,但这并不足以使你成为一个优秀的程序员,因为优秀往往是他人对你的评价,而你的老板、客户可能都不擅长或根本不懂编程,他们往往并不会给一个只懂得编程的员工以很高的评价。当然,我们不可能去责备一个程序员过于钻研技术,因为技术发展得太快,他们需要不断学习才能跟上技术的发展脚步。但程序员们仍然不应忽视那些对他们的发展同样重要的软技能。优秀的程序员往往需要具备:
-
一定的语言表达能力,这样才能向他人准确而清晰地表达你的设计或想法
-
学会倾听,这样才能获得他人的优秀想法或意见,帮助你取得进步
-
有足够的信心成为一个***,尽管可能只是一个2,3人的团队,但那是一个很好的开始
-
指导他人的能力,教授方法和思想,而不仅仅局限于技术本身
-
持续学习的能力,你需要不断进步,否则即使你曾经优秀,也会很难维持
-
谦逊的态度会让你更像是一个大师
-
尊重每一个人的同时,你也将会迎得他人的尊重
-
敢于承担责任,机遇往往就会随之而来
优秀的程序员不仅具备优秀的技术能力,他们也往往拥有这些软技能。在我所看到的所有项目中,很少会因为技术原因导致项目的失败,而大部分的失败往往来自于程序员们软技能方面缺失所导致的团队协作问题。反而是那些被认为水平一般的团队,却经常能依靠着团队成员间的通力协作创造出让人惊讶的成果来。
身边有一些优秀的伙伴
我认为程序员会向着个人化、多样性的方向发展。越来越多的个人程序员和更小的开发团队将会产生,在不同领域内,他们借助技术的进步与工具的发展,能做出以前只有较大规模团队才能开发出的优秀产品来。尽管如此,我仍然相信那些优秀的程序员并不会成为一匹独狼,相反的,他们身边总是会伴随一批同样优秀的伙伴。
回想我们的程序员生涯,当我们还是一个菜鸟时,身边总会出现一些导师,他们可能是你的团队Leader,或负责带你的资深程序员,那时我们那些编程时的错误和缺点总是被无情地暴露在他们面前,经过他们的指正或批评,我们从不断修正自己的错误中获得了成长。随着我们技能的不断增长,在不同时期,因为不同的兴趣,我们身边的伙伴也在不断变化,他们成了团队中与你能力相当的同事,或是你所做业余项目中的志同道合者,又或者是你参与的开源项目中那些不同领域的专家,他们都成为了一名优秀程序员身边不可或缺的优秀伙伴。这让我想到结对编程中关于轮转(Rotate)原则——并非固定两人一组,而是根据任务的不同,不断轮换搭档。任何时候,你都需要那些优秀的伙伴不断带来启发,给予指导,一起去完成不同目标,更重要的还有坦诚地指正你的问题。与优秀者同行,你也将变得更加优秀。
对生活充满热情
有很多因素会使一名程序员走向平庸,而最最直接的便是失去对编程热情和兴趣。当一名程序员不再能够感受编程所能带来的乐趣时,编程对他来说,只是一项不得不去完成的工作,而他也将失去继续学习的动力,无法再与优秀沾边了。
我看到的那些优秀的程序员,总是对编程充满着热情,每次完成一个新的功能,解决一个有难度的问题,甚至修复一个不易被发现的缺陷都能让他们兴奋不已,而这些又会成为他们不断去提升技能,学习新技能的动力。他们在不断突破自己的极限中,并从中体会编程所带来的乐趣。
同时,优秀的程序员们也懂得生活,他们对那些新鲜事物总是充满好奇,乐于尝试,他们也会有各自不同的兴趣爱好,摄影、写作、旅行,亦或是游戏、追剧,他们总能很好地掌控这些兴趣爱好与他们所热爱的编程之间的关系。他们会每天有规律地完成如阅读、学习、运维自己的个人项目之后,投入到自己的其他兴趣爱好之中,他们很少熬夜,这保证了他们每天都能迎来一个新鲜的开始。他们能够掌控生活,而不是反过来被生活所控制。
优秀程序员们的身上一定还有着更多我们所未见的特质,但归根结底,还是内心深处那份对于编程的热爱与执着,推动着他们去不断获得那些天赋与才能吧......
文/技匠(简书签约作者)
原文链接:http://www.jianshu.com/p/7f646acd0c2d