记录一次腾讯Go开发岗位面试经过

跳槽看机会是每个职场人的必经之路,笔者也是个俗人,加上公司领导也是对人不对事的,于是在猎头的怂恿下,我就有了想试试的冲动,毕竟闭门造车是兵家大忌。而事实证明,确实如此。我们没有用到微服务,没有高并发,没有什么值得拿出手的技术亮点。惭愧,想要拿高薪,还要继续学习才是。于是面试完之后我赶紧记录一下,起码知道自己改学习的方向有哪些。作为一个只有两年后端经验的小白,面试完之后就只有一个想法,不容易啊。

先记录下面试问的问题:

1、谈一下Go的GC机制

2、说下三色标记算法的原理

3、算法:判断链表是否有回环

4、介绍下自己的项目

5、开发的流程规范是什么?

6、半连接是什么?

7、粘包是什么?怎么发送的?

8、怎么创建索引

9、怎么避免缓存击穿,还有其他的什么方法吗?

10、go的mutx怎么使用,乐观和悲观锁分别怎么实现,使用场景是什么?

11、服务器受到攻击怎么定位服务器问题?

12、rpc的具体实现

13、怎么反转树的左右节点

14、谈谈epoll和select

在问到第14个问题的时候,我直接放弃了,因为我知道接下来要问什么。面试造火箭,工作拧螺丝,这话一点不假。接下来肯定问区别和实现原理。在我放弃之后,我就请教了一下面试官,顺便验证一下我的猜想。面试官确实打算这么问。后面我就干脆问下,我该继续学习补充哪些知识点?面对这样的面试,我该怎么回答问题?面试官人还比较好,说回答问题要有深度和广度,一个问题要由此及彼的回答,并且和多语言之间进行对比。

惭愧的是,前十个问题我还知道,从第十一个问题开始我就不知道了。后面的操作系统和网络安全相关的,我就是个小白,更别谈实现原理了。搞GO的,一定要会微服务,不管你简历上有没有写这些技术。所以,同学们一定要研究这块,否则进大厂无缘了。大家加油!


     之所以不贴出答案,是因为我本人也是背书的,又有几个人是看源码就知道的呢对吧,都是看别人的文档,所以提倡去自己找答案,这样印象深刻,正如下面评论说的,不是工作用到的,谁会知道?就算背下了,不久也是会忘记的。我就说下面试过程和我的回答吧。

    一开始的面试就是不平等的,我必须开视频,人家不开视频,我对着屏幕上的自己回答问题。1、开始问GC,我直接回答:Go会定时进行GC清理操作,为了防止频繁的触发GC,在内存达到某个阈值的时候也会进行GC操作。可能回答的没达到他的预期,就打断了直接问2、三色标记算法,我回答的也简单:这是清除-标记算法的一种,在1.9之前版本,清除和标记都会进行STW,之后的版本为了减少STW的时间,采用异步清除,但是标记阶段还是会有STW。大致的原理是,轮询白色区域,有引用放入灰色,轮询灰色有引用放入黑色,黑色不进行轮询,所以为了加强数据的准确性Go添加了写屏障。面试官这时候就嗯了一句,就问了个算法,3、回环连表的判断这个刚好我做过有点印象:两个指针,分别是前指针和后指针,按照节点往下走,当前指针位置大于或者等于后指针的位置时就代表有回环。然后面试官又是嗯了一句就开始问项目相关的东西了。所以45都是根据简历上实际项目进行问的。可能因为项目中没有涉及到微服务,就没怎么往下问,就开始问网络相关的了,我估计半连接和粘包都是随口问问的,半连接是TCP三次握手的初始阶段出现的,粘包是长连接比较常见,但是我没回答完就下一个问题了。8、创建索引,我是直接说根据业务来实现,不能直接这么问吧,然后我就从B+树的结构说起,谈到了引擎和联合索引,覆盖索引以及回表的原因和过程。后面还问了一句:为什么mysql用B+树,我说这是产品特性问题,每个产品的侧重点不同,采用的算法也不用。MongoDB侧重单条记录,MySQL侧重遍历和数据关联,不过,看面试官的语气显然不是他要的结果。至于9、避免缓存击的其他方法,可以当redis获取为空的时候设置一个空串,但是没有互斥锁保险。乐观锁和悲观锁 的使用场景无非就是效率问题,时间相应短的需求就是乐观锁,稳定和保险采用悲观锁。再往后的问题,就是象征性的问吧,具体答案,我也没法贴,只能大家自己去找了,操作系统的东西,实在接触不上,时间短见效慢。待我有空再来一个一个解答。

     关于面试:对于一般的公司,基本只看工作年限。我去过高灯面试,开始写的是一年经验,过了初面,第二面的时候说相关经验时间太短,面试官面都没见到就让我离开了。第二次,我改成3年换个部门,这个复试倒是看到面试官了,但是说只能给个中级岗位。我在想要不要写成6年的后端开发经验,估计就会评一个高级的了。我也去过明源云面试,也是写的一年经验,但是,这个就有点悲催了,问的都是语言的新特性,甚至连多态和继承都问,这个面试官比较年轻,说想要个年纪小点的培养,我尼玛。。。面试这种事情,以前是三分天注定,七分靠打拼,现在怕啥反过来了,除了大厂的技术硬伤之外,其他的面试大家随缘就好不要强求,毕竟到哪都是坑,只是有的臭有点特别臭,仅此而已。欢迎吐槽,^_^
