尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

拼多多后端面经:算法题、项目深挖与高并发系统设计全解析

拼多多后端面经:算法题、项目深挖与高并发系统设计全解析 最近刚把PDD的面经整理完趁着还有记忆赶紧写下来。我投的是后端开发岗整个流程走下来大概三周从简历筛选到收到offer中间经历了笔试、三轮技术面和一轮HR面。这篇面经不为别的就是想给准备面PDD的朋友一个相对完整的参考尤其是那些对拼多多面试风格不太熟悉的人——它和很多互联网大厂的面试节奏、考察侧重点确实不太一样。文章里我会把每一轮的考察内容、高频问题、我踩过的坑都梳理出来适合正在准备秋招/社招、或者想了解PDD技术栈和面试风格的人看。先说一个整体感受PDD的面试风格务实、直接不太绕弯子。算法题占比高项目深挖的深度也比一般公司要狠面试官会顺着你的回答一路追问到底直到你答不上来或者自己承认某个地方没考虑过。这种风格对基础扎实、见过真实线上问题的人比较友好但对背题型选手来说会很难受。下面按流程展开讲。1. 面试流程全景从投简历到拿offer要过几道关1.1 简历筛选与笔试环节PDD的简历筛选和其他大厂差不多内推和非内推都有机会进笔试。但这里有个细节如果你的简历上有和电商业务比较匹配的项目经历比如秒杀、订单、营销活动、优惠券、支付相关筛选通过的几率会明显高一些。我自己在简历里写了一个高并发下单系统的项目后面面试中多次被cue到所以简历书写时一定要把和业务场景最接近的内容放在显眼位置。笔试用的是牛客网平台题型是选择题加编程题。选择题覆盖Java基础、计算机网络、数据库、操作系统难度中等偏上有些题目会刻意设置小陷阱比如问HashMap在JDK 1.7和1.8的区别、TCP的TIME_WAIT状态什么时候出现、InnoDB的间隙锁在什么隔离级别下生效这些属于背了就会、不背就蒙的题。编程题一般是三道数组、字符串、动态规划各一道的概率比较大难度对标LeetCode中等题偶尔会出现偏困难的贪心或树形DP但总体不会到竞赛题那个级别。这里提醒一句笔试做题的时候注意牛客的输入输出格式和LeetCode的只需要写函数不一样牛客要求自己处理Scanner或者BufferedReader。我第一道题就是因为没处理好输入循环白白浪费了十几分钟。建议提前一两天去牛客刷几道需要手写IO的题目把节奏感找回来。1.2 技术面轮次安排与节奏PDD技术面一般是三轮一二面以算法和基础为主三面偏综合和系统设计每一轮大概50到70分钟。和有些公司一面聊项目、二面写算法的明确分工不同PDD每一轮面试基本都会先做算法题再做基础知识和项目深挖三者是穿插进行的。也就是说你前期准备的算法题在每一轮都可能被问到不是只在一面考完就结束了。面与面之间的间隔不会太长有些候选人当天连面两轮快的流程一两周走完。我自己的安排是周一笔试周五一面下周二面下周四三面再过一周HR面。整体节奏偏快所以建议不要等一面结果出来再准备下一轮每一步面完之后立刻复盘当场的薄弱点当天就补因为下一轮可能就是两天后。另外PDD有面评复用机制面试官会在系统里看到你前面几轮的记录和评价如果你的某一轮表现特别差很有可能会在后续轮次被追问相近的问题来验证你到底是不会还是状态不好。所以每一轮都要全力准备不要抱着这轮随便面面反正后面还有机会的心态。2. 技术面核心考点算法题、八股文和项目深挖怎么准备2.1 算法题难度对标与刷题策略算法题在PDD面试中的权重非常高我三轮技术面每轮都至少做了两道一面甚至做了三道。题目来源不是固定题库但出题方向比较集中数组双指针、链表操作、二叉树遍历与路径问题、动态规划背包、子序列、编辑距离、栈和队列的应用、TopK问题。大数加减、字符串处理这类题目也出现过。以我实际遇到的题为例一面第一道是合并两个有序数组要求原地操作空间复杂度O(1)这题在LeetCode上是88题属于简单偏中等关键是要从后往前遍历避免从前插入导致大量元素移动。第二道是判断一棵二叉树是否是镜像对称的可以用递归也可以迭代考的是对树的遍历和递归边界的掌握。二面出了一道最长不含重复字符的子串和寻找两个正序数组的中位数的变体后者对时间复杂度的要求是O(log(min(m,n)))需要想到二分思路而不是简单合并。三面直接上了一个给定一个数组求第K大的元素要求手写快排或者堆排序。刷题策略上我的建议是别贪多把高频分类吃透。以下是我实际用过的分类刷题清单可以按顺序推进数组双指针左右夹逼、快慢指针、滑动窗口、前缀和、差分链表反转、合并、找环、找交点、删除倒数第N个节点二叉树前中后序遍历递归迭代、层序遍历、最大/最小深度、最近公共祖先、路径总和动态规划爬楼梯、打家劫舍、背包问题01背包和完全背包、最长递增子序列、最长公共子序列栈与队列最小栈、单调栈接雨水、柱状图最大矩形、用两个栈实现队列TopK与排序快排、堆排序、归并排序的代码要能默写每道题刷的时候不要只满足于AC要能讲出为什么用这个思路、时间复杂度是多少、空间复杂度是多少、有没有更优解。PDD面试官很可能在你写完代码之后追问你这个解法在最坏情况下时间复杂度是多少能不能优化到O(n)答不上来会非常减分。2.2 八股文高频考点和背诵技巧基础知识的考察范围不算特别宽但问得比较深入。Java后端方向的高频考点我自己归纳下来有这么几个板块集合源码HashMap、ConcurrentHashMap、ArrayList的扩容机制、并发编程synchronized和ReentrantLock的底层区别、volatile的可见性、线程池参数、AQS原理、JVM内存区域、垃圾回收算法、类加载过程、OOM排查思路、SpringIOC/AOP原理、Bean生命周期、事务传播机制。数据库和Redis基本必问这个我放在后面单独说因为就算法方向之外它们才是真正的得分点。集合部分我推荐从源码角度去整理而不是背结论。比如HashMap你光说1.7头插法、1.8尾插法是不够的要能解释为什么1.8改成尾插法为了避免链表成环、为什么阈值是0.75泊松分布的权衡、为什么红黑树化的阈值是8链长超过8的概率极低且红黑树本身有旋转成本。面试官只要多问一句为什么背结论的人就会露馅。线程池也是一个重灾区。不光要背出七大参数还要能根据业务场景给出合理的参数配置思路。我当时被问到一个CPU密集型任务线程池核心线程数设多少合理我的回答是理论上是CPU核数1但在IO密集场景需要调大而且线上一般通过压测来校准不会拍脑袋定。面试官比较认可这个说法因为他觉得我不是在背参数而是在讲工程实践。JVM记忆口诀因人而异但我推荐把内存区域画过一遍、垃圾回收算法过一遍、类加载过程讲一遍然后重点看G1的运作机制。现在用JDK 8以上的团队很多G1是默认回收器它为什么能不需要Full GC、Region怎么划分、怎么处理并发标记漏标这些都比只背CMS更实用。2.3 项目深挖面试官到底在追什么问题如果说算法题决定你能否过面试项目深挖就决定你拿到的是普通offer还是sp。PDD的面试官在项目环节问得非常细我整理了一下他们最常追问的几类问题你项目里遇到的最大的技术难点是什么这个难点为什么难你怎么一步步解决的你的方案有没有其他可选项为什么最终选了这一个项目上线后的性能数据是多少如果流量再翻十倍你的方案哪里会先崩这三连追问的目的不是考察你是否做过项目而是考察你是否真思考过项目。面试官要听到的是一个完整的决策链路问题定义-方案对比-选型理由-落地实现-线上验证-后续优化。如果你只说我们用Redis做了缓存他下一句一定是为什么用Redis不用本地缓存数据一致性怎么保证缓存穿透、击穿、雪崩怎么办每一个都能往下深挖。我举一个自己的例子。我简历上有一个下单扣库存的项目面试官让我画出整体架构然后问了一个我没想到的问题如果用户下单但支付超时你库存怎么处理我之前只考虑了下单减库存没仔细考虑超时释放问题。这个问题直接把我问住了。后来总结下来扣除库存的时机选择是一个经典的系统设计问题下单减库存、支付减库存、预扣等方案各有优劣需要考虑超时释放、取消订单回补、超卖控制、防止恶意占库存。把这些细节讲清楚才是面试官想听到的东西。所以如果你现在还在准备阶段建议把简历上的每一个项目都按照这个思路过一遍把Why、What、How都写下来。写下来的过程就是你查漏补缺的过程。不要等到面试官问了才临时想那是来不及的。3. 业务题与系统设计电商场景下的考察套路3.1 秒杀系统的设计思路三面或者二面中PDD大概率会问系统设计题而且场景多和电商相关。我遇到的是设计一个秒杀系统要求支撑高并发且不能超卖。这类问题没有标准答案但面试官会看你的分析框架和取舍能力。我建议按照这个思路来组织答案先明确需求边界QPS大概多少、商品数量有多少、是否需要限购、是否需要验证码再画一个宏观链路CDN-网关-应用层-缓存-MQ-数据库然后逐层说明每个环节怎么应对高并发。核心点有这几个请求尽量在入口被拦截不要都打到数据库库存预热到Redis以Lua脚本保证原子扣减写请求走消息队列异步削峰数据库层做最终扣减限流、降级、熔断的兜底策略防刷措施用户风控、IP限制、设备指纹。这里有个很容易被忽略的点超卖的真正元凶不是并发而是检查库存和扣减库存两步操作之间没有原子性。用数据库的乐观锁CAS或者Redis的Lua脚本都可以解决。我在回答完这个问题后面试官追问了一句如果Redis也挂了怎么办我的答案是秒杀系统要接受一定程度的不可用但可以通过主从切换、集群、降级页面等方式缩短不可用时间而不是试图让系统永不失败。面试官对接受部分失败这个观点是认可的因为这体现的是分布式系统的容错思维而不是单机思维。3.2 拼团与订单系统的业务理解除了秒杀拼团的裂变机制、订单状态机、优惠券系统也是PDD特色的考题方向。尤其是拼团它和秒杀的考察点完全不同拼团更关注社交裂变、状态一致性、超时处理和分布式事务。你不需要真的做过拼团业务但要能结合公开信息和常识来分析。拼团的关键难点在于多人成团这个状态的维护。一个用户开团后其他用户参团团状态从不满足条件到满足条件中间涉及多个节点如何保证多人同时参团时的并发安全如果团长退款或者部分成员退款团状态怎么流转如果成团超时怎么触发退款或者改价这些都需要一套状态机来管理。我当时把拼团拆解为开团、参团、成团、取消、退款五个状态并说明用数据库行锁或者Redis分布式锁来控制成团检查的并发面试官点头表示思路是对的。订单状态机也是类似的思路创建订单-支付成功-商家发货-确认收货-评价不同状态下允许的动作不同非法状态流转要能拦截。这类业务题不考你会不会写某段代码而是考你有没有建模能力和边界意识。我的建议是平时多用状态机事件的角度去看订单、支付这类常见业务提前准备好主流程和异常分支。4. 技术面之外HR面关注点与高频问题4.1 HR面常见问题清单技术面全部通过后的HR面很多人以为就是走个流程但实际上PDD的HR面也会刷人只是刷的比例比技术面低。HR主要考察三个方面综合素质、稳定性、文化匹配度。这里说的文化匹配度不是虚的而是看你能否接受高强度、快速迭代的工作节奏以及你碰到压力时的应对方式。HR面高频问题我整理了一下你为什么选择PDD你对我们公司了解多少你的职业规划是什么你如何看待加班你的优点和缺点各是什么离职原因社招必问你最大的挫折是什么如果给你offer你会怎么选这些问题听起来很简单但回答有技巧。比如如何看待加班不要说完全不能接受也不要只说可以接受顺从更好的说法是我可以接受业务高峰期高强度的工作但希望这种状态是可以预期的、任务是有意义的我也会通过提高技术和效率来减少无效加班。关于你为什么选择PDD尽量结合业务和技术来说。你可以提到对电商业务、推荐系统、交易链路、供应链技术的兴趣谈你对公司产品模式的理解而不是只说薪资高、平台大。HR在PDD是真的会听你的理由是否真诚的这个我后面单独讲。4.2 谈薪与Offer选择谈薪环节PDD走的是HR主动沟通的方式一般会根据你的定级给出一个range不会像某些公司让你先报数字。这时候你应该做的不是直接接受而是判断这个range在你的期望范围内是否合理。我的经验是提前了解行情结合自己的面试轮次和评价来判断。如果三面面得特别好有机会在HR面争取更高一档。还要注意Offer里的结构。PDD的薪资结构一般包含基础薪资、绩效奖金和股票/期权不同批次、不同岗位差异比较大。谈薪的时候一定要把总包和月base分开看有些offer总包看起来高但绩效占比大或者股票锁定期长实际到手要打个折扣。我个人的建议是如果冲经验、冲平台总包可以适度看轻核心是能不能进自己感兴趣的团队、能不能在项目里学到东西如果已经有家庭压力那base和福利稳定性的权重就要更高。Offer选择上没有标准答案但记住一点不要被倒挂心态影响自己的判断。看到身边人拿了大厂sp就焦虑然后催着HR多要点这不是健康的谈薪状态。谈薪是商业谈判信息透明、态度真诚、双方都能接受的结果才是最好的。5. 常见避坑指南候选人在面试中容易踩的坑5.1 高频翻车现场实录我自己在PDD面试过程中就踩过两个大坑身边朋友也分享过他们挂掉的经历总结下来有很多共性。所有这些翻车情况里最可惜的不是不会导致的挂而是会但表达不好导致的挂。第一个坑是算法题写完后不主动验证。很多人写完代码面试官问你觉得还有问题吗会回答没问题了。但如果你整个注意力都在代码上忽略了边界条件面试官直接输入一个极端case比如空数组、数组只有两个元素、int溢出你的代码立刻报错这种印象非常差。我的教训是每写完一道算法题主动说我检查一下边界情况然后把空输入、单元素、负数、最大值最小值这些case逐个走一遍。这不是多此一举这是展示工程习惯。第二个坑是项目细节说不清。有些人简历上写了基于Redis实现了分布式锁但问到锁的key怎么设计、过期时间设多少、如果业务执行时间超过锁超时时间怎么办就答不上来。这等于自己把简历上最硬的亮点变成了扣分点。我建议在面试前把项目里的每一个技术词都拆开看问自己三层这个技术解决什么问题原理是什么我的场景下有哪些坑每一层都能讲清楚才敢写上简历。第三个坑是八股文背串了。把HashMap是线程不安全的说成HashTable把Redis的过期策略和内存淘汰策略混在一起这两种是不同层面的东西把TCP三次握手和四次挥手的过程背反。这些问题单看都不难但一旦说错面试官会认为你的基础不牢靠而基础恰恰是PDD比较看重的地方。5.2 几个实用的面试小技巧最后分享几个我觉得特别有用的小技巧这些办法不一定写在平时的面经里但亲测有效。第一自我介绍别背简历。面试官在你看简历之前可能已经看过了你再把学校、公司、项目复述一遍等于浪费前五分钟。更好的方式是自我介绍直接点出我做了几个和交易相关的事其中最有技术挑战的是XXX把面试官的注意力引到你最擅长的项目上后面深挖环节你就有了主动权。第二每回答完一个问题主动给一个总结句。比如面试官问TCP和UDP的区别你先说TCP面向连接可靠UDP无连接尽力而为然后再展开。这样面试官能快速抓住重点也显得你逻辑清晰。不要上来就长篇大论说到最后面试官还不知道你核心观点是什么。第三不会的问题不要死撑但也不能一个字不说。正确姿势是先说出你理解的部分再说明你对不太确定的点愿意探讨。比如我对这个问题的理解是XXX但它和YYY之间的关系我不是完全确定我猜可能是因为ZZZ你能否提示一下这个回答方式展示了你的思考过程也保住了诚实度。第四面试结束前一定反问一两个问题。不是客套而是真实有用的信息。我一般会问这个岗位目前团队最核心的技术挑战是什么和如果我入职前三个月最重要的目标是什么这两个问题既能让面试官觉得你有思考也能帮你判断这个团队是否适合你。我在实际准备过程中体会最深的是面试这件事没有捷径但方法对了会少走很多弯路。如果你现在还有一两个月的时间准备请把算法题和项目深挖放在第一优先级基础知识第二优先级业务设计最后。如果时间只剩一周高频算法题一句话项目梳理基础八股框架是我认为性价比最高的组合。面完PDD之后不管结果如何你都会发现自己的系统设计能力和对项目的理解上了一个台阶这可能是面试除了offer之外最好的回报。
返回列表