主頁 > 後端開發 > 我的新書《C++服務器開發精髓》終于出版啦

我的新書《C++服務器開發精髓》終于出版啦

2021-06-26 06:07:39 後端開發

一、千呼萬喚始出來

親愛的各位讀者,我的新書《C++ 服務器開發精髓》終于終于終于與大家見面了,圖書如下:

圖書的封面設計很精美,當然內容一定不負眾望,因出版社老師要求提供一張照片放到封面上,今年的 6 月 1 日兒童節去拍了一張,照片拍出來放在下面大家自己看吧,人到中年,生活不易,沒有少年時代那種懵懂與青澀,多了一份厚實與堅定了,一些想做的事情卻一步步把它做成了,成為現實,昔日戲言身后事,明朝都到眼前來,所以,夢想還是要有的,還是要堅持的,即使這世界有那么多不完善,生活有那么多不如意,因為萬一實作了呢?

二、寫書的故事

關于這本書,我寫了三年,故事太長了,容我細細道來,

2018 年的時候,我去攜程旅行網作業,那個時候攜程正在招一個具有 C/C++ 背景的 Java 資深開發,而我正好符合這樣的要求,那會兒,我已經玩了許多年的知乎,在知乎上也回答了一些 C/C++ 與 Linux 后臺開發相關的問題,有些回答竟然達到了幾千贊和收藏,有一些出版社編輯老師在知乎上找到我,問我有沒有寫一本關于 C++ 或者服務器方面的圖書,我考慮時機不成熟,就都一一婉拒了,

后來我抱著玩兒的心態嘗試在公眾號發表文章,沒想到一下子打開了一個充滿奇幻的未知大門,在公眾號互推的程序中結識了艷鵬,彼時他已經出版了一本口碑很好的分布式服務相關的圖書,另外一本書也在寫作中,艷鵬告訴我,和他對接的出版社編輯老師非常靠譜,可以推薦給我,于是,我就接受了他的推薦,沒想到沒過多久,出版社老師就發來約稿合同,我那個時候也沒想到會這么快,就“糊里糊涂”地簽了合同,

人嘛,有時候不逼自己一把,你永遠不知道自己能成事,既然簽了合同,那就得認真對待,而且合同上也有交稿日期,雖然出版社老師說,延期一般提前溝通問題也不大,就算最終作者沒寫出來,出版社一般也不會追究責任和賠償,

既然答應下來,書還是要好好寫的,我寫書分為幾個階段,第一個階段是列書的大綱目錄和章節,同時列舉每一節要寫的內容;第二階段是實際的寫作階段,這個階段時間花的最長;第三階段是潤色與優化階段,我把書的內容發給了一些相關同行和讀者,請他們提出一些修改建議和意見,同時,補充了一些后來作業和學習中一些新的想法與有用的技巧,2019 年年初又應朋友邀請一起創業,是早期團隊三個主要開發之一,作業就更忙了,加上那個時候也是單休,只能利用早早晚晚或者節假日的時間去寫作,

就這樣斷斷續續地寫了兩年,期間有些章節反復的修改,大家都知道的,在如今講究速成的年代,出一本關于 C/C++ 圖書是很需要勇氣的,企業要求快速化生產與 學習周期長、學習難度大的 C/C++ 技術堆疊之間的矛盾讓很多同學望而卻步,一些新人在嘗試之后學不得法或者被浮躁的網文的宣傳而最終放棄,

C/C++ 技術堆疊一旦學成,奇妙無窮,那么,C/C++ 技術堆疊到底該如何學好呢?筆者雖然經驗有限,但仍恬以剖析之,

按照技術掌握的深度,一般分為兩個層級,第一個層級是開發熟練工,第二個階段是融匯貫通階段,

三、無窮歲月增中減,有味詩書苦后甜

3.1 開發熟練工階段

C/C++ 這門語言與其他高級語言不同,它是離作業系統較近的語言,所以學好 C/C++ 體系的技術堆疊必須結合作業系統的運行機制來學習,展開來說,就是你必須掌握作業系統層面的幾大基礎知識,他們是匯編、編譯鏈接與運行時體系、狹義的作業系統原理、多執行緒、網路編程,

第一個基礎知識是匯編,我們學習匯編不是一定要用匯編來寫代碼,就像我們學習 C/C++ 也不一定單純為了面試和找作業,

