我是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運維須要作到如下幾點:
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的部分。對於這本書重點有三個部分。
在個人博客上也有一篇文章介紹了相關的內容,學完這個後,剩下的就靠多實踐和多讀一些開源的項目來積累本身的經驗了,這裏推薦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++有如下幾個要點(只是部分):
到了這個階段後我就開始找工做了,上面的所有過程花費了研究生二年的時間,後來找到了某BAT實習的工做後,我就一邊實習,一邊讀《Effective Modern C++》,這本書我重點推薦給你們,在個人博客上也有所有的總結,這本書講了不少C++11種的一些實現細節、坑以及建議。
最後推薦一些linux內核相關的書籍和學習方法
網絡上有不少從頭開始編寫一個內存文件系統的文章,在個人博客上也有一個系列講解Linux內核模塊編程入門的文章,經過編寫Linux內核模塊能夠作不少有趣的事情,好比系統調用攔截、網絡攔截、作安全審計等等,經過編寫內核模塊能夠提升對Linux內核學習的興趣。
BAT求職之路
研究生階段我主要面試了阿里巴巴、騰訊、網易都是C++研發工程師,只有網易拿到的是實習的Offer,其餘的都是拿到了實習和正式的Offer,就C++這個崗位來講,阿里巴巴的要求明顯高於騰訊和網易,網易的C++面試相對容易一些,問的很基礎,感受就是走個過場,都沒問什麼太難的問題,多是由於是招實習吧,騰訊的C++面試偏基礎從OS、網絡、編譯原理、算法等。問題都不太難,問的比較廣,阿里巴巴更側重知識面、底層原理、解決問題的能力等。我阿里巴巴一共面了五面,問了不少C++、算法、Linux內核等知識。
在整個求職過程當中,我作了如下幾件事:
整理面試題和學習一些底層的OS知識對我整個面試過程當中幫助很大,正常狀況下若是你只學習Java或者C++是很難拿到阿里巴巴的Offer,阿里巴巴對應屆生的知識面、知識的理解程度要求仍是比較高的,在個人整個C++面試過程當中,問的最多的就是IO複用、智能指針、內存泄漏的問題如何解決、如何排查Load高的問題、Linux內核相關的知識等,而這些問題對我來講早已駕輕就熟,在蒐集面試題的時候不少問題都是反覆被說起到的,我只須要好好總結便可。
另一點就是你們在準備面試題的時候不能只記一個結論,多問問爲何,舉個例子,TCP/IP的三次握手和四次揮手的過程是什麼樣的,咱們不光光要知道這個問題的結論,還要知道爲何是三次握手,四次揮手,爲何不是二次?當被問及到epoll、select的區別時,你應該從使用方法、可移植性、性能、優缺點、內核實現等多個方面分析和總結。而不是簡簡單單的就說起一個優缺點就完事了。 你擅長的地方你應該多多引導你的面試官去問。
工做心得
在公司實習了大約1年,今年七月份正式入職,在這整個過程當中我也零散的作了不少小需求,對C++的理解更加深入,尤爲是對軟件工程有了一個新的理解,在此我想分享給你們。
可能對於不少人來講編碼規範、CodeReview、UML、單測好像都是說說而已,我起初也是這麼認爲,感觸並非很深入,直到個人同事開始帶個人時候,我本身親身去體驗的時候才發現這其中奧妙無窮, 咱們團隊使用Chromium的base庫做爲本身的基礎庫,編碼規範、全都follow Chromium,至於爲何不用boost,個人理由則是,boost是一個我沒法駕馭的怪獸,而chromium的base庫是我能夠駕馭的,能夠打組合拳,代碼的穩定性已經通過上億人的考驗,值得咱們信賴。推薦你們看看chromium的base庫,源代碼很易讀。經過閱讀它的代碼能夠學習到不少知識。推薦一本書給你們《C++ API設計》,講解了不少軟件工程、設計層面的知識。
總結
上面說了不少,更側重分享了個人學習經歷,和一些感悟,可能我說的比較簡單,實際上理解上面這些東西,是存在一個過程的,是一個從量變到質變的過程,在整個過程當中我理解到,學習要堅持,不是一蹴而就的,要經歷量變到質變的過程。