
人生第一次面试,上岸了!
说点心里话:
就在上个星期五,我进行了我人生中第一次面试。我之前对面试都有有种恐慌的感觉。主要是怕自己努力了这么久,结果一下就被别人否认。于是我一直准备,一直准备,学了基本的后端开发技术后,又学了JUC、JVM、Netty,但又觉得不够,于是我又回滚了数据结构(我学了3轮),回滚了设计模式。想过去面试,看过抖音上的面试直播、面试小视频后,又觉得自己学的不够,于是我看了几本书,如《java并发编程的艺术》、《MySql是怎样运行的》、《图解HTTP》、《贯穿设计模式》等等。但是我还是觉得自己学的不够,于是我往前端发展,一星期拿下vue,然后先用vue重构了星球里的用户管理中心来练手。ok,现在后端基本上能喊出名字的主流技术,我都学了一遍了,前端也会写点业务代码了,那就往往小程序发展吧。于是今年的寒假,我把小程序过了一次。跟着视频做了个商场小程序。
在这期间,我觉得我的开发本领不能忘了,不能学了后面的,就忘了前面的。于是我做项目,我做完了星球里的所有项目,做了b站上的硅谷课堂、瑞吉外卖、黑马点评等等。算下来我做过超10个项目了来练手了吧。但是我觉得我得跳出视频才行,我总不能一直跟着视频去敲代码。于是,我又自研了3个项目:一个是交友平台,模仿微博写的;一个是智能刷题,借鉴星球上的bi项目写的;一个是酒店预订,模仿携程写的。
刚开始写交友平台,我花了5个星期写,因为想加入地图模块,于是我学会了怎么看官方文档,怎么去用别人的东西。因为想加入聊天模块,于是我学会了websocket的基本使用(以前我对websocket只停留在知识上,从未实操过)。后来写智能刷题,我花了3个星期,为了做出错误答案和正确答案在背景色上的区分,我懂得了原来前端能只依赖vue,还要学会操作原生dom。最后写酒店预订,我写得更快了,我用不到两个星期就写完了,做这个项目,我的前端代码写得越来越规范了。布局也学会了怎么用栅格,间隔而不是像前面的两个项目一样,呆呆的写样式,自己去布局。
到了这里,我觉得我能去面试了,我有底气了。于是我就开始背八股文咯,我一看八股文,好家伙?!这玩意不就是我之前做个详细笔记的东西吗?这玩意不就是我之前困惑过,然后被我各种百度后所解决的东西吗?(毕竟我敲了累计超200w字后端技术的笔记)在背八股文的途中,我上了各种招聘软件投简历,大概沟通了400多个hr,投了30来份简历。我收到了4个线下面试的邀请。于是,我就开始了我的第一次面试。
面试过程:
一上来就是技术面,技术官问我对自己的实操能力和知识储备能力打个评分。我很坦白的说,我实操能力是中上,因为我做过10个项目以上,知识储备能力是中下,因为我没怎么花时间背八股文。
然后技术官直接跳过八股文了,他问我实操方面的内容:
技术官:有用过反射吗?在什么地方用?
我: 有用过,我简历上的第一个项目就用了反射。我在《贯穿设计模式》这本书里学到的,我用在第三方登录里,我使用了枚举,枚举值是类的全路径名,然后通过前端传来的登录方式的类型,来获取枚举,然后根据枚举值反射出具体的登录处理器,来进行登录。使得添加新的登录方式时,能方便灵活一点。(在《贯穿设计模式》这本书中,反射+枚举是在投放业务,组装责任链的时候用到。但是我想把这个思想应用到我简历的项目中,让其更加真实,于是我就这么答了。)
技术官: 我看你说对stream流比较熟悉,那我给你个场景:我有一堆数据,我现在需要过滤某个值大于3,然后重新组装这些数据。你怎么写?
我: 简单,filter过滤一下,然后map进行重新映射,最后根据需要的结果,来进行组合即可。
技术官: 现在有个list,我需要去重,你要怎么做?
我: 我的第一反应是,用stream的distinct即可。
技术官: 那你用set不久就好了?
我: (居然挖个坑等我跳?看我怎么应对)用set也可以,但是假如后面要把这个list传递到某个方法中去使用,而方法的形参设置为list类型,而set是和list接口平级的,都是collection接口的子接口。那用set的话还需要再转回list,我觉得好麻烦,还不如用我的方式。
技术官: JPA用过吗?
我: (JPA??我好像听过,但这是啥?好像是操作数据库的东西,我备考软考的时候好像有了解过,只能实话实说了。)算是用过吧,但是我用mybatis-plus多一点,它的querywarpper实在是太方便了。
技术官: 用过注解吗?自定义注解你使用过吗?
我: (这题,我还真会,我还真研究过鱼皮万能模版里的权限校验)用过,在我第一个项目中,我用自定义注解实现了用户权限的校验,大概的流程就是在需要权限校验的方法上打上注解,然后方法执行前,会通过aop的方式对方法增强,执行权限校验。权限校验的流程就是获取用户登录后的session,然后判断用户的角色和注解所规定的角色是否一致。一致则放行,执行方法,不一致则阻止方法执行。(后面的就是我随口就来的东西,幸亏我反应快,会编)除了权限校验之外,在别的项目中,我用自定义注解实现了日志记录,给需要记录日志的方法打上注解,然后还是用aop的方式,进行日志记录。
技术官: 我听你说,你还学过juc,那你在哪方面用过多线程?
我:(这简单,在聚合项目中有过用completableFuture,看我迷死你)我有一个项目需要做聚合搜索,具体的功能是通过一个关键词,来搜索不同的数据源,如图片,用户,视频。此时如果我用串行的方式去执行,效率不高,因为这些数据源直接没有依赖关系,那么我就可以用多线程去执行搜索,我用的completablefuture异步编排来包装我每一个线程,等它们都执行完任务后,我再对数据进行处理即可。(看我引导你)此外,执行任务时,我还可以自定义了线程池,自定义了线程池的7个核心参数。
后面问的题也是场景题,但是我忘得7788咯,反正就是一点八股文的内容都没有。最后技术官问我打算要多少薪资?(我为了稳一点,我带了我的电脑去面试,并且在前一天上线了oj项目)我就说,如果您有时间的话,不妨先看看我上线的项目?然后我再和你说我的薪资。然后呢,技术官就从他的电脑上访问我的oj项目了,他看的同时,我就跟他介绍项目用的技术,我遇到的难点是代码沙箱,如何操作docker。然后我再引出,如果您还想看的话,我还有别的项目,都是上线了的。于是我给他看了我自研的智能刷题,还是老套路,他看的同时,我就介绍用到的技术,遇到的难点是错题和正确题的背景色的区分,如何导入题目。我是怎么解决的。我观察他,发现他也看得精精有味。(看我再打一套连招,把你钓成翘嘴)我和技术官说,我还有项目,是一个模仿微博写的交友平台,你有时间的话,我还能给你看...我读过《手撕spring》,自己写过几个简单的spring...
最后我感觉得到技术官对我很满意,因为我给他介绍项目的时候,我和他已经坐在一起了,差点就勾肩搭背了。技术官问我要多少薪资,(我觉得我不用拿太高,太高怕别人不要咯,毕竟我没实习经验,也不是什么名校)我就心惊胆颤的说5k。结果出乎意料的是,技术官小声的和我说:“其实以你的技术来说,你可以要高一点的,等下人事和你谈薪资,你可以比这个高。你等一下,他们还在开会。”我大喜,然后技术官出去找下一个人来和我谈薪资了。我等待的途中,技术官又来了,他抱着他的电脑,做我旁边,给我介绍这公司是做什么的,他写了什么东西。我也听得精精有味,我也时不时的问他这是怎么实现的?你遇到的难点是啥?他也很耐心的和我讲解。最后来人和我谈薪资了,我大胆的提了6k,没想到对方马上就答应。最后我以为我拿6k稳了,结果!!对方一看我简历,你居然还没毕业?你没毕业啊,只能拿80%!!(我人都傻了,不过算了,毕竟我还能每个月拿拿政府的补贴,加起来也快6k咯。)对方也给我画了个大饼,说先做着先,毕业了再根据表现调整薪资。我也觉得无所谓了,毕竟我挺喜欢这个公司的氛围,周边的环境,技术官的性格也很不错,公司的业务也是我不怎么熟悉的领域,我还能学到很多知识,对我个人的成长也有很大的帮助。
(我回去看了看才知道,原来公司招的不是实习生啊,我一脸懵的就跑去面试,被自己蠢到了。)
总结:
我没想到面试这么简单,正常面试下来,就好像我在和朋友聊技术一样。很轻松。我觉得我能拿下offer的原因有以下几点:
1. 心态很重要。回答问题的时候,我都是微笑着,盯着技术官的眼睛来说话的。必要的时候,可以通过一些手部动作,来缓解紧张,而不是呆呆的坐直回答。
2. 多做项目。面试中的问题,很多都是我做过的,所以我印象很深。
3. 懂得扩展。很多回答中的场景,我即使没做过,但是我有思想啊,我把这思想一套,我说得有理有据,这不就是我做过的咯!
4. 表达自己的观点。技术官挖了坑,我跳进去了,没关系,我能“狡辩”,看我怎么用我的观点说服你。
5. 多在“不经意间”表现出自己的知识积累。很多回答,我都带了一嘴,我从什么书中学到的,书中是怎么做的,而我怎么根据他来扩展的。
再说点心里话:
我从2022年的4月份左右开始学,我当时的目标就是鱼皮,我当时觉得他什么都懂,好厉害,我也要成为和他一样的人。我刷完了java学习路线,懂了小程序,前端,看了不少的技术书籍,做了不少的笔记,写了不少的项目。我一直觉得我还没准备好,直到面试,我才发现原来我已经比别人准备了很多。很多人问我,我怎么学的?我就说很简单啊,多花点时间在学习上,你也可以的。
(最后,我找到了我第一份工作啦,和女朋友一起布置租房,然后每天看看剧,打打游戏,等待入职。这种感觉真的很好,一切的焦虑都在此刻消失了。)
