ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

阿里iOS五轮面试全记录:从基础原理到系统设计的完整复盘

2026/8/30 2:49:50 拓冰建站 浏览量
阿里iOS五轮面试全记录:从基础原理到系统设计的完整复盘 这周刚走完阿里的 iOS 五轮面试趁记忆还热乎把整个过程沉淀下来。老实说这次面完最大的感受是阿里对 iOS 开发者的考察已经不再是单纯的“知识点背诵”而是从基础功底、项目深度、系统设计、技术广度到软素质的全链路校验。五轮面试每轮侧重点完全不同但之间又有很强的递进关系越往后越考察你“有没有真正思考过技术”。这篇文章我会把五轮面试的完整脉络、每一轮的高频题目、我当时的答法、后面复盘发现问题的地方都写出来包括一些面试官很细节的追问。希望能给正在准备 iOS 面试的朋友一个参考尤其是那些准备冲击大厂、但不太清楚大厂面试节奏的人这篇文章应该能帮你少走不少弯路。1. 面试前的准备思路与投递策略1.1 这次面试的背景与我的准备节奏我在上一家公司做了三年 iOS 开发主要是一个电商类的 App涉及到的模块比较多首页、订单、直播、消息推送、性能优化这些都碰过技术栈以 Objective-C 为主近半年开始转 Swift。今年年初动了跳槽的念头原因其实很朴素业务到了一定阶段能接触到的问题越来越重复个人成长变慢了。决定投阿里之前我给自己定了两个月的准备期。第一个月主攻基础把 iOS 底层原理、数据结构、网络、并发这些硬骨头啃一遍每天固定刷两道 LeetCode第二个月主攻项目和系统设计把所有做过的模块重新梳理成可以讲清楚的“面试素材”同时模拟系统设计题比如“如果让你设计一个 IM”这种。事实证明这种先基础后综合的节奏是对的前期基础扎实后面项目深挖才不会露馅。投递渠道我选的是内推。如果你也有目标部门强烈建议先找内部的朋友问清楚团队业务。我这次内推前特意问了下团队主要用什么语言、业务是偏业务迭代还是偏基础组件、面试风格偏算法还是偏架构。这些信息对准备方向影响很大比如偏基础组件的团队会更看重内存管理、多线程底层偏业务的团队则更看重你的项目交付能力和性能优化经验。1.2 简历复盘把项目按“数据-场景-取舍”重新过一遍简历是面试的剧本。很多人的简历写了项目经验但面试官一问细节就答不上来。我的做法是把自己最有代表性的两三个项目每个都用“数据-场景-取舍”三个维度去拆解。比如我之前做过的启动优化项目数据维度是启动时间从 2.1s 降到 0.6s冷启动耗时下降了 71%场景维度是公司的运营活动频繁发版用户反馈启动慢且启动阶段的点击流失率明显偏高取舍维度是我选了哪些方案、为什么不用其他方案。这三个维度拆完之后项目不再是我做了启动优化一句话而是一个有背景、有数据、有决策过程的完整故事。另外简历里写的每一项技术栈都要能扛住追问。不要抱着“我写过一点 Swift”就写上去面试官大概率会顺着你的简历往下挖。我这次把简历里每一项技能都重新过了一遍能讲清楚到什么程度、能举出什么例子都提前列好。这样就算被问到不熟悉的也能坦诚说明边界而不是支支吾吾引起怀疑。1.3 面试工具链文档、模拟问答、手写代码准备阶段我做了一个面试知识库用文档把所有知识点按目录整理包括Objective-C/Swift 语言基础、内存管理、Runtime、RunLoop、多线程与锁、网络层、架构设计、性能优化、跨端方案、组件化、自动化测试。每一个知识点下面都写了“自己的理解”和“可能的追问方向”。另外一个很有效的方法是模拟问答。我会让一个朋友扮演面试官按照真实面试节奏提问我当场回答。第一次模拟的时候我发现自己很多知识点脑子里明白但一到口头表达就混乱。后来我养成了一个习惯每个知识点都尝试用“是什么-为什么-怎么用-有什么坑”四层结构讲出来。这个方法强烈推荐尤其是在准备面试的朋友一定要动手开口讲而不是只看文章。手写代码也要提前练。很多面试官会直接甩给你一个屏幕或者白板让你手写。我这次在五轮里至少遇到了三道手写题后面会详细说。平时一定要脱离 IDE 的自动补全来写代码尤其是链表的反转、二叉树的遍历、LRU 缓存这种高频题最好能到默写的程度。2. 第一轮基础功底筛选iOS 核心知识现场问答2.1 内存管理不是背概念第一轮面试官是个技术很扎实的 P6 级别工程师开场没有废话先问内存管理。第一个问题就是ARC 下weak 和 assign 修饰符有什么区别我当时先回答了区别weak 修饰的对象在释放后会自动置为 nil而 assign 不会assign 一般用于基本数据类型。面试官点点头又追问了 weak 的底层实现原理。这个问题我准备了回答是基于 Runtime 的 weak 表。weak 变量会注册到一个全局的 weak 表中以对象的地址为 keyweak 变量的地址组成一个数组作为 value。当对象的引用计数变为 0dealloc 时系统会通过 weak 表找到所有指向这个对象的 weak 变量把它们置为 nil然后从表里移除。面试官又问如果多个 weak 变量指向同一个对象释放时会发生什么我回答所有变量都会被置为 nil不会出现野指针。这个追问实际是在考察你是否理解 weak 表的存储结构而不只是背结论。后来面试官又问到了循环引用什么情况下会产生循环引用当时我列举了 block 持有 self、NSTimer 强持有 target、代理用 strong、两个对象互相持有等几种场景。然后又追问了 block 的三种类型以及为什么 block 会捕获外部变量。这个问题我答得比较久因为 block 的底层关于捕获机制、堆栈区的转移逻辑需要讲清楚建议准备 iOS 面试的朋友把 block 的源码层面看一遍至少要知道 Block_copy 和 __block 变量的存储位置变化。2.2 RunLoop 和事件循环的现场推导内存管理聊了快半小时后面试官切换到 RunLoop。他问的是App 启动后main 函数里做了什么RunLoop 在里面扮演什么角色我按照 UIApplicationMain - 创建主 RunLoop - 处理事件循环 这条线走了一遍。他接着追问RunLoop 有哪些 Mode每个 Mode 之间是什么关系我讲了 Default、Tracking、Common 这几个 Mode以及滑动事件下 mode 切换source0/source1 的区别timer 和 observer 的触发时机。面试官听到一半突然抛出一个很实际的场景如果把 NSTimer 加到主线程 RunLoop 的 DefaultMode当界面发生滚动时计时器为什么不走这个其实就是 mode 切换导致的TrackingMode 下 DefaultMode 的 timer 不会执行。后来我补充了一个解决思路把 timer 加到 CommonMode或者用 DispatchSourceTimer或者在子线程里处理。这个场景很经典面试官看到你能联系实际会比单纯背定义更认可。最后他还问了一个细节RunLoop 退出的条件是什么我讲了 Source1 端口消息、超时、被手动停止几种情况。其实这背后还牵扯到 App 如何保证主线程不退出、如何处理触摸事件、如何实现卡顿检测。这里我提了一点卡顿检测面试官很感兴趣问我用什么方案我说是 RunLoop 的 observer 监听进入源事件前的耗时。这一轮到这就变成了性能优化的前奏也算是给第二轮做了一个铺垫。2.3 多线程与锁从代码题聊到实际应用多线程部分面试官直接抛了一个代码题在主队列里同步执行任务会发生什么我回答会造成死锁然后主动画了队列和任务的依赖关系说明为什么主线程等待队列里的任务而队列里的任务又在等待主线程执行。他又追问自定义串行队列里同步执行会死锁吗这个稍微有点绕我的回答是如果同步任务在同一个串行队列中执行而这个任务又需要该队列去执行另一个同步任务就会死锁如果同步任务不在当前队列只是单纯往这个队列派发同步任务不会死锁。这题的坑在于要区分“当前所在队列”和“目标队列”。锁的考察主要是并发读写场景。面试官问多个线程同时读一个可变数组怎么保证线程安全常规答案是加锁比如 NSLock、synchronized、os_unfair_lock。他接着问这些锁各自的特点怎么选。我当时的回答是os_unfair_lock 性能高但底层synchronized 使用简单但隐式开销NSLock 常见但要注意加锁解锁配对dispatch_semaphore 适合控制并发数。追问到 pthread_rwlock 时我说读写锁比较适合读多写少的场景但以前项目里用得不多面试官也就没有继续深挖。遇到这种自己确实不熟的诚实说明边界比硬编要安全这是我在准备期就定好的策略。2.4 算法题经历数据结构的临场手写第一轮最后是算法题要求手写一个 LRU 缓存实现 get 和 put时间复杂度 O(1)。这道题在面试题库里出现频率很高我提前练过所以手写得比较快。思路是哈希表加双向链表哈希表负责 O(1) 查找链表负责维护访问顺序。我先把 Node 类和 DoublyLinkedList 的字段写出来再实现 moveToHead、removeTail 两个辅助方法然后 get 和 put 就顺理成章了。面试官让我跑了一个测试用例然后问了两个边界问题缓存容量为 0 时怎么办key 不存在时 get 应该返回什么我补了边界判断后他又问了一个变体如果是 LFU你会怎么设计我讲了用两个哈希表一个维护 key 到节点一个维护频率到链表但实现复杂度明显高很多面试官说如果能说清楚思路就够了。从这题来看大厂算法面不只考你会不会写更看你在边界情况和变体上有没有延伸思考的能力。3. 第二轮项目深挖性能优化是主战场3.1 启动优化从 2.1s 到 0.6s 的整个过程第二轮面试官看起来是团队里的技术负责人整个面试围绕我的项目展开开场就是一句“你简历里写了启动优化说说整个优化的思路和落地过程。”我按照时间线讲了先是量化分析用 Instruments 的 App Launch 模板和 Xcode 的环境变量 DYLD_PRINT_STATISTICS 拿到 pre-main 阶段耗时分布发现主要开销在动态库加载和 load 方法执行。然后阶段性地做优化。第一步是减少动态库依赖将能合并的静态库合并进来第二步是清理 load 方法改成 initialize 或者懒加载第三步是优化启动阶段的业务逻辑把非首屏需要的模块全部延迟到首帧渲染之后。当时还有一个很隐蔽的问题启动时同步读取了大量的本地配置文件导致主线程阻塞我改成异步读取并配合缓存策略。这一套做完之后冷启动从 2.1s 降到 0.6s。面试官听完之后没有夸反而是连续追问了几个问题。第一个是你用了二进制重排吗我说没有因为当时团队对 link map 的产物分析还不成熟而且二进制重排对系统库符号的作用有限落地周期长我权衡后没做。第二个你说延迟加载怎么保证业务方不会主动提前触发这个我讲了组件化里的启动任务管理每个任务有依赖标记和优先级由框架统一调度。这轮追问让我意识到面试官不仅想知道你做了什么还想知道你有没有想过“为什么不做别的”。3.2 卡顿监控与离屏渲染排查启动优化之后面试官把话题切到了流畅度优化。他问线上 App 卡顿你怎么监控我说了两层方案。第一层是 FPS 监控用 CADisplayLink 计算每秒实际刷新的帧率但 FPS 只是表象不能定位到具体是哪个方法卡住第二层是基于 RunLoop Observer 的卡顿监控在 beforeWaiting 和 afterWaiting 之间记录耗时超过阈值就上报主线程的调用栈再结合符号还原定位到具体函数。离屏渲染这块他问得很细什么操作会触发离屏渲染我说圆角加 maskToBounds、阴影、光栅化这是一个高频面试点。他接着问只想给一个 ImageView 切左上角圆角怎么避免离屏渲染我当时的回答是如果图片本身已经带了圆角最直接是让设计切好图如果必须在代码里做可以用 UIBezierPath 配合 UIGraphicsContext 绘制新的圆角图片或者用 CAShapeLayer 做 masking后者严格说也会触发但可以用 shouldRasterize 配合缓存来优化。这轮还聊到了网格列表的滑动优化。我的方案是复用 cell、图片解码放到子线程、避免在 cellForRowAtIndexPath 里做复杂计算、对网络图片用三级缓存。面试官听完说了一句让我印象很深的话“性能优化的核心不是堆技巧而是先找到瓶颈再决定用什么方法。”这个观点后期成为我面对所有优化问题的底层方法论我没有在面试里直接背这句话但后面回答很多问题都已经按这个逻辑走了。3.3 项目选型为什么用方案A而不是方案B项目深挖里还有一个很重要的考察点方案选型。面试官挑了我做过的一个消息推送模块问为什么选择用长连接方案而不是轮询我讲了这个业务场景直播间的消息实时性要求很高轮询的延迟不可控而且带宽浪费严重。长连接基于 WebSocket 或者自研 TCP 协议能保证毫秒级触达代价是连接管理和心跳包复杂度上升。他又追问如果服务器端不给你自研协议只提供 HTTP 接口你会怎么保证实时性这个问题其实是考察你面对外部约束时候的变通能力。我当时的思路是HTTP 场景下用轮询加增量同步轮询间隔从 5s 动态调整当用户停留在直播间时缩短间隔退到后台时拉长同时结合本地缓存做增量拉取。面试官点头之后问了一个更开放的如果让你来设计一个客户端 IM你会怎么拆分模块这其实已经是从项目深挖过渡到系统设计了我意识到下一轮才是真正的架构面。4. 第三轮系统设计与架构设计考察全局视野4.1 设计一个 IM 聊天客户端第三轮是系统设计面面试官上来就说“我们不做题来聊聊如果现在让你设计一个 IM 客户端你会怎么设计”这种题没有标准答案核心是看你的思考框架。我按四层来做拆解数据层、网络层、业务层、UI 层。数据层重点是消息模型设计、本地存储和数据一致性。我提了用数据库存储消息表结构按照会话维度和消息维度拆分消息要有一个全局唯一的 ID 用于去重同时要有本地偏移量或者时间戳用于分页。面试官追问离线消息怎么保证不丢失我说服务端会做持久化客户端拉取时需要上报最后一条消息的 seq服务端从 seq 之后的消息增量下发客户端做幂等处理。网络层重点聊了连接管理长连接负责实时消息推送HTTP 负责普通接口。心跳包的设计、断线重连机制、消息 ack 确认、重试策略这些都要考虑进去。面试官在 ack 这里追问如果消息发送成功了但客户端没有收到 ack重试会导致重复消息怎么处理我说消息 ID 幂等客户端收到 seq 小于等于当前 ack seq 的消息直接丢弃这样重复消息不会入库。业务层则聊了会话列表、未读数和消息通知的解耦。UI 层他问得不多主要关心数据绑定和卡顿优化这部分我结合第二轮的流畅度优化思路讲了一遍。4.2 组件化与模块间通信聊完 IM面试官问到了组件化。他问你们项目做过组件化吗用的什么方案我说做过主要基于 CocoaPods 私有仓库做代码层面隔离同时配合路由实现模块间调用。他说说说路由方案的设计思路以及为什么不用 Target-Action 直接调用。我当时比较了一下两种方式。基于 URL 的路由方案优点是调用方只依赖字符串协议模块间完全解耦适合动态下发和跨端统一缺点是失去编译期检查字符串写错了要运行时才能发现定位成本高。Target-Action 方案使用 Objective-C 的运行时机制由 Mediator 统一转发有一定的编译提示但本质上也绕过了编译期检查。面试官听完又问如果让你现在重新设计你会选哪种我说我会做协议注册式的方案由每个模块声明自己遵守的 ProtocolMediator 统一管理调用方通过 Protocol 接口调用这样既解耦又保留了编译期的接口检查。这种开放性问题没有标准答案面试官更在意的是你有没有对比过不同方案的优缺点以及面对场景的变化能不能做出新决策。他在这个环节最后总结了一句架构方案没有银弹关键是团队规模、业务复杂度和维护成本三个维度。这句话让我意识到架构设计面试中讲清楚为什么在这个场景下选它比堆概念高级得多。4.3 网络层与数据缓存的设计取舍系统设计面后半段面试官问了一个非常工程化的问题如果 App 的接口经常在弱网环境下超时你会从哪些方面优化我分了几层来回答。第一层是客户端请求层设置合理的超时时间区分“读超时”和“写超时”对请求做优先级管理关键接口优先对 POST 请求做重试但必须是幂等重试否则会造成重复下单。第二层是数据链路层接口支持压缩减小传输体积图片从 WebP 或者 HEIC 格式压缩列表接口支持分页和增量更新。缓存策略也是重点。我讲了三级缓存内存缓存、磁盘缓存、网络请求。读取时先查内存再查磁盘最后发网络请求网络返回后再回写缓存。面试官追问缓存数据和服务端数据怎么保持一致我说核心是版本号机制每次请求带上本地缓存的版本号服务端比较版本号后决定返回全量还是增量数据。同时区分根据业务重要性设置缓存时长核心配置可以长期缓存实时性要求高的数据缓存时间缩短或者不缓存。最后面试官还问了一个很实用的点怎么监控线上网络质量我说可以统计 DNS 解析耗时、TCP 建连耗时、首包时间、总耗时和错误码分布如果某个地域的接口耗时明显偏高就配合服务端做调度优化。这题其实已经横向扩展到客户端基础架构了如果平时只做业务没有接触过网络库的优化很容易冷场。我的经验是就算工作里没有完整做过也要在准备期把网络库的关键链路源码看一遍做到能画出请求的生命周期图。4.4 系统设计面的核心方法论面完这一轮我自己复盘发现系统设计题虽然开放但有规律可循。首先要有一个框架我是习惯按“客户端-网络-数据-业务-UI”的层次去拆一层一层讲。其次要展示你的“权衡意识”不只是说方案是什么还要说这个方案的成本、边界、以及什么情况下要放弃它。面试官抛开放题之后最怕的是一个劲堆方案却没有一条清晰的决策线。另外一个容易被忽略的点是系统设计面也看细节。你说消息要幂等面试官就一定会追问幂等怎么实现你说缓存要版本号他就会追问版本号存哪里、怎么升级。所以每一个抛出去的关键词都要保证自己能往下钻两层。我在准备“IM 设计”的时候专门列了消息 ID 生成规则、seq 单调递增、离线消息分页参数这几个细节点面试时确实都用上了。5. 第四轮交叉面与技术广度5.1 跨端方案对比与思考第四轮是交叉面面试官不一定是 iOS 背景更像是做基础架构的问的技术点更偏广度和趋势判断。第一个话题就是跨端。他问你在 iOS 开发这几年怎么看待 Flutter、React Native 和原生开发的关系说实话这个问题如果只站在 iOS 开发角度去回答会显得格局不够但我也不能不懂装懂硬聊。我的回答分了三层。第一层是业务场景跨端方案适合逻辑复杂、界面统一、更新频率高的业务比如电商首页、内容详情页这些页面双端要保持一致而依赖系统能力强的功能比如音视频采集、AR、复杂动画原生优势更明显。第二层是性能对比RN 依赖 JavaScript 引擎和桥接通信在复杂列表上容易卡顿Flutter 自己实现了渲染引擎用 Skia 直接绘制性能接近原生但包体积和内存占用偏高。第三层是团队成本跨端不是零成本它只是把双端工作量压缩到一套代码但会有新的调试成本和学习成本。面试官又问了一个很实际的问题你们项目里有没有真的落地过跨端我说用过 Weex 做过几个页面但因为团队维护能力和线上 bug 排查成本的问题后期又逐步回收成了原生页面。他听完说了一句能回收也是判断力不是所有新技术都适合长期投入。这个观点给了我很大启发后来我在面对任何技术选型时都会先问一句五年后这套方案还会不会有人维护。5.2 质量保障与自动化测试交叉面的第二个话题是质量。面试官问你们的 App 怎么保证发布质量这个题看似常规但深挖起来点很多。我讲了从开发到上线的完整流程开发阶段的代码审查、单测覆盖核心逻辑提测阶段的自动化回归测试阶段的机型兼容灰度发布上线后监控崩溃率和关键接口的错误率。面试官追问你写过单元测试吗覆盖哪些模块我如实回答写过但覆盖率不算高主要集中在工具类、网络层的数据解析和状态机模块。他问为什么不提高覆盖率我说业务迭代快许多页面级逻辑写测试成本高而且 UI 测试稳定性差跑一遍常常因为网络波动或者动画时序挂掉。于是我把重点精力放在了稳定、收益高的逻辑层单测上UI 层用更轻量的冒烟测试取代。面试官对我的回答是认可的因为他问的核心其实不是覆盖率而是你有没有想清楚“测试的价值边界”。他还问到了自动化测试工具链App 的 CI 流程是怎么跑的我说了 Jenkins/GitLab CI 配合 xcodebuild 打包测试机和模拟器并行跑最后生成测试报告。又提到了在 iOS 自动化测试中遇到的坑模拟器与真机行为差异比如权限弹窗、推送 token、键盘类型这些问题必须在真机加上白名单测试用例补充。这轮面试让我体会到质量保障不是一个测试团队的事开发者本身要能说清楚自己负责的模块在哪个环节可能出问题以及如何用工程手段提前发现。5.3 新技术的判断与落地交叉面最后聊了新技术。面试官问最近有没有关注 iOS 的新特性我提了 Swift 语言的变化、SwiftUI 的成熟度、以及 Widget 和 Live Activity 在业务里的落地场景。他没有问我具体 API 怎么调反而问你怎么判断一个新特性值不值得引入项目这个问题我印象很深因为它已经超出技术本身了。我的回答是从三个维度判断第一是稳定性当前版本是否还有大的 API 变动社区踩坑案例多不多第二是收益引入它能不能解决业务的实际痛点比如用户留存、使用时长、开发效率第三是成本团队成员熟悉度、重构范围、维护成本。面试官又追问有没有遇到过盲目追新技术导致事故的情况我讲了一个团队早期使用某个新框架后遇到循环引用和内存泄漏排查成本高的问题但没提具体公司名。他也表示理解说技术选型最重要的是克制。这个环节与其说是在面技术不如说是在面技术判断力。6. 第五轮HR面与综合面试6.1 离职原因、职业规划和薪资谈判第五轮是 HR 面通常在技术面通过后进行。HR 面的问题相对标准化但依然不能掉以轻心。第一个必问题是你为什么从上一家公司离职我的回答尽量避免抱怨前司而是从个人成长角度出发在上一家公司学习了很多基础能力但业务稳定后能接触的挑战变少我希望能在一个更大的平台处理更复杂的问题所以选择看看机会。这个回答既肯定了上家也表达了自己向上的动力。职业规划问题上我围绕“纵深加广度”来谈短期希望在 iOS 底层和性能优化方向继续深耕中期希望能参与架构设计带一个小团队长期希望能成为某个技术领域的专家。HR 追问了一句如果团队给你的工作内容和规划不一致你怎么处理我说我会先了解团队的实际需求因为在一个新环境里团队需要我做什么优先级一定更高我会在完成本职工作的同时利用业余时间保持自己的技术方向不落伍。这种回答既展示了灵活性也表明你有长期主义意识。薪资谈判方面我的策略是在 HR 问期望薪资时先说出一个包含涨幅预期的区间而不是给一个死数字。同时要了解当前市场行情我面试前在招聘平台上看了同类岗位的薪资范围给自己定了一个上浮 20% 到 30% 的目标区间。如果 HR 说给不到我会把问题焦点切换到“总包构成”比如签字费、股票、年终奖比例、涨薪机制。最后一点是不要急于给出底线先听完最终的 package 再做决定。6.2 HR轮里容易被忽略的坑HR 面看起来没有技术难度但有几类回答很容易给自己挖坑。第一类是态度犹豫谈到 offer 时说不确定去不去会让 HR 觉得你意向度低影响后续流程推进。我的经验是即便还有其他备选也要表达出对这家公司和团队的认可同时说明“想看看最终 package 再确认”是合理的。第二类是过度吐槽前司这会让 HR 担心你的职业素养这个前面已经提过。第三类是对技术细节过度展开HR 通常更关心你的动机、稳定性、沟通协作能力如果你把 HR 当技术面不停讲实现细节反而会给人一种抓不住重点的感觉。还有一个小技巧HR 面尾声通常会有“你有什么问题问我”的环节。不要只说“没有”也不要一上来就问薪资福利。我的问法是先问团队当前的挑战和目标再问入职后的第一阶段期望是什么最后再问团队氛围和成长路径。这些问题既能帮你判断这个岗位是否真的适合也会让 HR 觉得你是一个认真思考过的候选人。6.3 综合面之后的心态建设与复盘整个面试过程走完我最大的体会是大厂面试本质上不是考你会不会背知识点而是考你有没有一套自己的技术思考方式。第一轮偏基础第二轮偏项目第三轮偏架构第四轮偏广度第五轮偏软素质每一轮都像拼图一样拼出一个相对完整的候选人画像。面试结束后我趁热把所有被问到的问题重新整理了一遍哪些答得顺畅哪些答得磕绊都记录下来。尤其把第二轮里面试官的追问当成重点复盘对象他在我提到“延迟加载”的时候追问怎么保证业务方不提前触发在我说“不做二进制重排”的时候问为什么不做这些都是促使我进一步思考的契机。如果准备面试的朋友有条件强烈建议找人帮你做模拟面试录音回听的时候你能发现很多自己当时完全没意识到的问题。最后再分享一个小技巧面试中遇到不会的问题先不要慌尽可能说出相关的思路和边界比如说“这个问题我接触比较少但我理解它可能和 A、B 有些关系”。大厂面试官更在意你面对未知问题时有没有基本的分析和沟通能力而不是期待你什么都懂。就算真的答不上来也要保持思路清晰、态度诚恳这比硬撑着乱编要稳妥得多。我在这次面试里也遇到过两个答得不完整的点但因为我主动展示了思考过程面试官并没有在这个环节卡住我。