現狀:C++基礎知道,書籍讀過:C++Primer、C++對象模型、unix網路編程1和2,用muduo C++網路庫等(因為是計算機專業,計算機基礎是有的);相關項目並沒有,只是模仿著muduo寫過簡化版的網路庫,所以項目經驗如何彌補?其它項目有涉及多線程相關內容(但不是基於linux的)

註:打算參加今年秋招


我也不知道有啥套路,我做了十幾年也沒成專家。但是我可以從數據上給你一個參考。

我廠的原T4(現在的12級以上)可以勉強稱為專家,來算算概率吧。我沒有統計12級以上具體有多少人,和我相互認識的只有兩三個,占員工的比例應該是幾百分之一,假設是1/400吧。

然後我們招聘的要求大概是本科以上前20%,這樣就可以算出專家的概率:0.2/400=0.0005。

對比一下每年高考錄取學生中清北的概率,清北大概每年錄取6000,大專以上每年錄取總人數大概8000000,所以清北的概率是:6000/8000000=0.00075。

結論:0.0005&<0.00075。要成為專家,比考清北還難。

當然,光有能力和決心是不夠的,天時地利人和一樣不能少。

不知道這樣回答對你有沒有用。


秋招,應屆生?專家

之前還看到脈脈有人吐槽,現在找 C++ 工作的人手 muduo 了,就像隔壁找 Java 的人手秒殺系統一樣。不過就算網路庫再簡單,也不可能連多線程都沒用吧?

順便,應屆生太高估項目經驗的重要性了,實際上還是看基礎,你面試時說你看了那幾本書,那麼書上相關的知識點應該都很熟悉吧,尤其是騰訊流行 APUE / UNP 那套,其他公司主要也是針對項目提問相關的基礎,而不是問你項目怎麼做的。如果手撕演算法厲害的話,也比臨時找個項目要強。學歷也能起到一定彌補作用。


評論無意中說了 APUE / UNP 只用看幾章,實際上我也只是隨口一說,畢竟,有些知識點,明顯沒人用嘛,說是這麼說,我這麼一說,要是有人用了,不是說我誤人子弟了?那不還把我批判一番?

完全不負責任的回答:

UNP:

  • Chapter 12~13:IPv6 猴年馬月。守護進程,和 APUE 重複了。
  • Chapter 15:不同其他的,這章我是推薦的,但是其實只是用於本機進程間通信,
  • Chapter 18~23:UDP / SCTP,愛看看。XX 套接字,那是啥。廣播多播,哎呀,我以前課程設計還用了這個,然而並沒什麼好看的。
  • Chapter 24:我只是感興趣看的,帶外數據,能了解下 URG 位從而在和面試官侃侃時脫穎而出?然而並沒什麼好看的。
  • Chapter 26:線程,和 APUE 重複了。
  • Chapter 28~29:除了讓我知道有個 SOCKET_RAW 宏外不知道有什麼用。
  • Chapter 31:那是啥?有人還在用嗎?

說白了,實際使用大多的套接字都是 TCP 套接字。重要的就前 7 章,加上第 30 章的總結,但到這裡,其實我覺得不如過一遍前 7 章後直接看陳碩的書或者 muduo 庫。看書的話,個人覺得容易被更多有趣的東西吸引,不符合應屆生急功近利找工作的需求。

APUE 的話,第 18 章開始就沒必要看了。其實就算排除了一些,真正要啃下來也挺多的。許可權相關的沒必要太深究,想當年我看 TLPI / APUE,糾結那個 Set UID,花了很多時間,感覺很神奇,然而基本用不著,現在早忘了。又不是做許可權管理的,沒啥用。大致瀏覽一遍系統調用有哪些就行了。像 Shell / Python 都提供了很多系統調用的包裝,如果只是做一些管理操作,沒必要去用裸調 C 函數。

相對而言,文件 / 進程 / 線程那塊的理論部分都還挺有用吧,不過其實真正看下去,書上講得不深,有些地方淺嘗輒止。APUE 經典的還是把整個系統編程串了一遍。另外 APUE / UNP 除了介紹編程本身,還介紹了一些實用命令。這點 TLPI (Linux / Unix 系統編程手冊)我覺得做得更好。然而比 APUE / UNP 加起來還厚,但對新手而言,UNP 幾乎沒講的 epoll 也講了,還講得不錯。現在哪個不問下 epoll 的?

