我大学学的并非计算机,学的是机械工程,课程仅接触过汇编语言以及一点 C 语言,当时也算有一点点计算机编程基础吧,我一点都不喜欢这个专业,除了上单片机汇编课程时比较感兴趣。
机械这个专业我不但不喜欢,还完全看不到未来,像一滩死水,自己就像一个温水里的青蛙,逐渐地死去。还好在死去前的一刻我终于想清楚了,转行!无论如何,我也要丢掉「专业」这个沉重的包袱,跟这个天坑的专业说再也不见。
我也渐渐地不会去趋于平庸委屈求全地度过年轻的岁月,人生本就应该去追寻源于内心真实的自己,而不该满足于现状,趋于平庸委曲求全。
记得刚转行那会,由于自己的基础还很薄弱,到处碰壁,毕业之后就遇到人生低谷,那时我找了一家愿意收留我的小公司开始做起,那家小公司比较年轻,用的技术都算比较前沿,没有历史的包袱,我从职业生涯一开始就接触到微服务架构的相关项目,以至于在以后的工作中起到了启蒙的思想,在此感恩。
由于自己的起点低,如何走出这个低谷?
在业余期间,我一刻都没有停止过学习,一直秉承着“今天最好的表现,是明天最低的要求”来严格要求自己,我一直都相信自己,相信只要努力,以前失去的一定会回来的。
在业余学习期间,我也从 GitHub 上面了解过很多优秀的开源项目,其中阿里的开源项目居多,当时感觉阿里的技术真的很牛逼,因此我也开始慢慢地去了解这家公司,阿里梦从那时候就开始萌芽了,我当时给自己定下目标,未来一定要进阿里。
有了目标之后,只剩下过程了,在实现目标的过程中,我一直坚持着做以下的事情。
1、学会总结
写技术博客对于一个程序员来说,在成长道路上面是非常有帮助的,特别是对于刚入行的程序员来说,因此,我在 17 年初的时候就通过 GitHub Pages 搭建了自己的博客,把自己的学习和工作实践用一篇篇文章记录下来,事实证明,写博客的习惯让我养成了总结的习惯,同时还加深了每个知识点的理解深度,强化了我对每个知识点的记忆,以至于到现在我每接触一个新的知识点,都会用一篇完整的文章将其记录下来,否则感觉自己没学过一样。
正所谓好记性不如烂笔头,写博客也算是一种记笔记的方式,程序员每天都需要接触很多新的知识,当你再回头看时,基本不可能把所有知识点都很完整地回忆一遍,这时候你翻看一下自己的博客,就能够迅速帮助自己找回感觉。
2、窥探源码
在这个过程中,我保持着阅读框架源码的习惯,很多时候我会带着目的去一探究竟,有时候为了解决一个 Bug,有时候抱着学习目的尝试去了解它们内部构造与设计原理,并借鉴到工作中,我在平时工作中用到的很多优秀设计,很多时候会借鉴相关优秀框架的设计。
阅读源码也是能够 “知其所以然“的最好途径,我这个人就是有个特点,只要我使用过的某些技术,一定会想尽办法搞懂它的底层原理是怎么实现的,通过带着目的性不断底寻根问底,我对一些底层技术有了更加深刻的理解。
3、迎接挑战
“当你觉得难的时候,就是成长的时候。”
我在这个过程中,我不断地接受过很多挑战,在迎接这些挑战的过程中,我得到了巨大的成长,记得第一次设计统一支付平台,我运用所学的设计模式,成功地众多第三方支付平台接口进行统一,且具有优秀的扩展性,这对我的编码水平有了一次巨大的提升;在推行自动化部署运维过程中,尝试设计一套基于 Jenkins Pipeline 和 Docker 的自动化部署系统,让我对容器编排与自动化运维有了一个系统性的认知;从 0 到 1 学会 Kafka 并且负责过千亿级 Kafka 消息集群的维护与技术支持,在这个过程中提升了我解决问题的能力;基于 Netty 和 K8s Operator 定制化开发了一套缓存服务平台,在这个过程中提升了我对架构设计的能力。当时接到需要使用 K8s Operator 作为缓存平台底层技术支持时,我是一脸懵逼的,我当时根本不知道这玩意是什么,而且网上资料不多且鱼龙混杂,只能凭借着一腔热血,在 GitHub 上面寻找一些相关的开源项目,了解它们的实现,通过不断的实践,终于实现了这个需求。因此,我们遇到困难千万不要退缩,要学会如何解决它,当你解决它之后,你会得到巨大的成长。
接下来我就凭借记忆大概捋一下关于这次面试的过程,每个候选者的面试都有所不同,仅做参考,大家就当故事来看即可。
1、一面
在临近春节放假前,我接到一位大佬的面试邀请,当时我的情况是不准备面试的,原因是因为之前经历很曲折的原因,我需要有一个沉淀阶段。但是当时知道大佬所负责的团队做的事情之后,我还是决定要试一下,于是就约了面试。
自我介绍完后,面试官首先就跟我讲述它们团队做的事情,以及团队负责的项目公司架构中所处的位置情况一一跟我介绍了一遍,我觉得阿里的面试官这点做得就非常棒,点个赞。
接着就面试官问了我所做的项目情况,我把在中通做过的项目详细地跟面试官介绍了一遍,内容包括项目背景、项目架构设计、技术实现细节、遇到的挑战如何解决的,接着面试官就项目的某一个技术点进行深挖,目的是为了从项目中寻找你的技术深度和广度,如果你对技术的理解不够深度,或者是提前背的,面试官会很容易发现。因此,在日常工作中,你需要对自己的项目用到的技术融会贯通。
在项目中穿插着问完问题之后,会给你出一些场景设计题,这些场景设计题一般是所在团队所遇到的实际问题出发的,这一点非常考验一个人的平时工作中的累积了,在这部分内容中,还会夹杂着一些通用的解决方案让你去思考,比如分布式锁、分布式事务、幂等处理、缓存失效策略、流量削峰等等,从这部分内容面试官就可以看出你的技术壁垒有多深了,而且这部分对于一面的评价占比非常高,因为阿里的面试是非常注重从实际场景中去解决问题的能力。
最后就会考察你的知识点,Java 的 JUC 并发包我认为是尤为重要,因此这部分内容需要重点去梳理,比如 CAS 和 AQS 原理、基于 AQS 实现的各种锁机制(公平、非公平)、线程、线程池运行原理等等;JVM 方面会问比较实际的调优场景,以及会问常用的垃圾回收器的机制以及优缺点等等;还有一些数据库、Spring 等等后端通用框架的原理需要熟悉。这部分内容主要考察你的基础知识掌握得牢不牢固。
从以上面试内容来看,阿里的面试官非常注重从实际出发考察一个人的能力,而且考察范围非常广,每个候选人的侧重点或许都有所不同,从我的面试经历仅给大家一个参考。
2、二面
面完一面后不久,就接到一面通知过了的消息,流程非常快,然后和面试官的二面约在了第二天。二面前一个晚上失眠了,因为太紧张了,梦想的征程中每走一步都会触动我的神经。
中午早早准备好,在面试前深深吸了几口气,让自己沉着冷静不慌张,不久之后接到了面试官的视频面试,自我介绍完之后,面试官让我从职业生涯开始介绍自己在每一家公司的学习和工作情况,因为我生涯前期的经历非常坎坷与曲折,经历几家小公司。这部分内容我花了一点时间跟面试官详细地描述了我当前整个职业生涯的历程,其中我重点突出了我在每家公司得到的成长情况,其中包括工作内容,遇到过的挑战并且是如何解决的,在技术上的沉淀如何,由于我的职业生涯都在不断地学习,因此这部分内容很好回答,把自己的经历说一遍即可。这部分内容面试官主要是考察经历的每家公司有没有得到成长,面试官虽然很在意频繁跳槽,但他们更在意的是你在这个过程中有没有得到技术上的累积。
接着面试官重点问了我一个比较拿手的项目,他会从整个项目的背景、项目架构设计方面进行深挖,这部分内容相比一面会更加广,会抓住项目每个细节进行盘问,当时由于项目是由我从 0 到 1 进行设计的,因此这部分的内容我还是能够回答到面试官想要的答案。这部分内容你需要对自己拿手的项目同时拥有宏观架构与微观技术细节方面足够深度的熟悉。
接着面试官给我出了一些高并发的场景解决题,这部分跟一面稍微有些不同,这些场景一般来说会比较广,通常业界已经有相关的解决方案了,这部分会重点考察你对技术方面的广度、深度以及临场解决问题的能力,同时也能看出你平时对技术的研究情况。
3、三面
二面完过了不久,就收到了二面过了的通知(我这个流程相对来说比较快)。
三面前即将面试时,我已经在家里,我在房间里面不断进行深呼吸,我知道一旦这一面过了,我离阿里就非常非常近了,离梦想越近,就越紧张。
自我介绍完之后,面试官就简单问了我个人的一些基本情况,包括学校、专业情况,因为我学校是一间民办独立学院,面试官可能没听过,而且我是非科班出身的,因此对这方面稍作了解一番。
接着还是问了我在每家公司的经历以及成长情况,这也就更加印证了一个观点,阿里面试官非常在意你的过往经历,但同样很注重你在过往经历中的成长情况。这方面我的回答大体和二面时差不多。由于我的过往经历稍微多些,因此面试官还补充了如果我进入阿里,我想要得到的收获,以及以后会遇到什么原因离开阿里,这个每个人的情况不同都会有不同的答案。
接着问了我之前几次面试阿里没过的原因是什么,以及后面你是如何克服这些问题的。在这个问题上,如果你之前有面试过阿里,过往的面试评价也体现在内部招聘系统中,由于我很早之前面试过了,因此面试官主要是想知道我没过之后的这段日子里,我做了哪些方面的提升。
接着还是会问到我的项目,大体上也会跟二面差不多,但会站在更高更广的角度去考察你,比如你的项目类型,开源项目也有很多类似的解决方案,为什么还要自己重新写一个?又比如通过什么指标去衡量你这个项目是否成功?项目在推广过程中会遇到什么问题,你是如何解决的?在跨部门合作过程中,你怎么去协调沟通?在这方面内容上,面试官更多地想要看到你在项目推进过程中的软实力。
最后面试官会问下自己的不足以及优缺点,从这问题出发去了解你是一个怎样的人。
三面时我已经在家里了,当天晚上收到了三面过了的消息,当时刚好要吃晚饭,得知三面通过后,我把自己关在房间里,忍不住激动地哭了。
4、HR 面
HR 面是春节过后了,同样地,HR 面之前我也不断进行深呼吸,我知道只要通过这一面,我就几乎双脚踏进阿里了,我努力让自己保持镇定,但当时还是有些紧张。
在自我介绍完之后,HR 会同样问了我过往经历的一些情况,这方面的内容大体跟前几面差不多。
由于我之前参与过 Seata 开源社区相关建设工作,HR 问了我参加开源项目的情况,具体是如何参与到开源项目中,以及在参与过程中得到了哪方面的成长等等。这方面内容 HR 主要是想要了解下你简历比较出彩的一些经历情况。
接着 HR 还会跟你聊聊项目方面的问题,对,你没看错,HR 小姐姐会跟我聊项目,他主要问了我在这个项目中所处的位置,有没有带人,在过程中有没有觉得非常难的地方,我就从项目立项开始讲起,把自己一路上遇到的一些困难以及解决方案都详细地说了一遍,同时还讲到自己是如何跨部门协作让项目更顺利进行。虽然都是问项目详情,但是和技术面问到的问题所站在的角度是不同的,HR 主要是通过你对项目的描述来考察你对问题的思考能力、沟通与协作能力,以及遇到问题的解决方式等等。
5、关于阿里笔试题
我的面试流程稍微有些特殊,通常来说笔试题会安排在一面或者二面,这次面试我没有做笔试题,因此我在 HR 面完之后补了一轮笔试题,题目是从阿里内部题库出的,大体上会出两道题目,一道是实现一个功能,一道是算法题,具体是什么题目就不方便透露了,通过这次笔试的体验,我觉得阿里的笔试会比较注重实际场景,而不是从 leetcode 原题搬一道给你做。
以上就是我本次面试的大体内容了,也许会有些遗忘的点,但大体上就是以上的内容了。
阿里的面试内容非常注重实际,因此想要在面试阿里过程中机会更大,就需要在平时的工作和学习中不断地沉淀,靠临时抱佛脚很容易被面试官看穿。
关于这次面试的体验,我得出了以下的一些个人感想。
1、注重基础、深挖项目
阿里的面试非常注重实际以及基础,从一面就能够看出来,所以在平时中需要注意知识点的总结,要学会记录,同时在做项目的过程中,多一些思考,同时要站在宏观架构与微观技术实现去看待每一个功能背后的逻辑。
2、每天保持学习
昨天最好的表现是今天最低的要求,这也是我从职业生涯开始就对自己的要求,时刻提醒自己要每天都有所进步。
3、过程是美好的,实现目标的那一瞬间弥足珍贵
奋斗的过程往往是最美好的,其中最爽的就是离梦想越来越近的过程,要珍惜实现目标那一瞬间的兴奋,因为这一瞬间总是短暂的,因为人生的道路总是充满崎岖与挑战,当你实现了某个目标之后,你不能原地踏步自我满足,你需要比以前付出更多的努力去迎接未来新的挑战。
4、表达能力很重要
表达能力在面试过程中实在是太重要了,假如你的能力不错,但你如何在短短的 1 个小时内,把自己最好的一面展示出来?我见过很多人能力很不错,但是表达能力欠缺,这会在面试中很吃亏。
5、向优秀的人看齐
在我的职业生涯中,我遇到过很多优秀的人,他们都是我的学习榜样,我会在他们身上不断学习他们的优点。
6、保持热爱
从我大学开始到现在,你们是能够看出来,我对编程是热爱的,保持你所热爱的每件事。
7、当你觉得难的时候,就是成长的时候
到目前为止,我在职业生涯过程中遇到过非常多的挑战,不要退缩,要学会如何解决它,当你解决它之后,你会得到巨大的成长。
想找我内推,跟我想聊面试经验,或者想跟我交朋友的,欢迎加我wx: 295502545,欢迎来撩!
作者张乘辉,擅长消息中间件技能,负责公司百万 TPS 级别 Kafka 集群的维护,作者维护的公号「后端进阶」不定期分享 Kafka、RocketMQ 系列不讲概念直接真刀真枪的实战总结以及细节上的源码分析;同时作者也是阿里开源分布式事务框架 Seata Contributor,因此也会分享关于 Seata 的相关知识;当然公号也会分享 WEB 相关知识比如 Spring 全家桶等。内容不一定面面俱到,但一定让你感受到作者对于技术的追求是认真的!
公众号:后端进阶
技术博客:https://objcoding.com/
GitHub:https://github.com/objcoding/