5月23日,25届春招,字节后端开发二面
全程1h,整体感觉字节二面还是比较全面的
1、自我介绍
2、没想到这个面试官对我的那篇sci深度学习的论文特别感兴趣,我就共享屏幕开始讲我的论文,从背景+基座选型+数据集制作+模型调参+网络结构的创新化+指标,transformer如何加的各种讲了一遍,面试官能看出来是个行家,提了很多问题,我就一一解答,这个也是我的毕设所以很熟悉,聊了二十分钟的论文,最后面试官评价说这个挺有意思的。
3、拷打项目(点评)
3.1 feed流是如何做的,答:(提前了解到字节喜欢深挖,所以这里故意说了个有漏洞的方案)推模式,问:这个方案有没有缺陷,答:有的,比如一个博主有上亿个粉丝,那么一次写到发件箱很浪费时间,影响性能,问:如何优化,答:推拉模式,对活跃度高的粉丝推模式,这样做的优点是降低活跃粉丝的响应时间,但是也会有很多僵尸粉或者不活跃的粉丝,那么这时候采用拉模式,只写一份,节省内存。问:feed流采用推模式需要注意什么,答:有可能会出现分页失效,用时间戳作为分页的依据。
3.2 为什么用redis的set结构做点赞?答:(还是之前的套路,先说一个有缺陷的方案)首先,从敏捷开发的角度以及新产品流量较少的角度分析,此时可以直接用mysql,在流量很少的时候,打断问:这样如果流量打起来mysql不会受不了么,(落入陷阱),答:所以这时候考虑到这个因素需要用redis来缓解mysql的压力,于是用set存储(其实说到这还是没解释为什么用set,但是体现了一种思考的过程,而不是说上来就用redis,不了解为什么),因为set底层是哈希,查询效率很高,同时保证唯一性,问:有没有什么优化的方法,答:点赞量很大,此时只用一个set结构存储,会出现大key的问题,所以需要进行分片,前缀+场景+分片位作为名字,存userId,问:有没有更加节省空间的方式,答:看业务的具体需求,如果只是显示每个点评有多少赞,那么就维护一个计数器就可以了,保存每个点评有多少赞;如果还需要判断是否已经点赞过,那么就在redis中维护一个是否点赞的标记即可,同时点评在mysql中也维护一个isLike的标记位。问:数据库在存这些数据有没有什么更规则的方式存储,瞎答:可以维护表,记录每个用户点赞了什么内容,面试官点头,其实我并没有理解面试啥意思,就是单纯觉得就剩这个角度没说了,就随便说了说,所以敢说很关键,别尬住。问:那如果允许一定程度的误判率,如何迅速判断用户有无点赞过,答:这里根据他说的这个条件,神经反射出来了布隆多滤器,他说对,接着问布隆过滤器的原理,答:哈希加位图,问:如何降低误判率,答:优化哈希算法,提高算法的数量,增加数组长度。
3.3 linux中,假设输入指令ls,linux底层发生了什么,答:我先跟面试官说了我不太明白,然后说我试着猜一下,指令解析+ls后面会有路径参数之类的,加载Path环境变量(根据当时配java环境变量类比的,好像还蒙对了)+ 鉴权 + 获取内容,问:抛开ls这个命令,你觉得linux是如何判断一个文件的权限信息的,你自己试着聊一下,瞎答:当时就瞎说吧,是不是有类似的存储结构去存每个文件的r、w啥的,再执行命令前查询一次
3.4 如果mysql可能只能满足100qps,如何实现,答:从Sentinel限流熔断降级,RRateLimiter限流,鉴权黑白名单聊的,然后聊了监控预警系统,问:如果没有Sentinel等限流组件,让你自己实现如何实现,答:当时想的是用zset去实现,scores存时间戳,给定一定数量的token和100qps挂钩,每个请求获取token都会记录在zset中,当token为0时,此时再来请求,(假设限定每t秒n个请求)需要用当前时间戳-t秒作为结果然后查询zset,所有小于这个结果的从zset中删除,token恢复这么多,如果没有可以恢复的那么就降级(这里也不是我临场想的,就是把RRateLimiter原理说了一下,面试官果然没发现异样),问:并发安全性如何保证,答:把这些逻辑变成lua脚本外加redis的单线程的特点,保证并发安全性。
3.5 CPU飙升问题如何解决?答:我当时也没急着回答,说了自己确实没有啥线上调优的经验,没有上线过产品,只能通过看一些博客啥的纸上谈兵一下,(诚实一下,降低面试官的预期,也体现了自己平时钻研一些线上问题),通过top指令进行定位,发现对应的哪些进程cpu飙升,然后就top -Hp查看对应进程下哪些线程CPU占据两较高,这里我看b站有这个视频,说用什么gdb调试之类的,我也巴拉巴拉说了半天,结果面试官说这个是C++的调试工具,(尴尬,后来我就又扯了其他的),答:比如用第三方工具阿尔萨斯啥的,各种扯,dump啥的(也不知道对不对,就把jvm调优全扯了一遍),面试官说:没关系,后续真正工作了这个不难掌握。
3.6 输入www.douyin.com在地址栏点击回车,发生了什么,答:dns+tcp+http请求响应+渲染
3.7 http报文有了解么?答:请求报文,响应报文,请求行+请求头+空白行+请求体,状态行+响应头+空白行+响应体
3.8 手撕算法3道:
第一道,一个sql题,有并发安全,用乐观锁就解决了,让写的伪代码;问:慢sql问题,答:吟唱八股,问:如何优化慢sql,答:监控慢sql日志+sql调优,吟唱八股(什么explain关键字,建索引、尽量减少索引失效符合最左前缀法则、什么深分页问题、减少回表、子查询啥的就一顿扯)
第二道,一维数组旋转(雪花)的题,判断两个数组是否相同,即判断给定的一维数组能否通过旋转变为另一个一维数组,同时如果镜像也能得到也要返回true。ac了以后深挖,问:如果现在有海量的这样的数组在一个数据结构里保存,给定一个如何判断这个给定的数组是否在这个结构里,答:Hash运算,计算哈希值去判断。
第三道,与或非括号运算题,用栈加递归(消化括号)做的,这道题出的原因是前面写的太快了,没凑够一个小时,就又出了一道,所以友友们尽量学会消耗时间,他们很多都是有规定的要够一个小时,尽量别给自己添加不稳定的因素。
4、反问
#春招#