一年之計:如何構建知識體系?
先說一件值得思考的事情:高考的時候大家都是一樣的教科書,同一個教室,同樣的老師輔導,時間精力基本差不多,可是最後別人考的是清華北大或者一本,而你的實力只能考個三本,爲什麼?當然這裏主要是智商的影響,那麼其他因素呢?智商解決的問題能不能後天用其他方式來補位一下?
大家平時都看過很多方法論的文章,看的時候很爽覺得非常有用,但是一兩週後基本還是老樣子了。其中有很大一部分原因那些方法對腦力有要求、或者方法論比較空缺少落地的步驟。下文中描述的方式方法是不需要智商也能學會的,非常具體的。
_
—__1_ —
關鍵問題點
爲什麼你的知識積累不了?
有些知識看過就忘、忘了再看,實際碰到問題還是聯繫不上這個知識,這其實是知識的積累出了問題,沒有深入的理解自然就不能靈活運用,也就談不上解決問題了。這跟大家一起看相同的高考教科書但是高考結果不一樣是一個原因。問題出在了理解上,每個人的理解能力不一樣(智商),絕大多數人對知識的理解要靠不斷地實踐(做題)來鞏固。
同樣實踐效果不一樣?
同樣工作一年碰到了 10 個問題(或者說做了 10 套高考模擬試卷),但是結果不一樣,那是因爲在實踐過程中方法不夠好。或者說你對你爲什麼做對了、爲什麼做錯了沒有去覆盤。
假如碰到一個問題,身邊的同事解決了,而我解決不了。那麼我就去想這個問題他是怎麼解決的,他看到這個問題後的邏輯和思考是怎麼樣的,有哪些知識指導了他這麼邏輯推理,這些知識哪些我也知道但是我沒有想到這麼去運用推理(說明我對這個知識理解的不到位導致靈活運用缺乏);這些知識中又有哪些是我不知道的(知識缺乏,沒什麼好說的快去 Google 什麼學習下–有場景案例和目的加持,學習理解起來更快)。
等你把這個問題基本按照你同事掌握的知識和邏輯推理想明白後,需要再去琢磨一下他的邏輯推理解題思路中有沒有不對的,有沒有囉嗦的地方,有沒有更直接的方式(對知識更好地運用)。
我相信每個問題都這麼去實踐的話就不應該再抱怨靈活運用、舉一反三,同時知識也積累下來了,這種場景下積累到的知識是不會那麼容易忘記的。
這就是向身邊的牛人學習,同時很快超過他的辦法。這就是爲什麼高考前你做了 10 套模擬題還不如其他人做一套的效果好。
知識 + 邏輯基本等於你的能力,知識讓你知道那個東西,邏輯讓你把東西和問題聯繫起來。
這裏的問題你可以理解成方案、架構、設計等。
系統化的知識哪裏來?
知識之間是可以聯繫起來的並且像一顆大樹一樣自我生長,但是當你都沒理解透徹,自然沒法產生聯繫,也就不能夠自我生長了。
真正掌握好的知識點會慢慢生長連接最終組成一張大網。
但是我們最容易陷入的就是掌握的深度、系統化(工作中碎片時間過多,學校裏缺少時間)不夠,所以一個知識點每次碰到花半個小時學習下來覺得掌握了,但是 3 個月後就又沒印象了。
總是感覺自己在懵懵懂懂中,或者一個領域學起來總是不得要領,根本的原因還是在於:宏觀整體大圖瞭解不夠(缺乏體系,每次都是盲人摸象);關鍵知識點深度不夠,理解不透徹,這些關鍵點就是這個領域的骨架、支點、抓手。缺了抓手自然不能生長,缺了宏觀大圖容易誤入歧途。
我們有時候發現自己在某個領域學起來特別快,但是換個領域就總是不得要領,問題出在了上面,即使花再多時間也是徒然。這也就是爲什麼學霸看兩個小時的課本比你看兩天效果還好,感受下來還覺得別人好聰明,是不是智商比我高啊。
所以新進入一個領域的時候要去找他的大圖和抓手。
好的同事總是能很輕易地把這個大圖交給你,再順便給你幾個抓手,你就基本入門了,這就是培訓的魅力,這種情況肯定比自學效率高多了。但是目前絕大部分的培訓都做不到這點。
好的邏輯又怎麼來?
實踐、覆盤。
_
—__2_ —
講個前同事的故事
有一個前同事是 5Q 過來的,負責技術(所有解決不了的問題都找他),這位同學從 ChinaRen 出道,跟着王興一塊創業 5Q,5Q 在學校靠雞腿打下大片市場,最後被陳一舟的校內收購(據說被收購後 5Q 的好多技術都走了,最後王興硬是呆在校內網把合約上的所有錢都拿到了)。
這位同學讓我最佩服的解決問題的能力,好多問題其實他也不一定就擅長,但是他就是有本事通過 Help、Google 不停地驗證嘗試就把一個不熟悉的問題給解決了,這是我最羨慕的能力,在後面的職業生涯中一直不停地往這個方面嘗試。
應用剛啓動連接到數據庫的時候比較慢,但又不是慢查詢。
-
這位同學的解決辦法是通過 tcpdump 來分析網絡包,看網絡包的時間戳和網絡包的內容,然後找到了具體卡在了哪裏。
-
如果是專業的 DBA 可能會通過 show processlist 看具體連接在做什麼,比如看到這些連接狀態是 authentication 狀態,然後再通過 Google 或者對這個狀態的理解知道創建連接的時候 MySQL 需要反查 IP、域名這裏比較耗時,通過配置參數 skip-name-resolve 跳過去就好了。
-
如果是 MySQL 的老司機,一上來就知道連接慢的話跟 skip-name-resolve 關係最大。
在我眼裏這三種方式都解決了問題,最後一種最快但是純靠積累和經驗,換個問題也許就不靈了;第一種方式是最牛逼和通用的,只需要最少的知識就把問題解決了。
我當時跟着他從 sudo、ls 等 Linux 命令開始學起。當然我不會輕易去打攪他問他,每次碰到問題我儘量讓他在我的電腦上來操作,解決後我再自己覆盤,通過 history 調出他的所有操作記錄,看他在我的電腦上用 Google 搜啥了,然後一個個去學習分析他每個動作,去想他爲什麼搜這個關鍵字,覆盤完還有不懂的再到他面前跟他面對面的討論他爲什麼要這麼做,指導他這麼做的知識和邏輯又是什麼。
_
—__3_ —
有哪些好的行爲幫你更好地掌握知識
看東西的時候要做筆記,要不當時看得再爽也很容易忘記,我們需要反覆複習來加深印象和理解,複習的根據就是筆記(不可能再完整又看一次),筆記整理出裏面的要點和你的盲點。
一段時間後把相關的筆記整理成一篇體系性的博客文章,這樣既加深了理解又系統化了相關知識。以後再看到跟這篇博客相關的案例、知識點時不斷地更新博客(完善你的知識點)。
_
—__4_ —
場景式學習、體感的來源、面對問題學習
前面提到的對知識的深入理解這有點空,如何才能做到深入理解?
舉個學習 TCP 三次握手例子
經歷稍微豐富點的工程師都覺得 TCP 三次握手看過很多次、很多篇文章了,但是文章寫得再好似乎當時理解了,但是總是過幾個月就忘了或者一看就懂,過一陣子被人一問就模模糊糊了,或者兩個爲什麼就答不上了,自己都覺得自己的回答是在猜或者不確定。
爲什麼會這樣呢?而學其它知識就好通暢多了,我覺得這裏最主要的是我們對 TCP 缺乏體感,比如沒有幾個工程師去看過 TCP 握手的代碼,也沒法想象真正的 TCP 握手是如何在電腦裏運作的(打電話能給你一些類似的體感,但是細節覆蓋面不夠)。
如果這個時候你一邊學習的時候一邊再用 Wireshark 抓包看看三次握手具體在幹什麼,比抽象的描述實在多了,你能看到具體握手的一來一回,並且看到一來一回帶了哪些內容,這些內容又是用來做什麼、爲什麼要帶,這個時候你再去看別人講解的理論頓時會覺得好理解多了,以後也很難忘記。
但是這裏很多人執行能力不強,想去抓包,但是覺得要下載安裝 Wireshark,要學習 Wireshark 就放棄了。只看不動手當然是最舒適的,但是這個最舒適給了你在學習的假象,沒有結果。
這是不是跟你要解決一個難題非常像,這個難題需要你去做很多事,比如下載源代碼(翻不了牆,放棄);比如要編譯(還要去學習那些編譯參數,放棄);比如要搭建環境(太瑣屑,放棄)。你看這中間九九八十一難你放棄了一難都取不了真經。這也是爲什麼同樣學習、同樣的問題,他能學會,他能解決,你不可以。
再來看一個解決問題的例子
會員系統雙 11 優化這個問題對我來說,我是個外來者,完全不懂這裏面的部署架構、業務邏輯。但是在問題的關鍵地方(會員認爲自己沒問題–壓力測試正常的;淘寶 API 更是認爲自己沒問題,AliMonitor 監控顯示正常),結果就是會員的同學說我們沒有問題,淘寶 API 肯定有問題,然後就不去思考自己這邊可能出問題的環節了。思想上已經甩包了,那麼即使再去 review 流程、環節也就不會那麼仔細,自然更是發現不了問題了。
但是我的經驗告訴我要有證據地甩包,或者說拿着證據優雅地甩包,這迫使我去找更多的細節證據(證據要給力哦,不能讓人家拍回來)。如果我是這麼說的,這個問題在淘寶 API 這裏,你看理由是……,我做了這些實驗,看到了這些東東。那麼淘寶 API 那邊想要證明我的理由錯了就會更積極地去找一些數據。
事實上我就是做這些實驗找證據過程中發現了會員的問題,這就是態度、執行力、知識、邏輯能力綜合下來拿到的一個結果。我最不喜歡的一句話就是我的程序沒問題,因爲我的邏輯是這樣的,不會錯的。你當然不會寫你知道的錯誤邏輯,程序之所以有錯誤都是在你的邏輯、意料之外的東西。有很多次一堆人電話會議中扯皮的時候,我一般把電話靜音了,直接上去人肉一個個過對方的邏輯,一般來說電話會議還沒有結束我就給出來對方邏輯之外的東西。
_
—__5_ —
釘子式學習方法和系統性學習方法
系統性學習方法就是想掌握 MySQL,那麼搞幾本 MySQL 專著和 MySQL 官方 DOC 看下來,一般課程設計的好的話還是比較容易掌握下來,絕大部分時候都是這種學習方法,可是在種學習方法的問題在於學完後當時看着似乎理解了,但是很容易忘記,一片一片地系統性的忘記,並且缺少應用能力(理解不深)。這是因爲一般人對知識的理解沒那麼容易真正理解(掌握或者說應用)。
釘子式的學習方式,就是在一大片知識中打入幾個樁,反覆演練將這個樁不停地夯實,夯穩,做到在這個知識點上用通俗的語言跟小白都能講明白,然後再這幾個樁中間發散像星星之火燎原一樣把整個一片知識都掌握下來。這種學習方法的缺點就是很難找到一片知識點的這個點,然後沒有很好整合的話知識過於零散。
釘子式學習方法看着慢但是因爲這樣掌握的更透徹和牢固實際最終反而快。
我們常說的一個人很聰明,就是指系統性的看看書就都理解了,是真的理解那種,還能靈活運用,但是大多數普通人就不是這樣的,看完書似乎理解了,實際幾周後基本都忘記了,真正實踐需要用的時候還是用不好。
舉個 Open-SSH 的例子
爲了做通 SSH 的免密登陸,大家都需要用到 ssh-keygen/ssh-copy-id, 如果我們把這兩個命令當一個小的釘子的話,會去了解 ssh-keygen 做了啥(生成了密鑰對),或者 ssh-copy-id 的時候報錯了(原來是需要祕鑰對),然後將 ssh-keygen 生成的 pub key 複製到 server 的~/.ssh/authorized_keys 中。
然後你應該會對這個原理要有一些理解(更大的釘子),於是理解了密鑰對,和 SSH 驗證的流程,順便學會怎麼看 SSH debug 信息,那麼接下來網絡上各種 SSH 攻略、各種 SSH 卡頓的解決都是很簡單的事情了。
比如你通過 SSH 可以解決這些問題:
-
免密登陸
-
SSH 卡頓
-
怎麼去掉 SSH 的時候需要手工多輸入 yes
-
我的 SSH 怎麼很快就斷掉了
-
我怎麼樣才能一次通過跳板機 SSH 到目標機器
-
我怎麼樣通過 SSH 科學上網
-
我的 Ansible(底層批量命令都是基於 SSH)怎麼這麼多問題,到底是爲什麼
-
我的 Git 怎麼報網絡錯誤了
-
X11 forward 我怎麼配置不好
-
HTTPS 爲什麼需要隨機數加密,還需要簽名
-
……
這些問題都是一步步在擴大 SSH 的外延,讓這個釘子變成一個巨大的樁。
然後就會學習到一些高級一些的 SSH 配置,比如干掉經常 SSH 的時候要 yes 一下(StrictHostKeyChecking=no),或者怎麼配置一下 SSH 就不會斷線了(ServerAliveInterval=15),或者將 SSH 跳板機 ->SSH Server 的過程做成 SSH Server 一步就可以了(ProxyCommand),進而發現用 SSH 的 ProxyCommand 很容易科學上網了,或者 Git 有問題的時候輕而易舉地把 SSH debug 打開,對 Git 進行 debug 了……
這基本都還是 SSH 的本質範圍,像 Ansible、Git 在底層都是依賴 SSH 來通訊的,你會發現學、調試 X11、Ansible 和 Git 簡直太容易了。
另外理解了 SSH 的祕鑰對,也就理解了非對稱加密,同時也很容易理解 HTTPS 流程(SSL),同時知道對稱和非對稱加密各自的優缺點,SSL 爲什麼需要用到這兩種加密算法了。
你看一個簡單日常的知識我們只要沿着它用釘子精神,深挖細挖你就會發現知識之間的連接,這個小小的知識點成爲你知識體系的一根結實的柱子。
我見過太多的老的工程師、年輕的工程師,天天在那裏 SSH 密碼,SSH 跳板機,SSH 目標機,一小會 SSH 斷了,重來一遍;或者 SSH 後卡住了,等吧……
在這個問題上表現得沒有求知慾、沒有探索精神、沒有一次把問題搞定的魄力,所以就習慣了。
_
—__6_ —
空洞的口號
很多老師和文章都會教大家:舉一反三、靈活運用、活學活用、多做多練。但是隻有這些口號是沒法落地的,落地的基本步驟就是前面提到的,卻總是被忽視了。
_
—__7_ —
什麼是工程效率,什麼是知識效率
有些人純看理論就能掌握好一門技能,還能舉一反三,這是知識效率,這種人非常少。
大多數普通人都是看點知識然後結合實踐來強化理論,要經過反反覆覆才能比較好地掌握一個知識,這就是工程效率,講究技巧、工具來達到目的。
肯定知識效率最牛逼,但是擁有這種技能的人畢竟非常少(天生的高智商吧)。從小我們周邊那種不怎麼學的學霸型基本都是這類,這種學霸都還能觸類旁通非常快的掌握一個新知識,非常氣人。剩下的絕大部分只能拼時間 + 方法 + 總結等也能掌握一些知識。
非常遺憾我就是工程效率型,只能羨慕那些知識效率型的學霸。但是這事又不能獨立看待有些人在某些方向上是工程效率型,有些方向就又是知識效率型(有一種知識效率型是你掌握的實在太多也就比較容易觸類旁通了,這算灰色知識效率型)。
使勁挖掘自己在知識效率型方面的能力吧,兩者之間當然沒有明顯的界限,知識積累多了邏輯訓練好了在別人看來你的智商就高了。
_
—__8_ —
知識分兩種
一種是通用知識(不是說對所有人通用,而是說在一個專業領域去到哪個公司都能通用);另外一種是跟業務公司綁定的特定知識。
通用知識沒有任何疑問碰到後要非常飢渴地撲上去掌握他們(受益終生,這還有什麼疑問嗎?)。對於特定知識就要看你對業務需要掌握的深度了,肯定也是需要掌握一些的,特定知識掌握好的一般在公司裏混的也會比較好。
一個具體知識體系裏面又有一些核心知識點(抓手、Essential Knowledge),也就是掌握可以快速幫你膨脹、延伸到其他相關知識的知識點。
還有一些知識、工具一旦掌握就能幫你貫穿、具象、理解別的知識點,比如網絡知識體系中的 wireshark;理工科中的數學;知識體系中的學習方法、行爲方式。我們要多去發現這些知識、工具(how?)。
作者:plantegg
來源:https://plantegg.github.io/2020/11/11/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%B7%A5%E4%BD%9C%E4%B8%AD%E5%AD%A6%E4%B9%A0--V2.0/
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/tXpWQ3STTEvf9EX6fGZw2Q