前兩天一兄弟給我打電話,他的問題是自己想好好學習電腦編程技術,但是自己想學的東西太多,不知道從何學起,而且學到的東西也在工作中無法用到。這也是我曾經遇到過得問題,因為我也不是電腦專業出身,所以今天我就說一些我對這個問題的看法。
我認為認識一個事物,首先要去瞭解這個事物的整體,然後再去研究它的內理。就像我們認識一座大樓,我們第一步要先從大樓的四周去看這個大樓的結構,第二步去看這個大樓內部的整體的支撐骨架,第三步才是去研究每一層的結構和房間部署。假如我們首先就從其內部細節開始研究,由於我們對這個事物的整個結構沒有瞭解,就很有可能在一個地方徘徊,可能就在大樓的一層中徘徊,根本就不知道樓上還有幾層,也不知道這個大樓的整體骨架,猶如盲人摸象,只能知道其中一部分。縱然最後認識清楚了,也需要耗費很多的時間,走很多彎路。
電腦專業的人從大學開始學習電腦相關知識,他們從《電腦原理》等這方面的書籍瞭解到最基礎的電腦硬體知識,然後再從《電腦作業系統》等書籍瞭解到整個作業系統的實現和編程環境,再進而通過《編譯原理》《電腦網路》等書籍瞭解到電腦程式設計語言的原理和網路原理,再進而學習各種我們平時用到的c c++ java等程式設計語言進行應用開發。他們將電腦基礎 網路原理到電腦編程應用之間的整個知識體系都學習了一遍,所以他們在工作中遇到一些問題,就很容易解決,從而進步很快。還是拿大樓舉例子吧,他們是從大樓開始建的時候,打地基開始學起一直到大樓完工,所以他們會對這整個大樓的結構都很瞭解,縱然有些細節方面不是很清楚,在需要的時候花一點時間去看一下就好了。
綜上所述的結論是,電腦專業的人是將整個電腦相關專業的知識體系建立起來了,在這個基礎上再去發展學習,無往而不利。就像金庸小說中的張無忌練過九陽神功後再學其它武功後就能夠迅速的學會。
非電腦專業的人通過自學或者社會上的一些培訓機構學習到電腦編程這門技術,他們能通過程式設計語言開發出一些東西,能完成工作中的任務,當然一般都是工作在應用程式層。但是他們沒有對電腦專業知識進行過系統性的學習,對基礎知識缺乏瞭解,故 在遇到一些非商務邏輯 牽扯到底層的一些東西的時候,他們就會茫然了。網路通訊的過程,編譯器的最佳化,資料結構的最佳化,多進程多線程編程 等等,這些是他們所欠缺的。就像是蓋樓房,地基沒有打好就在上面開始加磚蓋牆,倒是必然的。這也是為什麼有些非電腦專業的人很努力的去學習,學mysql 學php 但是進步依然緩慢的原因。因為對電腦專業知識這所大樓的整體結構 整體骨架沒有瞭解,所以就找不到最合適的學習方法和學習路線,縱然付出很多時間,進步依然緩慢。
綜上所述的結論是,非電腦專業的人對這個電腦專業的知識體系沒有進行過系統的學習,對這個知識體系沒有瞭解,所以不知道該從何學起,學習進步很慢。就像一個建一個樓房,地基沒有打好,是沒有辦法壘高的,必然會倒。
下面說一下我的學習曆程吧,剛開始工作一年的時候,總想著完成工作才是目標,所以在遇到問題的時候就不斷的去問google去問百度再不行就得問別人,反正一切以解決問題完成工作為目的,在這個不斷搜尋不斷詢問的過程中,慢慢發現“地基”的概念,知道自己沒有基礎知識這塊,對知識缺乏系統性的學習,在第二年的時候,開始買書去學習mysql資料庫原理,去學linux作業系統,去學編譯原理。這個學習過程很是坎坷和經常間斷,這個過程就是我那個兄弟現在處於的一種情況,想學的東西很多,卻不知從何學起,而且花了很長時間去學習編譯原理,在工作中也不能用到,而且在學習過程中還有很多不知所云的東西,心情很是浮躁,一會學習javascript一會學習編譯原理,一會學習linux作業系統。這個過程持續了大概半年多,學習成果真的沒有多少,但是最大的收穫是我在這個工程中慢慢的對這個知識體系的認識慢慢清晰起來,慢慢的知道自己該學什麼了,而且心情不是那麼浮躁了,而且還明白了 這個學習階段並不是一個短期工程,需要一個長時間的積累。這樣工作第二年的多半年就過去了。然後,我開始計劃用兩年的時間將大學裡電腦專業的學習書籍都看一遍,完成非專業向專業方向的轉變,之所以用兩年,是我在很好的完成我的工作之餘才去幹這件事,因為我覺得生存下去是最重要的,我不能不顧工作,而將大部分時間和經曆都放在學習上,工作不好,就會被淘汰,生存就是問題。所以我會在我很好的完成工作之餘才去做這件增強自己能力的事情。我從《電腦群組成原理》開始瞭解電腦相關的硬體和最基礎的知識,比如 主板 cpu cpu時間片 中斷等知識,而後從《電腦網路》學習網路通訊過程,比如tcp udp 路由規則等網路知識,而後從《電腦作業系統》學習進程調度,檔案系統等系統內容知識,而後從《linux作業系統》中學習linux操作與系統知識,而後從《編譯原理》中學習編譯器的相關知識,學習到程式設計語言的運行原理,而後從《c程式設計》學習c語言知識,從《c++程式設計》中學習c++,學習c/c++語言是為了去學習一些用c/c++開發出的一些底層的軟體 比如分析nginx源碼 php源碼等,而後從《資料結構》學習資料結構 如 鏈表 堆棧 HashTable 等,而後從《設計模式》中學習到那些以前不知所云的原廠模式 裝飾器模式等。這些知識雖然不多,但是這些方面的知識是整個電腦專業知識體系裡面的最重要的幾部分。當學過這些知識後,我發現我對整個電腦專業相關的知識都清晰了很多,工作中對一些底層的東西也越來越清楚了。能夠跟營運一起商量動作伺服器的一些設定 因為我學過作業系統,能夠跟php大牛去談php源碼的一些東西,因為我學過c/C++,看過源碼。計劃用兩年 但其實一年都沒用了,就完成了我的兩年計劃。其實有些事情你去做的時候比你去想的時候要簡單,要快速。接下來,我會研究更多的開源東西,比如hadoop大資料處理,sphinx搜尋引擎的內部實現,還有linux的原始碼去更深的瞭解系統知識。回頭想想,其實學過的東西還是那麼一點點,要學的東西還是那麼多,不過,我現在是對電腦越來越感興趣了,由之前的謀生手段到現在的愛好,我知道我要去學什麼,我知道我要去幹什麼了。
所以我要對跟我一樣不是專業出身的兄弟們說,每一份付出都是有收貨的,收貨遲早會來到你的面前。
書是人類進步的階梯,紮紮實實的去學吧,一步一個腳印的去學,不要浮躁,不要急功近利,慢慢的你就會發現自己在不斷的蛻變,可能用不了多長時間,你就是一個專業的人了。
推薦幾本書給大家,我覺得這幾本書是不錯的。
其他書籍:《把時間當做朋友》《暗時間》《人性的弱點》《四書道貫》
專業書籍:《電腦群組成原理》《資料結構-使用c語言》《現代作業系統》《深入理解電腦系統》《電腦網路》《編譯原理》《c程式設計》《c++程式設計》《設計模式》《程式員修鍊之道》《鳥哥的linux私房菜》《設計模式》《精通linux c編程》《c primer plus》