滿滿乾貨,bobo老師誠摯分享:鍛煉內功,高效學習,如果有什麼秘訣的話,那就都在這裡了:)

大家好。我是講師liuyubobobo:)

我的新課程《玩轉數據結構》已經上線了。這是我在慕課網做的第五門實戰課。在這個課程中,我將系統的講解數據結構領域的內容,從最基礎的數組開始,涵蓋數組,棧,隊列,鏈表,二分搜索樹,集合,映射,堆,線段樹,字典樹,並查集,AVL,紅黑樹,哈希表。從初級到進階,讓你成為數據結構的大牛:)

<br/>

在慕課網做了這麼多實戰課,時間長了,收到了越來越多的同學的問題。除了專業知識上的問題,遇到的最多的問題,就是學習方法方面的問題了。由於我本人不是學習方法的專家,所以不敢輕易說自己的學習方法多麼先進。更重要的是,我不認為有一種固定的「好」的學習方法是適合所有同學。如果存在那樣的方法的話,學習就太簡單了:)由於每個人的背景不同,擅長不同,每個人都有適合自己的不同的學習方法;與此同時,不同的領域,由於其本質不同,學習方法也應該是不同的。我堅信:每個人去尋找適合於自己的學習方法,是每個人一生的話題。別人敘述的所謂的「學習方法」,只能作為參考用。

不過我在慕課網做答疑的過程中,確實看到了很多同學的學習方法,有改進的空間。在這裡,我想簡單總結一些我見過的,認為可能不是那麼得當的學習方法,僅供參考。這篇文章不是一套「如何學習」的理論,而是一些零碎的個人見解。更像是在總結「學習中的那些坑」,不過,在我寫完這篇文章之後,回頭看,我覺得,我自己的高效學習的秘訣,其實都在這篇文章里了:)

新課上線,在這裡,我把這些秘訣毫無保留的向大家分享:)

<br/>


<br/>

1)不要完美主義!

我觀察到的大多數同學犯得最最最最大的「錯誤」,就是在學習上「完美主義」。乃至後續很多其他的問題,在我看來都和這個問題是直接相關的。

舉個最經典的例子,也是我經常舉的例子,背英語單詞(在這裡我們先不聊背英語單詞是不是好的英語學習方法,我們只看如果我們想要背英語單詞的話,應該怎麼背)。我發現很多同學拿著紅寶書,第一個list都沒翻過去就放棄了。這是因為每天背完第一個list以後,第二天會發現:第一個list還是有很多單詞沒掌握,然後就繼續背第一個list。然後一周後,發現自己第一個list都搞不定,覺得英語好難,徹底放棄了。這就是「完美主義」:不把第一個list「徹底」掌握不肯繼續前進。這樣是不對的。背了一個list,能多記一個詞,都是進步。就算一個詞都沒記住,模糊有了印象,也是一種進步。我們不應該過度著眼於我們還不夠完美。學習不是要麼0分,要麼100分的。80分是收穫;60分是收穫;20分也是收穫。有收穫最重要。但是因為著眼於自己的不完美,最終放棄了,那就是徹底的0分了。

仔細想,這種「完美主義害死人」的例子特別多。我看到過很多同學,其實是在學習的路上,被自己的「完美主義」逼得「放棄了」——由於學習中有一點沒有做好,遭受到了一點點挫折,最終就放棄了整個學習計劃。每個人都一定要接受自己的不完美。想開一點:我們都不是小升初考了滿分,才能上初中的;也不是中考考了滿分,才能讀高中的;更不是高考考了滿分,才能念大學的;將來也不會是大學所有科目都是滿分,才能出來工作。不完美其實是常態,根本不會影響我們學習更多更深入的內容。但是在自學過程中,很多同學卻要求自己在自己制定的每一步計劃中都達到「完美」,才進行下一步。最終結果,通常都是「放棄」:(

可能有的同學會跳出來反駁我:學習當然要認真啊!在這裡,我必須強調,我所說的「不要完美主義」,和「學習認真」是不衝突的。什麼是「完美主義」,什麼又是「囫圇吞棗」,這是一個「度」,每個人其實不一樣。不要「完美主義」,不代表學習可以草率前行。每個人都必須要找到適合自己的學習節奏。我的經驗是:在一些情況下,問自己一句:是不是自己又犯「完美主義」的毛病了:)

