最近,遇到了兩個來自同學(xué)的提問,我覺得都挺典型的。
一個同學(xué)問我,“學(xué)習(xí)的過程中,到底怎么樣才叫學(xué)會了?掌握了?”
還有兩個同學(xué),不約而同地問我,“學(xué)習(xí)算法,是不是掌握了基本原理,面試的時候,能說出個大概就好了?”——對于這個問題,其實不止這兩個同學(xué),在過去的兩年時間里,我也已經(jīng)遇到很多次了。
今天這篇推文,就借這些問題,聊一聊我眼里的,知識掌握的七個境界。
第一重境界:擼串境界
知識掌握的第一重境界,我管它叫“擼串境界”。什么意思?就是,對于這個知識,你只有在擼串的時候,才能“無障礙”地提起。比如:
A:你知道嗎?昨天人類首張黑洞照片公布了!
B:是啊是啊,人類離宇宙的真相又近了一步。聽說黑洞和時間的奧秘也有深刻的聯(lián)系,可能我們離時空旅行又近了一步呢。
擼串的時候,我們可能會不自覺地聊起這種話題。但是,八成,A 和 B 對黑洞的了解,都是在“擼串境界”,真的正兒八經(jīng)地說說黑洞到底是怎么回事兒,黑洞照片的歷史意義是怎樣的,對未來有可能有什么影響,黑洞和時間又有什么聯(lián)系,可能都不太清楚。對于黑洞,也就是在擼串的時候隨便聊聊。
A:聽說XXX自己做人工智能,預(yù)測股票走勢,賺了一大筆錢!
B:我也聽說了,就是用現(xiàn)在最火的深度學(xué)習(xí)。Alpha Go 已經(jīng)戰(zhàn)勝人類最強的圍棋選手了,Alpha Go 用的就是深度學(xué)習(xí)算法。
在這段對話里,A 和 B 對人工智能和深度學(xué)習(xí)的理解,八成也是“擼串境界”。
通常,看新聞就能幫助你進入擼串境界。
第二重境界:關(guān)鍵詞境界
知識掌握的第二重境界,我管他叫做“關(guān)鍵詞境界”。就是,對于這個知識,你掌握了非常重要的幾個關(guān)鍵詞。比如:
A:聽說XXX自己做人工智能,預(yù)測股票走勢,賺了一大筆錢!
B:我也聽說了,就是用現(xiàn)在最火的深度學(xué)習(xí)。好像是建立了一個叫 LSTM 的模型就好了。我也想找時間學(xué)習(xí)學(xué)習(xí)呢,搞不好就能賺 1 個億呢。
在這段對話里,B 對深度學(xué)習(xí)的理解,進入了“關(guān)鍵詞境界”。當(dāng)然,在這里我只是舉例子,畢竟 LSTM 只是深度學(xué)習(xí)的一種方式,深度學(xué)習(xí)領(lǐng)域也有很多其他重要關(guān)鍵詞。在這里,我想強調(diào)的是:關(guān)鍵詞境界和擼串境界,是截然不同的。
為什么?因為如果你處于關(guān)鍵詞境界,這個知識對你來說,就不僅僅是只有在擼串的時候可以提及的一個縹緲的概念了。你可以利用這個關(guān)鍵詞,在網(wǎng)上查詢,進而深入學(xué)習(xí)。換句話說,這個關(guān)鍵詞已經(jīng)可以指導(dǎo)你行動了——你已經(jīng)可以開始具體的學(xué)習(xí)了。
很多時候,我們解決問題,就是缺少一兩個關(guān)鍵詞而已。比如,我本科的時候,做一個項目,其中一個子功能,要對用戶輸入的郵箱字符串是否合法做驗證。當(dāng)時我花了很長時間自己設(shè)計“所謂的算法”去處理,其實就是一堆 if-else。到后來,我明白了,這事兒其實用正則表達式,一句話就搞定了。真要說其中的算法,也是一個專門的領(lǐng)域,叫模式匹配?!罢齽t表達式”,“模式匹配”,就是正確的關(guān)鍵詞。如果我早一些知道這些關(guān)鍵詞,我就可以直接去學(xué)習(xí)正則表達式的使用,或者直接去學(xué)習(xí)“模式匹配”算法,就會少走很多彎路。
在這里,我要強調(diào),從學(xué)習(xí)的角度,我覺得這個彎路,也是值得的。因為通過我的思考和嘗試,再去看成熟的解決方案,我就能看到差距,總結(jié)自己思維上的缺陷,對知識的理解也會更深刻。我經(jīng)常說,在大多數(shù)情況下,走一些彎路絕不是壞事,走彎路是進步的源泉,所謂失敗是成功之母。只不過,對于很多時間緊任務(wù)急的業(yè)務(wù)場景,可能現(xiàn)實不允許你走彎路。
第三重境界:原理境界
第三重境界,就是你不但知道了這個關(guān)鍵詞,你還知道了原理。
歸并排序?qū)δ銇碚f不僅僅是一個名詞,你知道歸并排序是每次將整個數(shù)組分成兩部分,將這兩部分排好序以后,再合并起來;
快速排序?qū)δ銇碚f不僅僅是一個名詞,你知道快速排序是每次以一個元素為標(biāo)定點,把數(shù)組分成小于這個元素和大于這個元素兩部分,對這兩部分再去遞歸地進行排序;
二分搜索對你來說也不是一個名詞,你知道,二分搜索就是對一個有序數(shù)組,先檢查中間的元素,如果正好是你要查找的內(nèi)容,就ok了;如果不是,你要查找的內(nèi)容比它小,繼續(xù)到左邊找;你要查找的內(nèi)容比它大,繼續(xù)到右邊找。
大部分同學(xué)通過在學(xué)校的專業(yè)學(xué)習(xí),應(yīng)該是至少能達到原理境界的。也就是,你知道這個名詞,了解這個名詞在解決什么問題,同時,也能用自然語言表述他的原理。
但是,在這里,我必須提醒大家,對于計算機專業(yè)的學(xué)習(xí),必須要把基礎(chǔ)知識的掌握上升到第四重境界。
第四重境界:實踐境界
所謂的“實踐境界”,在計算機領(lǐng)域,其實就是,你不僅僅能說出原理,還能用代碼將他們正確實現(xiàn)出來。換句話說,你不僅僅知道“歸并排序”、“快速排序”、“二分搜索”,你還能寫出正確的代碼。
我在這篇推文開篇,兩個同學(xué),不約而同地問我,“學(xué)習(xí)算法,是不是掌握了基本原理,面試的時候,能說出個大概就好了?”他們的問題,本質(zhì)就是:對于算法知識的掌握,有沒有必要進入實踐境界?
我的答案是:太有必要了。因為,這是計算機專業(yè)跟非計算機專業(yè)的本質(zhì)區(qū)別。也是你能吃這碗飯,別人不能吃這碗飯的關(guān)鍵。
計算機專業(yè)要做的,就是把抽象的邏輯轉(zhuǎn)換成可以正確實現(xiàn)這個邏輯的代碼。如果能顧及代碼的效率,可維護性,甚至是簡潔優(yōu)雅,那就更好了。但如果你只是懂原理,能扯淡的話,恕我直言,別說數(shù)學(xué)系物理性能碾壓你,連文學(xué)系歷史系,甚至是一個素質(zhì)高點兒的高中生乃至初中生,隨便看兩眼,可能都能碾壓你。但是讓他們轉(zhuǎn)行程序員,還是會費一番功夫的,為什么?正確,優(yōu)雅,高效的代碼實現(xiàn)能力,不是一日之功。
如果到達原理境界就 ok 的話,我的所有算法課程,長度都可以直接縮減到 1/5。但是,能用代碼正確地實現(xiàn)出來,完全是另一回事兒。很多同學(xué)說得清楚原理,但是實現(xiàn)不出正確的代碼。這就是編程基礎(chǔ)不夠。由于你實現(xiàn)不出正確的代碼,我也不敢保證你的理解是完全正確的。
你跟我扯再多永動機的原理,要想讓我不質(zhì)疑你,請實現(xiàn)出一個永動機證明給我看。你跟我扯再多煉金術(shù)的原理,要讓不懷疑你,請把這個易拉罐變成金子給我看。
同理,你說你懂快速排序,不要廢話,實現(xiàn)一個快速排序給我看。
Linus Torvalds說:talk is cheap, show me the code.
大家一定要明白,計算機是工科,工科是靠東西說話的。我相信這也是很多同學(xué)選擇計算機專業(yè)的一個原因——它沒那么多虛的。你專業(yè)水平高,你就能實現(xiàn)出來,時間短,效率高,代碼整潔優(yōu)雅,讓所有人都閉嘴。從某一個維度看,這確實是更公平的,不像在有一些行業(yè)或者領(lǐng)域,單靠嘴皮子,人和人能拉開很大的差距。(當(dāng)然,一切都是相對的,公平這個話題太大了,有時間單聊。)
所以,大家在具體學(xué)習(xí)的時候,一定要明白:我是計算機專業(yè)的,能實現(xiàn)出來,才是我的立身之本。
第五重境界:靈活應(yīng)用境界
第五重境界,就是靈活運用。知識是死的,能靈活地運用這些知識解決實際問題,甚至是解釋生活中的現(xiàn)象,對這個知識點,就達到了這重境界。
隨便舉幾個例子。
Leetcode 上 1011 號問題,大家可以看一看。在這里,我把中文版本的問題也截了一個圖(沒時間看具體問題直接跳過去,在這里只是舉個例子):
對于這個問題,如果你能很快地反應(yīng)出,應(yīng)該使用二分查找法來解決的話,你對二分查找的理解,就已經(jīng)進入了靈活運用的境界。相較而言,寫出正確的二分搜索代碼,是簡單的,但是,能快速反映出這類問題可以使用二分查找的思路去解決,還需要一定的專業(yè)訓(xùn)練才能達到。實際上,類似這樣的使用二分查找法解決的問題,是算法競賽里常見的問題套路。二分查找本身,也絕不僅僅局限在在一個有序數(shù)組中找一個數(shù)而已。對這個問題的深入解析,我在文章中不具體分析了,有興趣的同學(xué),可以自行搜索學(xué)習(xí)。
再比如,經(jīng)典的“智力”題,過河問題:
農(nóng)夫需要把狼、羊、菜和自己運到河對岸去,只有農(nóng)夫能夠劃船,而且船比較小,除農(nóng)夫之外每次只能運一種東西,還有一個棘手問題,就是如果沒有農(nóng)夫看著,羊會偷吃菜,狼會吃羊。請考慮一種方法,讓農(nóng)夫能夠安全地安排這些東西和他自己過河。
以及經(jīng)典的“裝水問題”,版本眾多,我隨便取一個:
有兩個水桶一個裝5升一個裝3升怎么利用水桶得到4升水?
如果你看見這類問題,能很快地想到,他們的本質(zhì),是圖論中的一個路徑搜索問題,那么你對路徑搜索算法的掌握,就進入了靈活應(yīng)用境界。給你一個圖,讓你找到從 s 到 t 的一個路徑,是簡單的;但是對于這類問題,可以使用圖論去建模,將其轉(zhuǎn)化成一個圖中的路徑搜索問題,是需要一定的專業(yè)訓(xùn)練的。
再舉一個 Google 的面試問題:
一個硬幣,拋了 1000 次,結(jié)果有 560 次是正面,請問,你覺得這枚硬幣是不是“公平”的?
如果學(xué)過概率論的同學(xué),可能都能說出什么是中心極限定理,都知道假設(shè)檢驗。但是,遇到這樣一個問題,能不能聯(lián)系已經(jīng)掌握的知識,有理有據(jù)地說明白你得出結(jié)論的依據(jù)?需要你對相應(yīng)的知識,達到靈活運用的境界。
第六重境界:發(fā)明創(chuàng)造境界
上面的幾重境界,都是對已有知識的掌握逐漸深入。但是,這個世界上尚未解決的問題還很多,能不能根據(jù)已有知識,發(fā)明創(chuàng)造出新知識,進而解決新的問題?這就是發(fā)明創(chuàng)造的境界。所有的諾貝爾獎,圖靈獎的獲獎?wù)?,對相關(guān)領(lǐng)域的知識掌握,都在發(fā)明創(chuàng)造的境界。
首先,必須承認,對于任何知識,我都達不到發(fā)明創(chuàng)造的境界。
事實上,對于大多數(shù)人來說,對某個領(lǐng)域的知識,能整體進入靈活應(yīng)用的境界,就已經(jīng)足夠了。因為能夠靈活運用,已經(jīng)意味著你可以使用這些知識,解決大量實際問題了。這已經(jīng)對整個社會有相當(dāng)大的價值了。能否進入發(fā)明創(chuàng)造的境界,一方面看你是否有這方面的追求;另一方面,也看機緣和天賦,很多時候,是可遇不可求的。
不過,在這里,我想強調(diào),所有的新知識,近乎都不是憑空出現(xiàn)的。都是靠大量的對前人知識的積累、理解、甚至是靈活運用之后才出現(xiàn)的。所以,不斷學(xué)習(xí)前人的知識和思想,是根本。沒有積累,突然發(fā)明了新知識,尤其是在當(dāng)下這個知識爆炸的時代,近乎是不可能的。
所以,不要妄想把自己關(guān)起來,就能解決黎曼猜想。不要覺得自己是張無忌,找?guī)妆臼澜缃?jīng)典教材,在“洞里”與世隔絕,苦讀三年五載,就能一鳴驚人。金庸的小說是成年人的童話。所謂的童話,就是騙人的。相較而言,不斷地去積累,甚至是跨領(lǐng)域的積累知識,從其他領(lǐng)域的知識中汲取靈感,才有可能更大概率地發(fā)明出新的知識,解決更難的問題。
第七重境界:遺忘境界
第七重境界,我稱之為遺忘境界。在這里,首先要說明,前六重境界,是層層遞進的關(guān)系。但是,在這里,我說的第七重境界,不是第六重境界的一個遞進,而只是一種狀態(tài)——遺忘而已。
相信很多同學(xué)都有這樣的苦惱:學(xué)了很多知識,很快就忘掉了。即使曾經(jīng)達到靈活運用的境界,但是可能各種原因,幾年甚至十幾年沒有碰,最后也會遺忘。
在這里,我想強調(diào)的是:這是極其正常的。如果你不會遺忘的話,你就是一個超人了?;蛘吣銚碛袡C器貓中的記憶面包,你應(yīng)該已經(jīng)是全球首富了。
關(guān)鍵在于,如何抵抗遺忘?首先,對一個知識的掌握,你的境界越高,越不容易遺忘。相較于已經(jīng)達到靈活運用境界里的知識,只在原理境界的知識,更容易被遺忘。
另外,使用次數(shù)越多的知識,越不容易遺忘。其實在我國,大多數(shù)初等教育,都是在采用“重復(fù)使用”這種方法,來幫助你記憶知識的。你根本沒有具體應(yīng)用過這些知識,但就是忘不了 how are you 后面,接的是 fine, thank you. and you? 對于這種機械式地使用,我的評價是中性的。有好有壞,有機會可以單獨寫文。
其實,遺忘并不可怕,遺忘境界是一種境界。如果你的遺忘境界中存在著某種知識,基本就意味著你能迅速地把它撿起來,重新回到原來的境界,這是很重要的。所謂的經(jīng)驗,不過是遺忘境界的存儲。比如,紅黑樹的內(nèi)部原理,很容易遺忘。但是,如果你跟著我的課程,認認真真學(xué)習(xí)了紅黑樹的原理,實現(xiàn)了紅黑樹的代碼,那么,即使你遺忘了,我相信,對于正常智力水平的同學(xué),在需要的時候,比如面試前,一兩個小時的時間,足以讓你回到原有的水平。
最后,我想說的,雖然學(xué)習(xí)的目的不是遺忘,但學(xué)習(xí)的目的也絕不僅僅是記住。其實,“記住”,是學(xué)習(xí)的一個太低層級的收獲。關(guān)鍵是,在學(xué)習(xí)的過程中,你的大腦在消化、吸收知識的過程中,會連帶有很多附加的收獲。這些附加的收獲,在很多時候,都是更加重要的。
比如,對數(shù)學(xué)的學(xué)習(xí),會逐漸讓你對數(shù)字更敏感,同時,形成如何用數(shù)學(xué)模型解決問題的思維方式(所謂的數(shù)學(xué)思維和數(shù)學(xué)素養(yǎng));
對算法的學(xué)習(xí),會逐漸培養(yǎng)你理清邏輯的習(xí)慣,對每一個變量作用的深刻理解,也能讓你寫出越來越優(yōu)雅的代碼;
更不用提,在學(xué)習(xí)的過程中,你會逐漸總結(jié)出適合自己的學(xué)習(xí)方法,把他們應(yīng)用在更多領(lǐng)域的學(xué)習(xí)上;
你會慢慢體會到如何能夠更加高效地查找資料,如何歸納,總結(jié)知識體系,幫助你更好的理解;
你會去提問。在提問的過程中,你會越來越多地理解:怎樣提問更加有效?什么是一個好的問題?;
你會給別人講解,在給別人講解的過程中,你也能鍛煉自己的表達能力;
你甚至能在學(xué)習(xí)過程中,逐漸找到自己的興趣,自己的天賦,自己的理想;
通過學(xué)習(xí)越來越多的東西,你也會越來越有自信,你能感受到天地之大,也能感知到自己之??;
所有的這些,都比學(xué)習(xí)某一個具體的知識點,重要太多了。
愛因斯坦說:所謂的教育,就是忘記了在學(xué)校所學(xué)的一切之后,剩下的東西。
大家加油!:)