1.面试流程详解
1.0 轮数
- 阿里:5~6轮,最后一面HR(小心),前五轮技术面试,周期1个月(电话面试)。
- 腾讯:4~6轮,3~4次技术面试,HR(轻松),周期1个月。
- 百度:4~5轮,1~3面,技术面试,HR(轻松),周期1~2天。
- 头条:4轮,HR(轻松)1天,给一周时间。
- 美团:4轮,一周结束战斗。
1.1 P6大致薪资
- 头条(2-1):T5~F0 * 15 + 300-500股(大小周)
- 阿里(P6):T8~T2 * 16
- 百度(T5~T6):T0 * 15 + 10w左右
- 腾讯(2-3 ~ 3-1):T8~T0
1.2 面试侧重点
- 1面:CSS / 语法 / 框架 / 框架原理 / 性能优化 等
- 2面:框架原理 / 网络安全 / 算法(必有) / 项目设计&工程化(必有) 等
- 3面:算法(必有) / 项目设计&工程化(必有) / 项目经历(必有) 等
- 4面:做过的项目经历(必有) / 新系统的设计题 等
- 5面:沟通能力 / 价值观 等
2.简历
- 个人项目:使用vue开发UI库:http://github/xxx
- 项目: xx系统,使用xxx框架,并且自己增加了 loader/plugin/中间件/NPM/封装了xxx功能
3.前端从业类型
- 3.1 PC开发(TO B / TO C 数量减少 / 数据图表 / 内部系统 / 工程效率系统 - 中台 / 做框架 / 持续集成)
- 3.2 H5页面开发(TO C 减少)
- 3.3 小程序(H5的业务迁移) / 公众号
- 3.4 纯技术(框架weex / 微信SDK)
- 3.5 融合开发(包括不限于hybrid / RN / flutter / electron)发版本(ios过审 / 版本残留 / 定时上线)
- 3.6 Node.JS(中等需求量)
4. 需要的技能
- 4.1 基础: CSS / 正则 / BOM / DOM / 闭包 / this / 节流防抖 / 数组方法
- 4.2 语言:ES6 / TS / 各类DSL
- 手写Promise
- ascyn/await/const -> babel -> 产出
- proxy -> babel -> defineProperty, []无法代理
- TS -> 重载(Vue3.0)、泛型
- 4.3 框架:React / Vue / Angular
-
- 用法篇:HOC ( @decorators ) / render-props / 生命周期
-
- Vue双向绑定 ( defineProperty 代理 get set / 数组无法代理 pop push拦截 )
-
- Vue/React vdom的实现: DFS复杂度,手写一个简单的diff
diff(oldVnode, newVnode){ patch() } -
- 路由:Vue-Router/React-Router(hash 、pushState) onpopstate / onhashchange
-
- 数据流框架:redux / mobx / vuex (手写)
-
- React fiber架构的实现
-
- 跨端框架(weex / uniapp)
-
- 4.4 服务端: Node.JS / 中间件
-
- 登陆、存储、并发、缓存、抽奖 - redis
-
- 中间件(尝试抽离一下)
-
- 4.5 融合开发:Hybrid / React-Native / 小程序 / nw / electron
-
- Hybrid
- jsbridge -> ios几种实现方式 -> android几种实现方式,小程序也是Hybrid的一种 -> JS和客户端发消息setData
- 看底层SDK
wx.getLocation = (...args) => { callMethod(...args); } callMethod() { window.messageHandler.xxx.call('just an example'); } -
- RN/小程序的渲染逻辑,渲染层和逻辑JS不在一起
-
- 4.6 工程化: xxx-cli / webpack / eslint / NPM / 单测 / 流水线
-
- 前端工程化 -> webpack -> loader/plugin规约的一些通用小功能
-
- NPM -> package.json
"scripts": { "build": "npx webpack", "precommit": "./node_modules/.bin/eslint src", "test": "echo 'test'" }, // 执行前先执行eslint检查代码
-
- 4.7 基础技能: 设计模式 / 算法 / 性能优化 / 网络
- 1.网络:
- http:缓存系列
- 'Cache-Control', 'expire' -- 200 (客户端拦死)
- 'Etag' + 'last-modify' -- 304 (会向服务端发起)
- 200 + 304 = hash
- cookies:cookile / set-cookie
- location
- transfer-encoding:bigpipe(facebook)
- 2.性能优化
- react.memo -> react-router
- (动态懒加载组建的技术)code split, react.lazy / 动态组件
- SSR, 降级方案,在检测到某一个QPS量级时,退化为普通前端方案
- 3.算法
- 动态规划(给数组求最大最小,背包的变种)
const dp = arr => { let res = [].concat(arr); let arrLen = arr.length; for (let i = 0; i < arrLen; i++){ for ( let j = 0; j < arrLen; j++){ if (arr[i] ( > or < ) arr[i-j] + xxx){ arr[i] = 重新赋值; } } } }- 搜索算法(dfs深度->递归或栈解决, bfs->队列)
const dfs = arr =>{ if (shot(xx)){ //最终终结条件 return xxx; } if (judge(xxx)){ // 递归 dfs(); } }const bfs = () => { while (queue.length) { // 队列不空时 const point = queue.shift(); // 某个临界值 for (可达的点 in point) { queue.push(point); if(shot(可达的点)) { return 可达的点; } } } }- 排序
- 1.网络:
- 4.8 图形: SVG / Canvas
- 4.9 软技能:技术方案 / 文档 / 调研 / 推动能力(出方案出文档出流程)
- 4.10 编码能力:风格与最佳实践,如函数式等
5. 创新与自驱动产出
- 1.准备一些做好的xxx-loader,或者xxx库(比较适合做中台类型的项目)
- 2.准备一些runtime的插件,比如做一个UBB的js-parser,还能兼容 rn/flutter/小程序等
- 3.多学一些非js的东西,比如 shell / java等
- 4.做一些中间件,比如登陆业务 / 内部的业务的RPC吊用或特殊格式解析
1. 技能模型
- 编程能力 => 解决逻辑难,写不出来的问题(刷题)
- 架构能力 => 解决的是系统大,写不出来的问题,不能是简单的组装,包含对复杂系统分析,设计,以及对代码协同管理(读源代码)
- 工程能力 => 解决的是人的问题,人多协作的问题(争取资源 or 选择更合适的工作)