<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>

          萬字長文 | 這可能是東半球最保姆級的后臺服務(wù)器開發(fā)學(xué)習(xí)路線

          共 13822字,需瀏覽 28分鐘

           ·

          2020-10-14 14:34

          前言

          這一篇的主題是「Linux C/C++ 服務(wù)器/后臺開發(fā)學(xué)習(xí)路線」。

          這樣的文章相信大家都見得不少了,寫之前也非常忐忑,能不能和其它人寫得不一樣, 也定下了一個目標(biāo),這篇文章,不能是簡單的堆砌學(xué)習(xí)資源和書單推薦,更要細(xì)化如何有效的去執(zhí)行落地。

          爭取做到讓看到的同學(xué)有一種相見恨晚的感覺哈哈哈。

          所以大家可以試著看一下,幫我檢查下有沒有達(dá)到預(yù)想的效果哈哈,希望不要被打臉?

          那就正式開始吧。

          這篇文章會有點(diǎn)長有點(diǎn)干,可以先去沖杯咖啡,慢慢看~

          正文 | 干貨 |收藏

          一、后端/后臺/服務(wù)器開發(fā)?

          經(jīng)常在各大公司招聘上看到后端、后臺、服務(wù)器開發(fā)等等,有些同學(xué)經(jīng)常被這些名詞搞混。

          其實(shí)這些名詞都是相近的,但是也有點(diǎn)區(qū)別,這里說說我的理解:

          • 首先一般公司分為前端和后端,前端就是和用戶打交道的,負(fù)責(zé)用良好的視覺效果將數(shù)據(jù)呈現(xiàn)給用戶,廣義的前端包括客戶端(安卓、IOS)、Web前端、小程序等。

          • 而與之對應(yīng)的后端則是負(fù)責(zé)業(yè)務(wù)邏輯處理,比如下單、支付等,重在業(yè)務(wù)流程的處理。

          后臺一般和后端是一個意思,而服務(wù)器開發(fā)則稍微廣義一點(diǎn),不僅包含了后臺開發(fā),而且也包括支撐整個后臺應(yīng)用的基礎(chǔ)開發(fā),比如搜索引擎、微服務(wù)、RPC 框架、KV、存儲、MQ 等。

          后臺/后端重在業(yè)務(wù)處理,是偏向應(yīng)用層開發(fā),而服務(wù)器開發(fā)不僅包括應(yīng)用層開發(fā),更是囊括了整個支撐后臺業(yè)務(wù)的相關(guān)組件的開發(fā)。

          那 Linux C/C++ 服務(wù)器/后臺開發(fā)指的什么呢,其實(shí)就是基于 Linux 上 的 C++ 編程。

          但是相比 Java 系更強(qiáng)調(diào) Linux 系統(tǒng)編程、網(wǎng)絡(luò)編程能力,有的還會涉及到服務(wù)端底層協(xié)議和網(wǎng)絡(luò)框架開發(fā)。

          傳統(tǒng)的 Java 、Go后臺開發(fā)偏向 Web 開發(fā),也就是接收前端請求,通過微服務(wù)互相調(diào)用,完成業(yè)務(wù)邏輯處理,然后返回給前端。

          實(shí)際上在騰訊這邊的 C++ 后臺開發(fā),也是類似的,本身有非常成熟的基于 C++ 的微服務(wù)體系,大多數(shù)開發(fā)也只需要關(guān)注業(yè)務(wù)邏輯就好,不過還是會要求 Linux 系統(tǒng)編程、網(wǎng)絡(luò)編程等能力。

          二、后臺開發(fā)都考察哪些?

          一般來說 Linux C/C++ 后臺開發(fā)方向涉及以下這些基礎(chǔ)知識:

          • C/C++ 語言特性和實(shí)現(xiàn)原理
          • 計算機(jī)網(wǎng)絡(luò)
          • 網(wǎng)絡(luò)編程 和 Linux 系統(tǒng)編程
          • 操作系統(tǒng)原理
          • 部分 Linux 內(nèi)核原理,如內(nèi)存管理、文件系統(tǒng)、虛擬內(nèi)存等
          • Linux 常見命令使用
          • 算法與數(shù)據(jù)結(jié)構(gòu)
          • 數(shù)據(jù)庫使用及原理
          • 常見 NoSQL組件,如 Redis、Memcached
          • 版本控制 Git

          非必選加分項(xiàng):

          • 分布式相關(guān),如一致性協(xié)議比如 Raft 算法、分布式存儲等
          • docker、k8s 等虛擬化和云計算相關(guān)的
          • 系統(tǒng)設(shè)計能力,如短鏈服務(wù)、評論服務(wù)、Feed流系統(tǒng)、搶紅包、秒殺等

          由于篇幅限制,這篇文章主要介紹基礎(chǔ)知識的學(xué)習(xí)路線和方法,其它加分項(xiàng)以后再單獨(dú)寫。

          三、C/C++

          首先是語言的基礎(chǔ)知識,一些關(guān)鍵字和實(shí)現(xiàn)原理等:

          • 指針、引用、數(shù)組、內(nèi)存
          • 引用與指針區(qū)別
          • C 和 C++ 的一些區(qū)別,比如 new、delete 和 malloc、free 的區(qū)別
          • 虛機(jī)制:虛函數(shù)、虛函數(shù)表、純虛函數(shù)
          • 繼承、虛繼承、菱形繼承等
          • 多態(tài):動態(tài)綁定,靜態(tài)多態(tài)
          • 重寫、重載
          • 智能指針原理:引用計數(shù)、RAII(資源獲取即初始化)思想
          • 智能指針使用:shared_ptr、weak_ptr、unique_ptr等
          • 一些關(guān)鍵字的作用:static、const、volatile、extern
          • 四種類型轉(zhuǎn)換:static_cast, dynamic_cast, const_cast, reinterpret_cast
          • STL部分容器的實(shí)現(xiàn)原理,如 vector、deque、map、hashmap
          • 模板特化、偏特化,萃取 traits 技巧
          • 編譯鏈接機(jī)制、內(nèi)存布局(memory layout)、對象模型
          • C++11 部分新特性,比如右值引用、完美轉(zhuǎn)發(fā)等

          這里列出來的只是一些比較重要的部分,實(shí)際上可能只算 C++ 的冰山一角, 大家且學(xué)且珍惜吧,這不 C++11 還沒整透徹,C++ 20 又出來了,生命不息,學(xué)習(xí)不止。

          怎么學(xué)?

          1. 《C++ Primer》

          這本書基本包括了 C++ 11 的全部特性,最好把前面三部分:C++基礎(chǔ)、C++標(biāo)準(zhǔn)庫、類設(shè)計者的工具都看一遍,我當(dāng)時花了一個多月斷斷續(xù)續(xù)看到了第16章模板那里。

          2. Effective 系列:《Effective C++》、《More Effective C++》、《Effective STL》

          第一本是重點(diǎn),光看《C++ Primer》缺少實(shí)踐的話,大概率還寫不出合格的 C++ 代碼,而《Effective C++》就是通過 55 條非常具體的做法告訴你什么樣才是符合 C++ 編碼規(guī)范的,可以縮短你寫出合格 C++ 代碼的時間,減少踩坑,強(qiáng)烈推薦必讀,后面兩本優(yōu)先級稍低,可以有時間再讀。

          3. 《STL 源碼剖析》和《深度探索 C++ 對象模型》

          看完 Primer 和 Effective,你應(yīng)該已經(jīng)能夠比較熟練的使用C++了,但是還缺少對 C++ 底層實(shí)現(xiàn)機(jī)制的認(rèn)識。比如虛函數(shù)表、成員變量布局等,同時對于 STL 庫可能也僅僅停留在使用上。

          推薦的這兩本可以分別完善你在 C++ 底層實(shí)現(xiàn)和 STL 源碼、原理上的認(rèn)識。

          以上書籍同時建議和侯捷老師的視頻配合服用,效果更佳。

          直接在 B 站搜索「候捷 C++」即可,主要有以下幾個系列:

          • 《C++內(nèi)存管理》
          • 《STL源碼分析》
          • 《C++ STL與泛型編程高級》
          • 《C++11 新特性》

          我基本都看了,收獲挺大的,建議看下,可以開倍速。

          看完以上資料,算是 C++ 入門了,應(yīng)付面試也是足夠的,基本到達(dá)了正確高效地使用 C++ 這一層面。

          是不是聽到這有點(diǎn)崩潰,特么的看了這么多,才入門???

          如果你想在 C++ 語言上更進(jìn)一步,那么有以下的書籍推薦:

          • 《C++ 語言的設(shè)計與演化》

          這本書是 C++ 之父 Bjarne Stroustrup 寫的,關(guān)于 C++ 的前世今生,以及未來的演進(jìn)方向,可以了解 C++ 的設(shè)計哲學(xué)。C++ 復(fù)雜的語言特性一直讓人詬病,通過這本書,可以看到各種特性引入的目的,也更深入了解到了 C 和 C++ 之間關(guān)系。比如 C++ 里有個原則就是所有的實(shí)現(xiàn)機(jī)制都不能帶來額外的運(yùn)行時開銷。

          我也正在看這本書。

          • 《C++ 沉思錄》

          • 《C++ Templates》和《C++模版元編程》

          C++模板元編程屬于另外一個世界了,一般公司里開發(fā)用得比較少,這個也是一個大坑,如果實(shí)在感興趣可以去看看,感受下 C++ 的博大精深,不過這玩意我也不太會,也不推薦你去花時間在上面。

          • CppCon視頻

          這是 C++ 社區(qū)組織的類似開源峰會那種,每次都會討論一些關(guān)于 C++ 的話題,沒事去刷一個,還是挺有意思的。Youtube 直接搜 CppCon 即可找到。

          四、操作系統(tǒng)

          操作系統(tǒng)這門課,我的感覺是易學(xué)難精,但是掌握到日常編程和面試夠用還是比較容易的。

          那么畢業(yè)生或者說你去準(zhǔn)備校招面試應(yīng)該達(dá)到怎樣的水平:

          • OS 四大模塊的理論知識: 進(jìn)程與線程管理、內(nèi)存管理、IO與文件系統(tǒng)、設(shè)備管理
          • 了解 Linux 內(nèi)核部分實(shí)現(xiàn)原理,如內(nèi)存管理、進(jìn)程管理、虛擬文件系統(tǒng)等

          其中內(nèi)存、進(jìn)程、IO 是重點(diǎn),這幾塊也是和編程關(guān)系最密切的,這里推薦先挑本偏理論的書看看,了解操作系統(tǒng)的全貌:

          • 《現(xiàn)代操作系統(tǒng)》
          • 《操作系統(tǒng)—精髓與設(shè)計原理》

          不必全看,兩者任選一本都不錯,我自己是仔細(xì)看了第二本,因?yàn)槭俏覀兘滩模瑫r挑著看了現(xiàn)代操作系統(tǒng)部分章節(jié)。

          這部分看完你應(yīng)該對下面這些話題有一個清晰認(rèn)知了:

          • 操作系統(tǒng)由哪些構(gòu)成
          • 進(jìn)程的狀態(tài)、切換、調(diào)度
          • 進(jìn)程間通信方式(共享內(nèi)存、管道、消息)
          • 進(jìn)程和線程的區(qū)別
          • 線程的實(shí)現(xiàn)方式(一對一、多對一等)
          • 互斥與同步(信號量、管程、鎖)
          • 死鎖檢測與避免
          • 并發(fā)經(jīng)典的問題:讀者寫者、哲學(xué)家就餐問題
          • 為什么需要虛擬內(nèi)存,MMU 具體如何做地址轉(zhuǎn)換的
          • 內(nèi)存為什么分段、分頁
          • 頁面置換算法
          • 文件系統(tǒng)是如何組織的
          • 虛擬文件系統(tǒng)(VFS)是如何抽象的
          • ...

          但是這還不夠,看完偏理論的書,當(dāng)面試官問「進(jìn)程和線程的區(qū)別」時。

          大概只能回答出「進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位,balabala...」這樣正確卻普通的答案。

          但是如果你了解 Linux 內(nèi)核的實(shí)現(xiàn),就可以實(shí)際出發(fā),講講 Linux 中進(jìn)程和線程是如何創(chuàng)建的,區(qū)別在哪里。

          比如在 Linux 中進(jìn)程和線程實(shí)際上都是用一個結(jié)構(gòu)體 task_struct來表示一個執(zhí)行任務(wù)的實(shí)體。進(jìn)程創(chuàng)建調(diào)用fork 系統(tǒng)調(diào)用,而線程創(chuàng)建則是 pthread_create 方法,但是這兩個方法最終都會調(diào)用到 do_fork 來做具體的創(chuàng)建操作 ,區(qū)別就在于傳入的參數(shù)不同。

          深究下去,你會發(fā)現(xiàn) Linux 實(shí)現(xiàn)線程的方式簡直太巧妙了,實(shí)際上根本沒有線程,它創(chuàng)建的就是進(jìn)程,只不過通過參數(shù)指定多個進(jìn)程之間共享某些資源(如虛擬內(nèi)存、頁表、文件描述符等),函數(shù)調(diào)用棧、寄存器等線程私有數(shù)據(jù)則獨(dú)立。

          這樣是不是非常符合理論書上的定義:同一進(jìn)程內(nèi)的多個線程共享該進(jìn)程的資源,但線程并不擁有資源,只是使用他們。

          這也算符合 Unix 的哲學(xué)了— KISS(Keep It Simple, Stupid)。

          但是在其它提供了專門線程支持的系統(tǒng)中,則會在進(jìn)程控制塊(PCB)中增加一個包含指向該進(jìn)程所有線程的指針,然后再每個線程中再去包含自己獨(dú)占的資源。

          這算是非常正統(tǒng)的實(shí)現(xiàn)方式了,比如 Windows 就是這樣干的。

          但是相比之下 Linux 就顯得取巧很多,也很簡潔。

          對于進(jìn)程、線程這塊你還可以把 fork、vfork、clone 、pthread_create 這些模塊關(guān)系徹底搞清楚,對你理解 Linux 下的進(jìn)程實(shí)現(xiàn)有非常大的幫助。

          說了這么多,就是想強(qiáng)調(diào)一下理論聯(lián)系實(shí)際的重要性。

          特別是操作系統(tǒng),最好的實(shí)踐就是看下 Linux 內(nèi)核是怎么實(shí)現(xiàn)的,當(dāng)然不是叫你直接去啃 Linux 源碼,那不是一般人能掌握的。

          最好的方式是看書,書的脈絡(luò)給你理得很清晰。

          書籍推薦:

          • 《Linux內(nèi)核設(shè)計與實(shí)現(xiàn)》

          這本書恰到好處,即講清楚了內(nèi)核實(shí)現(xiàn)的要點(diǎn),又不會通篇源碼。

          這本書重點(diǎn)關(guān)注「第 3 章進(jìn)程管理」、「第 5 章系統(tǒng)調(diào)用」、「第12章內(nèi)存管理」、「第13章虛擬文件系統(tǒng)」、「第 15 章進(jìn)程地址空間」

          這些章節(jié)屬于操作系統(tǒng)核心部分,其它如中斷處理、塊 IO、設(shè)備管理根據(jù)你自己興趣選擇看下就可以了。

          基本上做到這里,操作系統(tǒng)就沒什么大問題了。

          五、計算機(jī)網(wǎng)絡(luò)

          需要掌握的網(wǎng)絡(luò)協(xié)議和知識:

          • HTTP、TCP、IP、ICMP、UDP、DNS、ARP
          • IP地址、MAC地址、OSI七層模型(或者 TCP/IP 五層模型)
          • HTTPS安全相關(guān)的:數(shù)字簽名、數(shù)字證書、TLS
          • 常見網(wǎng)絡(luò)攻擊:局域網(wǎng)ARP泛洪、DDoS、TCP SYN Flood、XSS等

          計網(wǎng)知識比較繁雜,很多同學(xué)都反映網(wǎng)絡(luò)很難學(xué),一大堆的網(wǎng)絡(luò)協(xié)議,依次學(xué)完后,還是不知道網(wǎng)絡(luò)是怎么構(gòu)成的。

          這就是沒有用對學(xué)習(xí)方法,導(dǎo)致只見樹木,不見森林。

          學(xué)習(xí)時,推薦你抓住一條主線 「一個數(shù)據(jù)包是如何發(fā)送出去的?」

          帶著這個問題依次去學(xué)應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、鏈路層,思考這些層之間是如何串聯(lián)起來的。

          這就是自頂向下的思路,那自然要推薦:

          • 《計算機(jī)網(wǎng)絡(luò):自頂向下方法》

          這本書從我們最常接觸的 HTTP、FTP、SMTP 等應(yīng)用層協(xié)議講起,可以清晰看到引入各個層的作用。

          比如為了區(qū)分同一個主機(jī)的不用應(yīng)用,引入了傳輸層,并使用不用的端口號作為區(qū)別;

          為了在不同子網(wǎng)間傳輸數(shù)據(jù)引入了網(wǎng)絡(luò)層,并使用 IP 地址尋址路由;

          網(wǎng)絡(luò)層解決了不同子網(wǎng)間路由的問題,但是同一個局域網(wǎng)內(nèi)確定主機(jī)卻是通過 MAC 地址,所以引入了鏈路層來承載 IP 數(shù)據(jù)包;

          同時為了將 IP 地址和 MAC 地址做轉(zhuǎn)換映射又產(chǎn)生了 ARP 協(xié)議。

          層層遞進(jìn),逐層揭開網(wǎng)絡(luò),非常推薦!

          還有一本書:

          • 《網(wǎng)絡(luò)是怎樣連接的》

          非常淺顯易懂的描述了「一個數(shù)據(jù)包是如何發(fā)送出去的」,也不費(fèi)時間,看慣了機(jī)工社的大黑書,看這種反而有種看小人書的感覺,有基礎(chǔ)的話,一天左右就過完了。

          只有把握住了整個網(wǎng)絡(luò)脈絡(luò)主線才不至于被紛繁復(fù)雜的網(wǎng)絡(luò)協(xié)議所搞暈,剩下的就是不斷的細(xì)化,填充這些主干上的細(xì)枝末節(jié)。

          那么有哪些細(xì)節(jié)可以去填充呢?

          比如 ARP 工作過程、IP 地址、IP 分片、NAT(UDP 打洞)、鏈路層訪問控制協(xié)議等等。

          還有最重要的 TCP 協(xié)議,TCP 也是面試和計網(wǎng)中最重要的概念:

          • 三次握手、四次揮手
          • 狀態(tài)轉(zhuǎn)換
          • TCP 狀態(tài)中 TIME_WAIT
          • 擁塞控制
          • 快速重傳、慢啟動等

          這么多東西肯定需要背,但不要死記,最好帶著問題去思考為什么要這樣做。

          這里列幾個問題:

          • TCP 如何實(shí)現(xiàn)可靠傳輸?shù)模ó嬐庖簦喝绾位?UDP 實(shí)現(xiàn)可靠傳輸

          • TCP 連接建立為什么不是兩次握手(畫外音:三次握手的充分必要性說明

          • TIME_WAIT 的存在解決了什么問題,等待時間為什么是 2 MSL

          整個 TCP 的核心就是圍繞著 可靠傳輸 + 高效傳輸(流量控制和窗口管理)

          由于 TCP 的細(xì)節(jié)實(shí)在太多,自頂向下那本書有點(diǎn)不太夠,所以你需要去看看:

          • 《TCP/IP詳解卷1:協(xié)議》

          這本書不要從頭看,而是挑出其中涉及到 TCP 的章節(jié)

          到這里,對于整個網(wǎng)絡(luò)以及 TCP 都應(yīng)該有了一個全面而細(xì)致的認(rèn)識。

          但是計網(wǎng)中還是有一些有意思的問題,如果你沒思考過,也許回答不出來。

          比如:

          • 為什么有了 MAC 地址還要 IP 地址,IP 地址和 MAC 地址的區(qū)別是什么?
          • 如何理解廣播域和沖突域?
          • 路由器和交換機(jī)有什么區(qū)別?
          • TCP 連接的本質(zhì)是什么,真的是“鏈接”嗎?(曾經(jīng)被問過:Java socket 創(chuàng)建的 TCP 連接,對于主機(jī)掛了和 JVM 掛了有什么區(qū)別?

          這些問題只有當(dāng)你真正理解了才能回答出,僅僅記住協(xié)議的話,估計很難應(yīng)對靈活的面試題。

          此外,網(wǎng)絡(luò)部分還需要準(zhǔn)備 HTTP、HTTPS,推薦:

          • 《圖解HTTP》

          最后別忘了自己回答一遍那被問爛了、寫爛了的問題:

          • 從 URL 輸入到頁面展現(xiàn)到底發(fā)生什么

          越細(xì)越好,五百字以上吧,哈哈哈

          六、網(wǎng)絡(luò)編程

          C++ 后臺開發(fā)基本是離不開網(wǎng)絡(luò)編程的,其實(shí)甚至整個后臺開發(fā)也可以看做是在做網(wǎng)絡(luò)編程。

          只不過別人的框架幫我們做了協(xié)議解析、網(wǎng)絡(luò)數(shù)據(jù)傳輸、解封包這些底層操作。

          比如 SpringBoot 這種保姆級框架,基本上屬于將一個框架能干的事都干完了,以至于我們開發(fā)業(yè)務(wù)只需要定義接收和返回包的數(shù)據(jù)格式,然后做邏輯處理就完了。

          像序列化、解封包、IO 處理這種網(wǎng)絡(luò)編程必備的臟活業(yè)務(wù)開發(fā)根本不會接觸到。

          但是網(wǎng)絡(luò)編程技能還是很重要的,特別是對于 Linux C++ 開發(fā)來說。

          Linux 下網(wǎng)絡(luò)編程核心的包括系統(tǒng)編程和網(wǎng)絡(luò) IO 兩個部分:

          • 進(jìn)程間通信方式:信號量、管道、共享內(nèi)存、socket 等
          • 多線程編程:互斥鎖、條件變量、讀寫鎖、線程池等
          • 五大 IO 模型:同步、異步、阻塞、非阻塞、信號驅(qū)動
          • 高性能 IO 兩種模式:Reactor 和 Proactor( 但是 Linux 下由于缺少異步 IO 支持,基本沒有 Proactor
          • IO 復(fù)用機(jī)制:epoll、select、poll(破解 C10K 問題的利器)

          推薦的書:

          • 《Unix網(wǎng)絡(luò)編程》
          • 《Unix環(huán)境高級編程》

          這兩本是磚頭書,雖然是網(wǎng)絡(luò)編程和 Unix 系統(tǒng)編程方面的無出其右的圣經(jīng),但主要用途還是墊顯示器(逃, 個人覺得這種書不是面向讀者的,具體原因和如何閱讀這種書在后文介紹。

          • 《Linux高性能服務(wù)器編程》

          我強(qiáng)烈推薦,這本書前半部分基本是在重復(fù)計網(wǎng)基礎(chǔ)知識,但是后面幾章關(guān)于高性能服務(wù)器程序框架、高性能IO、IO復(fù)用、定時器、多線程編程、線程池和進(jìn)程池還是講得非常全面到位的,值得一看,看完基本上對于整個網(wǎng)絡(luò)編程就有了框架。

          • 《Linux多線程服務(wù)器端編程》

          這本書同樣強(qiáng)烈推薦,這是陳碩大佬寫的書,說實(shí)話第一部分:C++ 多線程系統(tǒng)編程都直接把我看蒙了,沒有想到 C++ 里要做到線程安全這么難,第一章我看了兩三遍才看懂吧。。。這是難得的講解 C++ 多線程編程的書。

          并且在書中,陳碩大佬用了一章講解了 Muduo 網(wǎng)絡(luò)庫設(shè)計與實(shí)現(xiàn),Muduo 比較適合學(xué)完基礎(chǔ)的網(wǎng)絡(luò)編程后繼續(xù)進(jìn)階學(xué)習(xí)如何設(shè)計和寫一個網(wǎng)絡(luò)庫,是一個高質(zhì)量的 Reactor 網(wǎng)絡(luò)庫,采用 one loop per thread + thread pool 實(shí)現(xiàn),代碼比較簡潔,書和源碼搭配著看作為學(xué)習(xí)網(wǎng)絡(luò)編程方面來說是非常不錯。

          學(xué)完網(wǎng)絡(luò)編程就可以寫點(diǎn)小項(xiàng)目練手了,這里列舉幾個項(xiàng)目:

          • HTTP 服務(wù)器,這個似乎成了 Linux C/C++ 人手一個的項(xiàng)目了?

            這里推薦兩個做為參考:

            https://github.com/imarvinle/WebServer:這是我看完高性能服務(wù)器編程后寫的

            https://github.com/linyacool/WebServer :這是牛客 linya 大佬寫的

            不過 HTTP 服務(wù)器看著挺簡單的,但是可以擴(kuò)展寫的地方還是挺多的,比如可以加入代理功能,這部分我在留學(xué)生 lab 中寫過,但是沒有集成到這個里面來,可以加入日志庫,可以添加 CGI 支持等等。

          • 網(wǎng)絡(luò)庫

            這個也算是造輪子了, 可以就采用 one loop per thread + thread pool 這種模式,先去看懂 Muduo 源碼,然后自己再寫一個類似的,這個過程就算是抄,你也可以學(xué)到不少東西的,學(xué)編程不就是這樣先看,再模仿、修改,然后創(chuàng)新嗎?

          • RPC

            寫一個 PRC 你需要考慮到序列化、網(wǎng)絡(luò)傳輸、服務(wù)發(fā)現(xiàn)等,比較有名的有 grpc、brpc,這兩個網(wǎng)上文檔都比較完善,可以學(xué)習(xí)一下實(shí)現(xiàn)原理。

            這里還有一個簡單版本的:https://github.com/guangqianpeng/jrpc

          • 類似QQ的網(wǎng)絡(luò)聊天室

            簡單版的就可以直接在局域網(wǎng)內(nèi)實(shí)現(xiàn)群聊、單聊等。

            更進(jìn)一步可以考慮一下如何不通過服務(wù)器中轉(zhuǎn)消息實(shí)現(xiàn) P2P 聊天,類似 QQ,這里會涉及到 UDP 打洞、NAT 轉(zhuǎn)換等知識,還是很有意思的,我大二用 Java 搞過。

          七、系統(tǒng)級編程

          作為 C/C++ 程序員,編寫的程序不像 Java、Python 這些是在虛擬機(jī)上,直接就是在操作系統(tǒng)上運(yùn)行,那么就必須了解操作系統(tǒng)底層機(jī)制和運(yùn)行原理。

          就和 Java 程序員要求了解 JVM 是一個道理,你得熟悉代碼運(yùn)行的平臺,才能在出問題的時候準(zhǔn)確定位到。

          這個也是在我們學(xué)校在大三開設(shè)的一門課程《System Programing》,從 CMU 引進(jìn)的,教材也是沿用 CSAPP,這也是我覺得大學(xué)上過最值的課了。

          我重新認(rèn)真讀 CSAPP 就是在大三上這個課期間,包括做了每個章節(jié)附帶的 lab, 這是我當(dāng)時做 Bomblab 的題解:

          https://www.jianshu.com/p/479333cbccc4

          這里推薦兩本書:

          • 《深入理解計算機(jī)系統(tǒng)》

          不需要我多介紹了

          • 《程序員自我修養(yǎng)》

          別被名字欺騙了,這不是教你養(yǎng)生的,而是學(xué)了會掉頭發(fā)的硬核知識

          兩本書側(cè)重點(diǎn)各不相同,CSAPP 非常巧妙的把數(shù)字電路基礎(chǔ)、二進(jìn)制與指令集體系、匯編語言、程序設(shè)計及優(yōu)化、存儲器體系結(jié)構(gòu)、鏈接與裝載、進(jìn)程、虛擬內(nèi)存這一堆來自各不同的計算機(jī)學(xué)科的核心知識點(diǎn)串在一起,并以程序員的視角呈現(xiàn),所以這本書的英文名字叫《Computer Systems A Programmer's perspective》。

          而程序員自我修養(yǎng)則重在鏈接、目標(biāo)文件、裝載、庫與運(yùn)行時,看完這本書你會了解到一個 C/C++ 程序是如何被編譯成目標(biāo)文件的,以及 Linux 下目標(biāo)文件的格式,不同目標(biāo)文件又是如何被鏈接成一個可執(zhí)行程序,在鏈接時如何處理符號、重定位、地址解析等,以及靜態(tài)鏈接、動態(tài)鏈接區(qū)別等等,最后可執(zhí)行文件又是如何被加載進(jìn)內(nèi)存,如何和虛擬內(nèi)存空間映射的。

          你可能會覺得這個又是只能用于面試,實(shí)際派不上用場的知識?

          那簡直大錯特錯,說真的,這兩本書,我是反復(fù)看了三遍以上,當(dāng)然后續(xù)看都是挑著重點(diǎn)看的。

          舉個例子吧,寫 C/C++ 的同學(xué)沒少遇到這些編譯錯誤吧:

          undefined reference to xxx

          Symbol key multiply defined (by xxx.o and yyy.o)

          在我大一的時候遇到這些問題簡直一臉懵逼,根本連報錯都看不懂。

          特別是涉及到多文件編程的時候,經(jīng)常傻乎乎的在頭文件中定義變量,導(dǎo)致變量多重定義,這些問題沒有學(xué)過鏈接知識的其實(shí)很難理解。

          在實(shí)際編程也是經(jīng)常會遇到的。

          又比如externstatic 這些關(guān)鍵字是如何在編譯鏈接時起作用,變量的申明與定義又有什么區(qū)別?

          這部分可以算是真正的內(nèi)功了,提升你對計算機(jī)系統(tǒng)的理解,也有助于解決實(shí)際編程過程中會出現(xiàn)的問題,當(dāng)然也會在面試中出現(xiàn)。

          八、數(shù)據(jù)庫

          數(shù)據(jù)庫首先要學(xué)會 SQL 的使用,這里推薦《MySQL必知必會》。

          數(shù)據(jù)庫原理方面可以看看《數(shù)據(jù)庫系統(tǒng)概念》,這本書挺厚的,包含了從 SQL 到數(shù)據(jù)庫設(shè)計再到數(shù)據(jù)庫原理、分布式數(shù)據(jù)庫都有,可以挑著看,比如關(guān)系模型、數(shù)據(jù)庫設(shè)計(三大范式)、數(shù)據(jù)磁盤存儲和組織方式、索引、并發(fā)控制等。

          當(dāng)然了整個數(shù)據(jù)庫最重要的還是索引和并發(fā)控制(鎖、MVCC等),這部分也是面試常考的:

          • 索引存儲結(jié)構(gòu):B樹、B+樹索引、Hash索引

          • 索引的使用:主鍵索引、覆蓋索引、最左前綴原則、索引下推等

          • 鎖:樂觀鎖、悲觀鎖、表鎖,行鎖,意向鎖,讀鎖,寫鎖等等

          • MySQL InnoDB MVCC 實(shí)現(xiàn)機(jī)制

          • 存儲引擎:InnoDB、MyISAM等,各自的優(yōu)缺點(diǎn)

          • 事務(wù):ACID理論

          這部分推薦兩本書:

          • 《高性能MySQL》
          • 《MySQL技術(shù)內(nèi)幕》

          這兩本主要對索引、innodb存儲引擎、鎖、并發(fā)控制講得比較清楚,建議挑對應(yīng)章節(jié)看。

          九、算法和數(shù)據(jù)結(jié)構(gòu)

          首先需要掌握常見的數(shù)據(jù)結(jié)構(gòu):

          • 線性表、數(shù)組、鏈表
          • 棧與隊(duì)列
          • 樹、二叉樹、多叉樹實(shí)現(xiàn)和遍歷方式,AVL樹實(shí)現(xiàn)以及插入刪除過程、紅黑樹(了解定義即可)
          • 圖,以及圖的實(shí)現(xiàn)方式、遍歷
          • B樹、B+樹
          • 散列函數(shù)和散列表

          常見的算法:

          • 排序算法:冒泡、插入、快速、希爾、堆排、基數(shù)、歸并等
          • 字符串匹配算法:KMP
          • 常見算法思想:遞歸、枚舉、遞推、分治、貪心、動態(tài)規(guī)劃等

          視頻可以看看 :

          • mooc 上浙大的《數(shù)據(jù)結(jié)構(gòu)》
          • 學(xué)堂在線上清華鄧俊輝老師的《數(shù)據(jù)結(jié)構(gòu)與算法》

          這兩個是我看過覺得不錯的才在這推薦,第一個是初學(xué)數(shù)據(jù)結(jié)構(gòu)時跟著看,第二個是大三復(fù)習(xí)時刷的。

          入門版書籍可以看看:

          • 《啊哈算法》
          • 《算法圖解》

          稍微進(jìn)階點(diǎn)的:

          • 《算法第四版》

          這本書強(qiáng)烈推薦,難度適中,但是全面。

          終極版:

          • 《算法導(dǎo)論》

          這個量力而行就好了。。。

          推薦理由是:我不推薦顯得沒有逼格(:

          有了基礎(chǔ)的算法思想和數(shù)據(jù)結(jié)構(gòu)儲備,剩下的就是刷題了:

          • 《劍指offer》

          建議必刷

          • leetcode

          建議分類刷,先易后難,比如數(shù)組、二分、二叉樹、動態(tài)規(guī)劃,一個一個系列搞定,總結(jié)經(jīng)驗(yàn),保證 150 道簡單和中等以上吧

          最重要的是,保持手感,有空就刷一道。

          十、網(wǎng)站和視頻

          有些同學(xué)喜歡看視頻,那我也在這里統(tǒng)一推薦一下吧

          • B站

          你的一站式學(xué)習(xí)網(wǎng)站,用你想學(xué)的關(guān)鍵字在這搜就完了

          • 中國大學(xué) mooc

          基礎(chǔ)課程學(xué)習(xí)

          • 網(wǎng)易云課程、學(xué)堂在線

          一些技術(shù)課程、公開課學(xué)習(xí)

          Linux C/C++ 可以去看看黑馬的,我試看過幾集 IO,講得還是不錯的,就是有點(diǎn)慢,個人覺得不如看書。

          刷題可以看看牛客左神的視頻

          計算機(jī)網(wǎng)絡(luò)可以看看 B 站韓立剛或者 mooc 哈工大的

          操作系統(tǒng)可以看看學(xué)堂在線上清華的《操作系統(tǒng)》

          推薦了這么多書,從哪看起?

          一、淺談學(xué)習(xí)方法

          如果你認(rèn)真看過我前面介紹每一部分的學(xué)習(xí)路線時,可以發(fā)現(xiàn)我特別強(qiáng)調(diào)學(xué)習(xí)抓主線,并且將每一個基礎(chǔ)知識的主線給大家列出來了。

          這里再次強(qiáng)推,學(xué)習(xí)新東西的時候,重點(diǎn)是先對整體脈絡(luò)、知識結(jié)構(gòu)有一個大概的映像和了解,然后抓住這個領(lǐng)域的主線,順著主干,突出重點(diǎn)去學(xué)習(xí)。

          集中時間,速戰(zhàn)速決,不要將時間線拉得太長,越長可能越堅(jiān)持不下去,效果越差。

          對于細(xì)枝末節(jié)的內(nèi)容,可以留到實(shí)踐的時候,用到了再去查!

          如果一頭扎進(jìn)零碎的知識,去看手冊、字典型的書,那必然是事倍功半的。

          細(xì)節(jié)留給實(shí)踐去補(bǔ)充,我們的時間要花在刀刃上,注重知識的體系性和框架的建立。

          二、常見問題

          說實(shí)話,其實(shí)這些書籍或多或少都被各路大神推薦過,確實(shí)經(jīng)典。但是大神們卻很少告訴你他們是如何去看的,該怎么去看這些書,難道一本本一頁頁的挨著啃嗎?

          這部分才是我今天最想說的部分,「該如何去看大厚書」。

          比如我后臺就經(jīng)常有同學(xué)問:

          • 有些書看的找不到重點(diǎn),看不下去了,怎么辦,比如深入理解計算機(jī)系統(tǒng),UNIX 網(wǎng)絡(luò)編程,APUE,求指教
          • 我不是科班 CSAPP 可能不是全部看得懂,該怎么辦?
          • 大佬,這么多書看得完嗎?
          • 剛開始看這些書很痛苦怎么辦?

          這些書該怎么看,可能過來人,準(zhǔn)備過秋招的都比較清楚,但是作為還在大二、大三的會比較懵逼。

          就拿我當(dāng)時親身經(jīng)歷來說,在網(wǎng)上搜網(wǎng)絡(luò)編程如何學(xué)習(xí),很多人都推薦 UNP、APUE。

          好嘛,買來看,從第一頁挨著挨著看,而且書中的示例代碼我大部分也照著敲了,最后看了七八章,發(fā)現(xiàn)始終是在學(xué)一些 socket api 和 系統(tǒng) api 的用法,沒摸到網(wǎng)絡(luò)編程的框架思維。

          后面我又去搜,看到有人推薦《Linux高性能服務(wù)器編程》,去豆瓣看了下了目錄,似乎正是我想要的東西。

          直接找來 PDF 開始看,果然這本書才真正讓我理解了網(wǎng)絡(luò)編程的整個套路和框架,學(xué)到了各種事件處理模式、計時器、信號處理、線程池這些網(wǎng)絡(luò)編程中很重要的東西。

          當(dāng)然 UNP 和 APUE 也是不能丟的,這兩本書我當(dāng)做了字典查詢,比如學(xué)到了 IO 部分,回去看 UNP 中關(guān)于五種 IO 模型的介紹。

          用到 connect、listen、bind 這些函數(shù),再回去看 UNP 第四章,不得不說,UNP 關(guān)于這些 socket API 的使用和各種異常情況的處理方式都介紹得非常詳細(xì)和深入,不愧是網(wǎng)絡(luò)編程領(lǐng)域的圣經(jīng)。

          但是初學(xué)者看卻容易在細(xì)節(jié)中迷失,抓不到綱領(lǐng),這也是這類書的缺點(diǎn)。

          類似 UNP、APUE 這種書本身是面向知識體系的,而不是面向讀者,它們其實(shí)更像字典,把這個領(lǐng)域內(nèi)的所有知識,非常細(xì)致的堆疊在一起,看上去就是平鋪直敘,充斥著細(xì)節(jié),對讀者極其不友好。并且書里內(nèi)容實(shí)在大而全,很多根本不用學(xué)。

          比如 UNP 講了 sctp 這種協(xié)議用法、多播、unix 域協(xié)議這些實(shí)際用得很少的東西,挨著看不僅會看不下去,而且比較浪費(fèi)時間。

          但是它們又是經(jīng)典的,確實(shí)是這些領(lǐng)域內(nèi)在體系性和深入性上都做得非常好的書。

          什么書才是面向讀者的呢?

          那就是抓住該領(lǐng)域的核心主干,提綱挈領(lǐng),帶領(lǐng)讀者由淺入深,同時又有一定的細(xì)節(jié),看完讓人茅塞頓開。

          比如《自頂向下》、《Linux高性能服務(wù)器編程》、《Linux多線程服務(wù)端編程》、《STL源碼剖析》、《Effective C++》、《CSAPP》、《程序員自我修養(yǎng)》等都有各自想要論述的主線在里面,看起來也是一環(huán)扣一環(huán),非常循序漸進(jìn)。

          我的看書方法就是對于面向知識體系那種堆砌細(xì)節(jié)的書,我們先瀏覽目錄,做到對整本書有映像,再大致看一些我們關(guān)心的部分,比如 UNP 和 APUE 中 IO、文件、進(jìn)程控制、信號、線程、線程控制、基本套接字編程 這些是比較重要的模塊,其它邊角知識,可以用到再去查。

          還有一點(diǎn),很多同學(xué)反映看不懂類似 CSAPP 這樣的書,那我們都知道,任何一本書基本上都是有前置依賴的。

          沒有掌握要求的背景知識去看肯定很吃力的。

          就比如我大一下只有基礎(chǔ)的 C 知識和一丁點(diǎn)計算機(jī)導(dǎo)論知識,然后屁顛屁顛的跑去看 CSAPP(學(xué)長畢業(yè)擺地攤賣書我瞎買的),那時候只知道這本書被譽(yù)為神書,但是看到前兩三章就蒙了,真的有點(diǎn)難,對于當(dāng)時的我來說太底層了,根本不知道在說啥,看過也只是看過,就像天空飛過鳥兒,但沒有痕跡。

          直到后來大三再次拿起,我才意識到這本書的偉大之處就在于將計算機(jī)不同學(xué)科知識有機(jī)的串在了一起。那時候看,更多是一種補(bǔ)充、深入學(xué)習(xí)以及完善了,因?yàn)楹芏嘀R分別在數(shù)字邏輯、匯編語言、操作系統(tǒng)這些課程中學(xué)過了。

          所以要明白,你看不懂不是因?yàn)槟惚繘]天賦,而是你有前置依賴的知識沒有完成,還沒學(xué)會走,就想跑了。

          一般來說,每本書的首頁會介紹看這本書需要哪些前置知識,可以關(guān)注一下。

          還有一種看書的方法,我在復(fù)習(xí)的時候采用過,那就是橫向?qū)W習(xí)。

          比如我復(fù)習(xí)操作系統(tǒng),在《操作系統(tǒng):精髓和設(shè)計原理》中看到了關(guān)于內(nèi)存、虛擬內(nèi)存的各種介紹,看完理論再去看《Linux內(nèi)核設(shè)計與實(shí)現(xiàn)》12 章「虛擬內(nèi)存」、15 章『進(jìn)程地址空間』,最后再去看《CSAPP》第 9 章『虛擬內(nèi)存』,這樣看下來,基本上內(nèi)存這塊理解得比較透了,這些書關(guān)于這塊的介紹是各有優(yōu)缺點(diǎn)的,正好互補(bǔ)。

          又比如在《精髓與設(shè)計原理》中介紹了進(jìn)程加載和鏈接,其實(shí)講得比較偏理論,看完還是覺得似懂非懂。

          那我又會去《CSAPP》看第 7 章「鏈接」,這一章基本講清了靜態(tài)鏈接、目標(biāo)文件、可重定位目標(biāo)文件、引用解析、加載這些關(guān)于鏈接的核心概念,但是一個章節(jié)講這么多,難免不夠深入。

          我又會去看《程序員自我修養(yǎng)》這本書第 4 章「靜態(tài)鏈接」、第 6 章 「可執(zhí)行文件的裝載與進(jìn)程」、第 7 章 「動態(tài)鏈接」,這本書核心主題就是鏈接、加載,所以這一路看下來,對于鏈接、加載這塊基本上搞得比較透徹了,也許沒幾個面試官有你清楚。

          同樣索引你也能從《數(shù)據(jù)庫系統(tǒng)概念》、《高性能MySQL》、《MySQL技術(shù)內(nèi)幕》中挑選對應(yīng)的章節(jié),串起來看,取每本書優(yōu)點(diǎn),這樣學(xué)習(xí)真的很高效也很深入。

          這就是我在復(fù)習(xí)的時候采用的用知識點(diǎn)串聯(lián),跨多本書高效精準(zhǔn)的復(fù)習(xí)方式,效果也很不錯,春招十幾次面試沒有一次因?yàn)檫@些基礎(chǔ)知識掛過。

          啰嗦了一大堆,就是回答這些問題的:

          “有些書看的找不到重點(diǎn),看不下去了,怎么辦,比如深入理解計算機(jī)系統(tǒng),UNIX 網(wǎng)絡(luò)編程,APUE,求指教”、“我不是科班 CSAPP 可能不是全部看得懂,該怎么辦?”、“大佬,這么多書看得完嗎”、“剛開始看這些書很痛苦怎么辦”

          三、要花多久時間才能學(xué)完

          這個不好說,根據(jù)你的基礎(chǔ)和學(xué)習(xí)效率不同,比如我大一、大二對于一些基礎(chǔ)的知識學(xué)得比較認(rèn)真,基礎(chǔ)還算可以,按照這樣一套走下來也就大半年。大概每天花四五個小時以上吧。

          如果真的是連計網(wǎng)、操作系統(tǒng)理論這樣的東西一點(diǎn)基礎(chǔ)都沒的話,那估計得一年以上,畢竟這些內(nèi)容基本覆蓋了科班的核心課程,人家上三年課,你一年解決,已經(jīng)算很快了好吧。

          一年真的足夠從小白學(xué)起嗎?

          感覺是差不太多的,但是估計得每天付出五六小時以上了,并且學(xué)習(xí)方法得當(dāng)。

          你去牛客就會發(fā)現(xiàn),存在各路大三、研一自學(xué)轉(zhuǎn)碼的同學(xué),最后還能成為 offer 收割機(jī),所以,不要懷疑一年不夠,最關(guān)鍵的是你要找到正確的路線,然后執(zhí)行下去。

          文中推薦的書真的全部要看嗎?

          當(dāng)然不是,我自己都沒看完,但是我的策略已經(jīng)說過了,基本上大部分書都看了重要的章節(jié),這樣看起來是很快的。

          并且隨著你看書越來越多,基礎(chǔ)越來越好,你會發(fā)現(xiàn)每本書前面幾章都是鋪墊基礎(chǔ)知識,大部分可以直接跳過,舉個例子

          《Linux高性能服務(wù)器編程》這本書前幾章是這樣的:

          • 第1章 TCPIP協(xié)議族
          • 第2章 IP協(xié)議詳解
          • 第3章 TCP協(xié)議詳解
          • 第四章 TCPIP通信案例:訪問Internet上的Web服務(wù)器
          • 第五章 Linux網(wǎng)絡(luò)編程基礎(chǔ)API

          你覺得這些章節(jié)在看過《自頂向下》、《TCP/IP詳解》之后還有必要看嗎?我反正是半天掃過去就完了。

          最后,不管說再多方法,再多的路線,最終都需要自己花時間去啃、去執(zhí)行。

          四、語言疑惑

          還有一個很多選擇 C++ 方向同學(xué)都存在的疑惑,在這里我也想解釋一下:

          C++ 語言特性多,又難學(xué),很多都是底層開發(fā)才會用到,C++ 就是個坑,是否應(yīng)該轉(zhuǎn) ?Java、Go 呢?

          當(dāng)然不是的,的確在頭條、美團(tuán)、阿里這種業(yè)務(wù)部門使用 Go、Java 系更多,首先還是那個觀點(diǎn),校招生對于企業(yè)來說都是一張白紙,面試官考察的是你的基礎(chǔ)知識和聰明度,來決定是否有培養(yǎng)潛力,語言確實(shí)不重要。

          那你可能會說,明明各種面經(jīng)上常常出現(xiàn) ConcurrentHashMap、虛表、虛函數(shù)實(shí)現(xiàn)機(jī)制這樣和語言強(qiáng)相關(guān)的問題。

          在我看來啊,面試深入問一些語言實(shí)現(xiàn)細(xì)節(jié),其實(shí)不是在考你語言,而是看你是否有主動鉆研的意識,是不是只停留在應(yīng)用的層面,同時也借語言考察一些數(shù)據(jù)結(jié)構(gòu)、操作系統(tǒng)方面的基礎(chǔ)知識。

          所以呢,我覺得 C/C++、Java、Go 你深入學(xué)習(xí)哪一個都可以,關(guān)鍵還是找對相應(yīng)的學(xué)習(xí)路線,一直堅(jiān)持學(xué)下去,不要每天都停留在我到底是學(xué) Java 好還是 C++ 好這樣無解的問題。

          另外,想對學(xué) C++ 的同學(xué)說,可能你會發(fā)現(xiàn)身邊同學(xué)都在搞 Java、Go 之類的,找工作缺少一些一起復(fù)習(xí)準(zhǔn)備的朋友,有些甚至勸你別學(xué) C++。那這個時候你一定要堅(jiān)定自己的選擇,多在牛客或者網(wǎng)上找找同方向的朋友一起交流、學(xué)習(xí)。

          說實(shí)話,就找工作這塊來說,個人覺得區(qū)別真的是不大的,不管從薪資、面試難度來說都是差不太多,更多的還是算法和基礎(chǔ)知識。

          而且也有不少同學(xué) Java 進(jìn)騰訊需要轉(zhuǎn) C++,C++ 進(jìn)阿里、美團(tuán)需要轉(zhuǎn) Java 的,這都不是事兒。

          那 C++ 目前應(yīng)用場景有哪些呢?

          一句話,對性能或者執(zhí)行效率要求比較高的應(yīng)用,比如游戲引擎、infra、推薦引擎、存儲等,當(dāng)然也能拿來寫業(yè)務(wù)(沒錯說的就是鵝廠),也有做 C++ 客戶端開發(fā)的,主要是 MFC、QT 等。

          說實(shí)話,像游戲引擎、infra這類都是門檻比較高的,并且招聘的數(shù)量也有限,一般人很難進(jìn),而且目前互聯(lián)網(wǎng)公司的業(yè)務(wù)部門大多使用的是 Java、Go這類語言。

          所以 C++ 的需求量是相比 Java、Go 這類少很多的,但是同時學(xué)習(xí) C++ 也沒 Java 那么多,所以相對來說競爭還沒那么大,并且 C++ 學(xué)的不錯,你同樣可以去面阿里、美團(tuán)這種 Java 技術(shù)棧的公司,大廠基本不會限制語言的。


          來個直擊靈魂的三連吧!

          瀏覽 39
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <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>
                  中文字幕在线色 | 北条麻妃成人视频 | 黄色操逼小视频国产无码 | 欧美成年性精品三级网站 | 日逼打炮|