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 这块,可能不会直接产生业务影响(例如更高的订单量),在公司的现状如何,以及如何看待将时间投入在这上面呢?
  • 前面很多问题都没有答对,面试官的建议?