golang工程师面试总结

笔者作为Golang面试官,曾经面试过不少候选人。在面试的过程中,一般会根据公司需要制定一些面试规则,例如:面试题型、面试分数占比、面试时间等等。在面试过程中也会记录候选人的表现,并在面试结束之后提交面试评语。

鉴于以往的面试经验,整理出本文,希望对那些正在准备面试的人有所帮助。

1. 基础能力

1.进程、线程、协程三者的关系与区别

拓展题
问题1:go的GMP模型以及三者关系
问题2:进程的内存布局大概分为几块?
问题3:用户空间与内核空间的区别?
问题4:上下文切换时一般需要做什么操作?

2.sync、context包的常用方法以及使用场景

拓展题
问题1:进程间通信的实现方式有哪些?
问题2:线程间通信的实现方式有哪些?
问题3:什么是并行?什么是并发?并行与并发的区别?

3.goroutine 泄露的排查步骤

拓展题
问题1:列举一些常见的会导致泄露发生的例子以及解决方法?
问题2:go的垃圾回收使用的是哪一种方式?
问题3:go的GC中内存屏障是什么?
问题4:go中常用的减小GC压力的方法?

4.并发时对临界资源的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func demo() {
var num int64
wg := &sync.WaitGroup{}

for i := 0; i < 100; i++ {
wg.Add(1)
go func() {
defer wg.Done()
num++
}()
}

wg.Wait()
fmt.Println(num) // ?
}

问题1:上面代码的 num 输出结果是多少?
问题2:要求 num 输出结果为100,有什么常用方法

拓展题
问题1:num++ 是否是原子操作以及如何判断?
问题2:实现原子操作的常用方法?

5.kafka 如何保证数据不会丢失?

拓展题
问题1:在分布式系统中处理数据常用的策略有哪些?
问题2:CAP理论指的什么?
问题3:BASE理论指的什么?
问题4:hash与一致性hash的关系?
问题5:什么是hash碰撞以及hash碰撞的解决方法?

6.Redis 实现排行榜?

拓展题
问题1:数据库与Redis不一致时,如何处理?
问题2:RDB与AOF指的什么以及如何实现?
问题3:列出一些 Redis 中常见类型的使用场景?
问题4:Redis 的内存淘汰策略有哪些?
问题5:Redis 实现分布式锁的方式以及注意事项?

7.MySQL中某表有联合索引(a,b,c), SQL: “select * from table where c=xx and b=yy and a=zz” 是否能用到该索引?

拓展题
问题1:什么情况下索引会失效?
问题2:创建索引需要注意什么?
问题3:MVCC 的实现?
问题4:事务的隔离界别以及每个级别会出现的问题?
问题5:ACID分别指的什么?
问题6:SQL语句的处理过程都有哪些?

8.实现服务注册发现的常用中间件有哪些

拓展题
问题1:举一个实现注册发现的中间件的详细实现方式
问题2:描绘一个常见的互联网分层架构以及每一层的组件、作用

9.发散性题目
与生活中的常见事物有关,同时需要把这些生活中的事物映射到开发中使用的场景以及解决方法上

见笔者的文章: 一道互联网公司的开放型面试题
https://blog.ivansli.com/archives/255/


对于上面的基础能力题来说,一般会根据实际情况来选择拓展题,从而挖掘候选人的知识深度,往往正是这些拓展题直接影响着级别的评定。

2. 算法实现

10.算法题(leetcode easy/middle)
两个整形数字字符串相加

拓展题
问题1:单链表翻转
问题2:非递归的斐波那契数列实现
问题3:非递归的遍历二叉树
问题4:数组的全排列
问题5:滑动窗口

3. 项目沟通

11.以往项目介绍

考察点
1.自己能独立推进/设计方案?
2.有没有自己深入思考?
3.为啥这么做?长期优化方案?
4.项目难度/高并发?

4. 面试类型与占比

整个面试过程大概分为3部分,如下所示:
1.基础能力(40分/20分钟)
2.算法实现(30分/20分钟)
3.项目沟通(30分/15分钟)

面试总分100,耗时40~60分钟。

5. 面试级别评定

候选人级别评定,60分为基准线(基准线以下基本不会进入下一轮)。60分以上,间隔10分为一个等级,即:
60分70分:初级
70分
80分:中级
80分90分:高级
90分
100分:资深

中、高级占比最多(50%),初级占比次之(40%),资深占比最少(10%不到)。

6. 总结

每家公司的面试风格以及要求不同,制定的面试规则也不同。有的公司会要求算法决定结果(算法挂,面试挂),有的公司会根据工作年限放宽算法要求(社招的算法要求比应届宽松,社招的中间件以及场景设计居多),有的公司也会根据实际情况调整面试题型以及占比。

总之,一切都是靠能力吃饭。
当然,进对公司、选对部门、跟对领导、做对事情,再好不过。