如何學好Linux、C++,並搞定BAT面試作者/分享人:天千

王小鬧兒發表於2018-11-19

學好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語言要學好必須理解三個概念

1、什麼是指標?

指標和陣列的關係。

 

2、程式分為哪幾個段

能說清楚全域性變數,區域性變數,靜態變數等分別屬於哪個段,各個段的特點是什麼?

 

3、C語言的編譯和鏈的接過程

 

真心不推薦在Windows上來學習C語言,因為它遮蔽了太多的細節,而這些細節卻又是C程式設計師不可或缺的一部分。C語言這個階段過去後,我開始學習Linux C系統程式設計這個部分,最開始接觸的一本書就是Unix/Linux程式設計實踐教程強力推薦給大家,這本書會給你介紹如何通過man手冊來幫助程式設計,如何去實現who、cat、ls、ps等系統命令。通過這本書的學習會讓你對Linux上很多的原理有一個深刻的認識。

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

 

 

對於這本書《Linux/UNIX系統程式設計手冊》,重點有三個部分

1、各個socket API的對應到OS,做了哪些事情

比如connect後,做了哪些事情?,accept呢?,什麼是RST報文?,什麼是SIGPIPE,如何觸發的?

2、網路IO模型,同步和非同步,阻塞和非阻塞的概念

Linux上各種網路IO模型的優缺點對比,epoll、select、訊號驅動IO等

3、伺服器的網路程式設計模型,多執行緒、多程式、執行緒池等,各自優缺點

在我的部落格上也有一篇文章介紹了相關的內容,學完這個後,剩下的就靠多實踐和多讀一些開源的專案來積累自己的經驗了,這裡推薦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++有以下幾個要點(只是部分):

 

1、RAII

這個很重要,是C++的核心,很多學習了C++的人都不知道RAII

 

2、值語義和物件語義

這個決定了你如何寫好一個C++類
 

3、物件的生命週期,類的生命週期要清晰
 

4、智慧指標

現代C++程式設計幾乎不太可能出現delete語句,記憶體洩漏的問題真的很少會出現

5、各種STL和C++的一些坑

比如迭代器遍歷過程中如何刪除元素、std::list的size介面的複雜度居然是O(N)(C++11已經修正)等等
 

6、善用std::bind和std::function
 

7、基於物件程式設計和麵向物件程式設計的區別
 

8、移動語義很重要
 

9、Lambda的捕獲表示式
 

10、搞清楚C++的三五法則
 

11、std::string的實現方式,是否是執行緒安全的
 

12、std::map和std::set的底層資料結構等
 

 

Effective Modern C++》,這本書我重點推薦給大家,在我的部落格上也有全部的總結,這本書講了很多C++11種的一些實現細節、坑以及建議。最後推薦一些linux核心相關的書籍和學習方法

深入理解Linux核心架構》《Linux環境程式設計 從應用到核心

重點找自己感興趣的模組來看,比如我就對檔案系統,通過核心模組來探索,不能只看程式碼不練習
網路上有很多從頭開始編寫一個記憶體檔案系統的文章,在我的部落格上也有一個系列講解Linux核心模組程式設計入門的文章,通過編寫Linux核心模組可以做很多有趣的事情,比如系統呼叫攔截、網路攔截、做安全審計等等,通過編寫核心模組可以提高對Linux核心學習的興趣。

 

 

 

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

1、刷leetcode的題目
從牛客網和google上搜集面試題,分門別類的進行整理,每天都回顧一下

 

2、拓寬自己的知識面,學習一些新的知識

比如當時流行的docker,更側重學習其原理

 

3、加深自己對一些底層的OS知識的理解

比如epoll的原理、docker的cgroup機制和namespace機制的實現、檔案系統VFS的實現、Linux訊號、管道等的實現。

整理面試題和學習一些底層的OS知識對我整個面試過程中幫助很大,正常情況下如果你只學習Java或者C++是很難拿到阿里巴巴的Offer,阿里巴巴對應屆生的知識面、知識的理解程度要求還是比較高的,在我的整個C++面試過程中,問的最多的就是IO複用、智慧指標、記憶體洩漏的問題如何解決、如何排查Load高的問題、Linux核心相關的知識等,而這些問題對我來說早已得心應手,在蒐集面試題的時候很多問題都是反覆被提及到的,我只需要好好總結即可。

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

 

 

工作心得

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

1、要有造輪子的能力,但是不要輕易的去造輪子

2、單元測試的重要性

通過單元測試也可以提高程式設計師的信心,為了更好的寫單測,會逼迫我們將模組之間的耦合降到最低,這樣可以方便單測。

3、寫易讀的、可維護的程式碼

4、Google的C++程式設計規範,每一條都值得細細品味

5、Chromium開源專案有很多值得我們借鑑的地方

6、畫UML圖是程式設計師的基本素質,要有好的設計,設計要做評審

7、CodeReview一定要有的

8、類名和變數名的易讀性

可能對於很多人來說編碼規範、CodeReview、UML、單測好像都是說說而已,我起初也是這麼認為,感觸並不是很深刻,直到我的同事開始帶我的時候,我自己親身去體驗的時候才發現這其中奧妙無窮, 我們團隊使用Chromium的base庫作為自己的基礎庫,編碼規範、全都follow Chromium,至於為什麼不用boost,我的理由則是,boost是一個我無法駕馭的怪獸,而chromium的base庫是我可以駕馭的,可以打組合拳,程式碼的穩定性已經經過上億人的考驗,值得我們信賴。推薦大家看看chromium的base庫,原始碼很易讀。通過閱讀它的程式碼可以學習到很多知識。推薦一本書給大家《C++ API設計》,講解了很多軟體工程、設計層面的知識。

 

 

 

總結

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

 

 


相關文章