概述
掌握程度定义
了解:应用基础知识完成常规业务开发,对一些常规的bug能够有解决能力
熟练:了解各个基础场景面临一些坑,并且针对语言特性有一些应对方案
掌握:理解语言底层的运行环境和运行原理,能够根据底层原理解决问题
大纲
通用计算机基础
操作系统
- 字符编码
- 基础
- Unicode与ANSI区别
- 进阶utf-8 中 英文 汉字各占几个字节
- 进程和线程
- 入门
- 进程和程序的区别
- 进程和线程的关系
- 基础
- 线程同步机制
- 死锁原理
- 抢占式进程调度和进程优先级
- 进阶
- 原子操作原理
- volatile解决什么问题
- 互斥锁、信号量、临界区、循环锁 区别联系、使用场景
- 读写锁怎么实现
- 设计实现线程池
- 动态链接、静态链接区别
- 内存管理
- 入门
- 堆&栈
- 基础
- 虚拟内存(Virt) & 常驻内存(Resident) & 共享内存(Shared)
- 匿名映射 & 命名映射
- Free & Available
- Buffer & Cached
- Huge Page的作用和利弊
- X86的虚拟地址、物理地址、逻辑地址
- 内存回收过程
- 进阶
- 虚拟地址和物理地址的翻译(MMU & TLB)
- Drop Cache以后可用内存不增加的主要原因
- 进程和线程内存地址空间的区别
- Buddy分配器 & Slab分配器
- 内存碎片 & 内存整理
网络
- 通用知识
- 基础
- 7层网络协议的基本概念,常用网络协议属于第几层
- 常见设备工作再哪一层(路由器、交换机、网桥)
- json格式描述
- 进阶
- protobuf协议了解
- 整个网络过程串联(一个请求整个网络的处理过程)
- 网络层
- 入门
- IPv4地址样例
- 子网掩码的作用
- 给定IP和子网掩码,广播地址是什么?
- 基础
- 列举IP报文头部(源地址、目的地址、TTL)
- 进阶
- IPv6的基本概念
- 为什么引入IPv6
- BGP、OSPF协议原理
- 传输层
- 入门
- TCP和UDP各自的特点和区别
- TCP和UDP各自时候的使用场景
- 基础
- TCP建立连接和断开连接的过程
- TCP和UDP的头部列举
- 进阶
- 什么是SYN攻击
- TCP为什么三次握手,而需要四次挥手
- 滑动窗口概念
- 慢启动
- 拥塞控制
- DNS
- 入门
- DNS 用途
- 基础
- 描述DNS过程
- 进阶
- 列举典型的DNS记录格式
- DNS劫持概念、如何防止DNS劫持
- 主流的公用云的DNS服务端架构
- 应用层 https://hit-alibaba.github.io/interview/basic/network/HTTP.html
- 入门
- http协议的用途、列举一些使用场景
- 举例常见应用层协议
- http和https区别
- 基础
- header中: Content-Type / Content-Length / Content-Encoding 用途
- header cookie 返回码 UA HOST 域等基本概念
- POST / GET 区别
- 常见返回码含义
- 进阶
- http2.0和http 1.1的主要区别
- GET的幂等的含义
- Keep-alive 含义
- 为什么需要url编码
- 实现断点续传的原理
- https协商过程
- CSRF(Cross-site request forgery,跨站请求伪造)原理和防范
- XSS(Cross Site Scripting,跨站脚本攻击)原理和防范
- 中间人攻击概念与防止
- QUIC http2特点
数据库
- 入门
- 写个简单的查询语句
- 事务、索引、主键等的概念
- Join, group by的作用和使用场景
- 基础
- 数据库三个范式的定义
- 数据库游标干什么用的
- CAP概念和原理
- 进阶
- 列举自己用过的数据库及其特点
- 针对使用过的一个数据库,详细问其中的一些原理或使用方法
算法
- 基础算法
- 考察方式
- 时间复杂度和空间复杂度的计算和分析
- 代码题、设计题
- 考察范围
- 排序、递归、分治、贪心、回溯、广度/深度优先搜索、拓扑排序等
- 基础数据结构
- 考察方式
- 不同数据结构的应用场景、时间/空间复杂度
- 代码题、设计题
- 考察范围(建议)
- 链表、队列、栈、Hash表、字典树、堆、二叉树、位图等
- 进阶算法
- 考察方式
- 时间复杂度和空间复杂度的计算和分析
- 代码题、设计题
- 考察范围(建议)
- 动态规划、布隆过滤等
- 进阶数据结构
- 考察方式
- 对存储组件底层数据结构应用的理解
- 考察范围
- B树 红黑树 LSM等
前端
JavaScript
- 类型
- 基本要求- 很多人容易出现概念的错误、比如回答JS中有哪些类型的时候
- 容易回答:Array Function Date Regexp String
- 容易忽略:Null Undefined Object
- 基本上想不起:Bigint Symbol
- 了解 JS语言里面定义了哪些数据类型
- 基本类型:String Number Bool Null Undefined Bigint Symbol
- 引用类型:Object (Object Array Function Date Regexp)
- 熟悉类型的转换方式,比如 == 和 === 的情况
- 进阶要求
- 了解JS类型转换过程的一些陷阱
- 了解存在Bigint Symbol的类型,以及如何检测着两种类型
- 如何检测一个变量的类型
- typeof
- instanceof
- constructor
- Object.prototype.toString.call
- 函数、类
- 基本要求- 熟悉类和函数的最基本用法
- 熟悉通过类和函数如何定义对象,实现继承的基本思路
- Class extends
- Prototype extends
- 进阶要求
- 了解Hoisting的情况,能解释清楚代码的执行区别
- console.log(foo()); function foo() {};
- console.log(bar()); const bar = function () {};
- console.log(new Hello()); class Hello {};
- 手撸inherits的实现,能解释清楚原理
- 加分项
- 了解class extends和prototype extends各自的区别
- 了解定义class中常见的一些语法
- Public field & private field
- Static property
- 闭包
- 基本要求- 熟悉如何创建一个闭包
- 进阶要求
- 能够给出一些例子,适合用闭包来解决的问题
- 能了解闭包使用不当带来的问题
- 加分项
- 能解释清楚原理和概念(闭包是函数和声明该函数的词法环境的组合)
- 流控制
- 异步- 基本要求
- Callback 和Promise的用法
- Async & await的用法
- fetch的用法
- Node.js中读写文件的异步方式
- 进阶要求
- Callback 转成Promise
- 多个callback或者Promise的时序问题处理
- 熟悉Promise相关的unhandledPromiseRejection之类的用法
- 同步
- 代码提升
- 常见数据结构
- 数组- 基本要求
- 不要考察API,如何splice和slice的区别
- 创建一个空数组、长度为N的空数组
- 了解for in 和 for of遍历数组的区别
- 进阶要求
- 如何实现Array.prototype.flat()
- 了解ArrayLike Object的存在,以及操作的注意事项
- 了解ArrayLike Object 如何快速的转化成Array
- 对象
- 基本要求
- 熟悉如何遍历一个对象,并完成深度复制
- 了解string和new String(),以及number和new Number的区别
- 进阶要求
- 了解[] 和 new Array的区别
- 了解{} 和 new Object() 以及 Object.create(null)的区别
- 网络操作
- 基本要求- 了解xhr和fetch的基本用法(可以写出伪代码)
- 了解http中缓存相关的事项
- 进阶要求
- 了解跨域处理的方式、优点、缺点等
- 熟悉基本的http相关的协议 status code, request & response format
- 加分项
- 熟悉h2相关协议
- 熟悉https协议,如何在安全性、性能方面进行平衡
- 看过High Performance Browser Networking、HTTP:The Definitive Guide
- DOM
- 基本要求- 事件:addEventListener 和 removeEventListener的基本用法
- 事件:了解onxxx和addEventListener的区别
- 进阶要求
- 了解DOM和BOM的区别
- 熟悉最基础的DOM遍历的方式,可以实现DOM2JSON(考察会不会写递归、是不是了解最基本的DOM API,比如children, childNodes以及兼容性的处理,比如文本节点,注释节点等)
- 加分项
- 样式:了解getComputedStyle和style的区别和联系
- 事件:了解兼容性的问题,可以手撸一个事件管理等library,知道实现过程中的细节和难点
- 可以实现JSON2DOM也就是最基础的VirtualDOM的实现
- BOM
- 基本要求- 熟悉通过document.cookie访问cookie的方式
- 熟悉navigator screen history location等基本的用法
- 进阶要求
- 熟悉如何通过document.cookie设置cookie
- 熟悉如何通过set-cookie response header设置cookie、以及了解HttpOnly和secure相关的属性
- 加分项
- 计算机可视区域 window,innerHeight window.innerWidth 以及screen.width和screen.height的区别
- 正则
- 基本要求- 了解/x/和new RegExp('x')的用法
- 了解正则表达式的基本用法exec test等
- 进阶要求
- 了解global flag和lastIndex注意事项
- 加分项
- 了解最新的一些特性,比如named group unicode的支持等
- 了解正则回溯带来的性能问题
- JSON操作
- 基本要求
- 熟悉JSON.parse和JSON.stringify的用法
- 进阶要求
- 了解JSON.stringify的安全性问题
- 了解JSON.parse和JS语法的兼容性问题
HTML
- HTML 标签
- 基本要求:了解并熟练使用HTML的常规标签
- 常规基础标签:html title body h1-h6 p br hr div style span a omg
- 常规列表标签: ul ol li / dl dt dd
- 常规表格标签: table tr td / th thread tbody tfoot
- 常规表单标签: form input textarea button select option / label fields
- 框架标签: frame iframe frameset naframes
- 编程标签 script noscript
- 语义格式标签:abbr address b big block quote cite font strong sub u em section article nav
- 加分项
- 能够合理使用图像、多媒体标签:canvas video audio等标签进行游戏、动画、多媒体音视频开发
- 能够使用datalist keggen time command等具备特殊功能的标签让页面开发更加简单
- HTML属性、事件
- 基本要求
- 了解并且熟练使用HTML常规属性:class id style tabIndex title
- 了解并且熟练使用HTML常规事件:onload unselect on submit onkeydown onkeypress onkeyup onclick onmousedown onmousemove onmouseout onmouseover onmouseup
- 进阶要求:能够充分利用html5属性,让页面体验更佳
- 能够高阶html5属性:contenteditable、contextmenu、data-*、draggable、dropzone
- 能够清晰了解各个生命HTML对象事件的生命周期
- window事件
- form事件
- keyboard事件
- mouse事件
- media事件
- 加分项:能够深刻理解html属性和事件
- 深刻理解事件的冒泡机制以及能够知道如何阻止冒泡
- 能够充分利用高级html属性开发:视频播放器、音频播放器等
- case:用H5写一个高性能的音乐播放器
- 基础:
- 能够用常规标签构造一个音乐播放器页面
- 能够正确使用audio标签实现简单的音频播放
- 能够使用常规的audio事件完成对应的开发
- 进阶
- 语义化使用页面的标签
- 加分
- 对音频做缓存,流加载控制优化
CSS
- 盒模型
- 基本
- 能手绘一个盒模型
- 进阶
- Box-sizing: content-box | border-box
- 对inline block inline-block等元素、样式有充分的了解,比如图片和文字混排布局、行高以及处于行的垂直位置如何表现
- 加分
- 阅读过w3c该部分的css规范,能大概描述规范
- 层叠(样式权重)
- 基本
- 知道常用的计算权重规则
- 重要性:important
- 常用的选择器权重,比如class、id以及组合
- 样式顺序
- 进阶
- 知道 样式来源 也会影响样式权重,举例说明
- 能明确阐述选择器的权重计算规则:a b c d四个权重位,以及全量举例每种选择器对应权重位
- 加分
- 阅读过w3c该部分的css规范,能大概描述规范
- 常见规则
- Css position
- 基本
- 知道position的常见熟悉:static relative absolute fixed inherit
- 能大概描述每种position属性的布局方式
- 进阶
- 知道sticky及作用
- 较详细了解各种属性的布局方式,比如absolute元素在不设置上下左右时如何布局
- 加分
- 阅读过该部分w3c css规范,能大概描述规范的内容
- 详细透彻了解每种属性的布局方式,比如布局相对于布局元素盒模型的摆放位置
- 一些极端case,比如fixed的元素在iOS系统下弹出键盘时会出现布局问题,如何解决
- css flex
- 基本
- 知道怎么用flex做一个常用的分栏布局
- 简单说明flex涉及的常用属性
- 进阶
- 能够阐述flex的理论概念,横纵轴,间距等,画出模型
- 加分
- 阅读过该部分的w3c css规范,能大概描述规范的内容
- Transition/animation
- 基本
- 了解这两个的适用场景和大概用法
- 进阶
- 用animation代替gif图需要怎么写(即帧动画:注意step),比如loading图
- 加分
- 能说出动画的一些性能优化方式,见css性能优化部分
- 常见概念
- 样式标准化
- 基本
- 知道reset或normalize.css,知道他们是做什么的
- 进阶
- 对比reset或normalize.css的差别,知道怎样技术选型
- 加分
- 无
- 伪类/伪元素
- 基本
- 知道这两个的区别
- 举例常见伪类和伪元素
- BFC
- 基本
- 能大概阐述BFC概念
- 举例形成BFC的条件
- 进阶
- 能用自己理解的方式阐述BFC
- 能全面说明形成BFC的条件
- 加分
- 阅读过该部分规范
- 清楚浮动
- 基本
- 能说明清除浮动的目的
- 举例说明清除浮动的方式
- 进阶
- 能全面说明清除浮动的方式,并阐述原因
- 知道兼容主流浏览器的全面写法
- 移动端布局适配
- 基本
- 能说明常见的rem按比例布局的方式
- 阐述原理
- 进阶
- 能详述rem布局的原理,包括类似flexible库的具体实现,html的font-size计算方法
- 能答出viewport和这个的关系
- 能答出实现1px常用的手段
- 了解过vw vh方式
- 加分
- 对rem配合viewport以及vm vh等布局适配原理理解通透
- 对这些解决方式的兼容性有全面的了解
- 响应时设计原理
- 基本
- 能大概说明概念
- 大概说明实现方式:media query+max-width(min-width)
- 进阶
- 较全面阐述响应式设计原理,和自适应布局的差别
- 较全面阐述除上述外,配合viewport、图片等如何做到响应式
- 常见布局实现
- 基本
- 三栏布局,两边固定,中间自适应
- 三角形
- 水平垂直居中
- 已知元素宽高
- 未知元素宽高
- 进阶
- 环形进度实现
- 正方形实现,宽度自适应屏幕,边距10px
- 编译相关
- 预处理器
- 后处理器
- 基本
- 掌握一种预处理器:less sass scss
- 会这种预处理器的高阶用法
- 进阶
- 能做技术选型,对less,sass scss做优劣的对比
- 配置过postcss,了解其常用插件,写过简单插件
- 加分
- 对less,sass, scss, postcss的解析原理和了解,做过ast解析和处理
- 对css与预处理语言混用情况,模块化的引用方式(绝对路径,相对距离)很了解
- CSS性能优化
- 基本要求
- 减少文件体积
- 0后不加单位
- 颜色缩写:#abc
- 样式合并:margin等
- css文件前置,了解FOUC
- Inline css
- 打包更利于css文件浏览器缓存
- 避免使用@import
- 减少强制的layout/reflow
- 减少*选择器使用,减少继承属性
- 进阶
- 尽量少使用css表达式
- 对不同选择器的性能有充分了解,速度从快到慢
- id 类 标签 相邻 ...
- 了解选择器解析从左到右,右侧选择器尽量范围更小
- 加分
- 动画优化
- translate3d或will-change等规则,启动单独的Layer渲染,减少对非动画元素的影响
- opacity和transform属性不触发layout和render,只触发composite阶段
- layer启动太多的缺点:内存占用
- 进阶
- 掌握css grid布局
- 掌握css houdini
- 了解Fluid Wen Typography
- 了解最新的w3c css规范草案,规范动态
- 了解CSS Color Adjust草案
进阶知识
- 浏览器相关:执行流程与渲染、Webkit框架
- 渲染:Canvas、SVG、WebGL、OpenGL,原理、关系与异同
- 存储:LocalStorage、SessionStorage、indexDB、sqlLite,原理、关系与异同
- 性能:页面加载的性能优化;JS执行的性能优化;CSS对页面渲染的性能影响
- 安全:熟悉安全层面的相关知识,如何xss csrf ssrf之类的,以及对应问题的解决方案
- NodeJS:V8,Node运行时,NodeJS优化
项目经验
- 基础
- 项目背景、项目功能描述清晰
- 项目技术方案描述清晰、在技术方案上有一些自己的思考
- 熟悉项目中框架|库的使用方式
- 能够使用现成的开源工程化解决方案解决项目的工程化问题
- 进阶
- 了解项目对应的行业内成熟的解决方案并且了解为什么使用该技术
- 项目如果足够复杂,能够对工程化流程进行一些优化,解决一些流程或者开发效率问题
- 加分
- 能够将项目中的东西做足够的抽象封装输出给其他业务部门使用
- 能够hold技术整体的方案,并且协同多人共同完成大型项目
- 对业务理解非常通透,能够充分利用技术对业务产出较大的贡献
- 深刻理解框架和库,能够针对项目的特性,在成熟的框架之上做一些抽象封装
设计
- 基础
- 思路整体没有问题,做完后能够工作
- HTML、CSS、JS能够保证良好的编码以及扩展接口是能够走通的
- 进阶
- 整体能够兼顾到体验、包括但不限于提示、自动补充、能够提供比较好的体验
- 有良好的抽象、提供的接口是可复用的
- 加分
- 整体能够把设计到服务的这块能够说清楚,并设计合理,比如登录这块的安全性、服务端数据返回后的处理,比如跳错误页面或者给一些错误提醒等