字节跳动飞书实习面试经验

【一面】

52min,在牛客网, 面试官感觉是go选手。

1. 先自我介绍一下

2. 实习里做的东西(12min)

3. 商城项目里OAuth2.0整个流程?(服务端让用户到授权页,授权后回调返一个code,服务端将APP_KEY,APP_SECRET和code传给授权服务器,授权服务器返回Access_token和uid,服务端传这两个给资源服务器拿到用户信息并存进MySQL)

4. OAuth2.0里state的作用?(没听过)OAuth2.0有什么安全问题?(不会)

5. 商城项目里消息队列为什么可以用到分布式事务?(我扯了对分布式事务的理解:两条不同连接里要保证逻辑上的事务一致性就是分布式事务。基于BASE通过消息补偿实现最终一致性,举了订单服务和库存服务之间实现分布式事务的例子)

6. 通过刚才举的例子,下单怎么实现?(我说了两种方案,一种是创建订单等库存服务返回结果再告知用户,下单接口平响高;另一种是下单后直接给用户返回成功结果,若库存那边需要回滚就发消息回滚订单,然后通知商家和用户沟通)

7. 秒杀系统超卖问题(redisson分布式信号量,商品库存存进redis里扣减)

8. redisson分布式信号量底层怎么实现的?(提了lua,以及为什么用lua)

9. MySQL索引为什么可以加快速度,时间复杂度,联合索引在B+树怎么存(联合索引是非聚簇索引,假设建了a,b,c联合索引,那么节点的key是(a,b,c),value是主键,然后取到主键回表到聚簇索引用主键查该主键对应的行记录)

10.  redis里用过哪些数据类型,怎么用的(...)

11. redis的key淘汰策略(redis有用一个字典维护每个key的ttl,惰性删除:下次访问该key,如果过期就删了,对CPU友好,对内存不友好;定期删除:遍历字典删掉过期的key,对CPU不友好。redis两种删除都用)

12. 只有这两种吗?(记得还有一种是由用户主动删除的,这个不太清楚了)(后来查了下,是定时删除:在设置key的过期时间的同时,创建一个定时器,让定时器在key的过期时间来临时,立即执行对key的删除操作;对CPU最不友好)

13. 差不多了,做一道算法题:给未排序的数组,O(n)找出最长数字连续序列的长度(差点没做出来,之后说的用hashmap存所有的值,然后遍历map的值v,判断v-1和v+1在不在map,如果在就删掉并统计长度,这样map里每个值只遍历一次)

14. 反问:刚那道题思路是我说的吗?(差不多吧),有没有二面机会?(要评估),飞书技术栈?(GO比较多,Java也有)。好的,我go也可以接受呜呜呜...

【二面】

面了1h20m,面试官看起来30多岁,有股大佬的气场。

一上来就说:先做一道编程题,然后聊一下基础,之后聊20分钟系统设计。

1. 大数加法(10min,中途出了个bug面试官直接给我说出来了)

2. synchronized放在静态方法和非静态方法有什么区别?(一个类锁,一个对象锁,两个锁不冲突)

3. synchronized(null) 会发生什么?这个线程拿到锁还是没拿到锁?(这里有坑,面试官直接问拿到锁还是没拿到锁,我就说null没有对象,那应该是无锁)

4. 你跟我讲讲synchronized锁升级过程(cas修改对象头里的markword...)

5. 好,那么你再跟我说说,synchronized(null) 会发生什么?(null没有markword,cas修改markword不成功会返回false,所以无锁?... 后来又绕了一些,我说报空指针异常,他说是。好吧...我感觉我掉坑里了)

6. synchronized(Integer)会发生什么问题?(Integer在[-128,127]有缓存对象。也就是说如果两个线程都执行到synchronized(1),这两个线程会抢同一把锁。比如线程1和线程2执行不同的方法,但是因为synchronized(1)导致线程1执行时线程2没法执行)

7. 线程池有coreSize和maxSize,如果coreSize=50, maxSIze=30,会创建几个线程?(我当时没注意,答曰:50)什么?再跟我说一遍?(噢噢,maxSize小于coreSize,我的天,哪有这样写的)程序员有手误的时候嘛。(我没看过源码,不知道怎么处理这种边界条件的,如果是我设计,我会选择抛异常)为什么要抛异常?不能给他创建30个线程?(这样处理是不符合用户预期的,我们要让用户及时感知到错误)

