技術學到多厲害才能順利進入BAT?阿里巴巴中間件大佬爲你解答

我是2017年加入到阿里巴巴中間件技術部,我本科其實是合肥一個不入流的三本,後來考研到西安郵電,2016年的這個時候我也和你們一樣到處面試,投簡歷。

幸運的是我收穫了網易的實習Offer、騰訊的是實習Offer還有阿里巴巴的實習Offer。通過實習我順利進入了阿里巴巴,在阿里巴巴這個舞臺下我收穫了很多。去年的時候我在gitchat上分享了一篇文章,大致就是講了一下我的求職和學習的經歷。幫助了不少人樹立求職的自信,學校的好壞不是最重要的。

簡介

本科的時候對 Linux 特別感興趣,心中嚮往成爲一名運維工程師,就開始沒日沒夜的看相關的書籍,到了大約2013年前後的時候發現 DevOps 開始流行起來了,就開始學習 Python 希望成爲一名 DevOps 工程師,後來出去實習發現從事運維相關的工作並不是我的追求,苦於在合肥這樣的城市真的很難找到一份專職做 DevOps 的地方(當時在科大訊飛的時候,做的就是純運維的工作,該公司的 DevOps 也纔有個雛形)。

所以我萌生了考研的想法,希望在Linux內核這個層面做深造, 我選擇了西安郵電大學,因爲該校的陳莉君老師是我比較崇拜的對象,一直在拜讀她的《深入理解Linux內核》一書。

後來上了研究生後我開始專注Linux內核、C/C++服務端開發等工作。至於爲何選擇C/C++,我的理由很簡單,大家都去學Java了,我要是也去學Java,那麼我的優勢何在,而且C/C++也更偏向底層是我比較感興趣的地方, 所以我選擇了C/C++。我的研究生三年所有的心思都投入到了C/C++還有Linux內核,不敢說對C/C++有什麼獨特的見解,至少我覺得我的學習經歷還是可以給大家作爲一個參考。

Linux從運維到DevOps

先簡單花一些篇幅介紹下我的這段學習經歷吧,我的Linux啓蒙老師,還是要源於一些培訓公司在學習做的免費培訓,大學那會經常有一些培訓公司會來我們學習做免費培訓,想讓我們花錢去培訓。

我記得當時最流行的兩個證書一個是RHCE(RedHat相關的認證),另外一個則是CCNA、CCNP(思科網絡相關的認證),當時的我深深被Linux吸引,opensource深深吸引了我,Linux那酷炫的黑框框吸引了我。我理想中的Hacker應該就是整天在黑框框中瞧着一堆看不懂的字符。

就這樣我開始一頭扎到Linux的世界中,我的第一本入門書是大學圖書館借的一本linux用戶指南,具體的書名已經記不起來了。後來開始讀鳥哥的私房菜,這本書在當時真的很好,我沒有想太多,只知道瘋狂的讀完整本書,一遍、二遍……,就這樣我讀了五遍,上面的實驗不停的練習、命令不停的練習。

就這樣我的Linux入門了,入門後我的開始迷茫,因爲不知道下一步該學什麼了,我又瘋狂的開始尋找下一個目標“西安鵬程 Linux 網絡服務視頻“這個是帶領我進入Linux最神祕的世界,在這裏我發現Linux能做很多很多有趣的事情,我開始搭建Apache服務器了,我居然可以運行一個網站了,我還學會了用Linux做DHCP服務器、DNS 服務器、VSFTP服務器,一時間我覺得我打開了一個新世界,後來開始接觸網絡、搭建路由器、防火牆等等。覺得Linux真的很奇妙,當時我還利用 Linux搭建http代理服務器,然後在宿舍通過學校實驗室部署的http代理服務器來免費上網。

後來開始出去實習我就已經可以實現不看任何文檔,從頭源碼編譯LNMP,並搭建discuz論壇,就靠這個本事我找到了我的第一份實習,工資是1800塊。

