1. 程式人生 > >掌握後端技術的6點學習建議

掌握後端技術的6點學習建議

寫在前面:

本文轉載自<java工程師修煉之道>

程式設計師是一個金字塔結構的職業體系,越往上,人越少也越難達到。走到金字塔頂部需要不斷的學習和進步,包括正確的態度、正確的方法以及持續的努力。本文整理了6點學習後端技術的建議,並在最後給出了學習新技術的方法論,希望幫你早日走上金字塔的頂端。

學習後端技術和學習其他技術並沒有什麼大的不同。因此,本文題目換作“如何學習技術”也是講得通的。

1 紮實的計算機基礎知識

計算機專業的一些比較普遍的基礎知識課程分別如下。

資料結構和演算法:程式是由資料和演算法組成的,因此這兩部分是計算機軟體的基礎,諸如B 樹、雜湊表、棧以及七大排序演算法、查詢演算法等,在很多軟體程式碼中都可以看到。有時候,一名優秀工程師和一名普通工程師的區別也就在於是否能夠使用合適的資料結構和演算法。

計算機作業系統:作業系統可以說是一個集大成於一身的軟體程式。資源排程、任務排程、I/O 排程、程序通訊等,每一個設計都是精華,也是很多其他應用軟體設計的思想來源。

計算機網路:目前絕大多數有資料傳輸功能的程式都離不開網路。網路七層或者四層協議棧的設計非常精妙。瞭解網路連線如何建立、斷開以及每個連線狀態的意義,都有助於對程式網路問題的排查。

計算機組成原理:這是計算機底層的設計,也是計算機執行的基礎。瞭解這些有助於消除計算機的神祕感,畢竟符合馮・諾依曼原理的計算機無非就是儲存資料、程式按序執行。

這裡不得不說的一點是,雖然現在各大高校的計算機專業課程比較落後,但是這些基礎課程是計算機專業的基礎,因此不管怎樣都應該紮實掌握。也許上學的時候你感覺不到有多大的用處,但是進入實際的開發工作中,是否能夠掌握紮實的基礎知識往往決定了一名開發工程師的上限,這也是很多大的網際網路公司無論是校招還是社招,都側重於一些底層知識考察的原因。畢竟,你會使用什麼東西只能決定你的下限,而你的基礎知識和學習能力才決定了你的上限。

此外,其實很多平時開發中用到的技術都可以關聯到這些基礎知識。比如,我們經常為了提高查詢效能而使用的快取技術,以及為了相容CPU 和I/O 速度不匹配而設計的CPUCache 就是同樣的東西;作業系統中的程序間通訊方式和服務之間的非同步/ 同步通訊也是差不多的道理。諸如此類,其實電腦科學基礎凝聚了很多精華的設計,無論是計算機硬體架構、計算機作業系統還是計算網路。

2 知其然更要知其所以然

經常遇到來面試的工程師,在簡歷上寫了很多專案,也用過很多技術,怎麼看都是非常不錯的候選人,但是面試一旦深入到原理或者優化層面,很多工程師甚至是一些公司的資深架構師都會支支吾吾,答非所問或者說是沒關注過。聽到最多的解釋就是業務壓力太大,沒有時間去研究。其實,從筆者自己的經歷來看,業務忙是原因,但是沒有時間卻肯定是藉口,畢竟閱讀一個專案的原始碼雖然比較耗費時間,但是去網上看看已有的原理分析其實是花不了太多時間的。歸根結底,還是沒有一種知其然更要知其所以然的基本意識。很多東西,你學會了使用會很興奮,但是你有沒有想過這麼令人興奮的功能是如何實現的呢?最簡單的例子,Java 中的HashMap,大家都在用,但是它到底是怎麼實現的呢?很多人甚至都不知道它和資料結構課程上的雜湊表是什麼關係,更別說知道解決衝突的方法了。

這也可以對映到現在的一種現象:很多開發工程師工作了很久,看似經驗豐富,但基本都是拿著一年的工作經驗重複n 年。基本上每一份工作,每一個專案都在做重複勞動,而且不去考慮如何避免重複勞動。

這也涉及技術的廣度和深度的問題。就筆者來看,對於剛剛畢業或者剛剛入職的工程師來說,首要的是深度問題,只有你在某一領域有了深入的研究和造詣,你才能融會貫通,迅速地擴大自己的知識面,在廣度上做到突破。而對於有一定工作經驗的工程師來說,雖然深度不是那麼必需,但是遇到的問題、新學到的東西還是刨根問底才好,否則一旦出現問題再去亡羊補牢會非常被動,也不利於自己的技術發展。畢竟,一個什麼都做過、什麼都用過卻什麼也不精通的人很容易被替代。

