Skip to content

Commit 93f9cd4

Browse files
committed
feat:美图一面
1 parent ca98fbc commit 93f9cd4

1 file changed

Lines changed: 197 additions & 0 deletions

File tree

Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
---
2+
title: "程序员羊肉美图一面"
3+
---
4+
5+
# 程序员羊肉美图一面
6+
7+
方向:Go 后端 / 业务中台
8+
9+
业务:邮件系统、客服系统、素材、账号等中台系统
10+
11+
轮次:算 HR 共 2 到 3 轮
12+
13+
面试风格:面试官偏资深,重点追问项目真实性、性能评估、合规风控、Go 基础、MySQL、Redis、Git 场景题、AI Coding 和老项目维护。
14+
15+
## 面试题
16+
17+
1. 自我介绍。
18+
2. 你在金山做的项目,用户量多大?
19+
3. 你做过的功能,在性能方面有做过什么评估吗?
20+
4. 压过哪些接口?大概用的资源以及压测量级多大?
21+
5. 营销方面的东西,你在项目中有没有哪些内容需要合规?比如安全、法务,或者其他流程上的要求。
22+
6. 金山这个项目涉及到的只是虚拟资产吗?有没有其他跟实际资产有关的内容?
23+
- 第三方支付由其他同事负责。
24+
7. 你这个游戏相关,黑产方面有没有什么,是怎么解决的?
25+
8. 你怎么理解协程?
26+
9. 用协程时要注意什么?
27+
10. 一般在接口调用并发上也会用协程。如果并发处理这些功能,最后需要等待它们都完成,需要用到哪些东西?
28+
11. 你怎么理解 Golang 的接口?
29+
12. Golang 的内存有关注过吗?
30+
13. 这两份实习工作接触过一些容器化的东西吧?
31+
14. 普罗米修斯用过吗?
32+
15. 你一般用它什么类型的数据?
33+
16. 你这两份实习的数据量有多大?
34+
17. 一个查询语句里条件比较全,比如 `where``group by``order by``limit`,MySQL 执行这个查询语句时的执行顺序是什么?
35+
18. `where``having` 的区别是什么?
36+
19. MySQL 表里两个字段类型分别是 `int(10)``int(11)`,有什么区别?
37+
20. MySQL 表里两个字段类型分别是 `char(10)``char(11)`,有什么区别?
38+
- 补空格是补左边还是右边?
39+
21. 这些表做过性能分析吗?
40+
22. Redis 的持久化机制是什么?
41+
- RDB 和 AOF 有什么区别?
42+
23. 消息队列用的什么?
43+
- 公司用 Kafka,自己学习过 RabbitMQ,面试官没有继续追问。
44+
24. Git 如果合错了分支,一个还在开发中的分支失误合到了 `master` 上,已经合完了,怎么恢复?
45+
- 回答用 `git cherry-pick`,面试官追问:`master` 的数据怎么回滚?
46+
- 回答用 `git reset`,面试官追问:`reset` 之后,对当前工作分支后续开发再合回 `master`,会有什么问题?
47+
- 回答有合并冲突,面试官追问:为什么会有冲突?
48+
25. AI Coding 的占比?
49+
26. 你怎么判定 AI 写的代码质量?
50+
27. MySQL 的间隙锁是什么意思?
51+
28. AI Coding 的时候没有按照你的方向做,或者出现幻觉;review 时发现大部分代码或功能不可用,出现严重问题,但重写时间又不够,这种情况怎么处理?
52+
29. 已有项目维护和基于老项目开发,你有什么实施方案?
53+
54+
## 反问
55+
56+
1. 表现和学习建议。
57+
- 面试官反馈:AI 方面经验比较丰富,Go 学习时间短一些,工程经验有欠缺,其他方面还可以。
58+
2. 部门业务。
59+
- 业务中台,包含邮件系统、客服系统、素材、账号等方向。
60+
3. 一共几轮面试?
61+
- 算 HR 共 2 到 3 轮。
62+
4. 反问面试官怎么解决 MQ 消息堆积。
63+
64+
## 复盘重点
65+
66+
这轮面试重点考察项目真实性、后端基础、工程经验、已有系统维护和 AI Coding 风险控制。
67+
68+
优先补这几块:
69+
70+
1. Git 回滚场景。
71+
2. Go 并发三件套:`WaitGroup``context``errgroup`
72+
3. MySQL 执行顺序、字段类型、间隙锁和性能分析。
73+
4. Redis 持久化。
74+
5. 压测指标和性能评估口径。
75+
6. 合规、风控、黑产治理的项目表达。
76+
77+
## 参考答案(AI 生成)
78+
79+
> 以下答案由 AI 生成,仅供面试复盘参考。
80+
81+
### 1. 自我介绍
82+
83+
答:按“背景、技术栈、项目、亮点、岗位匹配”组织。重点突出 Go 后端、实习项目、自己负责的模块、性能或稳定性指标,以及对业务中台岗位的匹配度。
84+
85+
### 2. 你在金山做的项目,用户量多大?
86+
87+
答:用户量要用真实口径表达,可以分成注册用户、日活、活动参与人数、接口调用量、峰值 QPS。没有直接掌握全站用户量时,可以说自己负责模块的请求量、数据量和影响范围。
88+
89+
### 3. 你做过的功能,在性能方面有做过什么评估吗?
90+
91+
答:可以从接口耗时、QPS、P95/P99、错误率、CPU、内存、数据库慢查询、Redis 命中率几个维度回答。性能评估的核心是先定义目标指标,再通过压测、日志、监控和执行计划定位瓶颈。
92+
93+
### 4. 压过哪些接口?资源和量级多大?
94+
95+
答:回答时给出接口类型、并发数、持续时间、QPS、机器规格、数据库和缓存资源。比如活动查询、发奖、资格校验这类接口,可以说明压测时关注主链路延迟、错误率、DB 压力和缓存效果。
96+
97+
### 5. 营销项目里有哪些合规要求?
98+
99+
答:营销活动通常涉及活动规则审核、奖品发放规则、用户资格校验、风控策略、操作审计、异常补偿和数据留痕。虚拟资产发放还要关注幂等、唯一约束、发奖记录、库存扣减和客服追溯。
100+
101+
### 6. 金山项目涉及虚拟资产和实际资产吗?
102+
103+
答:我主要负责的是虚拟资产和活动链路,重点在资格判断、虚拟奖励发放、幂等控制和记录追溯。实际支付链路由其他同事负责,我会关注它和活动状态、订单状态之间的数据一致性。
104+
105+
### 7. 游戏相关的黑产问题怎么解决?
106+
107+
答:黑产风险主要有刷号、脚本高频请求、重复领取、接口重放、批量注册和异常设备行为。处理方式包括登录态校验、IP/设备/账号维度频控、资格校验、幂等 token、唯一约束、风控评分、异常告警和人工复核。
108+
109+
### 8. 你怎么理解协程?
110+
111+
答:goroutine 是 Go runtime 管理的轻量级执行单元,创建成本和切换成本较低,适合 I/O 并发、异步任务和并行任务拆分。Go 通过 GMP 调度模型把大量 goroutine 调度到有限的系统线程上执行。
112+
113+
### 9. 用协程时要注意什么?
114+
115+
答:要注意 goroutine 生命周期、超时取消、panic recover、共享变量竞争、channel 阻塞、goroutine 泄漏和并发数控制。涉及外部调用时,需要配合 `context` 设置超时和取消。
116+
117+
### 10. 并发处理后等待全部完成,需要用到哪些东西?
118+
119+
答:等待多个任务完成可以用 `sync.WaitGroup`。需要收集错误和统一取消时,可以用 `errgroup.Group` 搭配 `context.Context`。需要控制并发量时,可以用带缓冲 channel、信号量或 worker pool。
120+
121+
### 11. 你怎么理解 Golang 的接口?
122+
123+
答:Go 的接口是一组方法集合,类型只要实现了这些方法,就满足这个接口。接口适合做依赖抽象、解耦调用方和实现方,也常用于测试时替换具体实现。
124+
125+
### 12. Golang 的内存有关注过吗?
126+
127+
答:可以从栈和堆、逃逸分析、GC、内存分配和 pprof 排查展开。Go 会优先把局部变量分配在栈上,变量生命周期逃出当前函数时可能进入堆,GC 负责回收堆对象。
128+
129+
### 13. 实习里接触过容器化吗?
130+
131+
答:可以讲 Docker 镜像、容器启动、环境变量、日志挂载、健康检查和 CI/CD 部署流程。了解 K8s 时,可以补充 Deployment、Service、Pod、副本数、滚动发布和弹性伸缩。
132+
133+
### 14. 普罗米修斯用过吗?
134+
135+
答:Prometheus 主要用于采集和存储时序指标,常配合 Grafana 做监控看板,配合 Alertmanager 做告警。服务侧通常暴露 `/metrics`,Prometheus 按配置定期拉取指标。
136+
137+
### 15. Prometheus 一般用什么类型的数据?
138+
139+
答:常见指标类型有 Counter、Gauge、Histogram 和 Summary。Counter 适合请求数、错误数这种单调递增指标;Gauge 适合 CPU、内存、队列长度;Histogram 适合接口耗时分桶和 P95/P99 统计。
140+
141+
### 16. 两份实习的数据量有多大?
142+
143+
答:数据量要按表数据量、日增量、接口请求量、峰值 QPS、日志量和缓存 key 数量回答。数据量一般时,也可以强调自己做过慢查询分析、索引检查、分页优化、缓存命中率观察和接口耗时监控。
144+
145+
### 17. MySQL 查询语句的执行顺序是什么?
146+
147+
答:逻辑执行顺序是 `FROM/JOIN -> ON -> WHERE -> GROUP BY -> 聚合函数 -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> LIMIT`。实际执行计划由优化器决定,可以通过 `EXPLAIN` 观察索引选择和扫描行数。
148+
149+
### 18. `where``having` 的区别是什么?
150+
151+
答:`where` 在分组前过滤原始行,适合普通字段条件;`having` 在分组聚合后过滤结果,适合聚合函数条件,比如 `count(*) > 10`
152+
153+
### 19. `int(10)``int(11)` 有什么区别?
154+
155+
答:二者存储范围一样,括号里的数字表示显示宽度,主要和 `ZEROFILL` 搭配时影响展示效果。MySQL 8.0 已经弱化整数显示宽度这个特性。
156+
157+
### 20. `char(10)``char(11)` 有什么区别?
158+
159+
答:`char(10)``char(11)` 分别表示定长 10 个字符和定长 11 个字符。`char` 保存时会在右侧补空格,取出时通常会去掉末尾空格。
160+
161+
### 21. 表做过性能分析吗?
162+
163+
答:可以从 `EXPLAIN`、慢查询日志、索引命中、扫描行数、回表、排序、临时表和分页方式回答。常见优化包括给高频过滤字段建联合索引、让最左前缀匹配查询条件、避免深分页和减少大字段回表。
164+
165+
### 22. Redis 的持久化机制是什么?
166+
167+
答:Redis 主要有 RDB 和 AOF。RDB 是定期生成内存快照,恢复速度快,文件紧凑;AOF 是追加写命令日志,数据完整性更强,文件会通过 rewrite 压缩体积。线上常见做法是开启混合持久化。
168+
169+
### 23. 消息队列用的什么?
170+
171+
答:可以如实说公司使用 Kafka,自己学习过 RabbitMQ。补充 Kafka 适合高吞吐日志流、事件流和削峰场景;RabbitMQ 更偏传统消息路由、确认机制和复杂交换机模型。
172+
173+
### 24. Git 合错分支怎么恢复?
174+
175+
答:如果本地 `master` 已经 merge 了错误分支,并且还没有推送远端,可以用 `git reset --hard <merge前commit>` 回到合并前状态。如果已经推送到公共远端,推荐用 `git revert -m 1 <merge_commit>` 生成反向提交,保留公共历史稳定。
176+
177+
工作分支后续再合回 `master` 时,要先同步最新 `master`,再确认错误合并对应的提交是否仍然存在于工作分支历史里。冲突通常来自同一批内容在历史里经历过 merge、reset 或 revert 后再次合并,Git 看到的提交关系和文件内容变化都会影响合并结果。
178+
179+
### 25. AI Coding 的占比?
180+
181+
答:可以说 AI 主要用于样板代码、单元测试、接口结构、脚本、文档和局部重构。核心业务逻辑、数据一致性、并发安全和上线风险仍由自己 review 和把关。
182+
183+
### 26. 怎么判定 AI 写的代码质量?
184+
185+
答:从需求一致性、边界条件、错误处理、并发安全、数据一致性、可读性、可测试性和项目风格一致性判断。落地时会跑单测、集成测试、静态检查和关键链路自测。
186+
187+
### 27. MySQL 的间隙锁是什么意思?
188+
189+
答:间隙锁是 InnoDB 在可重复读隔离级别下对索引记录之间范围加的锁,用来控制其他事务在这个范围内插入新记录,从而减少幻读风险。它通常出现在范围查询、当前读和索引扫描场景。
190+
191+
### 28. AI Coding 出现严重问题但时间不够,怎么处理?
192+
193+
答:先收敛到最小可交付目标,识别主流程、核心数据和高风险代码。保留能复用的结构、类型定义、测试和简单工具函数,把关键业务逻辑人工重写,并补充关键测试和回滚方案。
194+
195+
### 29. 已有项目维护和基于老项目开发怎么实施?
196+
197+
答:先跑通本地环境和核心链路,再看接口、表结构、日志、监控、配置和最近提交记录。开发时明确改动边界,小步提交,补关键测试,通过灰度、开关和监控降低上线风险。遇到技术债时,优先保证业务交付,同时把高风险点记录下来,在相关需求中顺手治理。

0 commit comments

Comments
 (0)