现在春招火热招聘中,许多同学正在准备八股文。今天,分享一位同学的上岸经历,内容涵盖项目经验、八股文、算法以及场景题。并且文末分享该同学的上岸简历,正准备找工作面试的同学,记得关注一波。
星球原文链接:https://t.zsxq.com/18gUbJ275
本文已获原作者授权
另外,编程导航知识星球 目前每天在持续更新春招岗位招聘信息,并且收集了对应岗位的投递链接,大家看看有无心仪的公司,尽快投递起来。
截止到今天 3 月 13 日,依然在持续更新~
我一共做了三个项目,API 开放平台、聚合搜索平台、黑马点评。
黑马点评主要询问 Redis 相关的问题,网上八股一大堆,卷就完事了。
聚合搜索平台主要告诉面试官我懂 ES 和设计模式,能把实现的思路说通就行。
场景题基本都是针对 API 开放平台,招架不住,复盘的时候有了一些思路,希望能给大伙一点启发。
做完这三个项目,需要掌握你用到的技术栈,比如 ES、Sentinel、Dubbo、RabbitMQ 的使用、基本原理、容错。如果实习了,就换上实习的真实项目,结合工作经历,再面对场景题会更得心应手。
推荐多关注并搜集一些优秀的八股文作者,每个作者都有擅长的领域,写得好的领域,针对性的看,不然可能会出现由于作者精力有限,某个八股题目写的比较简单,导致面试时被问穿,那么就会被打上深度不够的标签,还是很伤的。
但,也不要有太大心理压力,朋友们,完成比完美更重要!如果不能记下完美的答案,那至少要记下基本的答案。不要让完美主义影响你的完成速度,这是血的教训哇。
鱼皮星球的项目多多梳理,有一段时间我还是很怀疑鱼皮项目的含金量的,在什么地方能胜过别人的项目?朋友们,含金量是够够的,不要急着否定,当你觉得你的想法更好时,去实践,如果发现自己只是异想天开、钻牛角尖的时候,就会知道项目的含金量,至少应付实习应该是够的,放心做。
当然,不乏真的有更好的想法,星球里的大佬不是也把自己的实现发出来了吗?去学,去借鉴就好了。自己完成了新的想法之后,开源出来,接收群众的拷打也是不错的方式。鱼皮之后也会走开源的路,大伙就不用自己从 0 整合扩展项目了,而是可以在前人的基础上扩展,还能学到多人合作的一些规范,感觉很不错。
1、一条 ES 语句的执行流程
答:最好说到分片规则、分布式存储、分布式查询的流程。
分布式新增:
解读:
1)新增一个 ID =1的文档
2)对 ID 做 Hash 运算,假如得到的是2,则应该存储到 Shard-2
3)Shard-2的主分片在node3节点,将数据路由到node3
4)保存文档
5)同步给 Shard-2 的副本 Replica-2,在 Node2 节点(别忘了备份数据!)
6)返回结果给 Coordinating-node 节点
分布式查询:
1)Scatter phase:分散阶段,Coordinating node会把请求分发到每一个分片
为什么要把请求分发到每一个分片?因为查询的时候不是用 ID 查,而是用关键字查,根本不知道数据在哪个分片,只能全查。通过协调节点,ES 集群对外一致,不管查哪个节点都能查出来。
2、Dubbo 怎么实现负载均衡?
查看:负载均衡 | Apache Dubbo (https://cn. Dubbo.apache.org/zh-cn/overview/core-features/load-balance/)
最好可以把一致性哈希的原理讲清楚。
3、单边快排如何实现?
1)双边快排怎么实现也说一下
2)有几种选择基准值的办法?哪种最好
3)怎么优化
4)非递归怎么写
4、 Dubbo 底层怎么进行 RPC 调用?
Dubbo 框架的工作流程如下:
1)服务提供者启动时,向注册中心注册自己提供的服务。
2)服务消费者启动时,向注册中心订阅自己所需的服务。
3)注册中心返回可用的服务地址列表给消费者。
4)消费者通过负载均衡算法选择一个服务地址,并向该地址发起调用请求。
5)服务提供者接收到请求后,根据请求参数执行相应的业务逻辑,并将结果返回给消费者。
现在还是不知道怎么回答,上面是 GPT 说的,也就是 Dubbo 的那张经典的流程图。
我倾向于回答动态代理模式+ RPC 的调用流程:
1)在 RPC 框架中,代理可以完成序列化、网络 I/O 操作、负载均衡、故障恢复以及服务发现等一系列操作,而上层调用方只感知到了一次本地调用
2)Client 首先会调用本地的代理。
3)Client 端 Proxy 会按照协议(Protocol),将调用中传入的数据序列化成字节流。
4)之后 Client 会通过网络(Netty框架),将字节数据发送到 Server 端。
5)Server 端接收到字节数据之后,会按照协议进行反序列化,得到相应的请求信息。
6)Server 端 Proxy 会根据序列化后的请求信息,调用相应的业务逻辑。
7)Server 端业务逻辑的返回值,也会按照上述逻辑返回给 Client 端。
5、一个对象创建的流程?
1)最好能接着说类加载机制
2)最好能说出创建对象有几种方式
3)反射
4)序列化
5)Unsafe 类
6)实现 Cloneable 接口重写 Clone 方法
6、Sentinel 一些原理
1)三种限流模式
2)整体框架
3)熔断降级怎么做
4)和 Hystrix 的区别有哪些
聚合搜索平台 + 黑马点评:
1)说说聚合搜索平台的实现
2)ES 集群怎么搭建?
3)布隆过滤器怎么解决冲突,能删数据吗?(不能)
4)RabbitMQ 的原理,怎么实现消息顺序性
5)RabbitMQ 怎么负载均衡
6)ZSET 底层实现
7)JUC 的大部分内容
API 开放平台:
1)为什么不考研
2)Dubbo 3.0和 Dubbo 2.0最大的区别是什么:[ Dubbo 3 应用级服务发现 | Apache Dubbo ](https://cn. Dubbo .apache.org/zh-cn/blog/2021/06/02/ Dubbo 3-应用级服务发现/)
3)Dubbo 注册时会注册什么数据上去?
4)Nacos 为什么对于临时实例采用心跳检测,非临时实例采用主动询问?
5)你把 Nacos 同时作为配置中心和注册中心,知道这样有什么坏处不?
6)测试过 Nacos 的并发注册能力吗?为什么 Nacos 能抗住那么高注册?
7)元空间会 GC 吗?
8)元空间存储哪些数据?
9)垃圾回收器,问了很多
10)JVM 调优
其中第四点,面试官说他们测试过,区别不大。
第 6 点,当时我记得黑马说能抗 10w+,但是面试官告诉我,实际测试并没有那么高。
哈哈,在大佬面前,学生是不是背八股,痕迹还是很明显的,大伙尽量结合着自己的实践说,没实践过就谨慎点。
1)项目介绍
2)微服务的优点
3)Spring 默认使用的容器是什么?Tomcat 的连接数了解吗?
4)Redis 的 Zset 说说特性,底层实现(因为简历上写着,所以经常被问)
5)什么数据需要保存到 Redis 里?
6)缓存的缺点?怎么进行数据同步?
7)AOP 失效的场景有哪些?
8)MySQL 主键采用什么结构?为什么要自增,为什么要用 Int?
9)手撕,16 min,小卡壳
10)HTTPS 的演变流程说一下,有几个版本?怎么建立连接的、流程是什么?用到了哪些非对称加密算法,对比一下它们,RSA 怎么进行加密的、怎么生成随机数的?ECDHE为 什么前向安全?具体的加密公式是什么
11)类上加 Static 是为什么?
12)怎么优雅的中断一个线程?
13)Redis 为什么一般用单库?分片集群下 Lua 脚本有什么问题?什么时候会失效
为什么全是手撕?面了一个小时。
1)手撕单例,记得五种,写到第四种说不用写了。
2)手撕插入排序变种(根据题意)
3)给二叉树中序后序遍历,建二叉树
4)矩阵旋转(力扣原题)
面了1个小时,基本都是场景题+两道题,不好描述场景。
1)AK/SK 怎么做的?SDK 是公开的吗?签名算法公开?这会出现什么问题,现在你能想出更好的解决办法吗?
答:SDK 是公开的吗?签名算法当然可公开,不然开发者怎么用,只要秘钥不泄露,就没问题(我被诈了应该)
2)你的注册器模式,需要把 Bean 对象放入 Map 里对吧?你怎么知道有多少个 Bean 要放入 Map 中?直接改代码吗?你能实现在线可插拔吗?根据需要加 Bean 进 Map 里
答:反射、或者通过监听配置的变更来更改 Map 内的值(分布式配置中心)
3)你在面试,女朋友在自习,任何一人完成手头的事后都可以先去饭店,现在要求你和女朋友晚上同时吃饭,你和女朋友都是单线程的,请问怎么保证不会有人先吃完饭,而是同时吃?
答:使用消息队列,先到的人(比如女朋友)发送消息给消息队列,然后另一个人(我)完成手头的任务后就消费该消息,前往餐厅,女朋友设置回调函数,当我到达餐厅后,女朋友触发回调,就知道我到来了。
4)我们生成了一个随机数作为接口调用是否过期的判断,这个随机数是客户端生成的本地时间,本地时间可能出现不准确,怎么办?
答:每次都向服务端发起统一的请求,获得统一的时间。
5)追问时间有偏差怎么办?我要很准确的时间。
答:设置一个容错的窗口,在一定范围内的误差都可以忍受
6)追问每次都生成这个随机数太慢了,你有什么办法优化?
答:缓存一些随机数
7)你的 SDK 怎么适配其他语言的项目?
8)Skywalking 监控调用链时怎么区分不同实例?怎么传递上下文?
9)Java的序列化有哪几种方式, Dubbo 的序列化了解吗?你还了解哪些序列化
10)手撕了两题,一道 SQL,一道力扣
11)Java 自带序列化、Protocol Buffer、Hessian、JSON、XML,都谈谈
后面的笔面大部分都拒了,只面了三家还在流程中的比较大的厂。
一面 50 min:
1、手撕:Excel 表字母列转对应数字列,也就是:26 进制转 10 进制,10 进制转 26 进制,0 需要特判。
2、Spring 里的核心配置是啥?
3、数据库三范式了解吗?
二面 40 min:
1、手撕:反转链表 II
三面 30 min:
表现得牛马一点就行了。
碎碎念:面的时候已经摆烂一个星期了,虽然很快就放我入池了,但难道其实一面就挂了?因为后面都没问啥难的,也没给我打保温电话,伤心。
1)Java 的 HashMap 底层
2)红黑树的 5 个特点、怎么旋转保持这些特点?
3)红黑树的应用场景
4)为什么 InnoDB 用 B+ 树不用红黑树
5)三层 B+ 树能存多少行数据?
6)这个存储量受每行数据大小影响吗?
7)联合索引如何实现?
8)命中主键索引和命中非主键索引有什么区别?(好吵阿,面试官那边,好像在居家办公?)
9)问了一些项目内容,给了一道场景题
答:Nginx+ 网关集群提升网关吞吐量时,需要在 Nginx 里配置网关 IP 和端口,请问你有什么办法上线一个节点下线一个节点自动知道它的ip?(不会,提示我有点类似 Nacos,然后就...或许会了)
1)口撕:N 个升序列表,合并成一个升序列表。
没写过...尴尬
- 1 号链表和 2 号链表合并成新1号链表,新1号再和3号继续合并,以此类推。时间复杂度分析,优化
- 突然发现有点像归并排序,说了一些归并的思路,时间复杂度分析,继续问有没有其他思路
- 把所有节点保存在集合中,然后调用 Sort,比较暴力
- 看我实在想不出,提示可以用优先队列...然后让我说了一下优先队列的思路
1)场景题:一次性调用多个接口,对于接口返回的 Data,怎么去组合?要求灵活易扩展,最好零代码
答:这个刚好是面试官他们在解决的问题,提示我需要设置统一的规则。
2)RPC 和 HTTP 对比?RPC 有什么缺点?
3)Netty 是什么 IO?底层框架说一下
4)场景题:异步解构时,有短板效应,怎么优化?
5)场景题:异步解构时,某些接口调用出现异常怎么办?(不会,没遇到过,现场想了一些)
答:响应优先,就把异常接口的错误响应码和正常接口的正常数据打包返回,让用户决定是否使用这个数据,异常接口重试,重试成功那就返回完整正确结果,多次重试还是失败,直接返回这次调用(包含多个接口调用)失败的响应码
6)追问:如果我需要出现异常调用,直接停止主线程,直接返回这次调用的失败响应码,怎么办?
答:用消息队列,尽量让主线程自然停止,直接中断会出大问题。
7)设计模式几大原则
8)单一职责原则,有没有不需要遵守该原则的场景?
8.1)我说了一下我的理解:单体项目想要简单起见那可以这样搞,或者优化接口调用速度。但最好还是遵循这个原则,因为有利于项目扩展性。
8.2)然后面试官说了他的理解:这个单一原则并不是说只能做一件事,或最小化的事,这是一个抽象的概念,根据你的定义会改变,最重要的是接口的可读性是否统一,简单来说就是,一个接口里做了很多事,但接口的命名或者表达是否明确,这才是单一。提醒我不要太坚持教条化的原则
9)里氏替换原则,能出现父类的地方都能出现子类,但是继承是能改变父类的,比如重写,你怎么理解,这是否违背了里氏替换原则?
9.1)我的理解:比如 RPC 里用到的代理模式,要对父类增强的情况还是得遵循这个原则的,如果有需要多态的场景或许可以不遵守,根据需求而定。
9.2)面试官也给出了他的理解:这个原则还是很不错的,最好还是遵守,因为这个原则的基本条件是父类足够简单,足够抽象,父类能够被覆盖的只有抽象的部分,我们需要尽量区分父类能够覆盖和不能覆盖的部分。
最后三场面试还是很舒服的,整体偏向于沟通,不会的题也会尽量给出引导和提示,没有那种单纯你问我答的考试的感觉,也没有咄咄逼人高高在上的感觉。
面试的时候有个小诀窍,转移你的目标,比如我们面试,目标肯定是通过,但是这样压力就会很大,可能导致你发挥不好,真的不过的时候,还要 Emo。这时候转移你的目标,你是去学习,交流,进步的,这是个机会,这样想了之后,我的表现就自然了很多,不会的题就看看能不能从面试官嘴里问出点蛛丝马迹,过不过,倒是次要的,压力就会小很多。祝大家以后面试都能遇到和善的氛围。
简历:上编程导航多看看别人的简历就可以了,就知道怎么写了。
我倾向的排版:个人资料—>教育背景(包括奖学金、比赛)—>项目—>技术栈
项目:照着鱼皮推荐的写就行了,项目有两个以上,每个写三四点就行了,只有一个那就写多点吧。
比赛和评奖评优因人而已,不相关的比赛也尽量放上去,HR面会问问,看看你的团队合作能力。
评奖评优那必须放呀,不然三年书白读了,绩点排名都放,当然要是不太好看就不放了。
社团活动、担任职位,我觉得放不放都可以,毕竟应聘的是技术岗。
我的简历,项目方面有很大的局限性,因为没实习,大伙实习后可以替换为实习的项目。
万事开头难,当我准备了一个半月,第一次写简历的时候,才发现,我还是啥也不会,非常胆怯,只敢写了解。
下面这个是我第一版简历,可以说非常搞笑了,你说你了解,可是到底了解了个啥?太空泛了。
这还是我看两遍星球的简历写法后写的,哈哈哈...
后面就是听从鱼皮建议,多看其他人的简历。当时我逛编程导航,大伙都很优秀,我随便挑了十来份,就挑到了哒哥的,问琴的,他俩做的项目和我一样,然后我就大概知道应该怎么写了。
技术栈,我觉得 Java、JVM、JUC、Redis、MySQL,这五个一定得写?毕竟找工作一定会学。其他的就看后续的学习情况,比如我看了小林的计网,HTTPS整个流程还算熟悉,那自然要靠这个打动面试官。
提醒一下,朋友们,八股要经常复习,我摆了之后,下面有几个记得的,我也不确定了。
复习的话就多模拟面试,洗澡的时候自言自语,看看能不能把整个流程讲清楚。技术栈我比较倾向于写了解,比如IOC、AOP,之前我被问穿过一次,不敢写熟悉了。
最后,如果哪里写得有问题在评论区说一下吧,我自己由于灯下黑,找不出问题了。我的简历曾被某大厂面试官打为中等偏下水平,确实和鱼皮大学的简历比起来,略显狗屎,有中等偏下也不错了。轻喷。
附上鱼皮大学时的技术栈,那是真的一行顶我十行哈哈哈。
欢迎学编程的朋友加入鱼皮的 编程导航知识星球,和 2.8 万名 编程学习者共享知识、交流进步。
星球拥有 30+ 原创学习路线和专栏、上千篇 优质编程学习求职干货。
还有鱼皮从 0 - 1 全程直播带做的 原创项目 ,手把手带你 掌握独立开发项目的方法 ,并且提供 现成的简历写法 ,成功帮助不少小伙伴找到了工作。
欢迎感兴趣的同学加入体验,本号读者可限时享用专属优惠券:
三天内不满意可全额退款,有没有用自己试了才知道