應用優先學習
快速學習時,容易遭遇的挑戰
快速變動的時代,知識也會快速地過時,為了因應時代,我們常常不得不採取「應用優先」的學習方法,才足以快速地掌握層出不窮的新知識。
什麼叫做應用優先的學習方式呢?比方說,以「線性代數」這門課為例,數學系的教法會先教向量空間,出的作業與考試的內容,會讓學生把定理的証明都証明一遍。而電機系的教法,則很快就進入矩陣,不久就會談到一些工程的問題如何用線性代數來處理,考試考的題目,就是用線性代數解工程的問題。數學系的教法,可稱之為完備優先,重點放在讓學生了解,該知識的本質。而電機系的教法,可稱之為應用優先,重點是這項知識的用途,而不是這項知識本身內部層層嵌套的所有細節。
要用應用優先的方式,快速掌握表面、但是應用性高的知識,不妨在學習一項新知識時,自我提問下列幾個問題:
它叫什麼名字?屬於麼類別? (what)
它有什麼用途?它對外在世界的關系為何? (why)
它的內部大概是如何運作的? (how)
有實際的例子嗎?或是其它相似的東西? (for example)
比方說,如果我們知道藍鯨是哺乳類而非魚類,光是了解了這個分類,自然我們就可以推論,藍鯨是用肺呼吸、是胎生而非卵生。而看到了藍鯨的身體外型是魚型,也可以大概猜想出,這樣子的生物是生活在水中的。而看到了海豚、虎鯨,覺得牠們與藍鯨看來相似,確實也可以如此推論牠們大概的生活方式。
然而,在我的觀察,許多使用這個方式來學習的人,常常在為知識分類的這一步,太過快速倉促,因而沒有充分掌握知識的本質,以下舉兩個例子來加以說明這個現象。
NoSQL
很多人學習新資料庫時,遇到過去沒有聽過的資料庫時,一旦發現該資料庫被分類為 NoSQL 類後,就立刻去推論「喔,所以這個資料庫是特殊用途,不能當通用資料庫來使用。」「喔,所以這個資料庫八成是為了可擴充性 (scalable) 而使用,一般的執行效能需求之下通常不會用到。」這樣子的推斷方法,有時候算是正確,有時則否。
只透過 NoSQL 這樣子的分類,無法帶來足夠明確的資訊,換言之,這算是個不太有意義的分類。
常見的四種 NoSQL 資料庫裡之中的三種:key-value, columnar-family, document 其實相對相似,在我來看,它們都可稱之為 aggregate store 。它們的相同點多過不同點,比方說,它們的設計都可以看成是『在簡化資料庫的查詢語言的前提之下,提高可以達成的最高效能。』也正因如此,如果我們將資料儲存於上述三類資料庫之中,一旦我們需要取出的資訊,是查詢語言所無法查詢而得到時,我們往往就必須轉向 Map Reduce 的解法,才能達成目的。
另一方面,NoSQL 資料庫的一類,graph database,它與其它三類的差距相當大,它反而比較靠近於 RDBMS ,提供極度發達的查詢語言。甚至我們可以說,它提供的查詢語言是最發達的,還勝過 RDBMS 一籌。
recursive CTE (common table expression)
我之前在研究 SQL 的 recursive CTE 時,一直覺得很奇怪,看不太出來,recursive 的點在哪?後來,我多讀了一些參考資料之後,才發現,這個又是一個經典的古怪命名,因為實際上,recursive CTE 它是一種 iterative 的語法結構。換言之,語法的命名是叫「遞迴」,該語法的實質上卻是「迭代」的語意。
也正因如此,它可以處理的問題,其實是迭代語意可以處理的問題。真正適合遞迴語意來處理的,反而辦不到。另一方面,一些可用 recursive CTE 處理的問題,有時候也可以找到更簡單的解法,因為一些 SQL 的函數本身就內建了「迭代」的語意,比方說 generate_series。
結論
快速學習新知是這個時代很需要的能力,但是,求快的時候,把每個關鍵步驟 (what, why, how, for example) 研究得夠清楚,才能確保自己確實掌握了新知識。