3 動手實踐

一種學習技術的最佳實踐就是“專案驅動型學習”,也就是動手實踐。很多技術,只看書,你會覺得雲裡霧裡,看了就忘,必須要經過自己的實踐或者專案中使用到了這種技術,你才能很快地掌握並熟練。此外,現在朋友圈、微博上充斥著各種所謂的乾貨,很多人閱讀大量的資料自以為收穫滿滿,其實對於裡面的知識根本就沒有實踐過,甚至有時候就是感嘆一下別人真厲害而已。真正的乾貨是需要自己消化的,消化最好的模式就是實踐,無論是對資料中的例子,還是一筆帶過的知識,都是如此。

4 頻繁練習

動手實踐能夠讓你快速入門,但只有頻繁練習才能讓你熟練使用。

“一萬小時”理論講的是任何一個行業都至少需要一萬個小時的實踐才能成為專家。

先不去討論此理論是否正確,可以想想當你長時間不寫程式碼或者不用某個技術後再去做相關的開發,那種生澀、陌生感想必是無疑的。可見對於研發這個角色,頻繁練習是多麼重要。

當然,這裡的頻繁練習並非指重複勞動,而應該是帶著自己的思考去練習,多想一下為什麼這麼做,有沒有更好的方式。

5 持續學習

“活到老,學到老”這句話用在程式設計師這個職業上再合適不過了。IT 技術尤其是網際網路開發中的技術,迭代速度是非常快的。也許你今天學的知識,過不了幾年就被拋棄。雖然相比前端技術,後端技術算是比較穩定的,但與其他行業相比,迭代速度還是非常快的,像Struts 這種當年火得一塌糊塗的技術現在也過時了。因此,一定要對新事物、新技術具有敏感性,要不斷地涉獵業界最新的知識點,擴充自己的知識庫。

這裡還需要提到的一點就是,要“逃離舒適區”。人們對自己熟悉的東西會感到親切,對自己熟練掌握的技術一般也能夠自信地使用,然而當需要使用自己沒接觸過的技術時,很多人就望而卻步、不敢嘗試了,進而也就喪失了學習新知識、擴充自己知識庫的機會。

最好的方式應該是敢於“逃離舒適區”、敢於使用新技術,這樣才能讓自己具有持續的學習興趣,促進自己的持續進步。

6 自我總結

相信很多人在平常的工作中,經常會遇到一些問題,然後通過查閱網上資料、詢問同事、翻看原始碼等手段解決了,當再次遇到類似的問題甚至相同的問題時,還是一頭霧水。先不提記憶力的問題,造成這種情形的很大一個原因就是沒有總結。當然,這裡的總結不僅僅指的是把你平時遇到的問題記錄下來,更深一層的是要找到問題發生的本質原因,如何避免發生同樣的問題,從中有什麼啟發和收穫等。再進一步,則需要經常將自己一段時間內的知識收穫整理成體系或者融入自己的知識體系中,這樣才能舉一反三,遇到相同的問題可以有據可循。

而自我總結的方式包括記筆記、寫部落格、做分享。其中,相比記筆記來說,寫部落格、做分享是筆者更為推薦的方式。畢竟,和別人交流一方面能促使你對總結質量的把控,另一方面分享知識給別人帶來的“榮譽感”反過來會產生某種正向反饋讓你更加樂於總結和分享。

7 如何學習一門新技術

上面主要講述了巨集觀層面的如何學習技術,而具體到學習某一新技術,其實也是有法可循的,。

由於很多技術的模組非常多,原始碼也非常複雜,很多時候看原始碼會陷進去越看越不得章法,因此這裡著重說明一下“看原始碼”的典型流程。

1)閱讀該技術的架構文件,瞭解其總體架構和組成。

2)根據總體架構,將原始碼檔案以模組或者上下層級進行分類。

3)從未閱讀過的模組中選擇最獨立(依賴性最小)的模組程式碼讀起。

4)閱讀此模組的功能介紹文件。

5)閱讀此模組的原始碼。

6)一邊閱讀一邊整理呼叫關係(以表或者樹的形式)。

7)轉到第3)步。