ziyi2 / ziyi2.github.io

www.ziyi2.cn
53 stars 5 forks source link

在阿里我是如何当面试官的 #12

Open ziyi2 opened 4 years ago

ziyi2 commented 4 years ago

前言

由于疫情关系,最近在掘金看到很多同学的工作情况内心还是蛮触动的(降薪变相裁员辞退等)。可能这并不是当下一个普遍的现象,但仍然使我感受到前端这碗青春饭不好混。于此同时联系我内推的同学很多都处于待业状态,能感受到他们内心的迷茫和焦灼。于是内心一直有声音督促我,赶紧写点面试相关的东西出来吧,哪怕对大家只有一丝丝的帮助。当然这次我会以面试官的角度出发(可能不是一个优秀的面试官),让大家更加了解阿里的面试流程、面试数据和面试场景等。接下来我会从以下几个模块来讲解:

温馨提示:入职前以应聘者的角度写了一篇面试相关的文章《面试分享:两年工作经验成功面试阿里 P6 总结》,收到了很多同学对我的感谢,特别高兴他们能因此找到心中理想的工作,这也给我写文章带来了极大的动力。希望正在找工作的同学可以看看,或许能对你产生一些帮助。

更新日志

2020.04.12

2020.04.06

2020.03.29

2020.03.22

2020.03.19

招聘

Hi,大家好,我们是阿里巴巴新成立的 BU 政务钉钉事业部(杭州同学在用的健康码是我 BU 联合其他 BU 共同设计的一个项目),目前还有大量的 Web 前端职位空缺。除此之外,我们已经开启校招通道,正在招聘优秀的实习生(今年 6 月份毕业的应届生通道已关闭)。希望想找我内推或者想了解更多招聘信息的同学可以加我微信:18768107826

招聘流程

阿里的招聘流程可能相对较长,一般情况下如果走「内推」渠道,可能会经历以下几个步骤:

如果你运气够好,可能只需要 4 面左右(没有三轮技术面二轮 HR 面)。如果你运气不好,那么可能存在 5 ~ 6 面的情况。

温馨提示:咨询了一些朋友,一般的面试(小米、滴滴、新浪以及腾讯等)可能都需要经历 4 面以上,当然也有朋友经历了网易的 3 面(二轮技术面 + 一轮 HR 面)。如果有知道其他公司的招聘情况,也可以在评论中告知大家,以便更好的应对面试。

内推数据

入职半年以来断断续续收到掘友们的内推简历。这里将内推的数据整理了一下,供大家有个体感:

需要注意不是收到内推简历就会立即投递,会先有一个纯粹的简历筛选过程,因此上传简历和简历评估会有数量的差别。除此之外,当前还没有遇到被 HR 拒绝的情况。当然从内推数据可以看出,其中关键性的面试是简历评估一轮技术面(通常对于应聘者而言是一面和二面)。

温馨提示:上传简历会被录入阿里的人才库,如果简历不在面试流程中(或者简历在某部门面试后被释放),那么其他感兴趣的部门会发起新的招聘邀约。

面试数据

由于进入公司不久,一般我都是作为简历评估的面试官,少数时候会作为一轮技术面的面试官,这里将我作为面试官的数据整理如下:

感觉和内推数据中的简历评估通过率相比,我在简历评估的时候会更加谨慎......

面试注意点

在面试的过程中,我印象最深的几点感受一定要告知大家:

关于第 2 点还是要说明一下,很多面试者回答问题没有逻辑性,在回答之前可以先思考一下,然后告诉面试官将从 n 个方面进行讲解,首先第 1 个方面是...,其次第 2 个方面是...

温馨提示:面试的时候发现大部分的面试者普遍存在 1 和 2 两个问题。如果你的回答没有逻辑还繁琐且没有命中要点,通常面试官对你的印象会非常差。相反,如果你回答问题过于简洁,通常情况下面试官会觉得你没 Get 到他的问题点(当然会怀疑自己的表述有没有问题),一般都会追加更详细的问题描述。

面试题解析

