大家好,我是程序员鱼皮。上周我直播模拟面试了一位很优秀的老哥,有些感受想和朋友们分享分享。
先简单介绍一下:老哥是一本硕士出身 + 在大厂做后端开发 2 年,buff 拉满,目标是通过跳槽冲击 50 万的年薪。
说实在的,面试前我有点紧张,我自己满打满算在腾讯待了 4 年,深知能进大厂的朋友战斗力都很强,若是老哥提前准备了一些八股文,想必能反过来吊打我一波。所以我放平心态,准备把这场面试当做一场技术交流,自己应该也能学到不少东西。
结果面试下来,我的感觉是还好,很符合预期。咳咳,只不过这里的 “符合预期” 并不是指老哥能稳拿 50 万年薪的工作了,而是指很符合我对工作两年的程序员的状态的预期。
具体是啥意思呢?让我们先来看看面试过程吧,看完答案就不言而喻了。
为方便记忆,以下暂时称呼老哥为 “原坤”。
面试现场因为时间隔得有点久了,不保证 100% 还原,凭着印象给大家分享一部分内容,可以在 编程导航 看到完整的模拟面试直播回放。
由于老哥的简历上写了 “深入理解 MySQL”,而 MySQL 也是衡量后端开发水平的关键技术,所以我打算先从 MySQL 开始问。
鱼皮:先来道基础的八股文暖暖场吧, MySQL 中 InnoDB 和 MyISAM 有什么区别?分别有哪些适用场景?
原坤:InnoDB 支持事务、有外键、支持安全恢复,适用于需要保证数据完整性的场景;MyISAM 查询性能更高。。。
鱼皮:回答的还不错,虽然漏了一些点,比如 MyISAM 只有表级锁、InnoDB 支持行级锁,能更精准地控制并发。
鱼皮:那我们提高下难度,有没有了解过 MySQL 底层是怎么对要执行的 SQL 语句进行优化的?
原坤:额。。索引?B+ Tree?
鱼皮:那我给个小提示,有没有了解过 MySQL 的查询优化器?
原坤:额。。
鱼皮:那我再问的具体一点,MySQL 的查询优化器可以做哪些事情?比如重写查询语句?它又是怎么选择执行计划的?
原坤:阿巴,阿巴!
鱼皮:好吧,看来是没有了解过,有空可以去阅读下《高性能 MySQL》这本书,开局就提到了优化器的概念,是非常重要的知识点。
鱼皮:那再问一道场景题,分享一次 MySQL 性能优化的经历?怎么发现的慢 SQL?
原坤:之前有一次线上接口超时,通过监控发现是有慢 SQL,然后加了个索引成功解决。
鱼皮:不错,那有哪些 MySQL 性能优化的方法呢?
原坤:禁用 select *、加索引,索引有个最左前缀原则。。。
鱼皮:除了加索引外呢?(一脸期待)
原坤:额,可以优化 SQL 语句?
鱼皮:除了修改 SQL 语句外呢?有没有更上层或者更底层的方法?
原坤:阿巴,阿巴!
鱼皮:好吧,可能是平时工作没怎么接触过,其实 MySQL 性能优化的方法非常多,除了你说的这些,可以运用批处理、库表设计(比如避免联表查询)、缓存、修改配置、选择合适的引擎或技术栈、分库分表、读写分离,甚至是升级物理机的配置来优化。
原坤:确实,刚刚思路被局限了,平时工作一般就是写 SQL,机器配置啥的都有运维来管,分库分表什么的也不需要我们关心。
鱼皮:我看你简历上还写了 “深入理解 Redis”,那还是老规矩,先来一道简单的开胃题,Redis 的 string 数据结构底层是怎么实现的?
原坤:我知道,SDS!
鱼皮:那什么是 SDS?
原坤:额。。。忘了,太久没看了。
鱼皮:那你属于是知道却又不知道了。我给个提醒,除了 SDS 之外呢?还有没有其他的实现方式?
原坤:那我不知道。
鱼皮:好吧,看来是没有准备过八股文了,那接下来我也不问八股文了,问一些系统设计和场景题。就拿一个经典的问题来说吧,怎么设计一个高并发的点赞系统?
原坤:需要有点赞记录表和点赞总数表,要使用消息队列来异步写记录,可以使用缓存来提升读性能。
鱼皮:不错,2 个核心点是回答到了,还能想到更多的么?我给个思路的提示,从系统架构、性能优化、可用性 / 稳定性优化、存储优化等角度考虑。
原坤:额。。。
鱼皮:没事,一个成熟的高并发点赞系统还是非常复杂的,像我之前学习过 B 站的千亿级点赞系统服务架构设计,涉及到了 RPC、服务网关、聚合请求、分库分表、三级缓存(本地缓存、分布式缓存、数据库)、数据同步、容灾备份等等,感兴趣可以去了解一下,这种题比较发散,一定是答的点越多越加分。
鱼皮:我看你的工作经历中经常跟消息队列打交道?
原坤:是的,我们大厂有自己的消息队列平台,直接申请就能使用和接入数据了。
鱼皮:那再问你一个系统设计题,怎么设计一个消息队列云服务平台?开发者可以按需申请资源和数据订阅。
原坤:嗯,首先要能管理和配置 Topic,还要对资源进行监控,差不多想到这些。
鱼皮:嗯没错,那你们公司内部的员工怎么登录这个平台呢?总不会是手动输入账号和密码吧?
原坤:对,我们是直接一键登录。
鱼皮:一键登录是怎么实现的呢?有个技术名词叫什么?
原坤:额。。一时间想不起来了
鱼皮:有没有了解过 SSO 或者 OAuth 2?
原坤:额,有了解过,但是不知道原理。
鱼皮:好吧,那再问一道和你做的项目相关的题目:你们系统在对接上游的任务系统来获取数据时,怎么防止消息丢失? 怎么防止重复消费? 这是结合业务场景 + 工作经验 + 八股文的一道经典题目。
当我问到这道题的时候,原坤显得有些激动了,显然是问到他擅长的地方了。篇幅有限,以下省略 1000 字的回答。
面试总结通过这场面试,能很明显地发现候选人的不足,也非常符合工作 2 年的程序员的状态,总结一下就 6 个字 —— 上不去、下不来 。
“上不去” 是指仅仅关注自己工作中用到的技术,不拓宽自己的眼界去了解更多的技术选型,也没有跳出单个项目或技术、站在更高的全局视角去学习系统的架构设计。“下不来” 是指没有深入了解过技术的底层原理和实现细节,对校招来说这可能没那么重要,但当你正式工作了,必须要有自己的核心竞争力,跟其他经验不足的同学要有明显的区别。只有更多地了解底层,才能发现别人看不出来的性能问题和可优化点。
我相信大多数工作后的同学都是这样,除了刚毕业那一年有点自主学习的劲头外,后面基本上就只关注自己的工作内容,不怎么了解其他的知识了。这样其实就很容易出现 “偏科” 的情况,比如原坤老哥,因为工作中用消息队列比较多,所以问到消息队列的时候,他能够答出更多的内容,像 MySQL 和 Redis 等其他知识基本就只局限于会用而已。只能等到跳槽的时候,再去学习突击,比如背背八股文什么的。由于现在校招的竞争在加大,应届生基本都是要准备八股文的,这就导致了一个有趣的现象,很多工作几年还在写 CRUD 的人,技术水平可能还不如应届生。如果你在工作中不持续学习,水平很有可能不增反降。
哪怕像我当时在腾讯这样的大厂,还同时负责不止一个项目,工作 2 年半后,我都觉得自己能学到的东西很有限了,能预料到继续保持这种状态我肯定会躺平。所以我还是选择创业,给自己营造一个无法躺平的环境,虽然累点儿,学到的东西会更多。
好吧,就聊到这里~ 今天晚上 19 : 30,我还会在 B 站《程序员鱼皮》模拟面试,跟大家一起交流分享技术,欢迎来围观,谢谢大家!
上述的所有面试题,都可以在 程序员面试刷题网《面试鸭》 查看题解哦~
更多编程学习交流:
简历快速制作:老鱼简历:
✏️ 面试刷题神器:面试鸭: