字节跳动提前批抖音三面面经 + hr面经(已经意向书)

明天猿辅导转正面试,写个字节面筋攒攒rp,7月底面的了。

有些问题记得不是很清楚了,准备的也不是特别充分。QuQ,随便写写,回馈牛客~

之后有啥想起来的再来补一补~

TL;DR

一面

基本上就是问下基础,确实记得不是太清楚了。

  • 自我介绍

  • 两家实习,大二小米暑假实习2个月、大三猿辅导实习接近8个月。讲讲实习的一些事。

  • Ant-design 核心贡献者,讲讲给 antd 写的一些 feature 以及修复的一些 issue。

  • 算法:最接近三数之和 和 比较两个pkg版本号大小(包括带 rcbetaalpha这种)。

  • 第一题刚开始用的 hash 表,面试官让我不要优化一下,改成双指针了。

  • 第二题模拟(代码写了快70行,我太笨了)

  • 一些前端基础知识

  • 继承方式

  • 问了下 es6 的继承的一些细节(constructor这些相关)

  • 问了个事件执行机制的题目,然后给了一堆混有 promise 和 async之类的事件的代码来给出一个输出结果,分析好异步和同步队列的执行情况。

  • 为了个 类似于 this 绑定的题目,也是给了一推代码分析结果,分析好隐式绑定和显示绑定以及执行的作用域就行了。

  • Dom、bom事件,小程序里面有吗(实习的时候做了一个兼容小程序的frog库)

  • 实现三列布局(口胡),左右两侧自适应,中间固定呢

  • 响应式布局 vw、em、rem 区别(实习的时候用 rem 做过响应式布局,根据视窗大小来动态计算根的 font-size 值)

  • nodejs 为啥适合做 IO 密集型不适合做 CPU 密集型

  • TCP、UDP 区别,详细问了下 TCP 的三握四挥手的过程,还问了个关于三次握手中间断开的话,包的情况。

  • new 执行过程中发生了啥

  • 其他

其实这一轮问了挺久的,快70分钟了,有些记不起来了。

二面

  • antd 贡献情况,具体哪些 feature,然后 antd 的一些工作发布流程,pr 的code review之类。

  • 实现一个类似于浏览器的并发加载的功能(用队列乱搞了半天,这题挺有意思)。

  • 实现一个判断数组去重的函数。(用了 Map,面试官让我用 es5 的方式,就只能用 object 来做 hash 表,要是有不同类型的值呢?typeof 判断一下,然后存 key 的时候标记一下就行了)。

  • 链表判环。

  • 基础知识

  • 记得有问 https 的加密相关的。

  • 然后 http2 的一些优势。

  • 还有一些也不记得了

  • 问了下实习做的一个编辑相关的项目,ts compiler api 的一些用法,以及分析提取 ast 来拼接一个 object 出来。问了下里面用到的一些算法, 其实就只用了 dfs 去扫树结构。然后最后处理 json 输出的时候,处理那个逗号来遵循 json 格式下了点功夫。

  • 问了下 react 的底层原理

  • 讲了下 diff 算法,为啥之前那种修改算法是 o(n三次方)(要遍历两棵树 & 找出不用),diff算法比较暴力,会直接根据 type 不用去做销毁再重构。但 diff 算法也会有些复用的情况例如设置了 key 之类。然后讲了下单点 diff 以及多点 diff 的执行机制。

  • 讲了下 react 15 之前的架构以及为啥要在 react15之后引入 fiber 架构。添加的 scheduler 做了哪些工作,以及在这一过程中主要优化解决的问题。

  • useState 的实现(依赖了一个双向链表)然后讲了一些其他的hooks

  • hooks 解决了 HOC 以及 render props 的一些痛点。

  • 问了下微前端相关的

  • 微前端解决的一些问题,市面上的一些微前端矿建

  • 你给qiankun的源码做过贡献,讲一讲qiankun的隔离机制以及qiankun因为用到了es6 的proxy机制导致对 IE 浏览器的不兼容性,qiankun提供的一些解决方案。

  • 讲一下qiankun 里面多应用样式是怎么隔离的,js 是怎么隔离的。

  • 问了下 deno 相关(参加过 deno 中文 api 文档的一些翻译工作)

  • deno 解决了 nodejs 的哪些痛点,相较于 node 它有哪些优势,有哪些缺陷

  • 问了我平时用 deno 来搞些啥

  • deno 源码为啥要用 rust 写而不是 cpp,聊了 rust 的一个 tokio 库来给 deno 作为异步事件支撑

  • deno 源码里面还有 cpp 吗(肯定没了啊。。),然后聊下之前 deno 团队将核心模块用 ts 迁移回 js 的事情。

面试官:还有能吹的吗?

我:没有。

面试官:那我帮你叫三面面试官。

其实这一轮也快1个小时了。有些问题也不记得了。。

三面

  • 算法:写了个两数之和,我在里面用数组的indexOf来当 hash 表用,他就问我 indexOf 有时间复杂度吗?其实这个是有的,以前打周赛就因为这个 t 过,具体时间复杂度其实有 O(N),然后他让我用 hash 表扫,提前预处理存了一轮,他问我能不能只写一层遍历。。。

  • 问了下

  • 看了我 github,然后顺势发现了我的博客(其实我简历上有。。。),看到内容后问了些关于浏览器渲染机制的问题,可以让我多去看看 chrome 的官方文档,那边资料比较新。

  • 开始问 antd 相关

  • 写过哪些组件(skeleton的一个组件已经发布了)

  • 有哪些感触(其实主要还是测试,因为大型开源库都遵循一个“百行代码,千行测试”的原则,有时候你可能只改了很小的逻辑,但是你要给这部分写很多test case)。

  • 提到关于 antd 里面组件 refactor with hooks 的工作,在重构过程中遇到了哪些问题(jest 测试对与FC 的支持不好,例如没办法像之前测逻辑的时候直接去测 state, facebook 之后能做一些改善吧。)

  • 写过一篇引导新人进入开源社区贡献 antd 的文章,现在被放在官方文档上面 hhhh

  • 正在参加阿里的编程之夏,选的项目就是 antd,里面有个课题以前没做过(组件提供无障碍的支持,会怎么去思考以及克服)。

  • 为啥春招不去阿里实习(疫情原因,不太想离开北京)。现在手上阿里云的offer 应该差不多可以拿到。

  • 对面 leader 比对了一下抖音和阿里云的区别,宣传了一下抖音,前端架构组,专门攻坚技术,能做的事情有很多。我也表示应该意愿会比较大吧,不过还是得看最后的选择吧。。。

面试官:我这边没啥问题了,之后hr会找你聊的。

然后一天就面了三轮。下午hr发消息约了明天的hr面。

可能是穿着 leetcode 的短袖在面试,算法都出的没那么恐怖。面试官问了挺多代码题的,记得最后关闭那个浏览器窗口的时候,上面有 14 个题目的 tab。。。。

hr面

  • 一些私人问题以及我对开源和技术的一些看法。

  • 问了下之前的翻译经历(掘金翻译了20多篇文章加上 deno 中文文档的翻译),碰巧也穿着之前参与掘金翻译送的短袖。

  • 问了钱在心中的地位,之后在北京的发展。

  • 现在手上快有的offer(阿里云还在坐等hr面,猿辅导转正面试)

问了也挺久的,大概快40分钟吧。

然后面完之后三个工作日就接了意向书。

Others

个人 github: https://github.com/fireairforce

有个 leetcode 的刷题 repo,已经用 js 刷了 600 多题了。

欢迎 star:https://github.com/fireairforce/leetCode-Record