一般在面试开始前,我会根据应聘者的简历提前准备 8 道左右的面试题(在面试的过程中可能会有调整),最终分析了一下笔试题数据如下:

温馨提示:这数据不包括追加的面试题,是提前为应聘者准备的面试题数据。在真正的面试中,面试题可能会因为策略和现场面试情况进行临时调整和追加。

由于本身对 React 熟悉还不够,因此我遇到应聘者如果是 React 技术栈会相对吃亏一些。接下来我会重点讲解一些面试题,有些简单的面试题不会出解答思路(有些面试题可从《面试分享:两年工作经验成功面试阿里 P6 总结》中找到答案),没有给出答案的面试题希望大家在评论中给出,供别人参考。

HTML 篇

在 HTML 中如何做 SEO 优化?

建设中...

首屏和白屏时间如何计算?

参考链接

CSS 篇

了解 Flex 布局么?平常有使用 Flex 进行布局么?

解题思路

参考链接

CSS 中解决浮动中高度塌陷的方案有哪些?

解题思路

可能追加的面试题(详见参考链接)

参考链接

Flex 如何实现上下两行,上行高度自适应,下行高度 200px?

解题思路

如何设计一个 4 列等宽布局,各列之间的边距是 10px(考虑浏览器的兼容性)?

解题思路

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>

    <style>
      * {
        margin: 0px;
        padding: 0px;
      }

      .container {
        margin-right: -10px;
      }

      .row {
        box-sizing: border-box;
        padding-right: 10px;
        width: 25%;
        height: 100px;
        float: left;
      }

      .container::before {
        display: table;
        content: '';
      }

      .container::after {
        display: table;
        content: '';
        clear: both;
      }
    </style>
  </head>
  <body>
    <div class="container">
      <div class="row">第一列</div>
      <div class="row">第二列</div>
      <div class="row">第三列</div>
      <div class="row">第四列</div>
    </div>
  </body>
</html>

可能追加的面试题

CSS 如何实现三列布局,左侧和右侧固定宽度,中间自适应宽度?


CSS 清除浮动的原理是什么?

解题思路

利用清除可以设置元素禁止浮动元素出现在它的左侧、右侧甚至是双侧。

<style>
    div {
        display: inline-block;
        width: 40%;
        height: 100px;
        background: #d3cff7;
        margin-right: 10px;
        margin-bottom : 0;
        padding: 0;
    }

    .float {
        float: left;
    }

    .box {
        height: 50px;
    }
    p {
        border: 1px solid black;
        margin:0;
        padding:0;
        width: 80%;
    }
</style>

<div class="float"></div>
<div class="box"></div>
<p>3333333333333333333333333333333333333333333</p>


1
2

3333333333333333333333333333333333333333333


由于 div1 浮动,p 和 div1 布局重叠,为了解决这个问题,可以使 p 元素左侧不允许有浮动元素,给 p 元素添加一个 clear:left 的样式之后

1
2

3333333333333333333333333333333333333333333


可以发现 p 的位置下移从而使 p 和 div1 布局不会重叠,其实是使用清除之后,自动增加了 p 元素的上外边距,确保它落在浮动元素 div1 的下面。CSS2.1 引入了清除区域的概念,清除区域是在元素上外边距之上增加的额外间隔(确保浮动元素不会与该元素重叠),不允许浮动元素进入这个范围,意味着设置 clear 属性的 p 元素的外边距并不改变,之所以该元素会向下移动是因为清除区域造成的。div1 和 div2 的高度分别是 100px 和 50px, 因此清除区域的高度在 50px 左右(不算 border 和浏览器代理初始样式等)。如果给 p 元素一个上外边距 margin-top:30px,则 p 元素并不会向下移动 30px,而是在解析完样式之后清除区域的高度变成了 50px - 30px 左右,而 p 元素仍然位置不变,如果要使 p 元素下移,则需要使 p 元素的 margin-top 值高于最大的清除区域高度 50px,并且向下位移的距离也是 margin-top 值减去最大的清除区域高度。

BFF 的作用有哪些?

