斩获BAT-offer大神的两万字面试干货分享

0.写在最前

首先呢个人面试经历和一些面霸和收割机的大神相比毫不算丰富,但我这三个月应该能表明很大一部分人的心路历程:从无忧无虑也无知的状态,而后遭遇挫败,跌入低谷,连续数天的黑暗,慢慢调整,逼着本身不能松懈,看到改变,收获确定,分享经历。php

先大概说下本身的面试经历吧(详细的面试过程和面试题解析在最后):
相关的公司有四类:前端

  1. 笔试就挂了的:网易、头条。(对于笔试这个东西我到如今都没太多经验)

网易是第一家参加笔试的,面试会报销费用去总部,因此仍是有难度,这个公司呢,内推不内推都要参加笔试。因此笔试要好好准备(固然笔试也很差准备)
头条只有四道编程题,一我的作确实难度挺大的,尤为是工程为主,不太专搞算法的同窗。java

  1. 笔试过了但由于时间地点缘由没去面试的:京东、小米、去哪、携程、招银。

这几个公司面试必定要现场,不少都要求去总部,还不报销路费。因此在遇到这种状况时,你们要有选择的安排,毕竟时间和精力都是有限的。python

  1. 最终参加面试的:
  • 阿里(电话2面,很轻松地就挂了)
  • 腾讯(现场2面,好久以后hr电话说要转C++,就只能算了)
  • 百度(电话2面+经理面,offer)
  • 滴滴(视频2面+现场终面,offer)
  • 360 (视频2面+hr面,offer)
  • 美团(电话2面+hr面,offer)。
  • 阿里呢你们都知道,巴不得把全国学生都面一个遍,对于这种策略我只想说三个字,晚点投(下面会解释)。
  • 腾讯的面试体验仍是很好的,会在酒店的房间里,安静温馨。只是java的同窗可能要被问到不少C++和网络的知识,建议仍是提早准备一下。
  • 百度内推都是电话面,会在某网站实时写代码,感受百度的面试官都很不错,给个人体验也很好。内推的时候最好注意下部门,在一个好的部门和边缘部门仍是差异很大的。
  • 滴滴面试比较晚,外地能够先视频面,最后会有现场面,报销花费。工做体验很不错,内部氛围很好,由于成立时间短业务扩展太快,技术方面正在沉淀期,工做仍是比较有挑战性的。
  • 360要先笔试,而后能够视频面试。这个公司比较稳定,业务也都很成型,实习的话留用率仍是比较高的。
  • 美团的话印象比较深,由于我是二月底内推的美团,而后内推没面我,三月正常笔试经过,而后待面试两个多月。。估计是补招了才给我打的电话(我都已经准备入职了)。经验就是必定要选一个事业群,最开始选都喜欢的大可能是觉得这样机会多,相反这样不少部门因为本身的简历池太满而顾不上捞你。
  1. 还有一投简历就沉的外企:Amazon、FreeWheel(不知道是他们只收北京生源,仍是我英文简历写的太烂了)

文章最后的面经固然只包括第三种由于笔试这东西真的很差讲,杂七杂八什么题都有,编程题大多人也要看发挥。mysql

而后这是我最直观的感觉( 我就从左到右提及吧。):linux

offer = 心态 * (实力 + 面试技巧) + 缘分运气

1. 心态

其实每一个阶段的改变,也都是心态转变的过程,因此首先要说的一点,就是心态。在上面这种公式里,心态做为一个因子存在。没错,心态能够影响你面试的准备,笔试的状态,实力的发挥,能够影响一个面试过程的方方面面。心态崩了,就只剩运气了,offer估计也就走远了。c++

那怎么调整本身的心态呢?git

首先是要正视本身的能力。不轻视,不高估。 程序员

  • 不轻视指的是咱们都要对本身有信心,毕竟选了这个行业和方向,说句很差听的话,机会那么多,就算你不怎么努力也会有个差很少的offer不是么?千千万万的初中创公司,各类拥有垂直领域稳定份额的二三线公司甚至有些已经上市,除此以外还有银行,投资,金融的IT岗,还有各行各业为了互联网+的策略而扩展的互联网分支(固然像链家这种已经算互联网+传统行业的典范了,我前些天还瞅到了像万达德勤一类的各行业巨头也在招程序开发…)因此啊,要对本身有信心,在这个行业十分缺人的年代里(固然各个层次的公司缺人的标准是不同的),总不至于会失业吧。golang

  • 不高估就是要清楚本身的能力范围,不是说指望太高很差,但太高的指望会让你的心理变得脆弱,稍有不顺心态就有崩掉的趋势。由于面试毕竟有太大的偶然性,就算你达到了必定的水平,相应水平的岗位也不是百发百中的,更不要说身边有那么多大神和收割机,每天拿offer拒offer,对心理都是不小的冲击。

不要总给本身消极的暗示,心态差了积极调整。

  • 大多数的人,总暗示本身说什么时间很少了,怎么天天过这么快效率怎么这么低。到笔试了,跟本身说这个算法太难了,确定作不出来;临到面试了,跟本身说千万别问我linux内核,别问我分布式,问我确定完;面试过以后,没有结果,就每天想确定又挂了,唉我怎么这么菜。

  • 若是这一系列的表现造成习惯,那心态这个系数最多0.5,能发挥出来的东西也都打了一半的折扣。凡事都不要太悲观,一个offer没拿到,正常状况是这个失败的经历产生的经验和总结是会让下一次的成功率提升的,千万别由于这些消极的暗示,反而让该有的提升都没有了。

  • 心态差的时候反而要停下你重复而没有效率的工做,去调整一下,能够出去玩一玩,吃吃喝喝,不要把这几个月看得有多么不同,好像耽搁两小时就要来生再见同样。

对于身边的同窗,多交流,不比较。

  • 有一些一块儿准备的好伙伴是件很是好的事情,不只能够互相督促,并且能够在交流和分享的过程当中取长补短。(哪怕是偶尔一块儿吐吐槽发泄一下也比一我的崩溃要好得多)。但对于每一次面试,只跟本身比就好了,面试的整个过程都是最怕比较的,偶然性大,并且每一个人适合的方向和技术栈都不同,结果不能说明一切问题。若是身边有些收割机,那更不要太在乎这些每天拿offer的(尤为是拿一个就跑过来说一句的,他们也许没有恶意,但他们可能真的想不到这种方式会对别人产生怎样的冲击)。

对本身的水平有个很清楚的认识,并选择本身合适的公司,好好准备本身的笔试、面试,不怕失败,但保证每次面试都有收获和提升,那满意的offer迟早会来。

2. 实力

这里说的实力指的是硬实力,也就是技术上的真实积累(固然产品岗的就是对于产品相关知识的积累),而其实呢软实力在面试过程当中也尤其重要(有时候真的要更重要),主要是指和面试官的沟通,对一个问题的阐述方式和表达方式,逻辑思惟能力以及的价值观和为人等。

而后关于这个软实力我想放到下面的技巧中去说。

若是你平时有些项目积累,不擅长也历来没有怎么系统地总结过;若是你学习呢不算那么认真刻苦,研究搞得也不算出众,可是你该努力的时候也会努力,能够为了一个好的工做逼本身一把。

那也许下面说的实力和技巧均可以在必定程度上帮到你。(由于我就是这样的状况)

2.1 实力怎么能体现出来

这么说是由于不少人其实在这些年的项目或是学习中有一些积累,可是在刚开始面试的时候彻底感受使不出力,就是有种你问的我都能讲上一点,但根本说不清楚的感受。(往深了问天然是完蛋)

