您現在的位置是:首頁 > 遊戲

知識掌握的七重境界,厲害了

由 慕課網 發表于 遊戲2023-01-22
簡介在這裡,我把中文版本的問題也截了一個圖(沒時間看具體問題直接跳過去,在這裡只是舉個例子):對於這個問題,如果你能很快地反應出,應該使用二分查詢法來解決的話,你對二分查詢的理解,就已經進入了靈活運用的境界

怎樣理解消化和吸收的概念

本文首發自「慕課網」,想了解更多IT乾貨內容,程式設計師圈內熱聞,歡迎關注!

作者| 慕課網精英講師 liuyubobobo

最近,遇到了兩個來自同學的提問,我覺得都挺典型的。

一個同學問我,

“學習的過程中,到底怎麼樣才叫學會了?掌握了?”

還有兩個同學,不約而同地問我,

“學習演算法,是不是掌握了基本原理,面試的時候,能說出個大概就好了?”

——對於這個問題,其實不止這兩個同學,在過去的兩年時間裡,我也已經遇到很多次了。

今天這篇文章,就借這些問題,聊一聊我眼裡的,知識掌握的七個境界。

第一重境界:擼串境界

知識掌握的第一重境界,我管它叫“擼串境界”。什麼意思?就是,對於這個知識,你只有在擼串的時候,才能“無障礙”地提起。比如:

A:你知道嗎?昨天人類首張黑洞照片公佈了!

B:是啊是啊,人類離宇宙的真相又近了一步。聽說黑洞和時間的奧秘也有深刻的聯絡,可能我們離時空旅行又近了一步呢。

慕課網免費好課

知識掌握的七重境界,厲害了

慕課網

智慧小程式

擼串的時候,我們可能會不自覺地聊起這種話題。但是,八成,A 和 B 對黑洞的瞭解,都是在“擼串境界”,真的正兒八經地說說黑洞到底是怎麼回事兒,黑洞照片的歷史意義是怎樣的,對未來有可能有什麼影響,黑洞和時間又有什麼聯絡,可能都不太清楚。對於黑洞,也就是在擼串的時候隨便聊聊。

知識掌握的七重境界,厲害了

A:聽說XXX自己做人工智慧,預測股票走勢,賺了一大筆錢!

B:我也聽說了,就是用現在最火的深度學習。Alpha Go 已經戰勝人類最強的圍棋選手了,Alpha Go 用的就是深度學習演算法。

在這段對話裡,A 和 B 對人工智慧和深度學習的理解,八成也是“擼串境界”。

通常,看新聞就能幫助你進入擼串境界。

第二重境界:關鍵詞境界

知識掌握的第二重境界,我管他叫做“關鍵詞境界”。就是,對於這個知識,你掌握了非常重要的幾個關鍵詞。比如:

A:聽說XXX自己做人工智慧,預測股票走勢,賺了一大筆錢!

B:我也聽說了,就是用現在最火的深度學習。好像是建立了一個叫 LSTM 的模型就好了。我也想找時間學習學習呢,搞不好就能賺 1 個億呢。

在這段對話裡,B 對深度學習的理解,進入了“關鍵詞境界”。當然,在這裡我只是舉例子,畢竟 LSTM 只是深度學習的一種方式,深度學習領域也有很多其他重要關鍵詞。在這裡,我想強調的是:關鍵詞境界和擼串境界,是截然不同的。

為什麼?因為如果你處於關鍵詞境界,這個知識對你來說,就不僅僅是隻有在擼串的時候可以提及的一個縹緲的概念了。你可以利用這個關鍵詞,在網上查詢,進而深入學習。換句話說,這個關鍵詞已經可以指導你行動了——你已經可以開始具體的學習了。

很多時候,我們解決問題,就是缺少一兩個關鍵詞而已。比如,我本科的時候,做一個專案,其中一個子功能,要對使用者輸入的郵箱字串是否合法做驗證。當時我花了很長時間自己設計“所謂的演算法”去處理,其實就是一堆 if-else。到後來,我明白了,這事兒其實用正則表示式,一句話就搞定了。真要說其中的演算法,也是一個專門的領域,叫模式匹配。“正則表示式”,“模式匹配”,就是正確的關鍵詞。如果我早一些知道這些關鍵詞,我就可以直接去學習正則表示式的使用,或者直接去學習“模式匹配”演算法,就會少走很多彎路。

