分享一下今年的找工作的过程,从7月下旬开始面试,一直到10月下旬,历时三个月,涉及15家公司,27场技术面试,拿到5个offer,其中包含自己最想去的一家公司,从结果上看,是美好的,但是过程其实挺曲折的,从中也总结了一些经验教训,分享给大家。我感觉能否拿到offer,取决于多种因素,包含技术实力、软实力(沟通协作)、业务匹配度、运气等等。
先说下我的个人背景,16年毕业,先后入职富士康(1.5年)、鼎信通达(1.5年)、腾讯(3.5年)、问智创新(2年),这四家公司分别是通信制造业、网络通信、互联网、金融。离职原因只有一个,那就是寻求更好的职业发展空间。从一个旁观者的角度来看,我的跳槽次数还是比较多的,我也觉得跳槽次数比较多,但是不跳槽也不可行,比如富士康,它的强项是工业制造,软件开发属于边缘业务,在这个场景下,很难有空间发展软件技术。在鼎信通达,软件属于核心,但是我负责的业务是Linux内核以及一些网络通信协议开发,这些属于底层,深度有了,但是广度不够,底层技术迭代很慢,长久下去,接触不到新的知识,容易固化。腾讯,互联网大厂,技术迭代快、人员优秀,但是当时负责的业务不太行,在一个下行的业务里显然是没有发展空间的,问智创新,金融领域,难点多、挑战大,我很喜欢,但是毕竟是一个创业公司,业务规模相对较小,发展空间有限。
下面这幅图比较能够展现我的过往工作升级历程,在富士康,学到的东西偏少,主要是如何做事、沟通、协作,在鼎信,学到很多Linux内核、网络编程、操作系统等底层的知识,很基础,也很有深度,我学习的还不错,凭借这份工作的学习积累,有了去腾讯工作的可能性,因为腾讯非常注重基础。当然,腾讯考察的不仅仅是基础,还有一些其他的内容,19年离职后gap0.5年就是准备这些东西。在腾讯,接触到了互联网的一些技术栈,如数据库MySQL、Redis、消息队列kafka、分布式系统设计等等,在这里,学到的知识比较广,除了技术,还有一些非技术的,如沟通、协作等等,我当时进入的的是游戏直播业务部,平台本身已经发展成熟,日常的工作都是一些常规的业务开发,不涉及到新系统的创建,对我来说,没有太多的技术挑战性。到了22年底,我觉得继续待下去就像温水煮青蛙,于是在年后提了离职,23.3月底离职,裸辞,这一次gap比较久,15个月,直到24.6才入职新公司。这段gap时间比较长,出乎很多人都意料,我倒是不意外,因为这期间做了不少事情,每一个都需要花时间。这段gap期间学习了一门新的外语、看了一些技术源代码、梳理知识体系、重新学习数据结构与算法。直到24.6月入职一家金融创业公司,在这两年期间,从0到1搭建了多个金融级复杂的系统,技术提升很大,这也多亏了腾讯的工作积累,感觉这两年做的事情比在腾讯3年还多,工作日基本上没闲着,有的时候周末也要投入到工作中。不过努力也没有白费,这次的找工作,如果仅统计金融领域的公司,offer率是5/8,如果做好充足的准备,做到7/8是没有问题的。
我是从25年10月份开始准备面试相关的内容的,目标岗位是高级后端工程师。复习的内容包括如下6个部分:
1. 系统设计,这一块复习时间从25.10月~26.2月,主要是看alex.xu的《system design interview》,感觉看了就忘,效果不大。后来26.6月总复习的时候又和AI一起总结了一下,如何学习系统设计,结论就是先找系统的难点,难点找到之后,再逐个击破,系统设计的难点是有限的,解决方案也是有限的,核心在于取舍,常见的难点包括高并发读、高并发写、分布式事务、数据一致性、可靠性、高性能、高可用等等。系统设计这一块,感觉光看SDI没啥效果,还是得多练习,多总结。我在面试中遇到一些系统设计题,包含设计一个限流器、分布式锁、调度系统、高性能消息网关等等。限流器和分布式锁这些属于基本题,把答案背一下就行了。调度系统我是参考了K8S那一套,简单给一个控制面、执行面、配置面。高性能消息网关主要借鉴kafka那一套,包括消息分区、有序性、ack可靠性、另外这里高性能涉及到线程调度一些知识。总的来说,系统设计没有标准答案,能够在已知的约束下做出合理的技术选型并给出原因即可。再补充一点,技术学习多了就会发现,方案都是通用的,比如让你设计高可用,直接把redis 主从哨兵集群或者redis集群版拿过来改一改就行,或者MySQL主从、MGR集群方案也都可以。如果要设计高性能,可以把redis高性能那一套挪过来,比如内存操作、单线程无锁竞争,当然kafka高性能那一套也可以拿过来,如IO多路复用、顺序写、零拷贝。感觉分布式领域,很少有新东西,接触多了,就会发现,方案就那几个。
2. 数据结构与算法,这一块就是力扣刷题,一般公司基本上不考察算法,不过对技术要求比较高的公司还是会考察,因为23年彻底重新学过这一块,这一块没有花太多时间,日常复习以力扣hot100为主,刷了几轮。面试中遇到的一些题目主要涉及动态规划、背包问题、DFS等等。这个属于会者不难,难者不会。我之前在面试其他人的时候,基本上也会考察算法题,如果算法不行的话一般很难通过。面试大厂,这些还是需要准备下。
3. 项目介绍,这一块主要是按照STAR原则讲好自己的故事,一定要熟练练习,因为一场面试,60%~80%的时间是围绕项目展开,一般面试官会先问一些项目细节、难点、解决过程、潜在问题以及优化方案,这些都要提前准备好,不要现场再想,因为现场面试往往没有那么多时间允许你去想。另外还要考虑非本行业的面试官的感受,跨行业的面试官不一定理解你的项目,如果面试官不理解你的项目,很难问出有价值的问题。前期我面试了一些非金融行业的公司,虽然项目本身技术很复杂,但是面试官显然是没听懂,也就没问啥问题,面试效果就一般,后来我针对这种面试官做了一些额外的准备,一方面是用通俗的语言讲解项目,方便面试官理解,另一方面,提前画好架构图,对着架构图讲,避免干巴巴的口头介绍。如下图所示,左边是简历内容,右边是架构图,如果纯粹照着简历读,无论是否有相关的业务经验,都很难理解,但有了图就不一样了。
4. 八股文,这一块主要是考察业务中使用的技术栈底层原理,在我的业务中,主要涉及到数据库(MySQL、Redis)、消息队列(kafka)、编程语言(Go)、网络编程、操作系统、Agent等等。这些属于基础,做好总结归纳就好了,我是在26.3月总结MySQL,4月Redis,5月go&kafka,6月agent, 操作系统和网络编程因为19年和23年已经充分准备,这次也没有花时间,我以为这两个属于基本知识,面试高级岗不会被问,结果还真有不少面试官问一下相关的题目。
5. BQ,行为面试,常见的问题包括为啥离职、为啥gap、离职做啥、职业规划、优缺点、职场冲突如何处理等等。这一块,结合自己的实际情况,准备好合理的回答即可。回答要合理、可信。这一块其实也挺重要的,回答不好显得情商低,没有人想和一个情商低的人共事的。
6. 模拟面试,这一块是前面5个部分都准备好之后在综合练习。
我是7月底离职,裸辞。下面是面试的记录。15家公司里面包含8家金融业、3个互联网、2个硬件制造业、2个游戏。拿到5家金融公司的offer,技术考察感觉没啥难度,只要准备好基本上技术面都能过。离职两周后,到8月中旬拿到两个不错的offer,后来因为个人原因,亲手拒绝了这两个offer,直到9月下旬,再次面试,然后直到10月下旬再次拿到offer, 从9月到10月下旬接近2个月的空档期,这段期间压力挺大的,因为原计划是8月底入职新公司,一开始也确实和预想差不多,直到出现一些无法控制的意外事情,正好又叠加这段时间没啥机会,压力大的一批,以至于连一些海外的游戏机会都会去尝试,这也说明了裸辞的风险,机会并不是随时都有的,一旦裸辞,就没啥退路了。那段时间虽然压力大,但还是尝试保持平常心,工作日每天按时去宝安图书馆复习,每周四下午游一次泳。周末休息两天。今年在职的时候,周末我会花1.5天去复习,现在复习内容差不多了,没必要给自己整太大的压力。幸运的是,10月下旬,遇到了西芯和富途的机会,非常喜欢的工作岗位,并顺利拿到了这两家公司的offer,在此之前的几周,我还以为职业生涯没救了。
下面分享一下我面试过程中遇到的问题
1. 项目这一块,主要问了存储如何选型,这个问题和业务相关,我的业务里涉及到MySQL、时序数据库、内存数据库选型问题。技术层面还有哪些优化空间?业内是如何实现的?如果再来一次,会做哪些改变等等。怎么保障系统高可用?如何避免单点故障?这些属于常见问题,最好在面试前都准备好,如果不做准备或者准备不到位,就会显得没有思考或者考虑不足,极大影响面试分。
2. 八股文
MySQL,索引的底层实现机制,B+树、B树区别,索引失效场景、索引基本概念(主键索引、二级索引)、覆盖索引、最左索引前缀、索引如何优化,可重复读和读提交这两个隔离级别的区别、MySQL死锁如何排查?myisam和innodb引擎有何区别?这些都属于常见的问题,总结归纳一下就行。
Redis,有哪些基本数据类型,底层编码机制是什么样的,常见的使用场景,如果提到了分布式锁,会问一下如何使用,分布式锁单点故障如何处理?redlock有哪些问题,如何处理。redis高性能原因,多线程用在什么场景?这些也都是redis常见面试题,总结的时候注意看一下最新版本的迭代情况,看看都有哪些新的改变,比如redis 6.0引入了IO多线程等等。
kafka,消息eos、有序性、幂等如何实现,生产者如何提升生产速度、消费者如何提升消费速度、kafka如何实现高性能,rebalance是什么?如何解决?kafka消息接收是推模型还是拉模型,为什么这么设计?
go,介绍gmp,gc如何优化,pprof底层如何实现,go程序如何实现,死锁是什么,为什么会出现死锁,sync.map和map有何区别,slice底层实现,channel底层实现,线程和协程区别、反射是什么,有什么影响,结构体和指针接收者有何区别?堆栈区别?
网络:time_wait是啥,有啥影响?如何优化?数据包从物理层如何传到应用层,内核做了哪些处理?epoll边缘触发和水平触发区别?tcp粘包问题如何处理?
3. 其它
任务是否需要分优先级、如何进行项目风险控制?如何使用AI?什么是SDD?和产品、研发有分歧怎么处理?
面试经验教训
0. 不会的问题直接承认,不要瞎说,有不会的很正常。
1. 不要轻易裸辞,因为合适的机会并不是随时都有,没有机会就只能被动等待,风险不可控。如果在职面试,即便没拿到offer,也还有一个本职工作兜底。
2. 面试要做好准备,先进行模拟面试,说服自己,不然就是浪费机会。我前几次面试其实还没准备好,有点操之过急,其实没必要给急。
3. 努力不一定有回报,但不努力一定不会有。当然,大佬可以无视这条。
4. 重大决定三思而后行,不要着急做决定,可以缓几天或者咨询亲朋好友意见。当初轻易拒绝头两个offer导致我9月和10月压力特别大,虽然最终结果很不错,但我感觉很大是运气成分,人不可能每一次都有运气。
目前的就业市场虽然存在AI的冲击,但我感觉机会还是不少的,尤其是高阶岗位,只要准备得当,机会还挺多,当然对于初级同学而言,竞争可能会更激烈一点。我毕业10年,工作8年,经历4家公司,有收获也有遗憾。收获很明显,就是技术成长,能够独挡一面,遗憾的是没有在某一个领域深耕,如果能够同时做到这两者,那机会会更多,这也是在面试中被问到职业规划的时候我的回答,领域深耕。我感觉技术这一块不同领域大差不差,但是不同领域业务模型就会差的很多,所谓隔行如隔山大概就是这个意思。领域深耕,我的理解是不仅仅是被动的用技术完成业务开发,还需要思考如何用技术促进业务的发展,仅仅完成CURD在未来一定是没有活路的,因为AI目前的能力已经完全能够替代了。
以上就是我的本次找工作的一些经验分享,也祝愿大家都能够找到自己喜欢的工作职位。