feat: update articles

上级 36ad47e4
# Backend Interview | 服务端开发面试题集锦
[Backend Interview]()[Awesome Interviews]() 系列的组成,涵盖了笔者在日常积累中总结而来的可成为面试题的知识要点与场景案例。
本文所提及的问题皆可在下列文档矩阵中寻找到解答,请自行索引。
全局唯一有序 ID。 snowflake ,timestamp 加前面,然后后面加机器 id 等冯诺依曼体系
shell 命令的执行过程信息熵程序运行中的栈式结构,栈溢出攻击
TCP/IP 有关知识。TCP 传输层加端口号,IP 网络层加 ip 地址;路由器就主要工作在 IP 网络层同步与阻塞并行与并发
Java 线程的本质,内核线程与用户线程,线程调度,并行级别内核态与用户态,中断
CPU 与内存与磁盘缓存行与伪共享内存分配管理,段页式。jemalloc
Java 程序的运行原理普通可执行程序的运行原理缓存行与伪共享。两个面试官都问,可见十分重要,还好都答出来了从浏览器发出请求开始,到服务端应用接受到请求为止的过程
HashMap ,hash 碰撞,hash 算法的优化单点登录正向代理与反向代理反爬机制,爬虫模拟浏览器行为
cglib 方法拦截动态代理依赖注入
Servlet 的本质
TCP 长连接。心跳包,websocket
Netty 百万级长连接优化
DSL 解析到 AST 。lexer 和 parser
JVM 相关。(你读过 GC 相关源码吗?)代码规范,包命名规范大学里最有成就感的事读过的 Java 书籍。(四大名著之类)
后端清单全局唯一有序 ID。 snowflake ,timestamp 加前面,然后后面加上机器 id 等冯诺依曼体系
shell 命令的执行过程信息熵程序运行中的栈式结构,栈溢出攻击
TCP/IP 有关知识。TCP 传输层加端口号,IP 网络层加 ip 地址;路由器就主要工作在 IP 网络层同步与阻塞并行与并发
Java 线程的本质,内核线程与用户线程,线程调度,并行级别内核态与用户态,中断
CPU 与内存与磁盘缓存行与伪共享内存分配管理,段页式。jemalloc
Java 程序的运行原理普通可执行程序的运行原理缓存行与伪共享。两个面试官都问,可见十分重要,还好都答出来了从浏览器发出请求开始,到服务端应用接受到请求为止的过程
HashMap ,hash 碰撞,hash 算法的优化单点登录正向代理与反向代理反爬机制,爬虫模拟浏览器行为
cglib 方法拦截动态代理依赖注入
Servlet 的本质
TCP 长连接。心跳包,websocket
Netty 百万级长连接优化
DSL 解析到 AST 。lexer 和 parser
JVM 相关。(你读过 GC 相关源码吗?)代码规范,包命名规范收集箱
4、微服务的高可用怎么保证的?
5、常用的负载均衡,该怎么用,你能说下吗?
6、网关能够为后端服务带来哪些好处?
7、Spring Bean 的生命周期
8、xml 中配置的 init、destroy 方法怎么可以做到调用具体的方法?
9、反射的机制
10、Object 类中的方法
11、hashcode 和 equals 方法常用地方
12、对象比较是否相同
13、hashmap put 方法存放的时候怎么判断是否是重复的
14、Object toString 方法常用的地方,为什么要重写该方法
15、Set 和 List 区别?
16、ArrayList 和 LinkedList 区别
17、如果存取相同的数据,ArrayList 和 LinkedList 谁占用空间更大?
18、Set 存的顺序是有序的吗?
19、常见 Set 的实现有哪些?
20、TreeSet 对存入对数据有什么要求呢?
21、HashSet 的底层实现呢
22、TreeSet 底层源码有看过吗?
23、HashSet 是不是线程安全的?为什么不是线程安全的?
24、Java 中有哪些线程安全的 Map?
25、Concurrenthashmap 是怎么做到线程安全的?
26、HashTable 你了解过吗?
27、如何保证线程安全问题?
28、synchronized、lock
29、volatile 的原子性问题?为什么 i++ 这种不支持原子性?从计算机原理的设计来讲下不能保证原子性的原因
30、happens before 原理
31、cas 操作
32、lock 和 synchronized 的区别?
33、公平锁和非公平锁
34、Java 读写锁
35、读写锁设计主要解决什么问题?
36、你项目除了写 Java 代码,还有前端代码,那你知道前端有哪些框架吗?
37、MySQL 分页查询语句
38、MySQL 事务特性和隔离级别
39、不可重复读会出现在什么场景?
40、sql having 的使用场景
41、前端浏览器地址的一个 http 请求到后端整个流程是怎么样?能够说下吗?
42、http 默认端口,https 默认端口
43、DNS 你知道是干嘛的吗?
44、你们开发用的 ide 是啥?你能说下 idea 的常用几个快捷键吧?
45、代码版本管理你们用的是啥?
# 编程语言
## Java
### 并发编程
- 对于原子操作而言,synchronized, cas, AtomicInterger, LongAdder 哪种方式性能较好,为什么?
- synchronized 是如何保证 JMM 中的原子性、可见性与有序性的?
- 如下单例模式的代码可能存在什么问题?请从内存模型的角度思考。
```java
public class Singleton {
static Singleton instance;
static Singleton getInstance(){
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
```
### JVM
- 有时候在模拟有大量超时情况的 JMeter 压力测试中,前数分钟响应经常会超时,但是后面会突然降到毫秒级别,这可能是因为什么?
## Go
- Goroutine 机制简述,其与 JVM 线程的区别?为什么 Go 的线程调度使用了 G-P-M 模型而不是 G-M 模型?
- Go 中应该如何创建新的对象,make 关键字常用于哪些场景下。
# 编程基础
## Java
关于此部分的详细索引可以参考笔者的[Java 入门与最佳实践](https://github.com/wx-chevalier/WXJavaToolkits)系列文章。
# 数据结构与算法
关于数据结构与算法系列详细的文章列表可以参考笔者的[数据结构与算法系列综述](https://github.com/wx-chevalier/just-coder-handbook/blob/master/DataStructure/README.md#graph%E5%9B%BE)
笔者也是本次校招开始之后短短月余的时间才开始刷题,如果只是为了应付校招多学点套路也能说得过去,但是刷题本身的热趣确实挺有意思。关注笔者的博客或者 Github 的朋友应该知道,笔者过去几年里一直以工程应用于产品开发为重,老实说,很多时候解决真实场景下的问题需要动的脑子不如做几个算法题,可能带来的成就感也见仁见智。以华为为例,还有一种常见的 OJ 题目便是场景题,并不需要多么复杂的算法设计与考虑,而主要考察你对于用户需求的理解与具体编程能力、编程的精细度与代码掌控力的探查。
1.为什么不建议使用订单号作为主键? 2.为什么要在需要排序的字段上加索引?
3.for update 的记录不存在会导致锁住全表?
4.Redo Log 和 Binlog 有什么区别?
5.MySQL 如何回滚一条 sql ?
6.char(50) 和 varchar(50) 效果是一样的么?
一条 SQL 语句执行得很慢的原因有哪些?
# 服务端基础
## 微服务与云原生
- 有状态服务与无状态服务的区别在哪里?如何设计幂等性服务?
## Spring
- 你所在的公司/负责的项目组,是否使用过微服务;如果使用过,那么完整的研发部署流程会包含哪些关键的步骤、组件?
- Spring Boot 默认的 Worker 线程池大小是多少?
- 是否使用过 MyBatis 提供的缓存机制,是否开启过二级缓存,如果开启过,那么缓存返回的对象是否是线程安全的?
- 目前在项目中使用的数据库连接池是什么?如果是 HikariCP,那么其为什么性能相较于其他数据库会比较好?
- Spring 中的定时器,在单线程模型下,假如定时任务是 5 秒执行一次,但是第一个任务就执行了 8 秒,第二个会怎么样呢?
## DevOps
## Test
- 在服务测试中如何模拟百万级并发请求?
## 高可用架构
- 如何设计多租户隔离系统?可以从系统隔离、服务隔离、异地多活等多领域阐述?
- 常见的流量控制、熔断降级的手段有哪些?
- Sentinel 是否会对服务带来额外负载?
- 在发生故障时,我们应该优先恢复局部故障还是全局故障?
# 基础架构
## Linux 与操作系统
## 分布式系统
- 如何理解 CAP 理论?常用的保障 CA/CP/AP 的策略有哪些?如何理解 BASE 理论?
## 分布式计算
### 并发编程
- IO 多路复用属于同步阻塞型 IO 模型还是异步非阻塞 IO 模型?
## 数据库
### MySQL 与关系型数据库
- MySQL 中的主键应该选择怎样的策略去创建?常见的分布式 ID 生成的策略有哪些?为什么不建议使用订单号作为主键?
- 简述 `select city,name,age from person where city(存在索引)='武汉' order by name limit 100;` 的底层执行逻辑?为什么数据库索引中常使用合并排序算法?如果针对 `city-name` 添加了联合索引,那么执行逻辑上会有何区别?为什么要在需要排序的字段上加索引?
- 是否应该尽可能地添加列索引?应该以什么原则选择需要索引的列?像性别这样的列是否应该添加索引?
* InnoDB 事务提交后在底层都干了些什么?如果发生写失效(页 16KB 数据,只写了 8Kb),可以通过重做日志进行恢复,为什么还需要 double_write?
- 简述 `update person set age = 30 where id = 1;` 在数据库引擎中的执行流程。
- MySQL 并发控制策略中的锁机制与 MVCC 分别会被用于哪些场景下?for update 的记录不存在会导致锁住全表?
* 如果某条 SQL 执行较慢,能否分析下其原因?
* Redo Log 和 Binlog 有什么区别?
### 缓存
- 如何保证缓存与数据库的双写一致性?譬如如何保证 MySQL 与 Redis 中地数据一致性?
- 如何设计一个大规模高并发的数据缓存系统?
### 数据库拆分与中间件
- 如何设计一个分布式用户登录系统,能够根据用户 ID 将请求分发到不同的服务器?如果某台服务器出现了故障,应该如何进行重划分?
- 在 MySQL 数据库中,一般单表数据量超过多少后会建议分库分表?为什么会有这样的考量?
- 在分库分表的情况下,一般如何设计跨库的分页查询;如果进行分页查询,应该使用 `limit 100,10 ORDER BY id` 还是 `where id > ? limit 10` 的形式?
## 分布式计算
### 并发编程
- 什么是协程?协程相对于线程的优势是什么?Go 中协程模型是如何实现的?在什么情况下应该优先选择协程?在什么情况下应该优先选择多线程?
### 消息中间件 MOM
- 是否了解过常见的消息中间件?能否简述下不同的业务场景下应该如何去选择合适的消息中间件?
- 常见的消息中间件采取怎样的持久化策略?
- 常见的消息中间件是如何保障其高可用特性的?
## 容器与虚拟化
### Docker
- Docker 中如何配置容器访问主机?可以设置网络为 host 模式,或者设置主机的 DNS 解析规则。
# 典型业务系统
## BPM 流程引擎
## IM
- 如何设计 Feed 流系统,针对十万、千万、十亿等不同的用户体量时其设计有什么差异?
# 链接
- https://mp.weixin.qq.com/s/4Zip0DVMGuJPMUnv_ySGIg
- https://github.com/digoal/blog/blob/master/201806/20180623_01.md
> [Java 进阶面试问题列表](https://zhuanlan.zhihu.com/p/24910702)翻译自[Java developer interview questions: The hard part](https://howtotrainyourjava.com/2016/07/14/java-developer-interview-questions-the-hard-part/),从属于笔者的[Java 入门与工程实践](https://github.com/wx-chevalier/Java-Introduction-And-Engineering-Practices)系列。最近公司打算招几个 Java 开发人员,正巧在 Reddit 上看到了该文,顺手翻译了一波。只是单纯的问题列表,可能较水,慎进。
![](https://coding.net/u/hoteam/p/Cache/git/raw/master/2017/1/2/QQ2017011611fas.png)
# 面向对象编程的基本理念与核心设计思想
- 解释下多态性(polymorphism),封装性(encapsulation),内聚(cohesion)以及耦合(coupling)。
- 继承(Inheritance)与聚合(Aggregation)的区别在哪里。
- 你是如何理解干净的代码(Clean Code)与技术负载(Technical Debt)的。
- 描述下常用的重构技巧。
- 阐述下 [SOLID](http://howtotrainyourjee.com/2014/08/28/rock-solid-code/) 原则。
- 其他的譬如 KISS,DRY,YAGNI 等原则又是什么含义。
- 什么是设计模式(Design Patterns)?你知道哪些设计模式?
- 你有了解过存在哪些反模式(Anti-Patterns)吗?
- 你会如何设计登陆舰/数学表达式计算程序/一条龙?
- 你知道哪些基本的排序算法,它们的计算复杂度如何?在给定数据的情况下你会倾向于使用哪种算法呢?
- 尝试编写如下代码:
    - 计算指定数字的阶乘
- 开发 [Fizz Buzz](http://c2.com/cgi/wiki?FizzBuzzTest)  小游戏
    - 倒转句子中的单词
    - 回文字符串检测
- 枚举给定字符串的所有排列组合
# Java 核心概念
- equals 与 hashCode 的异同点在哪里?Java 的集合中又是如何使用它们的。
- 描述下 Java 中集合(Collections),接口(Interfaces),实现(Implementations)的概念。LinkedList 与 ArrayList 的区别是什么?
- 基础类型(Primitives)与封装类型(Wrappers)的区别在哪里?
- final 与 static 关键字可以用于哪里?它们的作用是什么?
- 阐述下 Java 中的访问描述符(Access Modifiers)。
- 描述下 String,StringBuilder 以及 StringBuffer 区别。
- 接口(Interface)与抽象类(Abstract Class)的区别在哪里。
- 覆盖(Overriding)与重载(OverLoading)的区别在哪里。
- 异常分为哪几种类型?以及所谓的`handle or declare`原则应该如何理解?
- 简述垃圾回收器的工作原理。
- 你是如何处理内存泄露或者栈溢出问题的?
- 如何构建不可变的类结构?关键点在哪里?
- 什么是 JIT 编译?
- Java 8 / Java 7 为我们提供了什么新功能?即将到来的 Java 9 又带来了怎样的新功能?
# Hibernate / 数据库
- 请解释下 ORM。
- 简述下 Hibernate 的优劣特性。
- Hibernate 与 JPA 区别在哪?
- Hibernate 最新版提供了哪些特性?
- 什么是懒加载(Lazy Loading)?
- 什么是 N+1 难题?
- 介绍一些熟悉的 Hibernate 注释。
- 简介下 Hibernate Session 与 SessionFactory。
- Entity Beans 的状态有哪些。
- Hibernate 中的缓存分为几层。
- Hibernate 中事务的支持分为几级?
- 什么是乐观锁(Optimistic Locking)?
- 简述下 ACID 原则。
- 简述下数据库正则化(Normalizations)。
- 请介绍下你日常工作中优化慢查询(Slow Query)的策略。
# Spring
- 新版的 Spring 中有哪些新特性?
- 介绍下 Spring 的优势与缺陷。
- 什么是控制反转(Inversion of Control)与依赖注入(Dependency Injection)?
- 你用过哪些 Spring 的模块?
- Spring 中是如何使用依赖注入的?
- Spring 中提供了几种自动注入的机制?
- 介绍下 Spring MVC。
- Spring 中 Scopes 有哪些?
- Spring 中 Bean 的生命周期包含哪些步骤?
- Spring Bean 与 EJB Bean 的区别在哪里?
# 其他主题
- 介绍下切面编程(Aspect Oriented Programming)。
- 概述下 GET 与 POST 的区别。
- Web Server、Web Container 与 Application Server 的区别是什么?
- 简要介绍下从浏览器输入 URL 开始到获取到请求界面之后 Java Web 应用中发生了什么。
- 什么是 N 层架构?
- 微服务(MicroServices)与巨石型应用(Monolithic Applications)之间的区别在哪里?
- 你知道哪些商业级设计模式?
- 你是如何测试一个应用的?知道哪些测试框架?
- 你是如何测试单个方法的?
- 在你的职业生涯中,算得上最困难的技术挑战是什么?
- 什么是领域驱动开发(Domain Driven Development)?
- 介绍下一些你最爱的 IDE 的常用插件。
- 除了 IDE 之外,你的日常工作中还会用到哪些工具?
- 你使用什么版本管理工具?
- 分支(Branch)与标签(Tag)之间的区别在哪里?
- 你常用的持续集成(Continuous Integration)、静态代码分析(Static Code Analysis)工具有哪些?
# 链接
- https://zhuanlan.zhihu.com/p/70410011
# 计算机科学与技术通识面试题
# 版本控制与团队协作
## Git
- Git Rebase 和 Merge 有什么区别?
# AlgoDS | 数据结构与算法
# Network & OS | 网络与操作系统
# 智力题
## Monty Hall Problem | 三门问题
三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目 Let’s Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的概率?如果严格按照上述的条件,即主持人清楚地知道,哪扇门后是羊,那么答案是会。不换门的话,赢得汽车的概率是 1/3。换门的话,赢得汽车的概率是 2/3。
$$
P(汽车在 A 门|最初选择 A 门,主持人打开 B 门)=\frac{P(最初选择 A 门,主持人打开 B 门|汽车在 A 门)P(汽车在 A 门)}{P(最初选择 A 门,主持人打开 B 门)} \\
P(汽车在 B 门|最初选择 A 门,主持人打开 B 门)=\frac{P(最初选择 A 门,主持人打开 B 门|汽车在 B 门)P(汽车在 B 门)}{P(最初选择 A 门,主持人打开 B 门)} \\
P(汽车在 C 门|最初选择 A 门,主持人打开 B 门)=\frac{P(最初选择 A 门,主持人打开 B 门|汽车在 C 门)P(汽车在 C 门)}{P(最初选择 A 门,主持人打开 B 门)}
$$
各个概率计算如下
$$
P(汽车在 A 门|最初选择 A 门,主持人打开 B 门)=\frac{(1/2)⋅(1/3)}{1/2}=\frac{1}{3} \\
P(汽车在 B 门|最初选择 A 门,主持人打开 B 门)=\frac{0⋅(1/3)}{1/2}=0 \\
P(汽车在 C 门|最初选择 A 门,主持人打开 B 门)=\frac{1⋅(1/3)}{1/2}=\frac{2}{3}
$$
# 数据科学、机器学习、深度学习面试题
1、决策树的实现、ID3、C4.5、CART(贝壳)
2、CART 回归树是怎么实现的?(贝壳)
3、CART 分类树和 ID3 以及 C4.5 有什么区别(贝壳)
4、剪枝有哪几种方式(贝壳)
5、树集成模型有哪几种实现方式?(贝壳)boosting 和 bagging 的区别是什么?(知乎、阿里)
6、随机森林的随机体现在哪些方面(贝壳、阿里)
7、AdaBoost 是如何改变样本权重,GBDT 分类树的基模型是?(贝壳)
8、gbdt,xgboost,lgbm 的区别(百度、滴滴、阿里,头条)
9、bagging 为什么能减小方差?(知乎)
# 大前端与数据可视化面试题
考察你的语法、原理等理解
(1)WebView/Cordova 的缺陷,或者说项目中碰到的瓶颈点有哪些?
体验不如原生,Android 上老版本的 WebView 性能较差;可以考虑打包单独的浏览器,并且将某些关键页面使用 Native 实现。
(2)对于 ES6 的认知,什么是变量提升?
ES6 弥补了传统 JavaScript 的缺陷,比如说变量的作用域、语法层面的赋值、定义等。面试者混淆了变量提升与词法作用域的概念。
(3)JavaScript 常见的异步写法,Promise.finally 的实现?
希望面试者能够已简单的抓取远程用户信息为例,实践几种常见的异步模式。面试者实现了基于 jQuery get 函数的抓取机制,返回了 Promise。面试者回答:Promise 内部包含了三个状态,不同状态间的转换会触发不同的 Callback。
面试者在实现过程中感觉缺乏 ESLint 规范实践,实现了基础原型。
(4)React 的设计理念,其与 jQuery, Vue.js 的区别
面试者回答:React 的核心是用 Virtual DOM 替代原有的 DOM 操作,实现了自己的事件系统,是单向数据流。jQuery 主要还是在操作 DOM,Vue.js 的部分理念来自于 React(X),Vue.js 的数据流默认为双向数据流。对于 React 组件系统、调和算法等认知不多。
(5)React 常见设计模式有哪些,手写 HOC
面试者对常见的 React 设计模式不太熟悉,回答较慢。面试者回答:高阶组件,利用高阶函数帮我们提取公共方法,来创造组件。要求面试者实现简单的处理加载状态的 HOC,面试者还是使用类似于 createClass 这样传统的写法。
(6)Redux 的设计理念,其与 Flux 的区别
面试者表示没了解过 Flux,Redux 是为了解决跨层级的 React 组件间数据传递问题,通过抽取单一的数据中心与触发 Action 来更新。面试者对于函数式编程、纯函数等理解感觉不深。
(7)Redux 常见的异步处理机制,简单的 Thunk 组件实现
通过中间件拦截的方式来处理异步 Action,常见的异步库包括 redux-thunk,redux-sagas。对于 Sagas 的具体使用也不太熟悉,对于中间件的机制和实现基本不了解。
缺陷,面试者使用 CoffeeScript 较多,对于 ES6、fetch 等缺乏理解或者应用,对于 React 的认知也较为停留在表面,缺乏实践,对于 Redux 的认知与实践也不多。
## React
- 生命周期
- setState
- did
- HOC 手写
- 受控和非受控 手写
- 新特性
- Context
- 父子组件通信
## Redux
- middleware
- redux-thunk
## webpack
- 开源,动机,贡献者
- 换肤
- chunk
# 面试记录
## js
- slice & splice
## es6
- Symbol
- Promise
```
new Promise(() => console.log(1));
new Promise(() => console.log(2));
new Promise(() => console.log(3));
```
- geneartor, iterator, iteratable
- const let
- class
## eslint
- 配置
- 忽略哪些
## webpack
- amd, cmd, commonjs
- webpack chunk
- webpack1 -> webpack2
## css
- display none; visibility; opacity
## less
- mixin
- 局部变量
# jQuery
- 事件委托
- 父子包含关系
## React
- 生命周期
- setState
- did
- HOC
- 受控和非受控
## 瞎扯
- lodash
- async await
- koa
- antd
# JavaScript
## 数据结构
### 字符串
💡 驼峰与下划线命名之间的转换 💡
```js
/** 将大写转化为下划线 */
export const convertToUnderscore = key => {
key.replace(/[A-Z]/g, str => `_${str.toLowerCase()}`);
};
/** 将下划线转化为驼峰 */
export const convertToCamelCase = key => {
key.replace(/_./g, str => str[1].toUpperCase());
};
```
> 📖 参考资料
>
> - [aa](aa)
### 数组操作与变换
map/reduce/filter 都是开发中常用的函数。
- 使用 reduce 进行数组扁平化
```js
```
# JavaScript
## 代码阅读
[fbjs](https://github.com/facebook/fbjs)
# DOM
# CSS
# React
# Vue
# 工程化
## 构建工具
## 性能优化
# 团队协作
![](https://i.postimg.cc/LXfPysx5/image.png)
# Awesome Interviews
古语有云,知行合一,学以致用。Awesome Interviews 系列不仅仅是为了应对面试,也是对整个 ITCS 体系融会贯通的程度的检验。
要想短时间内通过一两个问题,就看出一个人在某个专业的水平,有一个基本方法,叫“网状问题点状问,点状问题网状问”。什么意思呢?就是,如果是一个复杂的网状问题,你就考他是不是能够三言两语跟外行说清楚。如果是一个简单的问题呢?你就看他能不能把它还原成一个知识网络。他说,用这个工具来衡量一个人的专业知识,问两个问题就够了,非常准。
# Nav | 导航
[某熊的技术之路指北 ☯ ](https://github.com/wx-chevalier/Developer-Zero-To-Mastery)就是对笔者不同领域方面沉淀下的知识仓库的导航与索引,便于读者快速地寻找到自己需要的内容。路漫漫其修远兮,吾正上下而求索,也希望能给所有遇见过笔者痕迹的同学些许帮助,在浩瀚银河间能顺利达到一个又一个彼岸。Just Coder,Travel in Galaxy,欢迎关注[某熊的技术之路](https://i.postimg.cc/mDxdH0VL/image.png)公众号,让我们一起前行。
您可以通过以下任一方式阅读笔者的系列文章,涵盖了技术资料归纳、编程语言与理论、Web 与大前端、服务端开发与基础架构、云计算与大数据、数据科学与人工智能、产品设计等多个领域:
- 在 Gitbook 中在线浏览,每个系列对应各自的 Gitbook 仓库。
| [Awesome Lists](https://ngte-al.gitbook.io/i/) | [Awesome CheatSheets](https://ngte-ac.gitbook.io/i/) | [Awesome Interviews](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/Interview) | [Awesome RoadMaps](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/RoadMap) | [Awesome MindMaps](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/MindMap) | [Awesome-CS-Books-Warehouse](https://github.com/wx-chevalier/Awesome-CS-Books-Warehouse) |
| ---------------------------------------------- | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| [编程语言理论](https://ngte-pl.gitbook.io/i/) | [Java 实战](https://ngte-pl.gitbook.io/i/go/go) | [JavaScript 实战](https://ngte-pl.gitbook.io/i/javascript/javascript) | [Go 实战](https://ngte-pl.gitbook.io/i/go/go) | [Python 实战](https://ngte-pl.gitbook.io/i/python/python) | [Rust 实战](https://ngte-pl.gitbook.io/i/rust/rust) |
| --------------------------------------------- | ----------------------------------------------- | --------------------------------------------------------------------- | --------------------------------------------- | --------------------------------------------------------- | --------------------------------------------------- |
| [软件工程、数据结构与算法、设计模式、软件架构](https://ngte-se.gitbook.io/i/) | [现代 Web 开发基础与工程实践](https://ngte-web.gitbook.io/i/) | [大前端混合开发与数据可视化](https://ngte-fe.gitbook.io/i/) | [服务端开发实践与工程架构](https://ngte-be.gitbook.io/i/) | [分布式基础架构](https://ngte-infras.gitbook.io/i/) | [数据科学,人工智能与深度学习](https://ngte-aidl.gitbook.io/i/) | [产品设计与用户体验](https://ngte-pd.gitbook.io/i/) |
| ----------------------------------------------------------------------------- | ------------------------------------------------------------- | ----------------------------------------------------------- | --------------------------------------------------------- | --------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------- |
- 前往 [xCompass](https://wx-chevalier.github.io/home/#/search) 交互式地检索、查找需要的文章/链接/书籍/课程,或者关注微信公众号:某熊的技术之路。
迁移到了 [Awesome-Interviews](https://github.com/wx-chevalier/Awesome-Interviews)
# Web Interview | Web 面试题集锦
[Web Interview]()[Awesome Interviews]() 系列的组成,涵盖了笔者在日常积累中总结而来的可成为面试题的知识要点与场景案例。
本文所提及的问题皆可在下列文档矩阵中寻找到解答,请自行索引。
# 语法基础
## JavaScript & TypeScript
- V8 引擎中的对象与数组是如何存储的?为何 JS 的数组每个数据类型都可以不一样?为何 JS 的数组无需提前设置长度,是可变数组?为何数组可以像 Object 一样挂载任意属性?如果浏览器需要进行大规模数组运算,应该选择怎样的存储结构?
- Event Loop 的基础概念是否了解?浏览器中的 Event Loop 与 Node.js 中的 Event Loop 有何区别?
- 如何在 TypeScript 中设计简单的 IoC & DI 框架?如何实现简单的接口注解以自动生成类 Swagger 文档?
## DOM
## CSS
# 工程实践
## 客户端可用性
- 如何设计一个客户端错误上报系统?应该如何捕获常见的浏览器错误?
- 如果设计一个客户端实时录屏系统,可能的技术挑战点会在哪里?应该如何去设计前后端架构?
## 架构优化
- 简单概述浏览器工作原理,即从用户输入某个 URL 开始到渲染,经历了哪些主要的步骤?浏览器的核心组件包含哪些?
- 如何设计一个 JavaScript 应用沙箱?
# Framework | 框架
## React & React Native
- 为何在 JSX 或者 TSX 的文件首部需要引入 React?
- 在 Antd 中如何实现主题切换的特性,如何在单个项目中打包多个不同版本的 Antd?
- Hooks 函数式组件与类组件相比各有何优劣?
- 猜想一下,React DevTools 是如何监听 React 的状态变化?
## Vue
- v-if 指令是如何实现的?
## Redux & MobX
- 为什么 Redux 的 Store 会使用不可变数据类型?
- Redux 中的 Reducer 为何要设置为纯函数?常见的 Side Effects 应当在哪个模块中处理?
- Redux 的中间件是如何实现的?如何在 Redux 中实现简单的 Promise 中间件?
- Redux Sagas 为何要使用 Generator?put, get 等函数的原理是什么?其是如何处理 Effects 的?
- MobX 是如何实现响应式监听的?MobX 与 Redux 相比其适用场景、工程案例上有何差异?
# 编程语言
编程语言的学习是我们进入软件世界的基础阶梯,著名的 [Code Complete](https://parg.co/b8o)  一书中提到:Program into Your Language, Not in it. 我们不应该将自己的编程思维局限于掌握的语言提供的那些特性或者概念,而是能够理解这些语法特性背后能提供的抽象功能与原理,从而能够根据自己想要达到的目标选择最合适的编程语言。而从另一个角度来看,无论哪一门编程语言的学习也是具有极大的共性,从严谨而又被诟病过度冗余的 Java 到需要用游标卡尺的 Python,从挣扎着一路向前的 JavaScript 到含着金汤匙出生的 Swift、Rust,我们都能够发现其中的相通与互相借鉴之处。
## 语法基础
任何一门编程语言的学习都需要从基本的表达式(Expression)语法开始学习,我们需要了解如何去声明与使用变量、如何为这些变量赋值、如何使用运算符进行简单的变量操作等等。在很多语言之中都有所谓的传值还是传引用的思量,譬如 Java 与 JavaScript 本质上就是 Pass-by-Value 的语言,只不过会将复杂对象的引用值传递给目标变量。这个特性又引发了所谓浅复制与深复制、如何进行复合类型深拷贝等等需要注意的技术点。除此之外,作用域与闭包也是很多语言学习中重点讨论的内容,在 JavaScript 与 Python 的学习中我们就会经常讨论如何利用闭包来保存外部变量,或者在循环中避免闭包带来的意外变量值。表达式是一门编程语言语法基础的重要组成部分,接下来我们就需要去学习流程控制与异常处理、函数定义与调用、类与对象、输入输出流、模块等内容。流程控制的典型代表就是分支选择与循环,譬如不同的语言都为我们提供了基础 for 循环或者更方便地 for-in 循环,而在 JavaScript 中我们还可以使用 forEach 与 for-of 循环,Java 8 之后我们也可以基于 Stream API 中的 forEach 编写声明式地循环执行体,而 Python 中的列表推导也可以看做便捷的循环实现方式。异常处理也是各个编程语言的重要组成部分,合理的异常处理有助于增强应用的鲁棒性;不过很多时候会出现滥用异常的情况,我们只是一层一层地抛出而并未真正地去处理或者利用这些异常。Java 中将异常分为了受控异常与不受控异常这两类,虽然 JavaScript 等语言中并未在数据类型中有所区分,但是却可以引入这种分类方式来进行不同的异常处理;有时候 Let it Crash 也是不错的设计模式。
Eric Elliott 曾在博文中提及,软件开发实际就是 Function Composition 与 DataStructure Design;函数或者方法是软件系统的重要基石与组成。我们需要了解如何去定义函数,包括匿名函数以及 Lambda 表达式等;尽管 Java 中的 Lambda 表达式是对于 FunctionalInterface 的实现,但是鉴于其表现形式我们也可以将其划归到函数这个知识类别中。接下来我们需要了解如何定义与传入函数参数,在 C 这样的语言中我们会去关心指针传递的不同姿势;而在 JavaScript 中我们常常会关心如何设置默认参数,无论是使用对象解构还是可选参数,都各有利弊。Objective-C 与 Swift 中提供的外部参数就是不错的函数自描述,Java 或 Python 中提供的不定参数也能够帮我们更灵活地定义参数,在 JavaScript 中我们则可以通过扩展操作符实现类似的效果。然后我们就需要去考虑如何调用函数,最典型就是就是 JavaScript 中函数调用的四种方式,我们还需要去关心调用时函数内部的 this 指针指向。而装饰器或者注解能帮我们更好地组织代码,以类似于高阶函数的方式如洋葱圈般一层一层地剥离与抽象业务逻辑。最后在函数这部分我们还需要关心下迭代器与生成器,它们是不错的异步实现模式或者流数据构建工具。
近几年随着前端富客户端应用的迅猛发展与服务端并发编程的深入应用,函数式编程以及 Haskell 这样的函数式编程语言也是引领风骚。尽管面向对象编程也有着很多其他被人诟病的地方,但是在大型复杂业务逻辑的应用开发中我们还是会倾向使用面向对象编程的范式;这就要求我们对于类与对象的基本语法有所掌握。我们首先要去了解如何定义类,定义类的属性、方法以及使用访问修饰符等方式进行访问控制。其次我们需要了解如何从类中实例化出对象,如何在具体的语言中实践单例模式等。然后我们就需要去了解面向对象的继承与多态的特性,应该如何实现类继承,子类与父类在静态属性、静态方法、类属性、构造函数上的调用顺序是怎样的;以及如何利用纯虚函数、抽象类、接口、协议这些不同的关键字在具体语言中实现多态与约定。最后我们还需要去关注下语言是否支持内部类,譬如 Java 就分为了静态内部类、成员内部类、局部内部类与匿名内部类这四种不同的分类。在整个语法基础部分的最后,我们还需要去了解下输入输出流与模块化相关的知识,譬如 Java 9 中即将推出 JPMS 模块化系统,而 JavaScript 的模块化标准则历经了 CommonJS、AMD、UMD、ES6 Modules 等多轮变迁。
## 数据结构与功能
语法基础是我们掌握某门编程语言的敲门砖,而学习内建的数据结构与功能语法则是能够用该语言进行实际应用开发的重要前提。在数据结构的学习中我们首先要对该语言内建的数据类型有所概览,我们要了解如何进行常见的类型与值判断以及类型间转换;譬如如何进行引用与值的等价性判断、如何进行动态类型检查、如何对复合对象的常用属性进行判断等等。很多编程语言中会将数据类型划分为原始类型(Primitive)与复合类型(Composite),不过这里为了保证通用性还是将学习复杂度较低的数据类型划归到基本类型中。常见的基本类型囊括了数值类型、空类型、布尔类型、可选类型(Optional)以及枚举类型(Enum)等等。学习数值类型的时候我们还需要了解如何进行随机数生成、如何进行常见的科学计算,这也是基础的数值理论算法的重要组成。JavaScript 中提供了 undefined 与 null 两个关键字,二者都可以认为是空类型不过又有所区别;而可选类型则能够帮我们更好地处理可能为空地对象,避免很多的运行时错误。接下来我们就要将目光投注于字符串类型上,我们需要了解如何创建、删除、复制、替换某个字符串或者其他内容;很多语言也提供了模板字符串或者格式化字符串的方式来创建新字符串。我们还需要知道如何对字符串进行索引遍历,如何对字符串进行常见的类型编码以及如何实践模式匹配。模式匹配中最直接的方式就是使用正则表达式,这也是我们应用开发中经常会使用到的技术点。除此之外我们还需要关注字符串校验、以及如何进行高效模糊搜索等等内容;我们也可以学习使用 KMP、Sunday 等常见的模式匹配算法来处理搜索问题。
然后我们需要学习常见的时间与日期处理方式,了解如何时间戳、时区、RFC2822、ISO8601 这些基础的时间与日期相关的概念,了解如何从时间戳或者时间字符串中解析出当前编程语言支持的时间与日期对象。我们还需要了解时区转换、时间比较以及如何格式化地展示时间等内容,有时候我们还需要利用日历等对象进行事件的增减以及偏移计算。接下来就是非常重要的集合类型,无论哪种编程语言都会提供类似于 Array、List、Set、Dictionary、Map 等相关的数据结构实现,而我们也就需要去了解这些常见集合类型中的增删复替以及索引遍历这些基础操作以及每个集合的特点;譬如对于序列类型我们要能熟练使用 map、reduce、filter、sort 这些常见的变换进行序列变换与生成。进阶而言的话我们可以多了解下这些数据结构的底层算法实现,譬如 Java 8 中对于 HashMap 的链表/红黑树实现,或者 V8 中是如何利用 Hidden Class 进行快速索引的。接下来的话我们可以对于像 Java 中 SteamAPI 或者各种语言的 Immutable 对象的实现方式有所了解,还有就是常见的 JSON、XML、CSV 这些类型的序列化与反序列化操作库也是实际开发中经常用到的。
接下来我们就需要对语言提供的常用外部功能相关的 API 或者语法有所掌握,主要也是分为存储、网络与系统进程这三个部分。在存储部分我们需要掌握如何与 MySQL、Redis、Mongodb 等关系型或者非关系型数据库进行数据交互,掌握如何对文件系统进行如文件寻址、文件监控等操作,并且还需要能够使用一些譬如 Java 堆外存储这样的应用内缓存来存放数据。而网络部分我们应该掌握如何利用 HTTP 客户端进行网络交互、如何使用相对底层的 Socket 套接字建立 TCP 连接、或者使用语言内置的一些远程调用框架与远端服务进行交互。最后我们需要对如何利用语言进行系统进程操作有所了解,本部分笔者认为最重要的当属并发编程相关知识。在而今服务器性能不断提升、处理的数据量越来越多的情况下,我们不可避免地需要使用并发操作来提高应用吞吐量。并发编程领域我们应该去学习如何使用线程、线程池或者协程来实现并发,如何利用锁、事务等方式进行并发控制并保持数据一致性,如何使用回调、Promise、Generator、Async/Await 等异步编程模式。除此之外,我们还需要对切面编程、系统调用以及本地跨语言调用有所了解。
## 工程实践与进阶
编程语言初学阶段的最后我们需要了解下工程实践以及一些偏原理与底层实现的进阶内容。首先开发者应当对具体编程语言中如何实现 S.O.L.I.D 编程原则与数十种设计模式有所了解,当然也不能邯郸学步只求形似,而是能够根据业务功能需求灵活地选择适用的范式。而在团队开发中我们往往还需要统一团队内的样式指南,包括代码风格约定中常见的命名约定、文档与注释约定、项目与模块的目录架构以及语法检查规范等。接下来我们还需要对语言或者常用开发工具的调试方式有所了解,掌握基本的单步调试等技巧,并且能够为代码编写合适的单元测试用例。工程实践方面的最后则是要求我们对代码性能优化所有了解,尽量避免反模式。进阶内容的话则相对更加地抽象或者需要花费更多的精力去学习,其中包括泛型编程、元编程、函数式编程、响应式编程、内存管理、数据结构与算法等几个部分。泛型编程与元编程中的反射、代码生成、依赖注入等还是属于语言本身提供的语法特性之一,而函数式编程与响应式编程则偏向于实际应用开发中有所偏爱的开发范式。即使 Java 这样纯粹的面向对象的语言,当我们借鉴纯函数、不可变对象、高阶函数、Monad 等函数式编程中常见的名词时,也能为代码优化开辟新的思路。响应式编程是非常不错的异步编程范式,这里我们还需要注意下并发编程与异步编程之间的差异。而内存管理则有助于我们理解编程语言运行地底层机制,譬如对于 JVM 或者 V8 的内存结构、内存分配、垃圾回收机制有所了解的话能够反过来有助于我们编写高性能地应用程序,并且对于线上应用错误的调试也能更加得心应手。)
![](https://i.postimg.cc/MGHbYqkf/image.png)
# Awesome MindMaps
# Awesome ITCS MindMaps
[Awesome ITCS MindMaps](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/MindMap) 是笔者所有系列文章、代码、项目中的知识系统的脑图形式的总结:
- 知识脉络
![知识脉络](https://i.postimg.cc/fL2rzBx1/image.png)
- 知识要点
![知识要点](https://i.postimg.cc/prm1pzCr/image.png)
# Nav | 导航
[某熊的技术之路指北 ☯ ](https://github.com/wx-chevalier/Developer-Zero-To-Mastery)就是对笔者不同领域方面沉淀下的知识仓库的导航与索引,便于读者快速地寻找到自己需要的内容。路漫漫其修远兮,吾正上下而求索,也希望能给所有遇见过笔者痕迹的同学些许帮助,在浩瀚银河间能顺利达到一个又一个彼岸。Just Coder,Travel in Galaxy,欢迎关注[某熊的技术之路](https://i.postimg.cc/mDxdH0VL/image.png)公众号,让我们一起前行。
您可以通过以下任一方式阅读笔者的系列文章,涵盖了技术资料归纳、编程语言与理论、Web 与大前端、服务端开发与基础架构、云计算与大数据、数据科学与人工智能、产品设计等多个领域:
- 在 Gitbook 中在线浏览,每个系列对应各自的 Gitbook 仓库。
| [Awesome Lists](https://ngte-al.gitbook.io/i/) | [Awesome CheatSheets](https://ngte-ac.gitbook.io/i/) | [Awesome Interviews](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/Interview) | [Awesome RoadMaps](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/RoadMap) | [Awesome MindMaps](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/MindMap) | [Awesome-CS-Books-Warehouse](https://github.com/wx-chevalier/Awesome-CS-Books-Warehouse) |
| ---------------------------------------------- | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| [编程语言理论](https://ngte-pl.gitbook.io/i/) | [Java 实战](https://ngte-pl.gitbook.io/i/go/go) | [JavaScript 实战](https://ngte-pl.gitbook.io/i/javascript/javascript) | [Go 实战](https://ngte-pl.gitbook.io/i/go/go) | [Python 实战](https://ngte-pl.gitbook.io/i/python/python) | [Rust 实战](https://ngte-pl.gitbook.io/i/rust/rust) |
| --------------------------------------------- | ----------------------------------------------- | --------------------------------------------------------------------- | --------------------------------------------- | --------------------------------------------------------- | --------------------------------------------------- |
| [软件工程、数据结构与算法、设计模式、软件架构](https://ngte-se.gitbook.io/i/) | [现代 Web 开发基础与工程实践](https://ngte-web.gitbook.io/i/) | [大前端混合开发与数据可视化](https://ngte-fe.gitbook.io/i/) | [服务端开发实践与工程架构](https://ngte-be.gitbook.io/i/) | [分布式基础架构](https://ngte-infras.gitbook.io/i/) | [数据科学,人工智能与深度学习](https://ngte-aidl.gitbook.io/i/) | [产品设计与用户体验](https://ngte-pd.gitbook.io/i/) |
| ----------------------------------------------------------------------------- | ------------------------------------------------------------- | ----------------------------------------------------------- | --------------------------------------------------------- | --------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------- |
- 前往 [xCompass](https://wx-chevalier.github.io/home/#/search) 交互式地检索、查找需要的文章/链接/书籍/课程,或者关注微信公众号:某熊的技术之路。
迁移到了 [Awesome-MindMaps](https://github.com/wx-chevalier/Awesome-MindMaps)
......@@ -370,7 +370,7 @@ this.onChange({
- 在 Gitbook 中在线浏览,每个系列对应各自的 Gitbook 仓库。
| [Awesome Lists](https://ngte-al.gitbook.io/i/) | [Awesome CheatSheets](https://ngte-ac.gitbook.io/i/) | [Awesome Interviews](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/Interview) | [Awesome RoadMaps](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/RoadMap) | [Awesome MindMaps](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/MindMap) | [Awesome-CS-Books-Warehouse](https://github.com/wx-chevalier/Awesome-CS-Books-Warehouse) |
| [Awesome Lists](https://ngte-al.gitbook.io/i/) | [Awesome CheatSheets](https://ngte-ac.gitbook.io/i/) | [Awesome Interviews](https://github.com/wx-chevalier/Awesome-Interviews) | [Awesome RoadMaps](https://github.com/wx-chevalier/Awesome-RoadMaps) | [Awesome MindMaps](https://github.com/wx-chevalier/Awesome-MindMaps) | [Awesome-CS-Books-Warehouse](https://github.com/wx-chevalier/Awesome-CS-Books-Warehouse) |
| ---------------------------------------------- | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
......
......@@ -240,7 +240,7 @@ export const defaultPuppeteerPoolConfig = {
- 在 Gitbook 中在线浏览,每个系列对应各自的 Gitbook 仓库。
| [Awesome Lists](https://ngte-al.gitbook.io/i/) | [Awesome CheatSheets](https://ngte-ac.gitbook.io/i/) | [Awesome Interviews](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/Interview) | [Awesome RoadMaps](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/RoadMap) | [Awesome MindMaps](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/MindMap) | [Awesome-CS-Books-Warehouse](https://github.com/wx-chevalier/Awesome-CS-Books-Warehouse) |
| [Awesome Lists](https://ngte-al.gitbook.io/i/) | [Awesome CheatSheets](https://ngte-ac.gitbook.io/i/) | [Awesome Interviews](https://github.com/wx-chevalier/Awesome-Interviews) | [Awesome RoadMaps](https://github.com/wx-chevalier/Awesome-RoadMaps) | [Awesome MindMaps](https://github.com/wx-chevalier/Awesome-MindMaps) | [Awesome-CS-Books-Warehouse](https://github.com/wx-chevalier/Awesome-CS-Books-Warehouse) |
| ---------------------------------------------- | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
......
......@@ -217,7 +217,7 @@ export interface SpiderOption {
- 在 Gitbook 中在线浏览,每个系列对应各自的 Gitbook 仓库。
| [Awesome Lists](https://ngte-al.gitbook.io/i/) | [Awesome CheatSheets](https://ngte-ac.gitbook.io/i/) | [Awesome Interviews](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/Interview) | [Awesome RoadMaps](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/RoadMap) | [Awesome MindMaps](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/MindMap) | [Awesome-CS-Books-Warehouse](https://github.com/wx-chevalier/Awesome-CS-Books-Warehouse) |
| [Awesome Lists](https://ngte-al.gitbook.io/i/) | [Awesome CheatSheets](https://ngte-ac.gitbook.io/i/) | [Awesome Interviews](https://github.com/wx-chevalier/Awesome-Interviews) | [Awesome RoadMaps](https://github.com/wx-chevalier/Awesome-RoadMaps) | [Awesome MindMaps](https://github.com/wx-chevalier/Awesome-MindMaps) | [Awesome-CS-Books-Warehouse](https://github.com/wx-chevalier/Awesome-CS-Books-Warehouse) |
| ---------------------------------------------- | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
......
......@@ -6,7 +6,7 @@
在这个知识大爆发的时代,笔者所见许多人面临的问题不再是知识的匮乏,也不是缺乏学习的动力、毅力或激情,而是在浩汤洪流之中迷失了方向,也无足够的承载知识的容器,终致学的越多,忘的越多,竹篮打水一场空。[某熊的技术之路](https://github.com/wx-chevalier)系列文章/书籍/视频/代码即是笔者为自己构建的**知识围栏**,也是笔者蹒跚行进于这条路上的点滴印记,包含了笔者作为程序员的技术视野、知识管理与职业规划,致力于提升开发者的学习效率与实际研发效能。
目前笔者已有数十仓库千篇文章百万字,你可以在[某熊的技术之路指北 ☯](https://github.com/wx-chevalier/Developer-Zero-To-Mastery)查阅详细的导航。可以前往 [Awesome Lists](https://ngte-al.gitbook.io/i/) 或者 [Awesome-CS-Books-Warehouse](https://github.com/wx-chevalier/Awesome-CS-Books-Warehouse) 查阅分门别类的资料与书籍,抑或前往 [Awesome MindMaps](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/MindMap) 查阅完整的知识体系、脉络与要点的脑图,或者 [Awesome RoadMaps](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/RoadMap) 了解不同技术领域的进阶指南。最后,你还可以前往 [Awesome Interviews](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/Interview) 做最后面试前的准备,或者用常见的技术面试题去检验自己学习的结果。
目前笔者已有数十仓库千篇文章百万字,你可以在[某熊的技术之路指北 ☯](https://github.com/wx-chevalier/Developer-Zero-To-Mastery)查阅详细的导航。可以前往 [Awesome Lists](https://ngte-al.gitbook.io/i/) 或者 [Awesome-CS-Books-Warehouse](https://github.com/wx-chevalier/Awesome-CS-Books-Warehouse) 查阅分门别类的资料与书籍,抑或前往 [Awesome MindMaps](https://github.com/wx-chevalier/Awesome-MindMaps) 查阅完整的知识体系、脉络与要点的脑图,或者 [Awesome RoadMaps](https://github.com/wx-chevalier/Awesome-RoadMaps) 了解不同技术领域的进阶指南。最后,你还可以前往 [Awesome Interviews](https://github.com/wx-chevalier/Awesome-Interviews) 做最后面试前的准备,或者用常见的技术面试题去检验自己学习的结果。
# Nav | 导航
......@@ -16,8 +16,8 @@
- 在 Gitbook 中在线浏览,每个系列对应各自的 Gitbook 仓库。
| [Awesome Lists](https://ngte-al.gitbook.io/i/) | [Awesome CheatSheets](https://ngte-ac.gitbook.io/i/) | [Awesome Interviews](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/Interview) | [Awesome RoadMaps](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/RoadMap) | [Awesome MindMaps](https://github.com/wx-chevalier/Developer-Zero-To-Mastery/tree/master/MindMap) | [Awesome-CS-Books-Warehouse](https://github.com/wx-chevalier/Awesome-CS-Books-Warehouse) |
| ---------------------------------------------- | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| [Awesome Lists](https://ngte-al.gitbook.io/i/) | [Awesome CheatSheets](https://ngte-ac.gitbook.io/i/) | [Awesome Interviews](https://github.com/wx-chevalier/Awesome-Interviews) | [Awesome RoadMaps](https://github.com/wx-chevalier/Awesome-RoadMaps) | [Awesome MindMaps](https://github.com/wx-chevalier/Awesome-MindMaps) | [Awesome-CS-Books-Warehouse](https://github.com/wx-chevalier/Awesome-CS-Books-Warehouse) |
| ---------------------------------------------- | ---------------------------------------------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| [编程语言理论](https://ngte-pl.gitbook.io/i/) | [Java 实战](https://ngte-pl.gitbook.io/i/go/go) | [JavaScript 实战](https://ngte-pl.gitbook.io/i/javascript/javascript) | [Go 实战](https://ngte-pl.gitbook.io/i/go/go) | [Python 实战](https://ngte-pl.gitbook.io/i/python/python) | [Rust 实战](https://ngte-pl.gitbook.io/i/rust/rust) |
......
# 数据科学与机器学习进阶指南
# 统计学基础
- 相关性分析(相关系数 r、皮尔逊相关系数、余弦相似度、互信息)
- 回归分析(线性回归、L1/L2 正则、PCA/LDA 降维)
- 聚类分析(K-Means)
- 分布(正态分布、t 分布、密度函数)
- 指标(协方差、ROC 曲线、AUC、变异系数、F1-Score)
- 显著性检验(t 检验、z 检验、卡方检验)
- A/B 测试
# 机器学习
关联规则(Apriori、FP-Growth)
回归(Linear Regression、Logistics Regression)
决策树(ID3、C4.5、CART、GBDT、RandomForest)SVM(各种核函数)
推荐(User-CF、Item-CF)
推荐阅读:《集体智慧编程》、Andrew Ng — Machine Learning Coursera from Stanford
## 特征工程
可用性评估:获取难度、覆盖率、准确率
特征清洗:清洗异常样本采样:数据不均衡、样本权重单个特征:无量纲化(标准化、归一化)、二值化、离散化、缺失值(均值)、哑编码(一个定性特征扩展为 N 个定量特征)数据变换:log、指数、Box-Cox 降维:主成分分析 PCA、线性判别分析 LDA、SVD 分解特征选择:Filter(相关系数、卡方检验)、Wrapper(AUC、设计评价函数 A\*、Embedded(L1-Lasso、L2-Ridge、决策树、DL)衍生变量:组合特征特征监控:监控重要特征,fa 特征质量下降我放一张公司内部算法培训关于特征工程的 PPT,仅供学习参考:
![img](https://pic4.zhimg.com/v2-0c488d35e35e491b354e293aec574277_b.png)
再往后你就可以在技能树上点几个酷炫的了:
提升 Adaboost 加法模型 xgboostSVM
软间隔损失函数核函数 SMO 算法 libSVM 聚类
K-Means 并查集 K-Medoids 聚谱类 SCEM 算法
Jensen 不等式混合高斯分布 pLSA 主题模型
共轭先验分布贝叶斯停止词和高频词 TF-IDF 词向量
word2vecn-gramHMM
前向/后向算法 Baum-WelchViterbi 中文分词数据计算平台
SparkCaffeTensorFlow 推荐阅读:周志华——《机器学习》
可以看到,不管你是用 TensorFlow 还是用 Caffe 还是用 MXNET 等等一系列平台来做高大上的 Deep Learning,在我看来都是次要的。想要在这个行业长久地活下去,内功的修炼要比外功重要得多,不然会活得很累,也很难获得一个优秀的晋升空间。
最后,关注你所在行业的最新 paper,对最近的算法理论体系发展有一个大致印象,譬如计算广告领域的几大经典问题:
![img](https://pic4.zhimg.com/v2-1c3851d3910d380f2e26d9030f101317_b.png)
此差异已折叠。
# 2019-Web 开发入门与进阶路线图
Web 开发入门与进阶路线图是 [Awesome RoadMaps]() 的一部分,其由 Web 技术图谱/思维脑图、技术变迁纵览、常见的 Web 相关面试题三部分组成,希望能够对于不同水准的读者都能有所裨益。
值得注意的是,本文只是抛出了很多关键的技术点,或者问题,如果想寻找答案,可以前往 [Awesome Lists]() 去检索相关的参考资料,也可以直接浏览 [Web ]() 等系列文章,从中总结归纳。
# 思维脑图
# 变迁纵览
# 面试题
此差异已折叠。
![awesome coder](https://user-images.githubusercontent.com/5803001/43364904-59f5bda6-9356-11e8-9ab3-ae073d08bb9e.png)
# 工程师的成长之路
# 初窥门径
# 登堂入室
# 融会贯通
# 出神入化
# 知行合一
# 技术人员的几重门
## 研发工程师
## 高级程序员
如果你是一个刚刚创业的公司,公司没有专职产品经理和项目经理,你就是公司的产品经理,你如果对你现在的开发员能力不满,那么你只需要的是一个高级程序员。
你定义功能、你做计划推进和管理,他可以带 1-2 个副手把你规划的功能实现了,他是主力干活者,有技术难题也是他来亲自攻克解决。
所以,一个高级程序员,他的职责很清晰:
1、负责核心复杂功能的实现方案设计、编码实现
2、负责疑难 BUG 分析诊断、攻关解决
## 团队协调者
公司再长大些。如果你就有一个研发团队(含产品/开发/测试),你就一套主产品,而且你的研发团队小于 15 人,那么你需要的就是一个研发 Leader。
因为你已经有了 1-2 个高级程序员,核心难题攻克和核心功能研发进度与质量保证,已经可以靠他们自身能力解决掉了。那么你需要研发 Leader 干什么。
研发 Leader 的职责是:
1、团队任务管理:开发工作量评估、开发任务分配
2、团队生产质量提升:代码审核、开发风险识别/报告/协调解决
3、团队生产力提升:代码模板研发与推广、最佳实践规范总结与推广、自动化研发生产工具研发与推广
4、团队专业力提升:招聘面试、新人指导、领导复盘总结改进
## 技术总监
如果你的研发团队超过 20 人了,而且有多套主打产品线了,你可能已经有了多个研发 Leader 了,那么你需要一个技术总监。
技术总监的职责:
1、组建平台研发部,搭建公共技术平台,方便上面各条产品线开发。
2、通过技术平台、通过高一层的职权,管理和协调各个产品线组。现在每个产品线都应该有合格的研发 Leader 和高级程序员了。
## 核心架构师
因为你已经有了技术总监了,所以技术平台不错了。技术平台和各条产品线的协调互动,也是技术总监管着。
因为你已经有了各个产品线的高级程序员,他们在靠个人能力维持着核心功能模块的开发进度和代码质量。
因为你已经有了研发 Leader,所以代码模板研发与推广、最佳实践规范总结与推广,这些事都已经在日常按份内职责开展了。
那么,啥时候需要首席架构师啊。
也就是说,需要分离管理族和专业族了。你会发现,这个阶段你的研发团队已经超过 100 来人了,需要有人专注来做架构规划、设计、日常维护。不能让研发总监和研发 Leader 又做管理又做技术一股脑都扔给他们,你就等着总结果产出。这是不对的。
需要从技术总监和研发 Leader 身上剥离职责了。让技术总监和研发 Leader 偏项目管理(管理族),把各个模块之间的架构设计工作,独立出一个岗位,就是架构师,来负责。
每个产品线都有架构师,在技术平台部门也有技术平台的架构师。那么,技术平台和业务产品线的架构互动,就是首席架构师在衔接了。让技术平台架构能够和产品业务系统的架构互相促进和支撑,就是首席架构师的份内之事。
架构师的职责是:
1、架构分析:从功能性需求中识别出需要增加的非功能性需求,好满足性能、可扩展、解耦/集成、安全、可运维、高可用、易部署、易更新。并且识别完非功能型需求,还要做技术选型、技术架构风险识别、技术实现工作量评估
2、架构设计与实现:非功能性模块的架构设计、接口设计、代码实现。所以需要的是有代码实现能力还要有架构思维的工程师,不需要画 PPT 的工程师
3、业务架构设计与实现:需要对跨系统的接口进行识别、实现、维护,需要对能写成公共代码类库的进行分析、识别、接口设计、实现、变更维护。
4、重构:架构师需要经常做 Bug 分析、非模板性和公共类库代码检查,以发现代码腐烂程度,以发现还有哪些代码没有做很好的架构与精心的代码设计。所以重构是经常性维护发生的,不是攒到某一刻动大手术,甚至推翻重做,那就不叫重构了。
## CTO
你把架构师团队组织建立完成,再往大长,你才需要真正意义上的 CTO 了。否则你一开始就招真正的 CTO,他也不满意,你的期望也不对。现在你的期望也对了,他的能力模型也正好和你的期望职能匹配了,你能给他的和他想要的也正好匹配了。
有的公司有软件系统产品副总裁,也有软件系统技术副总裁,而且把软件系统技术副总裁叫 CTO,软件系统产品副总裁叫产品 VP。这就很怪异。
真正的 CTO,是软件产品和技术是统一管理的。
他做的事情,是商业、产品、技术、管理、团队相平衡的综合统管。
CTO 的职责:
1、业绩达成:洞察客户需求,捕捉商业机会,规划技术产品,通过技术产品领导业务增长,有清晰的战略规划、主攻方向,带领团队实现组织目标
2、前沿与平台:到这个研发规模规模级别了,一定要有专门的团队做技术应用创新探索和前沿技术预研。而且要和技术平台团队、应用研发团队形成很好的联动作用,让创新原型试点能够很平滑的融入商业平台再让应用研发线规模化的使用起来。大量的前沿探索都死在了内部,做完试点就停滞了,这就需要 CTO 做好整体的衔接推动工作。
3、研发过程管理:站在全局立场来端到端改进业务流程,为业务增长提供方便
4、组织与人才建设:公司文化和价值观的传承;研发专业族团队梯队建制建设、研发管理族团队梯队建制建设;创建创新激发机制,激发研发人创新向前发展,激发黑马人脱颖而出
一、技术视野良好,架构设计能力出色
CTO 要有良好的技术视野,不需要各种技术都样样精通,但是必须要所有涉猎,有所了解,对各种技术领域的发展趋势,主流非主流技术的应用场景要非常了解。知道在什么场景应用什么技术,公司业务发展到什么规模应该预先做哪些技术储备。产品架构的设计要有足够的弹性,既能够保证当前开发的高效率,又能够对未来产品架构的演进留出扩展的余地。
二、动手能力要强,学习能力出色
CTO 并不需要自己亲自动手写代码,但是如有必要,自己可以随时动手参与第一线的编码工作,CTO 不能长期远离一线工作,自废武功,纸上谈兵。否则长此以往,会对技术的判断产生严重的失误。另外,CTO 也应该是一个学习能力非常出色的人,毕竟 IT 行业的技术更新换代速度非常快,如果没有快速学习能力,是没有资格做好 CTO 的。
三、管理研发团队过硬,能建立团队研发文化
CTO 的责任是负责整个公司的产品实现,所以 CTO 要善于管理研发团队,掌控好研发工作进度,能够在规划好的时间内,步步为营,好整以暇地完成公司产品的研发工作。
此外 CTO 还要擅长培养研发梯队力量,建立研发团队内部具有向心力的,开放性的,交流学习型组织文化。让研发团队具备自我学习能力,自我培养能力,自我建设能力。这样的研发团队工作极度默契,战斗力极强,而且员工归属感很强,流失率很低。
四、具备良好的产品意识,以及跨部门跨背景的沟通能力
CTO 不仅要懂技术,还要对互联网产品有良好的感觉,从产品的逻辑性,可实现角度提出产品改进和完善的总体性设想。因为产品经理或者业务人员设想的产品,很可能是逻辑上不严密,存在实现矛盾的。
此外 CTO 还需要极强的沟通能力,要能够和不同背景的人有良好的沟通能力,能够用对方的思维方式和话语体系来描述他不理解的专业问题。
五、敢于对 CEO 说“不”
只要不是技术出身的 CEO,必然对研发是门外汉,很可能对产品也是门外汉。因此,CEO 不是每个想法都靠谱的,CTO 有责任站在更加专业的角度去帮助 CEO 纠正,推演,完善想法。一个不敢对 CEO 说不的 CTO,这个公司肯定要走很长很长的弯路的。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册