每一個人都有成長的渴望,也都會遇到成長的瓶頸。下面這個問題是一個讀者問個人:面試
如何才能訓練成爲一個編程高手?編程
先簡單說下這個讀者的背景:工做 3 年多,目前在大廠作後臺開發,身邊有很多編程高手,是他想要追趕的目標。最近半年時間,他花了一些精力在研究源碼和底層原理上,但總以爲這些知識和實際工做銜接很差,提高很慢,學習動力也愈來愈差,但願我能給點建議。性能優化
我和他語音聊了半個小時,講了一些我我的以及身邊同事的案例。交流下來後,雙方都有所啓發。因此再次整理下,分享給你們。網絡
我以爲能分紅這樣 3 類:架構
第 1 類:天賦和成就都很高的人中龍鳳,好比能一我的寫出 WPS 的求伯君、一我的開發出電子郵件 Foxmail 的張小龍,對開源領域影響很大的章亦春等人。框架
第 2 類:有不錯的口碑同時廣爲人知的技術大牛,他們通常在知名公司的重要崗位任職過,對技術純真熱愛,同時熱衷分享,好比耗子哥、阮一峯、尤雨溪等人。運維
第 3 類:工做中被咱們視爲崇拜對象、將來有但願企及的高 P 或者架構師。工具
前面兩類不在個人圈層射程內( 除了跟耗子哥在亞馬遜有過一面之緣之外 ),所以本文主要聊下第 3 類人。這個也是絕大部分讀者最關心的、同時能夠設定爲超越對象的羣體。性能
這樣就有了一個新問題: 既然想成爲第 3 類人,那如何給第 3 類人下一個相對準確且具象的定義呢? (若是目標都是模糊的,就難言超越了),這實際上是一個頗有意思的問題,每一個人的答案可能都不同,由於「編程水平的高與低」自己就是一個相對的概念。我先說一下個人見解。學習
剛畢業那會,我眼中的編程高手是個人同事 - 超哥,他是亞馬遜的架構師,團隊裏面技術級別最高的人(後來他作到了亞馬遜中國首架的位置,如今也算圈內比較知名的大牛了)。
超哥是那種能搞定一個複雜項目(跨多個系統),從架構設計、到編碼、到自動化測試、再到運維工具、甚至寫文檔都很是全面的人。顯然是我這個剛畢業的菜鳥極其崇拜的大佬。
再後來,我工做了四五年,走向了技術管理路線,由於帶團隊的緣由,我又多了一個新視角來審視編程厲害的人。對比所謂的 PPT 架構師、以及講到技術原理就滿嘴跑火車而編碼能力卻稀鬆日常的人,我傾向給「編程高手」下一個更務實的定義:那就是實際工做中,能作到高效率、高質量、且穩定輸出的人。看似容易,實則很難。我對這個定義的詳細解讀以下:
高效率:編程效率能作到團隊中的 Top,對於複雜需求或者複雜問題可以快速理解,具有將複雜工做拆解成一系列簡單子問題並搞定這些問題的人。他們能從實際場景出發,有造輪子的能力,也有不造輪子的覺悟。
高質量:編程質量能作到團隊中的 Top,設計方案的合理性、編碼的嚴謹性、測試方法、監控運維方案等,都能思考全面的人。
穩定輸出:給高效率和高質量增長的限定。我以爲只有量變引發質變,真正造成了本身的方法論,能持續搞定一類問題,而不是單個問題的人才算是高手。
也許你會說要同時作到這 3 點太難了,可是實際工做中,必定有人能作到某個點或者某幾點,那麼以他們做爲這一點的標杆便可。由於所謂的 「 編程 高手 」 不過是 咱們設定 的一個 目標而已,你清楚這個目標是什麼就足夠了,不必定非得安在同一我的身上。
要成爲一個編程高手,底層知識是必不可少的。這是一句正確的廢話,就不展開解釋了。讀者真正的問題在於:如何將底層知識和實際工做銜接起來,作到相輔相成?
先看一個具體的例子。對於簡歷中寫本身作過性能優化的候選人,我面試時比較喜歡問:你是如何定位性能瓶頸並完成調優的?若是再次碰到此類問題,你的詳細思路是什麼?
很顯然,這是一個系統性的工程問題,能同時對技術深度和寬度進行考察。不只僅是應用層的代碼,還包括所使用的框架、中間件、虛擬機、網絡甚至操做系統等等。 有性能指標等基礎性的知識,有 監控和壓測工具的運用,還 有成體系的排查思路和優化方法等等。
若是是編程低手,他們的答案一般有這幾類:
一、性能指標都不清楚,遇到問題也不知道該用什麼工具,這一類人應用層都不達標。
二、初步定位到一個疑似瓶頸點後,就着手優化,最終解決的只是一個淺層次的性能瓶頸問題,根本緣由並未觸達到。
三、能定位到根本緣由,可是對於解決方案的合理性缺乏深刻思考,不追求極致,最終只是用了曲線的方案再次隱藏了性能問題。
經過這個例子,我其實想說明兩點:
一、不具有底層知識,你的視野根本就觸達不到底層的東西,思惟以及能力永遠只能停留在應用層面,能解決的問題有限。
二、讀源碼、學習各類原理,全部這些都只是學習和鞏固知識的過程,真正體現編程水平的是實際解決問題的能力,所以如何將知識變成有效的經驗?這個纔是關鍵,作不到要麼是實踐不夠,要麼是壓根沒研究明白。
而後,咱們再回到問題身上:究竟如何才能作到底層知識和實際工做的銜接呢?若是銜接很差,那問題出在哪一個環節?
你們能夠先思考下:過往工做中那些對你編程能力幫助很大的經歷,你認爲你能得到提高最關鍵的因素是什麼?是底層知識的儲備嗎?細想一下必定不是,而是發現問題的能力。 (注意:我說的是最關鍵的因素,並非否定底層知識的儲備不重要)
你們能夠去觀察一個工做中很常見的現象:同一個問題你能看到哪一層?而編程高手又能看到哪一層?誰能更快地貼近問題的本質?誰又能衍生出一系列的問題? 這其實就是「發現問題」的能力體現。只有當你意識到它是一個值得深挖的問題時,纔會有一層一層的思考,一層一層的分析。
那應該如何提升這方面的能力呢?其實就是思考力的提高過程,除了觀察和刻意練習,我想不出更好的建議。多看高手是怎麼作的?遇到問題時本身多問幾個爲何?多反思本身的思路是否正確?日積月累水平天然會提升。當你具有了發現問題的能力,就至關於給知識和經驗之間架起了一座橋樑,真正作到相輔相成以及互相驅動。
編程做爲一門實踐性的學科,多動手解決問題是最基本的要求了,解決問題越多、越難,能力提高越快。而在這個過程當中,若是有知識輸入(底層知識的儲備),還有思考的加成(發現問題的能力),編程水平的提高會更加迅速。
我帶過的團隊裏面,還有一類人總說本身技術進步很慢,工做沒有挑戰。可是當團隊遇到一個技術難題時,他根本沒有意願去作深刻了解,嘴上說熱愛技術、渴望成長,可是卻看不到行動,這種人是永遠成爲不了編程高手的。
真正的熱愛來源於行動上的投入,不是找藉口,不是追求舒服,這是很重要的一個區別。
編程高手是如何練成的?這樣看來,它實際上是一個體力、腦力、心力的修仙之路。
做者簡介:985碩士,前亞馬遜工程師,現58轉轉技術總監
歡迎掃描下方的二維碼,關注個人我的公衆號:武哥漫談IT,精彩原創不斷!