後端程序員的學習取經之路

學習後端技術和學習其餘的技術並無什麼大的不一樣。所以,本章題目換作如何學習技術也是講的通的。歸納來說,有如下幾點建議:前端

  • 紮實的計算機基礎知識程序員

  • 知其然更要知其因此然面試

  • 動手實踐算法

  • 頻繁練習編程

  • 持續學習後端

  • 計算機思惟緩存

  • 自我總結微信

  • 學會規劃網絡

1.3.1 紮實的計算機基礎知識

  • 數據結構和算法:程序是由數據和算法組成的,所以這兩個東西是計算機軟件的基礎。諸如B樹、哈希表、棧以及七大排序算法、查找算法這些,在不少軟件的代碼中均可以看獲得。有時候,一個優秀的工程師和一個普通工程師的區別也就在因而否可以合理使用合適的數據結構和算法。數據結構

  • 計算機操做系統:操做系統能夠說是集大成於一身的一個軟件程序。資源調度、任務調度、IO調度、進程通訊等等,每個設計都是很精華的,也是不少其餘應用軟件設計的思想來源。

  • 計算機網絡:目前只要有數據傳輸功能的程序絕大多數都是離不開網絡的。網絡七層或者四層協議棧的設計很是精妙。瞭解網絡鏈接如何創建、斷開以及每一個鏈接狀態的意義都有助於對程序網絡問題的排查。

  • 計算機組成原理:這是計算機最底層的設計,也是計算機一切的基礎。瞭解這些有助於消除你對計算機的神祕感,畢竟符合馮諾依曼原理的計算機無非就是存儲數據、程序按序運行。

以上是計算機專業的一些比較廣泛的基礎知識課程。這裏不得不說的一點是,雖然如今各大高校的計算機專業課程是比較落後的,可是這些基礎課程,因爲多少年也沒有怎麼變過,所以無論怎樣都是須要紮實掌握的。也許上學的時候你感受不到有多大的用處。可是進入實際的開發工做中,是否可以掌握紮實的基礎知識每每決定了一個開發工程師的上限,這也是不少大的互聯網公司不管是校招仍是社招,都側重於一些底層知識考察的緣由。畢竟,你會使用什麼東西只能決定你的下限,而你的基礎知識和學習能力才決定了你的上限。

此外,其實不少平時開發中的一些技術均可以類比到一些基礎知識的。好比,咱們常常爲了提升查詢性能而使用的緩存技術,和爲了兼容CPU和IO速度不匹配的而設計的CPU Cache就是一樣的東西;操做系統中的進程間通訊方式和服務之間的異步同步通訊也是差很少的道理。諸如此類,其實計算機科學基礎凝聚了不少精華的設計,不管是計算機硬件架構、計算機操做系統仍是計算網絡。

1.3.2 知其然更要知其因此然

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

這也能夠映射到如今的一種現象:不少開發工程師工做了好久,看着經驗豐富,但基本都是拿着一年的工做經驗重複n年的。基本上每一份工做,每個項目都在那裏作重複勞動,並且也並不去考慮如何避免重複勞動這件事。

進一步的,除了遇到問題再去看源碼、究底層,主動閱讀經典類庫、高質量開源項目的源碼以及其餘同事寫的代碼,學習其中好的架構、設計、編碼風格以及類庫的使用也是促進自身技術進步的一個很是有效的方式。須要注意的是,在看到好的代碼實現、架構設計時最重要的是學習其中的思路,而不是僅僅學習結果。能夠試着去問本身以下的問題:

  • 若是本身遇到這種問題會怎麼解決,與資料中的解決方案相比優劣如何?

  • 別人爲何會想到這種解決方案?

  • 本身是因爲經驗欠缺仍是技能點欠缺才致使沒有想到好的解決方案?

  • 解決這類問題的根本思路是什麼樣的?

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

1.3.3 動手實踐

學習領域有所謂721模型:我的的成長70%來自於崗位實踐,20%來自向他人學習,10%來自於培訓。雖然這種理論存在爭議,但在筆者看來對於程序員來講按照實踐、學習和培訓的方式進行重要性排序是合理的。廣泛公認的一種學習技術的最佳實踐-「項目驅動型學習」,也就是這裏說的動手實踐。不少技術,只是看書,你會雲裏霧裏,看了就忘。必需要通過你本身的實踐或者項目中使用到了這種技術,你才能很快地掌握並熟練。此外,如今朋友圈、微博上都充斥各類所謂乾貨,不少人閱讀大量的資料自覺得收貨滿滿,其實對於裏面的東西根本就沒有去實踐過。甚至有時候就是感嘆一下別人真厲害而已。真正的乾貨是須要本身消化的,消化的一種最好的模式就是實踐,不管是對資料中的例子仍是一筆帶過的知識。

1.3.4 頻繁練習

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

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

固然,這裏的頻繁練習並不是指的重複勞動。應該是帶着本身的思考去練習,多去想一下爲何這麼作?有沒有更好的方式?

1.3.5 持續學習

