如何學習後端技術?

颯然Hang發表於2018-05-14

學習後端技術和學習其他的技術並沒有什麼大的不同。因此,題目換做如何學習技術也是講的通的。概括來講,有以下幾點建議:

  • 紮實的計算機基礎知識
  • 知其然更要知其所以然
  • 動手實踐
  • 頻繁練習
  • 持續學習
  • 自我總結
  • 學會規劃

紮實的計算機基礎知識

  • 資料結構和演算法:程式是由資料和演算法組成的,因此這兩個東西是計算機軟體的基礎。諸如B樹、雜湊表、棧以及七大排序演算法、查詢演算法這些,在很多軟體的程式碼中都可以看得到。有時候,一個優秀的工程師和一個普通工程師的區別也就在於是否能夠合理使用合適的資料結構和演算法。
  • 計算機作業系統:作業系統可以說是集大成於一身的一個軟體程式。資源排程、任務排程、IO排程、程式通訊等等,每一個設計都是很精華的,也是很多其他應用軟體設計的思想來源。
  • 計算機網路:目前只要有資料傳輸功能的程式絕大多數都是離不開網路的。網路七層或者四層協議棧的設計非常精妙。瞭解網路連線如何建立、斷開以及每個連線狀態的意義都有助於對程式網路問題的排查。
  • 計算機組成原理:這是計算機最底層的設計,也是計算機一切的基礎。瞭解這些有助於消除你對計算機的神祕感,畢竟符合馮諾依曼原理的計算機無非就是儲存資料、程式按序執行。

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

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

知其然更要知其所以然

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

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

進一步的,除了遇到問題再去看原始碼、究底層,主動閱讀經典類庫、高質量開源專案的原始碼以及其他同事寫的程式碼,學習其中好的架構、設計、編碼風格以及類庫的使用也是促進自身技術進步的一個非常有效的方式。

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

動手實踐

學習領域有所謂721模型:個人的成長70%來自於崗位實踐,20%來自向他人學習,10%來自於培訓。雖然這種理論存在爭議,但在筆者看來對於程式設計師來說按照實踐、學習和培訓的方式進行重要性排序是合理的。普遍公認的一種學習技術的最佳實踐-“專案驅動型學習”,也就是這裡說的動手實踐。很多技術,只是看書,你會雲裡霧裡,看了就忘。必須要經過你自己的實踐或者專案中使用到了這種技術,你才能很快地掌握並熟練。此外,現在朋友圈、微博上都充斥各種所謂乾貨,很多人閱讀大量的資料自以為收貨滿滿,其實對於裡面的東西根本就沒有去實踐過。甚至有時候就是感嘆一下別人真厲害而已。真正的乾貨是需要自己消化的,消化的一種最好的模式就是實踐,無論是對資料中的例子還是一筆帶過的知識。

頻繁練習

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

“一萬小時”理論講的是任何一個行業都至少需要一萬小時的實踐才能成為專家。先不去爭論此理論是否正確,可以想想當你長時間不寫程式碼或者不用某個技術後你再去做相關的開發,那種生澀陌生感想必是每個人都有體會的。可見對於研發這個角色,頻繁練習是有多麼的重要。

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

持續學習

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

這裡還需要提到一點就是要“逃離舒適區”。人對自己熟悉的東西都比較親切,對自己熟練掌握的技術一般也能夠自信地使用,然而當需要使用自己沒接觸過的技術時,很多人就望而卻步、不敢嘗試,進而也就喪失了學習新的知識、擴充自己知識庫的機會。最好的方式應該是敢於“逃離舒適區”、敢於使用新的技術,這樣才能讓自己具有持續的學習興趣,促進自己的持續進步。

自我總結

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

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

學會規劃

平時和不少工程師聊過關於職業規劃的事情,其中有些人對自己的職業道路有很清晰的認識,但更多的則是沒有任何概念,只是覺得能掙錢養家就好。很明顯前者是屬於有規劃的人,對於這種人來說,其努力是有目標的,因此走的路也會更踏實,更具有可持續性。

對於研發職位來說,學會規劃是一個很關鍵的特質。而規劃可以分為長期規劃和短期規劃。上面說的職業規劃就是一種長期規劃,需要高瞻遠矚的定下自己前進的方向。如在五年內成長為一個後端服務架構師就可以看做一個長期規劃。筆者自己的長期規劃如下:

  • 35歲之前只做能提高自己技術水平的事情,能夠成為公認的某一個技術領域的專家。
  • 絕不為了錢加入自己並不認同的企業或者團隊。

而對於短期規劃來說,則是一些具體技能、晉升、學習方面的規劃。如,筆者近一年的學習計劃包括:

  • 學習機器學習技術,能夠成為“調參工程師”。
  • 加強自身的管理技能,能夠帶領部門有好的業績。
  • 完成《增長黑客》、《分散式系統概念與設計》等十本書的閱讀。

需要注意的是,對於這些短期規劃,要設定的比較合理,具有可達性,也要設定好優先順序,根據優先順序逐步去完成。此外,規劃不要定死,可以根據實際情況靈活調整。

如何學習一門新技術

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

如何學習後端技術?

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

  1. 閱讀該技術的架構文件,瞭解其總體架構和組成。
  2. 根據總體架構,將原始碼檔案以模組或者上下層級進行分類。
  3. 從未閱讀過的模組中選擇最獨立(依賴性最小)的模組程式碼讀起。
  4. 閱讀此模組的功能介紹文件。
  5. 閱讀此模組的原始碼。
  6. 一邊閱讀一邊整理呼叫關係(以表或者樹的形式)。
  7. 轉到第三步。

總結

程式設計師是一個金字塔結構的職業體系,越往上,人越少也越難達到。如下圖所示:

如何學習後端技術?

一步步走到金字塔頂部需要不斷的學習和進步,包括正確的態度、正確的方法以及持續的努力。本文所述只是筆者自己的體會,也是自己一直在踐行的東西。除此之外,肯定還有很多其他優秀的方法和思想能夠促進這個過程。


本文節選自《Java工程師修煉之道》一書。

本書可以看作一本Java工程師的入職指南,也可以看作一本串聯Java後端技能點的參考手冊。通過精心編排的內容,剛入門的Java工程師能夠體系化地學習相關開發技能,有經驗的Java工程師能夠查漏補缺,鞏固自己的相關開發技能,進一步完善自身的Java技術體系。

如何學習後端技術? 如何學習後端技術?

購書地址:item.jd.com/12325207.ht…

如何學習後端技術?

相關文章