<br/>

2)不要過度「學習路徑依賴」,學習要衝著自己的目標去。

什麼意思?就是現在信息太發達了,對於大多數領域的知識,網上會有很多所謂的「學習路徑」。我不是說這些學習路徑沒有用,但是不能「過度」依賴這些所謂的學習路徑。

比如,很多同學想學機器學習,大多數學習路徑都會告訴你,機器學習需要數學基礎。於是,很多同學就轉而學習數學去了,非要先把數學學好再去學機器學習。可是發現數學怎麼也學不好(在這裡,可能完美主義的毛病又犯了),而機器學習卻一點兒都沒學。最終放棄了機器學習,非常可惜。其實,如果真正去接觸機器學習,就會發現,至少在入門階段,機器學習對數學的要求沒有那麼高。正因為如此,我一直建議:只要你在本科接觸過高數,線數,概率這些科目的基礎概念,想學機器學習,就去直接學習機器學習。學習過程中發現自己的數學不夠用,再回頭補數學。在這種情況下,數學學習得也更有目標性,其實效果更好。在這裡,我忍不住要打一個我的課程廣告,入門機器學習不妨嘗試我的《Python3入門機器學習》,學過的同學都說好:)

類似這樣的例子還有很多,很多同學想學習做ios app,就先去精通swift語言,或者想做android app,就先去精通java語言。在我看來大可不必。以我的經驗,只要你有一門編譯型語言基礎,大概看一下這些語言的基礎語法,就可以直接上手ios或者android app的開發了。先能做出一個最基本的app,在這個過程中,就會意識到語言特性的意義,再回頭深入研究語言也不遲。此時還能結合真實的開發任務去理解語言特性,比沒有上手app開發,抽象地理解語言特性,有意義的多。

再比如,我的《演算法與數據結構》課程和《玩轉演算法面試》課程,在視頻中都是使用C++進行編碼的。雖然我一再強調對預演算法的學習,語言不重要,但還是有很多同學表示,要先把C++學透,再回來把課程中的演算法學好。這是完全沒必要的。事實上,在我的這兩門課程中,我看到的收穫最大的同學,是那些能夠把課程中的演算法思想理解清楚,然後用自己熟悉的語言去實現的同學:)

依然是:不要「過度」學習路徑依賴,什麼叫「過度」,每個人的標準不一樣。每個人都需要尋找自己的那個「度」。

<br/>

3) 不要迷信權威的「好」教材。

不是說權威教材不好,而是每一本教材都有其預設的讀者群,如果你不在這個預設的讀者群的範疇里,教材再好也沒用。最簡單的例子:再好的高數教材,對於小學生來說,都是一堆廢紙。

我經常舉的一個例子是《演算法導論》。我個人建議如果你是研究生或者博士生,已經有了一定的演算法底子,才應該去閱讀《演算法導論》,我在我的課程的問答區,也談過如何學習使用演算法導論。但是對大多數本科同學,尤其是第一次接觸演算法的同學,《演算法導論》實在不是一個好的教材。但很可惜,很多同學在學習中有上面的兩個毛病,既過度路徑依賴,別人說《演算法導論》好,學習演算法要走學《演算法導論》這個路徑,自己就不探索其他更適合自己的學習路徑了,一頭扎進《演算法導論》里;同時還「完美主義」,對於《演算法導論》的前幾章,學習的事無巨細,但其實接觸了很多在初學演算法時沒必要學習的內容。最後終於覺得自己學不下去了,放棄了對「演算法」整個學科的學習。認為演算法太難了。

誠然,演算法不容易,但是,一上來就抱著《演算法導論》啃,實在是選擇了一條完全沒必要的,更難的,甚至可能是根本走不通的路。對於一個領域的學習,了解市面上有什麼好的教材是必要的,單也不能迷信權威教材。每個人必須要去探索學習如何尋找適合自己的學習材料。

<br/>

4)不要看不起「薄薄」的「傻」教材,這些你看不起的學習材料,可能是你入門某個領域的關鍵。

