让我们先从知乎著名程序员萧井陌的这个回答开始:
入门之后的新手,喜欢谈算法,这是什么什么问题,用什么什么解。
比如异或交换变量,不用四则运算实现加减法,这个问题本质是位运算,那个应该是 blahblah…… 幼稚。
做了几年后(有的甚至做了很多年都这样),执着于谈技术,你做了什么项目多?你会什么技术?
比如要约人去 GitHub 写 tokenizer、数据库什么的
比如我在这个回答中的大部分问题,可以说是愚蠢之极。如何面试 iOS 工程师? - 萧井陌的回答
技术都是可以、甚至可以轻松学会的,并不是什么问题
一个人的思想、性格、对世界的认知、对问题的看法、决策的取舍,这些才是对程序员来说最有意义的。
所以到底怎样算是编程水平高呢?
我能裸写快速排序,你不能裸写快速排序,我的编程水平比你高吗?
如果你能写出一个编译器,我写不出来,你的编程水平比我高吗?
所以这个问题首先要追溯到一个更基本的问题上:什么是“编程水平”
为了避免混乱和争议,我们需要从最基础的概念开始构思论述。
就像几何学里一个理论体系总要有几条公里一样,这里我也要定义公理:
一个程序员的编程水平定义为他解决问题的能力
那么什么决定了一个程序员解决问题的能力呢?
这个就有很多了,首先是程序员掌握的编程技能,让我们以编写Golang高并发服务器程序为例,一个最胜任的程序员肯定是非常熟练Golang语言和服务器开发的程序员。但如果一个程序员不懂Golang而熟悉服务器开发,他的学习能力很强,3天看完了Golang上手干活一样做的很好,那么他的编程水平也可以说不错。再假设一个极端情况,一个Windows C#桌面应用程序员,他为了开发高并发服务器,用几天情况看完了Golang,又花了一周看完了服务器编程,上手干活一样做的很好,那他编程水平也是很不错的。(他十之八九是个天才)
所以解决问题的能力至少取决于两点:首先是他习得的技能,其次是他的学习能力。
以上两点是毫无争议的。公司招聘程序员也会多多少少遵循这个标准(如果你不会xxx...那你学习能力很强也可以。)但这不是我写这篇文章的理由。因为事情还没有这么简单。
让我们再看几个例子:
- 有一个程序员他很聪明,学习能力很强,但他为人浮躁,学什么东西都是浅尝辄止,导致他无论写什么程序,做什么方面的开发,做到最后,困难的问题他解决不掉。他从事编程工作好多年了,做过好多方向,但每个都不精通。那么他的编程水平,按照上面的定义,是不太高的。
- 有一个程序员他很聪明,学习能力很强,但他对编程不感兴趣,没有主动学习的欲望,导致他看到困难的问题就头疼,他没办法解决困难的问题,于是他的编程水平也不太好。
- 有一个程序员他很聪明,学习能力很强,编程技能也很好,但是他自己的个人项目做得很好,对待工作却很不用心,遇到困难问题就推给别人。他在工作中没办法解决困难的问题,那么按照上面的定义,也可以把他定义为“编程水平不行”。(这个就有点意思了)
- 有个程序员很聪明,学习能力很强,但性格太古怪,导致他的同事都无法和他合作,于是他也无法解决太困难的问题,因为太困难的问题都需要协作解决。于是他的编程水平,也是不行的!(???)
- 有一个程序员他不是很聪明,编程技能也还凑合,但是他十分擅长检索信息,每次遇到问题都能从网上找到解决方案,凭借这个本事他能解决各种奇怪的困难的问题,于是他的编程水平其实算还不错的。
......
我们可以看到,以上1、2、3、4、5中决定程序员编程水平的,分别是意志力、兴趣、工作态度、协作能力、检索信息的能力。而这和编程技能掌握程度、学习能力是毫无关系的。如果说一个程序员的编程技能是“硬”实力,以上能力,更偏向于“软”实力。这些能力,在实际工作中,也是不可忽视的一环。一个最典型的例子就是我们大名鼎鼎的王垠同学。他虽然十分聪明(考上康奈尔,进入Google工作),但目前为止还没有看到他有什么特别出色的作品或者工作。按照上述定义,他的编程水平也不行,而这个原因是多方面的,比如他对工作不用心,他无法和别人合作等等。还有四大魔道编程天王的胡正(个人网站)也是同理。
所以程序员编程水平不仅仅和编程有关,也是和他的个人素质有关的。包括他的性格,认知,对世界的看法等等。而不仅仅是学习能力和编程技能的掌握程度。
最后的结论是:程序员的编程水平,取决于他的个人素质。
好奇怪的结论啊,但看上去却十分合理。
EOF.
网友评论