我们好,我是阳哥。

这篇文章共享了4个大厂的面经和部分答案:字节跳动、米哈游、富途牛牛、猿教导。别的也共享了在面试中像面试官反诘的问题,值得我们学习参阅。希望对我们有帮助,觉好留赞哦!

上一篇文章发布半天时刻,阅览就破千了,可见我们对面经的重视。一天约了4个面试,复盘一下面试阅历和薪资规划,

今日再为我们引荐一位大佬的面经共享,原文链接:jiekun.dev/posts/2023-…

目录

  1. 布景

  2. 面试预备

  3. 面试

    • 字节跳动
    • 米哈游
    • 富途牛牛
    • 猿教导
  4. 总结

  5. 一些引荐

1. 布景

间隔上一次面试现已曩昔快 3 年了,又碰上 2022 年互联网行业大动乱,许多企业都做出了裁员决定。身为互联网人要时刻重视自身生长,所以会对 “跟面试官切磋” 这种作业比较感爱好,其实也是一种打探行情的手法:

  • 3 年间自己的技能是线性生长、指数生长仍是对数生长,跟同龄人比较怎样?
  • 当前求职是买方市场仍是卖方市场?

因此收集这两个信息是我面试开始的意图,当然整个进程很长,终究的挑选也会受许多作业影响。

2. 面试预备

结业之后我在两家公司作业过,触及的事务包含营销数据剖析、供应链物流、社媒广告投进等。每个范畴包含的内容都比较多,除非是手上正在担任,其它内容想回忆起来是适当难的。因此在简历撰写上,尽量将事务转化为技能模型,优点在于:

  1. 让面试官能更多地从技能视点切入谈某项事务;
  2. 求职方向更灵活,没做过这项事务的面试官也有问题可问;
  3. 减少自己温习过往事务的时刻(摆烂)。

正常来说简历预备好之后,要有具体的专业常识做支撑。考虑到作业年限不长,所以仍是以根底为准,对触摸一线事务的后端来说计算机网络、数据库、操作系统三大块是必定绕不开的,在此之上搭建分布式、微服务架构、服务治理等常识结构。终究弥补对作业项意图思考,例如做的项目在业界中是否有竞赛对手、我们的计划横向对比有什么好坏点,自己的创新点在哪里等等。

可是面试预备是服务于我的面试意图的,根据评估自身技能水平的主意,我终究也没有拿起讲义,而是决定看看在 “不刻意预备”(摆烂)的状况下能表到达什么程度。个人不以为裸面(again,摆烂)是个好的、值得推广的实践,这导致在面试的时分许多问题(例如:是否了解 Kafka、是否了解一致性哈希)我挑选直接答复 “不会”、“没了解过” 来防止 follow up questions,可是在一些特别布景下的确能够更实在反映出自身的水平。

当然,面试中有一些比较 “硬” 的条件要求(算法题咱说的便是你)是须要有所积累的。因为自身不拿手算法,解新题其实会需求必定的时刻,所以我挑选反复写 Top 100 Like 的老标题来坚持手感。

2023最新后端中大厂面经&在面试过程中如何反问?

终究关于求职方向的挑选,更多是出于个人偏好,不具备什么可参阅性。对我来说,因为未来倾向于换到云原生相关的赛道,那自然是以根底架构相关的岗位为主。可是找到 100% 契合方针的职位其实是很难的,并且所谓的 “云原生”、“根底架构” 自身便是个十分大的规划,其间细分方向、功能许多。咨询了一些朋友的意见,终究也是尽或许地往方针方向靠拢即可。

3. 面试

求职进程中,有一些公司是直接拒掉了简历的,一方面是简历比较一般,其次也或许的确没有招人的需求。这也是契合预期的,平常我们开发的时分Liveness Probes也会有失败,说明(简历)该回炉重造了。Anyways,终究进入面试流程的有 4 家,假如只对其间某一家感爱好的话能够从导航目录直接跳曩昔。

在面试进程中我都会进行录音,这是个很有收益的作业,过往面试中我观察到有些同学会自以为答复得 “尚可”,殊不知许多细节只是在脑中形成思路,在表述上则是时断时续。任何细节的缺失在面试官听来都或许导致了解上的差异,终究予以不够好的点评。面试后听录音重新 Review 面试,能够从面试官的视点听自己的答复,也方便收拾面试阅历。

3.1 字节跳动(国际化电商)

字节的面试流程是组内面试官->组外面试官(穿插面)->组内面试官,当然因为菜的原因没持续走到第三面。两位面试官都很感爱好所做的事务,聊事务的比重也是 4 家中最多的。别的字节的面试的时分有个小插曲,二面刚好是疫情爆发最严峻的时分,顶着发烧面试也算是一次独特的阅历吧。