後來發現工作了,就沒有心思學習了,所以又回到了學校再好好鞏固自己的基礎,並下定決心開始考研深入學習Linux,在考研的期間我發現了馬哥 Linux,這又是我人生中另外一個起點,馬老師講課注重原理和實踐,七分原理三分實踐,通過他的課程我的 linux 水平提升了一個很大的檔次,他的全套課程我完整的聽過三遍,每一個課程上的實驗我都做了至少五遍以上,這奠定了我的 Linux 基礎和shell腳本的基礎,此後在我的職業生涯中shell腳本一直是我最強有力的助手。在研究生階段我還專門做過shell腳本相關的分享。

在2013到2014年這段時間開始流行自動化運維、Python,這個階段我開始學Python,還有現在比較流行的Flask框架,我自認爲我應該是最早的一批Flask框架的用戶了,當時國外人出的一本《Flask Web開發:基於Python的Web應用開發實戰》書,我也是第一時間從某寶上買到並閱讀,只可惜後面轉到C++後就沒再看過了,這期間用Flask做過一個博客。在研究生階段還幫同學和一些朋友運維過一些網站,做一些簡單的調優和加固。到此爲止我的DevOps之路終結了,從此走向了Linux C/C++的路上。

通過上面我的這些經歷我給大家簡單的總結下:我覺得學好Linux運維需要做到以下幾點:

多做實驗,實驗環境完全可以通過VMware來模擬,模擬私有網絡,模擬多臺機器,要搞懂VMware提供的集中網絡模式的工作原理(橋接網絡、宿主機網絡、NAT等),這對整個Linux後續的學習幫助都非常之大,還可以通過虛擬機模擬Grub損壞並進行修復、模擬忘記密碼並通過單用戶模式修改密碼等等。
LNMP、DHCP、DNS、MySQL等等這些網絡服務需要完全基於源碼來編譯,這樣更加有體感,對於編譯的參數要理解,因爲通過yum安裝的軟件包都是上一個穩定版本,並不是最新穩定版本,還有另外一點就是編譯安裝可以通過編譯參數對軟件進行一定的優化。
Linux基礎要紮實,底層原理要理解,典型的文件系統的組成、inode和數據存放的位置、Linux進程是如何調度的、調度算法有哪些、磁盤調度算法有哪些、TCP/IP的三次握手和四次揮手的過程是如何的,網絡中的數據是如何流向的(參考《構建高性能web站點》),iptables的三表五鏈、Nginx的網絡IO模型(這個很重要,你要能講清楚爲什麼Nginx要比Apache好),馬哥Linux對於這個部分的內容講解是我最喜歡的,我強力推薦大家都去聽一聽馬哥的視頻。
英文文檔的閱讀能力,閱讀各類開源軟件的官方文檔是必經之路,這個也是瞭解一個開源軟件最快的捷徑,如果你沒有一定的英文閱讀能力,那麼你只能等到有人把這些文章翻譯成中文後你才能學習到。
寫博客,很多時候,看了視頻和書後,如果你不能講這些知識用你的語言表達出來,那麼很大可能,你並沒有真正的理解這些知識,通過寫博客的方式會逼迫你回憶知識,然後總結出來,博客被大量人訪問也會在一定程度上激勵你,讓你有一定的成就感,促使你把博客寫的更好。
Shell腳本的要熟悉,運維這條路上腳本會幫我們省掉不少體力活,此外必須要學習一門編程語言Python、Golang等
C++從小白到入門

C++我是從研究生入學前的二個月開始學習,基本算是零基礎吧,就大學那會學了一些C的知識,經常寫一個程序一堆”燙燙燙”,真的是到了本科畢業還沒搞懂C語言。然後在這個二個月我開竅了,突然發現對C語言融匯貫通了, 而這一切要歸功於《C和指針》這本書,總結一下,我認爲C語言要學好必須理解三個概念。

什麼是指針?,指針和數組的關係。
程序分爲哪幾個段,能說清楚全局變量,局部變量,靜態變量等分別屬於哪個段,各個段的特點是什麼?
C語言的編譯和鏈的接過程
真心不推薦在Windows上來學習C語言,因爲它屏蔽了太多的細節,而這些細節卻又是C程序員不可或缺的一部分。C語言這個階段過去後,我開始學習Linux C系統編程這個部分,最開始接觸的一本書就是《Unix/Linux編程實踐教程》強力推薦給大家,這本書會給你介紹如何通過man手冊來幫助編程,如何去實現who、cat、ls、ps等系統命令。通過這本書的學習會讓你對Linux上很多的原理有一個深刻的認識。