知识面或者或者说技术栈都是有宽度和深度的,咱们要作的就是在短期内提高宽度,抓住以往自己就熟悉或是感兴趣的几个点去深刻。

我是认为知识的宽度能够很大程度上决定你能不能经过面试(这里说的宽度并非简历上了解、知道或者你都没往简历上写,仅仅是据说过的层面修饰的方面,而是写熟悉的那种,通俗地说是能够讲清原理,不涉及横向对比和优化的方面)

一两个点的深度呢在保证你能经过面试的同时(尤为是你的点正好cover了对方部门的技术栈),而且仍是影响offer等级的关键因素。(达到足够的深度,不仅能说出原理,还能进行横向技术对比,纵向的延伸技术,优劣点及优化,或者在这个点写了几篇很透彻的博文,更厉害的同窗甚至有相关的开源项目的参与与贡献)

关于怎么提高宽度和深度能够看下面的积累(其实说真的短时间内宽度是好补的,深度确实要看我的,是代价较高,性价比不必定高的一方面,看本身的决定吧)

因此个人建议是,先把宽度提上来,把你能cover的知识点及原理搞懂是第一步。建议对本身以前的项目和技术积累作一个总结和分类(能够参考下面的技术路线),而后对已经了解的方面尽量延伸,对盲区或是薄弱的地方进行针对性的学习和练习。

当你的知识面覆盖到必定程度的时候,你天然会把他们的联系搞明白,慢慢理解这整个技术体系,在面试的过程当中结合表达技巧能够关联起来讲各个方面,也就能够很大程度上展示本身的真实实力(更厉害的同窗甚至能够有超出本身真实实力的表现。。)

2.2 实力包含哪些方面
(我也只是脑子里过了一遍,确定有遗漏的,你们本身补全就好了,毕竟每一个人的知识覆盖范围也不一样)

基础知识

1.1算法和数据结构

  • a.数组、链表、二叉树、队列、栈的各类操做(性能,场景)
  • b.二分查找和各类变种的二分查找
  • c.各种排序算法以及复杂度分析(快排、归并、堆)
  • d.各种算法题(手写)
  • e.理解并能够分析时间和空间复杂度。
  • f.动态规划(笔试回回有。。)、贪心。
  • g.红黑树、AVL树、Hash树、Tire树、B树、B+树。
  • h.图算法(比较少,也就两个最短路径算法理解吧)

1.2计算机网络

  • OSI7层模型(TCP4层)
    • 每层的协议
    • url到页面的过程
  • HTTP
    • http/https 1.0、1.一、2.0
    • get/post 以及幂等性
    • http 协议头相关
    • 网络攻击(CSRF、XSS)
  • TCP/IP
    • 三次握手、四次挥手
    • 拥塞控制(过程、阈值)
    • 流量控制与滑动窗口
    • TCP与UDP比较
    • 子网划分(通常只有笔试有)
    • DDos攻击
  • (B)IO/NIO/AIO
    • 三者原理,各个语言是怎么实现的
    • Netty
    • Linux内核select poll epoll

1.3数据库(最多的仍是mysql,Nosql有redis)

  • 索引(包括分类及优化方式,失效条件,底层结构)
  • sql语法(join,union,子查询,having,group by)
  • 引擎对比(InnoDB,MyISAM)
  • 数据库的锁(行锁,表锁,页级锁,意向锁,读锁,写锁,悲观锁,乐观锁,以及加锁的select sql方式)
  • 隔离级别,依次解决的问题(脏读、不可重复读、幻读)
  • 事务的ACID
  • B树、B+树
  • 优化(explain,慢查询,show profile)
  • 数据库的范式。
  • 分库分表,主从复制,读写分离。
  • Nosql相关(redis和memcached区别之类的,若是你熟悉redis,redis还有一堆要问的)

1.4 操做系统:

  • 进程通讯IPC(几种方式),与线程区别
  • OS的几种策略(页面置换,进程调度等,每一个里面有几种算法)
  • 互斥与死锁相关的
  • linux经常使用命令(问的时候都会给具体某一个场景)
  • Linux内核相关(select、poll、epoll)

1.5 编程语言(这里只说Java):

  • 把我以后的面通过一遍,Java感受覆盖的就差很少了,不过下面仍是分个类。
  • Java基础(面向对象、四个特性、重载重写、static和final等等不少东西)
  • 集合(HashMap、ConcurrentHashMap、各类List,最好结合源码看)
  • 并发和多线程(线程池、SYNC和Lock锁机制、线程通讯、volatile、ThreadLocal、CyclicBarrier、Atom包、CountDownLatch、AQS、CAS原理等等)
  • JVM(内存模型、GC垃圾回收,包括分代,GC算法,收集器、类加载和双亲委派、JVM调优,内存泄漏和内存溢出)
  • IO/NIO相关
  • 反射和代理、异常、Java8相关、序列化
  • 设计模式(经常使用的,jdk中有的)
  • Web相关(servlet、cookie/session、Spring、Mybatis、Tomcat、Hibernate等)
  • 看jdk源码

2. 项目经历

  • 这个每一个人的项目不一样,覆盖的技术也不同,因此不能统一去说。
  • 这里的技巧呢,在下面也会详细说明。
  • 无非是找到本身项目中的亮点,简历上叙述的简练而且吸引眼球,同时本身要很熟悉这个点(毕竟能够提早准备)
  • 最好本身多练,就像有个剧本或者稿子同样,保证面试中能够很熟练通俗地讲出,而且让人听着很舒服。

3.实习经历

  • 这个很抱歉,由于我是找实习的经历,因此也没有实习经历的讲述经验。
  • 但我想若是你有实习经历,那面试过程的重点也会在实习作了什么上面,因此你们最好对实习所作的工做作一个总结,而且一样抓出亮点,搞懂内部原理,提早锻炼讲述的过程。

4.其余扩展技能(这个方方面面太多了,所有掌握基本上不可能,只是做为你们其余时间扩充技能的参考)

  • 4.1 分布式架构:(了解原理就行,若是真的有实践经验更好)
    • CAP原理和BASE理论。
    • Nosql与KV存储(redis,hbase,mongodb,memcached等)
    • 服务化理论(包括服务发现、治理等,zookeeper、etcd、springcloud微服务、)
    • 负载均衡(原理、cdn、一致性hash)
    • RPC框架(包括总体的一些框架理论,通讯的netty,序列化协议thrift,protobuff等)
    • 消息队列(原理、kafka,activeMQ,rocketMQ)
    • 分布式存储系统(GFS、HDFS、fastDFS)、存储模型(skipList、LSM等)
    • 分布式事务、分布式锁等
  • 4.2 脚本语言:(只是做为横向扩充,通常问到linux也会问问shell脚本)
    • python
    • php
    • shell
    • golang
  • 4.3 大数据与数据分析:
    • hadoop生态圈(hive、hbase、hdfs、zookeeper、storm、kafka)
    • spark体系
    • 语言:python、R、scala
    • 搜索引擎与技术
  • 4.4 机器学习算法:
    • 模型和算法不少。不细说了,若是很熟练就去投算法,国内不少公司都算法岗都很稀缺,其余岗能够大概了解下理论。
  • 4.5其余工具的理论和使用:
    • 这个更多了,问的多的好比git、docker、maven/gradle、Jenkins等等,本身须要的话选择性地去学。

5.实力要怎么积累

  • 积累实力最好的方式就是平时在项目中或是学习中,多学多问,多思考多钻研。这里就说说短时间内学习的一些方法和路径:

  • 总结下来,一方面是经过看书、看视频、看面经来不断扩展本身的知识面,一方面是经过不断的面试积累经验和知识盲区,在每次总结的过程当中积累实力。