8. 如果线程池coreSize = 50, maxSize = 50,会创建几个线程?(50,如果阻塞队列满了直接触发拒绝策略)

9. Reentrantlock默认公平还是非公平?(非公平,因为性能好),公平锁怎么实现的?(AQS有个队列,队首是Runnable状态的线程,后面都是Waiting状态的线程,公平锁是在cas修改state之前先判断队列里是否有Waiting状态的线程,如果有就将当前线程加到队尾)

10. 操作系统哪些状态?(创建,运行,就绪,阻塞,终止),运行态之后到什么状态(阻塞,不是,就绪,口误了)...(后面还说了些,不记得了)

11. 操作系统死锁的条件?(互斥,占有和等待,不可抢占,循环等待,还说了如何预防)

12. 1. b=1 and a=2 and d=3

2. c=1 and a=2 and b=3

3. b>1 and a=2 and c=3

4. a>1 and b=2 and c=3

5. e=1 and a=2 and c=3

(a,b,c)复合索引,哪些生效?(又有坑,我又掉进去了呜呜呜... 我还没看仔细我就说只有4用到index级别的索引)我们写SQL一定要按a,b,c顺序写才能生效吗?(不是的,MySQL内部有个优化器,可以帮我们排好序)那你再跟我说说哪些生效?(噢噢,1是a和b ref级别生效...)

13. HashMap线程安全,ConcurrentHashMap扩容(balabala...)

14. 聊聊系统设计吧。假设这样一个场景,给你一个电梯... (大概意思就是把整个电梯数据结构设计出来,要求这些数据结构能让电梯的策略正常运转)这一部分说了很多,面试官各种挖坑:用户在2楼同时按了上下你怎么支持?用户在里面按了1,2,3,4... 你怎么支持?(分了里层和外层,里层按的用最小堆存),你电梯在2楼,往上走,你最小堆只能取1出来(噢噢,维护一个最小堆和一个最大堆,当用户按按钮的时候根据电梯当前楼层选择加到哪个堆里,当电梯上去是从最小堆里取要停的楼层,电梯下来是从最大堆里取要停的楼层) 如果这时候同时支持两个电梯...

15. 反问环节:我go零基础,如果我进去之后会不会压力比较大?(还好,这边校招生和实习生也有一些转过来的,基本1-2月后就可以开始做一些小需求上线了)

总的来说,被吊锤。还是想稍微许愿一下三面的,虽然多次掉坑里了但我也算是爬出来了吧,呜呜呜...

【三面】(1h)

面试官全程乐呵呵的,看起来就是大佬风范,呜呜呜...

1. 简单自我介绍一下

2. 讲讲你的项目(让我讲了15min....)

3. 死锁的条件(互斥,占有和等待,不可抢占,环路等待,并讲了如何预防)

4. 说的特别好,哲学家进餐问题了解吗?(n个哲学家,n只筷子 ...)

5. 哲学家进餐问题,怎么破坏死锁?选择哪个条件破坏?(如果是占有和等待,就让哲学家一次性拿两个筷子,封装成原子性操作,否则就不拿。如果是不可抢占,就让哲学家持有筷子时设置一个过期时间,拿不到就释放。如果是环路等待,就给筷子编号)

6. 破坏环路等待这个条件会有什么问题?(一时间没反应过来,支支吾吾)我建议你写一下(我都不知道写啥,随便划了几笔,然后说没get到意思),就是比如说哲学家1拿[1,2],哲学家2拿[2,3],会有什么问题?(噢,原来是这个意思,最后在纸上划了下说哲学家5会拿[5,1],即使给筷子编号后还是循环了)这个问题怎么解决?(颠倒其中一个哲学家的顺序,不过我还没验证这个正确性)是的,就是这个。

7. 做道题放松一下:

有一个Data 类,里面实现了lock方法,提供了lock()和unlock(),现在有一个线程不安全的方法:swap(Data D1, Data D2),请你实现一个线程安全的方法:swap_threadsafe(Data D1, Data D2)

8. 最后这道题绕了很久,一直get不到面试官的意思。最后面试官说我直接告诉你吧,用两个对象的object_id处理。

