正文
5月份一个很偶然的机会,加了叶神的微信,还收到了祝福。一激动就承诺说写篇最详细的面经分享给大家,毕竟用了这么久的牛客网,收获真的很大。
校招真的是段劳心伤神的经历,我把这一路的体会,写在秋招前,也许能给那些和我一样迷茫过,怀疑过,失落过的人一些帮助。
(这篇文章有点长,可能需要点耐心)
0. 写在之前
首先呢我的面试经历和一些面霸和收割机的大神相比绝不算丰富,但我这三个月应该能代表很大一部分人的心路历程:
从无忧无虑也无知的状态,然后遭遇挫败,跌入低谷,连续数天的黑暗,慢慢调整,逼着自己不能松懈,看到改变,收获肯定,分享经历。
先大概说下自己的面试经历吧
(详细的面试过程和面试题解析在最后)
:
相关的公司有四类
:
1、笔试就挂了的:网易、头条。(对于笔试这个东西我到现在都没太多经验)
网易是第一家参加笔试的,面试会报销费用去总部,所以还是有难度,这个公司呢,内推不内推都要参加笔试。所以笔试要好好准备(当然笔试也不好准备)
头条只有四道编程题,一个人做确实难度挺大的,尤其是工程为主,不太专搞算法的同学。
2、笔试过了但因为时间地点原因没去面试的:京东、小米、去哪、携程、招银。
这几个公司面试一定要现场,很多都要求去总部,还不报销路费。所以在遇到这种情况时,大家要有选择的安排,毕竟时间和精力都是有限的。
3、最终参加面试的:
·阿里(电话2面,很轻松地就挂了)
·腾讯(现场2面,很久之后hr电话说要转C++,就只能算了)
·百度(电话2面+经理面,offer)
·滴滴(视频2面+现场终面,offer)
·360 (视频2面+hr面,offer)
·美团(电话2面+hr面,offer)。
阿里呢大家都知道,恨不得把全国学生都面一个遍,对于这种策略我只想说三个字,晚点投(下面会解释)。
腾讯的面试体验还是很好的,会在酒店的房间里,安静舒适。只是java的同学可能要被问到很多C++和网络的知识,建议还是提前准备一下。
百度内推都是电话面,会在某网站实时写代码,感觉百度的面试官都很不错,给我的体验也很好。内推的时候最好注意下部门,在一个好的部门和边缘部门还是差别很大的。
滴滴面试比较晚,外地可以先视频面,最后会有现场面,报销花费。工作体验很不错,内部氛围很好,因为成立时间短业务扩展太快,技术方面正在沉淀期,工作还是比较有挑战性的。
360要先笔试,然后可以视频面试。这个公司比较稳定,业务也都很成型,实习的话留用率还是比较高的。
美团的话印象比较深,因为我是二月底内推的美团,然后内推没面我,三月正常笔试通过,然后待面试两个多月。。估计是补招了才给我打的电话(我都已经准备入职了)。经验就是一定要选一个事业群,最开始选都喜欢的大多是以为这样机会多,相反这样很多部门由于自己的简历池太满而顾不上捞你。
4.还有一投简历就沉的外企:Amazon、FreeWheel(不知道是他们只收北京生源,还是我英文简历写的太烂了)
文章最后的面经当然只包括第三种因为笔试这东西真的不好讲,杂七杂八什么题都有,编程题大多人也要看发挥。
然后这是我最直观的感受:
offer = 心态 * (实力 + 面试技巧) + 缘分运气
我就从左到右说起吧。
1. 心态
其实每个阶段的改变,也都是心态转变的过程,所以首先要说的一点,就是心态。在上面这种公式里,心态作为一个因子存在。没错,心态可以影响你面试的准备,笔试的状态,实力的发挥,可以影响一个面试过程的方方面面。心态崩了,就只剩运气了,offer估计也就走远了。
那怎么调整自己的心态呢?
·
首先是要正视自己的能力。不轻视,不高估。
不轻视指的是我们都要对自己有信心,毕竟选了这个行业和方向,说句不好听的话,机会那么多,就算你不怎么努力也会有个差不多的offer不是么?千千万万的初中创公司,各种拥有垂直领域稳定份额的二三线公司甚至有些已经上市,除此之外还有银行,投资,金融的IT岗,还有各行各业为了互联网+的策略而扩展的互联网分支(当然像链家这种已经算互联网+传统行业的典范了,我前些天还瞅到了像万达德勤一类的各行业巨头也在招程序开发...)所以啊,要对自己有信心,在这个行业十分缺人的年代里(当然各个层次的公司缺人的标准是不一样的),总不至于会失业吧。
不高估就是要清楚自己的能力范围,不是说期望过高不好,但过高的期望会让你的心理变得脆弱,稍有不顺心态就有崩掉的趋势。因为面试毕竟有太大的偶然性,就算你达到了一定的水平,相应水平的岗位也不是百发百中的,更不要说身边有那么多大神和收割机,天天拿offer拒offer,对心理都是不小的冲击。
·
不要总给自己消极的暗示,心态差了积极调整。
大多数的人,总暗示自己说什么时间不多了,怎么每天过这么快效率怎么这么低。到笔试了,跟自己说这个算法太难了,肯定做不出来;临到面试了,跟自己说千万别问我linux内核,别问我分布式,问我肯定完;面试过之后,没有结果,就天天想肯定又挂了,唉我怎么这么菜。
如果这一系列的表现形成习惯,那心态这个系数最多0.5,能发挥出来的东西也都打了一半的折扣。凡事都不要太悲观,一个offer没拿到,正常情况是这个失败的经历产生的经验和总结是会让下一次的成功率提高的,千万别因为这些消极的暗示,反而让该有的提高都没有了。
心态差的时候反而要停下你重复而没有效率的工作,去调整一下,可以出去玩一玩,吃吃喝喝,不要把这几个月看得有多么不一样,好像耽搁两小时就要来生再见一样。
·
对于身边的同学,多交流,不比较。
有一些一起准备的好伙伴是件非常好的事情,不仅可以互相督促,而且可以在交流和分享的过程中取长补短。(哪怕是偶尔一起吐吐槽发泄一下也比一个人崩溃要好得多)。但对于每一次面试,只跟自己比就行了,面试的整个过程都是最怕比较的,偶然性大,而且每个人适合的方向和技术栈都不一样,结果不能说明一切问题。如果身边有些收割机,那更不要太在意这些天天拿offer的(尤其是拿一个就跑过来讲一句的,他们也许没有恶意,但他们可能真的想不到这种方式会对别人产生怎样的冲击)。
对自己的水平有个很清楚的认识,并选择自己合适的公司,好好准备自己的笔试、面试,不怕失败,但保证每次面试都有收获和提高,那满意的offer早晚会来。
2. 实力
这里说的实力指的是硬实力,也就是技术上的真实积累(当然产品岗的就是对于产品相关知识的积累),而其实呢软实力在面试过程中也尤为重要(有时候真的要更重要),主要是指和面试官的沟通,对一个问题的阐述方式和表达方式,逻辑思维能力以及的价值观和为人等。
然后关于这个软实力我想放到下面的技巧中去说。
如果你平时有些项目积累,不擅长也从来没有怎么系统地总结过;如果你学习呢不算那么认真刻苦,研究搞得也不算出众,但是你该努力的时候也会努力,可以为了一个好的工作逼自己一把。
那也许下面说的实力和技巧都可以在一定程度上帮到你。(因为我就是这样的情况)
·
实力怎么能体现出来
这么说是因为很多人其实在这些年的项目或是学习中有一些积累,但是在刚开始面试的时候完全感觉使不出力,就是有种你问的我都能讲上一点,但根本说不清楚的感觉。(往深了问自然是完蛋)
知识面或者或者说技术栈都是有宽度和深度的,我们要做的就是在短时间内提升宽度,抓住以往本身就熟悉或是感兴趣的几个点去深入。
我是认为知识的
宽度可以很大程度上决定你能不能通过面试
(这里说的宽度并不是简历上了解、知道或者你都没往简历上写,仅仅是听说过的层面修饰的方面,而是写熟悉的那种,通俗地说是可以讲清原理,不涉及横向对比和优化的方面)
一两个点的
深度呢在保证你能通过面试的同时
(尤其是你的点正好cover了对方部门的技术栈),
并且还是影响offer等级的关键因素。
(达到足够的深度,不只能说出原理,还能进行横向技术对比,纵向的延伸技术,优劣点及优化,或者在这个点写了几篇很透彻的博文,更厉害的同学甚至有相关的开源项目的参与与贡献)
关于怎么提升宽度和深度可以看下面的积累(其实说真的短期内宽度是好补的,深度确实要看个人,是代价较高,性价比不一定高的一方面,看自己的决定吧)
所以我的建议是,先把宽度提上来,把你能cover的知识点及原理搞懂是第一步。建议对自己之前的项目和技术积累做一个总结和分类(可以参考下面的技术路线),然后对已经了解的方面尽可能延伸,对盲区或是薄弱的地方进行针对性的学习和练习。
当你的知识面覆盖到一定程度的时候,你自然会把他们的联系搞明白,慢慢理解这整个技术体系,在面试的过程中结合表达技巧可以关联起来说各个方面,也就可以很大程度上展现自己的真实实力(更厉害的同学甚至可以有超出自己真实实力的表现。。)
·
实力包含哪些方面
(我也只是脑子里过了一遍,肯定有遗漏的,大家自己补全就行了,毕竟每个人的知识覆盖范围也不同)
1. 基础知识:
1. 算法和数据结构
1. 数组、
链表、二叉树
、队列、栈的各种操作(性能,场景)
2. 二分查找和各种变种的二分查找
3. 各类排序算法以及复杂度分析(
快排、归并、堆
)
4. 各类算法题(手写)
5. 理解并可以分析时间和空间复杂度。
6. 动态规划(笔试回回有。。)、贪心。
7. 红黑树、AVL树、Hash树、Tire树、B树、B+树。
8. 图算法(比较少,也就两个最短路径算法理解吧)
2. 计算机网络
1. OSI7层模型(TCP4层)
§ 每层的协议
§ url到页面的过程
2. HTTP
§ http/https 1.0、1.1、2.0
§ get/post 以及幂等性
§ http 协议头相关
§ 网络攻击(CSRF、XSS)
3. TCP/IP
§ 三次握手、四次挥手
§ 拥塞控制(过程、阈值)
§ 流量控制与滑动窗口
§ TCP与UDP比较
§ 子网划分(一般只有笔试有)
§ DDos攻击
4. (B)IO/NIO/AIO
§ 三者原理,各个语言是怎么实现的
§ Netty
§ Linux内核select poll epoll
3. 数据库(最多的还是mysql,Nosql有redis)
1. 索引(包括分类及优化方式,失效条件,底层结构)
2. sql语法(join,union,子查询,having,group by)
3. 引擎对比(InnoDB,MyISAM)
4. 数据库的锁(行锁,表锁,页级锁,意向锁,读锁,写锁,悲观锁,乐观锁,以及加锁的select sql方式)
5. 隔离级别,依次解决的问题(脏读、不可重复读、幻读)
6. 事务的ACID
7. B树、B+树
8. 优化(explain,慢查询,show profile)
9. 数据库的范式。
10. 分库分表,主从复制,读写分离。
11. Nosql相关(redis和memcached区别之类的,如果你熟悉redis,redis还有一堆要问的)
4. 操作系统:
1. 进程通信IPC(几种方式),与线程区别
2. OS的几种策略(页面置换,进程调度等,每个里面有几种算法)
3. 互斥与死锁相关的
4. linux常用命令(问的时候都会给具体某一个场景)
5. Linux内核相关(select、poll、epoll)
5. 编程语言(这里只说Java):
1. 把我之后的面经过一遍,Java感觉覆盖的就差不多了,不过下面还是分个类。
2. Java基础(面向对象、四个特性、重载重写、static和final等等很多东西)
3. 集合(HashMap、ConcurrentHashMap、各种List,最好结合源码看)
4. 并发和多线程(线程池、SYNC和Lock锁机制、线程通信、volatile、ThreadLocal、CyclicBarrier、Atom包、CountDownLatch、AQS、CAS原理等等)
5. JVM(内存模型、GC垃圾回收,包括分代,GC算法,收集器、类加载和双亲委派、JVM调优,内存泄漏和内存溢出)
6. IO/NIO相关
7. 反射和代理、异常、Java8相关、序列化
8. 设计模式(常用的,jdk中有的)
9. Web相关(servlet、cookie/session、Spring、Mybatis、Tomcat、Hibernate等)
10. 看jdk源码
2. 项目经历
o 这个每个人的项目不同,覆盖的技术也不一样,所以不能统一去说。
o 这里的技巧呢,在下面也会详细说明。
o 无非是找到自己项目中的亮点,简历上叙述的简练并且吸引眼球,同时自己要很熟悉这个点(毕竟可以提前准备)
o 最好自己多练,就像有个剧本或者稿子一样,保证面试中可以很熟练通俗地讲出,并且让人听着很舒服。
3. 实习经历
o 这个很抱歉,因为我是找实习的经历,所以也没有实习经历的讲述经验。
o 但我想如果你有实习经历,那面试过程的重点也会在实习做了什么上面,所以大家最好对实习所做的工作做一个总结,并且同样抓出亮点,搞懂内部原理,提前锻炼讲述的过程。
4.其他扩展技能(这个方方面面太多了,全部掌握基本上不可能,只是作为大家其他时间扩充技能的参考)
5.
o 分布式架构:(了解原理就行,如果真的有实践经验更好)
§ 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等)
§ 分布式事务、分布式锁等
o 脚本语言:(只是作为横向扩充,一般问到linux也会问问shell脚本)
§ python
§ php
§ shell
§ golang
§ ...
o 大数据与数据分析:
§ hadoop生态圈(hive、hbase、hdfs、zookeeper、storm、kafka)
§ spark体系
§ 语言:python、R、scala
§ 搜索引擎与技术
o 机器学习算法:
§ 模型和算法很多。不细说了,如果很熟练就去投算法,国内很多公司都算法岗都很稀缺,其他岗可以大概了解下理论。
o 其他工具的理论和使用:
§ 这个更多了,问的多的比如git、docker、maven/gradle、Jenkins等等,自己需要的话选择性地去学。
6.实力要怎么积累
7.积累实力最好的方式就是平时在项目中或是学习中,多学多问,多思考多钻研。这里就说说短期内学习的一些方法和路径:
总结下来,一方面是通过看书、看视频、看面经来不断扩展自己的知识面,一方面是通过不断的面试积累经验和知识盲区,在每次总结的过程中积累实力。
先说说看书学习这一点
这里应该是有个推荐书籍的环节,这几个月确实看了不少书,但是并不是所有都有很高的性价比,在这边大概列一下,前后顺序也一定程度上代表了我认为的重要度先后,'/'做分割的是一类的书籍,一般来说看一个就够了:
书单:
算法与数据结构:
数据结构(严蔚敏)/大话数据结构 //如果觉得教材无聊就可以看大话系列,印象中里面还有很多诗
剑指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到记事本中,第二天找个固定的时间短查询解决和总结。长期下来会养成一个很好的习惯,你的知识点会不断地扩充。
·
o
在一次次面试中提高
这一点其实跟刚刚看面经的那个很类似(那个我不是叫做模拟面试了吗),每次面试完,一定要把自己不会的东西尽快记下来(当然你如果有记面经的习惯就更好了,还能再分享出去),然后找时间弄懂和总结。
除了知识点,每次面试(跟模拟面试不同的地方)还要总结的是哪里发挥得不好,哪里有可以提升的地方,下次一定要注意之类的。(就是有关面试技巧的东西,比如这次语速太快,导致面试官反馈了,又比如这次发现对方让你在纸上画个项目逻辑图突然一时脑梗,那回去就好好在本上画一遍)
3. 技巧
·
一些自身的软实力
软实力这个东西与面试的准备关系不大,基本上是长期形成的。
包括和面试官的沟通(有的时候也会成为聊天瞎扯的能力);对一个问题的表达方式,逻辑思维(像有些人的发言就让人听上去很有层次感,很舒服,这方面欠缺的可以推荐玩玩狼人杀);除此之外对方也会很在意你的价值观和为人(这个是我进了公司发现的,很多公司在内部的面试细则上面都会注明这一点,如果价值观或是人品问题会直接否决。)想想也是有道理的,因为这个是入职之后能不能好好相处的关键,设想如果你是一个面试官,面对一个有实力但是说话太有棱角聊不太来的和一个不算出众但基础不错很听话可以培养的,你会选哪一个?(如果你因为生活太平淡了想选第一个,那这一条当我没说。。)