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

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

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

簡介git

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

因此我萌生了考研的想法,但願在Linux內核這個層面作深造, 我選擇了西安郵電大學,由於該校的陳莉君老師是我比較崇拜的對象,一直在拜讀她的《深刻理解Linux內核》一書。web

後來上了研究生後我開始專一Linux內核、C/C++服務端開發等工做。至於爲什麼選擇C/C++,個人理由很簡單,你們都去學Java了,我要是也去學Java,那麼個人優點何在,並且C/C++也更偏向底層是我比較感興趣的地方, 因此我選擇了C/C++。個人研究生三年全部的心思都投入到了C/C++還有Linux內核,不敢說對C/C++有什麼獨特的看法,至少我以爲個人學習經歷仍是能夠給你們做爲一個參考。面試

Linux從運維到DevOps算法

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

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

就這樣我開始一頭扎到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運維須要作到如下幾點:

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

總結

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

相關文章
相關標籤/搜索