我的經驗:談談要想成爲一位優秀的程序員,必定要作好的幾個方面
如何成爲一名優秀的程序員
如何快速成長
- 要寫代碼先看代碼
- 好的代碼讓人看到時能夠快速瞭解,而且可以抓住主要設計精髓
- 多看代碼,保持代碼的敏感度
- 寫代碼時,多作總結
- 寫的代碼要體現設計的思想
如何提高技術
- 瞭解項目中架構方面的相關知識,尤爲是封裝的組件
- 架構師工做內容簡要介紹:
- 搭建高可用的框架:
- 搭建數據庫時,要考慮若是一臺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算法)
- 動態規劃算法
- 樸素貝葉斯分類算法
![在這裏插入圖片描述](http://static.javashuo.com/static/loading.gif)
算法部分
- 二分搜索: Binary Search
- 分治: Divide Conquer
- 寬度優先搜索: Breadth First Search
- 深度優先搜索: Depth First Search
- 回溯法: Backtracking
- 雙指針: Two Pointers
- 動態規劃: Dynamic Programming
- 掃描線: Scan-line algorithm
- 快排: Qiuck Sort
![-](http://static.javashuo.com/static/loading.gif)
數據結構部分
- 棧: Stack
- 隊列: Queue
- 鏈表: Linked List
- 數組: Array
- 哈希表: Hash Table
- 二叉樹: Binary Tree
- 堆: Heap
- 並查集: Union Find
- 字典樹: Trie
![在這裏插入圖片描述](http://static.javashuo.com/static/loading.gif)
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完成對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
歡迎關注本站公眾號,獲取更多信息