精选

4 月加入星球,历时 6 个月学完三个星球项目,大三拿下实习 Offer,编程学习越学越热血 🔥

#我的求职分享# #我的求职分享# #我的求职分享#

自我经历(故事背景)

大家好,姑且叫我影子吧,本人就读于双非二本学校,目前大三,在大一学年,还是懵懵懂懂的,一开始还没有确定好学习路线,最初接触的编程是C++,但是因为是后端语言,没有让我感受到开发出项目的成就感,而我在选修课程中体验到了前端三件套做出成品的喜悦,所以在大一的时候我本想着走前端的路线,在这一学年中我也不断的学习HTML CSS JS JQ来巩固基础,直到到了大二上,学校也开设了JAVA的课程,在当时只是听到一些就业压力重,可能更多需要全栈的人员的消息,还不至于听到JAVA卷的信息,于是我一边学习着前端作为主线一边学习后端JAVA作为支线,直到2023年的4月份(其实在此之前一直有关注鱼皮哥的公众号和B站),一扇全新的大门打开了,我下定决心加入了星球,来到星球后,只能说是让我眼前一亮,因为其实自学的时候,包括在B站上的学习,一直都是处于持续输入的阶段,很难有让我输出和扩展的场景,做的项目也是学校的XXX系统,总是让我感受不到自己的竞争力何在。

星球经历 (故事初期)

加入星球后,从嘉宾提问 看鱼皮哥的文章 再到球友们的分享 到最后的星球项目实战都让我受益匪浅,现在想想,有时候做一件事情,方法和规划对了,才真的能够事半功倍,不过因为我大二上自学JAVA一学期的原因,所以当进入星球后,我也能够直接上手用户中心的开发,为了能够在项目中收获更多,包括前端无论是Vue还是React我都手敲了一次,而每次项目都能给我带来很多突破性的收获,或许是新鲜感吧还是什么原因,当时做项目的经历真的是感受不到累,更多的是开心,因为每次项目都能让我学到从未了解的东西,从用户中心,我了解到分布式seesion 代码的规范写法 项目上线的步骤等等,后面我就直接开始了API项目(按道理是伙伴匹配的,但当时真的是太感兴趣新技术了,看到API有那么多我不懂的,于是直接上手API),在API项目中我也逐渐了解到 网关 RPC框架的Dubbo SDk的开发 签名认证算法(这个后面有彩蛋), 再到后面完成后就是搜索中台项目了,设计模式 ES等等,不得不说,那段时间真的是很开心,因为每一个项目给我带来的就像是你突然来到了一个从未接触过的梦境一样,将这三个项目做完,刚好也就放暑假了,在暑假,鱼皮哥刚好又有新的项目Bi,于是,Bi项目又成为我当时的一个实践项目,在Bi中,我也深刻体会了一把 AI结合项目 消息队列 的东西,而当我把这些项目做完后,就准备着手简历了,但是从我了解到的信息,简历中的项目一般两个最佳,那我做这么多东西,怎样也得体现一下吧,不然竞争力又小了,于是,微服务的想法产生了,在暑假最后的一个月,我系统学习了一把微服务(大二上的时候其实已经学习过一部分),例如 Nacos Gateway Sentinel 等等,一开始我是想着在星球找到小伙伴们分工合作,但是一段经历下来,最后结果就是大家可能都有自己的事,很多时候,我任务分配下去,都没办法实现出来,但是人是活的,于是,我利用起来我的以前学习前端的基础,花了一段时间学习了下Vue,准备从0到1再制作一个完整的前端(之前的项目因为有的是React有的是Vue),于是大概历经两个月吧,一个全栈的微服务项目就出现了(具体大家可以参考我过往发布的分享--yingzi智能工具) ,当然,只是这样一个项目还是不够的,于是为了赶上10月份的秋招,我花了五天快速完成了OJ项目,于是,我的简历终于可以进行投递了,讲到这里,从4月到11月的投递,8个月的学习,真正让我有了一段热血的经历。

投递经历 (故事过度)

关于投递,其实也陆陆续续有去了解过嘉宾们分享的文章,比如千寻哥的保姆级教程,贺生姐的打招呼模板,以及鱼皮哥经典语句 赶早不赶晚,所以我就真的大三就开始投递(其实这是一个正常的事情,只不过因为环境的原因,包括学校环境 生活环境等等,在我身边的朋友他们看来,大四再中规中矩的找工作不就好了吗)。那我投递的渠道主要是Boss直聘 实习僧 以及y哥发布的一些官网等等 不过不得不说,除非是去大厂这种写着就是日常实习的,否则投递小厂,基本就是想要大四的,一听你是大三就直接减分了。(至少我经历的面试是这样,害)。

