個人經驗:談談要想成為一位優秀的程式設計師,一定要做好的幾個方面
阿新 • • 發佈:2021-07-05
如何成為一名優秀的程式設計師
- 要儘量接觸程式碼,能看到程式碼,能寫程式碼
如何快速成長
- 要寫程式碼先看程式碼
- 好的程式碼讓人看到時可以快速瞭解,並且能夠抓住主要設計精髓
- 公共庫程式碼
- 核心系統的程式碼: 用到的設計,原理
- 好的程式碼讓人看到時可以快速瞭解,並且能夠抓住主要設計精髓
- 多看程式碼,保持程式碼的敏感度
- 寫程式碼時,多做總結
- 寫的程式碼要體現設計的思想
如何提升技術
- 瞭解專案中架構方面的相關知識,尤其是封裝的元件
- 架構師工作內容簡要介紹:
- 搭建高可用的框架:
- 搭建資料庫時,要考慮如果一臺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