[日常实习]字节跳动后端开发一二面凉经
基本情况
21届本科生非科班,投字节的日常实习。个人基本情况是有比较硬的项目经历,但是之前一直没有按照找工作准备过,只练习了一个多月算法题和面经。算是第一次比较正式地面互联网大厂吧,虽然凉了却积累了宝贵的经验
12.20 飞书一面
1. 自我介绍一下,为什么投,想实习多久2. 介绍下项目和实习,用了哪些技术?
3. 假设你项目中数据报从client发出,描述它的完整流向?(这个问题我参照url输入浏览器回答的,网络五层协议+实际业务逻辑)
4. 看你项目中修改过nginx源码,那你介绍一下nginx(进程模型,IO模型reactor,内存池,负载均衡,反向代理balabala)
5. 说到了io模型,那介绍下IO模型有哪些?epoll知道吗?详细介绍一下
6. epoll使用场景?select具体性能消耗在哪?
7. epoll需要拷贝文件描述符吗?
8. 描述下nginx多进程模型?为什么用多进程?(master +多worker,master负责fork出子进程并listen,子进程accept)
9. 进程线程区别?你刚才说线程切换代价小,具体小在哪?
10. 惊群?nginx怎么避免的?(ngx_accept_mutex)
11. 那你知道哪些锁,优劣,场景?
12. 口过生产者消费者
13. 负载均衡?轮询后端权重怎么确定?如果希望根据连接数分配请求,你如何设计?(我答维护一个连接数的小顶堆,外面带一个哈希表保存堆节点的地址)
14. 分析你这个方案会有饥饿吗?会有过载吗?怎么解决
15. 看你会golang,讲下go的协程模型?(GPM模型)
16. 为什么P的local queue可无锁访问,任务窃取的时候要加锁吗?
17. Go string底层实现?
18. slice底层?扩容机制?(这里由于我项目中用到了,拓展说了[]byte和string互转的高效方法,面试官好像还挺感兴趣的)
19. 那你这个用unsafe.Pointer和uintptr的方案,不会有问题吗?string少的那个cap字段怎么填充?(我答可能GC会有点影响,因为unsafe.Pointer指向的对象不会被GC回收了)
20. 时间不早了,来写题
a. 通过前序中序重建二叉树输出后序
b. 翻转二叉树,找到二叉树两个节点的最短距离
反馈
一面算法题都A了,面试官评价基础和项目都还行,算法的话不要上来就动手,先思考
12.22 二面
1. 介绍自己同上2. 介绍项目同上
3. 用过Nginx是吧?是只配置了还是改了源码?具体描述下
4. 说下多进程服务器,多线程服务器,协程服务器各种优势场景以及缺陷?
5. go协程相比其它协程库区别在哪?
6. 说下GPM模型
7. 了解HTTP协议吗?golang HTTP库实现? (面试***的开始,我答来一个请求开一个go程处理)
8. go为什么要这样设计?为什么不池化?(啊这,我人直接傻了,口胡标准库不应该封装太多,池化应该交给用户)
9. 面试官不满意,继续追问go标准库设计问题....
10. go的GC?(我答三色标记+并发mark&sweep,这里我其实只知道概念,并不懂原理)
11. 那你详细说下三色标记算法?(我傻了)
12. 那如果用户在并发CMS期间改了引用,写屏障如何保证三色不变性?(继续懵逼)
13. 换个吧,go channel底层实现(我支支吾吾答:无锁的队...列?这个答案是错的,而且当时面试官极不满意)
14. 那你说下interface底层实现?(我心态炸裂)
15. 那你说说tcp server性能上限都在哪?怎么突破?
16. 面试官:行行行,还是做题算了
很常规的数组topk,我用了快排思想但每次只排一半,复杂度是O(N)(这个我是看别人题解这么讲的,待求证),结果面试官好像不知道这种方法,气氛很不愉快
我猜面试官大概是想问我堆,然后就说优先级队列也能做。然后他让我自己写一个优先级队列。
花了比较长的时间手撸了priorityQ,结果因为有个变量忘了初始化,有两个case跑出了段错误
反馈
二面面试官评价,要多学习底层,果不其然,过两天收到感谢信
总结
虽然肯定主观上会有不甘心,觉得二面面试官有点刁难人。但确实是自己做的不够好。这次主要的经验教训如下:
1. 学某个语言或者开源组件,一定要了解底层原理,只知道是什么=不知道
2. 不会的问题直接跟面试官说不会,别瞎猜。让其换新方向问,不然就会被追问的很惨
后面我又让人推了北京的后端实习,目前已经面完了HR,面经在下一篇帖子里会更新
#实习##面经##字节跳动##golang工程师#