PS:我也不是騰訊的,現在從事的也算不上這方面,所以,還是那句話,不負責任瞎吹。


想成為linux服務端C++開發專家,只能自己慢慢學,在實踐中摸索,沒什麼快捷的途徑,祝早日成為專家。

如果題主基礎有了的話,可以找項目來實踐下,怎麼找項目

推薦幾個值得學習的C++開源項目

LevelDb

LevelDb是谷歌兩位大神級別的工程師發起的開源項目,簡而言之,LevelDb是能夠處理十億級別規模Key-Value型數據持久性存儲的C++ 程序庫。

它是一個持久化存儲的KV系統,和Redis這種內存型的KV系統不同,LevelDb不會像Redis一樣狂吃內存,而是將大部分數據存儲到磁碟上。

  其次,LevleDb在存儲數據時,是根據記錄的key值有序存儲的,就是說相鄰的key值在存儲文件中是依次順序存儲的,而應用可以自定義key大小比較函數,LevleDb會按照用戶定義的比較函數依序存儲這些記錄。

主頁:

google/leveldb?

github.com圖標

Boost.Asio

它是非同步輸入輸出的核心。 名字本身就說明了一切:Asio 意即非同步輸入/輸出。該庫可以讓 C++ 非同步地處理數據,且平台獨立。非同步數據處理就是指,任務觸發後不需要等待它們完成。相反,Boost.Asio 會在任務完成時觸發一個應用。非同步任務的主要優點在於,在等待任務完成時不需要阻塞應用程序,可以去執行其它任務。

非同步任務的典型例子是網路應用。如果數據被發送出去了,比如發送至 Internet,通常需要知道數據是否發送成功。 如果沒有一個象 Boost.Asio 這樣的庫,就必須對函數的返回值進行求值。但是,這樣就要求待至所有數據發送完畢,並得到一個確認或是錯誤代碼。而使用 Boost.Asio,這個過程被分為兩個單獨的步驟:第一步是作為一個非同步任務開始數據傳輸。 一旦傳輸完成,不論成功或是錯誤,應用程序都會在第二步中得到關於相應的結果通知.主要的區別在於,應用程序無需阻塞至傳輸完成,而可以在這段時間裡執行其它操作。

主頁:

Boost.Asio - 1.58.0?

www.boost.org

SGI STL

SGI STL是STL代碼的經典實現版本,雖然很多編譯器不直接使用這個版本,但是很多卻在此基礎之上進行改進的。比如GNU C++的標準庫就是在此基礎之上改進的。這份代碼還有一個好處是有注釋,代碼書寫非常規範,只要花些時間讀懂它並非難事。

主頁:

SGI.com Tech Archive Resources now retired?

www.sgi.com圖標

Muduo

muduo 是一個基於 Reactor 模式的現代 C++ 網路庫,它採用非阻塞 IO 模型,基於事件驅動和回調,原生支持多核多線程,適合編寫 Linux 服務端多線程網路應用程序。

主頁:

chenshuo/muduo?

github.com


首先你要成為linux服務端C開發專家,然後你會對C++嗤之以鼻,再然後你寫C多了就發現C++還是有很多優點的,你開始重新學習並使用C++,後來你C++寫煩了就嘗試Go或者Rust,甚至是Java,最後你回歸到C,然後你C的寫多了又發現C++還是有很多優點的,最後你瘋了。

哈哈,以上純屬玩笑,但我的意思是其實沒有什麼Linux服務端C++開發專家,只有Liunx服務端開發專家。


  1. 讀nng和百度的brpc,其中brpc的文檔值得一讀,會涉及到工業界真正想解決的問題。TCP通信部分了解到這個程度就夠了,畢竟是早就成熟的領域。

2. 讀完ddia和它附錄里有意思的論文,讀leveldb和redis,然後了解下lucene。這樣對存儲方面有初步認知。有空再去讀innodb。

3. 讀騰訊的inference框架ncnn,了解如何做計算優化。

4. 讀intel tbb的work stealing用戶級線程調度。

5. 我覺的應屆生很難有時間寫出有意義的完整項目,但可以寫一些有意義的數據結構:可以用C++實現類似redis但又支持泛型的radix tree,用C++實現fit in內存且吞吐吊打lucene的倒排索引。


推薦閱讀:
相关文章