先说说看书学习这一点
这里应该是有个推荐书籍的环节,这几个月确实看了很多书,可是并非全部都有很高的性价比,在这边大概列一下,先后顺序也必定程度上表明了我认为的重要度前后,'/'作分割的是一类的书籍,通常来讲看一个就够了

书单:

  • 算法与数据结构
    • 数据结构(严蔚敏)/大话数据结构 //若是以为教材无聊就能够看大话系列,印象中里面还有不少诗
    • 剑指Offer/程序员面试金典/编程珠玑/编程之美/牛客网+leetcode
    • 程序员笔试面试最优解(左程云)/不如直接看左神的笔试面试指南视频
    • Java的版本(不是很推荐):
    • 数据结构与算法经典问题解析(Java语言描述)
    • 图解数据结构(使用Java)
  • 计算机网络:
    • 计算机网络(谢希仁)
    • TCP/IP 详解
    • HTTP权威指南
    • 图解TCP/IP
    • 图解HTTP
  • 数据库://数据库主要是多用,书上主要看索引和性能的部分
    • 高性能MySQL/深刻浅出MySQL
  • 操做系统:
    • OS原理:操做系统(课本,黑色的那个)
  • Linux:
    • Linux私房菜 //鸟哥写的,很全,包括bash部分
    • 跟阿铭学Linux //主要偏重于命令和操做,比较浅显
  • java:
    • Java疯狂讲义/Java编程思想/Java核心技术 卷1
    • 深刻理解Java虚拟机
    • 并发编程的艺术/多线程编程核心技术
    • Effective Java
    • Java程序员面试笔试宝典 //何昊的那本,我的感受是突击知识点的神器
    • Java程序性能优化
    • 实战Java高并发程序设计
  • Java Web:
    • Spring实战/轻量级JavaEE 企业应用(红皮,讲SSH的) //主要看最后一部分Spring的就能够
    • 深刻JavaWeb技术内幕(阿里 许令波)//这个讲的仍是比较深的
    • SpringBoot实战/深刻实践SpringBoot
  • 设计模式:
    • 大话设计模式 //通俗易懂
    • 各种博客的总结
  • 分布式与大数据:
    • 分布式服务框架原理与实践
    • 大型网站技术架构
    • Hadoop实战(hadoop体系包括得很全)
      //还有一本我暂时想不起来名字了
  • 其余:
    • Git:
    • Git权威指南
    • Git官方讲解视频(牛客网有带字幕的)
    • Redis:
    • Redis实战
  • 还买了docker、springCloud等等一些工具书,由于过小众就不列举了

除了上面说的书和视频,最有用的仍是你们分享的各类面经。

面经是个很不错的东西(嗯,想看的能够直接翻到最后一节)。记住不要一扫而过(除了那种岗位不太匹配能够快速抓重点看),岗位匹配的你能够顺着面经逐条去看,模拟一次面试过程(虽然是单向的,可是你内心应该是知道每一个问题你能答道什么层次),这种不断地模拟可让你知道盲点或者说弱点在哪,对于一个你内心没底或者想不太起来的问题必定要当时记下来或者当时就弄懂。

我当时是天天晚上在床上看几篇面经,而后把存疑的问题copy到记事本中,次日找个固定的时间短查询解决和总结。长期下来会养成一个很好的习惯,你的知识点会不断地扩充。

在一次次面试中提升

这一点其实跟刚刚看面经的那个很相似(那个我不是叫作模拟面试了吗),每次面试完,必定要把本身不会的东西尽快记下来(固然你若是有记面经的习惯就更好了,还能再分享出去),而后找时间弄懂和总结。

除了知识点,每次面试(跟模拟面试不一样的地方)还要总结的是哪里发挥得很差,哪里有能够提高的地方,下次必定要注意之类的。(就是有关面试技巧的东西,好比此次语速太快,致使面试官反馈了,又好比此次发现对方让你在纸上画个项目逻辑图忽然一时脑梗,那回去就好好在本上画一遍)

3. 技巧

一些自身的软实力

软实力这个东西与面试的准备关系不大,基本上是长期造成的。

包括和面试官的沟通(有的时候也会成为聊天瞎扯的能力);对一个问题的表达方式,逻辑思惟(像有些人的发言就让人听上去颇有层次感,很舒服,这方面欠缺的能够推荐玩玩狼人杀);除此以外对方也会很在乎你的价值观和为人(这个是我进了公司发现的,不少公司在内部的面试细则上面都会注明这一点,若是价值观或是人品问题会直接否决。)想一想也是有道理的,由于这个是入职以后能不能好好相处的关键,设想若是你是一个面试官,面对一个有实力可是说话太有棱角聊不太来的和一个不算出众但基础不错很听话能够培养的,你会选哪个?(若是你由于生活太平淡了想选第一个,那这一条当我没说。。)

这些软实力其实要在生活中慢慢锻炼,好比多参加些活动,多和别人沟通,发表意见前好好组织本身的语言等等。(每一个人都有每一个人的性格,这些都因人而异,但有一点咱们要记住的是在面试中,不论什么状况,都要保持冷静和清晰的头脑,和一个谦卑的态度,交流要坦诚<尤为做为应届生>,这样起码印象会好不少,要知道虽然面试有各类各样花式的打分项,可是印象好每每是隐藏的决定性因素)

关于面试的准备和技巧

面试的技巧首先就是刚刚说到的态度。 一个谦卑(注意不是自卑,也不是把本身放的很低的样子)和礼貌的态度和表达方式每每可让面试官的印象分提升不少,印象分很像以后要考察的实力分的系数。留个好印象,面试就成功了一半。(固然你必定也听过那种聊得很嗨,或者偶遇校友之类的,毛都没问就聊经过了的场景。这种状况仍是不算在技巧中了吧,应该属于运气和缘分的范畴。而大多时候聊得开心和舒服会让你感受到经过率会比较高,这一点不少人仍是深有体会的)

而后说一下面试以前能够作足的准备。

首先从简历开始说,简历怎么调格式,作几页,排版啥的就不想多说了,感受不少文章都分享过。我只说说技术方面的内容怎么写。

专业技能的描述谓词无非就那么几种:精通、熟练、熟悉、了解。(还有一级叫据说过,这个级别的可千万别往上写啊兄弟)

精通感受通常仍是不要写,除非你在某个技术点上真的有足够的把握,好比源码看的很透彻的同时还能深入理解原理并能灵活处理各类case场景,若是还有相关的开源贡献,那就自信地写精通吧。

咱们把本身掌握的大多数技术点叫作熟练掌握,这个须要咱们在以前对各个技术点进行横向纵向的复习和总结,并不仅是用的多有经验就行,有的时候咱们以为熟,但真让你说的时候殊不知道从何提及。

至于熟悉和了解,能够写一些本身理解原理可是不经常使用的技术点,尤为是比较流行的,各大公司都在用的技术(好比MQ,分布式缓存等等),这些你在学校不必定用过,可是你能够经过看博客,写demo去理解他的设计和原理,面试的时候能够讲得清楚。

这里还有个技巧,更细心的同窗能够针对每一个公司岗位的job detail不一样,熟悉和了解这块就针对jd中cover的技术点去写。这个作法是很聪明的,毕竟熟悉和了解这个层面是能够提早学习和准备的,有针对性的去写对方须要的,是提高经过率很好的一种方式。(若是嫌麻烦就算了,好比我就是)

