如何成为一名优良的程序员
-
要尽量接触代码, 能看到代码, 能写代码
如何疾速成长
-
要写代码先看代码
-
好的代码让人看到时能够疾速理解, 并且可能抓住次要设计精华
- 公共库代码
- 外围零碎的代码: 用到的设计, 原理
-
- 多看代码, 放弃代码的敏感度
- 写代码时, 多做总结
-
写的代码要体现设计的思维
如何晋升技术
- 理解我的项目中架构方面的相干常识, 尤其是封装的组件
-
架构师工作内容简要介绍:
-
搭建高可用的框架:
- 搭建数据库时, 要思考如果一台 MySQL 服务宕机, 如何保障业务切换到另一台机器上
-
要思考高并发因素:
- 须要会用 nginx,mycat,netty,redis 之类的工具
- 思考搭建实现负载平衡
-
要把设计好的架构部署上线:
- 要晓得如何将 nginx 集群等组件部署上线
- 理解部署的 linux 命令和脚本
- 理解 jenkins 之类的部署工具
-
可能解决部署和运行时的问题:
- 懂得如何搭建零碎
- 具备针对 netty 等组件的 debug 能力
- 可能通过日志晓得集群的运作状况
- 可能疾速解决集群问题
-
不仅仅关注技术, 还要联合业务:
- 将业务需要通过架构实现
- 晓得组件的优劣
- 可能选型并且设计方案
-
-
相熟相干技能:
- 先从 ant 脚本 ,jekins脚本和 linux 脚本动手, 相熟零碎的部署形式以及必备的 linux 调试技能
- 通过观察 nginx 或者 dubbo 或者 zookeeper 的配置文件, 理解各个组件的运作形式, 并可能通过这些理解高并发可用零碎里负载平衡和生效转移的配置形式
- 察看线上相干日志, 理解零碎部署状况, 以及从架构层面理解诸多组件之间的关联
-
多多解决理论问题, 理解组件的要害配置和组件的底层代码
- 相熟根本的部署和架构方面的技能
-
测试和上线阶段呈现问题:
- kafka没有配置好, 导致音讯积压
- dubbo超时工夫配置过长, 导致调用链路超时生效
- redis超时工夫过长, 导致 OOM 异样
-
跟在资深人员之后查问题, 找到问题后, 手动复盘一下:
- 做到相熟组件配置
- 并能理解组件的底层代码
- 相熟配置各种框架组件的实施方案
-
架构师面试相干问题:
- 如何部署 nginx 或者其它组件, 从而实现高可用?
- Redis 集群里, 容灾个别是怎么做的?
- Kafka 音讯队列里, 如何实现音讯反复? 如何确保音讯不被反复生产?
-
底层相干比方 netty 里的读写索引工作形式?
好程序员的思维模式
-
常常钻研你不懂的代码
- 钻研你未接触过的代码, 相熟不同的代码构造和设计模式, 钻研代码为什么这样写
-
精通代码调试
- 先猜想一下到底产生了什么
- 假如猜想是对的, 想想猜想会导致程序有什么后果
-
试着察看这些后果有没有异样的中央:
- 如果没有发现异常, 阐明猜想的问题很可能就是对的
- 如果发现了异样, 阐明猜想是错的, 进行调试
- 对于一名攻城狮来说, 这个过程就是电光火石的一瞬间. 只有解决的问题足够多, 做进去的猜想就会越精确
- 器重节约工夫的工具
- 优化迭代速度
-
系统性的思维形式:
- 本人的代码和其它代码在性能上是什么关系
- 有没有好好测试代码
- 为了部署代码, 线上生产环境的代码需不需要变动
- 新的代码会不会影响曾经运行的代码
- 在新的性能下, 指标用户的行为是否是冀望的
-
代码有没有产生商业上的影响
程序员算法
-
要害是了解算法背地的深层次实践, 以及修炼出解决问题的思路
十大经典算法
- 疾速排序算法
- 堆排序算法
- 归并排序算法
- 二分查找算法
- 线性查找算法(BFPRT)
- 深度优先搜索算法(DFS)
- 广度优先搜索算法(BFS)
- 最短门路算法(Dijkstra 算法)
- 动静布局算法
-
奢侈贝叶斯分类算法
算法局部
- 二分搜寻: Binary Search
- 分治: Divide Conquer
- 宽度优先搜寻: Breadth First Search
- 深度优先搜寻: Depth First Search
- 回溯法: Backtracking
- 双指针: Two Pointers
- 动静布局: Dynamic Programming
- 扫描线: Scan-line algorithm
-
快排: Qiuck Sort
数据结构局部
- 栈: Stack
- 队列: Queue
- 链表: Linked List
- 数组: Array
- 哈希表: Hash Table
- 二叉树: Binary Tree
- 堆: Heap
- 并查集: Union Find
-
字典树: Trie
LeetCode
-
刷题程序:
- 如果工夫紧迫, 先刷热门举荐题
-
如果工夫富余:
- 按从低到高的难度分组刷题
- 按 tag 分类刷题
- 定期温习, 重做之前刷过的题
-
刷题办法:
- 第一遍: 先思考, 看参考答案刷, 联合其他人的题解刷. 思考, 总结并把握本题的类型, 思考形式, 最优题解
- 第二遍: 先思考, 回顾最优解法, 并与之前本人写过的解答作比对, 总结问题和办法
- 第三遍: 晋升刷题速度, 拿出一个题, 就可能晓得其考查重点, 解题办法, 在短时间内写出解答
-
定期总结:
- 依照题目类型进行总结: 针对一类问题, 总结有哪些解题办法, 哪种办法是最优的, 为什么?
-
总结重点: 有些题刷了好多遍还是不会, 那就要重点关注, 多思考解决办法, 一直练习强化
技术学习路线
并发编程
Java 内存模型(JMM)
- Java 中的线程通信和消息传递
-
什么是重排序和程序一致性,Happens-Before,As-If-Serial
Synchronized 的概念和剖析
- 同步, 重量级锁以及 Synchronized 原理剖析
-
自旋锁, 偏差锁, 轻量级锁和重量级锁概念, 应用以及如何优化
Volatile 和 DCL 常识
- Volatile 应用场景和 Volatile 实现机制, 内存语义, 内存模型
-
DCL 单例模式, 什么是 DCL, 如何解决 DCL 问题
并发根底之 AQS 深度剖析
- AbstrasctAueuedSynchronizer 同步器的概念,CLH 同步队列是什么?
-
同步状态的获取和开释, 线程的阻塞和唤醒
Lock 和并常用工具类
-
Java 中的 Lock:
- ReentrantLock
- ReentrantReadWriteLock
- Condition
-
Java 中的并发工具类:
- CyclicBarrier
- CountDownLatch
- Semphore
-
Java 中的并发汇合类:
- ConcurrentHashMap
-
ConcurrentLinkedQueue
原子操作罕用常识详解
-
根本类型的原子操作:
- AtomicBoolean
- AtomicInteger
- AotomicLong
-
数组类型的原子操作:
- AtomicIntegerArray
- AtomicLongArray
- AtomicReferenceArray
-
援用类型的原子操作:
- AtomicReference
- AtomicReferenceFieldUpdater
-
CAS 的概念和知识点, 以及缺点
线程池和并行
- Executor
- ThreadPoolExecutor
- Callable &Future
- ScheduledExecutorService
- ThreadLocal
- Fork & Join
- 什么是并行
-
线程池如何保障外围过程不会被销毁
框架和源码利用
MyBatis 利用和源码解析
- MyBatis 的优缺点,Spring 和 MyBatis 集成
- Cofig,Sql 配置,mapper 配置. 有几种注册 mapper 的办法, 优先级如何
- Mybatis 的一级缓存, 二级缓存. 为什么说 MyBatis 的二级缓存是鸡肋
- 通过 mapper 的实现,MyBatis 编写 SQL 语句的三种形式
- @MapperScan 源码剖析,mapperScan 是如何失效的
- MyBatis 如何扩大 Spring 的扫描器的,MyBatis 扫描完之后如何应用 FactoryBean
- MyBatis 底层如何将对象放到 Spring 容器中的, 使用到 Spring 的哪些常识
- Mybatis 和 Spring 外围接口 ImportBeanDefinitionRegistrar 之间的分割
- MyBatis 的以及缓存为什么会生效,Spring 为何将 MyBatis 的一级缓存生效, 有什么方法解决
- MyBatis 的执行流程,MyBatis 中的 Sql 如何缓存的, 缓存在哪里
-
MyBatis 中的办法名为什么要和 mapper 当中的 id 统一, 从源码来阐明
Tomcat 源码解析
- Tomcat 总体概述和 Tomcat 启动流程, 源码剖析
- Tomcat 中的 web 申请源码剖析, 一个 http 如何申请到 Tomcat 的,Tomcat 如何解决的
- Tomcat 的协定剖析, 从源码剖析 Tomcat 中各种具体配置的意义
- Tomcat 和 Apache,Nginx 等支流动态服务器的搭配应用
-
Tomcat 性能调优, 生产环境如何让 Tomcat 容器性能达到最高
Spring 源码剖析
- Spring 的根本利用和 Spring 源码编译
- Java 中的日志零碎,JUL,JCL,log4j,slf4j
- Spring4 和 Spring 在日志方面的源码比照
- AspectJ 和 Spring AOP,AspectJ 的动态织入
- JDK 动静代理的源码剖析,JDK 是如何操作字节码的
- Spring 通过 CGLIB 实现 AOP,CGLIB 如何实现办法拦挡
- AnnotationAwareAspectJAutoProxyCreator 如何实现代理织入的
- BeanDefinition 是什么,Spring 中各种 BeanDefinition 的作用
- BeanDefinition 有什么作用, 如何扭转一个 Bean 的行为
- BeanDefinitionRegistry 的作用, 源码剖析
- BeanNameGenerator 如何扭转 beanName 的生成策略
- BeanPostProcessor 如何作用 Bean 的实例化过程, 经典利用场景有哪些,Spring 外部哪里用到了这个接口
- BeanFactoryPostProcessor 和 BeanPostProcessor 的区别, 经典利用场景,Spring 外部是如何应用 BeanFactoryPostProcessor 的
- BeanDefinitionRegistryPostProcessor 和 BeanFactoryPostProcessor 的关系以及区别,Spring 底层如何进行调用的
- ConfigurationClassPostProcessor 这个类如何实现 Bean 的扫描, 如何实现 @Bean 的扫描, 如何实现 @Import 的解析
-
@Import 的三种类型:
- 一般类
- 配置类
- ImportSelector
- 如何利用 ImportSelector 实现对 Spring 的扩大
- @Configuration 这个注解为什么能够不加, 加与不加的区别, 底层为什么应用 CGLIB
- @Bean 办法是如何放弃单例的? 如果不须要单例须要怎么配置? 为什么须要这么配置
- SpringFactoryBean 和 BeanFactory 的区别? 有哪些经典利用场景?Spring 的 factoryMethod 的经典利用场景
- ImportBeanDefinitionRegistrar 这个接口的作用? 支流框架是如何利用这个类来实现和 Spring 的联合的
- Spring 是什么时候来执行后置处理器的? 有哪些重要的后置处理器? 比方 CommonAnnonationBeanPostProcessor
- Spring 和 SpringBoot 当中各种 @EnableXxx 的原理是什么? 如何自定义实现一个? 比方动静开启某些自定义性能
- Spring 如何来实现 Bean 的循环依赖并且实例化的? 什么是 Spring 的 IOC 容器? 怎么通过源码来了解
-
Bean 的实例化过程? 源码中两次 getSingleleton 的不同?SpringMVC 的源码剖析
Spring 微服务
SpringCloud
- Eureka 源码剖析, 服务注册和服务发现, 心跳机制, 爱护机制? 比照 Eureka 和 Zookeeper, 什么是 CAP 准则
- Ribbon 源码剖析和负载平衡? 客户端负载平衡? 服务端负载平衡?Ribbon 外围组件 IRule 以及重写 IRule
- Fegin 源码剖析和申明式服务调用?Fegin 负载平衡?Fegin 如何与 Hystrix 联合应用? 有什么问题
- Hystrix 如何实现服务限流, 降级? 大型分布式我的项目服务雪崩如何解决? 服务熔断到底是什么? 一线公司的企业级解决方案
- HystrixDashboard 如何实现自定义接口降级? 监控数据? 数据聚合等等
- Zuul 对立网关详解, 服务路由, 过滤器应用等? 从源头拦挡掉一些不良申请
- 分布式配置核心 Config 详解? 如何与 Github 或是自定义的 Git 平台联合, 比方 Gitlab
-
分布式链路详解? 串联调用链, 让 Bug 无处可藏? 如何理清微服务的依赖关系? 如何跟清业务流的解决程序
SpringBoot
- SpringBoot 的源码剖析和根本利用? 利用 SpringMVC 常识模仿和手写一个 SpringBoot
- SpringMVC 零配置如何实现的? 利用了 Servlet 3.0 的哪些新常识? 在 SpringMVC 中如何内嵌一个 Tomcat 如何把 web.xml 去掉
- SpringBoot 中的监听器和设计模式中的观察者模式的关系? 模仿 Java 当中的事件驱动编程模型
- SpringBoot 的启动流程剖析?SpringBoot 如何初始化 Spring 中的 context? 如何初始化 DispatchServlet? 如何启动 Tomcat 的
- SpringBoot 中的配置文件类型, 配置文件的语法, 配置文件的加载程序? 模仿 SpringBoot 中的主动配置
-
SpringBoot 的日志零碎?SpringBoot 如何设计本身的日志零碎的? 有什么劣势? 如何做到对立日志的
Docker
- 什么是 Docker? 为什么要应用 Docker, 和开发有什么关系? 可能带来便捷?Docker 简介, 入门?Docker 的架构是怎么的
-
Docker 的三大外围概念:
- 镜像(Images)
- 容器(Cotainers)
- 仓库服务注册器(Registry)
- Docker 的根底用法以及 Docker 镜像的基本操作
- 容器技术入门?Docker 容器基本操作? 容器虚拟化网络概述以及 Docker 的容器网络是怎么的
- 如何利用 Dockerfile 格局,Dockerfile 命令以及 docker builder 构建镜像
-
Compose 和 Dockerfile 的区别是什么?Compose 的配置文件以及应用 Compose 运行容器?Docker 实战利用
性能调优
MySQL 性能调优
- MySQL 中为什么不应用其余数据结构而就用 B + 树作为索引的数据结构
- MySQL 执行打算详解以及 MySQL 查问优化器详解
-
MySQL 索引优化实战? 包含一般查问,group by,order by
Java 数据结构算法
- Hash 算法详解?Java 中的 HashMap 源码剖析? 手写一个 HashMap
- 从源码了解 HashMap JDK 7 和 JDK 8 的变动? 为什么会有这样的变动? 手写一个 HashMap
- 顺序存储, 双向链表, 单向链表,Java 当中 LinkedList 的源码剖析
- Java 当中线性构造, 树形构造以及图形构造剖析以及利用场景和经典应用
-
大数字运算和经典排序, 二叉树红黑树排序, 查找
JVM 性能调优
- Java 内存模型总体概述, 类加载过程和 ClassLoader, 运行时数据区当中的总体内容, 编译原理
- 内存区域和内存溢出异样, 虚拟机对象, 程序计数器,Java 栈, 本地办法栈, 操作数, 办法区, 堆内存和元数据
- ClassLoader 的常识详解, 默认全盘负责机制, 从 JDK 源码来了解双亲委派模式, 如何突破双亲委派? 为什么须要突破双亲委派
- 虚拟机性能监控与故障解决,JVM 根本命令,jinfo 命令的应用,jmap 命令的应用,jstak 命令的应用, 应用 jvisualvm 剖析
- 垃圾收集器与内存调配策略, 垃圾回收算法与根底, 串型收集器, 并行收集器, 内存调配与回收策略
- 程序编译与代码优化, 运行期优化, 编译期优化,JVM 调优的实质是什么? 什么是轻 GC? 什么是 Full GC? 如何进行调优
-
JVM 执行子系统, 类文件构造, 类加载机制, 字节码执行引擎, 字节码编译模式, 如何扭转字节码编译模式
互联网工程
Maven
- 整体认知 Maven 的体系结构
- Maven 的外围命令
- Maven 的 pom 配置体系
-
搭建 Nexus 私服
Git
- 入手搭建 Git 客户端与服务端
- Git 外围命令
- Git 企业应用
-
Git 的原理,Git 底层指针介绍
Linux
- Linux 启动, 原理, 目录介绍
- Linux 运维常用命令,Linux 用户与权限介绍
-
shell 脚本编写
分布式
分布式协调框架 -Zookeeper
- 什么是分布式系统? 分布式系统有何挑战?Zookeeper 疾速入门以及集群搭建根本应用
- Zookeeper 有哪些常用命令以及注意事项,zkclient 客户端与 curator 框架有什么性能以及如何应用
-
手写 Zookeeper 常见利用场景:
- 分布式配置核心
- 分布式锁
- 分布式定时工作
- Zookeeper 外围概念 zNode,watch 机制, 序列化, 长久化机制详解以及源码解析
-
Zookeeper 如何解决分布式中的一致性问题? 领导选举流程解说及其源码解析
RPC 服务框架 -Dubbo
- 手写 RPC 框架以及为什么要应用 Dubbo? 传统利用零碎如何演变成分布式应用零碎详解
- Dubbo 的六大个性是什么? 对企业级开发有何益处?Dubbo 作用的简要阐明? 疾速演示 Dubbo 调用实例
- Dubbo 中的协定, 注册核心, 动静代理机制是怎么达到可扩大的?Dubbo 的扩大机制源码解析
- Dubbo 从服务提供者到注册核心到服务消费者调用服务两头的流程源码解析
-
Dubbo 监控核心以及治理平台的应用, 不便企业级开发与治理
分布式数据缓存 -Redis
- 关系型数据库瓶颈与优化?Encache 和 Redis 比照?NoSQL 利用场景
- Redis 的根本数据类型, 比方 Map 的应用场景? 有什么优缺点? 什么时候用 Map
- Redis 高级个性? 如何了解 Redis 单线程然而高性能? 如何了解 Redis 与 Epoll
- Redis 长久化? 什么状况下须要长久化? 计划是什么? 有什么优缺点? 如何优雅地抉择长久化计划
- Redis 我的项目中的利用?Redis 高级命令 mget,scan? 为什么有 scan 这条命令? 如何了解 Redis 游标
- 单机版 Redis 装置以及 Redis 生产环境启用计划
- Redis 长久化机对于生产环境劫难复原的意义
- Redis 主从框架下如何能力做到99.9% 的高可用性
- 在我的项目中从新搭建一套主从复制 + 高可用 + 多 master 的 Redis Cluster 集群
- Redis 在实践中的一些常见问题以及优化思路, 包含 Linux 内核参数优化
- Redis 的 RDB 长久化配置以及数据恢复试验
-
Redis 的 RDB 和 AOF 两种长久化机制的优劣势比照
分布式数据存储 -MyCAT
- 分库分表场景介绍
- MyCAT 原理介绍
-
分库分表实战
分布式 RabbitMQ
- RabbitMQ 环境装置,RabbitMQ 整体架构与音讯流转, 交换机详解
- 音讯如何保障 100% 的投递胜利计划? 企业音讯幂等性概念以及业界支流解决方案
- Confirm 确认音讯详解,Return 返回音讯详解, 生产端的限流策略, 生产端 ACK 与重回队列机制
-
SpringAMQP 用户治理组件:
- RabbitAdmin 利用
- SpringAMQP 音讯模板组件
- RabbitTemplate 实战
-
SpringAMQP 音讯容器:
- SimpleMessageListenerContainer 详解
- SpringAMQP 音讯适配器
- MessageListenerAdapter 应用
- RabbbitMQ 与 SpringBoot 2.0 整合实战以及 RabbitMQ 与 SpringCloud Stream 整合实战
- RabbitMQ 集群架构模式,RabbitMQ 集群镜像队列构建实现可靠性存储,RabbitMQ 集群整合负载平衡根底组件 HaProxy