前言
一个二本普通人,没有过人的履历,面试大厂格外吃力,能把简历投进去,拿到面试机会已经很开心了,但为了以后的发展,来之不易的面试机会必须珍惜,背面试题是最直接有效的捷径。从基础到拔高,背的昏天黑地的,竟拿下了阿里 offer。今天整理这波面经,主要是希望能够激励到同样被学历所困扰的技术人,能够对职业生涯和技术规划有一个参考价值,感谢!
一、面试阿里 P6 难在哪?(面试难点)
(1)难在“心态”
首先需要克服的第一关,实际上就是自己的心态。因为我是二本出身,base 比较低,所以面试阿里本就是一件没太大底气的事情,更何况是高级开发岗,所以心里就更容易没底。因此,在准备面试之前,调整心态这件事情就做了很久,所以难在“心态”一点也没错,心态没调整好,面试几乎是没戏的。
(2)难在“要求”
其次就是要求,所谓的要求实际上就是阿里对岗位的任职要求,也就是作为开发人员,你掌握了多少技术栈?
首先,你简历上写的肯定要会,其次就是你要拥有一些亮点,也就是说对某个技术有深入的了解,这样才能给面试官耳目一新的感觉。
那么,面试阿里 P6 岗,需要掌握多少呢?
-
Java 集合:HashMap 和 ConcurrentHashMap,平时最好有读一些源码,最好知道每个参数为什么设置成这么大?有什么好处?
-
JUC 包肯定要学,即使平时的编程根本不用,也必须得会。至少要知道 aba,cas,aqs,unsafe,volatile,sync,以及常见的各种 lock,死锁,线程池参数等,也必须要明白自旋,阻塞,死锁和它如何去定位,oom 如何定位问题,cpu 过高如何定位等基本的操作,你可以没有生产调试经验,但不代表你可以不会 top,jps,jstack,jmap 这些可能会问的东西。以及可能衍生的 jmm 模型和 mesi 协议等。
-
大厂必问 JVM:垃圾回收算法,垃圾收集器、JVM 内存模型,每个区域用途,各种 oom 的种类,jvm 调优经验,类加载过程,双亲委派等。
-
Spring 就得抽空看源码了,一般会问到 bean 的生命周期,如何解决循环依赖,实现事务原理,动态代理原理等。
-
Dubbo 也是必须问的,设计框架,负载均衡。
-
Redis 更要多懂一点,单线程模型,aof,rdb,rewrite,主从,cluster,哪些类型?包含一些缓存常见的问题击穿、穿透、雪崩、数据一致性等。
-
Mysql,事务,锁,索引,b+树,主从这些你必须会
-
Mq ,我用的 rocketmq,你得知道为什么用,重复消费,顺序消息,事务消息,高可用,消息丢失,挤压场景,整个消息发送消费的流程,读过源码更佳,更好吹
-
Netty 的话,零拷贝,bio,nio,aio,架构设计怎么样子的?用过看过更好
-
算法,建议去刷题,我运气好,简单的算法让我碰到了,一些快排,堆排,二叉树相关的,链表反转,成环,环节点,跳楼梯等常规的简单算法建议刷刷,双指针,dp,递归这些还是多找找感觉,大数据内存有限的场景的统计,有时间一些 middle 可以去试试,手写红黑树你要是可以,那我估计算法你稳了。
-
网络,http,tcp,https,udp,7 层网络协议等,最好结合自己理解,背,你都要背下来。
-
还有就是一些分布式事务实现,架构实现,比如抢红包,高并发下单等常规的场景设计,你来设计,你怎么去设计?多找一些大牛或者上网自己查,帮你看看有哪些漏洞,有那些解决方案?业界有哪些好的中间件?
技术栈思维图
二、阿里面试题(共 5 面)
阿里一面:
-
自我介绍、自己做的项目和技术领域
-
说一下 sync 的底层实现,锁优化,和 lock 的对比
-
讲一下 JVM 参数调优详细过程
-
为什么这么设置?好处是什么?描述 gc 场景,如何去分析 gc 日志?
-
redis 数据结构,使用场景,微博场景使用 redis 如何去设计用户关系?
-
线程池参数设定,为什么这么设定,作用?7 大参数
-
spring 的循环依赖如何解决?为什么要三级缓存?
-
优先级队列的底层原理?
阿里二面:
-
自我介绍一下吧
-
聊项目
-
结合你项目问你如何设计,提出漏洞,你怎么解决?如何改进,万一挂了?加一台机器有没有问题?如果我非要不出问题怎么办?
-
高并发下单扣库存场景如何设计
-
rocketMQ 架构设计原理
-
Dubbo 框架实现原理
-
最近读了什么书?平时怎么学习?
-
常用的负载均衡,该怎么用,你能说下吗?
阿里三面:
-
这一面主要问项目,给你的压力感比较强
-
结合项目问,为什么这么设计?让你去优化,你怎么优化,引导你用一个合理的更好的方式去优化,数据库的设计等
-
在公司做了什么事情,各个系统业务线都是做什么的,你的绩效,手写算法链表反转?
阿里四面:
-
JVM 的主要组成部分及其作用?
-
JVM 运行时数据区包含哪些?
-
JVM 垃圾回收机制,何时触发 MinorGC 等操作
-
JVM 的垃圾回收算法:
-
JVM 调优的工具?
-
常用的 JVM 调优参数?
-
堆栈的区别?
-
详细介绍一下 CMS 垃圾回收器?
-
怎么判断对象是否可以被回收?
-
新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别?
-
java 类加载过程?
-
把你知道的中间件都说一下吧(瞬间懵了一下)
HR 面:
-
为什么来阿里?
-
之前没考虑过阿里吗?
-
毕业这么久了,你觉得自己最大的改变是什么?
-
用一句话总结一下自己
三、拿下阿里 P6 岗 offer 前,我做了些什么?
(1)准备简历
简历是门面,更是敲门砖,能否拿到大厂的面试机会,就要看自己的简历如何,抛开学历意外,大厂最看重简历是否有亮点,因此我们对简历内容要有准备,对自己的突出点,包括技术、个性上的亮点,要练习表达,避免临时组织语言。
(2)提升技能
实际上我有个阿里的朋友很早之前就向我透露过,很多人认为大厂看重学历,但实际情况并不完全是,在阿里只以能力论英雄。所以,在日常生活中,通过不断地学习,提升自己的能力,努力去拉进自己与目标值的距离,这是很有必要的,也是未来的必然趋势。
关于提升技能,我的做法:
-
①阅读实战文档
-
②读一些源码
-
③读一些技术笔记
(3)猛刷面试题
对于 base 不是太好的人来说,刷面试题实际上是最具有“急救”效果的办法,因此在面试阿里前,我是刷了不少面试题的,目的倒不是希望面试时能被问到原题,而是对大厂面试有一个相应的了解,清楚阿里面试会问一些什么,涉及到哪些技术栈等。
关于刷题,我有话要说:
-
①Java 核心面试知识点整理
-
②算法部分(LeetCode+算法的乐趣)
-
③BAT 大厂面试真题+专题训练
一、Java 基础 44 道
-
解释下什么是面向对象?面向对象和面向过程的区别?
-
面向对象的三大特性?分别解释下?
-
JDK、JRE、JVM 三者之间的关系?
-
重载和重写的区别?
-
Java 中是否可以重写一个 private 或者 static 方法?
-
构造方法有哪些特性?
-
在 Java 中定义一个不做事且没有参数的构造方法有什么作用?
-
Java 中创建对象的几种方式?
-
抽象类和接口有什么区别?
-
静态变量和实例变量的区别?
-
12、short s1 = 1;s1 = s1 + 1;有什么错?那么 short s1 = 1; s1 += 1;呢?有没有错误?
-
Integer 和 int 的区别?
-
装箱和拆箱的区别
-
switch 语句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上?
-
16、final、finally、finalize 的区别
-
== 和 equals 的区别?
-
两个对象的 hashCode() 相同,则 equals() 也一定为 true 吗?
-
为什么重写 equals() 就一定要重写 hashCode() 方法?
-
& 和 && 的区别?
-
Java 中的参数传递时传值呢?还是传引用?
-
Java 中的 Math.round(-1.5) 等于多少?
-
如何实现对象的克隆?
-
深克隆和浅克隆的区别?
-
什么是 Java 的序列化,如何实现 Java 的序列化?
-
什么情况下需要序列化?
-
Java 的泛型是如何工作的 ? 什么是类型擦除 ?
-
什么是泛型中的限定通配符和非限定通配符 ?
-
List 和 List 之间有什么区别 ?
-
Java 中的反射是什么意思?有哪些应用场景?
-
反射的优缺点?
-
Java 中的动态代理是什么?有哪些应用?
-
怎么实现动态代理?
-
static 关键字的作用?
-
super 关键字的作用?
-
字节和字符的区别?
-
String 为什么要设计为不可变类?
-
String、StringBuilder、StringBuffer 的区别?
-
String 字符串修改实现的原理?
-
String str = "i" 与 String str = new String("i") 一样吗?
-
String 类的常用方法都有那些?
-
final 修饰 StringBuffer 后还可以 append 吗?
-
Java 中的 IO 流的分类?说出几个你熟悉的实现类?
-
字节流和字符流有什么区别?
-
BIO、NIO、AIO 有什么区别?
二、Java 异常 9 道
-
finally 块中的代码什么时候被执行?
-
finally 是不是一定会被执行到?
-
try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
-
try-catch-finally 中那个部分可以省略?
-
Error 和 Exception 的区别?
-
运行时异常与受检异常有何异同?
-
throw 和 throws 的区别?
-
常见的异常类有哪些?
-
主线程可以捕获到子线程的异常吗?
三、Java 集合 24 道
-
Java 中常用的容器有哪些?
-
ArrayList 和 LinkedList 的区别?
-
ArrayList 实现 RandomAccess 接口有何作用?为何 LinkedList 却没实现这个接口?
-
ArrayList 的扩容机制?
-
Array 和 ArrayList 有何区别?什么时候更适合用 Array?
-
HashMap 的实现原理/底层数据结构?JDK1.7 和 JDK1.8
-
HashMap 的 put 方法的执行过程?
-
HashMap 的 get 方法的执行过程?
-
HashMap 的 resize 方法的执行过程?
-
HashMap 的 size 为什么必须是 2 的整数次方?
-
HashMap 多线程死循环问题?
-
HashMap 的 get 方法能否判断某个元素是否在 map 中?
-
HashMap 与 HashTable 的区别是什么?
-
HashMap 与 ConcurrentHashMap 的区别是什么?
-
HashTable 和 ConcurrentHashMap 的区别?
-
ConcurrentHashMap 的实现原理是什么?
-
HashSet 的实现原理?
-
HashSet 怎么保证元素不重复的?
-
LinkedHashMap 的实现原理?
-
Iterator 怎么使用?有什么特点?
-
Iterator 和 ListIterator 有什么区别?
-
Iterator 和 Enumeration 接口的区别?
-
fail-fast 与 fail-safe 有什么区别?
-
Collection 和 Collections 有什么区别?
四、Java 并发 42 道
-
并行和并发有什么区别?
-
线程和进程的区别?
-
守护线程是什么?
-
创建线程的几种方式?
-
Runnable 和 Callable 有什么区别?
-
线程状态及转换?
-
sleep() 和 wait() 的区别?
-
线程的 run() 和 start() 有什么区别?
-
在 Java 程序中怎么保证多线程的运行安全?
-
Java 线程同步的几种方法?
-
Thread.interrupt() 方法的工作原理是什么?
-
谈谈对 ThreadLocal 的理解?
-
在哪些场景下会使用到 ThreadLocal?
-
说一说自己对于 synchronized 关键字的了解?
-
如何在项目中使用 synchronized 的?
-
说说 JDK1.6 之后的 synchronized 关键字底层做了哪些优化,可以详细介绍一下这些优化吗?
-
谈谈 synchronized 和 ReenTrantLock 的区别?
-
synchronized 和 volatile 的区别是什么?
-
谈一下你对 volatile 关键字的理解?
-
说下对 ReentrantReadWriteLock 的理解?
-
说下对悲观锁和乐观锁的理解?
-
乐观锁常见的两种实现方式是什么?
-
乐观锁的缺点有哪些?
-
CAS 和 synchronized 的使用场景?
-
简单说下对 Java 中的原子类的理解?
-
atomic 的原理是什么?
-
说下对同步器 AQS 的理解?
-
AQS 的原理是什么?
-
AQS 对资源的共享模式有哪些?
-
AQS 底层使用了模板方法模式,你能说出几个需要重写的方法吗?
-
说下对信号量 Semaphore 的理解?
-
CountDownLatch 和 CyclicBarrier 有什么区别?
-
说下对线程池的理解?为什么要使用线程池?
-
创建线程池的参数有哪些?
-
如何创建线程池?
-
线程池中的的线程数一般怎么设置?需要考虑哪些问题?
-
执行 execute() 方法和 submit() 方法的区别是什么呢?
-
说下对 Fork 和 Join 并行计算框架的理解?
-
JDK 中提供了哪些并发容器?
-
谈谈对 CopyOnWriteArrayList 的理解?
-
谈谈对 BlockingQueue 的理解?分别有哪些实现类?
-
谈谈对 ConcurrentSkipListMap 的理解?
五、Java JVM 42 道
-
说一下 Jvm 的主要组成部分?及其作用?
-
谈谈对运行时数据区的理解?
-
堆和栈的区别是什么?
-
堆中存什么?栈中存什么?
-
为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗?
-
Java 中的参数传递时传值呢?还是传引用?
-
Java 对象的大小是怎么计算的?
-
对象的访问定位的两种方式?
-
判断垃圾可以回收的方法有哪些?
-
垃圾回收是从哪里开始的呢?
-
被标记为垃圾的对象一定会被回收吗?
-
谈谈对 Java 中引用的了解?
-
谈谈对内存泄漏的理解?
-
内存泄露的根本原因是什么?
-
举几个可能发生内存泄漏的情况?
-
尽量避免内存泄漏的方法?
-
常用的垃圾收集算法有哪些?
-
为什么要采用分代收集算法?
-
分代收集下的年轻代和老年代应该采用什么样的垃圾回收算法?
-
什么是浮动垃圾?
-
什么是内存碎片?如何解决?
-
常用的垃圾收集器有哪些?
-
谈谈你对 CMS 垃圾收集器的理解?
-
谈谈你对 G1 收集器的理解?
-
说下你对垃圾回收策略的理解/垃圾回收时机?
-
谈谈你对内存分配的理解?大对象怎么分配?空间分配担保?
-
说下你用过的 JVM 监控工具?
-
如何利用监控工具调优?
-
JVM 的一些参数?
-
谈谈你对类文件结构的理解?有哪些部分组成?
-
谈谈你对类加载机制的了解?
-
类加载各阶段的作用分别是什么?
-
有哪些类加载器?分别有什么作用?
-
类与类加载器的关系?
-
谈谈你对双亲委派模型的理解?工作过程?为什么要使用
-
怎么实现一个自定义的类加载器?需要注意什么?
-
怎么打破双亲委派模型?
-
有哪些实际场景是需要打破双亲委派模型的?
-
谈谈你对编译期优化和运行期优化的理解?
-
为何 HotSpot 虚拟机要使用解释器与编译器并存的架构?
-
说下你对 Java 内存模型的理解?
-
内存间的交互操作有哪些?需要满足什么规则?
六、SSM 框架 37 道
-
使用 Spring 框架的好处是什么?
-
解释下什么是 AOP?
-
AOP 的代理有哪几种方式?
-
怎么实现 JDK 动态代理?
-
AOP 的基本概念:切面、连接点、切入点等?
-
通知类型(Advice)型(Advice)有哪些?
-
谈谈你对 IOC 的理解?
-
Bean 的生命周期?
-
Bean 的作用域?
-
Spring 中的单例 Bean 的线程安全问题了解吗?
-
谈谈你对 Spring 中的事物的理解?
-
Spring 中的事务隔离级别?
-
Spring 中的事物传播行为?
-
Spring 常用的注入方式有哪些?
-
Spring 框架中用到了哪些设计模式?
-
ApplicationContext 通常的实现有哪些?
-
谈谈你对 MVC 模式的理解?
-
SpringMVC 的工作原理/执行流程?
-
SpringMVC 的核心组件有哪些?
-
SpringMVC 常用的注解有哪些?
-
@RequestMapping 的作用是什么?
-
如何解决 POST 请求中文乱码问题,GET 的又如何处理呢?
-
SpringMVC 的控制器是不是单例模式,如果是会有什么问题,怎么解决?
-
SpringMVC 怎么样设定重定向和转发的?
-
SpringMVC 里面拦截器是怎么写的?
-
SpringMVC 和 Struts2 的区别有哪些?
-
谈谈你对 MyBatis 的理解?
-
MyBaits 的优缺点有哪些?
-
MyBatis 与 Hibernate 有哪些不同?
-
MyBatis 中 #{} 和 ${}的区别是什么?
-
MyBatis 是如何进行分页的?分页插件的原理是什么?
-
MyBatis 有几种分页方式?
-
MyBatis 逻辑分页和物理分页的区别是什么?
-
MyBatis 是否支持延迟加载?如果支持,它的实现原理是什么?
-
说一下 MyBatis 的一级缓存和二级缓存?
-
Mybatis 有哪些执行器(Executor)?
-
MyBatis 动态 SQL 是做什么的?都有哪些动态 SQL?能简述一下动态 SQL 的执行原理不?
七、MySQL 31 道
-
请说下你对 MySQL 架构的了解?
-
一条 SQL 语句在数据库框架中的执行流程?
-
数据库的三范式是什么?
-
char 和 varchar 的区别?
-
varchar(10) 和 varchar(20) 的区别?
-
谈谈你对索引的理解?
-
索引的底层使用的是什么数据结构?
-
谈谈你对 B+ 树的理解?
-
为什么 InnoDB 存储引擎选用 B+ 树而不是 B 树呢?
-
谈谈你对聚簇索引的理解?
-
谈谈你对哈希索引的理解?
-
谈谈你对覆盖索引的认识?
-
索引的分类?
-
谈谈你对最左前缀原则的理解?
-
怎么知道创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因?
-
什么情况下索引会失效?即查询不走索引?
-
查询性能的优化方法?
-
InnoDB 和 MyISAM 的比较?
-
谈谈你对水平切分和垂直切分的理解?
-
主从复制中涉及到哪三个线程?
-
主从同步的延迟原因及解决办法?
-
谈谈你对数据库读写分离的理解?
-
请你描述下事务的特性?
-
谈谈你对事务隔离级别的理解?
-
解释下什么叫脏读、不可重复读和幻读?
-
MySQL 默认的隔离级别是什么?
-
谈谈你对 MVCC 的了解?
-
说一下 MySQL 的行锁和表锁?
-
InnoDB 存储引擎的锁的算法有哪些?
-
MySQL 问题排查都有哪些手段?
-
MySQL 数据库 CPU 飙升到 500% 的话他怎么处理?
八、Redis 12 道
-
谈下你对 Redis 的了解?
-
Redis 一般都有哪些使用场景?
-
Redis 有哪些常见的功能?
-
Redis 支持的数据类型有哪些?
-
Redis 为什么这么快?
-
什么是缓存穿透?怎么解决?
-
什么是缓存雪崩?该如何解决?
-
怎么保证缓存和数据库数据的一致性?
-
Redis 持久化有几种方式?
-
Redis 怎么实现分布式锁?
-
Redis 淘汰策略有哪些?
-
Redis 常见性能问题和解决方案?
九、计算机网络 45 道
-
为什么需要三次握手?两次不行?
-
为什么需要四次挥手?三次不行?
-
TCP 与 UDP 有哪些区别?各自应用场景?
-
HTTP1.0,1.1,2.0 的版本区别
-
POST 和 GET 有哪些区别?各自应用场景?
-
HTTP 哪些常用的状态码及使用场景?
-
HTTP 状态码 301 和 302 的区别,都有哪些用途?
-
在交互过程中如果数据传送完了,还不想断开连接怎么办,怎么维持?
-
HTTP 如何实现长连接?在什么时候会超时?
-
TCP 如何保证有效传输及拥塞控制原理
-
IP 地址有哪些分类?
-
GET 请求中 URL 编码的意义
-
什么是 SQL 注入?举个例子?
-
谈一谈 XSS 攻击,举个例子?
-
讲一下网络五层模型,每一层的职责?
-
简单说下 HTTPS 和 HTTP 的区别
-
对称加密与非对称加密的区别
-
简单说下每一层对应的网络协议有哪些?
-
ARP 协议的工作原理?
-
TCP 的主要特点是什么?
-
UDP 的主要特点是什么?
-
TCP 和 UDP 分别对应的常见应用层协议有哪些?
-
为什么 TIME-WAIT 状态必须等待 2MSL 的时间呢?
-
保活计时器的作用?
-
TCP 协议是如何保证可靠传输的?
-
谈谈你对停止等待协议的理解?
-
谈谈你对 ARQ 协议的理解?
-
谈谈你对滑动窗口的了解?
-
谈下你对流量控制的理解?
-
谈下你对 TCP 拥塞控制的理解?使用了哪些算法?
-
什么是粘包?
-
TCP 黏包是怎么产生的?
-
怎么解决拆包和粘包?
-
forward 和 redirect 的区别?
-
HTTP 方法有哪些?
-
在浏览器中输入 URL 地址到显示主页的过程?
-
DNS 的解析过程?
-
谈谈你对域名缓存的了解?
-
谈下你对 HTTP 长连接和短连接的理解?分别应用于哪些场景?
-
HTTPS 的工作过程?
-
HTTP 和 HTTPS 的区别?
-
HTTPS 的优缺点?
-
什么是数字签名?
-
什么是数字证书?
-
Cookie 和 Session 有什么区别?
十、操作系统 32 道
-
简单说下你对并发和并行的理解?
-
同步、异步、阻塞、非阻塞的概念
-
进程和线程的基本概念
-
进程与线程的区别?
-
为什么有了进程,还要有线程呢?
-
进程的状态转换
-
进程间的通信方式有哪些?
-
进程的调度算法有哪些?
-
什么是死锁?
-
产生死锁的原因?
-
死锁产生的必要条件?
-
解决死锁的基本方法?
-
怎么预防死锁?
-
怎么避免死锁?
-
怎么解除死锁?
-
什么是缓冲区溢出?有什么危害?
-
分页与分段的区别?
-
物理地址、逻辑地址、虚拟内存的概念
-
页面置换算法有哪些?
-
谈谈你对动态链接库和静态链接库的理解?
-
外中断和异常有什么区别?
-
一个程序从开始运行到结束的完整过程,你能说出来多少?
-
什么是用户态和内核态
-
用户态和内核态是如何切换的?
-
进程终止的方式
-
守护进程、僵尸进程和孤儿进程
-
如何避免僵尸进程?
-
介绍一下几种典型的锁?
-
常见内存分配内存错误
-
内存交换中,被换出的进程保存在哪里?
-
原子操作的是如何实现的
-
抖动你知道是什么吗?它也叫颠簸现象
十一、消息队列与分布式 26 道
-
消息队列的基本作用?
-
消息队列的优缺点有哪些?
-
如何保证消息队列的高可用?
-
如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?
-
如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题?
-
如何保证消息的顺序性?
-
大量消息在 MQ 里长时间积压,该如何解决?
-
MQ 中的消息过期失效了怎么办?
-
RabbitMQ 有哪些重要的角色?
-
RabbitMQ 有哪些重要的组件?
-
RabbitMQ 有几种广播类型?
-
Kafka 可以脱离 zookeeper 单独使用吗?为什么?
-
Kafka 有几种数据保留的策略?
-
Kafka 的分区策略有哪些?
-
谈下你对 Zookeeper 的认识?
-
Zookeeper 都有哪些功能?
-
谈下你对 ZAB 协议的了解?
-
Zookeeper 怎么保证主从节点的状态同步?
-
Zookeeper 有几种部署模式?
-
说一下 Zookeeper 的通知机制?
-
集群中为什么要有主节点?
-
集群中有 3 台服务器,其中一个节点宕机,这个时候 Zookeeper 还可以使用吗?
-
说一下两阶段提交和三阶段提交的过程?分别有什么问题?
-
Zookeeper 宕机如何处理?
-
说下四种类型的数据节点 Znode?
-
Zookeeper 和 Dubbo 的关系?
做个总结
很多学历不太好的人,可能对自己没有太大的信心,实际上任何事情都有“奇迹”发生,关键还是要靠自己去创造。无论你是小白菜鸟,还是技术大牛,日常都不能够落下学习这件事情,一旦落后下来,就容易遭到淘汰。
完整pdf要的厚台私信我哦