摘要:當然,首先你得知道並認可基礎知識的價值,你纔會願意花費時間和精力去不斷去學習和深入理解它們。你腦子裏一直裝着這些概念,實際工作和學習的時候,遇到相關的問題,你可能就會有點小思考,日積月累,你對它的理解會越來越深。

前面分享過一篇算法學習的文章 :  不懂算法,還想進大廠?做夢吧 。 雖然有點標題黨,但內容還是不錯的。

後來就想能不能對計算機學習方法和學習心得寫個系列的文章,這篇算是第二篇。偏向基礎知識部分, 比如 操作系統,數據庫,網絡 等。

本來這篇文章應該按着算法那篇來寫 --- 寫學習方法,但寫着寫着,就變成一個學習心得了,不過細細想想,覺得這麼寫也對。

經常有同學跟我說,很多的基礎知識學過就忘。每次被問到這個,我都不知怎麼回答,跟他說多看幾次,就記起來了? --- 這似乎是一句廢話,但好像又對,細細想來,這後面還是有不少思考的。

我覺得很多同學在基礎知識上的問題,不是技巧的問題,而是對基礎知識的態度和理解的問題。

所以,這不是一篇教你怎麼學基礎知識的文章,而是告訴你基礎知識的價值和基礎知識在程序員腦海中的演進過程。

對於操作系統,數據庫,網絡等基礎知識地學習,看書,做筆記是必要的。不過我在這裏不教大家怎麼看書,怎麼做筆記,我估計讀過大學的同學,這應該不是大問題。

很多人糾結的問題在於基礎知識老是看了又忘,然後發現工作上好像也用不到,就開始質疑基礎知識的價值,質疑到底該不該花時間去學。

所以先要認可基礎知識的價值,意識到了基礎知識的價值後,你纔會願意花時間去學習。

基礎知識的價值

基礎知識的價值,我覺得有兩個部分。

一個是技巧層面的價值。

拿操作系統裏面的線程和進程來說,線程和進程是cpu調度的基本單位,是代碼的一種動態呈現,只要你寫代碼,就一定會涉及到線程或者進程。當然在實際使用中可能被框架包裝了起來,給人的感知很弱,但一旦你的程序有問題,你總是要用些工具來查看的:查看是那個進程出了問題,要從內存佔用,cpu 佔用,磁盤讀寫等來初步分析問題。

以上這個過程,是稍微有點技術含量的工程工作都會涉及的。上面例舉的例子,你可以擴展到 操作系統鎖,數據庫表,數據庫索引,數據庫鎖,數據庫事務,TCP/IP , HTTP,websocket 等等。

就工程方向來說,幾乎每個方向都要掌握相應的基礎知識,只是每個具體方向對每種具體基礎知識掌握的深入程度不一樣。

像做分佈式存儲的同學,對數據庫表,數據庫鎖,數據庫事務這些的理解肯定是要很深入的;前端的同學對數據庫相關概念的理解可以要求低些,但對網絡,TCP/IP,  HTTP , HTTPS 這些的要求就要高很多。

一個是思維層面的價值。

除了技巧層面的價值,還有思維層面的價值。

怎麼來理解這個事情呢?軟件設計,有很多核心的設計思想,其實是相同的,這些基礎概念,其實也是前人設計和總結出來的。

比如說線程和進程,這些概念不是自然原理,而是一種工程實踐後的軟件抽象,是前人抽象出來的一個結果。它的設計背後,蘊含很多優秀的設計思想和設計原則。

一開始的時候,你只知道這個概念,可能理解起來都覺得很困難,只能死記硬背,但就像我們小時候學習古詩詞,它會給你帶來潛移默化的影響。你腦子裏一直裝着這些概念,實際工作和學習的時候,遇到相關的問題,你可能就會有點小思考,日積月累,你對它的理解會越來越深。這種理解,我覺得就在不斷塑造着你的技術思維。

基礎知識的 演進

說完了價值,我來分享下,基礎知識在 程序員腦海中的演進過程

我覺得對於操作系統和數據庫,光看書幾乎是學不好的,因爲能做的就是背概念,但背完很快就忘記了。

