一直以來伴隨我的一些學習習慣 四 知識結構

2021-04-25 05:43:37 字數 2834 閱讀 3368

自從建立了 toplanguage 以來,發現在上面待的時間越來越多,與高手討論問題是個粘性十足的事情,一方面,分享自己的認識是整理不成熟的想法的極好途徑,另一方面,互相之間視角不同,所以往往自己忽視的地方會被別人發現。在討論中不斷精化既有的知識體系。以下這段基本上摘抄自(略有整理和新增)在 toplanguage 上的發言:

抓住不變數

我喜歡把知識分為essential的和non-essential的。對於前者採取提前深入掌握牢靠的辦法,對於後者採取待用到的時刻rtm (read the manual)方法(用本)。

再來說一下為什麼需要預先牢靠掌握這些essential的知識:

根據joel spolsky同學的說法(原文),程式語言技術是對底層裝置的封裝,然而封裝總是會出現漏洞的,於是程式設計師被迫下到「下水道」當中去解決問題,一旦往下走,漂亮的oo、n層抽象就不復存在了,這時候不具備堅硬的底層知識就會無法解決問題。簡而言之就是這些底層知識會無可避免的需要用到,既然肯定會被用到那還是預先掌握的好,否則一來用到的時候再查是來不及的,因為essential的知識也往往正是那些需要較長時間消化掌握的東西,不像ruby的mixin或closure這種翻一下manual就能掌握的東西。(英語也是這樣的essential knowledge——上次在pycn上看到乙個招python開發人員的帖子將英語列為必備技能,卻並不將自然語言處理列為必備技能,正是因為英語不是可以臨陣磨槍的東西,而且作為知識的主要載體,任何時候都少不了它,如果不具備英語能力,這個就會成為個人知識結構的短板或瓶頸,而且由於需要長時間才能獲得這項能力,所以這個瓶頸將持續很長時間存在。我們曾經在 toplanguage 上討論過如何花最少的時間掌握英語)另一方面,在問題解決當中,如果不具備必要的知識,是根本無從思考的,再好的分析能力也並不是每個問題都能分析出該用哪些知識然後再去查手冊的,很多時候是在工具和問題之間比較,聯想,試探性的拼湊來解決問題;這就使得乙個好的既有知識基變得至關重要。(實際上以上這個是乙個較大的話題,希望有一天我能夠把它詳細展開說清:))

如果你不知道某個工具的存在,遇到問題的時候是很難想到需要使用這麼樣乙個工具的,essential knowldge就是使用最為廣泛的工具,程式設計當中遇到某些問題之後,如果缺乏底層知識,你甚至都不知道需要去補充哪些底層知識才能解決這個問題。

你必須首先熟悉你的工具,才能有效地使用它(須知工具的強是無敵的,但這一切得以「了解你的工具」為前提,甚至得以「了解目前可能有哪些工具適合你的問題」為前提)。一門語言,你必須了解它的適用場景,不適用場景(比如繼承能解決你的問題不代表繼承就是解決你的問題的最適合的方案,須知問題是乙個複雜系統,解決方案總是常常引入新的問題)。你必須了解它支援的主要程式設計正規化,此外你還必須了解它的traps和pitfalls(缺陷和陷阱,如果不知道陷阱的存在,掉進去也不知道怎麼掉的。)這些都是essential knowledge,如果不事先掌握,指望用的時候查manual,是很浪費時間的,而且正如第2點所說,正因為你不知道這些知識(如適用場景),從而用sub-optimal的方式使用了一門語言自己可能還不知道(最小白的例子是,如果你不知道語言支援foreach,那麼可能每次都要寫乙個冗長的迴圈,較常見的例子是不知道有很方便的庫設施可以解決手頭的問題所以傻乎乎的自己寫了一堆**),因為人的評價標準常常是:只要解決了最醒目的問題並且引入的新問題尚能忍受,就行。注意,熟悉並非指熟悉所有細節,而是那些重要的,或者無法在需要用到的時候按需查詢的知識。比如上面提到的:適用場景不適用場景,程式設計正規化,主要語言特性,缺陷和陷阱。

