<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          在 2021 年寫一本 C++ 圖書是一種什么體驗(yàn)?

          共 5303字,需瀏覽 11分鐘

           ·

          2021-06-13 16:49

          千呼萬喚始出來

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


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



          關(guān)于這本書,我寫了三年,故事太長(zhǎng)了,容我細(xì)細(xì)道來。

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

          后來我抱著玩兒的心態(tài)嘗試在公眾號(hào)發(fā)表文章,沒想到一下子打開了一個(gè)充滿奇幻的未知大門。在公眾號(hào)互推的過程中結(jié)識(shí)了艷鵬,彼時(shí)他已經(jīng)出版了一本口碑很好的分布式服務(wù)相關(guān)的圖書,另外一本書也在寫作中。艷鵬告訴我,和他對(duì)接的出版社編輯老師非??孔V,可以推薦給我。于是,我就接受了他的推薦,沒想到?jīng)]過多久,出版社老師就發(fā)來約稿合同,我那個(gè)時(shí)候也沒想到會(huì)這么快,就“糊里糊涂”地簽了合同。

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

          既然答應(yīng)下來,書還是要好好寫的,我寫書分為幾個(gè)階段,第一個(gè)階段是列書的大綱目錄和章節(jié),同時(shí)列舉每一節(jié)要寫的內(nèi)容;第二階段是實(shí)際的寫作階段,這個(gè)階段時(shí)間花的最長(zhǎng);第三階段是潤(rùn)色與優(yōu)化階段,我把書的內(nèi)容發(fā)給了一些相關(guān)同行和讀者,請(qǐng)他們提出一些修改建議和意見,同時(shí),補(bǔ)充了一些后來工作和學(xué)習(xí)中一些新的想法與有用的技巧。2019 年年初又應(yīng)朋友邀請(qǐng)一起創(chuàng)業(yè),是早期團(tuán)隊(duì)三個(gè)主要開發(fā)之一。工作就更忙了,加上那個(gè)時(shí)候也是單休,只能利用早早晚晚或者節(jié)假日的時(shí)間去寫作。

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

          C/C++ 技術(shù)棧一旦學(xué)成,奇妙無窮。那么,C/C++ 技術(shù)棧到底該如何學(xué)好呢?筆者雖然經(jīng)驗(yàn)有限,但仍恬以剖析之。

          按照技術(shù)掌握的深度,一般分為兩個(gè)層級(jí),第一個(gè)層級(jí)是開發(fā)熟練工,第二個(gè)階段是融匯貫通階段。


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

          開發(fā)熟練工階段

          C/C++ 這門語言與其他高級(jí)語言不同,它是離操作系統(tǒng)較近的語言。所以學(xué)好 C/C++ 體系的技術(shù)棧必須結(jié)合操作系統(tǒng)的運(yùn)行機(jī)制來學(xué)習(xí)。展開來說,就是你必須掌握操作系統(tǒng)層面的幾大基礎(chǔ)知識(shí),他們是匯編、編譯鏈接與運(yùn)行時(shí)體系、狹義的操作系統(tǒng)原理、多線程、網(wǎng)絡(luò)編程。

          第一個(gè)基礎(chǔ)知識(shí)是匯編,我們學(xué)習(xí)匯編不是一定要用匯編來寫代碼,就像我們學(xué)習(xí) C/C++ 也不一定單純?yōu)榱嗣嬖嚭驼夜ぷ鳌?/p>

          對(duì)于 C/C++ 的同學(xué)來說,匯編是建議一定要掌握的,只有這樣,你才能在書寫 C++ 代碼的時(shí)候,清楚地知道你的每一行C++代碼背后對(duì)應(yīng)著什么樣的機(jī)器指令,if/for/while 等基本程序結(jié)構(gòu)如何實(shí)現(xiàn)的,函數(shù)的返回值如何返回的,為什么整型變量的數(shù)學(xué)運(yùn)算不是原子的,最終你知道如何書寫代碼才能做到效率最高。掌握了匯編,你可以明白,在 C++ 中,一個(gè)棧對(duì)象從構(gòu)造到析構(gòu),其整個(gè)生命周期里,開發(fā)者的代碼、編譯器和操作系統(tǒng)分別做了什么。掌握了匯編,你可以理解函數(shù)調(diào)用是如何實(shí)現(xiàn)的,你可以理解函數(shù)的幾種調(diào)用方法,為什么printf這樣的函數(shù)其調(diào)用方式不能是 __stdcall,而必須是 __cdecl。掌握了匯編,你就能明白為什么一個(gè)類對(duì)象增加一個(gè)方法不會(huì)增加其實(shí)際占的內(nèi)存空間。

          第二個(gè)基礎(chǔ)知識(shí)是編譯、鏈接與運(yùn)行時(shí)體系知識(shí)。作為一個(gè)開發(fā)者,要清楚地知道我們寫的 C/C++ 程序是如何通過預(yù)處理、編譯與鏈接等步驟最終變成可執(zhí)行的二進(jìn)制文件,操作系統(tǒng)如何識(shí)別一個(gè)文件為可執(zhí)行文件,一個(gè)可執(zhí)行文件包含什么內(nèi)容,執(zhí)行時(shí)如何加載到進(jìn)程的地址空間,程序的每一個(gè)變量和數(shù)據(jù)位于進(jìn)程地址空間的什么位置,如何引用到。一個(gè)進(jìn)程的地址空間有些什么內(nèi)容,各段地址分布著什么內(nèi)容,為什么讀寫空指針或者野指針會(huì)有內(nèi)存問題。一個(gè)進(jìn)程如何裝在各個(gè) so 或 dll 文件的,這些文件被加載到進(jìn)程地址空間的什么位置,如何被執(zhí)行,數(shù)據(jù)如何被交換。

          第三個(gè)基礎(chǔ)知識(shí)是狹義的操作系統(tǒng)原理。這里加上“狹義”二字是因?yàn)閺膹V義上來講,以上所說的內(nèi)容都是操作系統(tǒng)原理的范疇。狹義的操作系統(tǒng)原理這里包括操作系統(tǒng)如何管理進(jìn)程與線程,虛擬內(nèi)存與物理內(nèi)存之間的對(duì)應(yīng)關(guān)系,何為內(nèi)存映射文件,進(jìn)程之間如何通信等等。

          第四個(gè)基礎(chǔ)知識(shí)是多線程知識(shí)。嚴(yán)格來說,這點(diǎn)已經(jīng)包括在第三點(diǎn)之中了,我之所以將其單獨(dú)列出來,是因?yàn)槎嗑€程編程是我們做應(yīng)用服務(wù)最常用的技術(shù)之一。最近面試過幾個(gè)學(xué)歷非常好的同學(xué),對(duì)于一個(gè)進(jìn)程中如果某個(gè)線程因?yàn)閮?nèi)存問題而退出,是否會(huì)導(dǎo)致整個(gè)進(jìn)程退出的問題答不好,實(shí)在不應(yīng)該。多線程知識(shí)其實(shí)不難學(xué),立足于理解與實(shí)踐而不是應(yīng)付面試,可以學(xué)的很好。無論是 Windows 還是 Linux 操作系統(tǒng),操作系統(tǒng)提供的線程同步對(duì)象就那么幾種,Windows 常用的有臨界區(qū)(關(guān)鍵端)、Event、互斥體、信號(hào)量等,Linux 有互斥體、信號(hào)量、讀寫鎖、條件變量,這些知識(shí)點(diǎn)學(xué)過則會(huì),不學(xué)則不會(huì)。這些線程同步原語花上幾天就能搞得清楚,大多數(shù)同學(xué)不是學(xué)不會(huì),而不是愿意學(xué),但是偏偏喜歡在簡(jiǎn)歷上寫上自己熟悉多線程編程。面試的時(shí)候,被問到條件變量的虛假喚醒機(jī)制都說不清楚,非要說自己用過條件變量。這是一些同學(xué)犯的很低級(jí)的錯(cuò)誤,如果真用過條件變量,如果不知道虛假喚醒機(jī)制,那一定寫的代碼是不對(duì)的。市場(chǎng)上目前沒有任何一本圖書對(duì)以上知識(shí)形成體系的介紹,當(dāng)然,我的本書填補(bǔ)了這一空缺,你將從本書中獲得從進(jìn)程與線程的關(guān)系,再到常用的線程同步原語的區(qū)別與使用場(chǎng)景,再到線程池以及基于生產(chǎn)者消費(fèi)者模型的消息隊(duì)列,以及對(duì)協(xié)程思想介紹的相關(guān)知識(shí)。

          掌握了常見的多線程同步原語之后,接下來可以找一些帶多線程的項(xiàng)目去學(xué)習(xí)一下,不管是否帶 UI 的都行。我推薦的一種方式是,使用 gdb 或者 Visual Studio 調(diào)試器將你需要學(xué)習(xí)的多線程程序中斷下來,在多線程面板,看看這個(gè)進(jìn)程一共有多少個(gè)正在運(yùn)行的線程,分析每個(gè)線程的作用,然后研究下這些線程在何時(shí)何地創(chuàng)建的,為什么需要?jiǎng)?chuàng)建新的線程。嘗試愛過幾個(gè)人,面對(duì)愛情你會(huì)誠(chéng)實(shí)很多;嘗試研究幾個(gè)多線程項(xiàng)目,面對(duì)多線程你會(huì)熟練許多。

          第五個(gè)是網(wǎng)絡(luò)編程,直白地說就是 Socket 編程。操作系統(tǒng)層面提供的 API 會(huì)在相當(dāng)長(zhǎng)的時(shí)間內(nèi)保持接口不變,一旦學(xué)成,終生受用。理解和掌握常用的基礎(chǔ) socket API 不僅可以最大化地去定制各種網(wǎng)絡(luò)通信框架,更不用說使用市面上流行的網(wǎng)絡(luò)通信庫了,最重要的是,它會(huì)是你排查各種網(wǎng)絡(luò)疑難雜癥堅(jiān)實(shí)的技術(shù)保障。操作系統(tǒng)層面提供的網(wǎng)絡(luò)模型就那么幾種,無論像 Java/Go/Python 等語言如何封裝,作為技術(shù)的源頭,我們有什么理由不去掌握它呢?市面上關(guān)于網(wǎng)絡(luò)編程的書很多,我在書中結(jié)合我這些年的工作經(jīng)驗(yàn)總結(jié)了二十幾個(gè)網(wǎng)絡(luò)編程中的重點(diǎn)和難點(diǎn),現(xiàn)在全部交給你。

          以上是基于 C++ 技術(shù)棧來說,并沒有包括算法與數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)庫等方面的基本功,但是這些額外的也是應(yīng)該需要掌握的。掌握了如上所說的,你就達(dá)到了一個(gè)熟練工階段。

          融匯貫通階段

          掌握了這些基礎(chǔ)知識(shí),接下來,技術(shù)更進(jìn)一步,就無關(guān)具體的編程語言了,互聯(lián)網(wǎng)方向的高級(jí)技術(shù)有如下:

          高可用與容災(zāi)容錯(cuò)

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

          分布式

          分布式你需要掌握基本的分布式理論和原理,常見的分布式算法,然后是分布式系統(tǒng)設(shè)計(jì)的初衷和技巧,在實(shí)際并發(fā)量高的業(yè)務(wù)中,如何利用分布式解決高可用和訪問效率問題。

          RPC

          很多人都聽說過這個(gè)詞,在面試時(shí)也可以說出來個(gè)大概,但是當(dāng)問到 RPC 技術(shù)解決的核心問題是什么就說不清楚了。當(dāng)然,學(xué)習(xí) RPC,我們還要考慮協(xié)議的設(shè)計(jì)(協(xié)議格式、序列化與反序列化、兼容性問題)、網(wǎng)絡(luò)連接的重試與反饋、接口 stub 的設(shè)計(jì)等等。

          消息中間件

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

          緩存

          緩存的設(shè)計(jì)是一個(gè)很大的方面,個(gè)人覺得與其說這是一種設(shè)計(jì)思想而非單純的某個(gè)緩存服務(wù)。當(dāng)然,老生常談的有緩存雪崩、緩存穿透、緩存擊穿的解決思路。當(dāng)然,以緩存為代表的服務(wù)是 Redis,Redis 的常用數(shù)據(jù)類型、適用場(chǎng)景、持久化、主從復(fù)制、哨兵與集群,這些建議你掌握,如果你從來沒機(jī)會(huì)吃豬肉,那就看看豬跑吧,一些技術(shù)書籍和項(xiàng)目案例都有 Redis 的用途說明。

          數(shù)據(jù)庫高級(jí)知識(shí)

          包括 SQL 調(diào)優(yōu)、數(shù)據(jù)庫調(diào)優(yōu)、分表分庫、主從同步等等。

          天下還有不會(huì)武功的百姓

          融會(huì)貫通階段遠(yuǎn)非僅僅需要掌握這么多知識(shí)。說了這么多,我能用一張圖來表達(dá)一下我的見解吧:



          C++ 服務(wù)器開發(fā)精髓》這本書正是一本幫你成為 C/C++ 技術(shù)棧的熟練工的書。當(dāng)然,這本書除了詳細(xì)講解了 C++11/14/17 新標(biāo)準(zhǔn)常用的方法以外,只是以 C/C++ 為編程語言來介紹相關(guān)的后端開發(fā)技術(shù)棧,這不是一本講 C/C++ 語言本身的書,講 C/C++ 語言的書太多了,多如過江之鯽。

          后來,2020 年年初因?yàn)橐恍┰?,我離開了創(chuàng)業(yè)團(tuán)隊(duì),加入了另外一家獨(dú)角獸公司。此時(shí)這本書的全部章節(jié)已經(jīng)基本寫完了,當(dāng)我把他交給出版社老師的時(shí)候,我們產(chǎn)生了激烈的“交鋒”,最后,這版書稿一共改了 8 個(gè)版本:


          我總以為那是 Final 版本,但 Final 版本在改了八次、歷時(shí)一年多,才最終定型,有的時(shí)候,我覺得出版社老師的要求有點(diǎn)“非難”,好在我們最終熬過來了,如今它呈現(xiàn)在你的面前。 全書初稿有大概一百七十萬字,如果這樣出版,實(shí)在太厚了,在拒絕了編輯老師說分為上下兩冊(cè)發(fā)行的建議后,最終當(dāng)你看到的時(shí)候,它被濃縮成一百萬字,它的厚度仍然比肩《高性能 MySQL》,然而頁面比這本書更大。

          時(shí)至今日,我工作中寫 C/C++ 的機(jī)會(huì)并不多,但是這是我接觸 C/C++ 開發(fā)十年來,從客戶端到服務(wù)器,從 Windows 到 Linux 的經(jīng)驗(yàn)總結(jié),如果它能助你職業(yè)生涯一臂之力,那我這一千多個(gè)日夜的付出就沒有白費(fèi)。

          有讀者給我留言說:

          認(rèn)真的人無論在哪條路上走,總會(huì)碰到相似的情況。偶然看到你開源的博客,作為吃瓜群眾過來看看開發(fā)者是怎樣的人。嘆息一聲:中國(guó)人才真多??蔀樯镀胀ㄓ脩艟褪钦也坏胶密浖媚兀靠赡艽髠b們都醉心于武學(xué)去了,小俠們醉心于賺錢去了,忘記了天下還有不會(huì)武功的百姓。

          一路走來,感謝出版社張老師的支持與不拋棄不放棄,感謝媳婦的支持與鼓勵(lì),感謝王旭東等同學(xué)為本書的勘誤與校稿提供的幫助,感謝高性能服務(wù)器開發(fā)群的所有群友,感謝高性能服務(wù)器開發(fā)的所有讀者。

          最后,我希望你,也祝愿你掌握 C/C++ 服務(wù)器開發(fā)這門武功。


          圖書已經(jīng)在京東開始預(yù)售,預(yù)售鏈接(拷貝到瀏覽器中打開):

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


          另外,我為大家準(zhǔn)備了 300 本簽名版(數(shù)量有限),獲取鏈接(拷貝到瀏覽器中打開):

          https://detail.tmall.com/item.htm?spm=a211lz.success.0.0.44f22b900z3yQ7&id=647304182538


          點(diǎn)擊“閱讀原文”也可以直達(dá)購買鏈接。

          瀏覽 24
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲黄色精品 | 人人妻人人爱 | 天天日天天干天天舔天天射 | 18xxxxxxxxx日本超碰 | 影音先锋自拍视频 |