具体记载:写在 2022 年底的字节跳动面试复盘

一面摘抄

  • 了解索引下推吗?什么状况下会下推到引擎去处理?

    • 经过某个索引没办法按次序地覆盖一切的查询条件,可是仍然能够运用索引内存在的字段(虽然不是有序的,需求扫描)去进一步过滤;
    • 举例:idx(a,b,c,d),查询条件为 a=? and b=? and d=?,产生下推减少回表数量;
  • 什么场景下索引会失效?

    • 场景有许多,可是假如我是一个引擎,我重视的不是什么状况会失效,而是走什么路径所花费的随机 I/O 和次序 I/O 最少,假如走某个索引花费的随机 I/O 比从聚簇索引(次序)查(本钱)都还要高,那还不如直接去全表扫描;
    • 典型比方:捞超越全表 30% 的数据;
  • 有没有具体一点的比方?

    • 仍是刚刚说到的比方,比方说我要依照 update_time 去做规划查询,捞许多的数据,即使 update_time 有索引,也会挑选全表扫描;
  • WHERE id NOT IN (?, ?, ?) 会走索引吗?

    • 仍是要看本钱;
    • 举例:id 字段只包含 3 个值,1、2、3,3 只要几行,而 1、2 各有 100w 行,假如查询条件是 NOT IN (1, 2) 会走索引,假如查询条件是 NOT IN (3) 不会走索引。

反诘环节

  • 团队里边大约有多少个仓库、布置了多少服务(大致规划)?

  • 这些项目会做单元测验吗,或许说平常的自测、代码质量保障是经过什么方式做的?

    • 东西类的库会写单测;
    • 自动化测验会由流量回放渠道,QA 履行常用的用例;
  • 整个流量回放都是 QA 担任的吗?

    • 后端需求在代码里边做合作;
  • 一个事务迭代版本是怎样安排时刻发布的呢,比方说是每周固定发布仍是说测验完结后的几天发布?

    • 按双月来排期,产品拟定优先级, 研制扣除 oncall 等时刻分配任务;
  • oncall 那周安排多少时刻精力做 oncall 和其它问题?

    • 80% 时刻在 oncall,剩余的时刻会看状况修正一下线上和其他的小问题;
  • 前面许多问题都没有答对,面试官的主张?

二面摘抄

  • 这种(短链接服务)场景里边写入(创建短链)耗时长可否忍受?

    • 必定程度上是 OK 的因为创建短链的请求比拜访短链的请求少许多,忍受度更高;
  • 在这个许多 KV 数据读写的场景,为什么不考虑直接运用 KV 存储或许 Redis 来支撑?

    • 考虑过,可是短链服务本质上更需求背后收集到的拜访数据来表现事务价值,而拜访数据的聚合剖析需求数仓,公司内没有很好的 KV 存储到数仓的支撑,不想当小白鼠;
  • 为何不考虑数据仓库提供 HBase 来支撑读写,节约掉 MySQL / KV 存储同步到数仓的进程?

    • 嗯,好像是个可考虑的主意,可是不太了解 HBase;
  • 能说一下 LevelDB 的存储结构吗?

    • 内心:完了写上简历了但又没温习,啥都不记得了;
  • 算法:定义 Redis 跳动表的结构,再完结一版它的刺进方法。

    • 内心:orz。

反诘

  • 在字节的技能人关于公司的根底架构的满意程度怎样?

    • 该有的都有;
  • 外出参与技能会议、交流在字节里机遇是否丰厚?

  • 前面许多问题都没有答对,面试官的主张?

3.2 米哈游

整体来说面试问题都很根底和简略,能不能经过的话(假如没特意温习)就靠平常的积累了。Golang 岗位里对数据结构的提问十分频频,个人以为对mapsync.Mapcontext等的了解程度应该到达能完整记忆每个结构体字段的水准。

具体记载:2023 年初的米哈游面试复盘