「活到老,學到老」這句話用在程序員這個職業上再合適不過。IT技術尤爲是互聯網開發中的技術,其迭代是很是迅速的。也許你今天學的,過不了幾年就成了被拋棄的。雖然相比起前端技術,後端技術算是比較穩定的,但相比起其餘行業,迭代速度仍是很是快的,像Struts這種當年火的一塌糊塗的技術如今也成了過期的東西。所以,必定要對新事物、新技術具備敏感性,要不斷地去涉獵業界最新的知識點,擴充本身的知識庫。而學習新的知識的時候,與讀一些書籍和網上的博文相比,直接閱讀相關知識的官方文檔是筆者推崇的方式,畢竟通過二次加工的書籍、博文不少時候因爲寫做者水平或者我的理解的問題會有錯誤或者偏離原做者的意思。而因爲目前IT技術絕大多數都源自歐美,歐美的技術水平也領先國內不少,所以英文對於IT技術從業者的要求也是比較高的,須要達到熟知各類計算機術語,通暢地閱讀各種英文資料的水平纔不至於在學習方面落後。

這裏還須要提到一點就是要「逃離溫馨區」。人對本身熟悉的東西都比較親切,對本身熟練掌握的技術通常也可以自信地使用,然而當須要使用本身沒接觸過的技術時,不少人就望而卻步、不敢嘗試,進而也就喪失了學習新的知識、擴充本身知識庫的機會。最好的方式應該是勇於「逃離溫馨區」、勇於使用新的技術,這樣才能讓本身具備持續的學習興趣,促進本身的持續進步。

此外,如今業界有不少技術會議,動輒就是全球、全世界這種名頭。常常參加這些會議的人確定是好學的,可是這種會議上都是些流於表面的東西,把精力放在這上面的人的知識也很容易流於表面。筆者比較推薦經過多閱讀書籍來學習,喜歡讀書的人也習慣於深度思考,深度思考才能更新造成本身的知識體系。尤爲對處於技術上升期的程序員,少參加會議,少混圈子,多看書,多作一些可以提高本身技術能力的事情。除非經濟壓力大,儘可能避免去作一些毫無技術含量的外包項目。

1.3.6 計算機思惟

這一點主要說的是要學會用計算機思惟來思索問題。所謂的計算機思惟本質就是馮諾依曼體系所描述:程序存儲,順序執行。

常常聽到的程序員買蘋果的段子就是按照for循環、if else等邏輯來判斷蘋果好壞、計數,並作防護性檢查等,這就是計算機思惟的體現。而以前一個很火的電影《天才槍手》中記憶選擇題答案若是使用計算機思惟,那麼用兩位bit能夠表示四個答案,再將四位bit轉換爲一個十六進制數字,記憶答案就能夠減小通常的存儲量。

如此,諸如二進制存儲、防護編程、循環遍歷、位運算、多進程/線程以及經常使用的數據結構和算法等都應該成爲不自覺的意識。可以在遇到問題時,下意識地用這些東西來思考,將人類語言的需求轉化爲計算機語言。

1.3.7 自我總結

相信不少人在日常的工做中,常常會遇到一些問題,而後經過查閱網上資料、詢問同事、翻看源碼等手段解決了,當再次遇到相似的問題甚至是相同的問題時,仍是一頭霧水。先不提記憶力的問題,形成這種情形的很大一個緣由就是沒有去總結。固然,這裏的總結不只僅指的是把你平時遇到的問題記錄下來,更深一層的是要找到問題發生的本質緣由,如何避免發生一樣的問題,從中有什麼啓發和收穫。再進一步的則須要常常將本身一段時間內的知識收穫組織成體系或者融入到本身的知識體系中,這樣才能觸類旁通,遇到相同的問題能夠有據可循。

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

1.3.8 學會規劃

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

對於研發職位來講,學會規劃是一個很關鍵的特質。而規劃能夠分爲長期規劃和短時間規劃。上面說的職業規劃就是一種長期規劃,須要高瞻遠矚的定下本身前進的方向。如在五年內成長爲一個後端服務架構師就能夠看作一個長期規劃。筆者本身的長期規劃以下:

  • 35歲以前只作可以提升本身技術水平的事情,可以成爲某個技術領域公認的專家。

  • 毫不爲了錢加入本身並不認同的企業或者團隊。

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

  • 學習機器學習技術,可以成爲「調參工程師」。

  • 增強自身的管理技能,可以帶領部門有好的業績。

  • 完成《增加黑客》、《分佈式系統概念與設計》等十本書的閱讀。

須要注意的是,對於這些短時間規劃,要設定的比較合理,具備可達性,也要設定好優先級,根據優先級逐步去完成。此外,規劃不要定死,能夠根據實際狀況靈活調整。

1.3.9 如何學習一門新技術

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

因爲不少技術的模塊很是多,源碼也很是複雜,不少時候在看源碼的時候會陷進去越看越不得章法,所以這裏着重說明一下「看源碼」的一個典型流程:

  1. 閱讀該技術的架構文檔,瞭解其整體架構和組成。

  2. 根據整體架構,將源碼文件以模塊或者上下層級進行分類。

  3. 從未閱讀過的模塊中選擇最獨立(依賴性最小)的模塊代碼讀起。

  4. 閱讀此模塊的功能介紹文檔。

  5. 閱讀此模塊的源代碼。

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

  7. 轉到第三步。

1.3.10 總結

程序員是一個金字塔結構的職業體系,越往上,人越少也越難達到。以下圖所示: 

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


轉載是一種動力 分享是一種美德


本文分享自微信公衆號 - JAVA高級架構(gaojijiagou)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索