面试官的七种武器
(欢迎转载。转载请注明出处:http://www.cnblogs.com/hzg1981/)
长生剑是七种武器之首,同理,编程语言的考察也是技术面试中最基本的。这条不满足的就直接Pass了。以Java为例,语言的考察大致可以分为三个层次:
初级:语法考察,也就是该语言本身的使用层面。
这个层次的考察会考察一些语言的基本语法,对于这个层次的考察要做到对于每一个细节都熟练掌握。 考察的形式可以是问你某一段代码是否能成功编译,或者会输出什么结果,也可以是让你说一些不同关键字的不同含义、某一个关键字都可以有哪些用法,等等。Java常见问题:
Inner Class, Static Nested Class的使用;
final finally finalized关键字的区别;
volatile\sychronized关键字的使用(Java开发往往是服务器端开发,所以并发相关的关键字要重点掌握);
static关键字都有哪些使用场景(说出static block及格,说出import static会加分)。
中级:库或框架的使用。或者说是该语言的技术栈的使用层面。
库的使用:
也就是该语言的标准库的使用。以Java为例,会问你一些关于jdk中常见的framework,比如IO、 Collection、juc并发框架等,以及concurrentHashMap的实现原理等等。尤其要注意的是HashMap和ConcurrentHashMap的实现原理是面试官最喜欢攻击的技术点之一,一定要好好掌握。同时,因为是Java开发往往是服务器端的,juc包也是要重点掌握的。 除此之外还有一些重要的规范,比如JDBC、servlet,等等。
框架的使用:
以Java为例,Spring SpringMVC和MyBatis(Hibernate)这些框架的使用、原理都要掌握。对于Spring来说,要重点掌握IOC和AOP的实现原理,其中AOP要知道动态Proxy和CGLIB两种实现方式。对于ORM框架,要重点掌握MyBatis和Hibernate的实现原理和不同点。
高级:语言的底层实现。或者说是该语言的设计思想层面。
以Java为例,因为Java是以JVM为基础的,会问一些关于JVM的问题,比如JVM的运行时内存区域,JVM内存模型,GC机制,JVM的性能调优,类加载机制等等。另外需要掌握JIT等技术,以及为什么Oracle的Java虚拟机叫做HotSpot?
还有就是对一种语言的历史最好有一个大概了解,以Java为例,需要了解Java每个大版本都有哪些重大更新,等等。
刀和剑是武林中人最基本的武器。对于面试官而言,语言考察和手写code题也是最基本的考察。道理很简单,编程语言和手写code是coder最重要的基本功。跟编程语言一样,这部分通不过的话,面试直接Pass。同时,这一部分也是“talk is cheap, show me the code”的最好体现,杜绝夸夸其谈的“水货”。
手写Code题可以分为下面三类:
1. 算法题。
最基本的算法题一般是排序,查找等,常见的有二分查找,快排等。一定要熟练掌握。这些题在各类公司的考察中都有可能出现。
中等难度的算法题一般会是动态规划算法(DP)的题,比如菲波那切数列问题及其常见变种。DP的题的关键点在于首先找出问题的递归解法,然后使用自顶向下或者自底向上的方法,消除递归过程中的重复状态,降低时间复杂度。
其实,就算是MS Amozon这种以考察算法著称的公司,基本上算法题的难度也很少超越DP这种中等难度的题。因为毕竟不是搞ACM。
2. 数据结构题。
最基本的数据结构题一般是针对链表这样的题目,比如单链表的反转、判断单链表是否相交,等等。
中等难度的题目一般是针对二叉树这样的题目。反转二叉树、二叉树的层级遍历,等等。值得注意的是,二叉树的题目可以考察的内涵其实非常广泛。比如经典的LCS最近公共祖先题目,其实解决的思路就非常考验解决问题的能力:把问题break down,再各个击破。
高级的数据结构题一般是B树,图这样的数据结构。一般这样的题很少考到。
因为算法与数据结构是密不可分的,因此往往把它们合并为同一类,统称为算法题,但其实二者还是有区别的。
3. 针对特定领域的手写code题了。比如手写JDBC的查询实现,手写生产者消费者原型,手写单例模式,等等。
最后,还有一点要注意,手写code题有个特点:你给出一种写法,面试官往往会追问你有没有更优的写法?如果题目修改一些前提条件该怎么办?因此,对于这一类问题,在平常的学习积累中一定要注意学会举一反三。
孔雀翎=设计模式
孔雀翎,每一片都是那么美丽。设计模式也是一样,每一种设计模式都蕴含着设计之美。在经典的23种设计模式中,能说出10种以上的模式及其思想,就算及格。
在这里,列举一下需要掌握的几种模式:
创建类:
单例(线程安全的单例?在Java中双重检查加锁为什么会失效?),工厂方法,抽象工厂(工厂方法与抽象工厂的区别?),Builder。
结构类:
Adapter适配器,代理模式Proxy, 装饰器模式(在Java IO Framwork中的体现?),外观模式。
行为类:
观察者,状态模式(state),模板方法,策略模式,责任链模式(在Jetty中的体现?)。
设计模式在互联网企业的面试中出现的比较少,一般只需要重点掌握单例模式即可。至于其他模式,能说出他们在jdk或者其他重要开源框架中的使用即可。
另外,除了23种经典设计模式,最好还能掌握比如多例,对象池(object pool)这样的更为现代的设计模式。
多情环=Java开发中的其他环节
这部分内容比较多,而且而且这些技术环节与Java开发都有着环环相扣的关系。这些环节主要有: Linux shell编程或者Python脚本编程,在服务器运维中会使用;SQL关系数据库;HTTP TCP网络协议;反向代理,分布式缓存,等等。 下面按照客户端数据的流入先后,介绍几个比较重要的环节。
1 Nignx、Tomcat、 Apache、Jetty 等Web服务器
Nignx可以作为反向代理,所以位于整个服务器系统的最前端。Tomcat或者Apache可以负责转发请求给应用服务器。Jetty可以在分布式集群中帮助服务器间通讯。
需要掌握Nignx与Apache的原理及不同、Jetty的原理,等等。
2 线程池、NIO框架等
需要掌握Java处理高并发的原理(线程),并了解其他常见方式,如Node.js的基于event的方式,以及Python GoLang的协程方式,等等。
由于应用服务器的性能瓶颈往往在IO上,所以还需要掌握Java常见的NIO框架如Netty等。
3 消息中间件及分布式框架
需要熟悉常见的消息中间件比如Kafka,以及常见分布式框架ZooKeeper等,如果研究过源码就更好啦。
4 缓存
缓存是应用服务器(集群)与数据服务器之间的桥梁。常见的有MemCacheD和Redis。需要掌握的常见问题有MemCacheD与Redis的原理,它们的不同,Redis持久化方式,一致性Hash等。
5 数据
5.1 关系数据库
需要掌握常用SQL语句,常见的SQL性能调优方法等。需要注意的是关系数据库也可以做分布式哦,也就是分库分表。另外一个性能调优的方法就是分页(limit start),单表超过百万记录后常需要这种方法,等等。
常见问题:
什么是数据库事务,如何实现数据库事务? 如何实现分布式事务?
SQL性能优化方法:select * from table1; 如果有上百万条记录,如何优化? 覆盖索引。
5.2 NoSQL
最好能掌握些Hadoop、Spark的知识,为将来转型为数据工程师做准备。。
6 脚本及JVM监控
终于说到运维阶段了。。 在日常运维中,需要至少掌握Shell或Python脚本,Shell要重点掌握awk,以及一些常见的性能监控命令。常见的题目会让你写一段处理日志的awk脚本,或者问你一些ps iostat netstat vmstat之类的命令如何使用,等。JVM监控主要是如何获得java core和heap dump,以及如何分析他们,另外一些简单监控命令如jstack和jmap jhat等也要了解。
关键点:
这部分内容往往会结合你的项目经验来问。一定注意要诚实回答,不要夸大自己在项目中的作用,不然面试官会认为你在弄虚作假,很不诚实。如果这样的话,你就死定了!
霸王枪=系统设计+架构设计
什么技术才是七种武器中的王者:霸王枪呢?那当然是系统设计和架构设计啦!不想成为架构师的coder不是好coder哦!
要想在这轮较量中胜出,面试者平常就要注意在系统设计&架构设计上的积累。即使我们开发的只是整个大系统中的一个模块,也要对整个系统有一个总体的认识,尤其是我们负责的模块在整个系统中的地位和作用是怎样的,与系统中的其他模块是如何交互的,一定要非常的清楚。
这部分题目的考察,往往会现场给出一种应用场景,并给出一定的约束和期望达到的目标,要求你给出你的设计方案。要特别注意的是,一定要先彻底搞清楚需求,然后才能设计。因为设计并实现一个系统,必然是为了满足一个特定的需求。需求不清楚就设计,等于无的放矢。需求大致可以分为这么几个方面:
功能性的:
除了搞清楚具体题目的独特的功能需求,还要考虑一些通用的功能,比如,一般来讲作为一个server系统,必然要有日志功能,这基本是必备的。又比如作为一个电商平台,商品推荐这个功能也是必备的,等等。
性能上的:
除了搞清楚具体题目的特定性能要求,还要考虑一些通用的性能指标,比如可扩展性,即是否使用分布式集群;吞吐量,即同时可服务的用户数、QPS等;响应时间,等等。根据给出的这些性能指标的具体数据,结合其他数据,比如硬件性能,数据量大小等,决定采用何种设计,比如最常见的加分布式缓存、加反向Nignx代理,等等。
异常处理方面的:
写一个函数,除了处理正常输入,还要考虑非法输入的处理;系统设计虽然比写一个函数在规模上要大太多太多,但道理其实是一样的:除了考虑实现正常的业务流程,还一定要考虑异常的情况,以及非法的输入。
以Java服务器系统为例,通常需要考虑的异常情况有: 网络故障,服务器集群中的单点故障(断电等各种原因),各种恶意攻击(SQL注入,恶意模拟用户点击等等),等等。应对这些异常的技术通常有:灾难备份,数据冗余备份,分布式事务,等等。
常见题目: 设计电商秒杀系统、设计数据库系统,等等。
离别钩=HR面
离别钩是七种武器的最后一种。同理,HR面试也是面试的最后一个环节。
考察内容:
HR会考察你的技术之外的其他素质,比如性格,是否能融入公司,是否能认同企业文化,与人的沟通交流会不会有问题,以及面对困难的应对等等。
该问的和不该问的:
千万不要以为到了这一步就可以放心和HR谈价了。。。 所以薪资这块最好少问。同时需要注意的是,比如加班之类的最好少问,可以等拿到offer再问,
应该问一些企业文化方面的东西,这样可以加分不少。
第七种武器?
第七种武器是什么? 水:“哦?” 车:“没有武器!” 水:“没有?” 车:“没有,没有武器就是有武器,有武器就是没有武器”
面试中的第七种武器是什么?眼缘!有时候面试官就是看你不爽。。所以,你跟这个职位就没有缘分啦,哈哈哈哈。。。。
写在最后
好了,面试官的七种武器就介绍完啦,如果大家有任何补充欢迎留言。最后祝愿大家都能熟知面试官的这些武器,做到知己知彼,百战不殆。顺利拿到自己心仪的offer!