2023 年初的富途牛牛面试复盘
面试
一面(1 小时 40 分钟)
面试官先介绍了富途的面试流程,技术面试一共分为 3 轮,其中第一轮是考察基础、数据结构算法、编程基础、计算机理论,二三轮会继续拓展广度和深度,通过后续还会有 HR 面。
- 介绍一下近两年工作使用的语言、框架、使用的存储组件?
- Golang 用了多少年?
- 找工作的原因和背景?
Go 基础
- 切片和数组有什么区别?
- 切片底层数据结构、扩容时机和策略?
- 问一段代码输出结果(具体代码记不清楚了,但拟了一段类似代码)?
func main() {
arr := []int{1}
myfunc1(arr)
fmt.Println(arr)
arr = append(arr, 3)
arr = append(arr, 4)
myfunc2(arr)
fmt.Println(arr)
}
func myfunc1(arr []int) {
arr = append(arr, 2)
arr[0] = 0
fmt.Println(arr)
return
}
func myfunc2(arr []int) {
arr = append(arr, 5)
arr[0] = 9
fmt.Println(arr)
return
}
- 已知元素长度申请切片的时候应该怎么做?
- defer 方法执行顺序是、(参数确定的)时机怎么样的?
- 问另一段代码输出结果(也同样是拟了一段类似代码)?
func main() {
fmt.Println(test1())
fmt.Println(test2())
fmt.Println(test3())
fmt.Println(test4())
return
}
func test1() (v int) {
defer fmt.Println(v)
return v
}
func test2() (v int) {
defer func() {
fmt.Println(v)
}()
return 3
}
func test3() (v int) {
defer fmt.Println(v)
v = 3
return 4
}
func test4() (v int) {
defer func(n int) {
fmt.Println(n)
}(v)
return 5
}
- 什么是哈希函数?哈希函数有什么特性?
- Golang 标准库中 map 的底层数据结构是什么样子的?
- Map 的查询时间复杂度如何分析?
- 极端情况下有很多哈希冲突,Golang 标准库如何去避免最坏的查询时间复杂度?
- Golang map Rehash 的策略是怎样的?什么时机会发生 Rehash?
- Rehash 具体会影响什么?哈希结果会受到什么影响?
- Rehash 过程中存放在旧桶的元素如何迁移?
- 并发环境共享同一个 map 是安全的吗?
- panic
- 如果并发环境想要用这种哈希容器有什么方案?
- sync.Mutex / sync.RWMutex
- sync.Map
- 加锁存在什么问题呢?
- sync.Map 比加锁的方案好在哪里,它的底层数据结构是怎样的?
- 缓存 + map 组成的结构
- 底层 map 的操作依然是加锁的,但是读的时候使用上缓存可以增加并发性能
- sync.Map 的 Load() 方法流程?
- sync.Map Store() 如何保持缓存层和底层 Map 数据是相同的? 是不是每次执行修改都需要去加锁?
- 一致性哈希了解吗?
- channel 被 close 操作之后进行读和写会有什么问题?
- 未被初始化的 channel 进行读写会有什么问题?
- channel 底层数据结构是怎样的,尝试用结构体来表述一下?
写代码
- 给定一个正整数数组 arr,求 arr[i] / arr[j] 的最大值,其中 i < j。
网络
- TIME_WAIT 状态出现 TCP 的哪个阶段(或者场景)?
- 查看 TCP 连接状态需要用什么命令?
- 发现存在大量 TIME_WAIT 状态会存在什么问题?
- 出现大量 TIME_WAIT 的话应用层有什么优化方案?
- 连接池的中心思想是什么?主要解决的是什么问题?
- 了解 TCP 中的粘包现象吗?
- 如果有一个请求需要发送数据,但是我想把包拆分开(不等待),在应用层应该怎么做?
存储
- 如果一个表中有主键和普通索引,查询命中主键和普通索引有什么区别?
- 聚簇索引具体是个什么样的数据结构?
- 这种数据结构对于范围查找有什么好处?
- InnoDB 中的隔离级别有哪几种?
- Read UnCommitted 存在什么问题?
- Read Committed 解决了什么问题又存在什么问题?
- Repeatable Read 会面临什么问题?
- 什么是幻读现象?如果另一个事务插入了一个条的数据可以被读取到吗?
- Redis 的哈希数据类型,想插入元素,底层数据结构是怎样变化?
- 哈希数据类型一定会用上哈希表吗?
- ziplist 的存储结构是怎样的?
- Redis 的持久化机制有哪几种?
- RDB 的原理是什么,用在哪些场景?
- AOF 的原理和使用场景呢?
- AOF 对于写入特别频繁的场景会存在什么问题?
- AOF 在做压缩的时候 Redis 对外是否正常提供服务?
写代码
- 给定 n 个不同元素的数组,设计算法等概率取 m 个不同的元素
反问
- 了解面试部门的基本情况?
- 部门内微服务的数量?每个研发大概会负责多少服务的开发工作?
- C++ 和 Golang 在团队内的使用场景和比例?
- 研发对开发质量的保障是如何完成的,测试和覆盖率是否有要求?
- 研发和测试的人员配置比例?
- 前面很多问题都没有答对,面试官的建议?
二面(1 小时 10 分钟)
- 自我介绍
- 了解团队规模,在团队中的角色
- 平时在技术成长上是怎么做的?
- 相关技术积累的文章是团队一起写的还是独立完成的?
- 了解一下过往绩效?
- 看工作机会的原因?
场景题
- 如果做一个翻译服务,翻译能力来自于供应商,如何从技术上对几家(A、B、C)供应商作出评估?
- 如果几家都要接入,且各家之间的翻译能力都各有优劣,那应该如何去搭建这个服务的框架?
- 调度器
- 数据采集 / 反馈机制,帮助调度器更好地工作
- 可扩展性,固化供应商的接入标准,方便未来扩展更多供应商选择
- 除了回答的这些方面,一个服务的设计还需要注意什么?
- 正常服务应该提供的网关,包括鉴权、限流、多租户
- 提供给外部的服务需要注意 SLA,SLA 则围绕日志、监控、Tracing 做文章
算法题
- 操作系统有任务管理器,管理任务的执行,任务之间存在依赖关系,写一个算法判断是否存在任务的循环依赖?
- 是否了解二叉排序树?左子树比根小,右子树比根大,如何移除一个二叉排序树的节点?
- 这个题目卡了挺久的,因为数据结构和算法比较薄弱,面试官给了很多提示,包括指引我从最简单的情况(所有节点只有左节点)开始考虑;
- 一副扑克牌中随机取 5 张,取到顺子的概率是多少?
- Hint 1:一种花色有多少种顺子?9 种
- Hint 2:一个顺子有 5 张牌,有多少种组合可能?4 ^ 5 种
- Hint 3:分子已经知道了,分母怎么表示,n 张取 m 张怎么表示?
中间件基础
- 消息中间件是否了解?Kafka 是否了解?了解它的基本组件吗?
- 不了解
- Redis 实现的分布式锁有了解吗,讲一下?
- Redis 分布式锁中设置超时时间有什么考虑?
操作系统
- 线程和协程有什么区别呢?
- 协程在开销和轻量的优势具体体现在哪些地方呢?
- 怎么理解线程安全?
- 产生线程安全问题的原因是什么?
- 两个线程做自增的操作(i++),各做 10 次,最终这个变量可能的值最大和最小各是多少?
网络
- 平时有抓过包吗?
- HTTPS 包抓包原理是否了解?
- DNS 是否了解?
反问
- 项目基本都是微服务 & Kubernetes 这套方案吗?
- 研发跟基础设施打交道能到什么样的深度,例如能使用 Kubernetes 的那些内容,中间件的使用权限上有什么样的管控?
- 正常业务的 CI/CD 里面都做了/集成了多少测试或检查?
- 业务的研发能在 Kubernetes 上具体写哪些东西呢,例如 sidecar、operator 等等?
- 有专门的团队去做,但是还在起步阶段,大家都可以贡献;
三面(1 小时 10 分钟)
项目
- 自我介绍
- 数据库迁移的原因是什么?
- 完成迁移之后 DB 成本降低多少?
- 迁移过程中双读双写具体是什么样的方案?
- 双写过程中只写成功了其中一个 DB,返回给用户报错,那是否会存在脏数据呢?
- 双读具体是什么方案,其中一个读成功了就返回还是要两个都读成功才可以?
- HTTP 流量的录制工具主要是做什么用呢?
- HTTP 流量录制会涉及到一些登陆态的处理吗?
计算机基础
- HTTP 主流版本是什么版本?
- HTTP2 相对于 HTTP1.1 有什么新的特性呢?
- HTTPS 是怎么保证安全性的呢?
- SSL 里的公钥是谁给到客户端的呢?怎么验证没有被篡改呢?
- 为什么要选择对称加密和非对称加密一起使用呢?它们各有什么优缺点?
- 提供短链服务的时候是否有支持 HTTP 缓存呢?
- 缓存机制是什么样子的呢?
- HTTP 缓存除了通过超时时间来做,还有其他的机制吗?
- 多线程编程中线程安全怎么来保证呢?
- 刚刚谈到加锁,加锁的话一般有哪些类型呢?
- 读写锁有什么优点呢?
- CAS 是什么样的机制?
- 开发过程中怎么避免死锁呢?
- 内存泄露和内存溢出有什么区别呢?
- 熟悉的排序算法有哪些?归并排序和快速排序还记得原理吗?
- 归并排序时间复杂度是什么?有什么样的优缺点呢?
智力题
- 掷骰子,游戏规则:希望结果尽可能大,如果对第一次的结果不满意可以掷第二次,但是第一次结果就作废了,以第二次的结果为准。这个掷骰子结果的数学期望是多少呢?
写代码
- 输入两个整数 a 和 b,输出他们相除的结果,如果有循环小数用括号表示。如:
- a=-1,b=2,输出 “-0.5”
- a=1,b=3,输出 “0.(3)”
- a=10,b=80,输出 “0.125”
- a=-100,b=10,输出 “-10”
工作规划
- 换工作主要是什么原因呢?
- 对富途了解吗?
- 现在团队规模?
- 工作中的同事怎么评价你呢?
- 平时有什么兴趣爱好?
反问
- 一、二、三轮的面试官都是团队中的什么角色呢?
- 组织架构中小组、中心的概念和规模?
- 作为管理者如果看到团队中的技术氛围比较欠缺,会考虑什么样的手段(去提升)呢?
- 在已有组件能支撑业务的情况下,如何看待 Member 提出的一些组件的升级或引入呢?
- 对于 CI/CD 这块,可能不会直接产生业务影响(例如更高的订单量),在公司的现状如何,以及如何看待将时间投入在这上面呢?
- 前面很多问题都没有答对,面试官的建议?