本作品采用《CC 协议》,转载必须注明作者和本文链接
欢迎转载分享提意见,一起code
本帖由系统于 3年前 自动加精
棋布
讨论数量: 41

已经是别人的山头 了,你要上去,除非有黄继光的本事,就是上去了也没用,如果现在有一份工作,你就踏踏实实的做,换来换去都是那样。
话说回来,坚持在一个坑里做,不是技术有多牛(技术是原则性的持续精进),而是为人处世的技巧。我算是明白了。

  1. 跟自己的同事搞好关系,恰如其分
  2. 不跟任何一个上司交恶,防止被穿小鞋
  3. 闷声做事,抬头看人
  4. 多交朋友,少觉得自己了不起

后面慢慢就好了,我去年浮躁了一年,啥也没干成,今年我心想,换个小公司 没保障,换个大公司进不去,索性就在圆地方做,工资多少也就那样,工资的高低和技术的牛逼与否不是必然成正比的。所以,今年表现的柔和一点,工资瞬间就加上去了。美其名曰,今年的成长不小,我们都看在眼里呢!

3年前 评论
棋布 (楼主) 1年前
kevin-qiu (作者) 2年前

:see_no_evil:一直疑惑,面试问的这些东西如果不是工作上一直用到,很难回答上来吧!感觉这种面试模式也是中国应试教育的一种延续 :grin: :grin: :grin:

3年前 评论
棋布 (楼主) 3年前
starwu 3年前
frans 3年前

厉害了,我哭了出来~~

3年前 评论
棋布 (楼主) 3年前

我能答出来的也就五道题 :joy:

3年前 评论
棋布 (楼主) 3年前

:joy: 我一道题都答不上, 大佬能不能把答案也写上

3年前 评论
棋布 (楼主) 3年前
棋布 (楼主) 3年前
Sunsongoing (作者) 3年前

还是要靠内推,不然面试就是背的都没问,问的都没背

3年前 评论
largezhou 3年前
棋布 (楼主) 3年前

写出了我的心声

3年前 评论

萌新瑟瑟发抖 , 全部都不会, 或者讲不好,

3年前 评论
棋布 (楼主) 3年前

七分靠缘分,三分靠打拼

缘分一:你的过往经历和岗位的相关性,如果强相关,技术倒是其次了,如果你的过往经历太杂,就只能从技术本身去面试你了

缘分二:面试官自身技术水平也会影响面试的难易

缘分三:面试官的性格,有些面试官很古板,专注技术,有些面试官比较开放,会看重求职者的思维发散能力

缘分四:公司或项目所处的阶段,公司处于扩张阶段,招人会很宽容,如果处于守成阶段,每进一个人都是百里挑一

缘分五:大公司的萝卜坑(概率比较小)

3年前 评论
棋布 (楼主) 3年前

面试官不开视频 你开视频,这感觉好难受啊。话说楼主是几年经验

3年前 评论
棋布 (楼主) 3年前
棋布 (楼主) 3年前
棋布 (楼主) 3年前
ZKJABLE 3年前

啥都不说了。点赞,收藏,加评论,素质三连。 :joy:

3年前 评论
棋布 (楼主) 3年前
_jue

就想知道你面的是多少的 :joy:

3年前 评论
jfpl 3年前
棋布 (楼主) 3年前

为什么mysql用B+树 这个问题我遇到过的面试官,基本想问的是你对B+树的理解,主要是横向对比下 B树B+树,哈希表这些的优缺点。如果拿不准,还是可以问下,你是想让我回答Mysql为什么用B+树。还是对比下Mysql和mongo再索引设计上的区别。毕竟是面试 不是笔试,问问清楚 也好针对回答。

3年前 评论
面试权威指南 3年前

