前言
成爲一名優秀的Android開發,需要一份完備的知識體系,在這裏,讓我們一起成長爲自己所想的那樣~。
在學習一個技術之前,判斷一個技術是不是真正有價值?一個技術是不是值得我們花費足夠的精力去深挖?是非常重要的,關鍵就在於在未來幾年甚至十幾年,它是否能真正地解決項目研發過程中的一些痛點,讓企業的收益最大化。而且,「個人的技術成長(硬實力)與軟技能(軟實力)是密切相關的」,可以這麼說,「要想保持長久的技術提升效能與持續成長,就必須有全面、強大的軟實力做支撐」。
從我們認知的整個思維結構上來說,軟技能是比數據結構與算法、計算機基礎更加底層的東西。「越底層的東西它的持久力、生命力以及帶給我們的收益就越大」,並且,從某種程度上來說,軟技能的學習比算法、計算機基礎這些底層知識的學習難度要低不少,所以,這就是我爲什麼一直要在每週堅持抽出20%的時間去系統地學習軟實力方面的內容。
在軟技能的知識體系中,對於我們程序員來說最重要的莫過於學習方法了。我們應該如何釋放自己的內在潛力去像海綿一樣地吸收知識呢?在本篇文章中我們將深入探討如何成爲一個頂尖的學習者。
一、如何成爲一個高段位的學習者?
1、建構式的學習模式
❝對問題的好奇、對答案的渴望,是驅動我們學習和探索的主要動力。
❞
「知識不是簡單的記憶,而是由我們主動地去建構而來的」。我們必須充分利用現有的知識,在主動性目標或核心問題的引導下去積極地進行探索,只有這樣,我們才能夠把得到的新知識與舊知識糅合在一起,並在頭腦中建構出新的知識體系。
「一個好的長時程問題,能讓我們成爲“構建者”,因爲我們不僅在學習知識,還在“建構答案”,在努力回答問題的過程中,我們篩選、評判與整合新舊知識,並把它們融匯而成一個知識體系。」
「一個好的長時程問題,能讓我們成爲“探索者”,主動地去探求未知的領域,擴寬“未知的未知”的邊界,而不是僅僅滿足於對現成的、邊界明晰的知識的掌握。」
因此,「提出一個深入的探索性問題是一種學習效果非常好的方法」。在問題牽引下的學習,會幫助我們連續不斷地構築着知識之間的聯繫,最終便會形成針對於該問題的思維導圖之解。
「提問是將我們引向深度學習的起點。一位優秀的學習者,一定同時也是一個優秀的提問者,他會從閱讀、觀察、思考的過程中產生問題,先解答表層的、容易的那部分,留下深度的、探索式的問題給自己,並在由此問題招致的持續困擾和折磨中開啓卓越的心智旅程。」
2、通過解碼,深入事物的深層
我們不要只做信息的搬運工,而應該通過解碼,去深入事物的深層。
一個高段位的學習者,通常都是一個適應性專家,他們可以有意識地構築一個信息解碼與知識擴展的良性循環—不斷地從一些高質量的學習資料中通過 「學習、思考、實踐」 去獲取深度知識以擴展與修正我們現有的知識體系。最常見的一些高效的解碼方式有如下三種:
1)、「不僅要去尋結論,更要去尋過程」:不言而喻,過程比結論更加重要。
2)、「不僅要去做歸納,更要去做擴展」:歸納的同時,我們應當注重保留其中的核心知識與關鍵細節。
3)、「不僅要去比較相似,更要去比較不同」:不同纔有知識,纔有新意,纔有新的發現,才能實現真正地自我提升,在差別中我們首先應當選擇最受強調的東西,這不僅僅是因爲它們最引人注目,而且是因爲它們也最富有啓發性。
而這,大概就是解碼的要法了。
3、技能—纔是學習的終點
只有最後能夠作用於現實的學習,纔是唯一有效的學習。最有效的學習方式,即「做中學」,它是學習真正爲我所用的關鍵一步。
目前「最有效的兩種通用學習方式」:
1)、「不斷地測試練習」:即高頻次的重複練習。
2)、「分散練習」:分散練習即在一個較長的時期內使用較長時間間隔的分佈式訓練,,例如「1小時、1天、1周、1個月、3個月」的時間間隔。
獲得技能也就意味着我們擁有了改變世界的能力,哪怕一開始這種能力非常弱小。「高效實踐的方式有三種」,如下所示:
1)、寫作式練習
寫作是一種「典型的知識建構或重構活動」。一篇文章如果要被人讀懂、要把人說服,需要縝密的思維、清晰的表達和翔實的依據,這些都需要我們對知識的編碼與組織達到一個相對較高的水準。
而寫作的另一個優勢在於能「獲得外界的反饋」,我們可以「根據讀者的評論去提取出對我們有用的信息,以此來完善或修正我們的知識體系」。
2)、遊戲式練習
我們可以「使用“思想實驗”來實現一個虛擬的遊戲式練習」,思想實驗就是構造一個現實中並不存在的假想情境,然後運用所學的知識,來設想事物在這個情境中的變化。在這樣的練習中,我們往往可以得到比原先更爲深刻的洞見。
3)、設計式練習
調用已有的知識,「設計某一種解決方案,來解決某個特定的問題」。這種練習我們通常會在架構與系統設計方面應用的比較多。
可以看出,「知識的練習迫使我們對現有的知識進行更加深入的審視,對現實的情境和問題進行更加細微的觀察,並且致力於創造兩者之間的關聯。它使我們不再固守書本,不再去做僵化的記憶,而是讓我們賦予知識以靈性,以更好地適應這個變化莫測的世界」。
4、調整努力的姿勢
具備成長性心智的人,會比平常人成長地更快,它們都堅信——「只要夠努力,就能變得更好」。以大多數人的努力程度之低,根本輪不到拼天賦。根據當前的神經科學的研究表明,「人的大腦具有相當大的可塑性,因此後天的努力對人的改造作用可以是驚人的」。
我們在不斷地學習和思考的過程中,其大腦內部會產生劇烈的神經活動,這迫使腦神經之間建立了更多的連接。隨着神經元之間連接越來越多,我們對問題的認識也就越來越深刻,遇到類似的問題反應也會越來越快。不僅如此,甚至還能觸類旁通,舉一反三,乃至和其他的領域結合,產生創新性的想法。
「努力,不是一場意志力的較量,而是一種需要學習的策略」。努力本身是一種具有策略性的活動,這體現在如下「三個方面」:
1)、「個人資源的調配。」
2)、「行動方向的選擇。」
3)、「執行進度的把控和調適。」
而這種策略是需要我們不斷地學習與優化的。
5、專注在一個領域走到最後
在這個互聯網上,信息是爆炸的,知識是過載的,觀點是鼓譟的,熱點是速朽的。而反過來,「專注在一件事上,精益求精、持之以恆的態度和行動,則是最爲稀少與珍貴的。」
我一直都相信一句話——「具備突出的優點比沒有明顯的弱點要重要的多」。對此,我自然而然地就想到了業界常說的“T”型人才,要高效地成長爲“T”型人才,我們得先做出那一豎,即「應先在某一領域深入鑽研後再去涉獵其他領域,這樣更能觸類旁通,對提升那一橫的含金量也很有好處。」
而不少事實也證明了,「淺嘗輒止的人很可能將一無所獲,而專注投入走到最後的人將會獲得超額收益。並且,每個人的精力都是有限的,如果你不專注,就很有可能永遠在多個“緩慢起步期”徘徊。」
並且,人是無法做到十全十美的,因爲可提升的方面實在太多,在有限的精力與時間之下,我們只能竭力發揮自己的優勢,將其發揮到淋漓盡致。對此,我們需要「學習齊白石先生那種長期專注和一絲不苟的精神,去把一件事情做到極致。」
6、花費20%的時間去涉獵不同領域的知識
「學習高手通常都會有意識地把不同領域甚至不同學科的知識擺放在一起,然後嘗試去分析、比對它們之間的潛在關聯,甚至當那異質的素材堆疊在一起時,僅僅是潛意識的推動,就可以讓這種隱藏的關係浮出水面。」
在當今,有很多醫學的難題長期無法解決或者沒有進展的一個主要原因就由於大多數的醫學研究者因爲多年專業教育塑造的知識壁壘導致缺乏足夠的知識廣度而造成的。
因此,我們需要需要去花費20%的時間去涉獵不同領域的知識。在學習時間的分配上,我通常會採用「二八分配」的原則,即把80%的時間專注在主業上,把剩餘的20%的時間用來去接觸各種不同領域的知識或補足自己的知識短板。
知識短板會嚴重阻礙我們進步。準確識別它們的最佳方式之一就是「看看自己在哪些工作上花費了大量時間,或者一直進行重複性的勞動」。例如沒有掌握鍵盤快捷鍵可能就是一個知識短板。
7、構建呈階梯式難度的關卡
人是需要一些挫折、失敗或者高難度的挑戰來刺激的。如果總是一帆風順,就會一直待在自己的“舒適區”裏不肯出來,潛能就無法被充分地激發。
因此,我們應該「爲自己的學習適當地增加必要的難度,例如在學完知識後延遲一段時間再做練習,而這種稍難得考驗正好能強化我們對這些知識的存儲和構建。」
我們應該學會去「構建適合自己的“個人挑戰階梯”」,拿學英語來說,一個比較好的”英語學習挑戰階段“如下所示:
背單詞 => 考託福 => 考 GRE => 聽英語電臺(VOA、BBC)=> 聽各種地方口音的英文 => 英語脫口秀
複製代碼
遇到的挑戰越大,獲得的快感也越強。好的挑戰階梯的設計能夠給與我們足夠的挫折與失敗,而這將會大大加速我們的成長速度。
「我們應該做一個主動探索的學習者,不斷地爲自己設計出有難度的”非標準動作“,在挑戰中獲得才能的提升與飛躍。」
8、如何更加高效地讀書?
要想真正掌握一本書的核心內容,需要讀三遍。
第一遍:「細讀,目的在於完整閱讀全書,並且劃出重點,寫上讀書筆記。」
一個月後讀第二遍:「掃讀,主要快速翻閱第一遍閱讀時做的筆記和劃的重點,目的在於加深記憶。」
半年後第三遍:「憶讀,讀的時候只看目錄,然後去回想內容,如果回想不起來,再去進行掃讀。這樣三遍下來,基本上一本書的核心內容就能夠很好的吸收。」
9、切忌完美主義
學習不是要麼0分,要麼100分的。80分是收穫,60分是收穫,20分也是收穫,「有收穫纔是最重要」。但是因爲着眼於自己的不完美,最終放棄了,那就是徹底的0分了。
「不完美其實是常態,根本不會影響我們學習更多更深入的內容」。但是在自學過程中,很多同學卻要求自己在自己制定的每一步計劃中都達到“完美”,才進行下一步。最終結果,通常都是“放棄”。
而不要“完美主義”,不代表學習可以草率前行。「每個人都必須要找到適合自己的學習節奏」。如果在自己又因爲自己的學習進度而沮喪的時候,問自己一句:是不是自己又犯“完美主義”的毛病了。
10、不要過度“學習路徑依賴”,學習要衝着自己的目標去。
例如想學機器學習,就去直接學習機器學習。學習過程中發現自己的數學不夠用,再回頭補數學即可。例如我之前在寫 深入探索 Android 內存優化(煉獄級別) 與 深入探索 Android 包體積優化(匠心製作) 時,發現有不少優化方式都使用到了「編譯插樁 + Gradle 自動化構建」相關的技術,因此,我又回過頭去系統學習了編譯插樁與 Gradle 自動化構建的知識。
11、不要迷信權威的“好”教材、不要看不起“薄薄”的“傻”教材
每個人必須要去探索學習如何尋找適合自己的學習材料。適合你的教材不一定是權威的,「可能有一些你看不起的學習材料,就是是你入門某個領域的關鍵。」
「先用薄教材入門,再找“厚”教材,是我百試不爽的學習方法。因爲“薄”的教材能讓你以最快的速度看完,對整個學科有一個全盤的認識,薄會將你入門這個領域的難度降至最低,短期學習完之後會讓你產生更多的興趣與成就感。這一點往往更加重要,因爲學習,不是100m短跑,而是加長版的馬拉松。」
12、不要迷信單一教材。
在大多數情況下,學習不是一本固定教材可以搞定的。非要找到一本“最適合自己的”教材,然後就一頭扎進去,其實是不科學的。
建議每一個技術點都需要「篩選多個優秀資源去進行 學習、實踐、思考、總結。因爲不同的作者對同一個事物會從不同的角度做解讀,這能夠幫助你更深刻的認識一個概念。」
13、學會覆盤
「在每天晚上睡覺的前半小時之內,我們需要覆盤當天的學習情況,哪些完成哪些沒完成的需要記錄,爲明天做一個銜接的準備,以確保當前的學習進度是可控的。」
14、量變到質變
僅僅對着一個問題思考,很多時候都是死衚衕。因爲我們見識的還不夠多,就不足以幫助我們去總結出更加“普遍”問題解決的規律。
我們不要企圖通過一個問題就理解問題的本質,這其實和企圖通過一本教材就精通一個領域的想法是一樣的,是不現實的。
其實大多數問題,都是需要“回頭看”的。對一個領域理解的越深入,回頭再去看那些曾經的問題,都會產生新的視角,對於很多曾經想不明白的問題也豁然開朗。這也是“進步”的根源。「很多時候,你發現對一些問題“百思不得其解”,或許不是因爲自己“笨”,而是因爲“還不夠努力”。」
二、如何分析問題?
1、分析問題的重要性
只有「挖掘出問題的核心和根本」,才能針對性地剔除改進或者完善流程,來避免類似的問題再次出現。
2、5WHY 分析法
核心是「追究根本原因」。例如針對線上的屏幕適配問題,我們可以提出五種對應的改進方案:
1)、開發者要吸取經驗,儘量採用普適性較強的寫法。
2)、對一些組件進行封裝,避免類似的適配問題。
3)、有新設備上市,要儘早採購。
4)、QA 的測試用例要多人評審,儘量保證用例覆蓋全面。
5)、通過一些自動化檢測手段,對適配問題進行檢測。
3、第一性原理
有問題時,運用第一性原理,多讀官方文檔或源碼。閱讀源碼的本質:優秀框架背後的「設計模式與架構」。
此外,對於一些難以用技術解決的問題,可以從需求的角度去解決。
三、學習十步法
對技術人成長最重要的三個因素通常都包含如下三個要點:
1)、「學習-不斷提升自身深度與廣度的能力」。
2)、「思考-即解決問題的能力」。
3)、「實踐-大量的實踐能讓我們真正地理解一個技術的本質」。
而學習十步法的精髓就在於「學習-實踐-(思考出問題-學習-實踐)-掌握-教授」這一系列過程。注意()內的過程(這個過程也被稱爲探索)通常需要多次反覆進行直到最終掌握這個技術點。
「學習十步法充分利用了人天生的好奇心來幫助我們吸收更多的知識,這將會持續不斷的激勵我們通過實踐向着目標前進,而不僅僅是讀書或者聽教學視頻。」
在開始使用學習十步法之前,首先需要明確的是,「學習計劃最好能結合工作計劃,理論結合實際,快速學以致用」。因此我們應該「優先學習的是工作中會用到的或將會用到的技能」。在完成了自己的本職工作之後,我們應該去儘量地考量公司中各個系統和業務模塊,看看有哪些不合理和可以改進的地方,然後盡力地提升自己相關方面的技術,並去識別和優化它們,在優化的過程中我們可以優先參考其它公司的技術方案。
1、瞭解全局
瞭解全局的作用在於我們可以「快速甄別,決定哪些事情值得花費時間」,例如「做一些基礎性的研究,例如網絡搜索、查閱一下該主題的書的介紹性章節。」
2、確定範圍
我們應該「聚焦學習範圍,關注重點內容」。這兒需要充分利用自己在第1步中收集到的信息,找出自己的學習範圍,也可以藉助自己的學習理由來決定學習的範圍。
選擇一個專注而聚焦的範圍,「明確學習範圍的時候需要儘可能地充分考慮時間因素與衡量時間成本的性價比。」
那麼,如何衡量時間成本的性價比呢?
1)、「評估掌握一項技能在短期和長期內對我們的重要性。」
2)、「我們應該對需求和時間成本評估,決定需不需要學,以此確定學習的目標。」
3)、「一些簡單、僅僅需要了解的知識點利用碎片時間去完成即可,但如果是需要掌握甚至“精通”的一些知識點,我們需要爲它劃分出一整段的時間。」
此外,在這一步中,有兩個點需要注意:
1)、有些知識的獲取是需要「循環漸進」的,除非你已經有了非常紮實的基礎,否則跳級進階只能是吃力不討好。
2)、有些知識點例如「源碼、晦澀的一些概念」等等,只要它們是足夠「重要」的,弄明白它們就是「非常值得」的。
3、定義目標
好的成功目標應該是「具體的、無二義性」的。例如在學習 ASM + Gradle 時,我定義的目標是:使用 ASM + Gradle 完成一個全局的 Bitmap 監控組件。
4、尋找資源
目前,我學習的主要信息來源包括如下 「九個渠道」:
1、「官方文檔」:第一手資料。
2、「源碼」:第一手資料。
3、「Github 開源項目」:定期查看 GitHub 的熱門榜,看有沒有需要的優質項目(至少每週一次)。
4、「Awesome-Android-NoteBook && 豆瓣讀書 - 計算機科學經典書籍」。
5、「開源的權威資料」:例如《On Java8》即 Java 編程思想 (第五版)。
6、「極客時間」
7、「慕課網」
8、「百度雲盤」
9、「WanAndroid 優秀文章」
在這一步,記得也要尋求一些好的薄教材/入門文章,在我們剛開始學習這個主題時,便會從它們開始。
5、創建學習計劃
我們需要「根據自己個人的時間去制定適合自己的學習計劃」。這一步我們可以把它看作自己寫書時候的大綱,這裏通常可以通過查閱圖書的目錄進行。
6、篩選資源
計劃學習前要考慮清楚,一旦開始執行學習計劃,就應儘量保持少的變更,除非後續發現計劃有問題。因此這裏我們需要多加一步去「選取品質最高的資源覆蓋學習計劃,對於一些購買性的資源可以通過查看評論的方式進行評估。」
7、開始學習,淺嘗輒止
這一步的關鍵在於「過猶不及」。你會很容易就失去自控力,開始消化計劃學習中列出的所有資源。但是,你會發現,如果你能經受住這樣的誘惑,你會取得更大的成就。我們應該要「專注於掌握自己所需的、能在下一步動手操作的最小量的知識。」
「好記性不如爛筆頭」,在學習的過程中,學習的東西至少要做好筆記(印象筆記、有道雲筆記),並且後續需要「按照一定的間隔時間去反覆複習」。
8、動手操作,邊玩邊學
❝萬事無他,唯手熟爾。教育的首要目標,並不在於”知“,而在於”行“。
❞
對於計算機領域的學習來說,教材的意義其實遠遠小於實踐的意義。真正動手實踐去編程是異常重要的。這就好比學游泳,必須下水去游泳;或者學開車,必須親自上路。否則你說的再頭頭是道,一個小學生文化水平的人,只要他開過車,遊過泳,都能在這兩個領域瞬間秒殺你。
真正的學習上的提高,就發生在實踐的過程之中。例如,「debug 就是一種高效的實踐方式。它不僅僅是找到代碼錯誤,解決錯誤的手段,其實更是一個重要的學習手段。」
因此,我們應該「通過探索和實踐進行學習,在實踐中碰到的問題會引導着我們走向真正重要的方向。當回過頭尋找問題的答案時,不只是這些問題迎刃而解,而且你記得的東西比你學習到的東西多得多,因爲你所學到的都是對你很重要的東西。」
此外,在實踐中,「在某些關鍵動作上刻意練習,也會取得事半功倍的效果」。因爲不停的練習和思考可以改變大腦結構,大腦像肌肉一樣,挑戰越大,影響越大,學習更高效,並且也會產生突破性。
9、全面掌握,學以致用
我們「沒有必要吧收集到的所有資源全部仔細看一遍,而應該以解決在動手操作中發現的問題爲主要目的」。試着把自己正在學習的內容與最終目標關聯起來。「你掌握的每個模塊,都應該以某種方式推動着你向着終極目標前進。」
在這一步中,我們可以將測試練習與分散練習這兩種學習方式結合起來使用,以達到最佳的學習效果。同時,我們最好能給自己設置一系列的挑戰階梯,例如對於學習音視頻的同學可以給自己設置如下的挑戰階梯:
使用 Android 音視頻 API實現一個播放器 => 使用 FFmpeg 與 OpenGL 實現一個播放器 => 定製 FFmpeg 的源碼、掌握 OpenGL/Vulkan 的高階用法實現功能更加強大的播放器
複製代碼
學習某一個技術其實到最後會形成一顆「技術樹」,我們可以使用「思維導圖 => XMind || 幕布」進行描述。而對於一些涉及「流程」相關的技術點,我們可以使用「ProcessOn」來畫流程圖。
10、樂爲人師,融合貫通
❝如果你能將自己所學的東西都教給別人,那麼你不僅能夠記住,而且還能夠理解得更加深刻。
❞
重點在於,我們需要花時間將自己所學到的東西從大腦中提取出來,以別人能夠理解的方式組織起來。「在經歷了這整個過程之後你會發現,有很多你以爲自己明白了的知識點,其實並沒有摸透。這一步對保持信息以及深入理解知識而不僅僅只是流於表面至關重要。」
在教學的過程中,有一些內容是必不可少的,例如:
「是什麼?」
「爲什麼?即它解決了什麼問題。」
「優缺點。」
「對比同類技術的不同/相同點。」
「如何使用?」
「如何解決問題的?即內部的實現原理。」
「歸納時注重核心知識與關鍵細節,並嘗試去類比不同領域或不同學科之間的知識。」
「重要的過程、結論。」
分享就是一種很好的教學方式,而且它的時間成本也相對較低,目前常見的有「三種分享方式」:
1)、「博文文章/專欄」
2)、「慕課網技術視頻」
3)、「部門/社區內的技術分享」
技術分享的真正意義在於,「總有一部分知識我們並沒有真正理解透徹到可以向別人解釋,而”教“的過程能夠迫使你面對這一部分。在教別人的時候,我們迫使自己面對課題中的難點,深入探索,從只知皮毛變成完全理解。學習知識暫時的,而理解是永久性的。」
「在我們試圖教別人的時候,會強迫自己重新組織大腦中的資料」。最好的思維方法就是解釋某樣東西並將其記錄在紙上,或者記錄到 Word 文件或者幻燈片中,使你可以將這些互不連貫的碎片信息收集起來,並以一種有效的方法重新組織起來。「要想教人,我們得先把自己教會。」
而在教別人的過程中,最好的教學方式就是「心態謙卑,信心滿滿——以謙虛的視角來觀察問題,以權威的口吻去詮釋問題。」
最後,不要忘記進行隔期複習,對於一篇文章來說,可以「先擴展出它的知識樹,然後再嘗試去描述其中每一個知識節點的核心內容與關鍵細節。」
❝開源自己造的輪子也是一種很好的分享方式,我們應該學會造輪子,去寫一些框架或組件,建議設置簡單到複雜的挑戰階梯。
❞
最後,我就以最近正在學習的 Android 網絡優化爲例來實踐一下十步學習法,其思維導圖如下所示:
四、重要問題解答專區
1、怎樣由淺入深地學習一個技術點?
建議大家先選定一個自己最感興趣的方向,後面一段時間就專攻這一個方向,拿 Flutter 做例子,可以先將所有 Flutter 相關的專業文檔、優秀書籍、視頻教程、文章等蒐集起來,將其中涉及的知識大綱列出來,對其中涉及到的每一個知識點(如今天或這幾天要學的是佈局類組件)需要的對應資料列出來。然後去學習、實踐它的基本用法,接着可以再深入一層看這個知識點涉及到的內部原理(如 Flutter 中常用佈局的實現原理),最後總結出對應的學習筆記(供以後複習)。這樣學習起來就比較有效果,而且剛開始可以根據自身的狀態去調節計劃時間的長短,建議開始計劃定鬆一點,確保每天都能完成。養成習慣並完全適應後,可以加大學習量。這就跟健身的原理一樣,剛開始鍛鍊的人一般都體質比較差,所以需要從最基礎的動作開始練,等將基礎打好了,體質提升上來了,才能去適當地做一些力量訓練,增加肌肉。
2、怎樣才能很好地把安卓零碎的知識點串起來?
這可能說明學習的時候沒有注重體系化地學習與思考,而是東學一點西學一點,那這些知識自然而然地會零散地遍佈在我們腦海的各處。爲了解決這個問題,我們需要首先需要把目前所學的知識列出來,然後可儘可能地找到這些知識點的聯繫,把它做成思維導圖。由於可能有很多聯繫點我們之前學習的疏漏而沒有把它納入我們的腦海中,但是,這並無大礙,後面我們可以圍繞這張 1.0版本的安卓知識思維導圖 不斷迭代,最終,它就會日漸完善,發揮出想象不到的威力~
3、對未來很迷茫,天天都在學習但是技術就是提升不上去?
其實,對於大家來說,最重要的事情就是 如何去從最本質、最底層的層面去打磨自己?如何培養興趣、深入鑽研某一個領域從而成爲專家?如何具備快速、高效、不斷深挖某一技術的核心能力(即一通百通的能力)?這些問題的答案很難在短時間讓大家去明白、理解。其實,我「今年的整個文章路線」就是圍繞這些內容而定製的,其共分爲幾個核心路線:「軟技能、高效構建算法知識地圖、性能優化領域專家、NDK 高手之路(偏向於 Native 層的性能優化、Hook 實現)、Flutter(從最重要的核心點 自上而下打通 Flutter 的整個架構體系)」 ,明年上半年的路線:架構師成長之路(從易到難具備強大的架構設計能力) 。可能有的同學認爲我學的好像很雜,其實不然,我一直都專注於一條路線,就是「基礎架構研發」,它涉及的主要工作內容就是「架構設計、性能優化、前沿新技術預研(Flutter、JetPack」)。建議大家選定一條路線,也不一定要是上面的路線,專注於音視頻、圖形處理 或 AI 移動、大前端 的路線都可以,今年大家一起加油,希望年底能給自己一份滿意的答卷~
4、如何更高效地學習技術視頻?
學習視頻的時候建議「開 2 倍速看,對於 不熟悉/偏難 的知識,每看一個小的技術點之後,就實踐一遍,然後把實踐的成果寫入 筆記/你的初稿博客 中,對於 比較熟悉/簡單 的知識,一般是看一小節/兩三個技術點之後再實踐、寫入 筆記/你的初稿博客。」
5、如何選擇第三方庫?
1)、確定這個庫是否是必需的。
2)、這個庫能否帶來開發效率的提升,降低代碼的維護成本。
3)、這個庫的學習成本如何 比如 rxjava 其實學習成本會相對高一些。
4)、這個庫的質量如何,不要僅僅看 star,更要看 issue 的處理情況。
6、怎樣練習算法題?
1)、每道算法題都先自己去實現,理清思路後自己去實現一遍。(超過5分鐘沒思路跳下一步)
2)、然後再看看答案,記住答案的思路,手寫一遍。
3)、第二天再重新按照答案的思路再手寫一遍。
4)、等到要面試的時候再系統地將所有的題型按類別進行手寫即可。
7、如何閱讀源碼?
1)、準備
1、Java設計模式(模板方法,單例,觀察者,工廠方法,代理,策略,裝飾者)。
2、Java高級相關(泛型、反射、IO)。
3、在官方文檔上了解軟件的整體架構設計、主要功能。
4、熟練掌握這個庫。
5、搭建系統,把源碼跑起來。
2)、開始閱讀
1、根據你對系統的理解,設計幾個主要的測試案例,定義好輸入,輸出。(Debug一 遍肯定是不行的,需要Debug很多遍)
2、第一篇拋棄細節,抓住主要流程,第二篇,第三篇,再去看各個部分的細節。
3、閱讀的時候同時使用 UML 畫出系統的類圖。主要的測試案例明白了,豐富測試案例,考慮一些分支。
4、這一步會非常非常地花費時間,但是你做完了,對系統的理解絕對有質的飛躍。
3)、流程小結
1、準備。
2、網上搜索針對該開源項目進行分析的優秀文章。
3、對開源項目提出自己的疑問,並帶着疑問閱讀源碼。
4、閱讀源碼過程中多添加註釋、筆記.
5、做閱讀總結/寫文章,吸收和再創造
8、新技術頻繁出現,我們應該採取有效的針對性措施?
一項新技術的出現,我們應該先去了解它,看它是否對自身的技術成長有比較大的幫助,有的話按優先級加入學習計劃表,而不是立馬去學習或否定它。
五、總結
對於大多數人來說,可能關鍵不在於學習方式的優劣,而在於「如何不痛苦地堅持下去」。而要解決這個問題,最大的利器便是興趣。「只有真正深入到一個領域,才能培養出對其的真正興趣。如果對一件事的瞭解不深、不透,總是淺嘗輒止,那自然體會不到這件事的妙處,也自然不會產生持久的興趣。這讓人容易滑入一個死循環:瞭解不夠導致興趣不足,而興趣不足又無法加深對它的瞭解。」
「如果我能長期地堅持去做一件事,一定是這件事帶給我的豐盈感和滿足感超過了我的所有付出,一定是這件事日日夜夜縈繞在我的心頭讓我欲罷不能,一定是這件事喚起了我內心深處最強烈的興趣」。也就是說,賜予我力量的,是激情的驅動,而不是意志力的鞭策。但是,熱情很難一直存在,因此,在熱情黯淡的時期,需要我們有一定的自控力去做支撐過渡。因此,如何練就強大的自控力也是需要我們去不斷深入探索的一個問題。
作者:jsonchao
鏈接:https://juejin.im/post/5eb168e9f265da7bb65fb27a
關注我獲取更多知識或者投稿