工作四五年了,做了不少项目,学了不少技术框架,了解不不少设计思想,自身的技术积累也有不少了,今天用头脑风暴的方式梳理一下,可能不全,后面会不断完善。
技术栈
1.java:集合、多线程、JVM原理
1) Collection
List
ArrayList
LinkedList (Deque的实现)
Vector (Stack的父类)
推荐用 Deque替换 Stack
Set:
HashSet
TreeSet
Map:
HashMap (对比HashTable,安全问题有哪些(2个) )
TreeMap
ConcurrentHashMap(1.7和1.8的区别)
集合类的扩容原理?
2) 多线程:
创建线程的方式:
a)继承 Thread类
b)实现 Runnable 接口
c)实现 Callable 接口(有返回值,使用 Future)
线程的状态有哪些?在哪能看这些状态?
sleep, wait, yield
notify, notifyAll
join
线程池:
Fixed
Singleton
Cashed
Schedule
线程池的参数有哪些?工作
流程?内部实现原理?
CountDownLatch,
CyclicBarrier的功能和区别?
Semophere fIfe?
AQS 原理?
JUC包中的各种工具?
3)锁:
synchronized、Lock 区别?
偏向锁、轻量级锁、重锁
可重入锁、排他锁
乐观锁、悲观锁
读锁、写锁
CAS 存在的问和解决方式?
锁粗化
4) JVM
jvm内存结构?
堆内存分区
垃圾回收算法?
垃圾回收器?7+1(7个老的收集器+ZGC)
minor gc和fullgc发生位置?触发条件?带来的问题?
内存泄漏?
常用命令 (jmap、jstack、jstat等)
5)其他:
java类加截过程?双亲委派机制,破坏双亲委派机制
反射机制
注解
2.Spring (SpringBoot)
1) spring 核心思想:IOC、AOP(虽然写起来不难,但切片相关概念比较难记)
2) bean的生命周期
3) spring 事务的传递方式 (7种)
4) springMVC 原理
5) Mybatis 原理
6) 拦截器、过滤器
3.微服务
1 SpringCloud:
注册中心:Eureka、concul. zookeeper
配置中心:SpringCloudConfig
网关:zuul
负责均衡:Ribbon
服务器容错:hystrix
声明式 Http客户端:Feign
通信方式:http restful
2) SpringCloudAlibaba:
注册中心:nacos
配置中心:nacos
负载均衡:Ribbon
声明式 Http客户端:OpenFeign
服务器容错:Sentinel(限流、熔断、降级)
网关:SpringCloud Gateway(webflux编程模式)
调用链路监控:Sleuth
分布式事务:Seata(两段提交)
通信方式:httprestful
3 dubbo
注册中心:zookeeper
通信方式:RPC
RPC和http的区别?
dubbo 替换 openFeign的实践
4.大数据
1) 数据计算
flink, spark, mapreduce, hive
2)数据存储
oltp: mysql, postgreSql
ElasticSearch
olap: hdfs, hbase, clickhouse, kylin
其他:redis
3)数据传输
消息队列:kafka、
数据同步:canal、flink
cdc, flume
4) 资源调度
yarn、 k8s
5) 相关概念和问题:
数据倾斜
高可用性
数据一致性
幂等性
高并发
并行度
作业编排
flink:
调度过程?
提交过程
作业执行过程
streamGraph到jobGraph到ExecutionGraph到执行 task转化过程
slot的概念
井行度和slot数的关系
幂等性保证
checkpoint原理,增量checkpoint
savepoint 和checkpoint同点
barrier的作用
barrier对齐和对齐的优化
状态后媏有哪些
作业调度楧式有哪些?
yarn的三种调度方式
批流一体
动态表
水印
mapreduce:
shuffle 原理以及和spark中shuffle的区别
spark :
划分 stage的依据
shuffle 原理
rdd
mysql:
索引
锁(参考java 的锁外加gaP锁,next锁等)
事务 (acid)原理
死锁
sql优化
执行计划
慢查询
分库分表(相关第三方组件)
分区
(innodb)
回表
postgresql:
参考mysql
hbase:
读写流程
wal
hlog
memStore
blockCash
storefile
regionServer
region
region 切分和合并
布隆过滤器
LSM树(内存+磁盘)
跳表
Hdfs:
读写流程
小文件合并
ElasticSearch:
倒排索引
正排索引
query 和filter区别
shard
选主流程
lucene
slor
建索引
读索引
深度查询
排序算法
打分策略
分词器
分词算法
查询优化
segment
FST(Finite StateTransducers有穷状态转化器)
前缀树
tf-idf
bm25
kafka
工作流程
架构
高可用性
选主流稈
partition
一致性
幂等性保证
yarn, k8s:
工作原理
提交流程
调度策略
docker:
镜像、容器的关系(类比类和对象,镜像是类,容器是对象)
写在最后:
本人其实一直都有转算法岗的想法,只是读书期间没有在这方面投入足够的精力,工作之后继续学习相关的内容。对于算法岗的要求和本人的实际情况也做了分析,算法研究可能不太适合,至少目前不适合,算法工程类的岗位对我来说还是可以胜任的,从取数据,到计算模型,到预测输出这个流程目前已有成熟的框架,这个和大数据常规的数据处理流程有些类似,所以对我来说更多的是要在具体业务场景中加深对这一过程的理解。当然基本的机器学习算法、深度学习也是要掌握的。
除了对算法岗一直以来的向往,另一个岗位——架构师,也算是我之前的努力方向,最终能不能当架构师对我来说不重要,重要的是要具备架构师的能力,目前来看,架构师级别的技术已经有一定的积累,但仍然在路上。个人觉得架构师更多的是需要在实际工作中不断地实践,不断的提升自己的软硬实力,才能配的上这个职位,不然纸上谈兵,我也可以的,哈哈。
关于语言,从最初在学校学习的c/c++,到后来学习的java,再到做全栈时前端的javaScript,没有在工作中用过的python、scala都有不同程度的了解。多种语言学习也是未来的一项工作,从阅读源码的需求来看,这个是必要的。
最后,我很热爱技术,虽然没有在某一项技术上达到精通,但是用过学过的技术都会主动了解其内部原理,做到知其然和知其所以然。源码看的不多,但是从最初对shiro,spring,xxl-job,flink-cdc,canal源码的粗略浏览和对flink源码的仔细探索,深刻感受到项目的复杂度和源码的阅读难度成正相关,搞不清基本原理,不建议阅读源码。
以上就是我对自己前五年技术积累的总结。