下面再说说项目经历这块:叙述必定要精炼到位,细化到每个亮点上。我如今再看我二三月份的简历简直是有种想撕了的冲动,当时就是项目描述两三行,而后归纳下我大概作了哪几个模块。完了。

事实上,不能讲得这么泛泛,就从中找2-3个亮点,一句话高度归纳,突出亮点。

好比后来我就把我一个普通的web项目挖出来三个点(爬虫,通讯控制方面,安全加密方面),分别用一句话叙述,这一句话最好包括这个技术点的思路,解决了什么,有没有作什么优化。好比一个爬虫工具能够写成这样:

我负责这个系统中爬虫的开发,终端控制管理,店铺管理。。。。

是的,上面这个爬虫就占用了五个字,等于没说,面试官看到压根不知道怎么去问。这里还能够这样写:

负责系统中爬虫模块的开发,用于爬取影片的各类信息,包括年份,介绍,主演信息等。

这个起码告诉面试官爬虫作了什么,可是你并不能保证他会问,由于你的叙述不必定能引发他的兴趣。那还能够这么写:

独立开发多线程影片信息爬虫工具, 并针对线程池性能、网络异常以及反爬虫措施进行屡次优化,容错性良好并达到并发请求30+的QPS。

你以为面试官看到这句话,他不想问点什么吗(除非他真的就不想要你)。

因此说,其实面试官呢都是但愿在面试的过程当中发现咱们的亮点和优点,从而展开更深层次的交流,可是每每在简历中没有一个让他询问的入口,这样就可能致使他会随意问(好比你了解什么什么吗?通常状况下都不太乐观),或者就说那你来说讲吧(这种问法其实已经表达出他不知道怎么问的状况了,你在讲的时候必定要突出重点,不然会让人感受没什么亮点,普普统统的项目而已(固然就算是普通的项目,咱们也要挖掘它的价值和本身的价值不是))

咱们在面试的过程当中最重要的是本身掌握主动权,若是面试官问的都是咱们熟悉的范围和准备过的领域那咱们答起来也会更加驾轻就熟。而让面试官随着咱们简历中埋下的这些亮点(他就算知道你有意想说这一点,每每也会去问,由于他就是想在短期的面试中了解你处理问题的能力),去进行更深层次的交流,而这个更深层次的交流,还须要咱们针对简历上的每一句话,都准备多个层次和维度的扩展。

好比仍是这个爬虫,你能够充分扩展线程池的相关优化(有可能项目中没有怎么优化甚至就是个单线程,可是在准备面试的过程当中仍是能够专门去作一些code重构的),优化网络的NIO相关扩展,以及反爬虫的各类各样的措施,以及爬虫方分别如何应对。这里只要你去想,能准备的东西太多了,面试多了天然也就愈来愈熟,好像项目就是作得这么完美同样。

这里我就不怎么扩展去说了,再讲下去这篇文章就写不完了。。。