面试经历 (故事高潮)

在开始讲述前,给各位分享两个点,是我收获最大的,第一个是hr收到你的简历后,说推给技术人员看,一般会是半个月左右才约面试,所以大家投递了对方回复了,如果没跟你约面试,千万不要灰心,没准啥时候面试就来了。

第二个是,一定要做准备,对项目吃透,然后面试的时候,尽可能找机会跟面试官说,我想跟您分享下我简历上的项目,因为有时候你对项目理解是A 面试官只是通过简历看,哪怕你上线了他也不一定会去访问,那对他而言你的项目就是B 那如果A>>B,那你不是很吃亏? 所以一定要抓住机会把你的项目展示一下,毕竟项目你有东西讲,八股你不能每题都会。

那既然投递了有没有面试机会呢,只能说行情果然是行情(难),基本上在Boss投递,要么就是已读不回,要么就是因为学历的原因,当然还有一些是线下面试,不过因为成本原因,我还是想要找一些线上面试的机会,终于,皇天不负有心人,我迎来了我的第一段面试,是一家深圳的公司,在珠海有分部(小公司),当时我是跟着朋友在游乐园玩,突然一个电话就来了,说要找我面试,沟通过后,我们约在了下午三点的时间,面试官人不错,加了我的微信,让我自己选一个时间联系他面试,于是,第一次面试就这样突然的开始了。

第一次面试

第一次面试也是我准备的最少的,整个面试一开始标准的自我介绍,嘟嘟嘟一堆后,面试官说那我开始问你一些基础问题了,问题如下:

  1. ES拼音分词器如何使用?
  2. ES的主从复制?
  3. ES的分片集群?
  4. 单例模式的使用场景?
  5. SpringBoot和SpringMVC的关联?
  6. AOP的使用场景?
  7. Spring的通知类型有哪几种?
  8. Bean的生命周期?

因为当时是我刚把OJ项目做完,也没想着会有面试,所以八股这块也没有去了解太多,但是我根据我在项目中实践的经验,不断的往实践这边靠拢,除了一些背诵类的bean生命周期 ES分片集群(这还真没了解) 答不出来,其他还是说了不少的。最后面试官给了我一个算是比较肯定的态度吧。不过,整个面试又是没有谈到项目,害。那最后,因为他谈到三方的问题,我只能说我是大三的了,同时他说他们的业务可能还会用到Python,基于以上,最后过了几天Hr给我的回复就是综合考虑不合适,但是具体是啥原因就不清楚撸 。

于是,通过这个经历和复盘,我也赶紧着手面试题的准备了,以及每天持续投递,终于第二个面试来了,应该也是一家小厂,

第二次面试

前置:面试官跟我说的是,因为他们的XXX领导,觉得我那个微服务挺有意思,所以才给的面试机会,不得不说,鱼皮哥的项目质量还是很高的,不过大家要自己实现扩展点,避免撞车。

问题:

  1. Java的8种数据类型
  2. Java的引用数据类型 (当时没听清,到底是问这个还是问JVM的引用)
  3. MyBatis的分页查询 (用MyBatis-Plus多的还是要去了解下,感觉面试一般都问MyBatis)
  4. Java的创建方式(new 反射 克隆 反序列化等方式)
  5. ArraryList和LinkedList的区别(经典)
  6. Redis的主从复制
  7. Redis的持久化
  8. Linux一些相关命令
  9. SQL防注入的手段有哪些

总结:又没问项目 ,害,最后的结果是给我过了,不过了解了业务发现是低代码,涉及到JAVA的领域听说不多,而且他们公司招人招的挺急的,让我老是怀疑是找人去做低代码的重复工作吧,最后算了,还是想找一些能够有帮助些。


第三次面试(今天刚面,新鲜出炉)

通过前两次的面试,让我感受到一个痛点就是,都不问项目,于是,这次面试(也是小公司,不过是港资的,话说是不是待遇上多多少少好些呢😋),面试开始,面试官也是不按常理出牌,一开始问我看项目中用到了AI,是不是对这方面挺有研究的(因为他们项目组目前就是想做Ai相关的,以至于技术栈 Nodejs Python JAVA 这个泪等下再说吧),