很多同學問我最初學習演算法的是什麼教材,我告訴他們是這本教材:《演算法設計與分析基礎》 在這裡,我完全沒有推薦這本教材的意思。事實上,現在我有點兒「鄙視」這本教材。因為我在學習它的過程中,發現這本教材有很多錯誤(幫助它糾正錯誤其實也提高了我的水平:)當然,現在這本書的版本可能也和我當時學習的版本不同了,大部分錯誤應該已經糾正了。)但它確實是我的一本很重要的演算法啟蒙教材。關鍵原因是,它夠薄。

在大多數時候,如果有人問我教材推薦,基本上我的回答都是,如果是入門水平:隨便找一本在京東,亞馬遜,豆瓣上,評分不太差的「薄」的教材,就ok了。在這裡,關鍵字是夠「薄」。因為「薄」的教材能讓你以最快的速度看完,對整個學科有一個全盤的認識:這個領域是做什麼的?解決什麼問題了?整體解決問題的思路是怎樣?解決問題的方法大致是怎樣劃分的?一些最基礎的方法具體是怎樣的。這些在初學階段是至關重要!是讓你全盤把握整個領域脈絡的。雖然通過這麼一本薄薄的教材,你的脈絡把握肯定不夠全面細緻,但比沒有強太多!我看過不少同學,一上來學習《演算法導論》,關於複雜度分析的筆記做了好幾頁,然後就放棄了,可是連什麼是動態規劃都不知道。這樣完全沒有對「演算法」這個領域有全面的認識,甚至可以說根本沒有學過「演算法」!先用薄教材入門,再找「厚」教材,細細體會其中的細節,是我百試不爽的學習方法。

另外,在這裡,我還要強調「入門教材」,很多教材雖然夠「薄」,但不是「入門教材」。大家要注意。

<br/>

5)不要迷信單一教材。

很多同學理解了要找「薄」教材入門的道理,卻還是非要我推薦一本具體的「薄」教材,說實話,很多時候這讓我有點兒哭笑不得。因為我隨便推薦一本,我確實不敢保證它是「最好的」,「最適合你的」,但是各個領域那麼多教材,我又不可能都一一看過,一一比較過。最最重要的是,我的學習經驗告訴我,在大多數情況下,學習不是一本固定教材可以搞定的。非要找到一本「最適合自己的」教材,然後就一頭扎進去,其實是不科學的。我印象很深刻,我讀本科的時候,那會兒申請了一個項目,要做一個網站(那時候服務端都用ASP.NET),我一口氣從圖書館借了10本ASP.NET的教材,然後以一本最薄的書為主幹去看,發現這本書介紹不清楚的概念,馬上就從其他書里找答案。通常不同的作者對同一個事物從不同的角度做解讀,是能夠幫助你更深刻的認識一個概念的。基本上一個月的時間,我就從一個完全的網站搭建小白,做出了這個項目需要的那個網站。這個習慣我一直延續,研究生的時候,對什麼領域感興趣了,第一件事就是到圖書館,借十本相關書籍回來翻看。

但是,大多數同學喜歡僅僅扎進一本書里,一旦選定了自己的學習材料,就對其他材料充耳不聞,甚至是排斥的心理。這種做法,一方面又是「完美主義」的表現——非要把這本教材學透;另一方面,其實也是「犯懶」的表現,不願意多翻翻,多看看,自己多比較比較,自己去尋找最適合自己的材料,一味地盲目相信所謂「大神」的推薦,殊不知,這些推薦,不一定是更適合自己的材料;更何況,還有很多大神,明明是靠不出名的「薄」教材入的門,但給別人做推薦的時候,就突然變成自己是演算法奇才,自幼閱讀《演算法導論》而所成的神話了:)

<br/>

6)實踐

前面說了很多和教材選擇相關的話題,但對於計算機領域的學習來說,教材的意義其實遠遠小於實踐的意義。如果僅僅是看學習材料就是學習的話,那麼慕課網的視頻後期處理人員就是水平最高的工程師了。因為每段視頻,他們都需要看一遍。但是,很顯然,僅僅是看視頻,是無法學到知識的。對於計算機領域的學習來說,真正動手實踐去編程是異常重要的。怎麼誇大其中的作用都不過分。這就好比學游泳,必須下水去游泳;或者學開車,必須親自上路。否則你說的再頭頭是道,一個小學生文化水平的人,只要他開過車,游過泳,都能在這兩個領域瞬間秒殺你。

