起源

自己经历过的面试也不少了,互联网的、外企的,都有。总结一下这些面试的经验,发现面试官问的问题其实不外乎几个大类,玩不出太多新鲜玩意的。细细想来,面试官拥有以下七种武器。恰似古龙先生笔下的武侠世界中的七种武器。下面我为各位一一道来。

(欢迎转载。转载请注明出处: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题也是最基本的考察。道理很简单,编程语言和手写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!

(欢迎转载。转载请注明出处:http://www.cnblogs.com/hzg1981/)

参考文献:

http://www.bing.com/knows/search?q=七种武器&mkt=zh-cn&FORM=BKACAI

http://www.my285.com/wuxia/gulong/qzwq/index.htm

面试官的七种武器:Java篇的更多相关文章

  1. Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式

    Linux就这个范儿 第15章 七种武器  linux 同步IO: sync.fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cut ...

  2. 百度云世界里的“七种武器”:PCS、BAE、Site App、ScreenX等

    如果说去年百度世界的关键词是“百度新首页”的话,那么今年在研发者人群中,对百度世界最深的印象就是“七种武器”,即在云的世界里,百度为开发者所提供的包括个人云存储.LBS.移动云测试中心等在内的七种工具 ...

  3. UNIX/Linux C 程序员需要掌握的七种武器

    我是一名普通的软件工程师,不是什么技术大牛.这篇文章所提到的"七种武器"只是我这些年工作经验的一点体会和感悟,如果有错误的地方,还请大家指正. (一)C语言 作为一名C程序员,熟练 ...

  4. 快速开发平台分享-UCML快速开发七种武器

    传统的快速开发平台强调的是组件重用.构件重用,主要解决功能重用层面,一般提供了软件开发最常用的功能:表单设计.BPM(业务流程管理).报表.组织机构及权限等功能.但只有功能重用,没有过程重用,要么只能 ...

  5. 让 Python 代码更易维护的七种武器——代码风格(pylint、Flake8、Isort、Autopep8、Yapf、Black)测试覆盖率(Coverage)CI(JK)

    让 Python 代码更易维护的七种武器 2018/09/29 · 基础知识 · 武器 原文出处: Jeff Triplett   译文出处:linux中国-Hank Chow    检查你的代码的质 ...

  6. ansible七种武器和json

                                                               ansible七种武器和json • 第一种武器 – ansible 命令,用于执 ...

  7. 面试官:兄弟,说说Java到底是值传递还是引用传递

    二哥,好久没更新面试官系列的文章了啊,真的是把我等着急了,所以特意过来催催.我最近一段时间在找工作,能从二哥的文章中学到一点就多一点信心啊! 说句实在话,离读者 trust you 发给我这段信息已经 ...

  8. 面试官:兄弟,说说Java的static关键字吧

    读者乙在上一篇我去系列文章里留言说,"我盲猜下一篇标题是,'我去,你竟然不知道 static 关键字'".我只能说乙猜对了一半,像我这么有才华的博主,怎么可能被读者猜中了心思呢,必 ...

  9. 引用面试官文章 :如何准备Java初级和高级的技术面试

    本人最近几年一直在做java后端方面的技术面试官,而在最近两周,又密集了面试了一些java初级和高级开发的候选人,在面试过程中,我自认为比较慎重,遇到问题回答不好的候选人,我总会再三从不同方面提问,只 ...

随机推荐

  1. 【DPDK】虚拟机开发环境配置

    DPDK介绍见:www.dpdk.org 本文介绍的步骤基本适用于dpdk 1.7.0 - dpdk 2.0.0 各版本.只是setup.sh显示的菜单有一些小的不同:同样的,也适用于ubuntu更高 ...

  2. JavaScript中typeof的坑

    typeof是一个运算符,它对操作数返回的结果是一个字符串,有6种(只针对ES,不包含HOST环境对象) 'undefined' 'boolean' 'string' 'number' 'object ...

  3. Andorid 内存溢出与内存泄露,几种常见导致内存泄露的写法

    内存泄露,大部分是因为程序的逻辑不严谨,但是又可以跑通顺,然后导致的,内存溢出不会报错,如果不看日志信息是并不知道有泄露的.但是如果一直泄露,然后最终导致的内存溢出,仍然会使程序挂掉.内存溢出大部分是 ...

  4. 实验:sigsuspend(),sigprocmask()

    实验:sigsuspend(),sigprocmask() 源代码: /* * Program: pause_suspend.c * To test the difference between si ...

  5. POJ 2891 Strange Way to Express Integers【扩展欧几里德】【模线性方程组】

    求解方程组 X%m1=r1 X%m2=r2 .... X%mn=rn 首先看下两个式子的情况 X%m1=r1 X%m2=r2 联立可得 m1*x+m2*y=r2-r1 用ex_gcd求得一个特解x' ...

  6. cnblog code syntaxhighlighter view

    wlw代码插件 测试多款 wlw插入代码插件 在博客园的代码高亮效果 1.Code Snippet 1: public override void Update() 2: { 3: base.Upda ...

  7. python 维吉尼亚

    加密key='COMPUTER' plaintext='BLOCKCIPHERDESIGNPRINCIPLE' ascii='abcdefghijklmnopqrstuvwxyz'.upper() k ...

  8. 未能加载文件或程序集“Enyim.Caching”或它的某一个依赖项。未能验证强名称签名

    from:http://www.mzwu.com/article.asp?id=3741 itHub下载Enyim项目,编译后引用程序运行出错: 引用内容 未能加载文件或程序集“Enyim.Cachi ...

  9. Python-装饰器详解

    初学python,装饰器是什么玩意儿? 1:装饰器是函数,只不过该函数可以具有特殊的含义,装饰器用来装饰函数或类,使用装饰器可以在函数执行前和执行后添加相应操作. 2:至少两层函数 方式一: 理解方式 ...

  10. Spring 集成 RMI

    Maven <dependency> <groupId>org.springframework</groupId> <artifactId>spring ...