shopee 面试经历

  6月3日(2019年) 早上,找内部员工A问了下 shopee 现在有哪些岗位还在招人,他发了几个给我看,我感觉好像不太合适,大部分是 to B 业务的,我希望能接触 to C 的,但仅有的两个 to C 岗位一个加班比较多,一个是招高级的。然后找内部员工B问了下,没想到他还没征求我同意就把我的简历投了进去,投的是2C业务群高级后台研发工程师,看着 title 我就觉得我应该是过不了的,不过因为 to C 的岗位不多,而我也比较着急 -- 毕竟打算跑路了,开始投简历找工作,所以也没关系了。

  6月6日早上,收到 HR 预约面试的电话,为了快点,我直接约下周一,也就是6月10日的下午面试。但因为6月6日下午和前 leader 进行第二次离职沟通时了解到,后续总监和 hr 可能会找我谈话,我以为他们的效率是比较快的,可能会在周一/周二/周三的时间来找我,所以我只好推迟 shopee 的面试时间(毕竟离职流程的优先级更高),端午节期间发邮件更改面试时间,然后周一早上打电话过去说明情况,和 HR 重新预约了面试时间,改为6月13日下午2点半进行面试。

  6月13日(周四)下午,大约1点半多的时候我来到了 shopee 公司所在的大厦,原来它离腾讯滨海大厦不过两公里的路程。上到预约面试的29楼后发现里面环境挺不错的,环境很新,员工看着很年轻有活力,工位可能没有滨海大厦的大,但是也不错了。我坐在茶水间等到2点多点的时候,走到前台报到,大概10分钟后,一面面试官走过来,把我领到面试的会议室里,此时应该还不到2点半。

  面试官给我拿了一瓶水,然后开始面试,自我介绍过后开始问问题,先从项目问起,通过项目顺带问技术基础,问得非常多,非常细,既有广度也有深度。

1. 乐观锁方式优化,不使用版本号,直接 update table set num = num + 1 where id = xx,由 mysql 自身来控制并发,进行串行更新。我也是这时候才了解到原来还有这个方式,这个不能叫乐观锁了,因为它的查询条件没有版本号,是直接通过主键/唯一索引进行更新(但并发时也不会存在互相覆盖的情况),此时(在 id 存在的前提下)是锁行(排它锁/X锁)串行更新的。

2. 转账 mysql 高并发方案,不用悲观锁,不用乐观锁(版本号)等,当时没答出面试官想要的答案,bigo 二面后让我想到一个方案,就是像跨行转账的场景(在这里要夸一下 bigo 的面试官,问问题后在我一时间答不上来时总会给我一个实际的场景让我更好理解),普通的更新操作,出账的一方只要检查当前资金是否足够就行,即 update ... where fund >= xx 这样的更新操作;然后入账的一方可以由出账的这边异步调用,失败时重试直到成功为止,成功后可以通过设置该流水单某个标记把这个转账操作置为成功的状态,后续就不用再重试了,当然和入账一方的接口需要通过单号来进行幂等性的保证,防止入账一方多加了一笔钱。上述是在允许延时入账的前提下才能这样做,不清楚 shopee 面试官的题意是否允许。想了一下,好像这个也不能支持高并发,因为 update 操作存在失败重试的可能。

3. innodb 隔离级别以及幻读的定义,介绍幻读时好像和面试官的理解有点出入~
4. 索引的实现,b 树和 b+ 树介绍
5. mysql 其它索引底层用到的数据结构
6. 对红黑树,跳表,哈希表的理解
7. sql 注入防范,参数化查询(预编译)、敏感字符转义,xss, csrf
8. tcp 头结构,ip 头结构,这个我说错了,我把 ip地址 都放进 tcp 头结构里来说了,后来看了一下 ip地址 是在 ip 头里的,tcp 头只有源端口和目的端口(当然还有序列号、确认序列号、首部长度、6个预留位、6个编码位、窗口大小、校验和、紧急指针)
9. http, https 区别,https 协议过程,服务器证书是如何验证的
10. volatile 关键字,用 volatile 修饰了的变量在多线程环境下还需不需要加锁等
11. c++ struct size 内存对齐,struct 取结构体里某个字段的偏移量--实现 #define T_C(class_name, field_name),偏移量这个没答好,后来百度了一下发现原来这样就行:

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

  一开始我还纳闷这样子不会访问非法内存么?所以面试时想到的总是先实例化一个对象,再通过对象进行取址,shopee 面试官说可以不用对象,但当时确实不知道怎么不用对象来取址。百度后才知道,对于上面这个宏定义编译器的处理是,不会直接访问 MEMBER 中的数据,因为前面有个 &,所以编译器是直接取 MEMBER 的地址,而不是读取非法内存中的值,这是编译器层面的东西了~自己毕竟没怎么研究过 gcc/g++ (还是说这是 ASCII C,和具体哪个编译器无关?)

  网上说 linux 内核代码中出现的,看来有时间真的要研究下 linux 内核啊~之前宇宙级公司一面面试官也建议我看一下 linux 内核相关的东西。