最后是面试中的技巧和经验。

  1. 好好对着本身写的简历一行一行看一遍,这都是你挖的坑,是准备给面试官做为切入点交流的,并非本身往里跳的。(对每一行都要有足够了解和把握)

  2. 面试过程没关系张,尤为是前几回,建议先从小公司入手锻炼下面试经验(参考我以后自身的反面教材

  3. 面试方式不一样,侧重点不一样(无非是电话、视频、现场三种)。

  • 电话面试建议找我的少安静的地方坐着回答,而且建议拿纸笔多作记录多画多写。(固然若是你以为身边不少朋友可让你越聊越嗨那也能够,坐着是让你整个节奏慢下来,说话明显更加沉稳,亲身体会过站着走来走去和坐着的区别)
  • 视频面试其实和电话相似,只是能够实时写代码,面试官能看到你的表情。这里仍是要放松,若是你比较紧张,能够不直视镜头,好好想问题就是了,由于不少面试官你答得好也会面无表情(由于他们也不常视频,表情都很尴尬),而后你看到他们没表情的表情确定会受影响。
  • 现场面呢,最重要的是和面试官互动了,说几个点:语气要轻松点,多点肢体动做有助表达,多笑;不太好说清的就用笔在纸上画,一遍画一边讲,面试官也会更容易和你交流;若是你能够时不时幽默一下开开玩笑是更好了;见面和离开记得礼貌地握个手说声谢谢。
  1. 学会平等交流,别把本身身段放的过低。其实有一点你要清楚,面试是个双选的过程,他能够拒绝你,你也能够拒绝他。千万不要太上赶着,反而会影响本身正常的表达和逻辑。(就跟你见了喜欢的姑娘就不会说话了一个道理)

  2. 回答问题的时候不要一口气把知道的所有说完,而后还毫无条理。学会一个知识点由浅入深讲解给面试官,而且留有余地给他进一步去问。

举个例子:

  • 就说最简单和广泛的HashMap,让你讲讲,你就能够先说说hashMap的设计原理,底层结构(链表+数组)扩容方式等,从这你就能够说说这种设计好在哪里(好比讲一讲put是如何作hash的),这时候你能够说这种hash可能会有冲突,hashMap也是作了相应设计
  • 而后面试官会问题你怎么解决冲突?你能够再给他讲讲解决hash冲突的三种一般方式,而hashMap用的是链式法,而后能够说到这样会有隐患就是hash链过长。
  • 面试官再问,你会给他讲解决复杂度高的长链用了红黑树的结构,这里还能够延伸到红黑树的特色或者jdk7和jdk8的不一样实现,这时候你能够说解决hash冲突,但hashMap还会有并发和同步的问题。
  • 面试官会让你再讲讲,你能够说说hashtable是线程安全的,怎么实现的(sync函数),并很差,从而引出更好的juc包,说说concurrentHashMap,以后又能够说道锁分段原理,弱一致性迭代器,concurrentHashMap的锁粒度(java7和java8不一样),同包的CopyOnWriteArray等等。
  • 你还能够延伸说到锁(重量、轻量、悲观乐观各自实现、底层源码等等)、缓存(由于不少时候Map的结构能够做为缓存,从而能够说到缓存系统的设计,kv原理,分布式缓存redis、memcashed等等)
  • 举这个例子就是想说,一个简单的基础问题能够一步一步有条理有层次的回答,每一层表达完抛个引子,让面试官能够继续问下去,从而让面试官真正了解你的掌握的深度。
  1. 若是真的不巧聊到不擅长的地方,学会转移话题,从一个点中聊本身感兴趣或是有把握的方面(好比你对消息队列不太熟可是redis用的熟,你就能够在问到消息队列的时候说,由于以前都是本身作的项目嘛,性能方面没有考虑到最优,一些异步的方式仍是靠redis list去实现的,虽然redis的消息机制并不常见,但当时仍是知足了需求,以后能够考虑性能方面的提高和技术评估;又好比问你http请求细节,rest的设计实现细节,你能够说http restapi服务接口性能的一些不足,后来使用了rpc的方式,固然你这么说必定是要对rpc很了解)其实有的时候面试官是知道你是有意转移的,可是每每他们也不会抓着你不会的去问,非让你本身认可本身的盲区,他们也许根本不在乎这些。

  2. 若是真的被问到不会的,就直接说你不会(说你不会、说你不会,我再补充两遍),或者礼貌地说这方面可能我还要多学习。(对一个拿不许的问题千万不要猜,即便是二选一的那种问题,猜错了直接完蛋,猜对了被人看出来,再往深问仍是完蛋)另外,像可能,大概是,我以为这种表达最好不要,一听就是对一个点没把握,有可能会让面试官以为学习太浮躁不喜欢寻求原理。
    那对于本身知道原理(确实是理解了的)可是没用过的东西,就讲讲原理,并认可本身实践不足,表现出好学的态度。面试必定要真诚。

  3. 问到有什么offer就直接说,不要藏着掖着,也不要把更好的offer(好比bat的)讲的很是诱人,一副bat我都拿到了的样子(面试官会心想,那你还来面试咱们干什么)。再强调面试过程必定要真诚。除了直接说,诚实点以外,也要真的作些思考:对方公司跟以前的offer比优点在哪,好比平台更大?专业技能栈更match?工做更有挑战力?地点更合适?有机会留用?随便一条符合的均可以讲出来,起码让对方以为你想来面是有缘由的而且真的有可能加入。(若是你还提早了解对方公司的文化,能够讲出这个文化本身很认同那就更能够了)

4. 缘分和运气

关于这一点只有一句:平时多作好事,热爱生活。
其实都知道面试要讲缘分,讲运气,但人每每能够在很顺利地经过面试以后说句运气好运气好,却很难在努力准备却失败的经历以后保持平静。
但无论能不能转运是否是本命年有没有缘分,努力和收获的关系老是多年不变的真理。
因此,讲心态,讲实力,讲方法。足矣。

下面是面试的详细过程,包含面经:

按时间顺序,详细叙述一下我面试的过程,包括面经和心态的转变:
括号里是对问题的补充,若是感受有知识点的盲区,你们正好能够去深刻学习一下。这里说一下我投的大可能是Java研发岗,因此其余语言的能够忽略java问题

首先说一点,复习准备必定要早(固然这是说给19届师弟师妹们听的,嗯大家看到这里已经能够开始复习了),有同窗去年暑假剑指offer都刷了一遍,而后我居然今年3月才买这本书。。还有同窗前一年冬天就已经去实习了,这种机会也不错。但寒假若是不实习的,必定要进入到学习状态。我准备的就有点晚,寒假彻底没看书,真正开始准备,大概是2月中旬号玩了一夜狼人杀以后。

就是那个时候发现校招就要开始了,而后开始慌了。大概看了一周的书(基本上都是java基础),而后师兄说阿里内推了,心想赶忙投吧要不人家招够了就不招了(后来发现都5月6月了还在招。。),而后就慌慌忙忙投了简历。

这里我要说一点最重要的事情: 必定不要在没有面试经验的状况下先面大厂,或者是你想去的公司。

我是3月1日下午三点半在阿里的官网完善的简历,5点电话就过来了。做为一个java coder,阿里是个很好的平台,(固然C++的岗能够好好准备腾讯),必定仍是准备充分了再投,你先面的结果极可能是焦急地等一两个月而后被后来准备充分再来面试的人取代。

阿里 3.1,3.2(两面)

两天各面了一面(投的蚂蚁金服,第一天面的就不太好,次日又把我捞起来面,而且面完感受就走远了,但当时却没有reject,这就致使以后一个月一直在流程中,阿里其余事业部的师兄师姐没办法把个人简历提走,最终到要笔试了而后变成了rejected)

那个时候就是处于我所说的无知状态,知识点掌握的不够牢,简历写的乱七八糟,面试经验为零(这应该是我上学以来的第一次面试),面试技巧就更不懂了。

而后当时两次都感受聊得不好(尤为是聊算法模型的时候都想自爆了),也根本没有记录面经的想法。因此有些问题我都记不起来了,大概说一下吧。

  • hashMap的扩容原理,初始有13个,要怎么new?(达到了负载因子,直接手动>>1)
  • Integer的常量缓存池的问题(-127~128范围有个cache)
  • ConcurrentHashMap的size()怎么作的(并无彻底加锁,而是先乐观的认为不会有写,经过modCount判断是否更改,这个我当时记不清就用了不少可能、大概、应该这种词,事实证实直接说不清楚会更好)
  • Spring的AOP关于拦截private方法一些问题.(细节忘记了,当时答得也很差)
  • 项目中数据字典怎么作的缓存,如何作的通讯,有没有用什么模块。(说了本身的作法,用的全局的HashMap,而后他会延伸到高并发的场景,分布式缓存怎么作等等,因为没实际操做经验提早也没准备,而且尚未直接说不会,又是用不少模棱两可的语句答得)
  • 讲讲你的论文相关的模型吧(这个其实在简历上根本没写,只是写了数学建模的奖,而后面试官就开始问机器学习的算法,不少都是我没准备的,而且我心想我投的也不是算法岗啊。。。因此说对于简历上的每一条必定要熟悉,作足准备,而且遇到简历上没有都扯到的方面,要想办法转移,不要在这耗着)
  • 讲完算法的问题,面试官很尴尬的说了句,你这本身的研究方向你都搞不清楚吗?我当时预感就差很少走远了。。。
  • 其余问题真的过久远了,我当时也没有记面经的习惯,因此就没有了。可是最大的感觉是面阿里的时候整我的都是紧张的状态,语速特别快,巴不得把知道的都说出来,没有条理,而且把本身姿态放得特别低,还在楼道不停走来走去。(对,以上说的这几点全都是不该该的,但主要缘由仍是当时准备太不充分,简历方面的准备以及知识点的积累都不够;另一点,仍是要强调不会的就是不会,千万别说大概是,我以为吧这种东西,说的很差很容易让面试官认做不懂装懂,虽然你只是很想向面试官表达点什么,哪怕只是积极的态度)

  • 从阿里面完试开始个人心态基本上就崩掉了,对本身极度怀疑,加上今年诸事不顺,心情直接跌到了低谷。而后整个三月基本上都是黑暗的,整个一个月都没再投内推,天天从早晨起来,大多时间就在看书刷题,晚上十点回宿舍躺在床上,还要刷两个小时牛客的面经。一个月下来不多说话,提高确定是有,可是这个过程,其实彻底能够用更好的心态去经历。

  • 而后这段极其黑暗痛苦的日子持续到三月底,一个师兄想帮我内推百度,由于以前由于没信心也错过了腾讯的内推,就心想要不试一下吧。

百度(123面)

一面 3.30 下午两点 45mins

  • 自我介绍,印象最深最费心的项目(这个一套能够提早准备,在某些亮点能够估计抛出等面试官来问)
  • 讲讲项目中的爬虫和优化怎么作的,为何选用jsoup而没有用python的urllib
  • 说说你了解的反爬虫措施,和针对异常的处理。
  • 那你觉的你来作一个网站要从哪些方面考虑反爬虫。

这里能够提早和学习,即便你真正使用的只是一点,也能够在相关问题上作更深的了解。
最简单只分析请求,拦截全部非浏览器的直接请求(能够经过添加伪报头解决);查看refer页作防盗连接(能够改refer项);基于用户行为的策略,同一ip类似请求断定(代理或ip池,或间隔请求解决);基于用户session的策略(模拟多用户登陆解决);封装前端数据,用js渲染生成(经过探取和模拟异步ajax请求解决);对ajax请求进行加密等等方法。

  • 讲讲项目中怎么实现的充值,锁的机制和事务注解,如何保证了事务的一致性。
  • spring层面作事务和数据库层面作的区别,各自实现方式。
  • 聊了事务的传播性和隔离级别,问了mysql的默认隔离级别(可重复读)
  • spring中事务传播性怎么配置(xml方式和注解方式,还有关于savepoint的使用)
  • 算法:O(1)删除执行链表结点,作分析(实际上是要指出剑指offer中那个直接copy值的方法的缺陷和隐患)
  • 算法:二叉树的最长距离(递归的思想)

二面 3.30 下午五点 50mins

  • 聊项目(此次是针对项目中的加密算法和安全性作了阐述,大概20分钟吧,以前爬虫那个例子已经说了项目亮点要怎么准备了,这里我就很少说了)
  • 详细聊了聊spring的IOC和AOP思想
  • 关于AOP在spring的应用(好比事务,通知,aspectJ,slf4j的原理,和log4j的对比)
  • 关于jdk代理和cglib第三方代理(说出对接口代理和子类继承的区别)
  • 用的什么数据库,Mysql。
  • 最大的数据量多大,用了索引没有,怎么用的(聊了前缀索引,对于varchar类型的值,又聊了聊char,varchar,text,blob的关系和区别)。
  • 为何索引不能随便用,何时用(何时失效,何时最高效)。
  • 如何达到索引开销和性能的平衡,用了一个表去举例。(方法就是,根据情境看常常作的查询是哪些,而后依次是什么查询条件,保证最高效索引的同时,也保证索引不失效,避免无效开销,而且根据show profile和explain功能进行对比分析)
  • 数据库用了缓存没有,讲讲redis的理解(用做缓存,队列,也可作存储)。
  • redis是单线程仍是多线程的,举个例子(作计数器,rank排行榜)
  • 讲讲hbase的原理,CloumnFamily包含哪些,region什么状况作分割,对于版本号这个第四维度的使用方式(通常默认三个版本)等等
  • 让我等消息,说经理会联系我。

经理面 4.12 中午 40mins

  • 经理面其实更加放松,不仅是技术方面,还有生活,性格多方面,感受是个技术+hr的综合面。
    聊家庭,家乡,工做意愿,爱好等等(聊了十几分钟,感受都很不错,而后以后的面试也就很轻松了,基本是我在讲他在听)
  • 讲了讲项目的设计,包括异常的处理,数据库设计,通讯模型的设计。
  • 讲讲你理解的JVM吧(从内存划分说到了GC算法、分代思想,CMS和G1 collector,到类加载模型,tomcat的非双亲委派、线程上下文加载器,到JVM调优的策略,gc参数设置策略,如何找死锁,读快照,发现内存泄漏等等吧)
  • 而后说了下部门的技术栈和部门介绍,说了部门可能没有留用的hc,问我介不介意(当时还没offer固然说不介意只是但愿去学习)
    而后就说把我简历锁了,以后会给我发offer。
  • 其实到如今我都很感谢百度,虽然最后由于部门和留用hc的缘由没有去,可是此次面试收获最大的就是信心。而且经理电话里就给了口头offer,这个让我悬了一个多月的心一会儿就放下来了,接下来的几天乃至以后的面试整我的都是放松的状态。(真的很难形容,这种转变就在这一个电话的先后)
  • 因此,其实你们也迟早会有这一天,不必一直那么紧张的状态,太痛苦了。(虽然我知道这种话说得简单),另一点就是三月份确实有了很大的提升,这个告诉咱们,该逼本身的时候仍是要狠心一点。

360(123面)

有了信心或者说有一个offer以后,你就会愈来愈顺利,从这以后的每次面试都会有不一样程度的收获。360的流程是走得最顺利的,笔试+面试,三次面试一天完成,可是360的面经可能写得稍微简单一点,由于不少知识点在后面的面试中也出现了,就没有作过多解释,腾讯滴滴美团的面经要详细一些。

360一面 4.12

  • 自我介绍加项目
  • 线程池如何优化的爬虫,数据规模
  • 网络时延如何处理
  • 同名影片如何选取,有没有更好的方式。
  • 反爬虫的原理,从低级到高级说一下,分别如何应对
  • 收获了什么
  • 线程进程区别
  • 说下资源方面的区别,共享,不共享
  • 共享的具体哪些资源
  • jvm内存模型
  • 堆区的特色
  • 数据库左链接右链接,场景
  • 给200个200个数的数组,找到最大的200个
  • git 经常使用的操做,git rebase和git merge区别
  • 分布式数据库怎么调用
  • linux经常使用命令,查看内存,查看磁盘使用率

360二面 4.12

  • 聊项目,介绍下背景,怎么谈的
  • 印象最深的模块及解决,其余项目呢,跟着老师作的,还有简历上没写的项目
  • 项目经验还能够那基础怎么样本身以为,
  • 说下jvm吧你知道的,中间会问
  • jvm详细以下
  • 内存模型
  • 垃圾回收
  • 分代及回收算法
  • 哪些做为gc root
  • 收集器的特色分类
  • 类加载机制和双亲委派模型
  • 几个加载器
  • tomcat类加载有什么不一样,说加载顺序并非双亲模型,具体顺序说一下
  • 并发注意什么,线程实现同步的方式,通讯
  • 几种同步的区别
  • 悲观锁乐观锁,底层怎么实现的,越详细越好
  • 单例模式的特色,几种实现,容易引起的问题
  • 如何防止内存泄露,哪些会容易形成
  • jvm调优如何检查内存泄露,如何优化gc参数
  • 写sql 查询带日期屡次考试成绩表中,每一个学生的每门课最高成绩,日期要准确
  • 分别用having子句写和用子查询写
  • 写代码 旋转数组中查找某一个值

360 三面 hr 4.12

这是惟一一篇hr面经,由于我只面过这一次hr,其余的三面要么是技术,要么只是打个电话说说状况,还没问问题就挂了电话(好比腾讯的)。

  • 讲一下项目怎么接的,怎么跟甲方沟通,遇到的最大问题,怎么克服的
  • 本身的项目和老师的项目和安排怎么协调。
  • 平时有什么爱好,怎么安排本身的时间
  • 摄影都去哪拍,喜欢什么运动,何时运动
  • 为何选咱们部门,其余部门你怎么看
  • 咱们是作移动端后台的,喜欢玩手机吗
  • 说说经常使用的app平时怎么用,频率
  • 之后会不会创业,为何
  • 之后的规划,职业技术和生活两方面

hr面没有太多经验,我的生活爱好这类我感受就是放轻松聊,规划方向这些能够本身提早准备准备,可是好比创业,offer(以前说过了),价值观一类的问题,其实你也不知道对方想要什么样的回答,干脆随缘吧。

腾讯 (12面)

腾讯的面试有一点印象很深,很考察思惟能力,常常会有一些意想不到的问题,或者智力题。挺有意思。

一面 4.23

  • 上来看了个人简历问我会不会C++,我心想虽然学过,可是好几年不写,仍是说不会吧,而后面试官很好,就不问了。
  • hashmap底层结构画一下,手写代码作一个url解析器,用正则方式和hashMap的数据结构。
  • 识别2的n次方,写个函数。(最快的是用位操做,你们应该都知道n&(n-1)能够去掉二进制最右的1,那2的n次幂&以后便为0)
  • 本身实现http response响应头的结构及解析,用buffer(写个伪代码)
  • resp头中都有什么(主要考察http相关知识)
  • 海量数据找到出现次数最多的100个(内存不足的时候能够先作hash分片,最后多路merge,每次操做能够用hashMap计数,也能够本身作hash函数计数)
  • redis底层实现,zset数据结构(问到了SkipList跳表这种结构)
  • jvm内存模型,分代,cpu100% 怎么排查(我觉得问Jconsole的使用,实际上是想问linux性能监测和调优)
  • 用int值表示ip如何作(恰好32位bit一对一映射),写个伪代码作transfer
  • nio模型说一下
  • selector中的wakeup什么含义(这个答得不是很好)
  • select poll epoll (linux内核相关的知识)
  • arraylist.sort怎么实现的(这个能够看看TimSort的思想)
  • 怎么看待java跟c++(说下区别和本身的感觉)
  • 能实习多久(这个好说)
  • 去深圳工做怎么看(这个真没想过,不过当时说也能够吧)
  • 有女友吗(…)

二面 4.24

二面其实就两个大问题,但一直往很深的地方问。

  • 100亿个数找最大1000个(说了分片,用堆,再归并)
  • 问你肯定吗?(我一想是最大的1000个不是出现次数最多的,实际上是能够顺序读取,仍是用堆实现)
  • 有什么缺点,分布不均匀(说一下堆的复杂度由来)
  • 有没有其余思路(用hash散列,计数排序)
  • 这个更慢,还有更快的吗(我心想我平时就都是答得堆啊,怎么此次还有更快的?)
  • 而后讲了基于partition的划分思想(找到第k个开始partition,在左边就在右面递归,在右面就在左边递归,最后肯定partition出最大的k个)
  • 这种思想了解了,但最坏状况太差,不稳定,还有更快的吗
  • 是否是要用几率统计学,抽样估计?
  • 说下思想。。
  • 不够精确,还有又精确又稳定的吗?
  • 。。。
  • 那又给你一个数,你怎么快速告诉我是否是在这100亿个数中?
  • 这个我知道有多是想问Bloom Filter,可是具体到hash函数去几个怎么算,怎么判断偏差等细节,我也记不太清了,就说了说思想。
  • 而后进入第二个问题:
  • 一个进程最多申请多大空间(看机器cpu的处理位数看状况)‘
  • 怎么保证进程间数据的安全?线程呢?
  • 安全方面有没有作过一些研究?
  • 登陆验证怎么作的,为何用md5,有没有改进(+salt使md5库难解出),微信用的什么方式- 你知道吗?你想一想应该用什么方式?(这里多是问SSO单点登陆的原理吧,能够讲讲SSO JWT token等技术的原理,这个也是我实习以后了解到的,当时答得通常)
  • 那说到通讯安全,怎么保证http的安全性,幂等性,回调同一个会话怎么标识不一样请求,不一样- 会话怎么区分(这个每一个问题都画图叙述了下)
  • TCP 3次握手和timewait讲一下原理
  • 讲一下滑动窗口,饱和了怎么处理
  • http安全吗?https说一下?
  • get和post请求
  • linux怎么查看网络状态(vmstat)
  • 查看udp的性能,udp端口多少,何时用udp?
  • 为何tcp不行?
  • qq里哪些用的tcp哪些用udp?分别针对每种状况说一下为何?
  • 能够看到腾讯仍是很爱问网络通讯、大数据处理的(固然C、C++也很爱问,只不过我说了别问,他们就真没问,固然你作java的也不要指望他们会问你多少java问题)
  • 而后当时并无hr面,我心想应该是挂了,可是微信的状态又迟迟没挂,结果到了一个月以后五月底我都回家准备入职了(绝对又是补招的备胎),而后打电话问问我的状况(也没说是否是准备给offer),问可不能够去深圳,转C++方向。
  • 当时也有比较好的机会了,而且实习转岗,若是不肯定能留下,绝对是不建议作的一件事,因此就实话实说了。

滴滴新锐(123面)

一面 5.12

  • 说说你对现有Web开发框架的理解(从各个层入手横向对比优缺点,印象中说了SpringMVC和Struts,mybatis和hibernate及jpa)
  • mybatis和hibernate各自的缓存原理和比较,hibernate的一级二级和查询缓存,还有针对缓存的miss率,置换策略,容量设置和性能的平衡问了本身的理解。
  • 要你设计的话,如何实现一个线程池(就讲线程池的原理,从初始线程数,核心线程数,而后到任务队列,满了继续到最大线程数,再满了到饱和策略handler,饱和策略通常有哪几种,基本上要理解ThreadPoolExcuter的构造方法那几个参数)
  • synchronized关键字,实现原理(和Lock对比着说,说到各自的优缺点,synchronized从最初性能差到jdk高版本后的锁膨胀机制,大大提升性能,再说底层实现,Lock的乐观锁机制,经过AQS队列同步器,调用了unsafe的CAS操做,CAS函数的参数及意义;同时能够说说synchronized底层原理,jvm层的moniter监视器,对于方法级和代码块级,互斥原理的不一样,+1-1可重入的原理等)
  • 算法:手写一个ArrayList类,实现add,remove,等基本的方法(主要考扩容的原理和实现,重点写出扩容机制以及扩容时的copy过程)
  • 而后让对这个ArrayList进行改进,使之能够应对并发的场景
  • 算法:手写字符串的正则匹配,实现*和.的功能,用的递归(写了一半他说时间差很少了,思想大概了解了)。

二面 5.12

  • 说说你认为项目中技术最薄弱的一个地方(答了IO网络监控和通讯模块,短链接性能太差)
  • 举例说说在什么状况下会出现性能瓶颈,如何优化(答了用NIO的方式)
    NIO的原理,jdk中有哪些工具和类去实现,如何实现(selector和channel的用法),真的好用吗?还能够用什么?(面试官应该是想问netty,由于没有实际用过,只能给他讲了netty的原理)
  • 那来讲说AIO吧,和NIO什么区别(对异步的理解),AIO在工程中如何实现的?(大概说了下ajax的回调函数),又问回调函数具体是怎么实现的(传递函数指针)。
  • 而后借着异步IO想问消息队列,讲了一下几种模型和原理。(面试中没有用过不要紧,只要你懂原理仍是能够跟面试官讲,起码能够证实你是爱学习的)
  • 项目中非技术上的困难(和甲方沟通需求,没有规范化的项目设计,需求变动太频繁等),问了我解决的方法还有之后但愿怎么改进。(变相问互联网公司里面各个team以及需求方是如何合做和分工的)
  • 讲讲Spring中怎么对初始化的bean作其余操做。(这里有三种方式,@PostConstruct注解方式,init-method的XML配置方式,InitializingBean接口方式)
  • 三种实现上有什么区别(还好看过点源码,其实前两种是一个意思,都是经过反射的方式用aop思想实现,能够消除对spring的依赖;接口方式是直接调用afterPropertiesSet方法,效率更高点。spring加载bean时先判断接口方式,再执行配置注解方式)
  • 算法题,一个先减后增的数组,查找目标值。(这里并非查找最值,也不是剑指offer上的旋转数组,可是思想上也能够用二分的方式)
  • 算法题,两个大数求和,要按高到低位的输入,实时输出结果的对应位,空间O,时间O(n),不借助工具类。(要考虑实时的进位标识,以及多个9以后的连续进位标识)

两面完了电话让去参加新锐的现场终面,颇有诚意地报销了全部的花销。新锐的三面仍是有难度,基本上围着算法在问。

三面 5.12

  • 算法:int范围的随机数的阶乘编码实现。
    (这个题若是直接按最简单的算法题确定是不行的)

1.首先考虑要用字符串作运算(由于中间数太大了,只有String能保存,固然你能够借助BigInteger或BigDecimal类去辅助实现)。
2.阶乘直接计算代价太大,循环太多,考虑设计中间缓存。(正常算复杂度过高,自己就是阶乘级的,因此正常想到用时间换空间)
3.只用空间换时间的话缓存也不能覆盖所有,若是把全部的中间值保存,空间是eb级别,不现实。(这里就要达到一个空间和时间复杂度的平衡点)
4.存部分中间值用部分空间换取时间,达到空间复杂度和时间复杂度的最优平衡。(开始说的二分作分割存储以后改成等间隔作分隔存储,间隔选取多长为好?我以为要首先肯定空间复杂度的接受极限,而后尽量减少时间复杂度,由于空间复杂度是能够有预估值的,而时间复杂度固然咱们是但愿约小越好的)

(这里说一下,我并非一开始都想到了,只是面试官一直在提示我思路,给我时间思考,没有否认过我)

  • 由于头一次手写白板,返回类型有错误,面试官说你这个编译器会提示什么?
  • 又问了异常体系,checked unchecked虚拟机原理怎么作。
  • 解释下iaas.paas.saas和之间的关系,外呼接口和服务怎么调用的。
  • 数据库主从备和读写分离原理,ibatis怎么配置。(这个只讲了数据库层面的原理,好比监听线程,主机和从机的同步方式等,可是具体代码层面的配置,因为没亲自作过,就说不太知道。)
  • 算法,股票最长增加区间,优化
  • 算法,最长递增子序列,一个dp数组一个max数组,最优状况
  • ps:这个面试官应该是面试过程当中遇到最nice的一个,也是我如今的老大。其实面试除了自身的因素也有面试官的因素,一个好的面试官不会随便地否认和质疑你(固然有专门压力面的),而是可让你在放松的环境下,挖掘你真正对于一个方面的深度和理解。最后的十几分钟他并无问我问题,只是在跟我聊天,他跟我说无论是哪一个公司,真正的发展仍是跟部门的方向和氛围有关系,选择的时候不要只看公司,作的业务部门方向和leader才是该去了解和考虑的。做为应届生不少时候不那么了解,这就要靠咱们(指面试官)多去了解你想发展的方向。而后聊了不少成长路径和规划的事。
  • 真正实习到如今一个多月,深深以为面试就是面试,不少知识和题目都是能够准备的,而工做中面对各类状况解决问题的能力和方式才是更重要的。为了面试准备了不少,工做了发现要学的东西更多,咱们真的还有很长的路要走。

美团(123面)

1面 1hour 5.26

  • java基础,从头至尾问了个遍,都是你们准备的,可是也挺深的,包括:
  • hashMap,红黑树处理冲突,jdk7和jdk8有什么区别
  • JUC相关的集合,ConcurrentHashMap jdk7和jdk8的区别,Collections.sort函数jdk7 和 jdk8 分别怎么实现的。(总感受这个面试官在某段时间确定纠结过两个版本)
  • CopyOnWriteList底层是什么,适用的状况,vector的特色,实现的是List接口吗。
    并发的问题,线程间通讯三种方式
  • 锁的膨胀过程,Synchronized和Lock的区别,底层的monitor实现和unsafe类的CAS函数,参数表示什么,寄存器cpu如何作)
  • volatile cpu和寄存器层面是怎么实现的。
  • 线程池构造函数参数,各类类型的预设池各自的特色,ForkJoinPool是怎么实现的,多线程等等问了一个遍。
  • 为何匿名内部类的变量必须用final修饰,编译器为何要这么作,不然会出现什么问题
    数据库:
  • 索引的分类。
  • 主键索引和普通索引的区别,组合索引怎么用会失效。
  • 索引的前缀匹配的原理,从B树的结构上具体分析一下。
  • 汇集索引在底层怎么实现的,数据和关键字是怎么存的。
  • 组合索引和惟一性索引在底层实现上的区别(这个是整个一面感受答得很差的一个问题,不太明白面试官想问啥)
  • sql的优化策略,慢查询日志怎么操做,参数含义。
  • explain 每一个列表明什么含义(关于优化级别 ref 和 all,何时应该用到index却没用到,关于extra列出现了usetempory 和 filesort分别的缘由和如何着手优化等)
  • show profile 怎么使用。

