|
| 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