你要解决的不是面试的问题

爱因斯坦有句话我很喜欢:you can’t solve problems with the same thinking that caused them。与之对应的中国有句老话叫:头痛医头,脚痛医脚。为什么提到这个呢,因为我发现很多刚开始工作的人找不到工作会归咎于是自己面试没准备好。或者网上太多的面经给很多人一种印象:找到好工作就是面试准备的好。

面试准备的好和找到好工作并不是真正的因果关系。想到以前网上看到的笑话,有网友问是不是用了iPhone就会变的更有钱。从他的角度观察发现很多收入高的人都在用iPhone,所以得出用iPhone会让人变得有钱。真实的情况很容易看出:因为iPhone的价格贵一些,所以是“有钱”的人用iPhone,不是用iPhone会有钱。同样,一份好工作不是准备好面试的问题。

面试只是筛选候选人的一种方式,是观察你实力的一种方式。如果你发现有个人在看你,你就踮起脚尖,让自己显得高,也许一时会让人觉得高,但是你不可能一天都垫着脚。所以不要抱着投机的心态来找《面试宝典》。换个角度说,你几乎不可能靠面试技巧而取得获得一份好工作,因为说到底工程师还是要干活的。

那么需要准备的是什么?你应该准备让自己成为一个合格的程序员,一个能够高效完成工作的程序员,一个能够达到招聘需求的程序员。

被神话的面试题

无论什么公司要进行程序员的招聘,首先想到的都是网上搜一下面试题。或者问问在大厂上班的朋友向他们问问面试题。似乎招聘的核心就是找到一套题库。这样完全是现代版按图索骥。

很多中小团队的用人需求和大厂完全不一样。盲目的用他们的面试题最后可能是导致面试成本增加,本来一两周就能招到人,结果因为过高的标准导致过了一个月才招到。如果只是多等了几天还好,如果招到这个人和团队融合有问题不适合团队代价就更大了。

举个例子,很多人面试的时候问性能优化的问题。一个一年左右经验的程序员对性能优化完全没了解过会影响他成为合格的程序员吗?他工作里有多少概率要解决性能优化的问题?
大厂因为各种原因可以收到很多求职的简历,如果招一个人,有一千份简历,肯定就从一千人里挑出他们觉得最好的那一个。所以面试题自然要苛刻一些。但是普通的中小企业盲目的也用这种面试题去筛选人就很盲目了。

开发中的大部分的问题都可以通过搜索解决

一个简单的事实是我们日常开发中能碰到的问题其他人也碰到了。推出另外一个结论就是你碰到的问题别人可能已经解决过了。日常开发中百分九十的问题可以通过搜索解决。
程序员解决未知问题的能力和搜索能力成正比。

这就是面试的时候为什么会问“碰到问题一般会通过什么渠道解决”。当然这么问有些太直白了。我会问一个比较新的 API 相关的问题,比如“最新版本的 swift 里怎么截取字符串”。笔记本的浏览器主页默认设为百度。然后告诉他可以通过网络查。如果直接在百度里搜索的就可以直接 pass 了,这智商基本就告别程序员了。有一些会问我能用谷歌搜吗。如果谷歌直接把这个问题打进去的也是堪忧。机灵一点的会在 Stack Overflow 上搜索 “Swift substring”。

如果一个非常常见的问题,聪明的人1分钟就能搜索出结果。你需要10分钟才找到答案。日常开发里两个人的效率一定会区别很大。

所以应该有意识的提高自己的搜索水平。

基本功≠算法

见过很多人说我要提高一下我的基本功,于是就下单了《算法导论》。这种认知可以说对算法也很不公平,搞的好像买了《算法导论》你就真的能看懂一样。算法本质上是数学的范畴,虽然在某些具体场景上有涉及数据结构等计算机知识。我们在谈编程的基本功的时候,虽然也包括对一些常见算法的理解但是只是一部分。

而且算法的概念包含的范围实在是太广了,比如计算哈希常用的 SHA1 ,深入的去了解计算的规则,熟悉到能够自己手算出来,听起来是很牛逼,但是平常里也没什么场景用到。
考察算法并不是需要看你知道多少种算法,而是想要知道遇见一个工程问题的时候,你能否从编程的维度去解决它。看看你对数据结构的理解,对时间、空间复杂度的理解。

那么基本功是什么呢?

这里的基本功支撑的是编程这件事。可以加深你对编程的理解的才是基本功。比如内存、操作系统、网络等。这方面的知识大学里都教过了,不清楚的可以翻翻《计算机导论》。
举个例子,开发中常常会遇见多线程的问题。多线程的问题是知道具体某个语言的 API ,网上看几个面试题就算理解吗?为什么会有多线程的问题?多线程是怎么工作的?锁是怎么工作的?什么是死锁?为什么主线程不能并行?这些问题的理解才是基本功。

常被忽略的基本功:写出易读的代码

一个重要确又被很多新手忽略的技能是:写出易读的代码的能力。练习中的项目都是一个人的代码,很容易忽略代码的可读性。因为代码都是自己写的,所以命名习惯就不用规范,自己能懂就可以。而且真实项目会有持续的需求改动,自己写的项目一般变化不大,所以对程序的扩展性和可维护性也要求不高。

如果在一开始学习过程中就没有提高代码可读性的意识,工作中就要用更高的代价才能写出合格的代码。真正项目中,你的代码都是需要维护的,如果可读性行差会给同事不好的印象,自己的交付效率也会降低。所以在平时练习中就要重视自己代码的可读性。这里推荐两本很经典的书《代码整洁之道》《编写可读代码的艺术》。

编程的核心:抽象能力

面向对象三个特性『封装、继承、多态』说起来很简单,谁都能记住,但是为什么很多人连属性应该公开还是私有都弄不清?

top Created with Sketch.