嘉为科技武汉分公司 Python 后端线上一面
- 轮次
- 一面
- 结果
- 进二面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 自我介绍
- 可变对象和不可变对象有什么区别?
- 装饰器
- 列表推导式和生成器
- 数据库用过哪些?
- 慢查询怎么定位、怎么优化?
- 怎么做覆盖索引?
- Redis 数据结构(结合项目问)
- 缓存击穿、穿透、雪崩
- 哈希冲突的解决方式
- 栈和队列
- Redis 的 pipeline 概念
- 怎样判断链表是否成环?
- 近半年自学的东西里面最有收获的是什么?
- LangChain、Dify 这些你怎样验证自己真的学会了?
- AI 写代码哪些可以交给 AI、哪些不能?AI 写代码最大的问题是什么?会带来哪些困扰?AI 防御性编程怎么解决?
- 情景设计题(Celery worker / Celery beat)
- 职业规划
- 近期压力最大的经历?怎么解决的?
- 反问环节
《参考解析》
Python 语言特性:可变对象、装饰器与生成器:不可变对象(int、str、tuple、frozenset)创建后值不可改,任何「修改」都产生新对象;可变对象(list、dict、set)能原地改,函数传参传的是引用,所以就地修改会影响调用方。由此衍生出高频追问:为什么可变对象不能当 dict 的 key(哈希值必须稳定);def f(x=[]) 为什么是坑(默认值在定义时求值一次、被所有调用共享);以及浅拷贝与深拷贝的区别。装饰器本质是「接收函数、返回函数」的高阶函数,@wraps 保留原函数元信息,带参数的装饰器是多一层闭包,常用于日志、计时、鉴权、重试、缓存;生成器用 yield 惰性产出,内存占用恒定但只能遍历一次,适合大数据流;列表推导式一次性把结果装进内存。选哪个,答「数据量级与是否需要多次遍历」就抓住了点。
慢查询定位与覆盖索引是一套标准动作:先开慢查询日志(slow_query_log、long_query_time)或用性能视图找出具体 SQL,再用 EXPLAIN 看执行计划——关注 type(全表扫描 ALL 最差)、key 是否命中、rows 估算行数,Extra 里出现 Using filesort/Using temporary 就是排序或临时表开销。优化按顺序来:补或调整索引让查询走覆盖索引(Extra: Using index,需要列全在索引里、不用回表),避免在索引列上做函数运算或隐式类型转换,减少 SELECT *,大分页改成游标(WHERE id > ? LIMIT n),必要时冷热分离或加缓存。别忘了说清「索引不是免费的」——写入变慢、占用空间,要按真实查询模式权衡。
Redis 数据结构与三大缓存问题要连成一条线:常用结构是 String、Hash、List、Set、ZSet,加 Bitmap、HyperLogLog、Stream;选型看访问模式,排行榜用 ZSet、对象字段部分更新用 Hash、去重计数看精度要求。缓存穿透是查不存在的数据绕过缓存直打数据库,解法是空值缓存加布隆过滤器并在入口校验参数;缓存击穿是热点 key 过期瞬间被并发打穿,解法是互斥重建(分布式锁)或逻辑过期不删 key;缓存雪崩是大量 key 同时失效或实例宕机,解法是过期时间加随机抖动、多级缓存、限流降级。pipeline 是把多条命令打包一次发给 Redis 再一起收结果,省掉逐条网络往返,但它不是事务、中间某条失败不会回滚,这点要主动说清。
基础数据结构题别只背结论:哈希冲突的解法是链地址法(拉链)与开放寻址法(线性探测、平方探测、再哈希),工程上还要考虑负载因子、扩容时机,以及 Java 8 之后链表转红黑树的原因。栈后进先出、队列先进先出,考察点通常在应用:括号匹配、表达式求值、单调栈、BFS 用队列、任务缓冲用队列。判断链表是否成环的标准答案是快慢指针(Floyd 判圈),追问「怎么找入环点」「环长怎么算」要能推导——相遇后一个指针回到头部同速前进即入环点;也可以用哈希表记录访问过的节点,代价是 O(n) 额外空间。
情景设计题与 AI 编程边界,考的是工程判断:Celery 的情景题通常给「定时任务与异步任务混在一起、任务重复执行或堆积」的场景,答题要落到 worker/beat 的职责划分(beat 只按点投递、worker 执行,别让 beat 做重活)、任务幂等(自带业务唯一键、重复投递不产生副作用)、可见性超时与 acks_late 的取舍、队列隔离(定时与实时分队列避免互相饿死)、监控(队列长度、失败重试、死信)。AI 写代码的边界同理:样板与单测可以交给它,资金、权限、并发一致性不行;最大困扰是「看起来对」,防御性编程靠类型注解、参数校验、边界单测和 review 清单补回来,而不是再问 AI 一遍。
软性问题要有真实素材:问自学收获、怎么验证学会了、职业规划、压力经历,考的是自驱力与复盘能力。验证「真的学会」最好的证据是产出——写过的项目、跑通的 demo、解决过的具体故障,而不是看完多少教程;技术规划要落到方向(后端深度、与 AI 应用的结合点),而不是职级口号。压力题用 STAR 讲清「压力源—我的判断—具体动作—结果与反思」,敢于说出当时做得不好的地方,比一味强调抗压强更可信。