https://www.imooc.com/read/27/article/258
1. 不要完美主義
我觀察到的大多數(shù)同學犯得最最最最大的“錯誤”坚冀,就是在學習上“完美主義”约素。乃至后續(xù)很多其他的問題,在我看來都和這個問題是直接相關的少辣。不要完美主義!不要完美主義!不要完美主義欧瘪!重要的事情說三遍囚衔。
舉個最經典的例子挖腰,也是我經常舉的例子,背英語單詞(在這里我們先不聊背英語單詞是不是好的英語學習方法练湿,我們只看如果我們想要背英語單詞的話猴仑,應該怎么背)我發(fā)現(xiàn)很多同學拿著紅寶書,第一個list 都沒翻過去就放棄了肥哎。這是因為每天背完第一個 list 以后宁脊,第二天會發(fā)現(xiàn):第一個 list 還是有很多單詞沒掌握断国,然后就繼續(xù)背第一個list。然后一周后榆苞,發(fā)現(xiàn)自己第一個 list 都搞不定稳衬,覺得英語好難,徹底放棄了坐漏。這就是“完美主義”:不把第一個 list“徹底”掌握不肯繼續(xù)前進薄疚。這樣是不對的。背了一個list赊琳,能多記一個詞街夭,就是進步。就算一個詞都沒記住躏筏,模糊有了印象板丽,也是一種進步。我們不應該過度著眼于我們還不夠完美趁尼。學習不是要么 0 分埃碱,要么100 分的。80分是收獲酥泞;60分是收獲砚殿;20分也是收獲。有收獲最重要芝囤。但是因為著眼于自己的不完美似炎,最終放棄了,那就是徹底的 0 分了悯姊。
仔細想羡藐,這種“完美主義害死人”的例子特別多。我看到過很多同學悯许,其實是在學習的路上传睹,被自己的“完美主義”逼得“放棄了”——由于學習中有一點沒有做好,遭受到了一點點挫折岸晦,最終就放棄了整個學習計劃欧啤。每個人都一定要接受自己的不完美。想開一點:我們都不是小升初考了滿分启上,才能上初中的你辣;也不是中考考了滿分座慰,才能讀高中的尚揣;更不是高考考了滿分站玄,才能念大學的;將來也不會是大學所有科目都是滿分,才能出來工作纫谅。不完美其實是常態(tài)炫贤,根本不會影響我們學習更多更深入的內容。但是在自學過程中付秕,很多同學卻要求自己在自己制定的每一步計劃中都達到“完美”兰珍,才進行下一步。最終結果询吴,通常都是“放棄”掠河。
可能有的同學會跳出來反駁我:學習當然要認真啊猛计!在這里唠摹,我必須強調,我所說的“不要完美主義”奉瘤,和“學習認真”是不沖突的勾拉。什么是“完美主義”,什么又是“囫圇吞棗”盗温,這是一個“度”藕赞,每個人其實不一樣。不要“完美主義”肌访,不代表學習可以草率前行找默。每個人都必須要找到適合自己的學習節(jié)奏艇劫。我的經驗是:在自己又因為自己的學習進度而沮喪的時候吼驶,問自己一句:是不是自己又犯“完美主義”的毛病了:)
2. 不要過度“學習路徑依賴”,學習要沖著自己的目標去
現(xiàn)在信息太發(fā)達了店煞,對于大多數(shù)領域的知識蟹演,網上會有很多所謂的“學習路徑”。我不是說這些學習路徑沒有用顷蟀,但是不能“過度”依賴這些所謂的學習路徑酒请。
比如,很多同學想學機器學習鸣个,大多數(shù)學習路徑都會告訴你羞反,機器學習需要數(shù)學基礎。于是囤萤,很多同學就轉而學習數(shù)學去了昼窗,非要先把數(shù)學學好再去學機器學習√紊幔可是發(fā)現(xiàn)數(shù)學怎么也學不好(在這里澄惊,可能完美主義的毛病又犯了),而機器學習卻一點兒都沒學。最終放棄了機器學習掸驱,非掣匕幔可惜。其實毕贼,如果真正去接觸機器學習温赔,就會發(fā)現(xiàn),至少在入門階段帅刀,機器學習對數(shù)學的要求沒有那么高让腹。正因為如此,我一直建議:只要你在本科接觸過高數(shù)扣溺,線數(shù)骇窍,概率這些科目的基礎概念,想學機器學習锥余,就去直接學機器學習腹纳。學習過程中發(fā)現(xiàn)自己的數(shù)學不夠用,再回頭補數(shù)學驱犹。在這種情況下嘲恍,數(shù)學學習也更有目標性,其實效果更好雄驹。
類似這樣的例子還有很多佃牛,很多同學想學習做 iosapp,就先去精通 swift 語言医舆,或者想做 android app俘侠,就先去精通java語言。在我看來大可不必蔬将。以我的經驗爷速,只要你有一門編譯型語言基礎,大概看一下這些語言的基礎語法霞怀,就可以直接上手 ios 或者 androidapp 的開發(fā)了惫东。先能做出一個最基本的app,在這個過程中毙石,就會意識到語言特性的意義廉沮,再回頭深入研究語言也不遲。此時還能結合真實的開發(fā)任務去理解語言特性徐矩,比沒有上手 app開發(fā)滞时,抽象地理解語言特性,有意義得多丧蘸。再比如漂洋,我的《算法與數(shù)據結構》課程和《玩轉算法面試》課程遥皂,在視頻中都是使用C++ 進行編碼的。雖然我一再強調對于算法的學習刽漂,語言不重要演训,但還是有很多同學表示,要先把 C++學透贝咙,再回來把課程中的算法學好样悟。這是完全沒必要的。事實上庭猩,在我的這兩門課程中窟她,我看到的收獲最大的同學,是那些能夠把課程中的算法思想理解清楚蔼水,然后用自己熟悉的語言去實現(xiàn)的同學:)
依然是:不要“過度”學習路徑依賴震糖,什么叫“過度”,每個人的標準不一樣趴腋。每個人都需要尋找自己的那個“度”吊说。
3. 不要迷信權威的“好”教材
不是說權威教材不好,而是每一本教材都有其預設的讀者群优炬,如果你不在這個范疇里颁井,教材再好也沒用。最簡單的例子:再好的高數(shù)教材蠢护,對于小學生來說雅宾,都是一堆廢紙。
我經常舉的一個例子是《算法導論》葵硕。我個人建議如果你是研究生或者博士生眉抬,已經有了一定的算法底子,才應該去閱讀《算法導論》贬芥。但是對大多數(shù)本科同學吐辙,尤其是第一次接觸算法的同學宣决,《算法導論》實在不是一個好教材蘸劈。但很可惜,很多同學在學習中有上面兩個毛病尊沸,既過度路徑依賴——別人說《算法導論》好威沫,學習算法要走學《算法導論》這個路徑,自己就不探索其他更適合自己的學習路徑了洼专,一頭扎進《算法導論》里棒掠;同時還“完美主義”的傾向——對于《算法導論》的前幾章,學習得事無巨細屁商,但其實接觸了很多在初學算法時沒必要學習的內容烟很。最后終于覺得自己學不下去了,放棄了對“算法”整個學科的學習,認為算法太難了雾袱。
誠然恤筛,算法不容易,但是芹橡,一上來就抱著《算法導論》啃毒坛,實在是選擇了一條完全沒必要的、更難的林说、甚至可能是根本走不通的路煎殷。對于一個領域的學習,了解市面上有什么好的教材是必要的腿箩,但也不能迷信權威教材豪直。每個人必須要去探索如何尋找適合自己的學習材料。
4. 不要看不起“薄薄”的“傻”教材珠移,這些你看不起的學習材料顶伞,可能是你入門某個領域的關鍵
很多同學問我最初學習算法的是什么教材,我告訴他們是這本教材:《算法設計與分析基礎》剑梳。在這里唆貌,我完全沒有推薦這本教材的意思。事實上垢乙,現(xiàn)在我有點兒“鄙視”這本教材锨咙。因為我在學習它的過程中,發(fā)現(xiàn)這本教材有很多錯誤(幫助它糾正錯誤其實也提高了我的水平:)當然追逮,現(xiàn)在這本書的版本可能也和我當時學習的版本不同了酪刀,大部分錯誤應該已經糾正了。)但它確實是我的一本很重要的算法啟蒙教材钮孵。關鍵原因是骂倘,它夠薄。
在大多數(shù)時候巴席,如果有人問我教材推薦历涝,基本上我的回答都是,如果是入門水平:隨便找一本在京東漾唉、亞馬遜荧库、豆瓣上評分不太差的“薄”教材,就 ok 了赵刑。在這里分衫,關鍵字是夠“薄”。因為“薄”的教材能讓你以最快的速度看完般此,對整個學科有一個全盤的認識:這個領域是做什么的蚪战?解決什么問題了牵现?整體解決問題的思路是怎樣的?解決問題的方法大致是怎樣劃分的邀桑?一些最基礎的方法具體是怎樣的施籍?這些在初學階段是至關重要!是讓你全盤把握整個領域脈絡的概漱。雖然通過這么一本薄薄的教材丑慎,你的脈絡把握肯定不夠全面細致,但比沒有強太多瓤摧!我看過不少同學竿裂,一上來學習《算法導論》,關于復雜度分析的筆記做了好幾頁照弥,然后就放棄了腻异,連什么是動態(tài)規(guī)劃都不知道。這樣完全沒有對“算法”這個領域有全面的認識这揣,甚至可以說根本沒有學過“算法”悔常!先用“薄”教材入門,再找“厚”教材给赞,細細體會其中的細節(jié)机打,是我百試不爽的學習方法。
另外片迅,在這里残邀,我還要強調“入門教材”,很多教材雖然夠“薄”柑蛇,但不是“入門教材”芥挣。大家要注意。
5. 不要迷信單一教材
很多同學非要我推薦一本具體的“薄”教材入門耻台,說實話空免,很多時候讓我有點兒哭笑不得。因為我隨便推薦一本盆耽,我確實不敢保證它是“最好的”蹋砚,“最適合你的”,但是各個領域那么多教材征字,我又不可能都一一看過都弹,一一比較過娇豫。最最重要的是匙姜,我的學習經驗告訴我,在大多數(shù)情況下冯痢,學習不是一本固定教材可以搞定的氮昧。非要找到一本“最適合自己的”教材框杜,然后就一頭扎進去,其實是不科學的袖肥。我印象很深刻咪辱,我讀本科的時候,那會兒申請了一個項目椎组,要做一個網站油狂,我一口氣從圖書館借了10本建站教程,然后以一本最薄的書為主干去看寸癌,發(fā)現(xiàn)這本書介紹不清楚的概念专筷,馬上就從其他書里找答案。通常不同的作者對同一個事物從不同的角度做解讀蒸苇,是能夠幫助你更深刻地認識一個概念磷蛹。基本上一個月的時間溪烤,我就從一個完全的網站搭建小白味咳,做出了這個項目需要的網站。這個習慣我一直延續(xù)檬嘀。研究生的時候槽驶,對什么領域感興趣了,第一件事就是到圖書館鸳兽,借十本相關書籍回來翻看捺檬。
但是,大多數(shù)同學喜歡僅僅扎進一本書里贸铜,一旦選定了自己的學習材料堡纬,就對其他材料充耳不聞,甚至是排斥的心理蒿秦。這種做法烤镐,一方面又是“完美主義”的表現(xiàn)——非要把這本教材學透;另一方面棍鳖,其實也是“犯懶”的表現(xiàn)炮叶,不愿意多翻翻,多看看渡处,自己多比較比較镜悉,自己去尋找最適合自己的材料,一味地盲目相信所謂“大神”的推薦医瘫。殊不知侣肄,這些推薦,不一定是最適合自己的材料醇份;更何況稼锅,還有很多大神吼具,明明是靠不出名的“薄”教材入的門,但給別人做推薦的時候矩距,就突然變成自己是算法奇才拗盒,自幼閱讀《算法導論》而所成的神話了。
6. 實踐
前面說了很多和教材選擇相關的話題锥债,但對于計算機領域學習來說陡蝇,教材的意義其實遠遠小于實踐的意義。如果僅僅是看學習材料就是學習的話哮肚,那么教學網站的視頻后期處理人員就是水平最高的工程師了毅整。因為每段視頻,他們都需要看一遍绽左。但是悼嫉,很顯然,僅僅是看視頻拼窥,是無法學到知識的戏蔑。對于計算機領域的學習來說,真正動手實踐去編程是異常重要的鲁纠,怎么夸大其中的作用都不過分总棵。這就好比學游泳,必須下水去游泳改含;或者學開車情龄,必須親自上路。否則你說的再頭頭是道捍壤,一個小學生文化水平的人骤视,只要他開過車,游過泳鹃觉,都能在這兩個領域瞬間秒殺你专酗。
很多同學都說我的算法講得好。其實盗扇,我一直認為祷肯,這其中一個最簡單的秘訣就是:我?guī)ьI大家把大多數(shù)算法都非常細致地實現(xiàn)了一遍;或者對其中的應用進行了非常具體的實踐疗隶。反觀大多數(shù)高校教育佑笋,對于算法或者機器學習這種一定程度偏理論的學習,通常非常不強調實踐斑鼻。最終的結果是學習者只是接受了很多抽象的概念蒋纬,但對其中具體的實現(xiàn)細節(jié),卻是云里霧里。我見過太多同學颠锉,都明白什么是O(n^2) 復雜度法牲,什么是 O(nlogn) 的復雜度史汗,卻問我對于 100萬的數(shù)據規(guī)模琼掠,為什么自己的選擇排序運行起來就沒反應了。答案很簡單: O(n^2) 的復雜度太慢了停撞,100萬的數(shù)據規(guī)模太大了瓷蛙,一般家用計算機轉選擇排序一時半會兒是轉不完的。這些同學一定理解 O(n^2) 的算法比 O(nlogn)的算法慢戈毒,卻沒有真正實踐過艰猬,不知道這個差距到底是多少。在我的課程中埋市,經常遇到有些同學提出這樣的問題:這個算法的某句話(或者某段邏輯)冠桃,為什么要寫成A 的樣子,而不是 B的樣子道宅?這種問題其實很好食听,但我覺得解決方法也很簡單,實際地去把算法改寫成B的樣子污茵,實際地運行試試看樱报,看會發(fā)生什么。如果發(fā)生了錯誤泞当,仔細分析一下迹蛤,為什么會有錯誤?如果沒有錯誤襟士,具體比較一下:A 和 B兩種不同的寫法盗飒,為什么都正確?又有什么區(qū)別陋桂?真正的學習上的提高箩兽,就發(fā)生在這個過程中。我當然可以告訴給同學們一個結果章喉,但是自己親自實踐一遍汗贫,相比閱讀我給出的一個答案,自己對其中問題理解的深刻程度秸脱,是完全不可比擬的落包。
7. debug 非常非常重要
我看到的另一類“經典”問題就是:老師,這個代碼為什么錯了摊唇,然后貼一大段代碼咐蝇。這種問題背后,依然是透露著學習方法的不對勁:提問的同學懶得debug巷查。在計算機領域有序,debug近乎和實踐是一個意思抹腿。如果只是把材料上的代碼“抄”一遍,這不叫實踐旭寿,這叫抄代碼警绩。小學生也能做。但是“抄”一遍盅称,不小心沒抄對肩祥,發(fā)生了錯誤,然后自己一點一點調試缩膝,找到錯誤的根源混狠,這叫真的實踐。小學生不能做疾层。(當然将饺,自己理解了算法的邏輯,按照自己的理解痛黎,把算法寫出來予弧,才是終極目的:)不過很多同學不喜歡 debug,我當然理解舅逸。其實誰都不喜歡debug桌肴,但是,debug才是最重要的能力琉历。通常在一個領域里坠七,你最不喜歡做的事情,就是這個領域的核心競爭力旗笔!我見過的所有計算機領域的“高手”彪置,不管是在哪個細分領域,都無一例外蝇恶,是個debug 好手拳魁。我經常告訴大家,在實際工作中撮弧,其實 debug 的時間要占你真正編程時間的 70%潘懊。如果你做一個項目,根本不需要debug贿衍,要么是你的項目對你來說太簡單了授舟,要么是你根本沒有接觸到這個項目的核心。debug 不僅僅是找到代碼錯誤贸辈,解決錯誤的手段释树,其實更是一個重要的學習手段。通過 debug,看看自己寫的程序執(zhí)行邏輯奢啥,哪里和自己設想的不一致秸仙?再回頭看自己哪里想錯了,或者想漏了桩盲,分析一下自己為什么想錯了寂纪,或者想漏了等等,進步就是發(fā)生在這個過程的正驻。在我的算法課程中弊攘,很多同學對遞歸想不明白抢腐,我的建議都是:用一個小數(shù)據量姑曙,一步步跟蹤程序,看看程序到底是怎么運行的迈倍。通常這么做伤靠,1個小時的時間,就足以讓你深刻理解遞歸程序的運轉邏輯啼染⊙绾希可是,很多同學懶得花這 1個小時的時間迹鹅。最終的結果是卦洽,花了一個下午,對著代碼生看斜棚,硬想阀蒂,最終還是沒有理解程序的運轉邏輯。
8. 量變到質變
還有很多同學弟蚀,對于算法的一些問題蚤霞,會問:老師,你是怎么想到用這樣的方法的义钉?對于這類問題昧绣,我的回答一般都是:你見的還不夠多。不知道是不是受高中階段學習的影響捶闸,有一些同學特別執(zhí)著于就著一個單一的問題夜畴,尋找其中的“解題路徑”。當然删壮,我不是說這是完全錯誤的贪绘,但也有一個“度”。我的經驗是:與其把時間花在這里醉锅,不如去見更多問題兔簇。比如動態(tài)規(guī)劃,是算法學習的一個難點,很多同學在學會了背包問題的解法之后垄琐,總是執(zhí)著于去追尋:是怎么想到這種狀態(tài)定義的方法边酒。可能是我個人水平有限狸窘,我無法清楚地解釋是如何想到這種狀態(tài)定義的方法墩朦。但是我的經驗告訴我:再去看,去實踐100個動態(tài)規(guī)劃相關的問題翻擒,然后回頭看背包問題氓涣,你會發(fā)現(xiàn)這種狀態(tài)定義的方式非常自然。僅僅對著一個問題思考陋气,很多時候都是死胡同劳吠。你見識的還不夠多,就不足以幫助你總結出更加“普遍”的問題解決規(guī)律巩趁。當你見得足夠多的時候痒玩,一切就都變得很自然,所謂的“量變到質變”议慰。
不過蠢古,大多數(shù)同學在這個環(huán)節(jié)都會“犯懶”,企圖通過一個問題就理解問題的本質别凹,這其實和企圖通過一本教材就精通一個領域的想法是一樣的草讶,是不現(xiàn)實的、不可能的炉菲。同時堕战,這里又包含著學習過程中的“完美主義”的思想,遇到一個問題一定要把它想得無比透徹颁督。但是我的經驗告訴我:大多數(shù)問題践啄,其實都是需要“回頭看”的。隨著你對一個領域理解得越深入沉御,回頭再去看那些曾經的問題屿讽,都會產生新的視角,對于很多曾經想不明白的問題也豁然開朗吠裆。這也是“進步”的根源伐谈。如果卡在一個問題上不前進,不給自己“回頭看”的機會试疙,甚至最后是放棄了诵棵,就什么也沒有學會了。
所以祝旷,很多時候履澳,你發(fā)現(xiàn)對一些問題“百思不得其解”嘶窄,或許不是因為自己“笨”恨狈,而是因為“還不夠努力”只冻。
9. 最后,一定要相信時間的力量
有一天辽幌,在我的一個算法課程群里忠蝗,有個滴滴的后端大神發(fā)招聘现横,結果大家七嘴八舌地就議論開了,大致主題思想就是:自己什么時候能夠成為滴滴的后端大神阁最。這位滴滴的后端大神今年32 歲戒祠;大多數(shù)議論的同學,其實連 22 歲都不到速种。我告訴他們姜盈,其實 10 年后,你們就是大神哟旗。這其實很好理解贩据,回想十年前栋操,也就是 12 歲的你闸餐,和現(xiàn)在的你比較,是不是天壤之別矾芙?如果把你扔到一堆 12 歲的小朋友中間舍沙,22 歲的你是不是就是個大神?同理剔宪,32 歲的人拂铡,已經在業(yè)界摸爬滾打了那么多年,扔回到 22 歲的大學生中間葱绒,當然是大神感帅。
很多時候,所謂的“大神”并不神秘地淀,仔細觀察他們的經歷失球,會發(fā)現(xiàn)時間有著不可磨滅的作用。只要你沒有虛度時間帮毁,每天都在進步实苞,通常結果都不會太差的。如果再加上一點點機遇烈疚,就是大神黔牵。