很多同學都說我的演算法講得好,其實,我一直認為,這其中的一個最簡單的秘訣就是:我帶領大家把大多數演算法都非常細緻的實現了一遍;或者對其中的應用進行了非常具體的實踐。反觀大多數高校教育,對於演算法或者機器學習這種一定程度偏理論的學習,通常非常不強調實踐。最終的結果是學習者只是接受了很多抽象的概念,但對其中具體的實現細節,卻是雲里霧裡。我見過太多同學,都明白什麼是O(n^2)複雜度,什麼是O(nlogn)的複雜度,卻問我對於100萬的數據規模,為什麼自己的選擇排序運行起來就沒反應了。答案很簡單:O(n^2)的複雜度太慢了,100萬的數據規模太大了,一般家用計算機轉選擇排序一時半會兒是轉不完的。這些同學一定理解O(n^2)的演算法比O(nlogn)的演算法慢,卻沒有真正實踐過,不知道這個差距到底是多少。

在我的課程中,經常遇到有些同學提出這樣的問題:這個演算法的某句話(或者某段邏輯),為什麼要寫成A的樣子,而不是B的樣子?這種問題其實很好,但我覺得解決方法也很簡單,實際的去把演算法改寫成B的樣子,實際的運行試試看,看會發生什麼。如果發生了錯誤,仔細分析一下,為什麼會有錯誤?如果沒有錯誤,具體比較一下:A和B兩種不同的寫法,為什麼都正確?又有什麼區別?真正的學習上的提高,就發生在這個過程中。我當然可以告訴給同學們一個結果,但是自己親自實踐一遍,相比閱讀我給出的一個答案,自己對其中問題理解的深刻程度,是完全不可比擬的。

<br/>

7)debug非常非常重要。

我看到的另一類「經典」問題就是:老師,這個代碼為什麼錯了,然後貼一大段代碼。這種問題背後,依然是,透露著學習方法的不對勁:提問的同學懶得debug。在計算機領域,debug近乎和實踐是一個意思。如果只是把材料上的代碼「抄」一遍,這不叫實踐,這叫抄代碼。小學生也能做。但是「抄」一遍,不小心沒抄對,發生了錯誤,然後自己一點一點調試,找到錯誤的根源,這叫真的實踐。小學生不能做。(當然,我更推崇的是:自己理解了演算法的邏輯,按照自己的理解,把演算法寫出來:)

不過很多同學不喜歡debug,我當然理解。其實誰都不喜歡debug,但是,debug才是最重要的能力。(通常在一個領域裡,你最不喜歡做的事情,就是這個領域的核心競爭力:)是計算機領域異常重要的一項技能。我見過的所有計算機領域的「高手」,不管是在哪個細分領域,都無一例外,是個debug好手。我經常告訴大家,在實際工作中,其實debug的時間要佔你真正編程時間的70%。如果你做一個項目,根本不需要debug,要麼是你的項目對你來說太簡單了,要麼是你根本沒有接觸到這個項目的核心。

debug不僅僅是找到代碼錯誤,解決錯誤的手段,其實更是一個重要的學習手段。通過debug,看看自己寫的程序執行邏輯,哪裡和自己設想的不一致?再回頭看自己哪裡想錯了,或者想漏了,分析一下自己為什麼想錯了,或者想漏了,等等等等,依然是,進步就是發生在這個過程的。

在我的演算法課程中,很多同學對遞歸想不明白,我的建議都是:用一個小數據量,一步步跟蹤程序,看看程序到底是怎麼運行的。通常這麼做,1個小時的時間,就足以讓你深刻理解遞歸程序的運轉邏輯。可是,很多同學懶得花這1個小時的時間,最終的結果是,花了一個下午,對著代碼生看,硬想,最終還是沒有理解程序的運轉邏輯。

<br/>

8)量變到質變。

還有很多同學,對於演算法的一些問題,會問:老師,你是怎麼想到用這樣的方法的?對於這類問題,我的回答一般都是:你見的還不夠多。