参考链接

《面试分享:两年工作经验成功面试阿里 P6 总结》

CSS 中的 vertical-align 有哪些值?它在什么情况下才能生效?

解题思路

vertical-align属性值:

温馨提示:负值相对于基线往下偏移,正值往上偏移,事实上vertical-align:base-line等同于vertical-align:0。这个负值真的是 CSS 神器!

vertical-align生效前提:

CSS 中选择器有哪些?CSS 选择器优先级是怎么去匹配?

建设中...

伪元素和伪类有什么区别?

参考链接

《面试分享:两年工作经验成功面试阿里 P6 总结》

CSS 中的 backgroundbackground-image 属性可以和 background-color 属性一起生效么?

可能追加的面试题

了解 CSS 3 动画的硬件加速么?在重绘和重流方面有什么需要注意的点?

参考链接

《面试分享:两年工作经验成功面试阿里 P6 总结》

CSS 可以做哪些优化工作 ?

建设中...

浮动元素和绝对定位元素的区别和应用?

建设中...

CSS 中哪些属性可以继承?

JavaScript / TypeScript 篇

JavaScript 中数组是如何存储的?

解题思路

温馨提示:可以想象一下连续的内存空间只需要根据索引(指针)直接计算存储位置即可。如果是哈希映射那么首先需要计算索引值,然后如果索引值有冲突的场景下还需要进行二次查找(需要知道哈希的存储方式)。

可能追加的面试题

参考链接

聊聊继承以及说说 ES5 和 ES6 继承的区别?

解题思路

参考链接

说说对原生 JavaScript 的理解?

解题思路

谈谈你对 TypeScript 的理解?

解题思路

JavaScript 中几种迭代语法在 Chrome 等现代浏览器中的性能差异?

面试题来源

应聘者简历里写了熟悉高性能 JavaScript 开发

解题思路

可能追加的面试题

如何提升 JavaScript 变量的存储性能?

解题思路

浏览器和 Node.js 的事件循环机制有什么区别?

参考链接

《面试分享:两年工作经验成功面试阿里 P6 总结》

比较一下 TypeScript 和 JavaScript,在什么情况下你觉得需要 TypeScript ?


在 JavaScript 中如何实现对象的私有属性?


async / await 和 Promise 的区别?

解题思路

在 JavaScript 可以有哪几种形式实现继承,各有什么优缺点?

解题思路

类型 优缺点
构造函数模式 可以创建不同实例属性的副本,包括引用类型的实例属性,但是不能共享方法
原型模式 引用类型的属性对于实例对象而言共享同一个物理空间,因此可以共享方法
原型链 对父类实现方法和属性继承的过程中,父类实例对象的引用类型属性在子类的实例中共享同一个物理空间,因为父类的实例对象指向了子类的原型对象
借用构造函数 解决了继承中的引用值类型共享物理空间的问题,但是没法实现方法的共享
组合继承 属性的继承使用借用构造函数方法,方法的继承使用原型链技术,即解决了引用值类型共享的问题,又实现了方法的共享,但是子类的原型对象中还存在父类实例对象的实例属性
寄生组合继承 组合继承已经可以解决大部分问题,但是也有缺陷,就是会调用两次父类的构造函数,一次是实现原型时使子类的原型等于父类的实例对象调用了父类构造函数(同时在子类的原型对象中还存在了父类实例对象的实例属性),一次是使用子类构造函数时调用了一次父类构造函数。寄生组合式继承可以解决在继承的过程中子类的原型对象中还存在父类实例对象的实例属性的问题。

参考链接

React 篇

React 中的 setState 为什么需要异步操作?

解题思路

可能追加的面试题

参考链接

React 应用如何在重新加载页面时保留数据?

解题思路

使用 React Hooks 的同时为什么需要使用高阶组件?

面试题来源

简历中写着使用 Hooks 结合高阶组件完成业务开发

解题思路

可能追加的面试题

参考链接

Ajax 请求放在 componentDidMount 里进行处理还是放在componentWillMount 里进行处理比较合适?

