本人今年 211 本科大三下,掘金六级博主,最近投实习,一共投了三家,阿里的淘系
和阿里云
,字节跳动的抖音
,固然都是找人内推的,结果简述以下:html
首先把面经分享给你们,因为技术水平和经历的不一样,我不敢保证个人面经问题对你有任何的参考性,但确实都是在真实的面试场景中遇到的,我所作的只是保证真实性和完整性。前端
3月17日下午 抖音架构组前端实习生
一二三面 + HR 历时约 3.5 小时。vue
这份面经不只仅列几个题目就完事儿,中间掺杂了一些我的的一些表现以及和面试官的互动,让你们能更完整地感觉到整个过程。另外,大厂面试嘛,你懂的,面试官喜欢从一个点切入往深了问,因此在会有很是多嵌套的问题,我以为这才是真正的面试场景,而不是一条一条堆砌题目,跟作考试试卷同样。node
自我介绍一下react
VueRouter 的原理你能不能说一下呢?(两种路由方式说了一下)webpack
你说你看过 Vue 源码,能不能介绍一下 Vuex 的 Mutation 和 Action 的区别吗?(mutation作同步操做,action通常用于异步)c++
计算机网络看你写过文章,我就不问了。(我: 笑...)问你一点操做系统的哈,能不能说说磁盘寻道算法?(思考了一下,说了三种,FIFO,最短优先,电梯算法)git
进程和线程的区别(解释了一波,顺便把Chrome为何从单进程转成多进程架构说了一下)github
能不能说说从输入 URL 到页面渲染经历了什么?(被问过不少次了,DNS 解析过程,HTML词法分析和语法分析,CSS解析, 合成图层、合成线程调用光栅化线程池,生成位图后浏览器进程间通讯过程,显卡缓存与显示器的关系,面试官说能够)web
给你一道算法题,盛水最多的容器。直接给我最优解吧。
这个面试官就比较高冷了,全程不露脸,说话语气特别凝重,可能沉默 5 秒钟而后问你一个很是严肃的问题。
简单的自我介绍
ES5写一个数组去重(刚开始写了一个O(n^2)时间的)
能不能优化? (我问能不能用新空间,他说能够,而后写了一个O(n)时间的)
能不能区别开数字和字符串?(想了想,最后仍是用indexOf方式,最优的没想出来,面完猛然想出来了,当时脑子有点乱)
讲一讲 HTTPS 加密(对称加密有AES + CHACHA20, 分组模式之前有 CBC、CTR,TLS1.3 中只剩下 GCM,非对称加密 RSA、ECDHE)
怎么握手的呢?(讲了三个版本:传统 RSA、TLS1.二、TLS1.3, 后面也讲了 TLS1.3 的 Session ID、Session Ticket 以及 PSK)
HTTPS 如何保证数据是否被篡改?(说了下有签名的过程)
签名是什么原理(私钥加密,公钥解密,比对哈希摘要)
你能不能介绍一下你的项目(说了下项目遇到的挑战,说了这几点: 1. 怎么解决闭包陷阱。2. 经过 EventLoop 解决 transform 失效的问题)
能不能说说你对 EventLoop 的理解(宏任务-微任务-UI渲染)
若是要在UI渲染以前作一些事情你会怎么办?(我会启动微任务执行吧)
requestAnimationFrame 在 EventLoop 中是一个什么位置?(给他解释显示器和浏览器的 Vsync 信号,而后rAF首先执行,他貌似不满意,我请教了他一下,给我解释实际上rAF会在UI渲染以前)
分离图层作动画有什么好处呢?(给他讲了分层的原理,经过设置 CSS 的 will-change 能够转换为一个图层,调用 GPU 加速)
你以为你哪些技术比较厉害?(Vue 源码,浏览器,服务端渲染)
你说你看过 Vue 的源码,能不能说说 computed 属性为何可以在依赖改变的时候,本身发生变化?(我说 computed 和 watch 公用一个 Watcher 类,在 computed 的状况下有一个 dep 收集依赖,从而达到更新computed属性的效果,顺便跟他讲了computed Watcher如何跟渲染Watcher关联,以及 Vue 在二次收集依赖时用 cleanupDeps 卸载一些无用的 dep)
你以为你的优点是什么?(1.深度思考的能力 2.善于分享 3.社区影响力)
你对 webpack 了解多少?(我说了下 webpack 的一些优化手段,打包时间方面,预编译、缓存、缩小构建目标,说了大概十个插件,而后打包体积上,JS 和 CSS 的Tree-Shaking 怎么配置)
你以为 CommonJS 为何不能作 Tree-Shaking ?
ESModule 既然是编译时加载,那它能够作到运行时加载吗,想过这个问题吗?(愣了一会,说webpack 有动态 import 的方式)
你对将来的发展是如何规划的?(谈了谈我对五级工程师的见解,个人阶段目标是到达最低的第五级)
有什么想问个人?(问了下可能触及的技术栈,以及抖音在开源方面的打算)
这位小哥仍是比较和善的,聊的不少东西跟具体的技术细节就关系不大啦。
你是如何接触到前端的?为何要选择前端?为何不去搞 c++ 底层系统研发、后端、人工智能?(说了下个人见解,他表示承认)
对学校的课抱着什么样的心态?
作这个项目的初衷是什么?里面有用到专业上学到的知识吗?
若是每次要生成不同的 ID,你怎么来设计这个系统呢?(跟他聊了聊哈希冲突如何解决,他表示能够)
在学校应该学过 C 吧,你以为 C 语言在设计上有什么好或者很差的地方呢?(提了下虚基类,实在想不起来这玩意啥用了,顺带说了下多继承的问题)
若是让你用 JS 来实现多继承的功能,你会怎么来作呢,或者用什么其余的方式?(说了下本身对于继承的见解,以及这个设计不太好的地方,而后更喜欢组合式的方式)
对前端的知识体系若是要分类的话,你怎么分类?(谈了谈将来前端发展的四个分支)
有想过去作一个开源的工具吗?(谈了谈本身对于开源的理解)
在学校有参加什么社团吗?(有,在学校的一个协会,带组内的人一块儿学习)
有什么想要问个人吗?(聊了聊面试官本身的技术经历,全程仍是蛮愉快的)
作项目的初衷在什么地方?
歌曲倍速播放的功能是怎么实现的?为何要想到这个?
公司的业务可能会压榨本身开源分享的时间,你会介意吗?
公司内的一些代码不能开源,和你本身的开源分享冲突了,你怎么办?
你为何不早点去实习?如今才开始找实习?
看了你的 GPA ,仍是蛮靠前的,你怎么平衡学校的学业和技术的学习的?
怎么看待别人在你博客下面发一些怼你的评论?
在学校有社团经历吗?
本身平时有什么兴趣爱好?
和室友关系咋样?
面试了一下午,前面三面连续说了过久,到 HR 面的时候声音已经嘶哑了,不过字节的面试体验仍是很是好的,效率至关高。自我感受还算不错,主要是由于两点:
3 月 20 号,抖音 offer 如约而至。
3月12日晚 淘宝一面(35min)
最后,主管告诉我,基础仍是很是扎实的,经过的几率仍是很高,但愿能选择淘系团队。
3月17号 (52min) 淘宝二面
整体而言,面试官基本没问什么基础,考察对前端的思考和我的的一些思考,跟我讲这方面的能力仍是不错的。
后来流程选择了阿里云,接下来咱们看阿里云的部分。
3.10晚 阿里云一面:
反问的问题:
另外,一面并无发挥个人优点,问的问题跟我不太match,甚至有些问题都没有听懂,虽然看的出来面试官比较欣赏我,但我的以为状况很不乐观。挂了也就挂了吧,我以为挂了也正常。
后续: 3 月 11 号下午内推个人大佬来信,了解到昨天面个人是团队中公认技术最牛的专家,面试官给的评价是,虽然有一些问题,可是总体表现不错,在应届生里面已经能够了。好好等下轮。
3.19 晚 阿里云二面(37min)
(ps:等的过久了,都没紧张的感受了)
二面主管问我先面试仍是先笔试,由于有两个流程。我说先面试吧。
次日主管告诉我不须要笔试了,笔试取消,直通三面。
3.20 阿里云三面(57min)
聊了狠多,可是聊的很轻松,没有编程题,并且和我的经历强相关,就不整理题目了。
3.24 阿里云四面(40min)
让人自闭的一场交叉面。
3.26 阿里云终面(50min)
面经就分享到这里了,多是由于在社区比较活跃,在面试以前很容易地拿到了内推资格,而且在一轮轮的面试凭借这部分经历获得了面试官的赏识,因此一路下来感受难度并不大,还算是很是顺利的,至少目前全部的面试中没有一轮挂掉。
在我微信公众号【前端三元同窗】的后台中也可以看到有些同窗的留言,很多人要我分享一下学习前端的一些方法和经验,之前我是很是抗拒的,由于我以为本身并无这个资格,但如今经历了这一轮轮面试的检验,我以为如今是时候回顾和分享一波了。主要分两个方面来说吧,一个是前端技术的学习,另外一个是面试当中须要注意的一些case。
回想我大一的时候,读的是机电工程,后来在大一下的时候转到了学校的计算机专业,今后开始了科班生的生涯。接触前端也大概是在大一下学期,在一个叫万门大学的地方偶然发现了一套 JS 的视频,看着感受不错,想深刻这个领域,但后来发现越日后面学越须要一些计算机科班的专业基础,因而我当时果断转到了计算机。所以这一步选择算得上偶然,也是一个必然。
大二上学校的课程压力比较大,不温不火地学了一个学期,中途有过作全栈的想法,报了个 Python Web 培训班,可是学的很差,后来直接放弃了,决定仍是回过头来好好把前端搞扎实吧,从新学了一遍 JS,而后看了看 JQuery,研究了里面选择器实现的源码,而后去学 Vue,固然也跟着网上的教程作了一些项目,好比慕课网上黄轶老师的饿了么项目和炸鸡音乐Web App,还有 Dell Lee 的 Vue去哪儿网实战,一步步作完感受对本身实战能力的提高仍是很大的,起码能本身独立倒腾一个项目出来了。
大二下学期我开始接下了人生当中第一个外包项目,也参加了计算机设计大赛,赚来了三千多的第一桶金,也拿到了中南赛区二等奖的证书。这一切在外人看来实际上是至关不错的经历了,但对我而言,我一直可以感觉到一种强烈的危机,因为项目一直在赶时间,不少时候秉着能出来效果
就行的心态来作,不少细节并无我想象中作的那么完美,并且框架里面偶尔会出一些问题,可是我并无时间去理解其中的原理。我以为这并非我要追求的东西。这种心态,说的好听点叫追求极致,难听点,就是强迫症。
在这种心态的驱使下,完成了外包和比赛后,我立刻了投入了更深一步的学习。《JavaScript高级程序设计》好好再翻一遍,ES6 从新好好学一遍,看了一遍珠峰
周啸天的 JavaScript 视频,在 CSDN 上作了相关的笔记(我以为不算博客),以及在慕课网上学习了webpack的课程,React的入门视频,一路狂奔,学了不少。
也正是大二下学期期末的时候,我开始了在掘金发表第一篇文章,标志着写博客的经历正式开始。让我惊喜的是,发表出来的第一篇博客就被掘金社区的公众号转载了,我喜出望外,感受特别惊喜,因而准备继续写下去,不断规划和输出新的内容。
很快,大二下结束后,暑假就到来了。在这个时间有些小伙伴已经出去找实习了,但我深知本身离 offer 还有一些差距,因而又感觉到了一丝危机。我曾经问过本身: 若是我要去找实习,会遇到哪些问题?
所以,在大三前的暑假开始,我开始给个人将来实习布道。首当其冲的就是本身去作一个让本身满意的项目,这个项目必须足够的精致,同时不是为了应付任何人。这个项目采用 React 来作的,当时是统一用的 class 组件,后来想试用一下 hooks 特性,发现真香,直接用 hooks 重构了。这个项目也就是我那本掘金小册项目的前身。当我把代码放到 Github 上的时候,没几天的时间就收获了上百了个 star,让我感到特别意外,而不久以后就有同窗在 issue 区留言,以为是一个不错的练习项目,能不能弄个教程出来。接下来我尝试着这个项目更大的价值,事实上我也作到了,写成了小册放到社区,反响还不错。关于项目具体细节,详情请点这里查看。
关于计算机基础,我在大三上学期花了很多的精力学习数据结构和算法,首先学完了慕课网 bobo 老师的数据结构从入门到进阶、算法与数据结构综合提高以及玩转算法面试这三门课程,夯实了全部的基础以后,开始铺天盖地地刷 leetcode,一学期刷了 100 多道算法题。对于计算机网络,当时确实没有时间学了,就把这部分的计划放在了寒假。
最后是前端技术的深刻学习,分为 3 个方向精进,JS 基础、浏览器和框架。
一方面是JS的学习,对我而言,JS 明明学了不少遍了,可是实际上忘的也很快的,我打算重读一遍红宝书,而后从新创建完整的 JS 知识体系。紧接着我开始了《JS灵魂之问》系列博客的创做,尝试着去系统地整理 JS 的知识点,又必需要达到必定的深度,当时对我来讲实际上是一个至关大的挑战。在这个整理的过程中,我也逼着本身去参考了大量的资料和博客,说实话学到了很多,更让我意外的是,这个系列让我今后在掘金大火,帮助了许许多多在 JS 进阶路上的前端。
在浏览器这块,其实不少运行原理以前也是只知其一;不知其二,直到一个偶然的机会,发现了极客时间上一个口碑不错的专栏,专门讲浏览器的,耐下心来读完以后,感受收获仍是挺大的,推荐你们去好好看看,解开了以前不少关于浏览器原理的疑惑。
而后是前端框架,我后面逼本身去读完了 Vue 源码,缘由很简单,为了面试,但没想到的是,我目前遇到的面试对我源码方面问的并不深,只是很是常规的一些原理性的问题,但无疑的是,通读源码这个指标对面试的评估来说是至关加分的,而且可以让本身站在一个更高的高度去应对面试,遇到相关的面试问题会很是从容。更重要的是,阅读完源码,对我我的对于 JS 的理解和 SDK 设计以及设计模式的理解更加深刻了一步,这是我当时没有想到的,也是很长一段时间让我受益的财富。可能有人会问你是怎么就作到的,关于源码的阅读方法,话题有点大,后面再介绍吧。
大三上就准备了这么一些东西,顺带着整理了本身的博客,期末的时候已经上架小册、粉丝过万了。
紧接着到了寒假,我把数据结构和算法从新复习了一遍,TCP 和 HTTP 好好系统学了一遍,同时看了一些 chromium 的源码,复习了一波 Vue 源码,感受火候差很少了就开始投递简历了,因而投了阿里和字节跳动,便有上面的面经了。
目前的经历分享就这些,可能会有些记流水帐的感受,但正是这样我以为才足够真实,由于对前端而言,不可能照着一个系统的学习路径循序渐进,而后达到一个很高的水平,这种美化过的经历说出来连我本身都不信,谁的人生不是这么误打误撞过来的呢?那你可能就会问了,你凭什么可以把基础学的那么扎实,经过这些大厂的面试呢?
我以为有两点,一点是外在
的因素,一点是内在
的因素。
对外在的方面,我在输入一些信息的同时,会加入本身的思考和推敲,而后用本身的方式来输出,整理成博客,这使得我可以对知识体系自己有更加深入的理解,同时也能在忘记这部分知识点以后,从新回顾的时候可以很快捡起来,节省了很是多复习的时间。
对内在的方面,我以为自驱力是一个比较重要的因素,即本身驱动本身学习的能力。其实提及来容易,作起来是很是难的,由于外界的诱惑实在是太多,并且学习自己就是脱离温馨区的活动,是一种反人性的活动,自己就是让人不舒服的,所以不少人不肯意主动学习,这是彻底能够理解的。那我为何会有这种强烈的自驱力呢?
由于危机感,危机感随之带来了恐惧。
为何这么说?
之前听《获得》APP上的梁宁老师讲过,人性其实只有两大痛点: 一个是愉悦
,一个是恐惧
。 愉悦感可让人沉浸在一件事情当中干一万小时,成为高手,而恐惧带来的动力更加显著。对产品来讲,要么就让用户爆爽
,要么就去帮助他抵御恐惧
,不然就不是一个优秀的产品。那么对于我的的成长而言,你作一件事情,没有找到任何愉悦
的感受,也没有产生过任何恐惧
,那么他基本上在这个领域一事无成。
换句话说,若是一件事情让你很是疯狂地去作,要么这件事让你爆爽,要么它帮助你抵御恐惧。
对我来说,真正驱动个人是后者。危机意识让我挖掘出真正的痛点,发现本身的恐惧所在,从而带来强大的自驱力。若是说仅仅是学一些东西来炫耀一番,或者只是去迎合外界的指望,这种动力能够有,但仅仅只是暂时的。当你走出温馨区,面对外界无数诱惑的时候,真正能 carry 你继续学习的是你心里的痛点。
我以为明白这一点,比所谓的学习路径、学习方法重要得多。由于大多数时候咱们不是缺乏学习资料,或者没有掌握什么高效的学习方法,只是由于你动力不足
、容易懈怠
罢了。每一个人状况都各不相同,但我以为想要成长,挖掘
本身真正的痛点是最重要的一件事情。
在面试以前,可能不少人会跟我同样感到焦虑,以为本身还没准备好,想多复习一些东西,可越复习越感受本身不会的东西更多,从而迟迟不敢出去面试。这实际上是个悖论,缘由就在于技术自己就是学不完的,此时咱们须要好好调整一下本身的心态,作两手准备:
准备时间是有限的,咱们须要作的就是利用有限的时间达到最大效益的产出,所以尽可能地作一些复习巩固和查漏补缺,发挥本身的优点,而不要去为了面试学新技术,或者深挖本身从未涉猎的领域。我根据本身目前的实际水平,制定了这样一份面试知识体系:
其实当时有些知识并无彻底掌握,可是又须要出去面试,因此给了本身一个截止日期,在 3 月 10 号以前,尽全力准备,到了 deadline,不管如何都要投简历出去。这样,后面的一系列面试就瓜熟蒂落了,没有拖得过久,同时准备的还不错。
另外,关于前端基础知识以及计算机基础,我已经在博客里面作了系统的梳理,下面给你们一些已经产出的内容,让你们能够完整地学习:
CSS篇:
JS 篇:
(建议精读)原生JS灵魂之问(中),检验本身是否真的熟悉JavaScript?
(2.4w字)原生JS灵魂之问(下), 冲刺🚀进阶最后一千米(附我的成长经验分享)
浏览器篇:
计算机网络篇:
数据结构和算法:
(1.8w字)负重前行,前端工程师如何系统练习数据结构和算法?
前端工程方案:
前端项目实战:
掘金小册《React Hooks 与 Immutable 数据流实战》
以上均为原创,但愿对你有所帮助,至少我面试前反复看这些,效率仍是很高的。
接下来进入面试的阶段。
从上面的面经中能够看到不一样方向、不一样级别的面试官各自的偏好不同,所以对于不一样的面试官,采起的策略也应有所不一样。但我更想分享的是一些具备共性的地方,这些策略能够适用于绝大部分的面试场景,让本身得到更大的竞争优点。固然,所谓的面试策略,都是基于你前期充分的准备,否则都只是天方夜谭,毫无可行性。
策略一: 备好杀手锏
面试官一天可能要面5-6人,甚至十几人,那么你是否想过: 他凭什么对你印象更加深入?
心理学有一个效应叫峰终效应,就是人在一个有限的活动当中,对一件陌生事物的见解大体由两个时间点所决定: 一个是高潮点,一个是结尾的点。
对面试而言,我认为一样是适用,具体来说,和面试官的交流,其实也就是和一个陌生人的交流,如何来给他留下更深入的印象?须要在高潮点展示本身,在结尾点保护本身,在面试的过程当中适当给面试官一些和别人不同的回答和看法,使之感到惊艳,而在结尾的时候,你说的话其实更容易被面试官记住,这个时候因为面试已经接近尾声,你可能没有当时那么紧张,这个时候须要适当的谨慎一些,不要完全放松,避免不当心说出一些对本身处境不利的话。
其实,我更想强调的是前者,即如何将面试带上一个高潮点,而且让面试官感到惊艳。其实这并非什么简单的事情,毕竟能惊艳的只是少数,那么若是才能作到这一点呢?
在面试前,不妨准备好本身的杀手锏
。什么是杀手锏?就是每当面试官问到相关的问题的时候,你可以有自信比 90% 的人理解得更深入,回答更出色。以我本身为例,我准备的杀手锏并很多,HTTPS 全部加密算法
,chromium 进程 IPC 原理
,斐波拉契第 n 数的 logn 解法
,浏览器渲染过程
,vue 编译器架构
,vue 双向绑定
,快排以及手写 V8 排序
......
在其它基础知识都 OK 的前提下,这些杀手锏是你技术上的核心竞争力,这是你和其余人相比体现不可替代性的地方。固然,时间有限,不可能每一个角度都能研究很深刻,但若是你不许备,跟你们背同样的答案,很难从人群当中脱颖而出。
策略二: 适当暗示
面试的过程其实就是一个和面试官互相试探的过程,一方面是他对你提问,另外一方面你须要给他一些信号,引导他去挖掘你的闪光点。
其实有两个时机能够发一些暗示的信号,一个是自我介绍的环节,这个环节中能够向面试官展现出你以前深刻研究过哪一块的技术,指引他往那个方向问,另外一个是技术细节的提问,能够在回答的时候适当发挥,大部分面试官是愿意听你展开的。
暂时先分享这么多吧,但愿你们都能在春招当中拿到本身满意的 offer。
ps: 我的博客汇总Github仓库
如想获取更多资料或者联系加群,能够关注个人微信公众号,以下: