首先自我介紹一下,我叫翟洪毅,16年華理計算機本科畢業。在年前拿到了螞蟻金服Java開發的offer,P6。
工作經歷:
- 15-17年,壹錢包實習、工作,基礎中介軟體組。
- 17年8月-19年3月網聯清算有限公司,基礎元件組。
ps:本文系作者【翟洪毅】投稿。艿艿
祝大家在金三銀四能找到自己滿意的工作。
ps2:如果你有好的文章,歡迎給艿艿投稿喲。投稿郵箱:zhijiantianya@gmail.com 。
一、夢想和被拒
進入阿裡一直都是我的夢想,我想這跟很多同學是相似的。我前後被拒了兩次,分別是大三找實習和工作一年後。第二次嘗試一面都沒過,但那一次電話面試經歷了一個半小時,被問了十幾個問題,面試結束後感覺腦子被掏空了,沒辦法思考,我也看到了自己的不足,很多基礎知識非常不扎實,隨機應變能力差。後面針對基礎知識做了很多積累。
我看過一篇技術文章,其中一個人寫到技術工作者應該偶爾出去面試一下,讓外界來評判你的價值,發現自身的不足。我贊同透過跟外部同行對比找出自身不足,但途徑可以換成跟社群、優秀的同事交流和學習,畢竟面試是一個耗費體力和時間的事兒。
工作第一年,投出去的簡歷很少有回應,恰好此時網聯正在籌建,同時壹錢包也是網聯的股東之一,需要從支付機構借調人力。當時也為面試阿裡做了些準備,所以在網聯的筆試和麵試都很順利,就這樣離開了上海,來到北京。
這裡要溫馨提示一下各位想進阿裡的朋友,要做好充分的準備,不要浪費機會,你的每個回答,都會被記錄,雖然你可能因為種種原因失敗,但都會為你下一次挑戰打下基礎。
二、積累
我想強調最好的準備是你認真投入到你當前的工作,把它做的漂亮、優雅,至於一些面試題目和技巧,我個人覺得重要程度沒那麼高。所以這一章命名為積累而不是準備。
面對挑戰的勇氣。
16年剛畢業,交給我的第一個任務是學習codis的負載均衡策略,並將其應用到公司自研的分散式快取上。codis是go寫的,我第一反應是我能看懂嗎。但還是硬著頭皮去看了原始碼,我印象非常深刻,codis的負載均衡是用三個巢狀的for迴圈寫的,go語言並沒有成為障礙,反而給我很多自信。但這僅僅是個開始。
更難的是如何管理叢集,擴容、縮容、遷移時叢集狀態的管理。最初我沒掌握方法,一股腦的寫,發現實現了A功能,但B功能有問題了,深刻體會到了改了一個bug,引入新bug的痛苦。我把很多功能和判斷寫在一起,導致這一問題。探索的過程花了很久,最終我慢慢領悟了一些方法,先將流程肢解開,畫流程圖,像八爪魚一樣,將每個圖中每個塊(步驟)用一個函式實現,將所有函式按照流程拼在一起,後面當我發現bug,只在拼接的方法上做了調整,並沒有修改太多程式碼。經過三個月的開發和測試,完全跑通。這個專案在當年獲得了壹錢包年度優秀專案提名,看著其他專案都是百人規模,而這個專案的核心成員只有3、4個人時,自豪感油然而生。這裡我也非常感謝我的領導徐超。我的建議是勇於承擔任務,逼著自己做些有挑戰的工作。
窺原始碼,知真意。
我非常推薦大家去仔細、認真的去讀一個優秀的開源工程的程式碼。來到網聯主要負責訊息佇列。當時我們選擇了RocketMQ,很大程度也是因為相信阿裡的技術能力。開始我們並沒有著急上線,而是閱讀了各個元件的大部分原始碼,確認了它的同步刷盤、同步複製、訊息重試、定時訊息等等各種主要功能是如何實現的。在這期間芋道原始碼給了我很多幫助。在閱讀原始碼的同時記錄原始碼分析的檔案,編寫網聯內部的《RocketMQ開發者手冊》,開討論會分享原始碼心得。這是一個漫長的過程,也是比較難受的。因為對於green hand來說,開原始碼就像大海,點著點著就不知道去哪兒了,有時一個功能要看一週,而且還會遇到很多不知道的知識點,在主幹任務上頻繁出現分支,以至於主幹任務進行緩慢。一開始有4個同事一起看原始碼,最後只剩我一個還在debug。我感受到瞭解決疑惑的快感,從開原始碼中學到了很多技術細節和技巧。窺原始碼,知真意也是我在即將從網聯離職之前給內部培訓時的標題。我從中學到了一個優秀中介軟體的網路執行緒模型應該是什麼樣子、記憶體池技術、如何增強執行緒功能、如何實現同步流程等等。
在幫助社群寫檔案時發現一個命令工具傳回NaN的問題,提了issue和pr,但並沒有被接收,這是第一次嘗試貢獻原始碼。後面在跟艾瑞克的交流中,我得知一個引數能提升broker的效能,使用EpollEventLoopGroup,而不是預設的NioEventLoopGroup,但當我修改配置啟動時發現啟動失敗,於是提了一個issue。過了一段時間,很巧合的一次,在我讀《Netty實戰》時偶然發現boss和worker應該是相同型別,立即動手修改原始碼,啟動,果然沒有報錯,第二次提pr被接納了,那一次我知道了LGTM是啥意思。
熟知原始碼還能幫助我從原始碼層面定位問題。當時我們開啟了CommitLog的預熱功能,之前也熟讀了預熱的實現邏輯,但生產上還是出現了bug,因為對實現邏輯很敏感,在2小時內定位並解決了問題,防止剩餘5個IDC出現類似的問題。
我建議如果你在工作中用到Dubbo、ZK或其他元件,甚至不是Java寫的,你都可以嘗試去搞清楚他們實現的方法,這對於你後面的職業生涯有非常大的幫助,如果你能成為某開源軟體的Contributor或者更高,對你求職將會產生巨大的幫助。
讀書。
為了搞清楚RocketMQ網路層的實現原理,我嘗試去讀Netty的原始碼,並結合《Netty權威指南》和《Netty實戰》理解Netty的工作原理和RMQ的使用方法。看過Netty的部分程式碼給我留下最深刻的印象是好的產品是無數個細節堆砌出來的。去年為瞭解決RMQ自旋鎖和重入鎖的使用問題,閱讀了《Java併發程式設計實戰》,這是一本非常經典的Java併發的書籍,非常推薦大家深入閱讀。同時我也喜歡讀一些我稱之為“泛泛而談”的書,不是說這些書內容平庸,而是內容廣度大,能夠拓展眼界,推薦大家閱讀《大型網站系統與Java中介軟體實踐》。如果你聽了我對RocketMQ的描述並感興趣,推薦你閱讀《RocketMQ技術內幕》。閱讀不僅是在書本上,極客時間很多專欄和影片課程也非常棒,都是業界大咖精心準備的,這裡比較推薦丁奇的《MySQL實戰》和丁雪豐的《玩轉Spring全家桶》。
訓練。
這裡特指演演算法訓練。推薦大家使用LeetCode,題目比較經典,分類全面。因為本身是計算機專業,對資料結構和演演算法有些偏愛。回想一下上學時就被動態規劃、二叉樹各種虐,說實話我也是在工作這幾年才更深入的理解這些資料結構和演演算法。如果你問這些知識有什麼用,我可以給你一些具體的回答。例如當你熟悉樹的結構會幫助你理解資料庫索引和epoll的實現,親身經歷,面試官會問為什麼資料庫索引要用B+樹;如果你熟悉字母樹會給你提供一種快速字首搜尋的方法;如果你熟悉連結串列,當有人問題如何實現LRU也可以輕鬆回答。再回頭看HashMap的實現,也會有更深刻的理解,更不容易忘。
我大概AC了300道題目,而且喜歡參加競賽,有時間就參加,最好成績是370名。競賽非常有幫助!!阿裡面試其中一輪一定是上機,一個小時做幾道題目,跟競賽的樣式非常相似,而且題目大多類似。競賽能讓你形成一種“肌肉記憶”,上機時程式碼一遍過。很多同學可能會眼高手低,臨場出現一些小問題,耽誤很多時間。另一個相似點在於快速思維,題目並不總是常見的,還有一些需要你臨場快速給出答案,如果你習慣這種樣式,當你遇到這類題目也不會害怕導致大腦空白。由於做過很多題目,以至於我在上機時超額完成任務,當時面試官還“懷疑”我抄襲。這也是一個加分項或者亮點,讓你在候選人中更有競爭力。
而且LeetCode還是訓練新語言的好幫手,我在學習python時,會用兩種語言完成題目,尤其是python的答案有很多寫的非常優雅,能快速掌握很多編碼技巧,推薦大家嘗試一下。
三、結語
如果你想突破自己的天花板,那一定要別人付出更多,這個過程是很辛苦的。如果你做好了充足的準備,那就自信的表達你的觀點,不要因為不自信讓面試官覺得你掌握的不扎實。如果你不會或拿不準,如實告知即可,遇到不會的很正常,不要不懂裝懂。如果你認準了一條路,堅持走下去,你一定會獲得很多收穫。