一面摘抄

  • Go 里边运用 Map 时应留意问题和数据结构?

    • 能够经过定义 value 为 struct 来节约内存;
    • 哈希分桶的结构,用哈希值的高八位和低八位分别来做桶内定位的根据和分桶的根据等;
  • Map 扩容是怎样做的?

    • 依照 Redis 渐进式 rehash 的思路说了一版;
  • Map 的 panic 能被 recover 掉吗?了解 panic 和 recover 的机制吗?

    • 不明白,可是实际上是不能够的,具体原因能够看看 Map 并发读写的时分抛出的是什么,是不是一般的 panic;
  • Map 怎样知道自己处于竞赛状况?是 Go 编码完结的仍是底层硬件完结的?

    • 经过结构体中的标记位完结的,或许是经过 CAS 操作的;
  • CAS 具体是怎样完结的呢?

  • 并发运用 Map 除了加锁还有什么其他计划吗?

  • 有对比过 sync.Map 和加锁的差异吗?

  • 说一下(Redis)分布式锁的完结?

    • setnx / 仅有 value / ttl
  • 根据 Redis 的分布式锁会有什么问题?

    • 主从模型下同步不保证一致会导致锁失效
  • Redis 分布式锁超时能够超时时刻设长一点能够吗?不能够的话需求怎样处理?

    • 不根本处理问题,能够考虑旁路的 goroutine 不断自旋续期
  • 对 Redis 锁续期这个怎样完结呢?

  • 日常在用的 Redis 集群都是什么架构?在主从方式和 Redis Cluster 中分布式锁会有什么问题?

反诘

  • Golang 在米哈游的运用场景?
  • 项目组的一些细节,代码安排、办理方式等是怎样的?
  • 项目质量的保障手法有哪些,单元测验覆盖率要求怎样?
  • 测验的同学主要以白盒测验仍是黑盒测验为主?
  • 前面许多问题都没有答对,面试官的主张?

3.3 富途牛牛(互联网-根底/接入)

4 家中富途牛牛问的根底常识是最多的,给我形象很深入的是跟每位面试官的沟通都(提)很(示)顺(很)畅(多),那因为一些不了解的常识点我基本是依靠同类的东西去类比和猜测,面试官很愿意听我的这些猜测,有些思路上和所问的完结的确是不同的,面试官会提出来那(正的确现中)某某问题是怎样(在我提出的完结中)处理的,引导我慢慢靠近或许推导出正的确现。

(阳哥面试的时分也是这么做的,并且在作为面试官的时分也会这么做。)

我以为作为面试官,这些应该是标配训练的才能,可是实际上在面试中能见到的甚少,一是面试时刻有限,二是作为面试官一天面试许多人,耐性不免也会有消磨,这都是能够了解的。所以实际上能做到如此的话,对面试者的确会是十分好的体验。

具体记载:2023 年初的富途牛牛面试复盘

一面摘抄

  • 问一段代码输出成果?
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 数据是相同的? 是不是每次履行修改都需求去加锁?

    • 或许是经过加锁和 CAS 保证的?(面试官:它下面还有一些 tricky 的思路,面试结束能够再去看看)
  • channel 被 close 操作之后进行读和写会有什么问题?

  • 未被初始化的 channel 进行读写会有什么问题?

  • channel 底层数据结构是怎样的,尝试用结构体来表述一下?

反诘

  • 了解面试部门的基本状况?
  • 部门内微服务的数量?每个研制大概会担任多少服务的开发作业?
  • C++ 和 Golang 在团队内的运用场景和份额?
  • 研制对开发质量的保障是怎样完结的,测验和覆盖率是否有要求?
  • 研制和测验的人员配置份额?
  • 前面许多问题都没有答对,面试官的主张?

二面摘抄

  • 假如做一个翻译服务,翻译才能来自于供货商,怎样从技能上对几家(A、B、C)供货商作出评估?

  • 假如几家都要接入,且各家之间的翻译才能都各有好坏,那应该怎样去搭建这个服务的结构?

    • 调度器
    • 数据采集 / 反馈机制,帮助调度器更好地作业
    • 可扩展性,固化供货商的接入规范,方便未来扩展更多供货商挑选
  • 除了答复的这些方面,一个服务的规划还需求留意什么?

    • 正常服务应该提供的网关,包含鉴权、限流、多租户
    • 提供给外部的服务需求留意 SLA,SLA 则围绕日志、监控、Tracing 做文章
  • 一副扑克牌中随机取 5 张,取到顺子的概率是多少?

    • Hint 1:一种花色有多少种顺子?9 种
    • Hint 2:一个顺子有 5 张牌,有多少种组合或许?4 ^ 5 种
    • Hint 3:分子现已知道了,分母怎样表明,n 张取 m 张怎样表明?

反诘

  • 项目基本都是微服务 & Kubernetes 这套计划吗?

  • 研制跟根底设施打交道能到什么样的深度,例如能运用 Kubernetes 的那些内容,中间件的运用权限上有什么样的管控?

  • 正常事务的 CI/CD 里边都做了/集成了多少测验或查看?

  • 事务的研制能在 Kubernetes 上具体写哪些东西呢,例如 sidecar、operator 等等?

    • 有专门的团队去做,可是还在起步阶段,我们都能够奉献;

