菜鸟补录面经(已正式offer)

一面&二面

一面二面比较类似,我就放在一起讲了。上来先是自我介绍。自我介绍结束的时候,面试官让我谈谈自己最拿手的一个项目。

我展开说了一下,用了哪些技术栈、怎么用的,做项目的时候遇到了哪些问题,后面的解决方案是怎么样的。 这之后,面试官根据我之前的描述,开始进行提问:

Q:你这边项目用到了Netty,你能说一说为什么要用Netty么?

需要保持长连接的规模比较大,自己写连接、连接池之类的做管理可能会比较麻烦。Netty提供了非常多好的特性,也是现在大家使用最广泛的框架,社区也比较活跃,相对而言可靠性、Bug修复速度等都会更优

Q:你刚才说到Netty提供了非常多好的特性,你可以说说有哪些么

首先是Netty封装了Java原生的NIO类,相比较Java原生的NIO类,使用起来更方便;其次是它支持很多编码协议,也支持自定义的编码,和我这个项目的需求也很贴合;然后Netty通过非阻塞的IO模型以及它的Reactor线程模型、内存池设计以及零拷贝的一些特性都能够提升它的并发量。官方宣称的并发量有100W,对于我这个项目而言还达不到那么高的并发数量级,所以完全够用。

Q:你能说说Netty的Reactor线程模型是怎么做的么?

讲了一下单Reactor单线程模型、单Reactor多线程模型、主从Reactor模型,以及简单分析他们的优缺点和适应场景

Q:说一说Socket和WebSocket有什么区别

我根据自己的理解,认为Socket是一组API,是从TCP层抽象出来的,而WebSocket是一种类似于Http协议之类的应用层协议(不知道对不对)

Q:你是怎么解决粘包和拆包的问题的?

Netty本身提供了线程的解决方案,并且做了封装。Netty可以根据换行符切割报文,根据固定长度切割报文,根据数据包长度切割报文,也可以通过自定义分隔符符号来切割报文。对于我这个项目而言,是使用自定义分隔符符号来做切割的。使用的时候因为Netty是使用责任链模式做的,只需要直接使用.addLast导入即可。

Q:你这边使用WebSocket来保持长连接,为什么不用其他协议,比如TCP、UDP、MQTT?

首先UDP直接就被排除了,它只保证尽最大可能交付,像视频场景用UDP可以适用,在项目中我要保证每一条数据都能够被正常接收。然后服务器在收到报文之后还要能够给设备有一个确认,因此需要一个全双工通信的机制,因此排除了TCP。至于为什么不用MQTT,一个是因为之前没了解过这个协议,另一个原因就是一开始接到这个项目的时候我就觉得用Socket来做很合适,然后和之前做过类似项目的师兄讨论了一下之后,决定用WebSocket。

Q:你之前说如果自己来写Socket控制连接的话会用到线程池,你有用过么?

没有,了解一些

Q:有哪些创建线程的方法?

继承Thread类创建线程、实现Runnable接口来创建线程、通过Callable和FutureTask创建线程、通过线程池创建线程。

Q:那你可以说一说,要使用线程池的话需要用到哪些参数么?

首先要用线程池需要知道上下文(ACC),然后需要知道核心线程数量(corePoolSize)和最大的线程数量(maximumPoolSize),然后是等待队列(workQueue)、非核心线程空闲时间(keepAliveTime),最后是一个线程的创建工厂(threadFactory)和拒绝策略(handler)

Q:线程的数量怎么确定比较合适?比如现在有一个IO密集型的应用和一个CPU密集型的应用,你会怎么确定线程的数量?

IO密集型的线程数量我觉得可以设置得大一些,比如设置为两倍或者更多的cpu核心数,CPU密集型的话选择的线程数会和CPU核心数接近。

Q:你这样设计的理由是什么

IO密集型的任务,在数据准备的过程中CPU是处于空转状态,这个时候可以把CPU时间片分出去给其他线程使用;而CPU密集型任务CPU一直在工作,即使设置更大的线程数,也没有多余的核心来分配给其他线程使用。

Q:在数据库中应该都用到过索引,你可以说一下MySql为什么要用B+树实现索引,而不是别的数据结构,比如哈希、B树、AVL树

首先B+树是一颗平衡树,每个叶节点到根节点的长度相同,这样可以提升查找效率;其次B+树所有关键字节点都在叶子结点上有序存放,且通过双向链表连接,方便了范围查询;B+树的非叶节点不存储数据,因此可以存放更多的索引数据。B+树的节点大小固定,有利于磁盘预读。

为什么不用Hash、B-Tree、AVL理由也是从为什么用B+树的角度简单回答了一下。

Q:聚簇索引和非聚簇索引有什么区别?

聚簇索引中叶节点存放的数据是一行数据,如果是通过非聚簇索引进行查找,查找的结果是想要查询的那一条数据的主键,需要一次回表之后根据主键再一次查找。

Q:有没有遇到过慢查询的情况,你是怎么解决的?

没遇到过。。

