前端早早聊大会,前端成长的新起点,与掘金联合举办。 加微信 codingdreamer 进大会专属内推群,赢在新的起跑线。
第十四届|前端成长晋升专场,8-29 即将直播,9 位讲师(蚂蚁金服/税友等),点我上车👉 (报名地址):
正文如下
本文是前端早早聊第 46 场,也是第八届 - 面试进大厂攻略专场,来自蚂蚁金服蚂蚁金服花呗 & 借呗团队的井葵的分享 - 讲稿简要整理版(完整版含演示请看录播视频和 PPT):
大家好,我是来自蚂蚁金服花呗 & 借呗团队的前端工程师,我的花名是井葵。我这次分享的主题是《从 N 次失败中找到进入大厂的一些小招》。
一、自我介绍
我的个人经历是这样的:2016 年开始接触前端,去了一家叫匠人的公司,再到有赞、曹操,最后入职蚂蚁金服,入职时间是两个月左右,岗级是高级前端工程师。在进入大厂前,我遇到了很多挫折,也产生了很多阶段性的想法,做了很多事情。这其中有三个事情是促进我进入大厂的关键。
二、三个关键操作
1、明确梦想公司
第一个就是明确我的梦想公司。我从刚刚接触前端的时候,就有一个很确定的目标,那就是三年之内一定要进入阿里。刚开始定下这个目标的时候,也没有什么特殊的理由,纯粹因为觉得阿里是一家大型的互联网公司。不过在后来的工作中,以及在前端的圈子里面,看到了许多优秀的阿里前端工程师做的开源贡献,而且阿里也组织了诸如 D2、SEE Conf 这样的友好的前端开发者交流大会。那时候我在社区里听到了这样一句话:“优秀的前端工程师不是在阿里,就是在去阿里的路上。” 我觉得阿里的前端工程师用他们的能力做了小小的事情,改变了世界,是一件非常酷的事情。正是这些原因,慢慢促成了我非常想进入阿里的想法。在我进入阿里之前,每当我遇到挫折和失败,想要放弃的时候,这样强烈的意愿和初心,都成为了我最大的精神支柱。
2、找到憧憬目标
第二个就是要找到一个憧憬的目标。我刚开始做前端时,正是三大框架在国内苗头正旺之时。因为我个人的编程喜好,所以决定押宝 React 技术栈。也是因为 React,我发现了 Ant Design 这个技术产品,我觉得实在太好用、太好看了,完全颠覆了我对中后台的刻板印象。也是 Ant Design 让我重新思考了前端,不仅仅是实现业务功能代码,每个页面、每个区块,都应该存在它的交互情感设计。后来,Ant Design 也成为了国内前端开源产品的标杆,我希望自己也能加入这样的组织,参与这样的事情。
3、制定落实计划
第三个就是制定和落实计划了。对于落实计划,其实我也不是一开始就搞清楚这件事应该怎么做。实际上是我面试失败了好多次后,重新思考到底哪里出了问题,逐步地从零散地记笔记的方式,到慢慢地把零散的知识组织成文章,把文章组织成结构,最后落实到知识库里。所以,对于制定和落实计划,最核心的原因还是我面试阿里失败了好多次,如果一次就成功了,我也不会制定这个计划啦(笑),那我也就不会来讲这个主题了。
三、阿里面试不通过大集合
先给大家献个丑,而且是真的“丑”。
这是我面试阿里不通过的大集合。基本上面了五、六次,每次都是不一样的原因导致不通过。特别是去年,我感觉最稳的一次,HR 都已经面完了,最后还是不通过。当然我希望各位收听的小哥哥、小姐姐们能一次就面试成功。但那些面试失败、被面试官吊打的同学,千万不要气馁,一次不行就两次,两次不行就……Emmm……学学我好了,我脸皮还挺厚的,哈哈。所以我就去思考了各种不通过的原因。
四、思考原因
随着工作年限的增长,知识在累加、水平在提升,那为什么我还是一直都通不过面试呢?
1、知识梳理
我觉得最主要的原因是,一开始我没有找到一个结构化、体系化地梳理知识的方法。那我是如何发现这个问题的呢?在很多次的面试失败中,无论是笔试、现场还是电话,我每次都有总结,在总结的时候我发现,我回答问题的时候不成体系,而且做不到触类旁通,无法让面试官感受到我对问题和知识点有深度的思考。
后来我就做了一个这样的知识库沉淀。这个知识库的标题,会有一点小心思和警示的作用。我这里写的是“面向淘宝前端技术部 P6+ 定位的知识库”。因为目标和现实还是有一点差距,那如果把目标定高一点,要求更严苛一点,可能达到最初期望的概率也会更高一点。一开始其实想定为 P7 的,但对我来说可能有点难度,而 P6 是我想要取得的结果,所以我就取了个中间值 P6+。
这份文档本身也不是一个月两个月突击而成的,大概用了半年时间。其中 20% 的知识和文章,是从我以前的零散笔记里迁移过来的。所以我始终相信千里之行始于足下。
在整个整理过程中,我细分出比较适合我自己的几个大类,在每个大类下面,都是以这样几个小分类的形式收录和编写的。比如“类库及其生态”,我会分成这样几个小类:
- 首先是常规的前端知识,比如网络、DOM、异步、this、模块、闭包等。
- 第二个就是在业务中遇到一些问题,去做了源码解析。可能有些同学会为了面试,专门找一个无缘无故的源码来通读,这样其实很不好。我觉得源码解析还是要从业务出发的。
- 第三个就是奇怪问题的集合,一些 JavaScript 的糟粕、CSS 布局问题、React 或 Vue 的 Issue,我都会收集到一个大类里面。
- 第四个就是社区优秀问答的收集。在知乎、掘金、StackOverflow 上,我们能看到很厉害的大牛们写的一些回答,这些对我们都是颇有裨益的。
- 第五个就是工程架构,基本都是属于软工类的。我会从一些书籍、一些网站以及现代前端架构思想中做一些摘抄。
这就是我做的五大类的收集。最后就是我们对每个大类进行符合自己职业定位的进阶规划,一个 Roadmap。这样我们就能从粗浅的理解,到对每个知识点乃至大类有一个比较深刻的印象和了解了。
2、自行审视、深挖
第二个就是在简历中项目的知识点,一定要自行审视和深挖。比如我自己之前在有赞做过 Web IM,那我对于自己项目中使用的网络通信相关的知识点,一定要把握到位。例如用 WebSocket 来做通信,那么 WebSocket 是如何实现的?协议是怎么样的?如何做到持久连接?另外,IM 通信方式也有很多种,除了自己项目中使用到的以外,有没有考虑过其他的通信方式以及优劣比较?
同时,项目中比较有意思的点,可以主动和面试官透露,如果能够引起面试官的好奇心,那么这个小环节就已经稳了一半了。比如我之前参与的 IM 项目里面,由于 DBA 层面会对单条 message 存储有限制,那我们就要思考:如何进行文本压缩;从最开始的实现到最后落地的版本,中间经历过几种方式;每种方式的成本和权衡思考;有没有利用什么算法去实现……都会让面试官认为你是有深度思考的。
再举个例子,我们经常会被问到 React DOM 的 diff 算法,这是个比较烂大街的问题,如果我们只是简单说了 React 官网的基础阐述,其实跟别的面试者也没什么区别,那如何突显和其他人的不同呢?
第一个,可以先基于面试官的问题作出标准回答。
第二个,可以扩展到同类框架 Virtual DOM 的实现,看看这些 diff 算法,如 Snabbdom diff、inferno diff、Peti-dom diff,它们之间是有怎样的性能和实现的差异。由于一开始讲的都是基于 DOM 的实现,那这个时候可以跳出 DOM 的局限,究其本质,讲讲 diff 算法的实现,不同 diff 算法的巧妙之处。比如我们有些算法基于最短边际距离,或者是基于最长公共子序列的实现,这些是算法的本质。除此之外,还可以阐述一下这些算法有没有其他的应用场景,比如文本比较、Git diff。以此类推,如 Redux、MobX、Egg.js 这些也可以用同样的横向/纵向比较这种应答形式,来展示自己知识的深度和广度。最后呢,把这些应用和落地场景回归到前端,统一做个总结。
3、心态和风格
第三个就是面试过程中的心态和个人风格。
自信的心态
其实很多朋友在面试时会觉得面试官是大厂员工,所以很紧张、怕犯错,不敢表达内心想法,太过于小心翼翼,总感觉会说多错多。包括我自己在内,在头一两次面试中非常不自信,比较胆怯,面试官只要问一句“你确定吗?”,我就会说“嗯……不是很确定……”
所以我在自己失败的面试中发现,核心的要素就是先要自信,就是要改变成这样的心态 —— “没人比我更懂 JavaScript!”
当然我们自信的同时不能自负。我们可以把面试官当成身边的编程好友,用自信友好的态度去沟通交流,面试过程中就会和面试官形成良好的正向反馈,这就是在我这么多次面试过程中的关于心态的建议。
个人风格
另外就是在面试过程中形成独特的个人风格标签。
比如,在阐述项目或自己的实践时,可以体现一下自己的个人编程喜好,阐述自己正向的观点。每一位优秀的程序员,都会有自己独特的编程品味,也可以体现出自己爱捣鼓的精神、工作中的处世态度、跨团队协作中的 Ownership 精神。这样的话可以让面试官看到除了常规技能之外,面试者个人的风格,相信面试官也乐意给这样的候选人打上不错的标签。
4、算法
我一直觉得算法是最不能取巧的面试环节,因为算法都是有通用的衡量基准的,过就是过,不过就是不过,会做的话可能十分钟就搞定了,不会的话可能就一直对着屏幕发呆。
对于刷题我个人没有特别好的方式,大家可以看一看天羽关于 Leetcode 的分享,其实是非常好的。
除了用量堆之外,我唯一的心得 —— 也是从一个外企大佬那里学来的 —— 就是要走心。每做完一道题后,都要做归纳总结,能不能多用几种解法来做?或者总结出一些模板、套路,其实就差不多了。
5、持续打磨
现在我们可能还没有进入大厂,还没有开始面试。在这个阶段,自己应该主动承担更多事情来赋能业务,持续打磨自己。我们可以在继续在团队中推动,比如组件库的落地,工程脚手架建设,结合业务做技术分析,参与社区、反哺业务,推动 TypeScript,提高自己的协作能力。还有更多的事情可以让面试官回过头看你的过往经历里做出了一些怎样的事情,来判断候选人是否符合他们的条件。
五、团队
最后我讲一下我们的团队吧。
一开始我希望加入团队是这样的,结果也其实如我所想,我们的团队也的确是这样的,有内味儿了。
1、进入团队的感受
我讲一下进入团队的感受。我们是蚂蚁金服花呗 & 借呗团队。
职业素养
第一个就是见识到了阿里工程师最基本的职业素养:既要有过硬的前端基础技能来打底,也要有一些 Owner 意识、团队 Push 能力。
最重要的能力就是沟通能力,这个非常重要。因为大厂里有非常多的人和部门,如果在沟通过程中总是卡壳的话,会非常影响团队的协作。
另外,在阿里这样的公司里,优秀的人才非常多,会互相吸引,互相敦促成长,共同进退。像阿里蚂蚁这样的公司,团队里的小伙伴的荣辱感非常强。
真•海量知识
第二个,有海量的知识。我入职第一周时,打开内部的语雀,我感觉里面的知识库和文档就像洪水一样涌来,无论是技术产品,还是业务沉淀,非常非常多。
还有非常多的优秀知识,比如前端、后端、算法、AI,都会沉淀、发布在内网里面,共享给大家观看和学习。
在这个阶段,我无论是软实力还是硬实力,在压力下都有比较大的成长。
另外,在大厂里,会有完备的基础设施和工作流,像我们团队也孵化和维护了一些技术产品。
大展拳脚
第三个就是我自己的一些觉得比较爽的点 —— 终于可以在国民级应用上大展拳脚了,比较有成就感,能让亲朋好友看到自己亲手写的代码。
与此同时,也面临更大的挑战,在千万级流量下会有更严苛的性能挑战,以及线上稳定性保障。团队未来会有更多的挑战,也很欢迎小伙伴们加入我们,做更有意义的事情。
六、推荐书籍
我推荐这本《重构:改善既有代码的设计》,我个人觉得这是一本特别优秀的书籍。它能让你对你自己写的代码有鉴赏的能力。比如你对某段代码有好的品味判断;对另外一段代码有不好的品味判断,你就可以把它重构掉。但我希望大家不要因为这本书去重构线上稳定的应用,这样很容易出现线上故障。
我对重构的理念就是,你在实现业务代码的过程中,不断回头重看自己的代码,不断地一边实现业务、一边重构,这是比较好的重构理念。
我的演讲就到这里,感谢大家。
七、Q & A
1、如何控制面试阿里的求职频率,如果一次面试不过,简历锁多久?
因为我没有在这边当过面试官,我觉得并没有锁的概念。我自己是失败了一次,还会被其他面试官捞起来面试。所以按照我的经验,应该是没有锁的概念。
2、面经链接能分享吗?语雀搜不到。
这个面经是我个人的私密库,是不外传的。其实我只是提供一种格式和套路给大家,让大家自己去实践和形成这样的知识库。我不建议大家看面经,或者把别人的链接放到自己的知识库、收藏了就等于全懂了。
本文使用 mdnice 排版