【IT168 编译】《天下无贼》中由葛优饰演的黎叔曾说过一句话:“21世界什么最贵?——人才最贵。”人才对成功来说至关重要,而且人才和天才还是不一样的,天才大部分是要有天赋的,而人才即使你没有天赋,遵照规律发展,通过后天努力也可以达到。
如何才能成为一个顶尖的程序员呢?Java顶尖程序员Lukas Eder和我们分享了伟大程序员应该具备的十大特质,他表示这十大特质并不是伟大程序员所特有的,任何领域的领导者可以说都有这些特质。当然这只是Lukas Eder的一家之言,如果你有不同观点或者其它补充欢迎在下方留言评论。
1.学会提问
在日常的工作和生活当中,我们常常会遇见以下几种人:
完美主义者:当开源工具出现问题时,可能这时程序员通过调试代码找到了问题的真正原因就万事大吉了。但是完美主义者就不会这样,他们往往会重新看待这个问题,重现步骤,并找到潜在的解决办法。
善谈者:这一类人几乎不会正式的提出问题。因为他们很喜欢和大家交流自己的想法,在交谈中他们就会提出自己的疑问,征询大家的意见或者自己主动去找到答案。
代码搬运工:这类人面对问题往往会是这样的反应,“这是一段代码,为什么它会出问题呢?”少年,请不要放弃治疗啊!
经理:这类人由于职业的特殊性,他们往往尊崇时间就是金钱,出现问题一定要在最短的时间内解决。大多数情况下,这种“急行军”式解决问题的方式会忽略掉一些细节,导致问题的解决治标不治本。
抱怨者:这类人也不会提出问题,他们遇到问题就只会抱怨,但是你要知道抱怨其实是无济于事的。
工作学习到如今,相信每一个程序员都明白解决一个问题比书本知识要收获多,所以在日常工作中一定要善于发问,遇到问题要积极解决。
2.学会自我思考
上一条我们讲了如何提问,这一条我们又要讲如何避免提问,你可能会想这是不是自相矛盾呀。其实这并不矛盾,上一条我们是要大家善于发现问题,而这一条我们讲的是发现问题之后,首先要尝试自己解决,而不是寻求他人帮助。
很多人认为遇到问题寻求他人帮助是解决问题最有效的途径。其实不然,如果你去尝试自己解决问题,就会发现这种方式好处不要太多:
首先,你会掌握一种自我学习的方法,请记住,方法永远比知识更重要。自己解决的问题印象更深刻,自己找到的知识更有价值。剔除掉无用的“噪音”,因为每个人对于问题的理解不同以及个人表述的局限,向别人求助时,往往不会准确的获得问题的解决方案。
解决问题不能一味图快,如果短时间内问题不能得到完美解决,那么你可以再给自己一段时间去收集更多的信息,这样往往会得到更好的解决。
通过解决问题来训练自己,从而提出更有价值的问题。
3.欲速则不达
在这个被“快餐文化”充斥的世界,人类想要所有的事情都加速进行,程序也不例外。在现实生活中,程序员为了赶进度,及时上交项目,往往会找捷径来解决。但是代码不会说谎,你对代码不给予足够的重视,那么你的应用程序效果不好就几乎是必然事件。
本杰明·富兰克林曾说过:低价格的甜蜜被忘记后,低质量的痛苦会存在很久。所有的事情都是如此,当我们通过某种手段快速获得胜利,这胜利背后一定会有很严重的后遗症。
4.理想的软件应该是确定性的
在理想的世界中,软件中的一切都是“确定性的”,而我们是功能性的程序员,只编写特定功能,就像String.contains(),无论执行多少次结果总是和预期的相同,这就是确定性。
我们也可以在自己的程序中编写类似的 side-effect (副作用)模块,这会让我们的编程有更多的选择空间。确定性编程可以使用任何语言来完成,有些语言可能有很多工具通过复杂的类型系统来规避意外的副作用。但是,在下面的例子中,我们是允许确定性的:
5.墨菲定律
上文中我们说到理想的世界是确定性的,而现实世界却是不确定的,处处充满惊喜和意外。相信看过《爱情公寓》的人,都对胡一菲说过的墨菲定律印象深刻,简单来说,墨菲定律就是当一件事情看似是好坏几率相同,但是它往往会朝着坏的方向发展。
所以,在编写代码的时候,我们也要考虑墨菲定律,对于代码中的小漏洞不要抱有侥幸心理,要尽量完善自己的代码。
6.摒弃“教条主义”
Jochen Mader曾说:“A good developer is like a werewolf: Afraid of silver bullets.”(中文可以理解为一个好的开发者就像狼人一样,也惧怕银子弹。)
我们所学到或者教授的知识都存在潜在的错误,尤其是在你风头正盛的时候。
程序员这个职业其实并不纯粹,我们总是喜欢把自己当做数学家,认为最纯粹的思想会一直存在,并且一定是正确的。其实,程序员的职业建立在数学之上,是满足现实世界业务需求的务实世界,坦白的说,这并不完美。
我们来看一些最流行的编程语言:
·C
·Java
·SQL
这些语言都和数学既有关联又不完全一样,例如C语言的段错误、Java泛型或者是SQL三值逻辑。编程语言是由实用主义者建立的平台,所以我们会发现有些功能的背景很浅白,而那些理论背景很酷的往往没有被采用。
不仅是编程语言,建立在编程语言之上的库、设计模式、架构等等都是如此。为上下文设计的工具没有对错,它们的本质就只是工具而已。作为程序员,有时你不必搞清楚这些工具的来龙去脉,只要用好它们就可以了。
·XML
·JSON
·功能编程
·面向对象编程
·设计模式
·微服务
·三层架构
·DDD
·TDD
·In fact:* DD
7.温故而知新
论语中有这么一句话“温故而知新”。很多程序员停留在“好”或者是迈向“好”的路上,而没有成为伟大的程序员,原因就是因为他们只实践了这句话的前半段。这些程序员总是在做自己熟悉的事情,并通过多次练习逐渐更快的完成任务。而伟大的程序员还得看重这句话的后半段,完成这个功能,不仅要完成的快,还要完成的有新意。
8.专注于一个目标(这里指的是长远目标)
最近,全栈工程师是很火的一个概念,其实在我看来,好的全栈工程师不常有,大多数的全栈工程师是各方面都成绩平平,可能他熟悉很多业务逻辑,可以快速引导一个新的软件,但是这种工作是非常粗糙的,也许对于最小可行的产品阶段是好的,但从长远来看,这会导致更复杂的问题,甚至会使整个开发团队的成员都无法进行正确分析。
与其,做一个马虎的全栈工程师,还不如只专注一个方向,并且扎根下去,精益求精。
9.广泛涉猎
虽然我们在上一条让大家选择一个方向来仔细专研,但是伟大的程序员要有千手千眼,技术的更新速度大家是有目共睹的,如果故步自封,不去积极接受新的知识,那么在计算机这个领域,你很快就会被淘汰掉。
通过新的范式和技术的学习,你可以接触到和以前完全不同的思维方式,而这种全新的思维方式可能会在未来的某一时刻给你带来意想不到的效果。
10.一切都应该尽可能地简单,但不要太简单
爱因斯坦曾说过:“一切都应该尽可能地简单,但不要太简单!” 在软件中,复杂性是最好的杀手,而简单性则是推动者。简单性说起来容易,但是真正实现却需要大量的时间和实践。
首先,实现简单性,遵循前辈流传下来的规则就是一条捷径。例如,我们大家都知道String.contains()方法,所以当“abcde”.contains("bcd")出现的时候,我们立马就知道结果了。当然,软件的业务逻辑可能不像上面的例子那么简单,但是通过多次练习,也是可以有规律可循的。