這本書學完後我就開始看UNP和APUE,其中APUE我並不推薦給大家,我推薦給大家的是《Linux/UNIX系統編程手冊》這本書的內容更全面,更新。建議大家在看這些書的時候可以做詳細的筆記和代碼練習,在我的博客上就有我總結的文章。系統編程ok後,就要重點看UNP了,看這本書的時候要找重點看,裏面有的章節已經過時了,還有一些章節對於我們目前來說用途並不大,比如STCP的部分。對於這本書重點有三個部分。

各個socket API的對應到OS,做了哪些事情,比如connect後,做了哪些事情?,accept呢?,什麼是RST報文?,什麼是SIGPIPE,如何觸發的?
網絡IO模型,同步和異步,阻塞和非阻塞的概念,Linux上各種網絡IO模型的優缺點對比,epoll、select、信號驅動IO等
服務器的網絡編程模型,多線程、多進程、線程池等,各自優缺點
在我的博客上也有一篇文章介紹了相關的內容,學完這個後,剩下的就靠多實踐和多讀一些開源的項目來積累自己的經驗了,這裏推薦cjson、webbench、Tinyhttpd等,代碼量都不大,很容易讀懂,在讀懂的基礎上可以進行適當的改造和重寫。

C語言和Linux系統編程這個部分結束後,就要開始踏入C++的世界了,自從C++11出來後,我覺得C++易學了,但是苦於現存的老的C++代碼還是有很多,所以我們不得不去學習C++98相關的知識,這裏我推薦《C++ primer》一書,注意是C++ primer,不是《C++ primer plus》我看書的方法都比較老套,第一遍力求看懂,第二遍開始抄代碼,練習,第三遍開始總結寫博客。所以這本書我前前後後看了大半年, 後面又看了C++編程思想上冊,Effective C++、深度理解C++對象模型、Exceptional C++、深入理解C++11等經典書籍,看書的模式基本上都是二到三遍,通過抄書上的代碼和寫博客來加深記憶。看完這些書說真的,我覺得我的C++還只是一個小白,我真正蛻變要從讀《Linux C++服務端編程》陳碩的這本書開始,通過這本書我覺得我的C++水平有了一個質的飛躍。

我理解C++有以下幾個要點(只是部分):

RAII,這個很重要,是C++的核心,很多學習了C++的人都不知道RAII
值語義和對象語義,這個決定了你如何寫好一個C++類
對象的生命週期,類的生命週期要清晰
智能指針,現代C++編程幾乎不太可能出現delete語句,內存泄漏的問題真的很少會出現
各種STL和C++的一些坑,比如迭代器遍歷過程中如何刪除元素、std::list的size接口的複雜度居然是O(N)(C++11已經修正)等等
善用std::bind和std::function
基於對象編程和麪向對象編程的區別
移動語義很重要
Lambda的捕獲表達式
搞清楚C++的三五法則
std::string的實現方式,是否是線程安全的
std::map和std::set的底層數據結構等
到了這個階段後我就開始找工作了,上面的全部過程花費了研究生二年的時間,後來找到了某BAT實習的工作後,我就一邊實習,一邊讀《Effective Modern C++》,這本書我重點推薦給大家,在我的博客上也有全部的總結,這本書講了很多C++11種的一些實現細節、坑以及建議。

最後推薦一些linux內核相關的書籍和學習方法

《深入理解Linux內核架構》
《Linux環境編程 從應用到內核》
http://lwn.net
重點找自己感興趣的模塊來看,比如我就對文件系統
通過內核模塊來探索,不能只看代碼不練習
網絡上有很多從頭開始編寫一個內存文件系統的文章,在我的博客上也有一個系列講解Linux內核模塊編程入門的文章,通過編寫Linux內核模塊可以做很多有趣的事情,比如系統調用攔截、網絡攔截、做安全審計等等,通過編寫內核模塊可以提高對Linux內核學習的興趣。