解题思路

gaearon :If it's an async request, it won't be fulfilled by the time the component mounts anyway, regardless of where you fire it. This is because JS is single threaded, and the network request can't "come back" and be handled while we are still rendering. So the difference between firing it earlier and later is often negligible.

You're right that it matters in some rare cases though and for those cases it might make sense to break the recommendation. But you should be extra cautious as state can update before mounting, and if your data depends on state, you might have to refetch in that case. In other words: when in doubt, do it in componentDidMount.

The specific recommendation to avoid side effects in the constructor and Will* lifecycles is related to the changes we are making to allow rendering to be asynchronous and interruptible (in part to support use cases like this better). We are still figuring out the exact semantics of how it should work, so at the moment our recommendations are more conservative. As we use async rendering more in production we will provide a more specific guidance as to where to fire the requests without sacrificing either efficiency or correctness. But for now providing a clear migration path to async rendering (and thus being more conservative in our recommendations) is more important.

JS 是单线程,Ajax 请求不会 "返回" 并且触发当我们正在 rendering 的时候(Ajax 的执行结果会放到任务队列中,等主线程执行完后采取读取任务队列中的任务进行执行),因为理论上放在哪里结果都一样,都会执行两次 render。

这样的话,就没必要在componentWillMount中调用 Ajax,以避免理解不到位,对state的结果预计错误。componentDidMount的执行很明了,不会引起歧义,所以在componentDidMount中最合理了。

可能追加的面试题

参考链接

React 在语法层面可以做哪些性能优化?

解题思路

可能追加的面试题

React 和 Vue 的区别?

框架 React Vue 2.x
类型 MVVM MVVM
响应式
组件化
脚手架 Create React App Vue CLI
路由 react-router vue-router
状态管理 react-redux / React Hooks / MobX vuex
整体思路 函数式、单向数据流 声明式、表单双向绑定
组件优化 PureComponent / shouldComponentUpdate 可理解为自动化 shouldComponentUpdate
HTML JSX (结构 & 表现 & 行为融合、完整的 JavaScript / TypeScript 语法支持先进的开发工具 Lint / 编辑器 Auto 等) Template(结构 & 表现 & 行为分离、HTML 更友好开发效率提升、文档学习成本) / JSX
CSS CSS 作用域需要额外实现,例如一些 CSS-in-JS 方案(styled-componentsstyled-jsx),一般需要额外的插件支持语法高亮和提示 单文件组件 Style 标签
Chrome 开发工具 react-devtools vue-devtools
优势 大规模应用程序的鲁棒性(灵活的结构和可扩展性)、适用原生 App、丰富的生态圈、丰富的工具链 一站式解决方案、更快的渲染速度和更小的体积

除此之外,在语法层面:

温馨提示:有更好的语法对比请在评论中告知。

可能追加的面试题

Vue 篇

Vue CLI 3 有哪些特性?

面试题来源

简历中写着 Vue CLI 技术栈

解题思路

可能追加的面试题

能对比一下 Create React App 和 Vue CLI 3 吗?

面试题来源

简历上写着熟悉 React 和 Vue 技术栈

解题思路

