腾讯补招面试复盘--后端开发
腾讯补招第一次被捞(四战腾讯)
小小解释一波,这里x战算上之前春招、秋招的面试次数。
面试时间:11月21日
部门用的是Java,具体是哪个部门这里就不透露了。
这一面聊天性质大于面试性质,基本上就问了一下字节实习的内容,然后就写了一道算法题,是无重复字符的最长子串的变种题,lc中只需要给出长度即可,面试中需要返回字符串。
一开始聊了会儿天,这边可以部分展示一些。
选择b端还是c端。
怎么不考研。
考研三年与工作三年怎么选择。
面试题。
怎么实现软路由。
假如你家里有一台服务器,使用的是家里的路由器,但同时你家里人上网使用的也是这个路由器。你怎么保证服务器被攻击时,你家里人也可以正常上网。
假如你正在流水线部署一个服务,怎么样可以让流水线的部署更快一些。
属于是问了超出我自己知识存储的题目了,全不会。
总结来说,面试体验还可以,虽然最后挂了,但也有长一些见识。
继续冲!不要因为一时的跌倒就跪下了!
腾讯补招第二次被捞(五战腾讯)
面试时间:11月26日
部门用的是Java,而且这是一面,所以问的Java相关的知识比较多。总体来说本次面试面试官还是很给力的,提问的问题都比较有引导性,而且允许我在回答的时候拓展自己的知识,不过我很多回答都答不到很深入的点。
面试完半小时后查看官网流程已经结束了。
又一次挂了,自从春招结束以来我已经好久没有复盘过面试了,一是自以为自己面试足够厉害了,二是真的懒得做。
但这几天面完腾讯两次之后发现我自己还是有很多问题,不仅仅是八股文忘记了那么简单,于是便打算继续自己的老本行,复盘面试。
再次跌倒也不要紧,只要在继续前进就是在进步!
面试问题:
- 在字节期间的实习内容。
宏观层面,我所在的小组负责字节的采购商城开发,主要是负责运营维护一个采购商城,供公司采购部的专业人员以及非采购部的非专业人员使用。
微观层面,我的日常负责采购商城的双周迭***的部分需求以及采购商城Oncall。具体来说,以一个我开发的例子,我曾开发过一个采购申请单的一个下拉框选项是否展示这样一个需求。背景是这样子的,在创建采购申请单的页面,针对某个下拉框选项,我们只开放给授权用户,而非授权用户不会展示该下拉框。
在这样一个需求中,我做的事情有,先与熟悉的同事沟通,讨论这个需求该在哪个模块实现。接着我会在技术评审会之前将该需求的技术评审给写好,技术评审方案需要考虑写的通俗易懂,因为这个方案要求在会上大家能够扫一眼就知道你这个需求大概要怎么做,最简单的方法就是将我的思考以图表的形式展现出来。除此之外,文档也需要考虑配置相关的说明,比如我在开发中有哪些参数是后端配置的,哪些是产品需要配置的,都可以在会上聊清楚,跟大家同步这个消息。
这些都完成之后才真正进入开发阶段,而开发阶段往往是最轻松的,因为很多需要思考的内容在技术评审的时候就做好了,到了开发阶段就是将细节给实现。
开发完之后就要进入测试阶段,这个阶段也至关重要。首先是自测,自己通过一些简单的边界Case、正常Case来判断代码结果是否符合预期。再之后就进入QA测试阶段,最终就是上线了。
- 讲一下JVM的内存模型。
https://www.cnblogs.com/dingyingsi/p/3760447.html
讲一下ArrayList与LinkList的区别。
讲一下Java里面的线程安全。
讲一下Java中线程的状态。
个人理解这个问题问的其实是Java线程的生命周期。
https://www.cnblogs.com/marsitman/p/11228684.html
讲一下MySQL的事务及其实现。
讲一下MySQL的隔离级别及其实现。
https://cloud.tencent.com/developer/article/1431307
6与7参考这篇博客就可以。
算法题:三个线程交替打印1、2、3,直到100。
当时面试的时候思路是对的,使用Condition来控制三个线程的先后顺序,但没有想到Condition在使用await()方法的时候需要线程拥有锁才可以,于是在面试过程中我没有写出来,也就顺利成章的挂了。
面试复盘后,这里给一个我自己的实现。
public class Main { public static class Number { public ReentrantLock lock = new ReentrantLock(); public Condition c1 = lock.newCondition(); public Condition c2 = lock.newCondition(); public Condition c3 = lock.newCondition(); public int number = 0; public void a() { lock.lock(); try { if (number % 3 != 0) { c1.await(); } if (number <= 100) { System.out.println(Thread.currentThread().getName() + ":" + number++); } c2.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void b() { lock.lock(); try { if (number % 3 != 1) { c2.await(); } if (number <= 100) { System.out.println(Thread.currentThread().getName() + ":" + number++); } c3.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void c() { lock.lock(); try { if (number % 3 != 2) { c3.await(); } if (number <= 100) { System.out.println(Thread.currentThread().getName() + ":" + number++); } c1.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } } public static void main(String[] args) { Number number = new Number(); new Thread(() -> { for (int i = 0; i < 34; i++) { number.a(); } }).start(); new Thread(() -> { for (int i = 0; i < 34; i++) { number.b(); } }).start(); new Thread(() -> { for (int i = 0; i < 34; i++) { number.c(); } }).start(); } }#Java开发##面经##腾讯##校招##后端开发#