微信社招 6 轮面试(已拿 Offer)
欢迎在留言区回复
前言
前段时间面试微信的服务端开发岗位,拿到了 Offer,分享一下面试经历。
之前发的一篇文章,已拿 Offer!百度、字节跳动等后台面经提到了大鹏跳槽离职的情况,微信的面试流程较长,轮数较多,而且和其他公司面试流程差异较大,所以单独写出来。
其中涉及项目相关的问题因为因人而异,没有太大的参考价值,所以没有列出来,但这个同样是不可或缺的一部分。
第一轮面试
这轮面试总体是问基础知识,保证面试者基础过关
- 公钥和私钥区别是什么,可以把公钥当做私钥,私钥当做公钥使用么?
- 加密算法都有哪些?
- base64 是加密算法么?
- 解释下什么是惊群效应?
- 访问域名之后会经过哪些步骤,寻找子网的协议叫做什么,找到进程除了端口号还需要什么?
- 在没有设置主键的情况下,设置了唯一索引会将其作为主键构建索引么
- 进程和线程的区别,chrome 每个 tab 之间是多进程还是多线程,为什么?
- DOM 频繁修改会有什么问题,如何解决,用虚拟 DOM 有什么坏处
- 限流算法都有什么,你们使用的算法原理是什么?
- 50 亿个公众号阅读量找到最多的 10 个怎么找
- sku 和 spu 关系是什么,如何做属性关联的?
- 如何查看系统的资源使用状态,top 中 cache 和 buffer 的含义
- 进程间通信方式都有什么?
- RSA 算法是怎么个实现原理?
- 多个进程写一个文件如何避免冲突,如果加锁的话会导致等待时间过长有什么优化方案么?(说了个消息队列)
- redis 如何解决缓存穿透问题,如果不确定 key 的情况下,存在穿透怎么办
- 软件中断和硬件中断的区别
- 如何理解中断?中断的实现原理
第二轮面试
笔试 1 小时
有 64 匹马,赛场只有 8 条赛道,请问最少需要比赛多少场才能确定跑得最快的那 4 匹马,不可以借助计时器给每一匹马一一计时;
一个桶里面有白球. 黑球各 100 个,现在按下述的规则取球:
- i . 每次从桶里面拿出来两个球;
- ii. 如果取出的是两个同色的球,就再放入一个黑球;
- iii. 如果取出的是两个异色的球,就再放入一个白球。
- 问:最后桶里面只剩下一个黑球的概率是多少?
- 给定字符串 str1 和 str2,将 str2 插入 str1 中,问有多少种插入方法使得新串是回文。例如:
Str1=lol
Str2=o
总共有四种插入方法,分别得到olol,lool,lool,lolo,其中能到回文的方法有两种。
输入:
lol
o
输出:
2
- 两个有序(从小到大)单链表,合并为一个有序的单链表。
struct LinkNode{
int value;
struct LinkNode *next;
};
struct LinkNode *merge(struct LinkNode *firstLink, struct LinkNode *secondLink)
- 公司有内部 bbs,员工都会在上面发帖交流。据统计,有三个员工 ID 发帖很多,他们各自的发帖量都超过帖子总数 N 的 1/4。如果给到你所有帖子的发帖人 ID 列表,请写代码找出这三个 ID,要求时间复杂度 O(n),空间复杂度 O(1)。
面试 1.5 小时
其中这里的面试共有 2 位面试官,第一位面试官问基础知识,第二位面试官问项目
- 进程和线程的区别?
- 什么是虚拟内存?
- 1 亿个数字中有 2 个相同,怎么找?
- 访问一个链接的流程
- 访问 http 为什么会跳到 https
- linux 常用指令都有什么?
- 如何实现序列化和反序列化
- 数据库索引的结构,有什么特点?
- 堆和栈的关系,对象在堆中内存是连续的么?
- 乐观锁怎么理解?
- 数据库上乐观锁怎么应用的?
- 负载均衡都有什么算法?
- arp 协议是怎么理解的?
- http 包的结构是什么样的?
- tcp 和 udp 区别
- tcp 怎么保证稳定传输的?
- 限流算法怎么实现的?令牌桶具体是怎么实现的?
- 交换分区做什么的?
第三轮面试
本轮面试主要考察面试者项目水平和能力
缺点:在某些点上更多的挖掘技术深度
第四轮面试
这一轮面试属于交叉面试,由其他部门的面试官来面试
问题:现在有一个任务,某个公司要通过微信在早上 10 点钟发红包,现在有一个数据库表,里面存储了所有员工的 openId,还有一个微信支付的接口,传入 1 个 openId 之后可以进行红包支付,每次调用时间 1 秒钟,如何才能尽快的将该任务完成,请写出三种方案
面试官特意提醒可以不局限在题目本身上,这道题要按照真实情况去处理给出方案
下面是我当时给出的方案
1. 第一种方案
- 方案:多线程提高并发量,先从数据库获取到全部的员工列表信息,然后进行分割,比如按照尾号进行分割,同一尾号的由一个线程来去处理。
- 优点:开发简单,只需要启动多线程或者线程池即可,能够较大可能的利用服务器资源
- 缺点:
(1)首先员工的数量并不确定,把员工数据全部拉取出来可能存在数据量过大的情况。
(2)还有就是要考虑服务器性能,是否能够满足多线程所需的条件,比如说如果只有一个 cpu,其实并没有达到并行的效果
(3)如果服务器不满足资源的话,这样的话就要考虑多个机器去执行,多线程放到多个机器去执行还需要额外的开发工作量
(4)这里面没有考虑发送失败的情况,如果发送失败还需要有重新发送机制
2. 第二种方案
- 方案:多进程去提高并发量,启动多个应用,不同的应用去读取不同的数据,比如用尾号来区分。
- 优点:方便分别部署在不同的服务器上去执行,能够尽可能的利用更多的服务器资源去解决问题,如果考虑重新发送的话也方便再写一个应用去部署新的服务器启动
- 缺点:
(1)数据库在多进程读取时,数据库表会不会被锁住,如果锁住的话性能就会降低,所以要选择合适的存储引擎。
(2)有可能需要占用更多的服务器资源
3. 第三种方案
- 方案:和微信支付部门同事协调,单个 openid 发送接口其实并不合理,应该提供批量发送接口,允许发送数组,因为目前最大的瓶颈在接口耗时上面。
- 优点:从根本上解决瓶颈问题,也能缓解微信支付端的压力,不会被临时的批量调用数据量压垮
- 缺点:这个存在的问题是将开发工作量交给了微信支付部门,需要与其协调资源,确保能够按时完成工作
第五轮面试
本轮面试属于 GM 面试,要讲 PPT,前面的面试官让我好好准备一下,挑出一个自己认为最有价值的项目讲清楚
PPT 讲完之后,面试官还试用了下我做的 mdnice
等开源工具,一不小心就被发现了 bug,提出了意见
第六轮面试
本轮面试属于 HR 面试,会问离职原因、家庭、城市、薪资和绩效等问题
总结
1. 多久能将所有面试面完
我本人面试了半个月完成了所有面试,但是这个速度应该是比较快的,慢的可能会长达一个月的时间,所以建议跳槽面试前做好长期准备
2. 面试完成后就发 offer 么
面试完成后,其实只是完成了整个流程的一半,距离发 offer 和入职还有很长的时间,通常的流程是
内推 -> 多轮面试 -> 邮件反馈当前薪资 -> 口头 offer 沟通薪资 -> 正式 offer -> 背调 -> 入职指引 -> 确定入职时间 -> 正式入职
所以面试是一个长期战斗,知己知彼,百战不殆
3. 工作地点在哪里
我面试的部门在深圳,微信的岗位大部分都在广州
4. 想交流面试题和技术怎么办
大鹏搞了个技术交流群,未来不定期发面试题供大家学习讨论,欢迎加微信后回复「技术」拉你入群
来个直击灵魂的三连吧