當然,以上作為程式設計師的essential knowledge列表並不完備,關鍵是自己在學習新知識的時候帶著第三隻眼來敏銳地判斷這個知識是否是不變數,或不易變的量,是否完全可以在用的時候查手冊即可,還是需要提前掌握(一些判斷方法在上文也有所提及)。並且學會在紛繁的知識中抽象出那些重要的,本質的,不變的東西。我在之前的part裡面也提到我在學習新知識的時候常常問自己三個問題:該知識的(體系或層次)結構是什麼、本質是什麼、第一原則是什麼。

另外還有一些我認為是essential knowledge的例子:分析問題解決問題的思維方法(這個東西很難讀一兩本書就掌握,需要很長時間的鍛鍊和反思)、判斷與決策的方法(生活中需要進行判斷與決策的地方遠遠多於我們的想象),波普爾曾經說過:all life is problem-solving。而判斷與決策又是其中最常見的一類problem solving。儘管生活中面臨重大決策的時候並不多,但另一方面我們時時刻刻都在進行最重大的決策:如:決定自己的日常時間到底投入到什麼地方去。如:你能想象有人寧可天天花時間剪報紙上的優惠券,卻對於房價的1%的優惠無動於衷嗎?(《別做正常的傻瓜》、《predictably irrational》)如:你知道為什麼當手頭**的股價不可抑止地滑向深淵時我們卻一邊揪著頭髮一邊愣是不肯撤出嗎?(是的,我們適應遠古時代的心理機制根本不適應金融市場。)糟糕的判斷與決策令我們的生活變得糟糕,這還不是最關鍵的,最關鍵的是我們從來不會去質疑自己的判斷,而是總是能「找到」其他為自己辯護的理由(《錯不在我(mistakes were made, but not by me)》)又,現在是乙個資訊氾濫的時代,於是另乙個問題也出現:如何在海洋中有效篩選好的資訊,以及避免被不好的資訊左右我們的大腦(critical thinking)關於以上提到的幾點我在豆瓣上有乙個專門的豆列(「學會思考」),希望有一天我能夠積累出足夠多的認識對這個主題展開一些詳細介紹。

最後分享乙個學習小tip:

學習乙個小領域的時候,時時把「最終能夠寫出一篇漂亮的survey」放在大腦中提醒自己,就能有助於在閱讀和實踐的時候有意無意地整理知識的結構、本質和重點,經過整理之後的知識理解更深刻,更不容易忘記,更容易被提取。

[1] 有些事情做起來比想象中容易

[2] 有關讀書方法的一點想法

[3] 一件事情如果你沒有說清楚,十有**不能做好

聞香止步 ** 木雕 髮簪 收集於:http://mindhacks.cn/2008/12/05/learning-habits-part4/

我一直以來對clock 函式誤解

在最近的一次 除錯中,我才發現我對clock 一直都是錯誤的認知。我一直都以為clock 返回的值就是程式從開始到執行此函式時所執行的時間,其實不是 執行時間 而是程式所占用處理器的 執行時間 也就是說,當處於核心態或排程到其他程式時,這個時間就會暫停。比如說呼叫了sleep usleep 等會引發...

一直以來,我總是想得太多,做得太少

曾經無數次構想自己的路,但是走到今天,卻突然發現,自己選擇的路太規矩。太久沒寫東西,邏輯已經混亂了 從大一入學到現在,已經過去了一年半,這一年半,我學到了什麼?我長進了什麼?我在腦海裡狂搜一遍,發現什麼都沒學到。如今的我跟剛入學的我相比沒有本質的變化。我覺得這些都要歸咎於我沒有乙個規劃,或者說沒有乙...

關於一些學習習慣的建議

多鼓勵 多肯定 沉住氣 不批評。目標合理,別跟別人比,大目標,加速要慢,不要急 教輔最多兩本,需要再買。不合適的教輔要及時更換,覺得難不要硬做。養成自主學習習慣,自己檢查,不要怕錯。每天背單詞的習慣。每週背一篇古詩,至少熟讀讀一篇古文觀止或歷史典故。針對自學課程或者預習課程,別怕做題,別怕考試,別怕...