之前很多同学嚷嚷有没有社招经验,正好,我有个朋友去腾讯社招面试了。
他的面的是全栈开发岗位,工作两年,后端是Go,前端是 JavaScript + Vue。
因为工作也没多久,就两年时间,所以大概率可能还是一半考察业务,一半考察基础,事实证明,基础占六成,业务占四成,其中业务就是自己在工作中的具体业务,基础则就是校招那些东西,编程语言、操作系统、计算机网络、数据库(MySQL + Redis)、算法等。
大概是三月份的时候就断断续续开始找一些机会,其实去年 11-12 月份的时候他就刷过一些算法题,当时就想着找找感觉,刷了小 10 天就没再继续刷了。
而在今年一月份的时候他就开始在力扣上重新刷题了,一直断断续续的刷,总共加起来 200+ 道题是有了。
对接触一线业务的后端程序员来说,第一次跳槽,那么编程语言、计算机网络、数据库、操作系统四大块是一定绕不开的,这四块是最基本的根基所在,系统和网络还好,数据库绝对是考察重点,在此之上才是一些其余的分布式、微服务架构、服务治理等。
最后再在面试中补充你自己对工作项目的思考,聊聊你的业务,所负责的模块,前期做的一些市场调研,以及与同行的方案对比,你的创新点或者说优越点在哪里。
其实工作久了的人就会知道:编程语言不重要,重要的是业务,这句话有多么的对。
一面
鹅厂一面是个小哥,应该是做后端的,基本围绕着Go和计算机基础来问,面试时间很长,差不多一个半小时了,前端基本没问。
1、看你自我介绍是写全栈的?前端技术如何?
答:工作中自学的前端,会写一点,不算很好,基本够用的水平
2、前端开发过程中有遇到什么自己觉得难搞的点吗?
答:有,有一个功能印象较深,开发实现了url页面分享的功能,这个在我们开发时市面上还没有很好的例子,并且在内网分享会上写了文章进行分享。
哦,那挺好的,那我们聊些后端吧
3、Go 里面使用 Map 时应注意问题和数据结构?
答:可以通过定义 value 为 struct 来节约内存;哈希分桶的结构,用哈希值的高八位和低八位分别来做桶内定位的依据和分桶的依据等;
4、Map 扩容的细节可以说一下吗?
答:这个《Go 语言底层原理剖析》这本书里有,不展开,其实跟 Redis 中渐进式 rehash 的思路差不多;
5、Rehash 过程中存放在旧桶的元素如何迁移?
答:见2
6、sync.Map 比加锁的方案好在哪里?底层数据结构?
答:缓存 + map 组成的结构;底层 map 实际依然是加锁的,但是读的时候加上缓存可以增加并发性能;
7、如果有这样一个场景,在并发环境想要用哈希容器,你会采用哪些方案?
答:sync.Mutex / sync.RWMutex或者sync.Map
8、还是上面那个场景,并发环境共享同一个 map 可以吗?
答:不可以,可能会panic
9、channel 知道吧,他的底层数据结构大致说说?
答:见2,不赘述
10、mysql中的事务?
答:事务是一组操作单元,要么全部执行成功,要么全部执行失败,不存在第三种情况,主要用来保证数据库一致性。
事务具有四个特性:ACID
-
原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部执行失败,不会出现部分执行的情况。
-
一致性(Consistency):事务执行前后数据库的状态是一致的,即数据库中的约束和规则都得到了保持。
-
隔离性(Isolation):多个事务并发执行时,相互之间不会影响彼此的执行结果。
-
持久性(Durability):事务执行完成后,对数据库所作的修改将被永久保存到数据库中。
11、索引什么时候下会失效?可以举个例子吗?
答:场景很多,比如一次性查询超过全表40%以上的数据,gorm框架里自带一个model结构,其中有create_time字段,如果我按照 create_time 去做范围查询,查询1970-2021年间的数据,那么索引就形同虚设了,因为走的是全表扫描;
12、写个SQL吧,求一个商品表中价格最高的第10和第14个产品?
答:使用limit关键字
13、有写过查询时间很慢的接口吗?最后有查到原因吗?
答:有,写过,入职没多久的时候遇到过这个问题,好像是刚入职一个月左右。
最开始以为是SQL写的不行,直接用explain看了一下发现没什么大问题,索引也用上了,后来排查下来发现是缓存没加上。。。每次取数后忘记回表了,这样每次都走的DB,redis根本没用上,所以导致每次都很慢😂
14、你们做的具体业务?
答:大致说了一下自从我入职以后做的业务,面试官偶有打断并询问,因为是内部项目不公开,就不展开了。
15、三握四挥具体过程?
答:老八股文了
16、算法题:最长子序列
反问:
-
部门业务?
-
腾讯基架服务如何?
-
常规上下班时间?加班现象如何?
小哥直接说过了,问我接下来有没有时间,二面面试官现在正好空,方便的话可以继续面,不方便的话再找HR约时间。
求之不得,我这个人最不喜欢拖泥带水,一次性面完最好。
二面
10分钟后二面开始了,年纪稍大的一个老哥,30+岁的样子,脑袋有点秃,头顶有点亮,看起来像个大佬的样子,我坐直了身子,开始认真回答。
1、你负责的业务是什么?
答:balabalba,二十分钟过去了
2、前端开发多还是后端开发多?你觉得你的前端水平如何?
答:前后端四六开吧,刚入职时写过半年的前端,后面一年半只写自己功能模块对应的前端了。
我感觉自己的前端水平属于半吊子水平,野路子出生,没有经过系统学习,都是工作中学会的技能,不瞒你说我以前在学校的时候学的都是后端技术栈,所以最开始写前端,全靠抄组内同事的代码,找一个差不多的页面就开抄,抄着抄着就会写了。
老哥笑了一下。。。
3、前端回调地狱是什么?
答:在JavaScript中,多层嵌套的回调函数造成的问题。在处理异步请求时,为了保证数据的同步和正确性,往往需要使用回调函数。当多个回调函数嵌套在一起时,就会形成回调地狱。
4、有哪些解决方案?
答:Promise或者async/await
5、diff算法是什么?
答:diff算法是指在前端框架中用来对比两个虚拟DOM树的差异,并将差异更新到真实DOM上的一种算法,可以减少渲染次数,提高渲染性能,避免对整个页面的重新渲染,从而提升用户体验。
基本思路是,通过对比虚拟DOM树中节点的属性和内容的变化,来确定哪些节点需要更新,哪些节点需要删除,哪些节点需要新增。
6、vue生命周期?用的哪个比较多?
答:大致有八个生命周期:beforeCreate、created、beforeMount、mounted、beforeUpdate、updated、beforeDestroy、destroyed。
我们用的最多的是created和mounted,前者created是在实例被创建后会被调用。在这个阶段,Vue实例已经创建完成,数据已经初始化好,可以访问实例的数据和方法。但此时还没有开始模板渲染;mounted则在挂载完成后被调用,此时实例已经被挂载到页面上,并且可通过DOM获取到。在这个时期,实例的数据绑定和状态也更新完毕了。
7、vuex用过吗?想在一个页面中使用两个模块的属性?比如一个用户模块,一个商品模块,应该用什么关键字去调用?
答:用过,页面中使用computed和mapState来做区分,可以自定义别名来做。
8、分布式锁如果是基于 Redis 的会有什么问题?
答:锁可能会失效,在主从模型下同步并不保证一致,这种场景下会失效。
9、Redis 使用的过程中有碰到过一些热 Key、大 Key 的问题吗?如何处理?
答:我理解是想问如何定位key,说 rdbdump 导出之后做(离线)分析,看看哪个 Key占的空间特别大,再做处理,比如哈希、打散等;
10、如果有一些热点 Key,比如某个链接被明星分享了,访问就会很频繁,怎么办?
答:这不就是redis的存在意义吗?里面放的就应该是热数据啊。
如果热点数据里面的 Value 过大,可以尝试使用多线程来缓解网络IO压力,这是Redis 6的功能。
11、后台服务架构中如何设计?怎么才能高性能一些?
答:划重点,超级难的一个问题!!!,聊了很久,这个问题来来回回大概聊了差不多30分钟都不止,从以下几个方面聊了很久:
池子:内存池、连接池、对象池
并发:请求并发、请求冗余
异步:调用异步、流程异步
缓存:缓存分类、缓存回收、崩溃修复
数据库:分库分表、动态平衡、任务分片、路由策略、读写分离
12、随便写道题吧,我也不想考,但这是规定,力扣接雨水
答:啊行行行,你是面试官,你咋说都行,磕磕绊绊写出来了。
反问
-
询问我的不足之处?答:基础很好,建议加强表达。?????我摸不着头脑,不知道啥意思,没再追问
-
部门业务?如果我能够通过面试,会负责哪些业务?
-
项目组的细节,比如代码组织、管理形式等。
今天就到这里了,后面有机会再分享一下其余厂的面经。