OPPO 后端工程师-一面 攒攒人品 望二面(已offer)
更新: 3-19日进行了HR面,3-25日发offer啦!牛客攒人品yyds!!谢谢牛客!!谢谢OPPO!!
第一部分:上来就是一个手写快排,可以用本地idea,一会写完了,得到好评hhh
第二部分: 网络相关:
- 问题: TCP是面向连接的对吧,你说说TCP这个链路是逻辑的还是物理的
回答: TCP是逻辑链路,是通过两个端系统上面的TCP服务程序来实现的,并不是在网络中专门给他一个专属物理链路来通信 - 问题: TCP的流量控制和拥塞控制的区别
回答: TCP的流量控制是发送方和接收方的协调,目的是防止速率不一致导致消息堆积,然后展开说了一下怎么实现的。拥塞控制的话是发送方和网络环境的一个协调,因为网络拥塞可以会导致一些延时、丢包等问题,然后展开说了一下。最后说,发送方的发送速率是通过窗口实现的,而这个窗口的大小一般取得都是两个控制的参数的最小值。
第三部分:设计模式相关
- 问题:现在一份代码,一堆的if-else流程控制,不好,你用什么设计模式去改
回答:记不太清这个设计模式了。。。 - 问题:装饰器模式和责任链模式的区别
回答:装饰器模式是在原有基础上,通过装饰器类对其进行一些功能增加等,我认为是一个包裹嵌套的关系。而责任链模式我认为是一个平行的,一个接一个的,这里举了一下拦截器链的例子(不知道准不准确。。)
第四部分:操作系统相关
- 问题:让你去设计一个进程调度算法,你会考虑哪方面因素?
回答:(猪脑过载,使劲想现有的这些进程调度算法)说了三个---1)要考虑是否能被剥夺,即:当进程没执行完的时候会不会被剥夺cpu使用权,2)要考虑是否会导致饥饿,所谓饥饿指的就是一类进程始终得不到cpu控制权,这肯定要尽量避免的,3)要考虑优先级,现在这种成熟的操作系统肯定会有优先级任务的概念,所以要兼顾一下优先级
(面试官好像挺满意这三方面的hh) - 问题: 你会用什么代码或数据结构去实现这样一个进程调度算法呢?结合你刚刚说的三方面
(其实这里我没太理解所谓的数据结构,满脑子都是什么数组啥的,所以就问了一下可以具体说说问的是什么意思吗,然后面试官说这个不理解是吗,那就下一个,然后给我说了一句可以参考多级队列调度算法,此时我恍然大悟,原来想问的是模型啥的,一下子脑子没转过弯来。。。然后他就问下一个问题了)
(刚好这时候,校园网不稳定,网断了,重连后我直接就当没听清他刚刚说了什么,又回答了一下哈哈哈)
回答:我对刚刚那个问题的回答是:可以使用多个队列去实现,具体参考现在常用的多级队列调度算法,因为这个算法比较综合了我刚刚所说的三个因素的考虑。
(面试官没理我hhh)
第五部分:MySQL相关
让我介绍了一下我的项目,然后他说看我用了分布式锁在项目里,我以为又要问分布式锁了,结果话锋一转,居然转到MySQL上面了!?
- 问题:让你用MySQL实现乐观锁,你怎么实现?
回答:我的想法是给表加一个字段-版本号,每次要修改时,采用那个CompareAndSet的思想,先判断一下是否版本与预期值一致,如果一致才修改,不一致就一直自旋 - 问题:你刚刚说了自旋,你用代码怎么实现这样所谓的自旋?
回答:while(true){读当前值,修改值,if(CompareAndSet成功){break;}} (其实是把Java的CAS那个代码口述了一下) - 问题:那你用SQL怎么去实现你刚刚说的乐观锁呢?
因为刚刚问完自旋,我还以为他想问我sql怎么实现自旋,我傻了,sql还能循环?所以说了我不会。。
然后面试官说在update的时候where判断一下,我恍然大悟,赶紧解释说:我刚刚以为您问的是怎么实现自旋呢
然后面试官说:乐观锁不一定要自旋啊,主要还是那个对比与设置的思想,我表示学到了 - 问题:问一下索引相关吧,两个字段,一个是主键,一个是A普通字段,都有索引,用谁作为where条件更好?
回答:把InnoDB的主键索引和辅助索引的B+树结构说了一下,说一下回表问题,所以是主键更好
第六部分:项目相关
- 问题:说说你项目的密码验证吧
回答:当用户提交注册数据时,首先我会判断一下密码是否合法,比如什么字符啥的,然后把他MD5加密,存到MySQL里。当用户登录时,去加密一下与MySQL里面的用户名和密码进行对比,通过就登录。 - 问题:你用了MD5,你了解MD5可以被解密吗?
回答:我先表示了一下md5具体实现不太了解,但是我认为只要我的盐值没泄漏,应该不可以被解密
(好像蒙对了?还是多去学学吧,害)
第七部分: 消息队列相关
- 问题:看你项目用了mq是吧,你知道现在消息队列普遍是什么应用场景吗?
回答:(pdd刚问过hhh)1)解耦合,结合了项目的订单系统和支付系统的解耦合说了一下,2)异步,3)流量削锋
反问:
- 培养方案
- 面试评价+建议:
面试官说我基础掌握挺好的,算法和基础知识啥的考察没什么问题,这个你是应该坚持下去的(第一次被夸基础好,感动了!)。然后他应该是看我项目用了很多中间件,就说:项目不要求多,中间件啥的你会发现这玩意更新换代还有各种不一样的类型,你没必要太多关注,重点你要关注的是网络和操作系统相关的这些最基础的知识,这方面你应该多去加深,多去实操,加强基础。面试评价是:我感觉你应该没什么问题,后续应该有hr会联系你。
我挺开心的,连说了好几句谢谢面试官,然后结束了
总结:
- 这一次问的还是比较基础的,不过也暴露了我设计模式+操作系统这边还差太多了,操作系统便秘一会还是能回答上来的,但是设计模式真的猪脑过载了,下去一定要好好加强
- 面试官说得挺有道理的,相比于这些新技术,如果底层掌握了,之后遇到很多新技术学习就能事半功倍,这方面要好好听从建议!
- 下去好好学习一下MD5加密,项目中用到的东西一定要熟啊!都可以被问!
攒攒人品,望二面!
#OPPO暑期实习##面经##OPPO##后端开发#