Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
122 lines (72 sloc) 9.04 KB

该文章发表在新大订阅号

文章链接

你一定很聪明吧? 你数学一定很好吧? 你的逻辑思维一定很强吧!?我觉得你们程序员都很牛逼!

绝大多数程序员都被问过这种被直接带有肯定的问题。 自己即使嘴上回答”不是啦”,可是心里还是很骄傲。

我以前也这样,现在变成熟后就不这么认为了。

程序员真的需要高智商吗? 我认为不需要。人类发明编程,就是想用编程来弥补人类的大脑缺陷。

在编程技术刚被发明时,程序是用来帮大学教授做科学计算的。随着硬件的发展,程序的应用越来越广泛,除了科学计算外,还可以在办公、医疗、航天等多数领域发挥其价值。人类要开发大量具体的应用程序,编程语言从机器语言往高级语言发展就成了必然趋势。编程语言越接近高级语言,就越符合人类的思维方式。从简易程度的角度来看,编程语言发展到高级语言后,编程这件事情就变得更容易了。

随着近些年开源软件的发展,大量优秀的开源软件把创造应用程序这件事情变得更简单,甚至可以说是”傻瓜式”。如果你在今天想创建一个WebApp,一分钟就可以搞定。

编程过程变简单了,用编程方式来创造应用也变简单了,程序员的工作是不是也就变简单了呢?答案是肯定的。我刚参加工作时,参与开发一个通讯录(BREW操作系统上的应用),公司投入了30多个工程师。如今,在android操作系统上开发通讯录(甚至功能更完善),只需要投入2-3个高级工程师即可。这种变化并不是说以前的工程师比现在的工程师能力差,而是现在的开发过程变得更简单了。

在日新月异的技术发展过程中,我在招聘工程师的态度上也发生了变化。我以前比较注重项目经验(很多公司在招聘时会应聘有过类似项目经验的候选人),现在我更看重面试者的谦虚和处理细节的能力。

2016年我面试了40多个程序员,其中有两个同学让我印象深刻。

典型1:他很聪明,但不具备创造能力

在被淘汰的人中,有一个同学在学校期间就自学Android。他给我展示了五个Android应用,并很自信地对我说:这都是我一个人以外包身份给某公司开发的。

刚开始我和他做了一些简单的交流。

Q: 你开发能力这么强,对薪水的预期是多少? A: 20K。 Q: 你的基础怎么样? A: 我是自学Android,基础可能不是很好,但是我的动手能力很强。我可以一个人完成一个项目。 Q: 你平时写代码时遇到问题都是怎么解决的? A: 网上找答案。 Q: 在运用一个Activity中,你了解里面存在多少种设计模式? A: 我只听过设计模式,但没去看,以后打算看。 Q: 你最近一个项目中,用到的一个最熟悉的开源项目是什么? A: rxjava(作者注:Android一个开源库)。 Q: 你能给我阐述一下rxjava的思路吗? A: (他把用法给我讲了一遍) Q: 这个用法的背后知道为什么吗? A: (不知道)

后面我问了很多他在工作中实际用到的一些技术,基本上是知道怎么用,但不知道为什么。

从动手能力方面来看,他就是人们传统认为的那种“聪明”的人。从他连上流露出的自信我相信这些应用都是他做的。但是,基于以下几点我淘汰了他:

  1. 基础很差。他虽然动手能力很强,但是对技术细节不理解。
  2. 写代码靠模仿。他对代码的认知还停留在copy和模仿阶段,如果不参考事例,就不会写代码。
  3. 创造力差。他适合一个萝卜一个坑的小公司或外包公司,但不适合创业公司。员工的创造力是创业公司渴望获得的。
  4. 有点骄傲。他可能认为自己是属于”聪明”那类的,而且不能发现自身的缺点、以及不太能接受别人对他的评价。在管理上会带来风险。

互联网行业中,很多工程师和这位同学一样。这类同学统一犯了一个错误:被”简单”的技术蒙蔽了双眼,使得找不到进步方向和空间。