我上操作系統課程之前,看過 linux 的源代碼。對於操作系統,因爲我花了很多時間在 linux 內核上,所以上操作系統課的時候,很多概念對我來說反而是一個彙總,把我很多離散的知識給彙總起來了。

所以我看進程,線程這些概念的時候,不是抽象的而且具象的,腦子裏甚至可以具體到代碼層面。

但很多人沒有我這麼一個經歷,所以看起來一臉懵逼也正常。就像我在大學看數據庫的時候,我也覺得很抽象,看了就忘,直到我後面自己去做存儲,對很多的概念才慢慢地理解深入,開始有感覺。

但這裏不是說就不去看了,不看,你就一直都不會知道,甚至連基本的思考都沒有。

對於基礎知識的學習,其實是循環往復的過程,不是一次性就能掌握的。 對於這類知識的掌握會經歷這麼一個過程:

概念 -> 理解 -> 實踐中的思考 -> 概念 -> 理解 -> 實踐中的思考 ...

這是一個循環往復地過程,但不是重複,而是螺旋式地深入, 每一次循環都能夠帶來更深入的理解。

我們說一個人技術很牛,有很大部分是因爲他對很多的知識點經過了很多次這種循環,他對基礎知識理解的深度要高過很多人。

軟件技術有兩個關鍵,一個是抽象,一個是分層。

其實你會發現很多的概念,知識點,都是一個具體軟件實現的抽象,裏面也有分層。

舉個例子,我們說進程,你看書上就給了一個概念,你覺得很抽象,覺得這是操作系統裏面的一個概念,有點像是原理性的東西。

但你往下一個層次看,到操作系統設計這個層面來看,進程是一個很具象的東西,有具體得代碼,具體的設計,具體的細節,甚至有時候你會覺得有些代碼寫得也不咋地,就像是一個業務邏輯。

從這個層面,這個角度來理解,來看待進程的時候,怎麼可能會懵逼,簡直具象到不行了,甚至還會覺得這不就是一個業務邏輯嘛。

但深度是不是到這裏就停止了,也不是。

你會開始去思考,爲什麼要有這個設計,爲什麼要有這種抽象,你可能會去找相關的論文來看。計算機技術不是自然科學,進程也不是定理性的東西,不是 1+1 等於 2 這種自然存在的,所有一切都是設計出來的。

有設計就會有討論的過程,這些討論的過程或結果很多都還保留在互聯網上。

比如,有一次我們想爲自己做的分佈式存儲,設計事物系統,後來就順藤摸瓜地找到了數據庫大師 Jim Gray 關於事務設計的經典文獻和資料,裏面有他的很多思考和權衡。

到這個時候,事務在你腦海裏已經不是概念,而且一個龐大的東西,很多細節,設計的權衡,你想忘都忘不了了。

甚至你還會思考這種設計是不是最好的,時間過了這麼久,會不會不適應現有的場景了,反正你會思考很多。

我們說有人很牛,我覺得這個就是很關鍵的區別了。

這個過程很艱難,也很緩慢的,要十年甚至二十年的時間,有人可以不斷地深入;也有人只停留在很淺的層面。如果你能不斷深入,你就能不斷地超越很多人,朝着技術大牛的目標邁進。

結語

基礎知識的學習和理解是緩慢且不斷深入的過程,甚至是貫穿整個程序生涯的,不斷深入理解的過程,也是不斷塑造自身技術思維的過程。

當然,首先你得知道並認可基礎知識的價值,你纔會願意花費時間和精力去不斷去學習和深入理解它們。

這篇文章給大家分享了,基礎知識的價值和基礎知識在程序員腦海中的演進過程,這個視角可能比較獨特,不過卻也是我這麼多年來的心得和感悟,希望對大家有所幫助!

推薦閱讀:

一些思考

一個邀約

關於小型長週期項目的一些建議

一個失敗的技術型產品

人越老,臉皮越厚

十年工作生活路

你好,我是大飛, 十年互聯網人!

如果你喜歡我的文章,就給 公衆號加個星標 吧,方便閱讀。

提升技術認知,助力技術成長:

相關文章