写点什么

个人经验:谈谈要想成为一位优秀的程序员,一定要做好的几个方面

发布于: 1 小时前
个人经验:谈谈要想成为一位优秀的程序员,一定要做好的几个方面

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

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

如何快速成长

  • 要写代码先看代码

  • 好的代码让人看到时可以快速了解,并且能够抓住主要设计精髓

  • 公共库代码

  • 核心系统的代码: 用到的设计,原理

  • 多看代码,保持代码的敏感度

  • 写代码时,多做总结

  • 写的代码要体现设计的思想

如何提升技术

  • 了解项目中架构方面的相关知识,尤其是封装的组件

  • 架构师工作内容简要介绍:

  • 搭建高可用的框架:

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

发布于: 1 小时前阅读数: 3
用户头像

一位攻城狮的自我修养 2021.04.06 加入

分享技术干货,面试题和攻城狮故事。 你的关注支持是我持续进步的最大动力! https://github.com/ChovaVea

评论

发布
暂无评论
个人经验:谈谈要想成为一位优秀的程序员,一定要做好的几个方面