不知道是不是受高中階段學習的影響,有一些同學特別執著於就著一個單一的問題,尋找其中的「解題路徑」。當然,我不是說這是完全錯誤的,但也有一個「度」。我的經驗是:與其把時間花在這裡,不如去見更多問題。比如動態規劃,是演算法學習的一個難點,很多同學在學會了背包問題的解法之後,總是執著於去追尋:是怎麼想到這種狀態定義的方法的。可能是我個人水平有限,我無法清楚地解釋是如何想到這種狀態定義的方法的。但是我的經驗告訴我:再去看,去實踐100個動態規劃相關的問題,然後回頭看背包問題,你會發現這種狀態定義的方式非常自然。僅僅對著一個問題思考,很多時候都是死胡同。你見識的還不夠多,就不足以幫助你總結出更加「普遍」的問題解決的規律。當你見得足夠多的時候,一切就都變得很自然,所謂的「量變到質變」。

不過,大多數同學在這個環節都會「犯懶」,企圖通過一個問題就理解問題的本質,這其實和企圖通過一本教材就精通一個領域的想法是一樣的,是不現實的,不可能的。同時,這裡又包含著學習過程中的「完美主義」的思想,遇到一個問題一定要把它想的無比透徹。但是我的經驗告訴我:大多數問題,其實都是需要「回頭看」的。隨著你對一個領域理解的越深入,回頭再去看那些曾經的問題,都會產生新的視角,對於很多曾經想不明白的問題也豁然開朗。這也是「進步」的根源。如果卡在一個問題上不前進,不給自己「回頭看」的機會,甚至最後是放棄了,就什麼也沒有學會了。

所以,很多時候,你發現對一些問題「百思不得其解」,或許不是因為自己「笨」,而是因為「還不夠努力」:)

<br/>

9)最後,一定要相信時間的力量。

有一天,在我的一個演算法課程群里,有個滴滴的後端大神發招聘,結果大家七嘴八舌的就議論開了,大致主題思想就是:自己什麼時候能夠成為滴滴的後端大神。這位滴滴的後端大神今年32歲;大多數議論的同學,其實連22歲都不到。我告訴他們,其實10年後,你們就是大神。

這其實很好理解,回想十年前,也就是12歲的你,和現在的你比較,是不是天壤之別?如果把你扔到一堆12歲的小朋友中間,22歲的你是不是就是個大神?同理,32歲的人,已經在業界摸爬滾打了那麼多年,扔回到22歲的大學生中間,當然是大神:)

很多時候,所謂的「大神」並不神秘,很多時候,仔細觀察,會發現時間有著不可磨滅的作用。只要你沒有虛度時間,每天都在進步,通常結果都不會太差的。如果再加上一點點機遇,可能就不僅僅是大神。

願大家也早日成為大神。

<br/>

最後硬廣:在計算機專業成為大神的路上,演算法和數據結構是絕對繞不開的內容。在我的新課《玩轉數據結構》中,我也從另一個角度闡述了為什麼。最近美國制裁中興禁止賣給中興晶元的事件搞得沸沸揚揚。演算法和數據結構,就是每一個計算機技術人的「芯」,怎麼強調都不為過。我的所有課程,都是圍繞著這個「芯」來講解的。有一名同學的課程評論特別讓我感動:

這恰恰就是我的課程設計目標。希望通過我的課程學習,每位同學都能獲得不同的,真正的,計算機技術內力的提高。

<br/>

我的所有課程傳送門:imooc.com/u/108955

<br/>

我的新課傳送門:《玩轉數據結構,從入門到進階》

大家加油!

作者: liuyubobobo

鏈接:imooc.com/article/26624

來源:慕課網

本文原創發佈於慕課網 ,轉載請註明出處,謝謝合作


推薦閱讀:

打造個人品牌 so easy !_慕課手記

有獎徵文002期|聊聊AI人工智慧 贏取2018 GMIC大會門票及IT書籍

追尋本質還是流於形式

Python 面向對象(進階篇)

慕課網:什麼是分散式系統中的冪等性,zookeeper與dubbo

推薦閱讀:

一個帶限制條件的均勻洗牌問題
計數排序
Girvan和Newman社團發現演算法
機器學慣用於金融市場預測難在哪?
棧和隊列

TAG:演算法 | 面試 | 職場新人 |