我说因为GPT毕竟是挺火的,那我也在一边学习JAVA一边有了解这些前沿技术,例如看看博客 进GPT相关的圈子,所以对于一些AI绘画 视频制作 等等还是有了解的,于是,他要出招了,他说那他问下跟AI相关的东西,这我哪会呦,于是我说我自己主要还是做JAVA,对于AI是作为支线在了解,然后尽可能的结合项目去实践下,于是他说那他问下JAVA基础的东西吧 ,就是这个关键点,因为是线上面试,我说我能给您展示一下我的项目吗?因为一开始问他的时候,他说项目已经有过一个了解,那我还是怕他没有真正了解,于是我说我这边已经打开了,要不看下?于是,他给了我一个展示机会,XXX细节就不多说了,讲点有关技术的,在向他展示的过程中,我抓住一个关键,就是,当我说完,要给面试官一点时间,看他有没有提问,如果没有,那你一定要继续展示你的亮点,千万不要有太长的空白时间,都不说话,那你就很难知道下面你面临的是不是你能把握住的东西。

问题:

  1. 项目的简单介绍,这次介绍我从需求分析 开始,到功能介绍,技术选型大概讲了一下。
  2. API签名认证的流程?(从AK SK到时间戳全部讲解完整,这个应该加了个分)
  3. BI项目的AI部分怎么结合实现的?(我说的是调用国内的一个公司的API,然后我自己预定义模型的回复等等,其实他是想要听到我模型是自己部署的,这块咱也了解不多😥)
  4. Jmiter的测试是你自己做的吗?

然后,我就说要不您看下我的项目上线的情况先,然后给面试官介绍了一下,就在这个时候,可能是有点没话题了,我说要不您看下我的架构图吧,于是,我把我珍藏已久的架构图打开给他看,先是整体的微服务架构图,从nginx到docker部署给介绍了一下,不过他问到K8S有没有了解过,于是我说K8S我有了解过理论,不过我咨询过一些前辈和up主,可能实习生在公司对这块的实践不多,但是我有用过CICD的微信云托管,于是,又可以讲一些啦。

总之,这次面试我们讲项目讲了大概30多分钟,也是我最舒服的一次面试,最后5分钟他让我有问题可以问他,于是我就问了一些业务之类的,最后就是看结果吧,不过这段面试过程也是让我觉得很值的。

结尾 (故事结尾)

还是那句话,大家有机会的就多多投递试试,我一直都觉得在学校很多时候真的有种与外界隔离的感觉,哪怕没拿到offer,我们也可以有段面试经历,毕竟,第1次面试,和第100次面试的感觉和准备,肯定都是不一样的。




