Android 築基導論
前言
程式設計這條路能走多遠,能走多久,就看一點:
你學不學的明白
。想學明白,就得看你
會不會學習
,所以程式設計能幹多久,你值多少錢,最終看你
會不會學習
我們從小就學習,但是一旦離開了學校這種壓力環境,你還會學嗎?你還學的進去嗎?軟體行業從業者之間差距就是因為學習效率的不同拉開的
你是不是曾經這樣苦惱過,並且百思不得其解:
-
為啥大廠校招比社招的人多?
-
為啥大廠只要基礎好的畢業生?
-
為啥矽谷面試只問資料結構和演算法?
-
為啥大廠要給新人安排導師、引路人?
-
為啥大廠新人成長這兒快,別人半年頂我3年?
-
為啥我5年經驗不如大廠裡幹1年的小鮮肉?
這些問題曾經一直困擾著我,冥冥中有個聲音告訴我,你要是找到了答案,從此康莊大道、任你傲遊、你也能達到那令你羨慕、憧憬的高度!歷經多次思考,到今年我總算是差不多略順了前前後後,今天發出來大家鑑賞一下
今天分享一下,包括一些學習資料,但是更重要的是明明白白的告訴大家,你為什麼學不會、怎麼才能學的好、怎麼學習才是效率最高的。聽我之言,Android 2年高階不成問題
學習中常見問題
1. 進退無據,盲目追求最新技術
新技術月月有、日日出、年年新,出來一個你看一個,但是你真的著急學它嗎?你著急在專案中立馬使用嗎?真的讓你用你敢用、你有權利用嗎?
你想過沒有,我還有多少不會的、沒懂的、模糊的、專案急需的、遺留的,難倒那些欠下的技術債你都裝看不見嗎?
你應該清楚哪些是最優先的、哪些是可以放放的,就像專案開發一樣,列個燃盡圖出來,估計你會嚇死。當然能把這個圖列出來也是你的能力,好多人還都列不出來呢。但你若是對這些視而不見,那就是逃避。踏實、務實才應該是我們的日常
2. 胡亂學習,左學一點右學一點
軟體開發是個工程專案,技術也具備和工程專案一樣的特點,那就是技術之間高度融合、相互配合,整個專案是理論和實踐高度結合,技術之間高度融合後的產物
很多人平時怎麼學習?就是看部落格!今天A寫了這個,我就看這個;明天B又寫了那個,我又去看那個。先不說這短時間內來回切換學不同的技術點,你有時間能學明白嗎?單就說這左一下、右一下的,你怎麼形成知識體系?你的學識之間要是不能相互融會貫通,在軟體這個行業那是致命的。尤其是這種左學一點右學一點的方式那是真的會要你命的,這樣學下來1年,我敢說你最多就是學到幾個單獨的知識點罷了,於全域性無補
但恰恰太多的人都是這樣,你們天天喊學習、我學習、白天學、晚上學的,但還是學不會,你就不想想是哪裡出了問題嗎?
3. 不寫筆記,狗熊掰棒子全忘了
我曾經寫過一文 (
),專門論述不寫部落格的後果,那就是狗熊掰棒子學了後面的忘了前面的。大家須知,沒有過目不忘,即便你當時學的再通透,過2月不用,一樣可以忘的一點不剩。你要是努力辛辛苦苦整天看、整天學、一年下來,年關的時候你回憶回憶你還記得多少?樣的學習真的有意義嗎?屬浪費時間罷了!這都算是一種基於焦慮的精神疾病了,是對自己的一種折磨 (>﹏<)
別人的文章是別人的,不代表你看了就是你的了,只能說你知道了有這麼一個知識點。你看為什麼大神們都寫部落格,因為大神們辛苦提煉出來的精華它也會忘,所以的寫部落格出來,一個是分享,一個是在寫文章過程中再提煉提煉,分享出來還能有名望
4. 基礎薄弱,原理、原始碼我就是學不會
很有朋友都看原理,看原始碼的吧:
- OKHttp 原始碼看不懂,執行緒池、阻塞佇列我沒學過,網路程式設計的點也不懂,設計模式也只是聽過,我不理解為啥類要設計的這麼複雜,要有這麼多類
- Glide 原始碼看不懂,設計模式忘了,不理解類結構為什麼這麼設計,都說好,但是我就是不理解好在哪
- MMKV 根本就看不懂,到底怎麼實現的快速檔案儲存的?去看原理,虛擬記憶體、檔案對映、mmap 這都啥玩意,聽都沒聽過
- AMS 怎麼執行的,系統服務都是怎麼跑起來的,Binder 通訊怎麼做的,看了很多文章就是不明白
- 自定義 View 練了好些次了,怎麼就是還是不會呢,canvas,paint 怎麼就是不會使呢
- 哎,這個效果好贊,怎麼畫出來的
- 影片播放好高深呀,怎麼做的?看文章一點也看不懂哎,產品讓我在播放器頁面加點東西,但這個怎麼改,播放器樣式不都寫死的,我只會在上面好來加一個蒙版,但是我看大神們都是自己定製的播放器,好高深啊
5. 反推式學習
- 今天看 MMKV,完全看不懂。找部落格,看到有文章說用到虛擬記憶體。沒聽過,我去看虛擬記憶體,看了好些天,還是不怎麼理解。然後又有文章說用的是檔案對映的原理,看了好些資源終於多少明白點了。但是 mmap() 函式就是不理解。還有使用者空間、核心空間這些。一個月過去,總算是看的差不多了,雖然點看的差不多,但都是半懵不懂,整個知識點串起來也費勁
- 看 OKHttp 原始碼,裡面有執行緒池,還有 Socket,耗時大半個月,總算是把 OKHttp 原始碼囫圇看完了
最可怕的學習方式就是
反推式學習
,你啥也不會的時候就去硬看 OKHttp 原始碼,一般大家都有一些理解力、經驗,淺層程式碼能看個大概,當看到不會的知識點再去看資料,然後再一點點深入,一般都是這麼學的,文章也都是這麼寫的我個人強烈抨擊這種學習方式,OKHttp 是幹什麼的大家都知道吧,實現網路功能的,程式碼很多很複雜的吧,其中肯定會涉及到
網路程式設計、設計模式、多執行緒
知識點,並且這些知識點會綜合應用。很多啥也不會、一點基礎都沒有的小白直接去看 OKHttp 原始碼,這不叫學習,這叫硬看。你一點基礎沒有,即便遇到不會你去查資料,你真的能看懂整個框架嗎?其中設計思路、思想精髓、技術策略你肯定吸收體會不到,這些才是最有價值的部分,面試高玩們也是側重想聽你說這部分太多的人在啥也不會的時候直接去看程式碼成品,而不是先鞏固、學習涉及的基礎、底層知識,我管這種方式叫:
反推式學習
。這種學習方式,及其低效率、難度極高、效果極低。你明明知道會涉及什麼基礎知識,你為什麼不先把這些基礎知識點都看懂了再來看 OKHttp,你沒有和作者相同高度的基礎認知,你是不可能看得懂作者的想法的,你是不會體會到作者感受、作者寫這個框架時的技術思路和決策什麼才是好的學習方式
歷經3年、不停反覆思考、實踐之後的思路,希望對大家有所幫助
1. 學習要有優先順序
不要去管那些天天都出來的新技術,你先放著,就讓別人先趟坑去,你現在學那些令你寸步難行的知識點,這些才是你現在攔路石,時間不要浪費在別處
2. 夯實自己的基礎,先打好基礎再說
太多沒有結果的學習都是因為你基礎不行,既然看不懂那就不要勉強了,應該去看用到的基礎知識。以 OKHttp 為例,看不懂原始碼,那就去猜它用了什麼基礎知識。若是不會,就把
網路程式設計、設計模式、多執行緒
這些基都學會了,再回過頭來看 OKHttp 它不香嗎。有多少看不懂的、還有多少不理解的。你再去看網上那些 OKHttp 的文章,你會罵:這什麼文章、都寫的啥、垃圾、哦~原來是這樣啊、我知道了、我明白了...... 這才是正確的開啟方式3. 集中時間辦大事
不要今天看這個明天看那個的,對於單個知識點,利用短期的集中的時間先把這個點搞定再去幹別的,再去休息。對於大塊的知識點,規劃好時間,集中時間一個個點的啃下來再看別的
4. 系統性學習
程式設計領域的知識點都是相互關聯的,不管是學習階段,還是使用階段都是一樣。割裂的、無法成體系、相互無法印證的散碎知識點對你來說是沒什麼幫助的,該不會的還是不會,你不會真的學明白。學習就必須把一個領域的知識點一次性全部學到位,這才是最正確的展開
我再強調下基礎的重要性
基礎不穩,地動山搖!
好比我們學習數學,大家都是先學:
-
阿拉伯數字 -> 數學符號 -> 加減法 -> 乘除法 -> 九九乘法表 -> 方程式 -> 公式定理
從小我們學習,在學校裡就是從難到深,那為啥放到軟體領域,程式設計行業,我們就忘了呢,大家總是著眼於最頂層的東西,總也看不到技術基礎在哪裡呼喊你趕緊關注它 ┻━┻︵╰(‵□′)╯︵┻━┻
我們平時用的開源框架/庫,這些都是軟體領域最終的成品了,就好比是數學中的
公式定理
,小白學習這些原始碼就是一個剝開
公式定理
外皮一層層深入的過程,隨著學習的深入,這過程是這樣的:-
公式定理 -> 方程式 -> 九九乘法表 -> 乘除法 -> 加減法 -> 數學符號 -> 阿拉伯數字
這個過程就是我上面說的反向學習,在沒完全成熟、完善的、從頭到位的學習課程的技術領域,這個逆向的過程是不可避免的,但是我們必須知道這種逆向學習有多大威海
- 當你越多很多技術文章,你忽然發展了一個技術點,這個好比你看到了一個新的
公式定理
- 你打算深入去學習其中實現原理提升自己水平,那會發現這裡需要
方程式
方面的知識,但是方程式方面的知識我沒學過,也不瞭解,我也不知道有多少知識點,於是我閱讀大量文章,囫圇吐棗的把2元1次方程式學會了,但我其實不知道還有3元1次方程式、3元2次方程式,所以我看著很費勁、費解,總覺得自己能力不行,殊不知其實這裡除了2元1次方程式,還需要3元1次方程式的知識點 - 當我歷經千險終於把2元1次方程式、3元1次方程式的技能樹都點開了,我想再深入的看一下,我突然發展還有一個
九九乘法表
的東西,還好這個東西比較好學,有規律,知識點都在一起很好學 - 但是在我高興的時候,我發現九九乘法表裡還有大量的各種符號和簡單的計算公式,但是這些我都不瞭解哎,於是我一個個對著查詢baidu,又是一陣血雨腥風,終於,半斤八兩的我終於可以能勉強看懂這個符號和公式了
- 但是最終我有對這些數字產生興趣了,沒辦法也不是我想看的,是因為大家都說面試要問,沒辦法只能硬著頭髮花時間查資料去看
以上就是反推式學習的過程,很多時候我們的確能研究到及其指令這一層,但是當我們翻回頭,我很難把這些知識點全部串起來搞清晰,最多我只能比較清晰的明白部分,這就是大多數人學習的常態:
耗費大量時間,總也學不明白,學不通透
但是大家再看,
阿拉伯數字 -> 數學符號 -> 加減法 -> 乘除法 -> 九九乘法表 -> 方程式 -> 公式定理
這些東西就是基礎知識啊,當我們把這些基礎知識都掌握了(網路程式設計、設計模式、作業系統),你再去看這些框架, 你就會時不時大聲呼喊:
原來是這樣啊,我get到了,也沒有太複雜啊,我都大概都串起來了
在程式設計這條路上,逆時針比順時針困難10倍,10倍功1不是危言聳聽,那些學習進步很快的一定基礎都很紮實,再學習各種應用層思路時不會被基礎問題打斷,能完整吸收思想,不用重複多次、反覆學習一個點,這樣才來不快才怪
學習基礎知識還有一個非常NB的地方,就是當你把基礎知識都搞定的時候,一定形成自己的一套行之有效的學習方法,這會讓今後的學習、工作路程走上快車道
基礎紮實的最大現實意義在這裡:
一個網友說:
別人寫好的東西就像一塊糖,你不瞭解也可以吃!
- 當有人問你,這糖甜不甜?你不知道,你只能看別人說甜,你也說甜
- 當有人問你,這糖的成分如何,對人體有沒有傷害?你不知道
- 當有人問你,這糖可以和別的糖一起吃嗎?你不知道
- 當有人問你,這糖切碎了怎麼吃?你不知道
- 當你看見別人給糖加了料,你吃起來覺得非常棒,怎麼做的你一點也看不出、猜不出其中關竅。其實就是加了點蜂蜜而已
- 當你看見別人把好幾種糖切碎了、攪拌在一起,然後加蜂蜜、加檸檬,和蔬菜一起做成沙拉時,你還能說什麼...
現實是我們做的就是沙拉,在於這些原料你怎麼用、會不會用、能不能推陳出新做出新花樣~
隨緣更新!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69983799/viewspace-2732048/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 數論基礎——求導求導
- 計算機導論——資訊保安基礎06計算機
- JavaScript入門①-基礎知識築基JavaScript
- C#.Net築基-基礎知識C#
- 計算理論導論筆記筆記
- C#.Net築基-型別系統①基礎C#型別
- 《演算法導論》演算法
- 計算機導論計算機
- Android探索之旅 | 物件導向和Java基礎Android物件Java
- Java築基 - JNI到底是個啥Java
- C#.Net築基-模式匹配彙總C#模式
- Android網路程式設計:基礎理論彙總Android程式設計
- 演算法導論C語言實現: 演算法基礎演算法C語言
- 1-微服務導論微服務
- SpringIOC 理論推導Spring
- Spark導論(Spark自學一)Spark
- 1資料庫導論資料庫
- 大神之路-起始篇 | 第1章.電腦科學導論之【基礎緒論】學習筆記筆記
- Android 中自定義 View、ViewGroup 理論基礎詳解AndroidView
- Android中自定義View、ViewGroup理論基礎詳解AndroidView
- C#.Net築基-集合知識全解C#
- C#.Net築基-解密委託與事件C#解密事件
- 基於android的智慧導診的設計與實現Android
- 併發程式設計導論程式設計
- 作業系統導論(1)作業系統
- 演算法導論-堆排序演算法排序
- 演算法導論-快速排序演算法排序
- 理論指導實踐薦
- HTTPS 理論基礎及其在 Android 中的最佳實踐HTTPAndroid
- HTTPS理論基礎及其在Android中的最佳實踐HTTPAndroid
- FP-Growth演算法全解析:理論基礎與實戰指導演算法
- 基礎圖論圖論
- 申論——基礎
- 基礎數論
- 圖論基礎圖論
- 前端工程化築基-Node/npm/babel/polyfill/webpack前端NPMBabelWeb
- 《資料探勘導論》讀後感
- 演算法導論-第6章演算法