在這裡,我要強調,從學習的角度,我覺得這個彎路,也是值得的。因為透過我的思考和嘗試,再去看成熟的解決方案,我就能看到差距,總結自己思維上的缺陷,對知識的理解也會更深刻。我經常說,在大多數情況下,走一些彎路絕不是壞事,走彎路是進步的源泉,所謂失敗是成功之母。只不過,對於很多時間緊任務急的業務場景,可能現實不允許你走彎路。

第三重境界:原理境界

第三重境界,就是你不但知道了這個關鍵詞,你還知道了原理。

歸併排序對你來說不僅僅是一個名詞,你知道歸併排序是每次將整個陣列分成兩部分,將這兩部分排好序以後,再合併起來;

快速排序對你來說不僅僅是一個名詞,你知道快速排序是每次以一個元素為標定點,把陣列分成小於這個元素和大於這個元素兩部分,對這兩部分再去遞迴地進行排序;

二分搜尋對你來說也不是一個名詞,你知道,二分搜尋就是對一個有序陣列,先檢查中間的元素,如果正好是你要查詢的內容,就ok了;如果不是,你要查詢的內容比它小,繼續到左邊找;你要查詢的內容比它大,繼續到右邊找。

大部分同學透過在學校的專業學習,應該是至少能達到原理境界的。也就是,你知道這個名詞,瞭解這個名詞在解決什麼問題,同時,也能用自然語言表述他的原理。

但是,在這裡,我必須提醒大家,

對於計算機專業的學習,必須要把基礎知識的掌握上升到第四重境界。

第四重境界:實踐境界

所謂的“實踐境界”,在計算機領域,其實就是,你不僅僅能說出原理,還能用程式碼將他們正確實現出來。換句話說,你不僅僅知道“歸併排序”、“快速排序”、“二分搜尋”,你還能寫出正確的程式碼。

我在這篇推文開篇,兩個同學,不約而同地問我,“學習演算法,是不是掌握了基本原理,面試的時候,能說出個大概就好了?”他們的問題,本質就是:對於演算法知識的掌握,有沒有必要進入實踐境界?

我的答案是:太有必要了。因為,這是計算機專業跟非計算機專業的本質區別。也是你能吃這碗飯,別人不能吃這碗飯的關鍵。

計算機專業要做的,就是把抽象的邏輯轉換成可以正確實現這個邏輯的程式碼。如果能顧及程式碼的效率,可維護性,甚至是簡潔優雅,那就更好了。但如果你只是懂原理,能扯淡的話,恕我直言,別說數學系物理效能碾壓你,連文學系歷史系,甚至是一個素質高點兒的高中生乃至初中生,隨便看兩眼,可能都能碾壓你。但是讓他們轉行程式設計師,還是會費一番功夫的,為什麼?

正確,優雅,高效的程式碼實現能力,不是一日之功。

如果到達原理境界就 ok 的話,我的所有演算法課程,長度都可以直接縮減到 1/5。但是,能用程式碼正確地實現出來,完全是另一回事兒。很多同學說得清楚原理,但是實現不出正確的程式碼。這就是程式設計基礎不夠。由於你實現不出正確的程式碼,我也不敢保證你的理解是完全正確的。

你跟我扯再多永動機的原理,要想讓我不質疑你,請實現出一個永動機證明給我看。你跟我扯再多鍊金術的原理,要讓不懷疑你,請把這個易拉罐變成金子給我看。

同理,你說你懂快速排序,不要廢話,實現一個快速排序給我看。

Linus Torvalds說:talk is cheap, show me the code。

知識掌握的七重境界,厲害了