你好,我觉得你把缓存穿透和缓存击穿的概念记忆混了。
解决缓存击穿问题的解决方案是,内存锁
set或者setnx加互斥锁,
如果redis是多台的集群情况下要加分布式锁用redlock(中文叫。看门狗?)

这里有几个细节
1.锁加上以后,删除的时候,怎么保证不会误删其他请求的锁?

2.第一个请求拿到锁以后,
其他请求该怎么处理?

3.拿不到锁是语言重试的

另一种解决方案是zookpeer实现。
欢迎交流

3年前 评论

这是在哪个城市?

3年前 评论
棋布 (楼主) 3年前

已经是别人的山头 了,你要上去,除非有黄继光的本事,就是上去了也没用,如果现在有一份工作,你就踏踏实实的做,换来换去都是那样。
话说回来,坚持在一个坑里做,不是技术有多牛(技术是原则性的持续精进),而是为人处世的技巧。我算是明白了。

  1. 跟自己的同事搞好关系,恰如其分
  2. 不跟任何一个上司交恶,防止被穿小鞋
  3. 闷声做事,抬头看人
  4. 多交朋友,少觉得自己了不起

后面慢慢就好了,我去年浮躁了一年,啥也没干成,今年我心想,换个小公司 没保障,换个大公司进不去,索性就在圆地方做,工资多少也就那样,工资的高低和技术的牛逼与否不是必然成正比的。所以,今年表现的柔和一点,工资瞬间就加上去了。美其名曰,今年的成长不小,我们都看在眼里呢!

3年前 评论
棋布 (楼主) 1年前
kevin-qiu (作者) 2年前

看了楼主的 我尼玛,原谅我不厚道的笑了 :joy:

3年前 评论
Mericustar

这些问题看似没用,实则还是有用的,除了个别题目,大部分还是偏向实际应用可能会遇到的问题,简单捋一捋
1,2 是让你对 GC 过程和机制有了解,结合 Go 的内存分配,在优化代码的时候就要注意 GC 的压力,尤其是早期 Go 版本,现在 GC 的损耗越来越小了

5 软件工程,最起码的常识

6 半连接是比较常见的攻击手段,一般加一层人工校验而不是完全依赖 TCP 协议就能解决,这块是在考量面试者对架构在安全方面的设计能力(有能力的人会直接从 TCP 三握里面推导出这个问题,有经验的人会知道有这个问题)

7 跟6相似,数据安全和传输的问题,TCP 自定协议栈的设计,考量面试者设计基本 TCP 服务协议的能力,在设计 TCP 协议时,就会遇到这个问题

8 数据库的,基础问题不用多说,起码要知道索引以及索引的类型和最左前缀原则,不然如何设计出符合 explain 预期的查询语句

9 处理请求安全的,还是校验,不管是非对称加密还是鉴权令牌桶还是布隆过滤器,毕竟对服务器开发来说,性能就是成本

10 不管是什么语言,只要是做服务器开发,做高并发的开发,锁 这个东西都是需要知道的,互斥锁,乐观锁,悲观锁,进阶一点自旋锁,分片锁,分布式锁等等

11 这属于开放问题,不管是从网络流量还是监控数据异常(CPU跳/进程/线程/协程完全卡死等),属于经验导向的问题,考量的还是面试者的是否有类似经验

12 基于传输层协议的应用层实现,这里只是举例了一个 rpc,也可以让你说说 HTTP 或者 FTP 或者什么流式传输的什么协议,还是考量面试者架构设计能力

13 了解可以,但没必要太深入,至于为什么,比如面试者不知道树的结构或者树反转的代价或者各种平衡树里面调整平衡的代价,又是一个只知道它性能好的半吊子,那就很有可能随意用这种树结构,从而写出比链表数组性能还要差的代码

14 涉及操作系统和 go 本身基于 epoll 实现的东西,还是考量面试者对 go 的 net 的设计是否熟悉,不过这个确实也没必要,除非对性能有非常扣的需求,才会去看 go 的 poll 如何搞,比如:go 自己基于 epoll 实现的网络轮询器 netpoll,它会把阻塞在 网络I/O 的 goroutine 挂载在网络轮询器上从而空出被占用的 M,那这时候如果你不知道有网络轮询或者多路复用,实现多协程/线程网络 I/O 异步的时候的思路就不一样了


我这么说可能有点马后炮的意思,但我从以往项目里面应用到的各种技术和可能的问题以及存在的问题,以及未来可能需要的技术提炼出来的知识点,就是这种看上去比较八股的东西

我也尝试过直接以经验导向而不是一个个问题导向去提问面试者,结果往往是面试者自己有过类似的经验,但场景一换很多时候自己就懵了

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!