12. 二叉查找树输出某一段范围内的值,不得使用递归,白板编程

  我使出了之前自己开创的程序计数器实现递归转非递归的技能,当然面试官一开始并不能看懂,于是我给他讲了一下我的思路,他大概懂了,然后和我说是不是还没有剪枝,我想了一下,在合适的地方进行了剪枝,虽然写出的代码不是他想要的答案,不过应该也算过了。

13. 线程切换以及线程切换的时机

  最后他问我有什么想问的,我便问了一下 shopee 的技术栈,还有我投的岗位负责的是什么业务,平时需不需要加班等,还问了一下他觉得我有哪些需要提升的,我感觉有点悬,毕竟有两三道基础的题没有答上来。然后我说我没有什么问的了,他便送我出去,此时快到4点,整个面试过程大概1个半小时。

  周末问了一下内推我的员工B,没有当场二面是不是挂了的意思,他说不是,一面出结果需要时间,我觉得自己应该是待定或者没戏了,毕竟之前面的其他公司流程挺快的,都是当天反馈结果的,只好等到周一看看了,保佑~

  6月18日(周二) 中午12点时,HR 打电话来约二面的时间,我想尽快面,就说这周都可以,没想到 HR 说这周面试官没有时间,面试名额已经满了,于是只好给我安排下周一下午进行面试,看来 shopee 真的很受欢迎啊,那么多人前来面试。

  周三时问了下内推我的哥们,原来 shopee 确实很多人前去面试,从年后开始就是这样。还说了有两个阿里的一面都没过,看来我一面表现得还算可以,至少击败了他们,虽然一面前一天因为 leader 要给我背差绩效而很难过导致稍微影响了情绪和心态,不然一面应该还能发挥得更好的。

  6月24日(周一) 下午4点左右,我打车来到达实大厦29楼前台进行二面的签到。快到4点半时,二面面试官走过来把我带到其它楼层的会议室进行面试。让我自我介绍后开始问问题:

1. 秒杀系统 redis 单点瓶颈时怎么办,问可以用集群不?我一开始以为可以,后来被他问一个 key 在集群里是怎么存放的才想到集群提高不了 QPS,仅仅是保证了高可用。因为 key 还是一个,只是有多个副本而已。然后我说用多个 redis 实例 / 机器 + 代码里做路由,面试官说会存在一个不公平的现象,即 redis A 被秒杀完后再去 redis B 抢时比原本路由到 redis B 的人来说多了一倍路径,此时对这个人来说就不公平了,因为 redis A 被抢完不应该是他需要承担的风险,他没必要跑多那么多路程。面试官说我的系统的量没达到那个程度,自然不会去考虑得这么仔细,秒杀系统可是一个很大的系统来的(不是一个小小的 redis incr key 就能搞定的)。

2. epoll 和 select / poll 区别,epoll 两种模式。

3. 介绍熔断,并问我如何做到在 b 服务快挂时减少请求量而不是等到它挂时才减少,我说可以通过耗时时间来判断?然后他说抖动怎么办?熔断后怎么恢复?我说一点点放量,像 tcp 流量控制那样子的机制。我想引到限流去说但不太成功。

  面试官问了一下我现在的职级,再看了我的简历后问了我以前的获奖经历,然后在白板上给我介绍了一下目前 to C 部门的架构和业务,接着回到座位上问我有什么想问的,我问了几个问题,比如所用技术栈、开源 or 自研之类的,最后面试官让我在这里等一下,他出去叫 HR 过来。

  HR 进来会议室后把空调温度稍微调高了些,我发现她就是联系我面试的那位 HR,也是脉脉上加我的那位。我以为会像头条和BIGO一样,联系约面的 HR 和面试的 HR 是分开的,没想到是同一个,和脉脉上的头像照片有些差距,哈哈,果然都是照骗啊~ 坐下来后没让我自我介绍,简单地翻看我的简历,问我当时是校招进腾讯的吗,还提了一下我的学校,可能是有点看不上的意思,然后我和她说是16年实习生招聘进来然后转正的。

  问了一下投 shopee 的原因,问了一下拿的其它 offer 情况,是否已提离职以及 last day。问目前薪资、年终奖,2.1 的职级是什么时候升的,以为我的晋升速度慢,我和她解释说从18年中开始才可以晋升。然后她和我介绍了 shopee 一些基本情况,2C业务群的核心地位,团队人数等,感觉像是在背书。我问了她一些竞业相关的东西,她回答完后说后续微信联系。

  二面和 HR 面加起来的时间很短,从下午4点半开始,大概5点半就结束了,果然高效。大厦里面的空调非常冷,比滨海大厦的还要冷。

  6月25日(周二) 早上和内推我的哥们聊了一下,说了自己的面试情况。

  6月26日(周三) 早上内推的老哥和我说现在的进度是老板审批,过了的话很快就能出 offer。晚上6点时,老哥和我说最新状态是沟通 offer,好事将近。几乎同时,HR 微信加我,说我面试通过了,需要我的薪资和年终奖流水,我直接把之前准备好的近半年银行流水发给了她。27日(周四) 上午,她和我确认了最近三个月的薪资和年终奖记录。

  现在仍然是 waiting 中...

 

posted @ 2019-06-16 20:37  Newdawn_ALM  阅读(47)  评论(0编辑  收藏  举报