三面摘抄

  • 数据库搬迁的原因是什么?

  • 完结搬迁之后 DB 本钱降低多少?

  • 搬迁进程中双读双写具体是什么样的计划?

  • 双写进程中只写成功了其间一个 DB,回来给用户报错,那是否会存在脏数据呢?

  • 双读具体是什么计划,其间一个读成功了就回来仍是要两个都读成功才能够?

  • HTTP 流量的录制东西主要是做什么用呢?

  • HTTP 流量录制会涉及到一些登陆态的处理吗?

  • 掷骰子,游戏规则:希望成果尽或许大,假如对第一次的成果不满意能够掷第2次,可是第一次成果就作废了,以第2次的成果为准。这个掷骰子成果的数学希望是多少呢?

    • Hint 1:假如第一次扔到 6,还考虑扔第2次吗?假如第一次扔到 1 考虑吗?
    • Hint 2:那什么状况考虑扔第2次,什么状况不考虑?
  • 输入两个整数 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 这块,或许不会直接产生事务影响(例如更高的订单量),在公司的现状怎样,以及怎样看待将时刻投入在这上面呢?
  • 前面许多问题都没有答对,面试官的主张?

3.4 猿教导(大监控-日志)

其实开始有一点点惊讶原来猿教导在国家一些政策影响下仍在持续活跃。因为投递的是更靠近根底设施的岗位,许多问题能听得出来都是从根底架构工程师的视点提问的。别的它们家的面试有一个比较形象深入的点便是,每位面试官都喜爱问:“你觉得 XXXXX”,例如 “你觉得哪些项目挑战最大”、“你觉得这里边最难的点在哪里”。不过作为投递里边仅有完全没触摸过的范畴,他们问的许多问题我都十分有爱好持续评论下去,也是少有的重视简历上CDC同步计划的团队。

具体记载:待弥补 orz

一面摘抄

待弥补 orz

二面摘抄

待弥补 orz

三面摘抄

待弥补 orz

4. 总结

整体来说面试没有呈现想象中的地狱难度,简直一切的面试官都很有耐性交流。可是被问到这么多的根底问题的确有一点点出人意料,正常以为会是项目 & 根底各占 50% 的份额。

不过或许这也是好作业,个人十分赞同:根底厚实但事务薄弱的工程师 > 对事务有不错了解但根底不厚实(或比较远离一线开发、代码生疏)的工程师。 别的其实计算机根底确的的确有在我的日常开发中帮到过我(quick question:你有在实际作业、排查问题中找过TIME_WAIT的网络连接吗?)。

回顾开篇

然后回到开始面试的意图:

  • 3年间自己的技能是线性生长、指数生长仍是对数生长,跟同龄人比较怎样?

是有生长的,可是没有那么抱负,或许更介于线性生长和对数生长之间;

5. 一些引荐

关于面试我以为下面的材料很大程度帮到过我,所以也会引荐给在看本文的你,或许要求职的同学。

USENIX:www.usenix.org/conferences

假如想建立一些属于自己的亮点,一个捷径是了解面试官不明白的常识~~(不是)~~。关怀前沿的学术和工业论文十分简略有效,USENIX 上覆盖了许多根底方向,例如计算机网络、操作系统、存储、分布式、安全,以及按功能划分的 SRE 等等。除了 USENIX 上的以外,假如有你重视方向的其他顶会那当然也是能够的,例如我曾经会去看看 VLDB 和 SIGMOD 上的论文了解 KV 存储的一些新常识和研讨方向。

操作系统导论:book.douban.com/subject/334…

一本很有意思的操作系统的入门书,能够写写里边代码了解一下 Linux 的 API,关于进程和内存相关的讲解让我形象十分深入。

Go程序员面试笔试宝典:book.douban.com/subject/358…

首先声明一点这个书没帮到我面试,因为在面试前我没什么时刻看它…正常来说我也不会引荐这种速食读物(手动狗头),可是结合面试遇到的提问来看,我以为它会对急着在一两个月内找到作业的同学很帮助。不过无论怎样,程序员的学习是不主张走捷径的,假如对 Golang 感爱好的话,有许多更好的替代品,包含Draveness老师、Russ Cox的博客等等。

一同学习

欢迎和我一同评论交流:能够在私信我

我的文章首发在我的大众号:程序员升职加薪之旅,第一时刻阅览我的文章。

也欢迎我们重视我的,点赞、留言、转发。你的支撑,是我更文的最大动力!