大家一定要明白,計算機是工科,工科是靠東西說話的。我相信這也是很多同學選擇計算機專業的一個原因——它沒那麼多虛的。你專業水平高,你就能實現出來,時間短,效率高,程式碼整潔優雅,讓所有人都閉嘴。從某一個維度看,這確實是更公平的,不像在有一些行業或者領域,單靠嘴皮子,人和人能拉開很大的差距。(當然,一切都是相對的,公平這個話題太大了,有時間單聊。)

所以,大家在具體學習的時候,一定要明白:我是計算機專業的,能實現出來,才是我的立身之本。

第五重境界:靈活應用境界

第五重境界,就是靈活運用。知識是死的,能靈活地運用這些知識解決實際問題,甚至是解釋生活中的現象,對這個知識點,就達到了這重境界。

隨便舉幾個例子。

Leetcode 上 1011 號問題,大家可以看一看。在這裡,我把中文版本的問題也截了一個圖(沒時間看具體問題直接跳過去,在這裡只是舉個例子):

知識掌握的七重境界,厲害了

對於這個問題,如果你能很快地反應出,應該使用二分查詢法來解決的話,你對二分查詢的理解,就已經進入了靈活運用的境界。相較而言,寫出正確的二分搜尋程式碼,是簡單的,但是,能快速反映出這類問題可以使用二分查詢的思路去解決,還需要一定的專業訓練才能達到。實際上,類似這樣的使用二分查詢法解決的問題,是演算法競賽裡常見的問題套路。二分查詢本身,也絕不僅僅侷限在在一個有序陣列中找一個數而已。對這個問題的深入解析,我在文章中不具體分析了,有興趣的同學,可以自行搜尋學習。

再比如,經典的“智力”題,過河問題:

農夫需要把狼、羊、菜和自己運到河對岸去,只有農夫能夠划船,而且船比較小,除農夫之外每次只能運一種東西,還有一個棘手問題,就是如果沒有農夫看著,羊會偷吃菜,狼會吃羊。請考慮一種方法,讓農夫能夠安全地安排這些東西和他自己過河。

以及經典的“裝水問題”,版本眾多,我隨便取一個:

有兩個水桶一個裝5升一個裝3升怎麼利用水桶得到4升水?

如果你看見這類問題,能很快地想到,他們的本質,是圖論中的一個路徑搜尋問題,那麼你對路徑搜尋演算法的掌握,就進入了靈活應用境界。給你一個圖,讓你找到從 s 到 t 的一個路徑,是簡單的;但是對於這類問題,可以使用圖論去建模,將其轉化成一個圖中的路徑搜尋問題,是需要一定的專業訓練的。

再舉一個 Google 的面試問題:

一個硬幣,拋了 1000 次,結果有 560 次是正面,請問,你覺得這枚硬幣是不是“公平”的?

如果學過機率論的同學,可能都能說出什麼是中心極限定理,都知道假設檢驗。但是,遇到這樣一個問題,能不能聯絡已經掌握的知識,有理有據地說明白你得出結論的依據?需要你對相應的知識,達到靈活運用的境界。

第六重境界:發明創造境界

上面的幾重境界,都是對已有知識的掌握逐漸深入。但是,這個世界上尚未解決的問題還很多,能不能根據已有知識,發明創造出新知識,進而解決新的問題?這就是發明創造的境界。所有的諾貝爾獎,圖靈獎的獲獎者,對相關領域的知識掌握,都在發明創造的境界。

首先,必須承認,對於任何知識,我都達不到發明創造的境界。

事實上,對於大多數人來說,對某個領域的知識,能整體進入靈活應用的境界,就已經足夠了。因為能夠靈活運用,已經意味著你可以使用這些知識,解決大量實際問題了。這已經對整個社會有相當大的價值了。能否進入發明創造的境界,一方面看你是否有這方面的追求;另一方面,也看機緣和天賦,很多時候,是可遇不可求的。

不過,在這裡,我想強調,所有的新知識,近乎都不是憑空出現的。都是靠大量的對前人知識的積累、理解、甚至是靈活運用之後才出現的。所以,不斷學習前人的知識和思想,是根本。沒有積累,突然發明了新知識,尤其是在當下這個知識爆炸的時代,近乎是不可能的。

