微信公众号:javafirst
背景介绍
楼主某末流985渣硕一枚,磕盐不会,偶然接触了下编程,然后又稍微学了学Java,后面就走上了程序猿的道路,今年四月侥幸去菊厂实习了一波(虽然没学到东西)。
秋招拿了几个一般的offer(大佬们别见笑):去哪儿、海康威视、招银网络科技,最后签约招银(四川人,想每天下班吃火锅)。
去年的时候比较迷茫,不知道自学到底需要准备什么,在牛客上看了很多面经,非常受益,今天也分享一下供参考。本篇文章主要讲讲自学的历程即找工作需要注意的地方。
=================================================================================================================
自学经历
楼主去年4、5月开始决定学习Java,最开始主要看《Head First Java》(该书配有大量插图及段子,入门佳选,入门切忌《Java编程思想》),然后看了大量的培训班视频学习了Java基础知识,数据库,Java常用框架(很多人看不起培训班,培训班的质量确实参差不齐,但是由于针对基础薄弱的童鞋,所以老师讲的特别清楚,以我校学子来看学着肯定非常轻松,我一般开1.6倍到1.8倍的速度听)。在8月份的时候开始接触算法和数据结构,刚开始一头雾水,这算法和数据结构到底学习谁先谁后啊,做题看不懂,看书不太好理解。这里推荐《算法第四版》,配有大量的图,让你详细理解数据结构设计的过程(入门切忌《算法导论》)。搞完这些之后,有幸加入了一个工作室,(工作室由于刚成立事情不多后面也解散了,东西没有学到太多但是认识了几个朋友)在工作室期间,看了《程序员面试金典》、《剑指offer》,在牛客网上刷了剑指offer上的题(刚开始做题基本上做不了,先想然后看别人的解答仔细思考,再自己慢慢敲,做多了可能就有感觉了)。后续又看了《高性能MySQL》(大部头,有时间必看,时间少选看)、《深入理解Java虚拟机》(必看,忘了就看,主要是垃圾回收算法、类加载那一块,其它章节可以选看)、《并发编程的艺术》(必看,主要了解一下锁的原理)、《图解HTTP》、《图解TCP/IP》(日本人写的书,结合大量插图,看着很浅显易懂)、《Java程序员面试宝典》(完全的面试知识点罗列的书,评分较低,但是对于梳理知识点是非常适合的)、《数据结构与算法分析 Java语言描述》(觉得算法第四版少了点什么的话可以看这个补充)。这些书再结合大量的博客可以基本覆盖校招的知识点。
在今年三月份时各大公司开始招聘实习生,楼主水平有限去了华为实习,方向也是Java软开。由于所在小组全栈式开发,在里面耗费了大量时间学习了前端知识(前端依然菜的抠脚),所以整体感觉上实习提升不大。实习了四个月之后,在八月底结束实习,由于部门原因通知没法转正。当时心里很气然并卵,觉得自己在里面提升不大又耽误了很多准备的时间,不如在图书馆看书(这也是个教训,实习不一定有优势,如果实习打杂转正几率小的话不如在学校夯实基础准备校招)。所幸楼主在华为实习的时候每晚回去继续看书,同时在实习时有幸认识北研所一位实习老哥,每天用内部聊天工具跟他交流Java基础,基础尚不算太差。(这里想说一点的是,8月初很多公司就开始了内推招聘,现在内推特别泛滥,基本都要求笔试,笔试难度高于校招,没有准备的话基本gg,但最好都投一下试试水,楼主当时由于在实习算法没练好就网易过了笔试。。。)
ps:这里说点个人感悟,当初在准备实习时,以为刷完剑指offer、程序员面试金典,实习的题应该没啥问题了。实际情况是:实习题型基本全是动态规划(尤其是背包问题)、图搜索,如果早做准备,那完全没问题。而等到正式校招时你才会动态规划基本题型,这时候的题的难度又上升了,所以算法题得早做准备。
=================================================================================================================
校招经历
校招在九月初的时候各大公司就开始集中网申了,需要提前做好简历。楼主大概投了40多家公司(楼主觉得一定要多投多练,不一定只投自己想去的公司,在面试初期可以拿几家公司先练练手,如果运气好有幸拿了offer更佳。多投能让你有更多的选择,如果你只投了几家公司,然后都挂了,那么你后面基本只能投小公司了),整个九月上半月每天基本都在考试、投简历、做测评,印象最深的是有一天考了四个笔试,当晚投了一个公司简历,又做了俩小时新华三的测评,当时大概凌晨一点,整个人都恶心了。
在面试初期好几家面试都没过,加上被菊厂拒了,心里还是很不爽的,直到九月中旬去哪儿三面直接发了offer,当时有点柳暗花明的感觉。后面又面了招银、海康之内的好几家公司,在拿到这几家之后基本就没找了(期间经常每天四五个面试邀请冲突,拒绝的感觉还是挺爽的,觉得自己之前做这么多笔试还是有效果的)
下面讲讲几个公司的面试问题:
酷家乐(一家创业做家装的创业公司,面试体验非常好,但二面约的时间和一个现场面试冲突了没面)
电面:
说说你印象最深的项目(异步队列)
在项目中遇到了什么问题(数据库的设计、异步队列如何将事件传入)
说说对redis的理解(基于内存、I/O多路复用、单线程)
redis为什么要使用单线程(面试官补充主要是为了原子性操作)
redis有哪些常用的数据结构,项目中你使用了什么数据结构
说一下spring的了解,有几种注入方式,你们项目一般使用什么进行注入
项目的web.xml配置中dispatcherServlet和ContextListener是干什么的
mybatis使用情况,了解哪些,用了哪些标签
项目中用到了什么设计模式
项目使用了什么版本管理软件,在github学习什么开源项目没有
一道算法,有序数组里面数字可重复,给定一个数,找出该数的范围(第一次就想到了遍历,后面想二分查找改进)
汉诺塔问题
远景能源(新能源的土豪公司,招偏执狂,感觉面试官是有那么点特色的,抓着一个点死问)
电面:
类加载了解吗?类加载步骤,双亲委派模型。如果我写了一个java.lang.String类,怎么进行加载的,怎么跟原来的类进行区分的?
垃圾回收机制了解吗?哪些时间我们需要对垃圾进行回收,如果我有一台双核4g的机器,我该如何分配新生代和老年代的大小?
异常捕获了解吗?说说常用的,你在项目中用到了哪些类型的异常捕获?如果碰到了空指针那些异常你会怎么处理呢?
多线程怎么样?说说你项目中用到的并发
说说你最拿手的项目?说了redis异步队列,就问同步和异步的概念,异步需要怎么实现,需要回调函数吗
既然redis用到了缓存,那如果叫你自己实现一个缓存,你该如何实现?怎么考虑缓存过期这些问题?
电信IT研发(电信的互联网公司,有编制,待遇也不错,前面二十分钟基础感觉答的基本倒背如流的,问到架构不太会了)
单点登录怎么做的,session共享,session和cookie的区别
Bootstrap啥类型的,jQuery了解情况
JVM垃圾回收,新生代和老年代的垃圾回收,可达性分析
HashMap和Hashtable区别,HashMap添加的对象为什么要重写equals和hashcode
数据库了解多少,事务acid,事务操作,怎么加锁,分布式系统锁,选举
微服务了解什么,微服务治理,微服务之间通信
58同城(面试最差的体验,酒店超级差,闷的要命,安排还恶心,过去等了三小时,一面面的还不错,二面没问多少就挂了,好像都是c++岗,面试官不用Java)
一面:
手写快排
数据库引擎的区别,说说btree,手写联合查询sql
HashMap了解多少说多少
wait()和sleep()
事务举例
用过什么nosql,说说redis,topk用什么数据结构
数据库分表
情景题,高并发访问一个接口,如何检测传入字符串的相似度很高的?答了个布隆过滤器,说沾了边
二面
算法题给一个数组,如何把偶数放到左边,奇数放到右边?写完后说当两边顺序已经一致了,交换是否会出现问题,加个判断
说说数据库,聚合函数了解吗?
网络编程了解吗,http请求如何区分请求头和请求体?说了解一点nio的知识,nio指什么,同步和非阻塞的概念是什么?
说下注册的时候的检测,多用户怎么判定是否被注册
去哪儿网(面试最好的体验,第一天上午机试,下午就接到通知明天去面试。在一个去哪儿合作的小清新酒店面试的,所有面试官都特别好,遇到答不上来的会给你解答,三面完直接现场发offer,只要在十月三十一号之前把三方寄给他们就行,简直不要太良心。当时一面完的时候我说我计算机网络和操作系统方面不是特别好,一面面试官笑着说:没事,路还长呢,你去等二面吧。待遇呢给的确实偏低,不过还是由衷粉一波去哪儿)
一面:(30来分钟)
说一个自己比较深的项目 ,redis多消费者一起取的时候如果队列为空你怎么处理(答了CAS进行尝试,超过失败次数之后就进入睡眠,面试官说可以不用这么复杂~~为空时直接进行睡眠就行)
纸上手写Springmvc DispatcherServlet的大致实现(大概10分钟的样子)
数据库了解吗?聚集索引和非聚集索引的区别,存储引擎的区别?主键使用不重复的字符串会出现什么问题(插入的时候由于字符串不能像自增长的id一样连续,所以在磁盘上的位置不同)?
说说HashMap吧,然后讲了HashMap、ConcurrentHashMap 1.7、1.8的实现(讲的很详细,面试官觉得数据结构还不错)
然后问计算机网络咋样,我说很一般操作系统咋样,我说很一般
线程有哪些状态,怎么进行切换的。
二面:(40来分钟)
说一个比较深的项目,还是说的异步队列,问你这为啥要用redis做异步队列啊,我用线程池直接自己开一个队列跟这有啥区别。扯了一堆,扯了redis I/O多路复用模型,最后不太满意~~
然后又手撸了一遍Springmvc
然后问HashMap
最后说你用了这么多redis,叫你设计一个缓存,你该怎么设计,get和set的时间复杂度怎么算的(答了用LinkedHashMap实现,分析了一下LinkedHashMap但是也没怎么说清)
三面:(20来分钟)
谈下人生,当场发了offer
顺丰科技(最懵逼的一次面试,在品学楼一个教室面的,感觉极不正规。一个估计三十来岁但是看着可能四十多岁的大叔面的,完全get不到他的点)
一面:
进去跟hr面一样,谈人生(你最喜欢看哪本书,你觉得在华为学到了什么),全程基本没问技术,吹牛20分钟说可以走了
招银网络科技(招商银行下面的子公司,以前叫融博,负面新闻较多,今年在成都刚成立分部,由于是银行,笔试和面试都比较强调sql,面试偏重于数据库和项目。现场面在软件园那边的招商银行面的,当天直接三面,基本每个人都有三面。面试的感觉只有一个:不愧是银行,太壕了。在七楼面试,层高居然有5、6米高)
一面(电面15分钟)
说说对JVM的理解
Java程序初始化顺序
线程的创建
mysql主键和唯一索引的区别
说说最近的项目
如何实现session共享,用redis如何实现
说说微服务,微服务之间如何管理
二面(现场面30多分钟)
看项目中有前端的,先问了下前端的css的选择优先级
手写了一个查询sql
手写了一个双重检查单例,问spring是怎么实现单例的
springmvc的大致实现过程
项目里重要的地方
说说微服务
如果你不用redis来做队列,自己写你需要注意哪些方法
数据库存储引擎的区别
数据库优化会吗,说说常用的优化
三面(现场面30多分钟)
面试官看了简历觉得项目时间都不长,没有太多兴趣,全程带笑,叫讲项目的兴趣点。讲redis异步队列,吹吹原理。说这没啥用,你这单机redis还不如自己实现一个队列速度还快些呢,你用Java写一个类似的redis才厉害(当时有点懵逼,感觉这面试官可能不太懂技术)。然后笑着听我吹完了springmvc一套,最后问我微服务治理知道不,我就扯了点服务注册和发现的知识。
四面(现场面40多分钟)
女hr全程含沙射影带笑的问,别人好像都只面了20来分钟。。。由于是转行,问了我转行原因,学习、生活、教研室那些情况。
OPPO(广告部的工程师面的,面试官自我介绍时有个非常骚气的花名,整体问的比较开放,二面聊着聊着就挂了)
笔试题比较简单
一面(现场面20来分钟):
面试官首先自我介绍,然后我自我介绍。叫先看成绩单,问我最喜欢哪一门课,这门课有什么特点(我嗅到了hr面的气息)
然后说先看下笔试题吧,你觉得笔试难不(我回答说不难就看到面试官在纸上写了个简单,感觉想教育我了),就问了http和https的区别,https加密的过程
Spring是什么啊,为什么用Spring啊?Hibernate是什么啊?Mybatis是什么啊?假如我现在要分库分表,我选哪个框架?(这没接触过啊。。)你为啥用Redis啊,Redis有哪些方法,Redis事务,Redis哪些方法有原子性,Redis和Kafka用什么区别啊?
Java虚拟机垃圾回收方面的知识,生存区为什么要有两个,空间担保机制是啥
一个32核,64g的linux服务器,硬盘是5TB,怎么统计一个1TB的文件中一个限定中文名和英文名出现的次数(我简单说了下使用流水线),问大概需要多久时间,估计一下,一分钟两分钟还是十分钟。(总而言之面试的问题全部都相当的开放,让你自己说)
二面(现场面20分钟):
简单问了下项目,各个知识点都问了一点点。
海康威视(今年扩招特别多,面试相对偏水,面试官感觉技术很不错,问的问题完全不按套路来)
一面(现场面20分钟)
面试官特别扯,进来就问后面还有几个,我们稍微快一点吧。然后看了我的简历,就问前端的类选择器。
然后问Spring Boot啥概念,有啥优势。接着问Spring Data JPA是啥,咋用(面试这么久第一次问我这个)。我解释了一些JPA是个规范,面试官问你这JPA用的啥版本啊(懵逼,俩月没用了。。记不住了),然后又问JPA是哪个组织规定的啊(懵逼的说了sun、spring、apache。。实际是EJB3.0小组)
看你用了Redis,你这Redis咋用的,用过lua脚本没有(这个真没用过)
面试官继续问:你这Java虚拟机什么掌握的咋样啊(感觉可以开始表演了),结果我回答还不错的之后,面试官问:说说一个class文件的具体组成结构啊,要细(懵逼,这部分没怎么看,就说里面有魔数)。继续问:虚拟机是起解释作用吗,有编译作用吗(一堆不是常规套路的问题问的很懵)。
然后我说我模拟实现过Spring MVC,请让我表演一哈。面试官看完简历之后说,那你就说说用了哪些设计模式(???这怎么表演),回答了下之后又问我一个http的请求的组成结构,然后叫我说http的状态码,有多少说多少。(感觉这个面试官就在观察表情,看着你很会的那种就马上换话题,完全不按套路出牌。最后殴打完我之后说了句你基础还可以)
二面(现场面5分钟)
hr小姐姐直接问想去哪,想要啥待遇
京东(投的成都岗结果北京的面试官面的,一面面试官觉得我还不错,结果二面面试官在某天晚上深夜11点打电话来说面试一下,说自己还在公司里面。我和他都很意外我投的成都岗,但却是他们部门面试,估计特别缺人,问我能实习不,我说要做毕设不能实习就凉了。有点可惜,留成都京东还是很不错的)
一面(50多分钟)
Struts2和SpringMVC区别,SpringMVC有啥好处。SpringMVC的执行流程。一个网页从输入网址到显示经历什么过程?Cookie和Session的概念。Mybatis和Hibernate的区别。异常处理知道不?详细介绍了一下异常的分类并举例
Redis有哪些数据结构。支持事务吗?Redis分布式锁知道不?Redis能持久化吗,持久化有哪些方式,有什么特点?断电会丢失数据吗?谁更严重?
数据库熟悉不,数据库引擎有哪些,InnoDB和MyIsam有啥区别,索引知道什么,哈希索引和b+树索引有啥特点,说说b树和b+树,画画b+树的结构,b+树最下面存的是数据吗?下面的数据有序吗?
设计模式知道什么?项目中用了什么?回答用了策略模式,简单说了说。写个单例吧?写了个双重检查的单例。
数据结构学的咋样?说说HashMap吧,对比说了HashMap和Hashtable,详细说了HashMap,最后引到解决线程安全用ConcurrentHashMap.详细说了ConcurrentHashMap1.7、1.8的put和size方法的区别和实现。其中问了synchronized底层实现知道不,就回答了个monitor,其它不太清楚。然后CAS是啥,解释一下。
有并发经验没有?回答说没有,但是知道基本知识,看过并发编程的艺术。说说开启线程的几种方式吧?说说volatile?说说Happens-before原则?CountDownLatch知道不,解释下,什么情况下使用?
写个二分查找吧,递归的
做个智力题:8个球7个一样重的,有一个偏重,一个天平,如何两次找出偏重的小球
给了一张纸,写写项目中如何保证代码的鲁棒性和可扩展性?
你有哪些offer?然后介绍了下自己的部门.
二面(10来分钟)
简单问了下简历上的项目,问能不能现在过来实习
总的来说。面到后面才发现了很多套路,但是好的公司已经基本结束了。所以建议提早准备,即使不能实习,也去投几个公司练一练,每次把面试问题总结一下,发现里面的套路,然后自己准备一套吹点。
=================================================================================================================
总结
关于转行,以前评论宣称学了几个月Java随便找好工作,在现在的面试难度来看,基本不太可能,软件也不是想象中那么好找工作,一个岗位要的人多但是竞争的人也特别的多。如果觉得本专业不太适合自己或者自己以后不太想去工厂那些地方上班,转行请趁早,也不一定非的学计算机,可以选自己方向相近的方向来自学。如果想转学计算机,也请早点明确自己的方向,然后在这个方向上深耕一下。很多概念性、全局性的知识,在短期内可能自己是无法理解的,需要一段时间、一个过程来理解(个人感觉这是科班和非科班主要的差距),很多基础性的知识可能会在你以后运用某个知识点时才察觉到原来是这样。在自学了一段时间后,可以开始接触数据结构和算法及计算机的一些基础知识,刷题要趁早,平时多看一些技术博客(CSDN、简书、博客园),有机会的话尽量找个工作室或者实习,如果实习不太靠谱,建议在校招前夯实自己的基础。关于校招,找工作运气和实力是46开的,面试挂了不一定是自己不行,也很有可能是和面试官不太聊的来。并不太过沮丧,面完一个反思总结面好下一个。简历上的东西力争全都会,摸索一套属于自己的吹点。面试官大部分情况下不会问框架的基本使用,都喜欢问点底层的东西(面试造火箭,工作拧螺丝),所以会点基本的CRUD是没有太多作用的,建议深挖底层,比如楼主比较擅长吹Spring MVC、HashMap和ConcurrentHashMap1.7和1.8的源码,面试的时候引导面试官,在一张纸上给他详细画自己的思路。比如项目中经常用的Redis,那最好知道Redis的底层的单线程模型和持久化的方式,再深入一点自己模拟实现一个简单的Redis可以吗(LRU算法,再自己想想时间复杂度)。使用Mybatis,可以自己运用JDBC模拟一下Mybatis的实现。这些好多都是楼主校招后期才慢慢体会到的(然鹅工作都找完了)。
=================================================================================================================
终于写完了,排版乱见谅了,祝各位找到心仪的工作,希望自己顺利毕业(求善良的导师放过)。
微信公众号:javafirst