9. 我这是压力面,不知道你有没有感觉(噢,我好像没什么感觉,主要是你一直乐呵呵的,我就比较放松...)

10. 反问:忘记准备反问问题了,随便问了个进去写go写哪些方面,面试官回答的我也忘了...

然后面试结束了。只留下凌乱的我。

于是,这几天我疯狂看牛客字节的面经,操作系统和计网各种边边角角补了一堆,各种花里胡哨的链表也写了一堆。

结果四面问我的全是比较常规的问题,这几天的努力一点也没发挥出效果,反倒之前的八股和项目忘了很多,导致回答起来不是很流畅,口误也比较多。

【四面】( 1h)

面试官看起来30有余。开头自我介绍因为网络原因面试官说一直听不清楚。我说我开热点吧,然后找了3min手机... 找的我心态都崩了。

1. 简单自我介绍一下

2. RabbitMQ延迟队列怎么实现?(答的有点磕磕绊绊,不过意思还是说清楚了。建一个无消费者的队列,给队列设置消息的TTL,消息过期后的route-key以及消息过期后前往的交换机。当该队列里消息经过TTL过期后根据交换机和route-key路由到另一个队列,由监听这个队列的消费者消费)

3. 对分布式事务的理解(也有点磕磕绊绊。两条不同连接里要保证逻辑上的事务一致性就是分布式事务。分布式事务实现有两种,一种是基于XA保证强一致性的Seata,另一种是基于最终一致性在业务逻辑层通过消息补偿实现,之后举了下单和锁库存之间保证事务的例子)

4. Seata通过XA实现分布式事务的流程(有三个角色:事务协调器,大事务,小事务... balabala流程说了一半发现自己不记得了,于是直接和面试官说具体细节我忘记了...)

5. TCC了解吗?(相当于2PC手动版,我们要自己实现三个方法,具体不记得了,因为没用过)

6. volatile特性(保证线程之间的可见性,防止指令重排。然后讲了CPU缓存一致性,总线嗅探,JVM加内存屏障指令等等)

7. CAS原理讲一下(4个参数,1是指向对象的地址,2是偏移量,3是旧值A,4是新值B。首先根据1和2从内存地址取值存到A里,然后对该值修改得到新值存到B里,在写回内存前从内存地址里取最新的值和A进行比较,如果一致就写入,否则返回false)

8. G1如何处理大对象的(这里答的不太好,有点乱,感觉有点跑题。G1垃圾清理是软实时的,用户可以设置G1垃圾清理的时间。G1并不是一直会清理老年代,而是堆内存到45%开始清理。G1里有一个个region,清理时会对region进行价值评估,然后结合用户设置的清理时间选择对内存性价比最高的region清理)

9. TCP三次握手,四次挥手讲一下(balabala)

10. TCP拥塞控制讲讲(讲了网络拥塞是啥,处理拥塞控制的流程)

11. 设计模式里观察者模式(有Subject和Observer,Subject里维护一个List<Observer>,当Subject里的数据源发生变化时,遍历这个数组,调用Observer里的方法,这样Observer就可以感知到Subject里的数据变化,并且执行相应的操作)

12. 设计模式6大原则(这里答的是真的乱,6大原则名字我都忘了,磕磕绊绊的把6大原则是啥大概说了下。如果是以前我可以把这6大原则设计的原因和好处都解释一遍的)

13. linux查看客户端网络连接状态的指令(不会,linux指令平时一般用于grep日志和进行一些部署操作。后来百度了下是netstat指令)

14. 手写观察者(5min)

15. LC322 零钱兑换(7min写完,运行时遇到一个输入输出的奇怪的bug导致结果不对,捣鼓了10min. 当时紧张死了,以为自己做错了。还好最后解决了)

16. 说一下你debug的过程。(我的逻辑是对的,只是处理输入输出这里有点问题,然后把问题复现了,并讲了思路)

17. 反问:进去之后转go的话在学习知识上需要偏向于哪些方面,比如是偏向于操作系统这种底层还是RabbitMQ这些中间件的应用级别(面试官说了一大堆,起码说了5分多钟... 最后给的建议是在学校期间多了解了解一些技术,然后专精一个方向,比如专精redis,这样之后遇到redis的问题你就可以处理了) 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值