Q:那你认为可能是什么原因引起的?

索引失效、查询语句没遵循最左匹配原则、索引的区分度不高、网络故障。。

简单小结

一面时间在35分钟左右,和笔试是一起做的,手写LRU(写完之后介绍一下实现的逻辑)。面试结束收到测评。测评结束后第二天收到二面邀约

二面时间在45分钟左右,面完第二天约的HR面。

hr面

自我介绍,问了项目情况,因为项目我全程跟,从前期需求对接到中期审查、试运行、结项都是我再负责。hr问的问题比较普遍吧,一个是项目中遇到了什么难点,怎么解决的。然后怎么和他们沟通的,沟通的时候遇到什么问题,怎么解决的。这一块聊得蛮久的。

Offer

HR面结束当天OC,第二天收到正式意向,一周后收到正式offer alt

JuikUUDOrIPYdUnmsjiRYCEk69vwbcRS.jpg

 暂时回忆起这些,如有补充后续会继续在本贴更新

#晒一晒我的offer##阿里##菜鸟##菜鸟秋招##秋招#
全部评论
阿里啊,我要什么程度才能进
3 回复 分享
发布于 2023-12-26 21:07 四川
大佬面的是哪个部门呢
2 回复 分享
发布于 2023-12-26 18:30 广东
大佬是本科吗
点赞 回复 分享
发布于 2024-01-17 09:58 安徽
佬是多久面的呀
点赞 回复 分享
发布于 2023-12-31 12:03 重庆
我也准备签菜鸟,目前只拿到了意向,没发正式offer正常吗,不会毁意向吧,慌
点赞 回复 分享
发布于 2023-12-30 20:53 广东
以后就是同事了兄弟
点赞 回复 分享
发布于 2023-12-30 10:00 山东
佬,恭喜去菜鸟,我的三方一直持续到明年年底
点赞 回复 分享
发布于 2023-12-29 10:33 江苏
阿里lazada春招,androidios客户端(广深)1个hc,接受后端前端转移动端。要求985 211,毕业时间23年10月到24年九月,要求过6级。 https://aidc-jobs.alibaba.com/campus/qrcode/home?code=8ynRO17ya0V_SBjQJv61PX2JVQMR6tVirrTV28521y4%3D 用alibaba替代*号即可投递 https://www.nowcoder.com/feed/main/detail/e60f7f6452814e378376ba0f1afec1bf?sourceSSR=users
点赞 回复 分享
发布于 2023-12-28 10:17 广东
佬,菜鸟的16薪能拿满吗?
点赞 回复 分享
发布于 2023-12-27 10:12 陕西
大佬,你的项目是帮外面的公司做的吗?
点赞 回复 分享
发布于 2023-12-26 15:00 广东

相关推荐

wu970:标准北漂配置,怎么看着装修风格有点像自如的😭
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-20 16:14
已编辑
不止遇到一次了,什么都不会,让提合并请求,问什么是合并请求。让gitlab.页面把测试截图附上,不知道截图要放在哪,那么大的编辑看不到吗让配开发机,问ip是什么东西……这都咋进来的啊,我们(我2023年毕业)那会儿没AI的时候面试都是直接linux,docker,k8s,git,结构与算法,计网。怎么才过去2年,实习生跟傻子一样,有些问题问的我难受,不会git commit,不会git pull,不会切换分支,直接要覆盖master....————而且态度非常敷衍,3天前给开个仓库权限,连本地都没有拉下来。让写一个小文档,都是说一句,写一句,说把目录加上,挺嗤之以鼻,最后还是把目录加上了😂😂任何文档和注释都是方便后来人的,现在的人真的很自负啊,打开github看看任何一个开源项目的文档和注释,都写的很详细。难道现在的同学在校期间不经常拉开源项目看源码学习吗? 哪怕是一个swap函数,开源项目里都经常注释:1 3 5 7 9 2 4 6 8 10^           ^l              rswap:{功能描述}{使用样例}————给我气笑了,没次问我有什么任务的时候,我都是说,优先你学校导师的项目,然后再做公司需求。然后给了两个需求,一个月内搞定就行,既然是agent开发,1. 部署需要维护项目的开发环境2.阅读opencode/openclaude代码(我个人感觉龙虾的源码agent部分很常规,就一个channel+agent,还不如看claude泄露的代码和opencode)然后任务1搞了几周说因为环境问题,他申请到的远程开发机是linux,装的python2,项目是py3的,所以没搭建,我说你不行就用conda或docker把环境屏蔽了呢,没搭理我。任务2:看了很长时间代码,给我回了一句,opencode和openclaude是用go写的……我说你打开github看右下角那的语言是ts还是go…… 结果满脸懵的说ts是什么……我让看agent loop,哪怕全局搜索一下while(true),跳过去从头看到尾就大致清楚了,压根没看。————嘻嘻,我已经开始做社招简历了。
redf1sh:默认会git结果发现真不会,这种一看就是没做过项目的,真做过项目的至少会提交
点赞 评论 收藏
分享
评论
30
138
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务