所以,不要妄想把自己關起來,就能解決黎曼猜想。不要覺得自己是張無忌,找幾本世界經典教材,在“洞裡”與世隔絕,苦讀三年五載,就能一鳴驚人。金庸的小說是成年人的童話。所謂的童話,就是騙人的。相較而言,不斷地去積累,甚至是跨領域的積累知識,從其他領域的知識中汲取靈感,才有可能更大機率地發明出新的知識,解決更難的問題。

第七重境界:遺忘境界

第七重境界,我稱之為遺忘境界。在這裡,首先要說明,前六重境界,是層層遞進的關係。但是,在這裡,我說的第七重境界,不是第六重境界的一個遞進,而只是一種狀態——遺忘而已。

相信很多同學都有這樣的苦惱:學了很多知識,很快就忘掉了。即使曾經達到靈活運用的境界,但是可能各種原因,幾年甚至十幾年沒有碰,最後也會遺忘。

在這裡,我想強調的是:這是極其正常的。如果你不會遺忘的話,你就是一個超人了。或者你擁有機器貓中的記憶麵包,你應該已經是全球首富了。

知識掌握的七重境界,厲害了

關鍵在於,如何抵抗遺忘?首先,對一個知識的掌握,你的境界越高,越不容易遺忘。相較於已經達到靈活運用境界裡的知識,只在原理境界的知識,更容易被遺忘。

另外,使用次數越多的知識,越不容易遺忘。其實在我國,大多數初等教育,都是在採用“重複使用”這種方法,來幫助你記憶知識的。你根本沒有具體應用過這些知識,但就是忘不了 how are you 後面,接的是 fine, thank you。 and you? 對於這種機械式地使用,我的評價是中性的。有好有壞,有機會可以單獨寫文。

其實,遺忘並不可怕,遺忘境界是一種境界。如果你的遺忘境界中存在著某種知識,基本就意味著你能迅速地把它撿起來,重新回到原來的境界,這是很重要的。所謂的經驗,不過是遺忘境界的儲存。比如,紅黑樹的內部原理,很容易遺忘。但是,如果你跟著我的課程,認認真真學習了紅黑樹的原理,實現了紅黑樹的程式碼,那麼,即使你遺忘了,我相信,對於正常智力水平的同學,在需要的時候,比如面試前,一兩個小時的時間,足以讓你回到原有的水平。

最後,我想說的,雖然學習的目的不是遺忘,但學習的目的也絕不僅僅是記住。其實,“記住”,是學習的一個太低層級的收穫。關鍵是,在學習的過程中,你的大腦在消化、吸收知識的過程中,會連帶有很多附加的收穫。這些附加的收穫,在很多時候,都是更加重要的。

比如,對數學的學習,會逐漸讓你對數字更敏感,同時,形成如何用數學模型解決問題的思維方式(所謂的數學思維和數學素養);

對演算法的學習,會逐漸培養你理清邏輯的習慣,對每一個變數作用的深刻理解,也能讓你寫出越來越優雅的程式碼;

更不用提,在學習的過程中,你會逐漸總結出適合自己的學習方法,把他們應用在更多領域的學習上;

你會慢慢體會到如何能夠更加高效地查詢資料,如何歸納,總結知識體系,幫助你更好的理解;

你會去提問。在提問的過程中,你會越來越多地理解:怎樣提問更加有效?什麼是一個好的問題?;

你會給別人講解,在給別人講解的過程中,你也能鍛鍊自己的表達能力;

你甚至能在學習過程中,逐漸找到自己的興趣,自己的天賦,自己的理想;

透過學習越來越多的東西,你也會越來越有自信,你能感受到天地之大,也能感知到自己之小;

所有的這些,都比學習某一個具體的知識點,重要太多了。

愛因斯坦說:所謂的教育,就是忘記了在學校所學的一切之後,剩下的東西。

大家加油!:)

歡迎關注「慕課網」,發現更多IT圈優質內容,分享乾貨知識,幫助你成為更好的程式設計師!

推薦文章