#秋招##前端工程师##字节跳动##面经#
全部评论
大佬tql
点赞 回复 分享
发布于 2020-08-09 17:11
牛客md语法渲染的不是特别好。。。裂开
点赞 回复 分享
发布于 2020-08-09 17:12
tql
点赞 回复 分享
发布于 2020-08-09 17:17
沾大佬喜气
点赞 回复 分享
发布于 2020-08-09 17:42
SSSSSSSSSSP
点赞 回复 分享
发布于 2020-08-09 17:50
lz是哪个部门啊?
点赞 回复 分享
发布于 2020-08-09 17:51
大佬猿辅导实习8个月是怎么做到的,太强了吧
点赞 回复 分享
发布于 2020-08-09 17:52
大佬 好强啊
点赞 回复 分享
发布于 2020-08-09 21:17
沾沾东哥喜气。前排出售一件LC短袖,面试据说有BUFF加成
点赞 回复 分享
发布于 2020-08-09 21:28
真牛逼
点赞 回复 分享
发布于 2020-08-10 01:41
给东哥跪了
点赞 回复 分享
发布于 2020-08-10 12:08
真的流弊
点赞 回复 分享
发布于 2020-08-10 20:13
东哥是真牛逼 。。。
点赞 回复 分享
发布于 2020-08-11 20:19
沾沾大佬的喜气,许愿字节offer
点赞 回复 分享
发布于 2020-08-11 22:10
给东哥跪了,这就是zoomdong
点赞 回复 分享
发布于 2020-08-11 23:51

相关推荐

