learn-tech/专栏/左耳听风/093程序员面试攻略:面试风格.md
2024-10-16 06:37:41 +08:00

80 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

因收到Google相关通知网站将会择期关闭。相关通知内容
093 程序员面试攻略:面试风格
国内公司和国外公司在面试风格上完全不一样,所以,这里我们也需要了解一下不同风格的面试方法,这样有利于你准备。
说句实话,国内的公司是比较好面的,国外的公司是比较难面的。从职位招聘信息上你就可以看出来,国内的公司包括知名公司更多的是面试在表面上。因为国内公司招的基本上都是马上能来干活的,所以,问的更多的是一些技术知识上的东西。
准备这些知识性的东西,本质上来说跟准备考试没什么两样,恶补一下相关知识就好了。然后讲一个项目,项目中他们也不怎么追问细节,面试的过程中,也不需要写代码,也不需要解决一个难题,所以,容易蒙混过关。
国外的知名公司就没有那么容易了,真是全方位的考察,你的表达能力、沟通能力、思维方式、解题思路、代码风格、算法和数据结构、设计和架构能力、解决难题的能力……这是很难靠恶补就可以过关的,没有踏踏实实的沉淀、钻研和思考,你是很难过关的。
国内公司
对于在基层干活的程序员来说,国内的公司,小公司不说了,诸如 BAT 这样的公司基本上来说都是比较好面的。一般来说都会问你一些技术知识比如Java 语言的一些特性啊,会不会用 Spring 和 Netty 啊JVM 怎么配置怎么调试啊,并发编程是怎么玩的……
这些问题基本上来说都是知识性的问题,都是可以 Google 的,通过查手册查文档就可以知道的。所以,这些问题是很容易准备的,只要你老老实实地看几本我在《程序员练级攻略》里推荐的书就好了。当然,还是有很多人连这些基本的问题都回答不上来,这只能怪自己了。
回答完这些知识性的问题,就是项目经历描述了。你可以随便讲你做过的项目,把这个项目用到的一些技术架构都说清楚就好了,还有怎么上线的,怎么运维的,怎么加班的,怎么苦逼的,怎么带人的,怎么管理项目的。面试官也很少追问技术细节,因为可能面试官自己都不懂(哈哈)。
只要你按照我前面说的那个讲项目的方式来,面试官一看你用到的技术栈和我这边的很类似,他就开始想要你了。当然,国内的公司更多的是缺劳动力,所以,只要你能让他们感到你很能吃苦耐劳、任劳任愿,而且能很快上手干活就好了。
然后就是 HR 和老板的面试了HR 和老板不懂技术,也不会问你技术问题,他们主要是看看你的性格和态度等。只要你表现能吃苦耐劳,踏实肯干,如果还有一点 “ 灵性 “(脑子转得快,与人好沟通,一来一回有问有答,性格外向点儿),在国内的面试你是很容易通过的。
基本上来说,国内公司喜欢快进快出,也就是说,不在面试上花太多的精力,进来就干活,不行就开掉,基本上是找工人找劳动力的玩法,也不关心员工的成长。所以,面试过程基本上来说,都是围绕你干什么,我这边这些事你会不会干,你会不会加班、能不能吃苦耐劳,听不听话等这样的内容进行的。
当然,对于架构师或是高级别的技术人员,又是另一种面试方式,这在国内的大公司中得分两种。
一种是业务型部门的高级技术人员,基本上来说,不会再问你一些技术的细节,只会问你一些架构方面、项目管理方面,以及技术方面的事,或者一些业务架构上的事情。相对来说,业务或应用方面的架构师和高级工程师需要对业务和行业比较了解,有丰富的业务项目经验就好了,技术上倒不需要有多深的知识。我觉得,在一个行业呆久了,只要你对业务有思考,再加上有技术把持,基本上来说,只要平时多读一些不错的业务上的想法,还是比较好过的(因为不会问及细节问题)。
另一种是偏技术部门的架构师和高级工程师,比如核心基础技术,或是云计算之类的。那就会问你很多技术细节上的东西了,而且问得还很深,需要你有相应的项目经验,或是开源社区里的工作经验。你需要有过相当的经历才有可能面过。但是,回过头来说,就算是这样的岗位,本质上还是会回到面知识型问题的方法,所以,无非就是你能钻研的知识深一点儿罢了。知识是死的,只要你努力,你总有一天能学会的。
总体来说,与国外公司相比,国内的公司不管是哪个层级上的面试都是比较好通过的。
国外公司
国外的公司我面过的不多只面过Amazon、Google、Microsoft、Facebook 这几个大公司还有一些小公司就不在这里说了。这几个大公司中Facebook 是相对比较好面的Google 是相对最难面的。这些公司的面试最近都有改观,不再以算法为主要面试手段了,但还是会多多少少面你算法方面的题目。而且,无论初级还是高级的技术人员的面试都还是有点难的,因为这些公司的招聘标准是要招超过现有团队同等级别 50% 以上的人。这就要求团队成员只能越来越好,最终导致标准越来越高。
一般来说,会有两轮电话面试,一轮是工程师面写代码,主要是算法相关的代码,然后可能还是工程师再面一轮技术,或是经理电话面一轮,主要想了解一下你目前的工作职责还有你的一些长处和喜好,包括你的一些想法什么的。如果没有什么问题,你就会进入到 in-house 面试。
in-house 面试一般要面一天,最少 5 轮3 轮和技术相关包括代码、算法、设计、架构、Problem solving1 轮是经理 (包括做过的项目、解决问题的能力、学习能力、思考方式……)1 轮是 HR包括性格、喜好、薪水……。老实说这种车轮战的面试如果你之前没玩过是第一次上那么会非常不习惯。一天面下来你会累死。当然习惯了你就会觉得没什么问题所以还是要多练习。
国外的公司面试时一定会让你写代码,无论你面多高级的职位,只要是技术岗,基本上都会让你写代码。你千万不要把代码写得跟面条一样,至少要分模块函数,把函数接口定义得清楚点儿,代码逻辑也要简洁清楚(有大量的 if-else 嵌套的一定不是好代码),变量命名也要好一点儿。写代码的过程中如果有觉得不好的要打上 //TODO:refactor me 之类的注释,这样会是一个好的编码习惯。一般写完代码后,面试官会问如下几个问题。
讲解一下你的代码。这主要是跟你一起 Review 代码,一般会考你的表达能力。最好用一到两个 case 来讲解一下代码会更好。
分析一下代码的时间和空间复杂度。
优化代码,包括代码中的 Bug 以及更高性能的算法。
在这个过程中,面试官除了要答案以外,也会了解你的思维方式或是做事方式。
注意,有些很有经验的面试官会从一个很简单的编码题开始,然后不断地加需求,或是改需求。一旦你发现这个事的时候,我给你的建议是不要马上实现新的需求,而是停下来,和面试官讨论需求,感觉一下未来可能的需求变化,然后开始重构代码,抽象该抽象的代码,将接口和实现分离,把程序逻辑和业务功能分离。
这里,你需要使用很多编码技巧甚至一些设计模式。如果你让面试官看到你是在 Case-by-Case 地写代码,那你就完蛋了。基本上来说,如果你平时写代码不是这样的习惯,在这个过程中你是无法装的,你会被搞得原形毕露的。
在设计和架构中,一般会涉及面向对象方面、数据库设计方面和系统架构方面的内容。系统架构方面的内容问得也很多,基本上都在问一些和高并发、高可用、高性能和大规模分布式相关的架构。但是,在你解题前,你一定要问清楚需求,不要仓促 jump into conclusion。先调研需求最好再问一下为什么要做这个需求做这个需求的意义是什么
当你了解完需求后,你还可以挑战一下,如果是这个需求的话,为什么不用另外一种方式或架构?这些问题,都是加分项。搞清楚需求后,你要开始设计系统了。设计系统时,你不要只是拍脑袋,还需要做一点容量计算。如果数据不完整,你直接跟面试官说清楚就好了,有数据上的支持会让你更好地设计好你的架构,而且,这会是非常大的加分项。
另外,在设计系统时,还要考虑到系统未来的扩展性,也就是未来如果又加入一些别的东西进来,或是量变得很大了,你的系统是否可以容易地进行功能扩展或性能扩展。这个架构问题,如果你没有足够丰富的经验,或是严谨的思考,并不容易做得出来。
Problem Solving 是一些国外公司尤其是 Amazon 最喜欢面的一个环节了。国外的这些大公司都认为他们要解决的问题是没有人解决过的,所以他们需要的人才也是能解决自己从来没有见过的问题的人。一般来说,面试官会给你一个你从来没有见过的问题,而且是很难的问题,很明显是一个只有工程师才能解的问题。
比如,用最简单的方式统计一条公路上向两个方向开出的汽车(比如在公路路面上放两个压力传感器什么的),或是让你设计一个自动化的学校排座系统,能够让性格接近的人坐在自己身边等。一般来说,他也不指望你能在一个小时的面试中找到问题的最优解,主要看你的解题思路。另一方面,面试官也会和你一起来解(有可能面试官自己也不知道答案),这样他想感觉一下,和你一起工作,一起解难题是个什么样的体验。
总之,面试国外的公司不是你在短期就能准备的,尤其是面一些高级别的技术职位,还是比较难的。基本上来说,你脑子要转得快,智商也要比较高,还要在日常受过比较好的软件开发或是工程架构上的训练,平时还要很系统、很工程地做事,用正确且严谨的方式做事。不然,你一定是面不过的。
小结
总结一下今天的内容。我认为,国内外公司的面试风格有很大不同。国内的公司是比较好面的,国外的公司相对难面一些。国内公司包括知名公司要招的基本上都是马上能来干活的,所以,面试中问的更多的是一些技术知识上的东西。比较好准备,恶补一下相关知识就好了。不怎么追问细节,也不需要写代码,也不需要解决一个难题,容易蒙混过关。
国外知名公司则对面试者进行全方位的考察,你的表达能力、沟通能力、思维方式、解题思路、代码风格、算法和数据结构、设计和架构能力、解决难题的能力……这些是很难靠恶补就能过关的。因此,我针对这两种不同的面试风格,给出了相应的面试流程,以及应对技巧。