如何成为一名优良的程序员

  • 要尽量接触代码,能看到代码,能写代码

    如何疾速成长

  • 要写代码先看代码

    • 好的代码让人看到时能够疾速理解,并且可能抓住次要设计精华

      • 公共库代码
      • 外围零碎的代码: 用到的设计,原理
  • 多看代码,放弃代码的敏感度
  • 写代码时,多做总结
  • 写的代码要体现设计的思维

    如何晋升技术

  • 理解我的项目中架构方面的相干常识,尤其是封装的组件
  • 架构师工作内容简要介绍:

    • 搭建高可用的框架:

      • 搭建数据库时,要思考如果一台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