投递Adobe等公司10个岗位
点赞 评论 收藏
分享
#大家都开始春招面试了吗# 1. 传统的 CSS 文件(全局样式)传统的 CSS 方案通常是将所有的样式放在一个或多个 CSS 文件中,通过  标签引入。在小型项目或单页面应用中,简单直接。使用场景:- 小型项目- 快速开发和原型设计- 个人项目优点:- 结构简单,易于理解。- 实现快速,适合小项目。缺点:- 不利于维护:当项目增大时,CSS 可能变得冗长且重复。- 样式冲突:没有隔离,容易出现不同组件间的样式污染。2. CSS 预处理器(如 Sass / LESS / Stylus)CSS 预处理器通过扩展 CSS,提供了变量、嵌套规则、混合宏(mixin)等功能,提升了样式的复用性和可维护性。使用场景:- 中型项目- 需要模块化和可扩展性的项目- 需要多次复用样式的项目优点:- 支持变量、嵌套、函数等增强功能,提高代码可维护性。- 提高代码的模块化与复用性。- 代码组织更加清晰,能避免重复的 CSS 代码。缺点:- 编译过程:需要将 Sass 或 LESS 编译成 CSS。- 学习曲线相对较陡(尤其对于初学者)。示例(Sass):// _variables.scss$primary-color: #3498db;$font-size: 16px;// _layout.scss.container {  width: 80%;  margin: 0 auto;}// main.scss@import 'variables';@import 'layout';body {  font-size: $font-size;}.header {  background-color: $primary-color;}3. BEM(块元素修饰符)命名法BEM 是一种 CSS 类命名方法论,适用于大型项目,帮助前端开发者更好地组织和管理样式。BEM 将样式拆分成更小的、功能化的组件,通过定义明确的命名规范来减少样式冲突和提高代码的可维护性。使用场景:- 大型项目,尤其是前端与后端分离时- 团队协作项目- 需要高度模块化和可复用的项目优点:- 命名规范清晰,避免命名冲突。- 样式组件化,提升可复用性。- 便于多人协作开发。缺点:- 代码量相对较多,类名冗长。- 初学者学习曲线较陡。示例:/* BEM 风格 */.button {  padding: 10px;  background-color: blue;}.button--primary {  background-color: #3498db;}.button__icon {  margin-right: 5px;}4. CSS-in-JSCSS-in-JS 是将 CSS 写在 JavaScript 代码中的一种方法,通常与 React 等框架一起使用。它将 CSS 作为 JavaScript 对象来定义,样式和组件逻辑耦合在一起,从而实现样式的动态计算和管理。使用场景:- React、Vue 等组件化框架项目- 需要根据组件状态动态修改样式- 小型项目或者需要样式和组件解耦的大型项目优点:- 样式与组件逻辑结合,易于管理和维护。- 动态生成样式,支持主题切换、响应式设计等功能。- 减少全局样式冲突,样式范围仅限于组件内部。缺点:- 对性能有一定影响(样式计算和注入)。- 需要配置或使用框架(如 styled-components、emotion)。示例(styled-components):// React + styled-components 示例import styled from 'styled-components';const Button = styled.button`  padding: 10px;  background-color: ${props => props.primary ? '#3498db' : '#ccc'};  color: white;  border: none;`;const App = () => (      Primary Button    Secondary Button  );5. CSS 模块化(CSS Modules)CSS 模块化方案允许将 CSS 写在独立的文件中,并且通过自动生成的唯一类名避免样式冲突。它通常与 Webpack 一起使用,支持作用域限定的 CSS。使用场景:- 现代前端开发,尤其是使用 Webpack 或 React/Vue 等框架时。- 需要避免全局样式污染的项目。优点:- 避免了全局命名空间污染。- 类名自动生成,保证唯一性和作用域隔离。- 支持组件化,提升可维护性。缺点:- 需要额外的配置和工具(如 Webpack loader)。- 类名经过编译后可能较长。示例(React + CSS Modules):// App.module.css.button {  padding: 10px;  background-color: #3498db;  color: white;}// App.jsximport React from 'react';import styles from './App.module.css';const App = () => (  Click Me);6. Tailwind CSS(原子化 CSS)Tailwind CSS 是一种实用工具优先(utility-first)CSS 框架,提供了大量的原子类(单一功能的 CSS 类),可以快速构建复杂的布局。使用场景:- 快速开发和原型设计- 喜欢“原子类”方式的开发者- 开发团队需要减少自定义样式的项目优点:- 提供了高度复用的类,减少了自定义 CSS 的需求。- 代码量少,开发速度快。- 通过配置定制化 Tailwind,适应项目需求。缺点:- 类名会非常多,容易使 HTML 代码显得冗长。- 学习成本较高,特别是对于不熟悉原子类概念的开发者。示例:      Click Me  7. Atomic CSS(原子化 CSS)原子化 CSS 和 Tailwind 类似,旨在通过提供小的、独立的 CSS 类来构建样式。每个类只做一件事,组合起来形成完整的样式。使用场景:- 大型项目,尤其是需要高效的布局和样式调整时。- 需要减少样式重复的项目。优点:- 高效的代码复用。- 提高样式的可维护性。- 可以轻松地修改布局和样式,而无需修改整个 CSS。缺点:- 类名较长,HTML 中的样式代码显得冗长。- 学习曲线较高。---用的多的CSS技术Flex典型用途:- 创建水平和垂直居中的布局- 实现响应式设计- 动态调整容器内部元素的排列媒体查询媒体查询是响应式设计的核心工具之一,它使得在不同设备上展示不同样式成为可能。常见用法是根据屏幕尺寸来调整布局。典型用途:- 响应式设计- 根据屏幕宽度调整页面布局或字体大小- 控制不同设备上的显示效果Position(定位)定位是 CSS 中的一个基本概念,通过 position 属性可以控制元素的定位方式。常见的有 static, relative, absolute, fixed 和 sticky 等。典型用途:- 创建浮动元素- 固定元素(如固定导航栏)- 在容器内相对定位元素Transitions(过渡效果)CSS 过渡效果可以让你在元素的属性发生变化时添加平滑的过渡效果,常用于按钮、图片、导航栏等的交互效果。典型用途:- 鼠标悬停时的平滑动画效果- 改变背景色、宽度、透明度等属性时的平滑过渡伪类和伪元素用于在不添加额外 HTML 元素的情况下,对元素的特定状态或部分应用样式。典型用途:- :hover, :focus, :active 等交互状态- ::before, ::after 等用于生成内容和装饰Overflow(溢出处理)overflow 属性用于处理内容溢出的情况,常见用途是创建可滚动的区域或隐藏溢出内容。典型用途:- 创建带滚动条的容器- 隐藏溢出内容
点赞 评论 收藏
分享
评论
11
47
分享

创作者周榜

更多
牛客网
牛客企业服务