记录一个java后端开发失业后的历程

目的

这是第一次写文章,在年后被裁一直处于一个比较焦虑的状态,找了一个月的工作结果却不太理想,通过写文章作为一个情绪的出口吧,也是对这段时间的做一个比较系统的面试准备的记录,希望能找到一份满意的工作,对一些找工作面试的小伙伴们留下一点经验,能够少走点弯路。一起卷起来吧。说明下下文会有搬运其他地方文章,是我个人在网上收集一些博主的文章后觉得比较有帮助的进行一个整理。

简历

简历是我们找工作能够让招聘者了解到的我们信息的首要途径,写好一份简历的重要性是毋庸置疑的。在java开发岗的简历中,一般可以分为基本信息、掌握技术栈、教育经历、工作经历、项目经历、证书荣誉这几部分,如果是应届生呢可以写一些在校的经历,在校参加的比赛以及获得奖项。

基本信息主要就包括姓名、年龄、院校、联系方式这些了,具体就不再描述了。

作为一个技术岗,简历重要的就是技术栈的掌握以及项目经历这两部分,我们重点进行这两部分的分析。

在技术栈这部分,我们可以根据自己掌握的情况进行描述,自己掌握比较好的话可以写精通,像精通集合、多线程,如果比较没那么自信的写熟悉,了解就尽量不要写了,因为在有些面试官眼里了解就等于不会。还有很重要的一点,就是不会的技术或者不熟的技术最好别写,因为面试官一般是通过你的简历进行提问的。我们书写技术栈是可以分为这几块进行罗列
1、java核心技术:java基础、IO、集合、并发(多线程、线程池)
2、JVM:类加载机制、GC回收、性能调优
3、框架:Spring、SpringMVC、Mybatis、SpringBoot、SpringSecurity、SpringCloud Alibaba、日志框架 等(根据自己情况进行增删)
4、中间件:kafka、RabbitMQ、RocketMQ
5、数据库:mysql、oracle、redis、MongoDB
6、设计模式
7、容器技术:docker、k8s
大概就是以上的这些,我们罗列后可以根据写的技术逐点的进行一个准备。

项目经历这部分是最为重要的一块,一般面试官都会针对这部分进行一个提问看你是真的有项目的经验,再多次面试后发现面试官都会结合某个技术点,然后问你在这个项目中哪里使用到和具体的使用细节和解决方案来对你的项目经验进行一个判断。这部分可以提前准备好对应的说辞来应对。
大致说下如何写项目经历,首先是项目名称以及时间,然后描述下你的项目大致的内容以及用到的技术栈。然后说明下你在项目中负责的内容。项目的业务内容简单概括就行,重点的写你在项目中的亮点,面试官主要想看的是你的亮点,比如你在项目中使用的什么技术或者方案解决的某个难点给公司带来什么收益。可以适当的美化一点,不要太夸张就行。

简历大概就写这么多了。

如何准备数据库方面的面试问题

Java技术面试主要是围绕Java核心、数据库、Spring Boot框架和分布式组件这四个方面来提问,前文也讲述了快速提升这四方面技能的技巧。在此基础上,本文将在数据库层面,给出准备面试说辞的方法。

1 全面准备不偏科,围绕项目说亮点
在相关面试说辞前,先给出准备说辞的技巧。

全面准备事务、索引、调优和缓存分布式组件,别偏重一方面。如果你仅仅把其中一点说得天花乱坠,但其它点没说好,面试官一定会认为你数据库方面能力很差,想靠背题来蒙混过关。
大多开发一般在面试前不准备,所以面试时只能展示增删改查技能,所以你一定得准备调优和分布式组件相关说辞。
药无需贵,对症即可,所以不需要准备其它诸如“MySQL底层”等说辞,就结合项目把本文给出的说辞说好即可,这样你的数据库技能就具备了“项目开发经验”。
2 数据库方面必问的点
如下问题属于必考点,大家别抱有幻想,一定得准备。

说下JDBC有哪些组件?如何用JDBC对象访问数据库?   
事务是什么?事务隔离级别和事务传播机制是什么?
用JPA(或Mybatis)操作数据库会用到哪些对象和注解?
三范式是什么?你建表时会用到什么原则?
左连接、外连接和内连接是什么?
上述问题大家能从网上找到答案,所以这里就不展开了,不过除了上述基本问题外,数据库方面你在面试时大概率还会被问到如下的问题。