對于 C/C++ 的同學來說,匯編是建議一定要掌握的,只有這樣,你才能在書寫 C++ 代碼的時候,清楚地知道你的每一行C++代碼背后對應著什么樣的機器指令,if/for/while 等基本程式結構如何實作的,函式的回傳值如何回傳的,為什么整型變數的數學運算不是原子的,最終你知道如何書寫代碼才能做到效率最高,掌握了匯編,你可以明白,在 C++ 中,一個堆疊物件從構造到析構,其整個生命周期里,開發者的代碼、編譯器和作業系統分別做了什么,掌握了匯編,你可以理解函式呼叫是如何實作的,你可以理解函式的幾種呼叫方法,為什么printf這樣的函式其呼叫方式不能是 __stdcall,而必須是 __cdecl,掌握了匯編,你就能明白為什么一個類物件增加一個方法不會增加其實際占的記憶體空間,

第二個基礎知識是編譯、鏈接與運行時體系知識,作為一個開發者,要清楚地知道我們寫的 C/C++ 程式是如何通過預處理、編譯與鏈接等步驟最終變成可執行的二進制檔案,作業系統如何識別一個檔案為可執行檔案,一個可執行檔案包含什么內容,執行時如何加載到行程的地址空間,程式的每一個變數和資料位于行程地址空間的什么位置,如何參考到,一個行程的地址空間有些什么內容,各段地址分布著什么內容,為什么讀寫空指標或者野指標會有記憶體問題,一個行程如何裝在各個 so 或 dll 檔案的,這些檔案被加載到行程地址空間的什么位置,如何被執行,資料如何被交換,

第三個基礎知識是狹義的作業系統原理,這里加上“狹義”二字是因為從廣義上來講,以上所說的內容都是作業系統原理的范疇,狹義的作業系統原理這里包括作業系統如何管理行程與執行緒,虛擬記憶體與物理記憶體之間的對應關系,何為記憶體映射檔案,行程之間如何通信等等,

第四個基礎知識是多執行緒知識,嚴格來說,這點已經包括在第三點之中了,我之所以將其單獨列出來,是因為多執行緒編程是我們做應用服務最常用的技術之一,最近面試過幾個學歷非常好的同學,對于一個行程中如果某個執行緒因為記憶體問題而退出,是否會導致整個行程退出的問題答不好,實在不應該,多執行緒知識其實不難學,立足于理解與實踐而不是應付面試,可以學的很好,無論是 Windows 還是 Linux 作業系統,作業系統提供的執行緒同步物件就那么幾種,Windows 常用的有臨界區(關鍵端)、Event、互斥體、信號量等,Linux 有互斥體、信號量、讀寫鎖、條件變數,這些知識點學過則會,不學則不會,這些執行緒同步原語花上幾天就能搞得清楚,大多數同學不是學不會,而是不愿意學,但是偏偏喜歡在簡歷上寫上自己熟悉多執行緒編程,面試的時候,被問到條件變數的虛假喚醒機制都說不清楚,非要說自己用過條件變數,這是一些同學犯的很低級的錯誤,如果真用過條件變數,如果不知道虛假喚醒機制,那一定寫的代碼是不對的,市場上目前沒有任何一本圖書對以上知識形成體系的介紹,當然,我的本書填補了這一空缺,你將從本書中獲得從行程與執行緒的關系,再到常用的執行緒同步原語的區別與使用場景,再到執行緒池以及基于生產者消費者模型的訊息佇列,以及對協程思想介紹的相關知識,

掌握了常見的多執行緒同步原語之后,接下來可以找一些帶多執行緒的專案去學習一下,不管是否帶 UI 的都行,我推薦的一種方式是,使用 gdb 或者 Visual Studio 除錯器將你需要學習的多執行緒程式中斷下來,在多執行緒面板,看看這個行程一共有多少個正在運行的執行緒,分析每個執行緒的作用,然后研究下這些執行緒在何時何地創建的,為什么需要創建新的執行緒,嘗試愛過幾個人,面對愛情你會誠實很多;嘗試研究幾個多執行緒專案,面對多執行緒你會熟練許多,

第五個是網路編程,直白地說就是 Socket 編程,作業系統層面提供的 API 會在相當長的時間內保持介面不變,一旦學成,終生受用,理解和掌握常用的基礎 socket API 不僅可以最大化地去定制各種網路通信框架,更不用說使用市面上流行的網路通信庫了,最重要的是,它會是你排查各種網路疑難雜癥堅實的技術保障,作業系統層面提供的網路模型就那么幾種,無論像 Java/Go/Python 等語言如何封裝,作為技術的源頭,我們有什么理由不去掌握它呢?市面上關于網路編程的書很多,我在書中結合我這些年的作業經驗總結了二十幾個網路編程中的重點和難點,現在全部交給你,