典型2:他很踏实,而且很有想法

这位同学是一位C++工程师。

我并没有从基础技能入手,而是直接了当地把想招他进来做什么事情告诉他。他刚开始显得很紧张,可能是觉得我面试的套路很奇怪吧。

我为了调节气氛,就在白板上画出我的想法。在不断的沟通后,他似乎明白我的意思,思考了一会儿就在黑板上画出了解决方案。

他提出的解决方案非常初步。虽然从大面上看似能走通,但是关键点和细节点都无法体现。我紧接着围绕方案提出了一些问题,他都能不紧不慢地一一解答。

为了了解他技术的深度,我开始围绕方案问一下技术的实现细节。比如,模块间的通信机制、事件队列的处理方法、数据共享的方式以及网络交互的实现细节等等。这些技术细节非常考验局部架构能力,他都能说出自己的见解。

我们最终讨论出了一套方案,并整理出了技术的难点。整个面试过程就像是一个方案讨论会,非常的自然。

在最后,我问他对这件事情有信心做吗?他的回答大致如下。

这件事情会很难,而且很多东西都没接触过。但是事情是可以的,也有价值。在具体实现上会遇到很多技术难点,需要花时间但一定能做。

他虽然没有正面回答问题,但是我很满意。主要因为两点。第一,他能正确认识到事情的难度。第二,他不惧怕挑战。

至于信心这东西,和决策者的坚定目标有强烈的关系,团队的管理者有足够强的目标,同学们就会有足够的信心。他既然不惧怕挑战,在后续工作中我要不断为他输入信心。

面试结束后,我录取了这位同学。基于以下理由。

  1. 理解力强。他能非常快速的理解我的问题并作出回答。
  2. 想问题全面。他能由大面到小点,循序渐进改进解决方案。
  3. 勇于承认不足。虽然他面对没接触过的技术会主动承认不会,但还能提出个人观点。
  4. 善于发现细节。他非常善于捕捉设计方案的细节,提出的某些细节都直接关系到方案的成败。

在平时编程工作中,一个工程师是否厉害,并不能简简单单从代码能力一个点上来衡量。而是要结合场景。这些场景包涵:对所做事情的理解、对未来的把控、对异常的避免以及细节的处理。

聪明和优秀程序员之间并无太密切的联系

前面提到过人类发明编程是为了弥补人类的大脑缺陷。人脑的使用度是有限的,学习久了要休息,工作久了要休息,想多了要休息。休息大脑无关于你的智商是高还是低。

为了减轻程序员大脑的负担,编程过程做了大量的改善,而且很多改善都是为了弥补人的智力缺陷。不信你看:

  1. 将系统”分解”,易于人脑理解。
  2. 将子程序写的短小,减轻大脑负担。
  3. 基于面向对象编程而不是过程编程,易于人脑理解。
  4. 微服务化,减轻维护压力,减轻大脑负担。
  5. 制定各种编程规范,将思路从繁琐的编程中解放出来。避免犯错。
  6. 进行审查、评审和测试的流程,避免犯错。

也许有人会说更高的智商在编程上会有更好的作用,我并不否定这个观点。

但是,衡量一个工程师的水平高度不应该只片面地站在人的角度,更应该站在处理事情的角度。

高智商的工程师可以写出更复杂无bug的系统,这确实是真的。但是写出的程序如果没有人能懂,没人能继续维护。这个复杂无bug的系统的价值就要打大折扣了。千万别忘了,评价一个系统的好坏除了能正常运行之外,还要考虑可扩展性和易维护性。你考虑得越多,就需要你越注重细节处理。

如果你想学习编程,或者你正在学习编程。下面的建议可能对你有用。

  • 优秀的程序员和高智商无太密切的联系。你越谦虚,进步就越快。
  • 如何执着的用聪明的方式去处理事情,比你有多聪明更重要。
  • 要想懂怎么写出优秀的代码,就得具备非常强的吸收细节的能力。

最后一点更重要。

不要轻易否定自己,你一定也能学会编程。