本科的時候對 linux 特別感興趣,心中嚮往成為一名運維工程師,就開始沒日沒夜的看相關的書籍,到了大約2023年前後的時候發現 devops 開始流行起來了,就開始學習 python 希望成為一名 devops 工程師,後來出去實習發現從事運維相關的工作並不是我的追求,苦於在合肥這樣的城市真的很難找到乙份專職做 devops 的地方(當時在科大訊飛的時候,做的就是純運維的工作,該公司的 devops 也才有個雛形)。
所以我萌生了考研的想法,希望在linux核心這個層面做深造, 我選擇了西安郵電大學,因為該校的陳莉君老師是我比較崇拜的物件,一直在拜讀她的《深入理解linux核心》一書。
後來上了研究生後我開始專注linux核心、c/c++服務端開發等工作。至於為何選擇c/c++,我的理由很簡單,大家都去學j**a了,我要是也去學j**a,那麼我的優勢何在,而且c/c++也更偏向底層是我比較感興趣的地方, 所以我選擇了c/c++。我的研究生三年所有的心思都投入到了c/c++還有linux核心,不敢說對c/c++有什麼獨特的見解,至少我覺得我的學習經歷還是可以給大家作為乙個參考。
先簡單花一些篇幅介紹下我的這段學習經歷吧,我的linux啟蒙老師,還是要源於一些培訓公司在學習做的免費培訓,大學那會經常有一些培訓公司會來我們學習做免費培訓,想讓我們花錢去培訓。
我記得當時最流行的兩個證書乙個是rhce(redhat相關的認證),另外乙個則是ccna、ccnp(思科網路相關的認證),當時的我深深被linux吸引,opensource深深吸引了我,linux那酷炫的黑框框吸引了我。我理想中的hacker應該就是整天在黑框框中瞧著一堆看不懂的字元。
就這樣我開始一頭扎到linux的世界中,我的第一本入門書是大學圖書館借的一本linux使用者指南,具體的書名已經記不起來了。後來開始讀鳥哥的私房菜,這本書在當時真的很好,我沒有想太多,只知道瘋狂的讀完整本書,一遍、二遍……,就這樣我讀了五遍,上面的實驗不停的練習、命令不停的練習。
後來開始出去實習我就已經可以實現不看任何文件,從頭原始碼編譯lnmp,並搭建discuz論壇,就靠這個本事我找到了我的第乙份實習,工資是1800塊。
後來發現工作了,就沒有心思學習了,所以又回到了學校再好好鞏固自己的基礎,並下定決心開始考研深入學習linux,在考研的期間我發現了馬哥 linux,這又是我人生中另外乙個起點,馬老師講課注重原理和實踐,七分原理三分實踐,通過他的課程我的 linux 水平提公升了乙個很大的檔次,他的全套課程我完整的聽過三遍,每乙個課程上的實驗我都做了至少五遍以上,這奠定了我的 linux 基礎和shell指令碼的基礎,此後在我的職業生涯中shell指令碼一直是我最強有力的助手。在研究生階段我還專門做過shell指令碼相關的分享。
在2013到2023年這段時間開始流行自動化運維、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安裝的軟體包都是上乙個穩定版本,並不是最新穩定版本,還有另外一點就是編譯安裝可以通過編譯引數對軟體進行一定的優化。
shell指令碼的要熟悉,運維這條路上指令碼會幫我們省掉不少體力活,此外必須要學習一門程式語言python、golang等
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核心學習的興趣。
整理面試題和學習一些底層的os知識對我整個面試過程中幫助很大,正常情況下如果你只學習j**a或者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設計》,講解了很多軟體工程、設計層面的知識。
上面說了很多,更側重分享了我的學習經歷,和一些感悟,可能我說的比較簡單,實際上理解上面這些東西,是存在乙個過程的,是乙個從量變到質變的過程,在整個過程中我理解到,學習要堅持,不是一蹴而就的,要經歷量變到質變的過程。
賈揚清有多厲害?
不僅僅是開源框架caffe和pytorch的主要貢獻者,而且也是tensorflow的貢獻者之一。本科和碩士在清華大學,博士在加州大學伯克利分校。在谷歌大腦擔任科學家2年開發tensorflow之後,他又在facebook擔任研究主任 research scientist director 長達3年...
多動手,才能勤用腦
空想主義永遠不如實踐來的真實,總是把問題相當然的完美化,只有在動手實踐當中才會發現這樣那樣的問題,發現問題才會驅使我們尋找解決問題的方法。這周主要的安排就是帶九期的拆裝機器,和去年的我們一樣,算是 入門的必修課。不過和我們相比,給他們添了乙個新花樣,就是拆裝前的測試,用來檢視他們學習魔法書 的情況。...
多動手,才能勤用腦
空想主義永遠不如實踐來的真實,總是把問題相當然的完美化,只有在動手實踐當中才會發現這樣那樣的問題,發現問題才會驅使我們尋找解決問題的方法。這周主要的安排就是帶九期的拆裝機器,和去年的我們一樣,算是 入門的必修課。不過和我們相比,給他們添了乙個新花樣,就是拆裝前的測試,用來檢視他們學習魔法書 的情況。...