索引底层数据结构?复合索引和最左匹配原则?如何通过索引优化sql语句?
项目里你用过哪些数据库的调优手段?你排查过哪些数据库问题?
项目里你用过哪些缓存?    
这些问题涉及到性能调优和缓存分布式组件,不过根据我面试的情况,很多候选人基本都不会准备这些问题。而后文就将告诉你详细的准备方式。

3 你有没有用过索引?
这个问题不问便罢,如果遇到,你可以按层次说出如下的说辞。

在项目里,我有用索引优化数据库性能的经验,同时也看过索引的底层结构。(先说明在项目里用过)

索引的底层结构是个B+树,大致结构如下图所示,所以它能用较快的性能找到数据。(找张纸画出下图,边画边说,你自己可以想象这番说辞的分量)





然后话锋一转再说,索引是需要消耗硬盘空间的,而且遇到大批量数据读写时,重建索引需要消耗代价,所以我们项目组用索引会非常谨慎。

(面试官可能就会感兴趣地再问,那你们是在哪些情况下用索引?这正中你下怀)

只有当数据表规模很大,超过百万,并且这个需要频繁读该字段,且这个字段空值和重复值不多时,才会对该字段建索引。(这种情况才能最大发挥索引的价值)比如在订单模块里的订单流水表的“订单ID”,符合上述情况,所以会建索引。(以项目举例说明,证明你真的用过)

(说到这里别停,继续往下说)建好索引以后,我在写SQL会非常注意,比如orderID='xxx'和orderID like 'abc%'时,才会确保该条sql走索引,像orderID!='xxx'或遇到左值操作比如substr(orderID,3)='xxx'时,不会走索引,所以这种写法我会避免。     

说到这里,面试官一般就会认为你具备基本的调优技能了,可能有些面试官还会再深入问,你知不知道“复合索引”?

我知道,建复合索引需要考虑最左匹配原则,则(a,b,c)这种复合索引,遇到a=xx and b=xx,会走索引,但遇到b=xx的情况就不会走,同时建复合索引是为了避免因“回表”而导致的性能损耗。

这样一来面试官对你的好感又会再增一步。

4 你知不知道事务?
我在项目里用过事务。从理论上讲,事务具有要么全做要么全不做的(acid)特性。

(赶紧落实到项目)在项目里,我们会在Spring的@Service类里通过@Transactional注解来使用事务。(一般都这样用的)

同时会非常注意其中的事务隔离级别和事务传播机制参数。(哪怕面试官真深入问,你由于准备过也不怕)

(进一步涉及性能调优)在设置隔离级别时,我们不会调太高,比如绝不会用“读未提交”,因为这样的话,多条SQL来的时候会锁表,会导致其它SQL处于等待状态,但不释放连接,从而会导致连接打满,造成数据库崩溃。(当你说出这番话时,面试官就会认为你有解决实际问题的经验)。   

5 项目里你用过哪些调优手段?
你别仅局限于此,你可以先说,我们项目里,(mysql)数据库是部署在linux上,其中一旦遇到执行时间超过10秒的sql,我们会收到邮件并分析问题。

这样一来你更回答了“如何监控以及哪些SQL需要调优”的问题,然后继续往下说。

遇到慢SQL后,我会用explain观察执行计划,看时间耗费在哪里,大多数情况下是走了全表扫描,这就需要建索引,有时候两个大表关联也会导致慢sql,这就需要缓存或重构表结构。在个别复杂的sql里,会发现多个子查询执行了多次,这就需要用with语句重构sql。(一般来说,索引,缓存,with重构和重构表能解决大多数问题) 

然后你再多说一句,在我们项目里,一方面会尽可能优化单句SQL语句,另一方面还用到了Redis缓存来优化性能,这样就自然地把话题转到更值钱的分布式组件上了。 

6 你有没有用过缓存?
我们项目是用Redis作为缓存,(把Redis融入项目,这样就能证明具有项目经验,不过前提是,你需要把Redis五种基本数据类型和读写方式看熟悉) ,再具体讲,是用Jedis库的lpush和lrange方法来读写Redis的列表对象(用具体的方法进一步证明你用过)。

话锋一转讲需求,证明有使用的必要。比如有个场景,订单模块会经常向风控模块查询公司的风控信息,所以我们把订单ID加前缀作为键,把风控信息存放列表里返回。

单纯会用Redis的人不少,所以你还要进一步结合项目背景说明更高级的技能。

在用Redis缓存风控数据时,需要用expire方法设置超时时间为1天左右,否则缓存的数据会一直存在内存里,导致OOM问题。
在设缓存时,会加一个随机时间,比如1天+(60秒内)随机数,这样同一批数据不会同时失效,造成某个时间段里请求全涌向数据库,导致数据库压力过大

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值