前面分享過一篇演算法學習的文章 : 不懂演算法,還想進大廠?做夢吧。 雖然有點標題黨,但內容還是不錯的。
後來就想能不能對計算機學習方法和學習心得寫個系列的文章,這篇算是第二篇。偏向基礎知識部分, 比如 作業系統,資料庫,網路 等。
本來這篇文章應該按著演算法那篇來寫 --- 寫學習方法,但寫著寫著,就變成乙個學習心得了,不過細細想想,覺得這麼寫也對。
經常有同學跟我說,很多的基礎知識學過就忘。每次被問到這個,我都不知怎麼回答,跟他說多看幾次,就記起來了? --- 這似乎是一句廢話,但好像又對,細細想來,這後面還是有不少思考的。
我覺得很多同學在基礎知識上的問題,不是技巧的問題,而是對基礎知識的態度和理解的問題。
所以,這不是一篇教你怎麼學基礎知識的文章,而是告訴你基礎知識的價值和基礎知識在程式設計師腦海中的演進過程。
對於作業系統,資料庫,網路等基礎知識地學習,看書,做筆記是必要的。不過我在這裡不教大家怎麼看書,怎麼做筆記,我估計讀過大學的同學,這應該不是大問題。
很多人糾結的問題在於基礎知識老是看了又忘,然後發現工作上好像也用不到,就開始質疑基礎知識的價值,質疑到底該不該花時間去學。
所以先要認可基礎知識的價值,意識到了基礎知識的價值後,你才會願意花時間去學習。
基礎知識的價值,我覺得有兩個部分。
乙個是技巧層面的價值。
拿作業系統裡面的執行緒和程序來說,執行緒和程序是cpu排程的基本單位,是**的一種動態呈現,只要你寫**,就一定會涉及到執行緒或者程序。當然在實際使用中可能被框架包裝了起來,給人的感知很弱,但一旦你的程式有問題,你總是要用些工具來檢視的:檢視是那個程序出了問題,要從記憶體占用,cpu 占用,磁碟讀寫等來初步分析問題。
以上這個過程,是稍微有點技術含量的工程工作都會涉及的。上面例舉的例子,你可以擴充套件到 作業系統鎖,資料庫表,資料庫索引,資料庫鎖,資料庫事務,tcp/ip , http,websocket 等等。
就工程方向來說,幾乎每個方向都要掌握相應的基礎知識,只是每個具體方向對每種具體基礎知識掌握的深入程度不一樣。
像做分布式儲存的同學,對資料庫表,資料庫鎖,資料庫事務這些的理解肯定是要很深入的;前端的同學對資料庫相關概念的理解可以要求低些,但對網路,tcp/ip, http , https 這些的要求就要高很多。
乙個是思維層面的價值。
除了技巧層面的價值,還有思維層面的價值。
怎麼來理解這個事情呢?軟體設計,有很多核心的設計思想,其實是相同的,這些基礎概念,其實也是前人設計和總結出來的。
比如說執行緒和程序,這些概念不是自然原理,而是一種工程實踐後的軟體抽象,是前人抽象出來的乙個結果。它的設計背後,蘊含很多優秀的設計思想和設計原則。
一開始的時候,你只知道這個概念,可能理解起來都覺得很困難,只能死記硬背,但就像我們小時候學習古詩詞,它會給你帶來潛移默化的影響。你腦子裡一直裝著這些概念,實際工作和學習的時候,遇到相關的問題,你可能就會有點小思考,日積月累,你對它的理解會越來越深。這種理解,我覺得就在不斷塑造著你的技術思維。
說完了價值,我來分享下,基礎知識在程式設計師腦海中的演進過程。
我覺得對於作業系統和資料庫,光看書幾乎是學不好的,因為能做的就是背概念,但背完很快就忘記了。
我上作業系統課程之前,看過 linux 的源**。對於作業系統,因為我花了很多時間在 linux 核心上,所以上作業系統課的時候,很多概念對我來說反而是乙個彙總,把我很多離散的知識給彙總起來了。
所以我看程序,執行緒這些概念的時候,不是抽象的而且具象的,腦子裡甚至可以具體到**層面。
但很多人沒有我這麼乙個經歷,所以看起來一臉懵逼也正常。就像我在大學看資料庫的時候,我也覺得很抽象,看了就忘,直到我後面自己去做儲存,對很多的概念才慢慢地理解深入,開始有感覺。
但這裡不是說就不去看了,不看,你就一直都不會知道,甚至連基本的思考都沒有。
對於基礎知識的學習,其實是迴圈往復的過程,不是一次性就能掌握的。對於這類知識的掌握會經歷這麼乙個過程:
概念 -> 理解 -> 實踐中的思考 -> 概念 -> 理解 -> 實踐中的思考 ...
這是乙個迴圈往復地過程,但不是重複,而是螺旋式地深入,每一次迴圈都能夠帶來更深入的理解。
我們說乙個人技術很牛,有很大部分是因為他對很多的知識點經過了很多次這種迴圈,他對基礎知識理解的深度要高過很多人。
軟體技術有兩個關鍵,乙個是抽象,乙個是分層。
其實你會發現很多的概念,知識點,都是乙個具體軟體實現的抽象,裡面也有分層。
舉個例子,我們說程序,你看書上就給了乙個概念,你覺得很抽象,覺得這是作業系統裡面的乙個概念,有點像是原理性的東西。
但你往下乙個層次看,到作業系統設計這個層面來看,程序是乙個很具象的東西,有具體得**,具體的設計,具體的細節,甚至有時候你會覺得有些**寫得也不咋地,就像是乙個業務邏輯。
從這個層面,這個角度來理解,來看待程序的時候,怎麼可能會懵逼,簡直具象到不行了,甚至還會覺得這不就是乙個業務邏輯嘛。
但深度是不是到這裡就停止了,也不是。
你會開始去思考,為什麼要有這個設計,為什麼要有這種抽象,你可能會去找相關的**來看。計算機技術不是自然科學,程序也不是定理性的東西,不是 1+1 等於 2 這種自然存在的,所有一切都是設計出來的。
有設計就會有討論的過程,這些討論的過程或結果很多都還保留在網際網路上。
比如,有一次我們想為自己做的分布式儲存,設計事物系統,後來就順藤摸瓜地找到了資料庫大師 jim gray 關於事務設計的經典文獻和資料,裡面有他的很多思考和權衡。
到這個時候,事務在你腦海裡已經不是概念,而且乙個龐大的東西,很多細節,設計的權衡,你想忘都忘不了了。
甚至你還會思考這種設計是不是最好的,時間過了這麼久,會不會不適應現有的場景了,反正你會思考很多。
我們說有人很牛,我覺得這個就是很關鍵的區別了。
這個過程很艱難,也很緩慢的,要十年甚至二十年的時間,有人可以不斷地深入;也有人只停留在很淺的層面。如果你能不斷深入,你就能不斷地超越很多人,朝著技術大牛的目標邁進。
基礎知識的學習和理解是緩慢且不斷深入的過程,甚至是貫穿整個程式生涯的,不斷深入理解的過程,也是不斷塑造自身技術思維的過程。
當然,首先你得知道並認可基礎知識的價值,你才會願意花費時間和精力去不斷去學習和深入理解它們。
IT雜談 十年程式設計師
知識庫 程式人生 全屏閱讀 收藏 十年程式設計師 一 2012年,終於可以和人家說,我有十年工作經驗了。幸運的是,十年後,我還在寫 十年前,促使我選擇寫程式作為一生追求的是我對寫程式的好奇以及實現功能後的成就感,但那時,在對自己未來充滿信心的同時,內心深處依然惴惴不安。縈繞心頭的烏雲是所謂30歲程式...
工作十年的老程式設計師何去何從
05年畢業一直做程式設計師,轉眼進入第十個年頭了。現在要換工作,有些問題值得思考。十分慶幸的是 這麼多年一直做手機客戶端,一直在導航 lbs領域。十分不幸的是 這個行業已經不是小公司玩的起的了,要麼去大公司做基礎,要麼去小公司做專案。以前看不破,還以為自己年輕,可以找個工資給的可以,離家近,人際簡單...
十年程式設計師,創業後的感悟 (熱搜)
驀然回首自己做軟體開發這個行業已經十年了,這十年中我獲得了很多,技術能力 培訓 出國 大公司的經歷,還有很多很好的朋友。但再仔細一想,這十年中我至少浪費了五年時間,這五年可以足夠讓自己成長為乙個優秀的程式設計師,可惜我錯過了,我用這五年時間和很多程式設計師一樣在困惑和迷茫中找不到出路 路其實一直都在...