以上是基于 C++ 技術堆疊來說,并沒有包括演算法與資料結構、資料庫等方面的基本功,但是這些額外的也是應該需要掌握的,掌握了如上所說的,你就達到了一個熟練工階段,

3.2 融匯貫通階段

掌握了這些基礎知識,接下來,技術更進一步,就無關具體的編程語言了,互聯網方向的高級技術有如下:

高可用與容災容錯

服務都是人開發的,既然是人開發的,必然有宕機的可能性,當然宕機的原因可能是程式自身 bug,也可能是物理故障(斷電、磁盤損壞等等),作為開發人員,針對不同的業務場景,我們沒法做到服務 100% 可能,至少讓其盡量可用,八仙過海各顯神通,在宕機時如何盡量不影響業務、如何盡量快速恢復、如何保證資料和業務狀態不丟失等等,這當然有一定的固定套路,例如主從、主備,當然固定的套路不是萬能的,尤其是對于一些有狀態要求的服務,這需要不斷的磨練與自我總結,

分布式

分布式你需要掌味訓本的分布式理論和原理,常見的分布式演算法,然后是分布式系統設計的初衷和技巧,在實際并發量高的業務中,如何利用分布式解決高可用和訪問效率問題,

RPC

很多人都聽說過這個詞,在面試時也可以說出來個大概,但是當問到 RPC 技術解決的核心問題是什么就說不清楚了,當然,學習 RPC,我們還要考慮協議的設計(協議格式、序列化與反序列化、兼容性問題)、網路連接的重試與反饋、介面 stub 的設計等等,

訊息中間件

目前除了自己公司自研的訊息中間件,主流的有 Kafka、RabbitMQ、RocketMQ,如果想學習,建議選擇其中一種深入學習一下,要掌握訊息中間件的用途、選舉策略、保序策略、重試策略、高可用策略等,

快取

快取的設計是一個很大的方面,個人覺得與其說這是一種設計思想而非單純的某個快取服務,當然,老生常談的有快取雪崩、快取穿透、快取擊穿的解決思路,當然,以快取為代表的服務是 Redis,Redis 的常用資料型別、適用場景、持久化、主從復制、哨兵與集群,這些建議你掌握,如果你從來沒機會吃豬肉,那就看看豬跑吧,一些技術書籍和專案案例都有 Redis 的用途說明,

資料庫高級知識

包括 SQL 調優、資料庫調優、分表分庫、主從同步等等,

四、天下還有不會武功的百姓

融會貫通階段遠非僅僅需要掌握這么多知識,說了這么多,我能用一張圖來表達一下我的見解吧:

 

《C++ 服務器開發精髓》這本書正是一本幫你成為 C/C++ 技術堆疊的熟練工的書,當然,這本書除了詳細講解了 C++11/14/17 新標準常用的方法以外,只是以 C/C++ 為編程語言來介紹相關的后端開發技術堆疊,這不是一本講 C/C++ 語言本身的書,講 C/C++ 語言的書太多了,多如過江之鯽,

后來,2020 年年初因為一些原因,我離開了創業團隊,加入了另外一家獨角獸公司,此時這本書的全部章節已經基本寫完了,當我把他交給出版社老師的時候,我們產生了激烈的“交鋒”,最后,這版書稿一共改了 8 個版本:

時至今日,我作業中寫 C/C++ 的機會并不多,但是這是我接觸 C/C++ 開發十年來,從客戶端到服務器,從 Windows 到 Linux 的經驗總結,如果它能助你職業生涯一臂之力,那我這一千多個日夜的付出就沒有白費,

有讀者給我留言說:

認真的人無論在哪條路上走,總會碰到相似的情況,偶然看到你開源的博客,作為吃瓜群眾過來看看開發者是怎樣的人,嘆息一聲:中國人才真多,可為啥普通用戶就是找不到好軟體用呢?可能大俠們都醉心于武學去了,小俠們醉心于賺錢去了,忘記了天下還有不會武功的百姓,

一路走來,感謝所有幫助過我的人,也感謝知乎上支持我的讀者,

最后,我希望你,也祝愿你掌握 C/C++ 服務器開發這門武功,

圖書已經在京東開始有售,下單鏈接(可以拷貝到瀏覽器中打開):

https://item.jd.com/13312460.html

 

原文鏈接:《在 2021 年出版一本 C++ 圖書是一種什么體驗?》

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/288413.html

標籤:C++

上一篇:c++性能測驗工具:google benchmark進階(一)

下一篇:Leetcode No.27 Remove Element(c++實作)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more