这是一家外包公司, HR在招聘平台看到我的简历主动和我联系的,于是我下午就直接过去了.
首先是做了笔试题,都很简单而且很基础, 做完之后,他们这边的技术负责人跟我聊聊我做过的项目,感觉还可以,就带我去客户现场面试了。
面试的人是他们的合作方. 首先是技术一面, 面试官是个很nice的大叔(30岁左右), 主要就问了我一些项目上的东西:
Q:你们购物车模块是怎么实现的?
A: 我从用户未登录以及登录的两种情况分析. 未登录又有两种情况, 以及我们当时是如何考虑, 选择哪一种方案的角度去给他说, 然后又具体的说了购物车的原理, 其中提到这个地方会使用到Redis.
Q: Redis使用的场景及好处是什么?
A: 我给他详细的说了我们在项目中的哪些地方会使用到Redis, 以及Redis相比于传统的关系型数据库的优点, 然后就是Redis在我们项目中是如何使用的, 包括如何去操作Redis.
Q: 你们项目中使用的Nginx集群是如何搭建的? 它是如何做到负载均衡的?
A: 这个问题我就先从为何要使用Nginx来说起, 然后讲了什么叫Nginx反向代理, 接着讲了如何搭建Nginx集群, 以及我在项目中关于这块的职责.
Q:你们这个Dubbo是做什么使用的?
A: 关于这一块我首先说了我们的项目是由多个子系统构建的, 然后说我们系统中的一些调用需要使用到Dubbo, 最后对比了Dubbo与WebService的区别.
Q:面试官问我是否了解集合的一些类?
A:我说我看过一点HashMap的源码, 然后讲了HashMap中的数组和链表结构, 以及HashMap是如何自动扩容的, 以及扩容带来的好处(空间换时间), 然后就是put/get是如何实现的等.
问到这里面试官就没有再问我具体的技术问题了, 于是便开始扯起了家常, 问我是哪里人, 哪个学校毕业的, 然后让我问他一些问题:
首先我问了他们项目是具体做什么的, 然后针对于他说的内容又问了他们主要使用了什么框架, 再就是问了项目的人员组成结构. 这里面问了好几个问题, 最后还是聊得很融洽
就这样一面就过了, 然后就是二面.
二面是个待了十几年的项目组大牛, 二面的话基本没有问太多的技术问题, 基本上就是聊一聊我在上个公司做的东西, 以及为什么要辞职, 以及我的一些价值观的东西, 聊了半个小时之后 就基本上结束了,他让我等一下,大概对我比较满意吧,跟苏微的人事商量了下,决定要我这个人了,然后苏微的人事就直接跟我谈工资,确认offer了。这一家的面试还算挺轻松。
(在这里要着重强调一点: 想好离职理由, 这一点真的很重要, 很多公司也是比较看重这个的.)
Q:怎么离职了啊?
PS:这里跟大家说一下,每个人结合自身的情况说一些比较实际的流程,比如,个人发展,为了家人等等,反正说的合情合理即可(不要说的自己都很难相信)。
A:我是说个人发展和未来的生活(离家近,再说南京的软件行业在全国也挺好的)。
面试结果,如下图:
No.2:南京慧明软件技术有限公司
公司地址:雨花台区宁双路28号汇智大厦A区十二层(离地铁口贼近--一号线 天隆寺)
面试结果:Java开发工程师,9.5K offer&13个月薪资.
面试过程:
一面: 人事面
这里和我之前面的两家公司不同, 第一轮是人事面, 问的问题就是为何辞职, 问了自己的人生规划, 问了自己的价值观的一些东西, 聊得还挺融洽, 紧接着就是二面了.
二面: 技术一面
面试官确实让我感觉到是个大牛, 他并没有看我的简历, 只是针对于我的工作经验来问了我三个题.
Q:你做一个自我介绍吧?
PS旁白:又是自我介绍。心想,又要自然优雅地背一遍的惨痛的人生史了。这里大家自由发挥,合情合理即可!
A:你们懂得。
Q:我们服务器在启动的时候 一瞬间有1000个访问, 那么如果使用一个HashMap去存储的话 你会设置初始值为多大?
A:其实这个问题我并没有正面的去回答设置多大的初始值, 我给他说了一下HashMap扩容的原理, 并说到了HashMap的阀值是和初始值大小和加载因子相关的, 然后说道要权衡空间复杂度和时间复杂度的情况. 感觉他对这个问题的回答还是比较满意的.
Q:我们是有700W的日活, 如果有一个方法的参数是(String cityCode)查询的话, 怎么去保证同步?
A:我说的是加synchronize或者加Lock, 接着他就问我这两种的区别, 问他们的性能哪个好. 然后我说在这个案例里面我们可以加Lock, 然后他就问我怎么加Lock去控制颗粒度来达到最好的效果?到了这里我真的是不知道了, 因为压根就不太了解Lock的机制, 但是他说没关系, 然后想一下怎么去做, 还提示我这个可以引用HashMap的设计思想.最后我想的就是这里对cityCode进行分组, 通过组去定位具体要查询的cityCode的位置. 对于这个答案他听后 觉得是可以提升一些性能, 但仍不是最好的. 最后的话给我说了下hash碰撞, 通过hash值取模来去颗粒度更精细, 其实这里我知道hashmap中也是通过hash值去定位数组的位置的. 这个问题就到这里了.
我自己又找了下HahMap中关于hashcode定位桶的位置的方法:
三面: 技术二面
二面的面试官是一个很风趣的人, 这次他是对着我的简历来问一些问题, 问的问题都是延伸的问题比较多.
比如看我做过购物车模块, 就问我做没做过秒杀模块, 看我做过商品模块, 就问我对于库存了不了解.
当我说不是太了解后 就让我当场想一下应该怎样去实现, 总之面试过程还是很有意思的.
这里我感受到的就是他们的思想很新潮, 他们更注重的是一个人的可塑性, 二面也很快面完了, 感觉这次面试官对我还是比较满意的, 紧接着就是人事来进行最后的四面了.
四面: 人事二面
这里更多的就是聊了一些公司的发展, 公司的待遇 以及我离职的主要原因。这里一般都是聊这些内容, 最后我同意和他们签约, 然后下午直接给我发offer了。
本次面试结果:
No.3:南京软通动力 -> 外派至南京华为
公司地址:江宁区科学园芝兰路18号(紫金科技创业特别社区内)
面试过程:
一面: 人事面
一轮面试很多都是人事进行面试的,首先会让你进行自我介绍,大概说一下自己的工作经历,然后会问你从上家公司离职的原因,满满的都是套路
二面: 技术面
面试官
Q:简单介绍一下自己吧?
PS旁白:这个问题基本上就是开场白,其实技术面试主要还是看你的技术的
A:其实简单介绍一下自己就行了,可以把跟人事说的那一套再说一遍。
PS旁白:回答问题一定要结合自己的语言,不要跟背书似的,就像聊天一样,给人一种自信的感觉
Q:先说一下Java的八种基本数据类型?
A:java分四类八种基本数据类型,整型:byte、short、int、long;浮点型:float、double;字符型:char;逻辑性:boolean
Q:简述一下集合(重点问了ArrayList和LinkedList的底层)?
A:我们常用的集合,一种是单列集合collection,collection是list和set的父接口,一种是双列集合map;list集合里面可以存储重复的元素并且元素是有序的,set集合不可以存储重复元素并且元素存储是无序的;(然后重点问了list集合)list集合有:ArrayList、Vector、LinkedList其中ArrayList和Vector在底层都是用数组来存储数据,插入时就会创造一个新数组并把数据全部转移至其内,由于数组的特性,根据索引查询数据,所以增删慢,查询快;LinkedList内部结构是双向链表,即保存一种含有前后索引的对象的引用的对象的方式,所以插入时只需要更改有限几个对象内的引用就可以了,但是如果要以索引取出对象就麻烦了。在正着顺序遍历或倒着遍历时LinkedList性能也很好,只是在随机读取(按索引读取)时损耗高,所以查询慢增删快;Vector是线程安全的,效率比较低,开发中我们常用的是ArrayList和LinkedList
Q:说一下string、stringbuffer、stringbuilder之间的区别?
A:String类中使用字符数组保存字符串,用“final”修饰,所以string对象是不可变的,是一个常量,是线程安全的;StringBuilder与StringBuffer两种对象都是可变的,StringBuilder并没有对方法进行加同步锁,所以线程不安全,StringBuffer线程是安全的,所以StringBuilder效率比StringBuffer高
Q:说说Struts2和springmvc的区别?
A:1、Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。
2、由于Struts2需要针对每个request进行封装,把request,session等servlet生命周期的变量封装成一个一个Map,供给每个Action使用,并保证线程安全,所以在原则上,是比较耗费内存的。
3、 拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。
4、SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。
5、Spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)。
6、 设计思想上,Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。
7、SpringMVC开发效率和性能高于Struts2。
Q:事务的特性以及隔离级别?
A:事务有四个特征,ACID特性:
原子性(Atomicity):即事务是数据库的不可分割单元,事务内的操作要么全部执行完成,如果有一个失败,则事务内的操作全部失败。
一致性(consistency):即事务必须使数据库从一个一致性状态变成另外一个一致性状态,原子性和一致性是密切相关的。
隔离性(isolation):即事务和事务之间没有影响关系,这个事务的执行不能被其它事务所干扰。并发执行的各个事务不能互相干扰,具有隔离性。
持久性(durability):如果事务对数据库进行了操作并进行了提交,则数据库对此的改变应该具有持久性,不能因为其它操作或者数据库的损坏而丢失数据。故事务应该具有持久性。
这是事务的四大特性,在并发情况下,事务会产生以下问题:
事务的隔离级别:
读未提交:在该隔离级别,所有事务都可以看到其它事务未提交的内容数据,此隔离级别没有解决任何并发问题,故在应用场景中不常用。
读已提交:在该隔离级别,一个事务只能读取其它事务已经提交的内容数据,此隔离级别解决了脏读,但没有解决不可重复读和幻读,是ORACLE的默认隔离级别。
可重复读:在该隔离级别,能保证一个事务之间的多个实例在并发能读取同一数据,此隔离级别解决了脏读和不可重复读,是MYSQL的默认级别。
串行化:这是最高的隔离级别,在此隔离级别,事务事务之间只能顺序执行,使之没有任何冲突,也就 是从而解决了脏读,不可重复读和幻读,此隔离级别效率较慢,并且有较多的超时现象。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发的效率就越低。一般情况下,采用读已提交或者可重复读,它能够有效避免脏读和不可重复读。
Q:spring的依赖注入和事务管理?
A:Spring是一个IOC容器,这种特性实现了类之间的关系松耦合。一个对象依赖其他对象会通过被动的方式传递过来,而不是主动的创建或者查找,Spring中实现依赖注入的方式有接口注入、Set方法注入、构造器注入;
spring提供了几个关于事务处理的类:
TransactionDefinition //事务属性定义
TranscationStatus //代表了当前的事务,可以提交,回滚。
PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。spring提供的事务管理可以分为两类:编程式的和声明式的,
1.声明式事务配置
1>配置sessionFactory
2>配置事务管理器
3>配置事务特性
4>配置哪些类的哪些方法配置事务
2.编程式事务配置
1>定义事务管理器
2>定义事务管理器的模板
Q:介绍一下你们的项目以及你在里面担任一个什么样的角色?
A:对整个项目的流程一定要熟悉,然后可以说一下自己负责的哪些模块,用了哪些技术等等。
PS:面试官会问你的项目上线了没有,我直接说项目已经开发完了,还处于测试阶段,应该还没有上线,大多数面试官都会在结尾问一句你有没有什么问题想问的,这个最好找几个问题问问他,比如:公司现在做的项目啊,用了哪些技术等等
三面: 人事二面
这里主要就是问你的薪资要求以及公司待遇,能接受的最低薪资、试用期是否能接受打折、最快入职时间,如果随时到岗,最多一两天就会发offer
本次面试结果:
薪资重点
这里统一说一下,基本上每家公司都要谈的。
怎么谈工资才是关键?经验如下:
1。看你投简历的时候,这家公司写的是面议还是写了具体的范围数字。例如:8000-12000.
1.1,面议的话,你就根据自身面试的情况来要,比如,南京市场价是8000,面试过程,自我感觉良好要就加1K到2K,如果你被虐了,就市场价。
1.2,写了具体的范围:他被你虐了,要最高价的减1K到2K。如果你被虐了,那么最低价或者最低价再减1K(不要低于市场价太多)
最终(主要看你个人是否想进入这家公司的意愿,有的公司真的很有技术积累和发展前景,例如做VR开发,有前景的等等,虽然工资可能低点,但是能去,眼光放远点)。
2。有时候,你和技术主管把工资谈好后,例如10000。但是发offer的时候,人事会给你打电话,说我们经过商量认为只能提供9000的待遇。你会来我们公司吗?这个时候你要hold住,不能妥协。
PS;这个时候,你不要心急。这99%是人事在卡你的工资而非技术主管的意思。这个时候你要绷住。你想人家技术主管都同意了,怎么会改呢?肯定是人事做的。你只要回答。低于约定的工资不去就行啦!她肯定按原来的定的工资给你发offer的。