文章來自:五月的倉頡五月的倉頡 是一位非常優秀,樂於分享的大神,目前就職阿裡
原文連結:https://www.cnblogs.com/xrq730/p/9159586.html
阿裡面試成功已經過去一個月了,入職也已經過去十多天了,趁著週末寫點東西和大家進行一下分享,本文會寫到以下的內容:
-
個人一路走來的經歷
-
未來的一些思考
-
我自己理解五年這個時間節點一名優秀程式員應當具備的技術素質
-
小廣告時間
那這次加入的BU是菜鳥,一個非常有發展前景的公司。
從校園出發,走向阿裡
工作五年,標題卻是”四年努力”,實際上確實是這樣,2013年從母校杭州師範大學畢業之後,我和很多剛畢業的同學一樣,會沒有標的、找不到方向、不知道未來到底要做什麼,所以大約有一年的時間是很迷茫的,工作也就那樣吧,得過且過。
大約一年過後,也就14年樣子,那個時候公司還在西湖科技園,也許是自己的上進心作祟、也許是母校學長馬雲情懷作祟,有一段時間每天沿著石祥路回家,就想著這輩子我一定要憑藉著自己的努力進入阿裡,而且這種想法每天每天越來越強烈。
就像我公眾號裡面寫的,4年前其實並沒有現在這麼多面試經或者程式員成長經,雖然有心,但是並不知道朝哪個方向去努力。於是想了一個辦法:花了一個禮拜時間,把51job、獵聘這些那時候比較有名的招聘網站裡面的Java崗位通通看了一遍,把每個崗位描述都寫下來,併進行整理和總結,列了一份比較大的提綱,作為自己的學習標的。
在這之後,開啟了算是比較瘋狂的2015年吧,那一整年只有一個關鍵字—-學習。一整年除了幾個極重要的人,幾乎沒有和同事、朋友出去玩過,八九點下了班回去就開始學習到十一二點、工作中比較空餘的時間學習、雙休日學習、各種大小長假學習,反正各種能利用到的時間都用來學習了,各種JDK原始碼、多執行緒、Java虛擬機器這些都看了個遍,前前後後看過的書不下10本,像虛擬機器這本書我好像有說過幾次,PDF+物體書看了不下五遍,這個部落格也是從15年開始寫的。
學習是寂寞、枯燥的,這段時間裡其實有太多次想要放棄,但每次也都熬了過來,可以分享給大家一個感悟:花一年自己逼自己一下,讓一切優異的品質成為你的習慣。像我現在,就感覺努力、上進、鑽研、好奇心這些已經是骨子裡的東西了,研究一個技術點,不整理成一篇博文,我都不認為自己掌握了這個技術點。
至於工作,經過15年這一年的學習,由於個人水平的長進,16年到18年間,在工作中領導也願意給我機會,會寫一些底層的東西、會做一些系統性的設計、也有機會帶幾個人的小團隊,在這一過程中,慢慢發現基本功並不能說明所有問題,因為必然會遇到沒碰到過的東西、會遇到一些更複雜的問題,然後透過查資料、研究、尋找解決方案、解決問題進一步提升自己的能力。
個人技術成長,工作中成長(實際解決問題能力)一定是缺一不可的,就像前幾天我們大部門老大分享的:什麼是好的技術,能解決實際問題的技術就是好的技術。
18年年中,對的時間遇到一個對的部門、對的領導、對的團隊,夢想照進現實。
希望我分享的個人成長經歷,能對看到的人有一些鼓勵、有一些感觸,如果讓我總結一下,那麼希望告訴大家兩點:
-
相信你自己,我這樣學校一般又不聰明的人都能走到今天這一步,那麼大多數人一定都能走到我這一步,而且能走得比我更遠、更好
-
世界上沒有什麼是努力辦不到的,如果有,那麼就更努力一些吧
五年之後,何去何從
在之前寫過的一篇文章《面試感悟—-一名3年工作經驗的程式員應該具備的技能》一文中,有一段專門寫了對程式員的幾個階段的理解,當時是工作三年寫的,一轉眼兩年過去了,我自己也差不多工作五年了,在這個節點上,結合自己的認識,說一下第五年開始,一個程式員應該朝哪個方向努力。
首先,前五年,如果一個程式員大致能做到一下幾點(後面還會詳談):
-
具有扎實的基本功
-
能快速完成領導交給你的程式碼開發任務
-
能在遇到問題的時候有正確的解決思路
-
能對公司的新人進行一定輔導,包括但不限於技術點分享、程式碼評審、需求分析、表結構設計等
那麼,從第五年開始,我認為可以、也應當朝更高的層次進行邁進,前一個層次如果更多是偏重個人,那麼這個層次我認為更多應該偏重團隊,簡單羅列一下大致上應該有:
-
系統設計能力,或許在之前給一個功能,能從DB設計–>服務端開發–>前端開發一棧把事情都做好,那麼之後,在領導給出具體一塊大業務,比如想做一個淘寶商場的會員模組,能充分分析出整個功能並把功能拆分成一個一個的點、能對每一個點之間的互動畫出互動圖、能梳理清楚資料庫的ER關係圖、能把工作合理分配給同事進行開發
-
帶領團隊能力,大致就是把控整體開發節奏,保證在約定時間點前進行交付,不出現延期的情況
-
大而博不如小而美,會10門技術、每門技術掌握到6分,不如會5門技術、2門技術掌握到8分,我感覺整個行業什麼都會一點的人比較多,把一門技術進行深入研究的比較少,畢竟掌握也許只需要1星期,深耕或許需要1個月甚至更久。在五年這個節點,我認為選擇一到兩個自己感興趣的方向進行深入研究會是一個比較好的選擇
這是我自己的思考,也是我在第五年開始對自己的要求,希望這一些思考也能給大家帶來一些啟發。
五年節點,我理解的優秀程式員應當具備的技術素質
網上有很多所謂的Java程式員面試經,其實看下來的感覺就是沒多大用,面試是沒有套路的,每一個面試官問的東西也都不一樣,如果根據那些面試問題去學習和準備,那真的是隻見樹木不見森林,對個人提升沒有太大提高。
那麼,在五年這個階段,一個優秀的程式員應當具備怎樣的技術素質呢?按照我個人的理解,主要就是基本功+專案。
為什麼之前說針對面試題進行學習和準備作用不大,因為我認為我們關註的不應當是題,而是題背後的一個一個的方向,這也就是我認為的基本功。那從基本功的角度來說,羅列一下我能想到的,包括但不限於以下內容:
-
工作相關使用到的JDK類及其相關原始碼、機制
-
設計樣式,設計樣式在工作中用到了哪些,具體使用場景
-
併發類的相關知識,執行緒安全、鎖機制、訊號量、閉鎖、柵欄、執行緒池等
-
框架相關,Spring相關機制、Spring MVC相關機制、MyBatis相關機制、使用的細節點、框架實現原理等
-
JVM,記憶體佈局、垃圾識別演演算法、垃圾回收演演算法、垃圾收集器、類載入機制、記憶體模型、出現記憶體問題時定位問題的方法等
-
資料庫的基本資料型別、索引機制、各引擎區別、鎖機制、慢SQL定位及最佳化等
-
快取機制,這裡的機制指的是快取載入、快取擊穿、快取雪崩這些機制及其相關應對方案,用過Redis、MemCache的最好理解一下它們的原理或者快取提供的一些高階功能,叢集如何實現
-
分散式的一些知識,比如CAP理論、資料一致性的幾種解決方案、分散式事務如何處理、分庫分表怎麼做、現有的相關解決方案等
-
NIO的作用,epoll模型是否知道一些,Netty的相關機制、Netty相比原生NIO的優點、半包拆包、斷線重連解決方案等
-
Web相關,Get與Post的區別、轉發與重定向的區別、跨域問題如何解決、如何保證介面冪等性等
-
網路層相關,三次握手和四次握手、全連線佇列和半連線佇列、負載均衡演演算法等
-
其他中介軟體,MQ作用和使用場景、服務化治理框架的作用和使用場景、配置中心的作用和使用場景等
-
資料結構,陣列、連結串列、棧、佇列、樹等優缺點,在什麼場景下使用什麼資料結構
-
Linux相關知識,基本命令的使用,排查日誌、定位問題,專案或者第三方元件的基本運維等
坦白講,以上的這些東西全都掌握也不可能,哪怕面試官肯定也有很多不會的,但這就是基本功,能多掌握一點多掌握一點,技多不壓身,至於別人如何評價你,就留給別人去評價吧,做好自己能做好的就行了。我在之前寫過的文章中反覆強調深度+廣度,深度優先、廣度次之,有了深度+廣度,在開發過程中我們可以儘快完成需求,在遇到問題情況下我們可以第一時間找到應對方案。
在三年的時間點,能掌握上述的知識點我認為已經是非常非常優秀的了,但這兩年的經歷讓我意識到的是,到了五年的時間點,如果只是具備這些硬性技能,還是不夠,這兩年更多的應當是在專案上進行積累,也就是前面說的專案,大致上應該有:
-
獨立完成複雜業務,或者完成一個已有專案中的大功能點,這就需要有根據業務對功能進行分解、分析的能力
-
獨立排查複雜問題,在專案執行過程中,一定不可能安然無事,除開業務性的問題,CPU 100%是否能獨立排查、記憶體上限溢位是否能獨立排查、應用死鎖或者DB死鎖能否獨立排查、API呼叫時間長能否獨立排查,以上問題排查完畢能否及時解決
-
帶領團隊的能力,可能這時候帶領的是1~2個人的小團隊,即使一個小團隊,也能考驗帶團隊、任務合理分配的能力
可能上面的要求有點高,可能工作中未必有這樣的機會,但是不要抱怨,機會永遠留給有能力、有準備的人,我們首先想的不應該是等待別人交給你一件有挑戰性的事情,你在做這件事情的情況下去提升自己,而應當是先提升自己的素質,然後讓別人放心把有挑戰性的事情交給你來做。
回到我之前寫的,為什麼16年到18年間,領導願意給我機會去進行嘗試,首先就是因為個人水平的提升。
最後的最後
最後,我想的是,無論進入了BAT還是進入了FLAG,都絕不是技術道路的終點,不是可以高枕無憂地躺在過去的功勞簿上、無憂無慮過完下輩子的資本,相反,必須更努力,才能在一群同樣優秀的人中脫穎而出。
END