BAT求職之路

研究生階段我主要面試了阿里巴巴、騰訊、網易都是C++研發工程師,只有網易拿到的是實習的Offer,其他的都是拿到了實習和正式的Offer,就C++這個崗位來說,阿里巴巴的要求明顯高於騰訊和網易,網易的C++面試相對容易一些,問的很基礎,感覺就是走個過場,都沒問什麼太難的問題,可能是因爲是招實習吧,騰訊的C++面試偏基礎從OS、網絡、編譯原理、算法等。問題都不太難,問的比較廣,阿里巴巴更側重知識面、底層原理、解決問題的能力等。我阿里巴巴一共面了五面,問了很多C++、算法、Linux內核等知識。

在整個求職過程中,我做了以下幾件事:

刷leetcode的題目
從牛客網和google上搜集面試題,分門別類的進行整理,每天都回顧一下
拓寬自己的知識面,學習一些新的知識,比如當時流行的docker,更側重學習其原理
加深自己對一些底層的OS知識的理解,比如epoll的原理、docker的cgroup機制和namespace機制的實現、文件系統VFS的實現、Linux信號、管道等的實現。
整理面試題和學習一些底層的OS知識對我整個面試過程中幫助很大,正常情況下如果你只學習Java或者C++是很難拿到阿里巴巴的Offer,阿里巴巴對應屆生的知識面、知識的理解程度要求還是比較高的,在我的整個C++面試過程中,問的最多的就是IO複用、智能指針、內存泄漏的問題如何解決、如何排查Load高的問題、Linux內核相關的知識等,而這些問題對我來說早已得心應手,在蒐集面試題的時候很多問題都是反覆被提及到的,我只需要好好總結即可。

另外一點就是大家在準備面試題的時候不能只記一個結論,多問問爲什麼,舉個例子,TCP/IP的三次握手和四次揮手的過程是什麼樣的,我們不光光要知道這個問題的結論,還要知道爲什麼是三次握手,四次揮手,爲什麼不是二次?當被問及到epoll、select的區別時,你應該從使用方法、可移植性、性能、優缺點、內核實現等多個方面分析和總結。而不是簡簡單單的就提及一個優缺點就完事了。 你擅長的地方你應該多多引導你的面試官去問。

工作心得

在公司實習了大約1年,今年七月份正式入職,在這整個過程中我也零散的做了很多小需求,對C++的理解更加深刻,尤其是對軟件工程有了一個新的理解,在此我想分享給大家。

要有造輪子的能力,但是不要輕易的去造輪子
單元測試的重要性,通過單元測試也可以提高程序員的信心,爲了更好的寫單測,會逼迫我們將模塊之間的耦合降到最低,這樣可以方便單測。
寫易讀的、可維護的代碼
Google的C++編程規範,每一條都值得細細品味
Chromium開源項目有很多值得我們借鑑的地方
畫UML圖是程序員的基本素質,要有好的設計,設計要做評審
CodeReview一定要有的
類名和變量名的易讀性
可能對於很多人來說編碼規範、CodeReview、UML、單測好像都是說說而已,我起初也是這麼認爲,感觸並不是很深刻,直到我的同事開始帶我的時候,我自己親身去體驗的時候才發現這其中奧妙無窮, 我們團隊使用Chromium的base庫作爲自己的基礎庫,編碼規範、全都follow Chromium,至於爲什麼不用boost,我的理由則是,boost是一個我無法駕馭的怪獸,而chromium的base庫是我可以駕馭的,可以打組合拳,代碼的穩定性已經經過上億人的考驗,值得我們信賴。推薦大家看看chromium的base庫,源代碼很易讀。通過閱讀它的代碼可以學習到很多知識。推薦一本書給大家《C++ API設計》,講解了很多軟件工程、設計層面的知識。

總結

上面說了很多,更側重分享了我的學習經歷,和一些感悟,可能我說的比較簡單,實際上理解上面這些東西,是存在一個過程的,是一個從量變到質變的過程,在整個過程中我理解到,學習要堅持,不是一蹴而就的,要經歷量變到質變的過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章