推薦《Linux 多線程服務器端編程》

賴勇浩(http://laiyonghao.com

最近,有一位朋友因爲工作需要,需要從網遊的客戶端編程轉向服務器端編程,找我推薦一本書。我推薦了《Linux 多線程服務器端編程——使用 muduo C++ 網絡庫》給他,他在網上書店看了以後問我爲什麼推薦這麼厚一本書給他,正好這本書我已經早就看完了,一直也想寫篇“書評”,就在這裏多扯幾句。其實實在算不上書評,原因有二:一是讀書的時候囫圇吞棗,理解不夠深刻,不深刻自然不能評;二是這幾年雖然在 Linux 下寫服務器端的網絡程序,但很少用多線程,也很少用 C++,書裏談的東西,算是不熟悉的領域,自然也不能亂評。所以今天這篇,應當是推薦,是爲陳碩老師背書。

這本書展示了使用 C++、多線程進行網絡編程的許多最佳實踐,甚至稱爲標準做法也不爲過。比如當談到 C++ 的內存管理問題的時候,以“不配對的 new[]/delete”爲例,用“把 new[] 統統替換爲 std::vector/scoped_array”爲解決方案,提出使用“智能指針”解決大部分內存問題,堪稱金玉良言。又比如當談到“如何限制併發連接數”時,作者直接引用了 libev 作者 Marc Lehmann 提出的幾個方案,並另外給出一個更爲簡單的方案。

這些最佳實踐的意義在於,當你讀完了 APUE 和 UNP,卻發現自己寫出來的網絡程序完全不堪商用,然後花費了許多日日夜夜修補業務漏洞、內存泄漏、併發性能,勉強支撐了公司業務以後,讀到此書時那種相見恨晚的感覺。你會發現雖然自己身經百戰,但是仍然能夠從書中找到自己完全不瞭解的“常識”;對你來說,也許最大的欣慰就是覺得以後團隊新人終於有一本實踐指南,可以讓新人快速成長起來,不用再一次趟過你已經趟過的坑。

這本書展示了好的代碼,特別是好的 C++ 代碼。從來不缺乏 C++ 的批評之聲,但是 C++ 應當怎麼用,如何寫 C++ 纔是現代的、真正的 C++,在此書之前,幾乎從來沒有成體系的講法。我參與過一些 C++ 項目的編程,也見過許多技術負責人一邊視 boost 爲洪水猛獸,甚至對 STL 也避之不及,卻又一邊自行製造同樣目的、質量差強人意的山寨版輪子。作者非常理性地看待 C++,約束自己對其特性的使用,並提出“樸素的 C++ 設計”理念,在編程中挑選 boost 庫中久經考驗的、優秀的子庫善加應用,比如“使用 boost::function 和 boost::bind 取代虛函數”,減少代碼的同時獲得非常可靠的代碼質量,是非常值得我們學習借鑑的。

這本書展示了基礎的重要性。直接讀,可以發現很多章節講的內容都可以說是常識,但是作爲一名久經考驗的程序員,可以說,我覺得這裏面講的常識都是“一不留神坑死你”的。比如“shared_ptr 技術與陷阱”一節中,作者提到析構的線程不一定是是對象誕生的線程,我的膝蓋就中過一箭。當時我爲一個動作遊戲編寫非玩家角色的人工智能,在遊戲中,大部分 CPU 資源都被用在圖形渲染上,留給人工智能的資源非常有限,我又要做計算量超大的團隊人工智能,所以很“卡”。後來的優化方案是把內存釋放操作放到另一條線程去執行,雖然當時沒有使用 shared_ptr,但因爲問題的原因和解決方案都是一樣的,如果我們當時都讀過這本書,應該不會踏入這個坑。如果有出身草莽的野路子程序員,讀一下這本書,應該還是大有補益的。

這本書展示了對業務理解的重要性。無論是 muduo 庫,還是這本書,都沒有想做到面面俱到。對於 muduo,作者追求的是完成業務領域的需求,並壓榨硬件的極限;對於這本書,作者講求的是“經驗與實踐”,並沒有把這本書寫成枕頭書,而是把“應當注意的、我這樣做的理由”講得通透。說老實話,讀這本書,感覺到作者就像一對一的培訓那麼貼心。

雖然我從 2013 年起,以 web 開發和團隊管理工作爲主,已經不寫基於 TCP 協議的服務器端程序,甚至“幾乎不使用 C++”三年了,但閱讀這本書仍然極有意義:一是理解 Linux 關於網絡方面的新特性,這一塊對我現在做基於 HTTP 協議的開發工作也是極有幫助的;二是理解多線程的最佳實踐,其實工作中免不了多少要跟多線程打交道,掌握這方面的最佳實踐,在遇到使用場景時,可以馬上給出“沒大錯”的方案;三是理解 C++,跟上它的發展,這對於我編寫、學習其它編程語言也極有指導意義。當然,對於我朋友這種從客戶端轉過來服務器端的程序員來說,最重要的是能夠快速地寫出“正統的”服務器端代碼了。
發佈了211 篇原創文章 · 獲贊 640 · 訪問量 364萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章