0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
影子
作者分享
终于拿到鱼厂周边啦! 记录一下😃
18
面试题 | 02 | 非面经,纯分享,辩证看待答案。 #面试题# 压力山大的问题: 可以讲下API签名认证的流程吗? (感觉这种流程题,如果是线下面试,是不是拿出纸,画出流程图给面试官看更好些) 找工作的我: 好的,那其实签名认证的话,它主要是为了保证接口的安全性,防止一些需要成本的,例如使用到AI的API的这种的,万一被攻击,会导致资源被大量消耗。 那API签名认证的话,它涉及到五个参数,首先两个是accessKey和secretKey,它们类似于公钥和密钥,那这个的信息的话,只能让对应的用户看到。 第三个参数的话是sign,标签,我在项目中是采用实现一个工具类去制作的,是用的secretKey 、请求参数和签名算法(MD5)然后生成一个sign1,然后客户端会把这个accessKey 和请求参数一起发送到服务端,那服务端会根据accessKey去数据库查询这个secretKey,接着还是利用刚才提到的工具类去生成sign2,最后比较sign1和sign2是否相同,相同,则说明请求参数没有被篡改。 那其实一般到这里就算基本的流程了,但是为了防止被攻击重放,还需要第四个参数,nonce,我们会在每次请求中生成一个随机的nonce,将这个nonce存入redis中,并设置好TTL,那么往后的请求过来的时候,跟redis中的nonce进行比较,如果一样的话则拒绝请求,如果不存在,才放行请求,那这样的话就可以解决重放的问题。 但是如果说这个攻击者它等到redis中的nonce过期后再进行重放,那它又可以请求成功。对于这种情况,就得使用到第五个参数,timestamp时间戳,假设我们定义的时间戳是一分钟,那服务器只能接收一分钟内的时差请求,那我们在redis设置的nonce的TTL略大于一分钟即可。这样请求重放过来,如果在一分钟内的,因为nonce存在,无法放行。如果请求大于一分钟的,因为超过了一分钟时差的规定,也无法放行。至此,API签名认证所有流程就算完毕了。
13
面试题打卡 | 01 #面试题# 分享 大家好,我是影子。 最近在准备面试题的东西,之前也不断的了解过八股的记忆方式。 个人感觉比较好的方法如下: 1. 通过先了解原理或者答案,同时实践一遍,正所谓好记性不如烂笔头,实践一遍的时候,对于很多细节也能把控住。 2. 对于一个问题,不要仅限于表面,当问题问到A的时候,试想自己是面试官的话,接下来会怎么问这个问题相关的,而不是,对于一个问题,背完就结束,那么稍微问深一点九接不住了。 3. 也是我个人比较喜欢的。 对于多个相关的问题,学习后,整理为一整篇答案,因为很多问题,其实还是可以联系起来的,后面就是通过上下联系的方式,将全部梳理出来,类似于跟别人讲解,当自己能讲出来的时候,这个题,百分之80已经掌握了,剩下的就是偶尔多看看,加深记忆。 本次,以Redis的问题作为分享,因为基本都是自己的口语化方式,模拟跟面试官的对话,当然,如果是大厂的深度拷问,肯定不够用,纯属打卡分享,哪里有误还望大家指出。 压力山大的问题: redisson实现的分布式锁能解决主从一致性的问题吗? 如果业务非要保证数据的强一致性,这个该怎么解决呢? 能介绍一下redis的分布式锁的相关知识吗? .....| 自行补充 找工作的我: 好的,因为在分布式的场景下,一个服务被部署到多个服务器上,那么在并发的情况下,可能导致一个任务被多次执行。那像我们在单机使用的锁,例如syscornized lock锁,就没法解决这个问题。那么,就需要使用到分布式锁。 分布式锁的实现有很多方式,例如redis的setnx命令,这个命令是存入一个key value,如果存入成功,则返回一个1。如果已经有这个key了,那么返回0,存入失败,并且结合lua脚本去实现。但是通过这个方式实现会有很多问题。第一个是流程会比较复杂,成本高。第二个是它的不可重入问题,第三个是它的不可重试问题,第四个是它的超时无法自动续期问题,第五个是主从一致问题。 那基于这些问题,我在项目中采用的是redisson。redisson很好的基于redis去解决了很多分布式的问题,例如分布式限流 分布式锁等等。 首先是不可重入的问题,因为它的底层是一个可重入锁,底层的流程是如果有请求过来,先判断是否已经存入线程号,如果没有,则直接获取锁,如果有,那么判断是否是同一个线程号,如果不是,则直接拒绝。如果是,则给redis中的value值加一,然后重置TTL。那么释放锁的话同样的,给value值减一,直到value为0释放锁,让其他的线程去获取锁。 那第二个的话是不可重试问题,我们使用Redisson的时候,可以定义一个时间,当一个线程获取不到锁的时候,让它不断的自旋进行尝试,直到时间到了,才停止尝试获取。 那第三个的话是不可自动续期问题,redisson中有一个看门狗机制,我们可以在代码中将trylock这个方法中将参数设置为-1,则算开启了这个看门狗机制,那这个机制的话,可以保证我们的业务完整执行,不会说因为当TTL结束后,锁就自动释放了,那具体的话我在实践中看到的是,给的时间是默认30秒,当到达三分之二的时间的时候,就会自动续期。直到我们的业务完整的执行完再释放锁。 那最后的话是主从一致的问题。因为我们底层使用的setnx的命令,那当我们获取到锁的时候,它是写入主节点的,但是因为主节点是异步复制到从节点,那如果说此时主节点宕机了,而线程一获取到锁后又没有释放锁,从节点也没有同步信息。 同时,从节点中会选举一个作为主节点。此时线程二来获取锁,则会获取成功,最终导致出现了一把锁两个线程获取,这是不合理的。 那解决的方式的话,我们可以使用mulitlock这个多重锁,使用这个锁的话,必须保证所有节点都成功的写入获取锁的线程信息后,才算获取成功,那这样就避免了因为redis多节点信息不一致导致的多个线程获取同一把锁的情况。
14
手写 RPC 框架 笔记
11
手写 RPC 框架 笔记
18
下载 APP