2面 1hour 5.27 (由于这一面问得很深,因此到如今都记得很清楚)

  • 一个url到页面全过程(让我能说多详细说多详细,最好从OSI七层的每一层去扩展)
  • http的请求头格式(这个真的记不太清了,只说了几个有印象的标志位)
  • getpost区别,post可不能够用url的方式传参。
  • 说到了url有最大长度,就问长度有限制是get的缘由仍是url的缘由,为何长度会有限制,是http数据包的头的字段缘由仍是内容字段的缘由,详细说明。(在他一步步追问下答了个差很少)
  • 关于幂等性的详细介绍。
  • 幂等性是http层面的问题吗,仍是服务器要处理和解决的内容。(就是看你对幂等性的定性是怎么理解的)
  • 后台服务器对于一个请求是如何作负载均衡的,有哪些策略,会出现什么样的问题,怎么解决。(说了一致性hash算法,分布式hash的特性,具体的应用场景,又非要问我知不知道这个最先在哪一个公司使用的…我说这个真不知道。好像是amazon?)
  • 说说http的缺点,无状态,明文传输。
  • 那https是怎么作的,如何实现的?ca认证机构。
  • 而后问我https ssl tcp三者关系,其中哪些用到了对称加密,哪些用到了非对称加密,非对称加密密钥是如何实现的。(还好我项目中涉及到了一些加密)
  • 关于加密的私钥和公钥各自如何分配(客户端拿公钥,服务器拿私钥)
  • 那客户端是如何认证服务器的真实身份,详细说明一下过程,包括公钥如何申请,哪一层加密哪一层解密。
  • java的优先级队列,若是让你设计一个数据结构实现优先级队列如何作?
  • 用TreeMap复杂度过高,有没有更好的方法。
    hash方法,可是队列不是定长的,若是改变了大小要rehash代价太大,还有什么方法?
  • 用堆实现,那每次get put复杂度是多少(lgN)
    (思想就是并不必定要按优先级排队列的全部对象,复杂度过高,但每次保证能取最大的就行,剩下的顺序不用保证,用堆调整最为合适)
  • 在线编程题:敲一个字串匹配问题,写了常规代码。问kmp的代码思想,最后问了下正则中用的改进后的BM算法。(还有个比较新奇的Sunday算法,有兴趣的同窗也能够看一下)

