賴勇浩(http://laiyonghao.com)程序員
最近,有一位朋友由於工做須要,須要從網遊的客戶端編程轉向服務器端編程,找我推薦一本書。我推薦了《Linux 多線程服務器端編程——使用 muduo C++ 網絡庫》給他,他在網上書店看了之後問我爲何推薦這麼厚一本書給他,正好這本書我已經早就看完了,一直也想寫篇「書評」,就在這裏多扯幾句。其實實在算不上書評,緣由有二:一是讀書的時候囫圇吞棗,理解不夠深入,不深入天然不能評;二是這幾年雖然在 Linux 下寫服務器端的網絡程序,但不多用多線程,也不多用 C++,書裏談的東西,算是不熟悉的領域,天然也不能亂評。因此今天這篇,應當是推薦,是爲陳碩老師背書。web
這本書展現了使用 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++,跟上它的發展,這對於我編寫、學習其它編程語言也極有指導意義。固然,對於我朋友這種從客戶端轉過來服務器端的程序員來講,最重要的是可以快速地寫出「正統的」服務器端代碼了。編程語言