[TOC] ## 開篇 對於一門新技術或者開源專案如何從頭開始學習?相信每個人都有不同的想法和見解,**下面談談我個人的想法和實踐** ## 萬變不離其宗 無論你學習的新知識是什麼,首先可以簡單的百度 google一下,比如我想要學習netty,那麼就搜尋 "netty 介紹",讀完過後,一定要去官方網站看一下。一般的開源專案都放在github上,且有一個readMe.md檔案,我建議你一定要去讀一遍。因為官網上的文件資訊一定是最全最新的,所有其他網站的資料,幾乎都是從官網上搬運過去的,且很有可能相關資料已經過時。 **無論怎樣,對於一門新知識的學習,建議你一定要去官網上看一下文件** ## 重量級知識 這裡的“重量級知識”是指有難度,有深度,且相對不容易掌握的知識,例如elasticsearch、netty、Java多執行緒、JVM底層,這些知識的學習是需要時間沉澱的,不可能一蹴而就。 這些知識,往往不是簡單掌握用法、API即可,不然很有可能會埋坑,且在將來某個時間爆發。 就拿我親身經歷來說,以前我們有個專案需要使用elasticsearch,且該專案非常緊急,我和另一個同事之前都沒有任何elasticsearch相關經驗,我們從網上簡單瞭解並學習相關elasticsearch api過後,就直接在專案中使用,而我們判斷elasticsearch是否正確使用的依據,就是 業務 “CRUD” 相關功能是否正常。 受益於elasticsearch開箱即用,我和同事順利的完成了相關任務,但是隨著我深入學習elasticsearch,我發現我們寫的程式碼存在不少問題 1. elasticsearch沒有配置任何mapping,使用的是預設的dynamic mapping,且沒有任何設定 2. 資料分片沒有配置,預設只有5個分片,且副本為1,按照官網的資訊,1個分片應該最多不超過50G資料,否則大分片在reindex和故障修復時會很慢,且不穩定 3. 我們使用的相關elasticsearch API存在不少效能問題,在業務允許的情況下,應該優先使用filter查詢 4. 應該提高refresh的預設值,以提升寫入速度 5. ... 很多很多問題 雖然我們順利的完成了任務,但是我們的程式碼存在很多問題,且在資料量大的情況下,很致命。(後來已修復) 一件事情,往往有兩面性,像elasticsearch開箱即用功能,非常容易上手,簡單部署一下,再呼叫相關API,就能實現 “CRUD”,但是便利的背後卻是一大堆問題,如果你不深入學習elasticsearch,包括它的分片、mapping、索引別名、分詞器、routing、template、filter過濾器、聚合、JVM記憶體設定、叢集、冷熱資料、副本、kibana、logstash等等。即使現在你的程式碼沒有任何問題,能夠執行,將來在某個時刻,你一定會為你的行為買單! 因此,對於這些“重量級知識”,我建議你一定要深入學習,並且長時間積累,形成體系。並把一些重要的知識點和坑記錄下來,以免忘記。 就拿我學習elasticsearch而言,因為我們專案嚴重依賴elasticsearch,且資料量不少,因此過年期間我專注於elasticsearch。且後續不斷積累相關知識,我的學習步驟如下 首先看官方文件,且在學習的過程中,一直穿插著在看官方文件 ,由於elasticsearch知識點很多,官網的文件也非常多,剛開始學習的時候,僅僅看官網文件,進展很慢,因為一些elasticsearch術語、行話不是很瞭解,所以是一邊看視訊、部落格、公眾號、一邊看官方文件。 1. 看完極客時間 阮一鳴老師 “Elasticsearch核心技術與實戰”(因為當時剛好出了這門課程),但是這門主要講解如何使用,相關api講解較多 2. 看完中華石杉 ES-頂尖高手 基礎篇和高手進階篇,這門課程講解了很多elasticsearch底層原理,受益匪淺 3