这个春招估计也要介绍了吧,自己投的公司也不多吧,投简历的时候,如果你提前批和正常网申都投的话,可能会获得两次笔试/面试的机会,我投了两次腾讯,不过,两次都在二面挂了,特别是第二次二面,我真的决定自己太他妈傻了。作为一个新人,谈谈我面试过程中犯过的一些错吧,或许对你也有点收获。
提前批笔试
腾讯提前批的面试应该是一个月前就开始的,我第一个投的公司就是腾讯了,人生的第一次笔试和面试也献给了腾讯。先说下笔试吧,笔试是 5 道编程题,个人觉得,腾讯的笔试题比较简单吧,也就是说,获得腾讯的面试机会应该算是不难的吧,5 道我好像是做出了 3道 + 一道90%测试用例通过 + 一道也是百分之几十来着的,忘了。
最后的结论就是,个人感觉腾讯笔试不怎么难,投了之后获得面试的机会应该非常大,我的简历背景是没有任何亮点的,没有啥比赛,没拿过啥奖,非211/985,普普通通。这里建议秋招有兴趣的一定要投一下,万一面试也过了呢,好像我听说腾讯技术研发是 2轮技术 + 一轮HR面,万一2轮技术面过了拿offer机会还是挺大。
当然,我听说前端的 HR 面是综合面,听说比比前面的两轮还难还难过。
提前批一面
一面是视频面,人生第一次面试,可以说我是很紧张的,一面我完全就是个小白啥套路也不懂,面试官问啥我答啥,完全不会引导,面试完后我感觉自己是真的傻,主要是问了一下问题:
1、浏览器输入一个地址回车之后都发生了啥?
这个可以说是非常高频的面试题了,我觉得自己这方面还可以,压抑自己的紧张,好好详细秀一波,然而,由于我事先并没有去准备过这个问题,而这个问题又涉及到很多步骤,所以我在逻辑上讲非非常非常不好,卡住了好几下,最后不管三七二十一,就说关键词了:有DNS转换啊,ip网络寻址啊,三次挥手啊,可能还有NAT地址转换啊,还有ARP啊。
可能平时看我文章的人会发现,我是喜欢把这些技术一点点推出来,有逻辑着连起来的,这样说出来会特别舒服,不过我这次面试的时候,连不起来的,归根到底就是,没有准备,头脑觉得自己都懂,但是不意味着讲的出来,所以我在这里是建议各位,对于那些高频的面试题,自己最后尝试着口头去表述一下,或者文字书写一下,要是你来回答,你会怎么说?
2、TCP 和 UTP 有什么区别?
我在回答这道题的时候,也是非常简单着回答他们的区别,例如一个面向连接一个非面向连接,一个可靠一个非可靠,非常简单就答完的。
不过这道题是一个高频题目,按上面的那个回答,就算回答出来,我觉得也是一点优势都没有。因为这些简单的区别,99%的人都懂,我觉得我们应该再往深入回答,例如TCP有流量控制,拥塞控制,面向流以及基于这些区别,他们的使用场景等等。
不过我并没有回答,不是我不知道,而是我想假装不说,等着他来问,因为我听说面试官都会一直往深问到你不会为止,然而现实是他并没有问,换话题了。感觉自己错过了一些表现的机会。
这里我想说的就是:如果你知道,你可以多说一点,千万别像我这么傻,等着别人来问。
3、写个快速排序
和算法有关的,我觉得自己还好,写的虽然不是特别快,但感觉自己写的还好,无论是从代码的排版(因为这个一般都是在笔记本写的,不可能给你IDE),以及代码的简便程度,我觉得都不错,这里我想说的就是,自己平时写代码的时候,一定要注意排版,别老是依靠IDE给你一键排版。
虽然我已经写出来了,不过他之后让我说下快速排序的步骤,我老实说了,不过我觉得,这些题都太简单,如果面试官的很基础,你也答的很基础,我觉得没啥优势,对于快速排序,我本来想补充的,例如对中轴的选择问题,与其他排序算法的一些比较,应用场景等,不过,我是想着等他来问我……
按照我这样写文章的话,估计得上万字,我下面简便说下就行了。如果你们感兴趣我这么啰嗦的话,下次我再来吐槽说说我回答的不够好的地方。
4、一条SQL执行的很慢的原因?(之前写过文章,建议看看)
5、MySQL有哪些存储引擎以及他们之间的区别(我其他引擎忘了名字叫啥)
6、如何查看SQL语句的执行状态,知道这条命令吗?(我当时MySQL其实几乎没学,很多都不知道)
7、qq用的是tcp还是udp(两种都有涉及)
8、说说jvm内存模型(其实并没有JVM内存模型,只有Java内存模型以及JVM内存结构,你要问清楚是哪个再答,我当时是答了Java内存模型,面试官一面懵逼)
9、JVM内存结构中有栈堆等,为啥要用栈这种数据结构?(主要是操作简便,快速)
10、说说垃圾回收?(老年代,新生代,永生代的区别等,各自使用的回收算法,新生代又分eden和survivor区等)
11、说说aop和ioc
12、大致看过哪些书?有逛技术论坛的习惯吗?说几个你常见的技术博客平台?有去逛过国外的技术博客吗?看的懂文档吗?
总体上一面比较简单,面试官没有深入问,不过问的很广,这里问一些,那里问一下。感觉自己答的还好,也顺利过了。第一次面试收获还是挺大。
1、对于懂的一定要多说,可以延伸,只要面试官不打断你的回答。
2、对于高频面试题,一定要自己模拟说一下,而且这些题一般不难,一定要多延伸,不然没啥优势。
3、感觉以后面试不那么紧张了,也就这么回事。
提前提二面
几天后收到复试通知,二面是电话面,二面操作系统和Linux问的有点多,我二面感觉自己就挂在Linux上,我Linux不大懂,被问了好几个个基础的问题都不懂,自己也是醉了,感觉自己应该和面试官说一下我Linux还没学?。操作系统很多细节也忘了,说说二面的面试题吧。
1、说下四次挥手,什么时候会出现time_wait状态?(我扯了一下,面试结束后,发现自己弄错了,真想给自己一巴掌,主要是,其实我对三次握手和四次挥手没去准备过,虽然看过挺多文章,但是具体的没记住,凉凉)
2、红黑树知道吗?说说,为啥有了平衡树还需要红黑树?(平衡树太严格,插入很容易打破平衡,经常需要调整,而红黑树是一种折中方案……)
3、红黑树是如何保证查找效率不会太低下的?(我后面再写一篇关于红黑树,B+树,平衡树这些的文章吧,现在先给出这些遇到过的面试题)
4、红黑树在调整的时候,不是会用到左旋右旋吗?说说会不会出现无限左旋右旋的情况,如果不会,那最多旋转几次?
5、为什么索引能加快查找效率?
6、说说B+树是怎么分裂、合并的,知道具体步骤逻辑吗?
7、你项目用到redis,知道跳跃表吗?说说他是怎么实现的,查找时间复杂度?
数据结构这部分我觉得自己答的还行,几乎都答出来的,不过下面的Linux和操作系统有点惨,怪自己没准备,不过面试就是一个查漏补缺的过程吧。
8、Linux的proc目录有啥用?(忘了,,,,)
9、怎么查看端口的状态?(有条啥命令来着的,忘了)
10、怎么查看某个进程的状态?(也忘了,呵呵,,,,,)
我简历上是写着熟悉Linux常用命令,然而一个也没答出来,尴尬啊,其实我会用的是那些 ls, cp, mkdir, tar等常用命令,对于线程、网络相关的都不会,感觉危险了,这么基础的问题都不会。
11、说说什么是进程,进程包括哪些数据?进程切换的过程是怎么样的?
12、如果想要让多个线程执行到某个点,都达到之后再继续执行,可以用java的那些类来实现?(CountDownLatch和CyclicBarrier这两个)
13、什么是反射?反射有啥用?
14、说说垃圾回收,jvm是如何知道这个对象可以回收的?计数法有啥问题?如果我们想要指定某种垃圾回收算法,该怎么设置?
15说说aop(这个问的刁难了,我该说的都说),他说,那我也可以通过自己配置文件来实现这种切面啊,为啥就要用AOP呢?(他问的问题就相当于,我用servlet也能使用实现一个网站啊,为啥要用spring这些框架呢?我当时应该要吹一波spring中AOP带来的好处的,不过我没说,感觉自己应该吹一下的)
15、接着是问了我那个高并发秒杀系统的项目,说了里面的线程安全问题,然后我这个项目早忘光了,自己也没准备,代码我不是自己敲的,直接看视频的。自己没做过什么项目,就充当了,结果面试官问了一下线程的问题,我一直没get到点,搞的自己也好懵,最后才知道他说的是啥,不过项目这块答的也不好,主要自己也没动手弄过,又是去年快速看视频学的。
总体上,二面除了Linux答的非常非常不好,还有四次挥手说错了,线程包括哪些数据说的也不全之外,以及项目感觉有点被认为不是我做的之后,其它感觉还好。不过。一个多星期后,结果出来,挂了。
不过我也不意外,知道自己有很多需要补的,面试有时运气不好,可能连续问到好几个不好的,估计就得挂了,不过这没方法,最好的做法就是面试过后把自己不足的补上来。
常规网申一面
常规网申的笔试题中是20道选择题+3道编程题,过几天就收到面试通知了,有了前面两次之后的面试经验之后,也了解到腾讯是特别喜欢问操作系统+计算机网络+Linux的,于是我把这方面的高频面试题都好好准备了,Linux 进程等相关都准备了,操作系统也大致准备了,下面说说这次涉及到的面试题。
1、说说网络建立连接之后是怎么关闭的(其实就是四次挥手,我详细说了,之前写过文章)。如果出现大量time_wait 状态的连接是怎么回事?(我说了第四次挥手出现了丢包、超时等),假如不会出现丢包、超时等,网络非常流畅呢?(说了短连接导致的)那怎么解决?(我说了限制最大连接,用队列来缓冲),问我还有其他方法吗?(我不大知道,好像面试官不大满意我的回答。不过最好的做法应该是修改 time_wait 等待的最大之间,把时间改小一点)。
2、说说IO阻塞与非阻塞是什么?各自有啥好处?知道多路复用吗?了解过 select 吗?说说他与 epoll 的区别。
我知道的也不是很深入,就常规答法,他问啥就答啥。这里我要说一下,我觉得很多人可能混淆了阻塞、非阻塞与异步、同步的概念。我实话,我觉得自己已经理解了,结果我看了好几篇文章,发现自己反而不懂了,懵了,总觉得缺了点什么影响我对阻塞非阻塞与异步同步的理解,说实话,我看了大概有10篇文章,有80%我觉得都没有说清楚阻塞非阻塞与异步同步的本质区别。这会影响你对同步阻塞,同步非阻塞,异步阻塞,异步非阻塞的理解。有时间我再来写一篇文章说说他们的区别,相信看了你就一定懂了。
3、知道乐观锁吗?说说他们适合应用的情景。
4、说说自适应锁,与其他锁相比,他的优缺点,什么情况下你觉得可以用自适应锁?(之前写过几种锁的文章,不懂的建议看)
5、你平时开发是在Linux上开发的吗?(我靠,Linux上开发??那不是得对Linux上很熟悉?我虽然准备了Linux面试相关,可是这Linux上开发压根没体验过啊,我马上怂了,马上说没有,并且还加了我对Linux不熟,这门课刚学没几天。之后他就不问了Linux了,然后接下来我就扎心了)
6、那你平时就是在windows下开发了,那如果你平时项目要上线,这个项目的性能突然很差,你是怎么定位问题的?(我靠,在下从来没有上线过项目,连用心写过项目都没有,这下完,我迟疑了一会),他补充说,例如你可以通过观察你电脑的cup, 内存,IO 的指标来进行行定位,可以分析下吗?(可以打开任务管理器来查看cup等的运行情况,然后…..其实我没有上线过项目,也没有这样的经历),他说没事,假如遇到这种情况你会怎么分析?(我下面说一下我是怎么扯的)
心想,扎心了,其实我不大知道究竟要分析啥,好吧不管三七二十一了,然后我开始扯了:
1、如果cup一直很高而其他地方内存,IO很低的话,那很有可能项目里面有某些东西在疯狂运行,但却没啥用,很有可能就是自己设计了乐观锁,但竞争的线程太多,导致一直做无用功。
2、如果磁盘操作很高,但cup很低,这是意味着项目一直在做IO操作,很有可能是SQL语句写的不好,导致扫描了大量的磁盘,然后我就针对SQL语句的问题开始扯了,例如没有用上索引啊,选错索引啊,扯了一大堆,哈哈。(心想,舒服,刚好写过sql语句执行的很慢的原因有哪些)。
7、说说进程与线程的区别?进程有哪些通信方式,(我说了共享内存,消息队列,管道,信号量,套接字,信号驱动),他问还有吗?(我说其他的不知道了),描述下这些具体的通信方式(我有些具体的给忘了,大致描述了几个)
8、说说快速排序的思想,删除单链表倒数第二个节点,你会怎么做?
9、了解MySQL事务吗?说说ACID是啥(我靠,我对事务的隔离理解还强,研究过隔离是如何实现的,然而,,,我突然短路,ACID的D忘了啥,就像你高中那会对一首古诗背的很熟,然后突然就忘了哪句,心里有点扎心),那你具体说说ACID是啥(原子性是,,,隔离性是,,,,一致性?????,我靠,我觉得自己对这四大特性很理解,感觉看名字就知道是啥了,然后说到一致性的时候,我自己的心中产生了疑问,感觉自己并没有真正意义上理解了一致性,然后我没说出来)
心中那个苦,一致性都没说出来,其实我是可以说出来的,但是我总觉得缺了点什么,就像你看了几篇文章觉得自己懂了,结果让你在看几篇文章,你感觉自己有点醒悟了,然后突然发现自己并没有真正意义上的懂,我查了好多篇文章,呵呵,千篇一律,都不能解答我的疑惑,说实话,别觉得自己懂了,其实你根本就没有懂,最后是懵逼了好久,才觉得自己应该是懂了,有时间也要写一篇事务的四大特性的文章。
说实话,网上的很多文章,真的是千篇一律,当你产生了疑惑,很难找到解答,因为你会发现,这几篇说的都是一样的,那个你感觉特别重要的疑惑都没有说到。好吧,不吐槽了,等下要被大佬门怼我写的文章了。
一面大致说了这么多,有些忘了。比起提前批一面,我觉得自己在表述上好多了,也会扯了,这里我想跟大家说的就是,问题就那些,一定要搞懂,延伸,要理解,该背的要背,例如进程有哪些通信方式。如果要面试腾讯的时候,计算机网络、操作系统,Linux这些底层的,要学好,尽管你是面试 java 岗位的,可能他一个 Java 的问题都不问的。
想杀了自己的二面
二面我应该就是个傻逼吧,自己给自己挖坑了,最近这些题一直在刷题,复习基础,对于数据结构,算法题,Java,操作系统什么的,自己也想看看有哪些不足,然后他一开始就叫我介绍项目。
1、说说你做的项目。
其实这期间我为了应付以后的面试弄过做过一个项目,不过还没弄好。然后我之前不是说了自己有个很水的高并发秒杀系统项目吗?我自己也没啥项目经验,然后我觉得高并发也是很牛逼的样子,就打算用它了,简历上也写了。不过这个项目我自己没实操过,看视频的,很短,几个小时而已,用到了redis等,不过我已经准备了很多redis相关的知识了,怎么优化的也准备好了。
现实是,呵呵,我被怼的体无完肤。
优化之一就是通过减少事务持有锁的时间来优化的,例如我们秒杀一个物品的话,如果减库存和插入订单两个操作都成功的话,代表秒杀成功,这两个操作会在一个事务里完成。问题来了,是先减库存呢?还是先插入订单呢?
我说了先插入订单在减库存能够减少事务锁的持有时间,然后我就被面试官怼死了,如下:
面试官:你觉得你这个优化有用吗?
我:有啊,可以减少锁的持有时间(确实可以减少锁的持有时间)
面试官:那你说说提高了多少并发量?
我:这个,,没测试过(我是看视频的,自己也没有这样的测试工具,有点尴尬,连测试过都没有??)
面试官:那你说说这条事务执行需要多少时间
我:我,,好像忘了具体数据,大概是0.00几秒吧。
面试官:你自己都说0.00几秒了,这么短时间,你觉得你的这个优化,用处大吗?有数据来支撑下吗?
我:,,,,,(真的自己给自己挖坑了,早知道随便介绍下就好了,不主动说自己的优化了过程了,毕竟自己没实操过)
面试官:你这个系统能扛多少并发量?
我:…没测试过(我觉得,面试官觉得这个项目是假的了,可能觉得我是从网上随便找的,然后来应付面试的,我觉得自己凉了,欺骗可是非常严重的)。
面试官:那你说说,完成一条请求用了多少时间(测试最大的并发量可能需要相应的工具,他可能为了再次确认我的真伪,故意是一条请求的?这样就不需要工具了)
我:…..没测试过(好吧,我的心已凉)
面试官:好吧,就说到这里,你用过lowJS吗?
我:啊??lowJS,什么鬼东西?而且他的声音有点小,我再次确认,是指lowJS吗?他说是,我说没听说过(后来才知道,他说的是Node.js,,,,,,麻痹,,,)。
面试官:你还有啥问题要问的?
呵呵,,,已经凉了,这次面试真的是自己给自己挖坑,面试官肯定是知道我项目是伪造的,这是非常严重的事情,然后这个面试大概是持续了10几分钟,其他的面试官的也没问了。想找给人吐槽下自己。
然后,明天就查到挂的信息了,之前二面是一个星期多才查到挂了,这次是十二个小时之后就收到挂了,我也知道10000%挂的了。此刻需要一波安慰!!
总结
总结就是一首凉凉送给自己,还有就是有一些建议,当然,这也是我自己给自己的建义。
1、高频面试题,别停留于表面,大家都懂,说的很表面没啥优势。
2、别以为自己懂了,如果可以,最好自己尝试描述一下,你可能会描述的很没有逻辑。
3、好好准备一个项目吧,一定要自己脚踏实地做一下, 别像我,被怼的体无完肤。
4、框架真的问的很少,好好打基础,数据结构与算法,计算机网络,操作系统,Linux 进程等相关的命令。
5、面试的第一关是笔试,一般都是编程题,建议要刷刷题,不然面试的机会都没有。
先写到这里了,后面会写一下面试相关的题,建议最好看,虽然你看过相关文章了,但看我的,可能你也能够有新的收获!还有就是祝各位大佬面试顺序,不好的运气我来帮你们包揽就行了(留下了委屈的眼泪)
推荐阅读
1、一句话撸完重量级锁、自旋锁、轻量级锁、偏向锁、悲观、乐观锁等各种锁 ---- 不看后悔系列
2、腾讯面试:一条SQL语句执行得很慢的原因有哪些?---不看后悔系列
3、为什么你学不会递归?告别递归,谈谈我的一些经验
4、发现一个有趣的开源项目:通过动画教你学习算法