3面 hr

  • 其实写了3面,感受根本不算面试了,就是随便介绍了下部门,而后商量实习时间(大概补招都这样吧)。由于已经决定去滴滴新锐了,就跟她说可能暑期不能实习,而后说能够秋招再联系。
  • 另外美团这家要跟师弟师妹们说一声,投简历必定仍是要选事业群的,千万不要选都喜欢,不然就算过了笔试,也会像我这样等两个月大概是补招才会联系到你。

写在最后

其实你们能够从这个过程当中看出来,随着时间的推动,本身的知识储备和各方面的经验和能力都是上升的。

总结几句:

  • 对本身要有个定位
  • 准备永远都不嫌早不嫌多
  • 心态差了及时调整
  • 面试挂了及时总结
  • 这么多年也该逼本身一把了

一两次甚至一系列的失败并不可拍,成功以后反而没有失败总结得透彻,收获的多。失败的经历会让你不断提高能力,成功的经历会让你不断提高信心。而无论成功失败都会提高你的经验,都会有收获。

因此不要惧怕失败,由于迟早会成功。

愿你们都能拥有满意的结局。

文章出处

做者:XiaoTeng
连接:
https://www.nowcoder.com/discuss/29890
已与做者进行私信联系,任何人转载此篇文章,文章出处这一栏都不能够删除。

公众号做者乔戈里亲历2019秋招,哈工大计算机本硕,百度准入职java工程师,欢迎你们关注个人微信公众号:程序员乔戈里,公众号有3T编程资源,以及我和我朋友(准入职百度C++工程师)在秋招期间整理的近200M的面试必考的java与C++面经,并有天天一道leetcode打卡群与技术交流群,欢迎关注。