类型 Create React App Vue CLI 3.x
可一键构建 SPA 应用
Script react-scripts(可定制化) @vue/cli-service
ESLint 插件集 react-app eslint-plugin-vue(插件化)
CSS Modules
CSS 预处理器 自定义 Sass 天然支持 Sass & Less & Stylus(可配置化)
PostCSS 后处理器
HTML 和静态资源 HTML 插值 & Svg 组件化 HTML 插件 & Preload & Prefetch & 多页应用 & URL 规则
代码分割
环境变量
PWA 插件化
单元测试 Jest 插件化(Ject & Mock & ...)
Proxy √ (灵活,但往往需要自定义) √(这种变成配置项)
TypeScript 模板 插件化
自定义脚手架模板 Custom Templates(template.json Preset & 插件系统(非常棒,可远程)
Webpack 配置 Eject & Webpack files Inspect & vue.config.js & 默认配置全面 & webpack-merge & webpack-chain(有学习成本)
Webpack 分析 Source map explorer vue ui(GUI 交互式)
快速原型开发 × @vue/cli-service-global
交互式开发 × vue ui
浏览器兼容性 现代浏览器(自定义 Polyfill & browserslist) browserslist & Polyfill & 现代模式
构建 应用 应用 & 库 & Web Components 组件 (异步)

温馨提示:这里指的是默认功能比较,而不是说不能进行功能自定义扩展!

Creat React App 在工程化体系上没有 Vue CLI 3.x 更加的开箱即用,除此之外,Vue CLI 3.x 中的插件体系是一个非常棒的特性,它使自定义脚手架模板变得非常灵活(非常适合企业定制化脚手架)。当然 Create React App 是有它自己的设计理念的,对于简单的应用它是一种优势(不可配置化预先约定)。

Vue.js 整个实现原理?

面试题来源

简历中写着熟悉 Vue.js 源码,或者简历中只写着 Vue.js 技术栈,或者面试的过程找不到亮点

解题思路

enter image description here

这里简单的描述一下 Vue 2.x 的运行机制(需要注意分析的是 Runtime + Compiler 的 Vue.js)。

初始化流程:

需要注意在初始化阶段,没有详细描述数据的响应式过程,这个在响应式流程里做说明。

响应式流程:

可以发现只要视图中添加监听事件,自动变更对应的数据变化时,就可以实现数据和视图的双向绑定了。

可能追加的面试题

参考链接

Vue.js 中组件之间通信有哪些方案?

解题思路

可能追加的面试题

Vue 如何定制化脚手架?需要考虑哪些因素?

建设中...

$nextTick 执行的时机和 DOM 渲染的关系是什么?

可能追加的面试题

参考链接

Vue 使用的是什么版本,如何配合 TypeScript 工作,TypeScript 有哪些特性?

建设中...

Vue 里的 keep-alive 是怎么实现的?

建设中...

面试题来源

简历中出现 keep-alive 信息

可能追加的面试题

说说 Vue 里的数据劫持在不同版本里是如何处理的?

建设中...

Vue 能做哪些性能优化?

解题思路

可能追加的面试题

组件篇

React 中受控组件和非受控组件的区别?

面试题来源

简历写着抽取公共业务组件

解题思路

可能追加的面试题

参考链接

React 中如何实现一个 Input 组件开发?

建设中...

公司的组件库搭建、设计与维护?

面试题来源

简历写着设计和维护公司的组件库

解题思路

可能追加的面试题

参考链接

了解 Element UI 组件的框架设计吗?

面试题来源

简历写着使用 Element UI 进行业务开发并自己设计过组件

参考链接

组件库要做按需加载,觉得应该怎么做?

面试题来源

简历写着使用使用按需加载提升页面性能

解题思路

如何自动屏蔽 Input 的自动密码填充?

设计模式篇

设计模式中观察者模式和发布 / 订阅模式有哪些区别?

面试题来源

简历中写着熟悉设计模式、Redis、Vue 源码等

可能追加的面试题

参考链接

了解 MVC / MVP / MVVM 的区别吗?

参考链接

工程化篇

Webpack 构建速度优化有哪些方案?

面试题来源

项目中写着使用 Webpack 进行构建速率优化

解题思路

可能追加的面试题

说说你对 cz 生态的了解?

面试题来源

项目中写着使用 cz 规范 Git 提交

参考链接

简单说说 Webpack 对于性能优化有哪些特性?

建设中...

性能优化篇

了解 SPA 的懒加载么?

建设中...

Vue 如何配合 Echarts / OpenLayers 实现性能优化?

建设中...

服务篇

有做过基于 Express 的应用框架技术选型么?

建设中...

前后端分离的历史?分离模式带来的好处和坏处有哪些?

建设中...

Node 里的事件循环机制和浏览器的事件循环机制有什么区别?

建设中...

说说怎么用纯粹的 Node.js 做一个服务端框架?谈谈 Node.js 服务端 MVC 的理解?

建设中...

熟悉 Node,谈谈服务端 MVC 的演变历史?

建设中...

跨域的解决方案有哪些?cors 是怎么处理跨域?

建设中...

框架篇

什么是 H5 ?

建设中...

AMD 、CMD 和 CommonJS 区别?

建设中...

可能追加的面试题

如何设计突发大规模并发架构?

建设中...

一般公司是怎么部署前端代码?

建设中...

HTTP 篇

GET 和 POST 的区别?

可能追加的面试题

随便聊聊 Ajax,聊聊 axios?

建设中...

axios 库有什么能力?axios 库发请求的之前能做拦截么?

建设中...

可能追加的面试题

硬件层和前端是如何做通讯的?

可能追加的面试题

谈谈你对缓存的理解,举一个和你最相关的缓存的使用案例。

建设中...

服务端推送主要用到什么技术?

建设中...

HTTP 2 相对于 HTTP 1 有什么区别?

建设中...

WebSokect 本质上是基于什么协议进行通信的(TCP / UDP)?

可能追加的面试题

简单介绍一下 Graphql,说说为什么要在你的项目中使用 Graphql?

建设中...

了解跨域么,一般什么情况下会导致跨域?

建设中...

cookie 和 session 的区别?

建设中...

测试篇

平常开发的过程中有写过单元测试或者 e2e 测试么?

建设中...

自动化测试主要是做什么?

建设中...

优化篇

SEO 有哪些优化方案?

建设中...

可能追加的面试题

说说任何前端优化处理?

建设中...

业务篇

规范代码书写的适用范围有多大?

版权信息小工具是干什么的,能具体介绍一下么?

介绍一下 dtd 组件,组件是如何维护的,版本是怎么控制的?

在业务的开发中有没有发现什么痛点并对其进行改进?

有没有觉得交互设计不合理然后自己想出方案推动交互更改的案例?

前端广告投放如何?Chrome 如何劫持广告?

简化业务设计的复杂度案例有么?

有没有做过什么工具简化业务开发?

Moxtra 是你主推的么?讲讲RxJS?

有没有主动 own 过业务,并高效排除业务风险的案例?

说说如何衡量提升产品的体验?

温馨提示:有些业务问题主要针对的是简历中的项目,在这里不适合展示。不过有一点需要注意,面试官可能会对业务的数据非常感兴趣,所以在业务上有比较 NB 的数据可以体现的最好可以提前准备好。业务这一块可能会考量的点:业务数据 / 业务难点 / 业务成果 / 业务贡献 / 业务主动性 / 业务 own 能力 / 技术栈选型考量 / 业务影响范围 / 业务通用性 / 业务思考 ......

名词解析篇

什么是渐进增强和优雅降级?

建设中...

笔试篇

0 1 1 2 3 5 8,假设第 0 个是 0,第 1 个是 1,求第 n 个数的实现方式?

简单实现一个发布订阅机制?

简单实现带立即执行参数的消抖函数:function debounceImmediate (fn: Function, wait: number, immediate: boolean))

实现一个扑克牌式的插入排序(我们总是喜欢将某张扑克牌插入到已排序的扑克中),输入:[5,6,1,8,7,2,4,3],输出:[1,2,3,4,5,6,7],并提供单元测试思路(如何测试你的代码是稳定正确的)?

实现一个简易的模板引擎

let template = '嗨,{{name}}您好,今天是星期 {day}';
let data = {
  name: '张三',
  day: '三'
}
render(template, data); // 嗨,张三您好,今天是星期三

混沌篇

你觉得你最擅长什么?

假设某个组织下面挂了 10 w 个节点,如何做优化处理?

用 Vue 的时候有没有遇到过难以解决的问题?

说说你业务中觉得性能优化最大的一个场景?

说说你业务中至今没有解决的问题?

说说你业务中遇到最难解决的问题?

八卦篇

高效的自学能力,能举个例子体现一下高效么?

除了业务上的开发,平常会有什么学习计划么?

平常有什么兴趣爱好?