C語言開發(fā)服務器可以說是一件非常困難和辛苦的事情。首先你需要對網(wǎng)絡編程非常熟悉,因為服務器需要通過網(wǎng)絡進行訪問,它必須架構在網(wǎng)絡協(xié)議上,然后你需要對網(wǎng)絡協(xié)議和相關的程序設計接口非常了解,比如socket編程、http協(xié)議及其編程接口等,然后你還要使用多線程,因為服務器不可避免地要同時接受多個訪問請求。綜上,用C語言開發(fā)服務器需要以上技術。
難度系數(shù)一般,需要具備c++開發(fā)知識才可能行。
引擎你說的是游戲引擎吧? 引擎就是framework 很多語言都有,只不過一般叫框架 所謂框架就是在語言之上做了一層包裝,然后讓用戶用框架設計好的模式 往里面填代碼,框架會幫你解決一些行業(yè)內(nèi)常見的問題 相對而言,用戶用框架開發(fā)會容易一點
首先,問問面向過程與面向?qū)ο蟮膮^(qū)別
一般面試C++的面試者都能回答大概,面試的技巧由淺入深,根據(jù)面試者的回答再引導著考察面向?qū)ο蟮南旅娴膬?nèi)容。
然后,可以考察C相關知識
C語言基礎還是很重要的,考考概念類的const、static、指針、棧、鏈表、排序算法等很體現(xiàn)基本功的問題。
繼續(xù),考察C++相關知識
構造與析構函數(shù),虛函數(shù),函數(shù)重載,類的繼承多態(tài),內(nèi)存模型等。
最后,項目相關的問題
若面試者做過大型項目或者招聘需求相關的項目,可以做適當加分。然后根據(jù)項目側(cè)重點,問問項目會用到的知識,比如進程間通訊,通訊協(xié)議,通訊報文與文件處理之類的。
編程能力很重要,編程習慣更不容忽視
一場面試,時間有限,肯定不能把所有知識點都考到,要詳細的考察面試者的各項能力可以增加一場筆試。筆試的編程題必不可少,除了考察編程能力之外,還可以看出一個人的代碼習慣與代碼風格。代碼習慣不好的面試者,需要慎重考慮。
另外,招聘還是要看多方面的看這個人是否合適。技術能力與項目經(jīng)驗是一方面,性格、價值觀與企業(yè)文化的融合度,個人問題等也是決定因素。
近年來,C語言后端開發(fā)崗位需求穩(wěn)步增長,成為眾多開發(fā)者關注的熱點。想要成為一名優(yōu)秀的C語言后端開發(fā)工程師,除了扎實的編程功底外,面試準備也至關重要。本文將為您提供一些精品的C語言后端開發(fā)面試題及詳細的答案解析,助您在面試中游刃有余。
如果你想成為一名出色的C語言后端開發(fā)者,那么對于C語言的基礎知識是至關重要的。
數(shù)據(jù)結構與算法是后端開發(fā)中不可或缺的一部分,下面是一些關于C語言后端開發(fā)相關的數(shù)據(jù)結構與算法面試題:
對于后端開發(fā)來說,操作文件是常見的任務。以下是一些關于C語言文件操作的面試題:
隨著互聯(lián)網(wǎng)的發(fā)展,網(wǎng)絡編程在后端開發(fā)中變得越來越重要。以下是一些關于C語言網(wǎng)絡編程的面試題:
通過上述精選的C語言后端開發(fā)面試題及答案解析,相信您已經(jīng)對C語言后端開發(fā)領域有了更深入的了解。在備戰(zhàn)面試的過程中,堅持練習與思考,相信您一定能夠在面試中脫穎而出。最后,感謝您閱讀本文,希望這些內(nèi)容對您的求職之路有所幫助。
服務器開發(fā)需要掌握多個基礎知識。首先,需要熟悉網(wǎng)絡協(xié)議和通信原理,如HTTP、TCP/IP等。
其次,需要了解操作系統(tǒng)和服務器架構,如Linux、Windows Server等。
還需要掌握編程語言,如Java、C++等,以及相關的開發(fā)框架和工具,如Spring、Django等。
此外,還需要了解數(shù)據(jù)庫管理和優(yōu)化,如MySQL、Oracle等。同時,對于安全性和性能優(yōu)化也需要有一定的了解。最后,具備良好的問題排查和解決能力,以及團隊協(xié)作和溝通能力也是必備的技能。
經(jīng)歷過和題主一樣的糾結、選擇,最終我選了 C++
選擇那一門語言對學習linux服務器端編程最有幫助?
毫無疑問,C++!
學C++,其實約等于掌握了 C + C++,并且后續(xù)掌握 Java 也會很快,畢竟C++學習曲線會陡一些。
單獨學 C可能很難找到互聯(lián)網(wǎng)相關工作。
為什么我推薦 C++?
因為你想學習 Linux 服務端編程,那么選擇 Linux C++ 就是最好的方式。
我本來大二一直都在學Java的,后來大二下開始轉(zhuǎn) Linux C++,在校招中也順利拿到了騰訊微信后臺 C++ offer,所以我相信我的路線一定對你或者后來的學弟學妹們有幫助!
這樣的學習路線相信大家都見得不少了,寫之前也非常忐忑,能不能和其它人寫得不一樣, 也定下了一個目標,在這里,不能是簡單的堆砌學習資源和書單推薦,更要細化如何有效的去執(zhí)行落地。
爭取做到讓看到的同學有一種相見恨晚的感覺哈哈哈。
所以大家可以試著看一下,幫我檢查下有沒有達到預想的效果哈哈,希望不要被打臉
那就正式開始吧。
(學習路線有點長,先給大家一波我的面經(jīng)、看的書、刷題筆記等匯總:
絕不是在網(wǎng)上那種打包下載的,而是自己需要學到某個方向知識的時候,需要看了,去網(wǎng)上挨個找的,最后匯總而成。這部分我是會不斷把它完善的,當成自己的小電子書庫,不多,但貴在精。
我整理的這些書大家可以在這里獲取,對于學習計算機的同學幫助非常大,且十分系統(tǒng):
下載鏈接:
計算機必看經(jīng)典書單經(jīng)常在各大公司招聘上看到后端、后臺、服務器開發(fā)等等,有些同學經(jīng)常被這些名詞搞混。
其實這些名詞都是相近的,但是也有點區(qū)別,這里說說我的理解:
后臺一般和后端是一個意思,而服務器開發(fā)則稍微廣義一點,不僅包含了后臺開發(fā),而且也包括支撐整個后臺應用的基礎開發(fā),比如搜索引擎、微服務、RPC 框架、KV、存儲、MQ 等。
后臺/后端重在業(yè)務處理,是偏向應用層開發(fā),而服務器開發(fā)不僅包括應用層開發(fā),更是囊括了整個支撐后臺業(yè)務的相關組件的開發(fā)。
那 Linux C/C++ 服務器/后臺開發(fā)指的什么呢,其實就是基于 Linux 上 的 C++ 編程。
但是相比 Java 系更強調(diào) Linux 系統(tǒng)編程、網(wǎng)絡編程能力,有的還會涉及到服務端底層協(xié)議和網(wǎng)絡框架開發(fā)。
傳統(tǒng)的 Java 、Go后臺開發(fā)偏向 Web 開發(fā),也就是接收前端請求,通過微服務互相調(diào)用,完成業(yè)務邏輯處理,然后返回給前端。
實際上在騰訊這邊的 C++ 后臺開發(fā),也是類似的,本身有非常成熟的基于 C++ 的微服務體系,大多數(shù)開發(fā)也只需要關注業(yè)務邏輯就好,不過還是會要求 Linux 系統(tǒng)編程、網(wǎng)絡編程等能力。
一般來說 Linux C/C++ 后臺開發(fā)方向涉及以下這些基礎知識:
非必選加分項:
由于篇幅限制,這篇文章主要介紹基礎知識的學習路線和方法,其它加分項以后再單獨寫。
首先是語言的基礎知識,一些關鍵字和實現(xiàn)原理等:
這里列出來的只是一些比較重要的部分,實際上可能只算 C++ 的冰山一角, 大家且學且珍惜吧,這不 C++11 還沒整透徹,C++ 20 又出來了,生命不息,學習不止。
怎么學?
1. 《C++ Primer》
這本書基本包括了 C++ 11 的全部特性,最好把前面三部分:C++基礎、C++標準庫、類設計者的工具都看一遍,我當時花了一個多月斷斷續(xù)續(xù)看到了第16章模板那里。
2. Effective 系列:《Effective C++》、《More Effective C++》、《Effective STL》
第一本是重點,光看《C++ Primer》缺少實踐的話,大概率還寫不出合格的 C++ 代碼,而《Effective C++》就是通過 55 條非常具體的做法告訴你什么樣才是符合 C++ 編碼規(guī)范的,可以縮短你寫出合格 C++ 代碼的時間,減少踩坑,強烈推薦必讀,后面兩本優(yōu)先級稍低,可以有時間再讀。
3. 《STL 源碼剖析》和《深度探索 C++ 對象模型》
看完 Primer 和 Effective,你應該已經(jīng)能夠比較熟練的使用C++了,但是還缺少對 C++ 底層實現(xiàn)機制的認識。比如虛函數(shù)表、成員變量布局等,同時對于 STL 庫可能也僅僅停留在使用上。 推薦的這兩本可以分別完善你在 C++ 底層實現(xiàn)和 STL 源碼、原理上的認識。
以上書籍同時建議和侯捷老師的視頻配合服用,效果更佳。
直接在 B 站搜索「候捷 C++」即可,主要有以下幾個系列:
我基本都看了,收獲挺大的,建議看下,可以開倍速。
最近發(fā)現(xiàn) B 站關于侯捷老師的 C++ 視頻課程幾乎全部被下架了,于是自己搜集了一套非常全的視頻,大家趕緊去下載保存?zhèn)溆茫?/b>
看完以上資料,算是 C++ 入門了,應付面試也是足夠的,基本到達了正確高效地使用 C++ 這一層面。
是不是聽到這有點崩潰,特么的看了這么多,才入門???
如果你想在 C++ 語言上更進一步,那么有以下的書籍推薦:
這本書是 C++ 之父 Bjarne Stroustrup 寫的,關于 C++ 的前世今生,以及未來的演進方向,可以了解 C++ 的設計哲學。C++ 復雜的語言特性一直讓人詬病,通過這本書,可以看到各種特性引入的目的,也更深入了解到了 C 和 C++ 之間關系。比如 C++ 里有個原則就是所有的實現(xiàn)機制都不能帶來額外的運行時開銷。
我也正在看這本書。
C++模板元編程屬于另外一個世界了,一般公司里開發(fā)用得比較少,這個也是一個大坑,如果實在感興趣可以去看看,感受下 C++ 的博大精深,不過這玩意我也不太會,也不推薦你去花時間在上面。
這是 C++ 社區(qū)組織的類似開源峰會那種,每次都會討論一些關于 C++ 的話題,沒事去刷一個,還是挺有意思的。 Youtube 直接搜 CppCon 即可找到。
操作系統(tǒng)這門課,我的感覺是易學難精,但是掌握到日常編程和面試夠用還是比較容易的。
那么畢業(yè)生或者說你去準備校招面試應該達到怎樣的水平:
其中內(nèi)存、進程、IO 是重點,這幾塊也是和編程關系最密切的,這里推薦先挑本偏理論的書看看,了解操作系統(tǒng)的全貌:
不必全看,兩者任選一本都不錯,我自己是仔細看了第二本,因為是我們教材,同時挑著看了現(xiàn)代操作系統(tǒng)部分章節(jié)。
這部分看完你應該對下面這些話題有一個清晰認知了:
但是這還不夠,看完偏理論的書,當面試官問「進程和線程的區(qū)別」時。
大概只能回答出「進程是資源分配的最小單位,線程是CPU調(diào)度的最小單位,balabala...」這樣正確卻普通的答案。
但是如果你了解 Linux 內(nèi)核的實現(xiàn),就可以實際出發(fā),講講 Linux 中進程和線程是如何創(chuàng)建的,區(qū)別在哪里。
比如在 Linux 中進程和線程實際上都是用一個結構體 task_struct來表示一個執(zhí)行任務的實體。進程創(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 實現(xiàn)線程的方式簡直太巧妙了,實際上根本沒有線程,它創(chuàng)建的就是進程,只不過通過參數(shù)指定多個進程之間共享某些資源(如虛擬內(nèi)存、頁表、文件描述符等),函數(shù)調(diào)用棧、寄存器等線程私有數(shù)據(jù)則獨立。
這樣是不是非常符合理論書上的定義:同一進程內(nèi)的多個線程共享該進程的資源,但線程并不擁有資源,只是使用他們。
這也算符合 Unix 的哲學了— KISS(Keep It Simple, Stupid)。
但是在其它提供了專門線程支持的系統(tǒng)中,則會在進程控制塊(PCB)中增加一個包含指向該進程所有線程的指針,然后再每個線程中再去包含自己獨占的資源。
這算是非常正統(tǒng)的實現(xiàn)方式了,比如 Windows 就是這樣干的。
但是相比之下 Linux 就顯得取巧很多,也很簡潔。
對于進程、線程這塊你還可以把 fork、vfork、clone 、pthread_create 這些模塊關系徹底搞清楚,對你理解 Linux 下的進程實現(xiàn)有非常大的幫助。
說了這么多,就是想強調(diào)一下理論聯(lián)系實際的重要性。
特別是操作系統(tǒng),最好的實踐就是看下 Linux 內(nèi)核是怎么實現(xiàn)的,當然不是叫你直接去啃 Linux 源碼,那不是一般人能掌握的。
最好的方式是看書,書的脈絡給你理得很清晰。
書籍推薦:
這本書恰到好處,即講清楚了內(nèi)核實現(xiàn)的要點,又不會通篇源碼。
這本書重點關注「第 3 章進程管理」、「第 5 章系統(tǒng)調(diào)用」、「第12章內(nèi)存管理」、「第13章虛擬文件系統(tǒng)」、「第 15 章進程地址空間」
這些章節(jié)屬于操作系統(tǒng)核心部分,其它如中斷處理、塊 IO、設備管理根據(jù)你自己興趣選擇看下就可以了。
基本上做到這里,操作系統(tǒng)就沒什么大問題了。
需要掌握的網(wǎng)絡協(xié)議和知識:
計網(wǎng)知識比較繁雜,很多同學都反映網(wǎng)絡很難學,一大堆的網(wǎng)絡協(xié)議,依次學完后,還是不知道網(wǎng)絡是怎么構成的。
這就是沒有用對學習方法,導致只見樹木,不見森林。
學習時,推薦你抓住一條主線 「一個數(shù)據(jù)包是如何發(fā)送出去的?」
帶著這個問題依次去學應用層、傳輸層、網(wǎng)絡層、鏈路層,思考這些層之間是如何串聯(lián)起來的。
這就是自頂向下的思路,那自然要推薦:
這本書從我們最常接觸的 HTTP、FTP、SMTP 等應用層協(xié)議講起,可以清晰看到引入各個層的作用。
比如為了區(qū)分同一個主機的不用應用,引入了傳輸層,并使用不用的端口號作為區(qū)別;
為了在不同子網(wǎng)間傳輸數(shù)據(jù)引入了網(wǎng)絡層,并使用 IP 地址尋址路由;
網(wǎng)絡層解決了不同子網(wǎng)間路由的問題,但是同一個局域網(wǎng)內(nèi)確定主機卻是通過 MAC 地址,所以引入了鏈路層來承載 IP 數(shù)據(jù)包;
同時為了將 IP 地址和 MAC 地址做轉(zhuǎn)換映射又產(chǎn)生了 ARP 協(xié)議。
層層遞進,逐層揭開網(wǎng)絡,非常推薦!
還有一本書:
非常淺顯易懂的描述了「一個數(shù)據(jù)包是如何發(fā)送出去的」,也不費時間,看慣了機工社的大黑書,看這種反而有種看小人書的感覺,有基礎的話,一天左右就過完了。
只有把握住了整個網(wǎng)絡脈絡主線才不至于被紛繁復雜的網(wǎng)絡協(xié)議所搞暈,剩下的就是不斷的細化,填充這些主干上的細枝末節(jié)。
那么有哪些細節(jié)可以去填充呢?
比如 ARP 工作過程、IP 地址、IP 分片、NAT(UDP 打洞)、鏈路層訪問控制協(xié)議等等。
還有最重要的 TCP 協(xié)議,TCP 也是面試和計網(wǎng)中最重要的概念:
這么多東西肯定需要背,但不要死記,最好帶著問題去思考為什么要這樣做。
這里列幾個問題:
整個 TCP 的核心就是圍繞著 可靠傳輸 + 高效傳輸(流量控制和窗口管理)
由于 TCP 的細節(jié)實在太多,自頂向下那本書有點不太夠,所以你需要去看看:
這本書不要從頭看,而是挑出其中涉及到 TCP 的章節(jié)
到這里,對于整個網(wǎng)絡以及 TCP 都應該有了一個全面而細致的認識。
但是計網(wǎng)中還是有一些有意思的問題,如果你沒思考過,也許回答不出來。
比如:
這些問題只有當你真正理解了才能回答出,僅僅記住協(xié)議的話,估計很難應對靈活的面試題。
此外,網(wǎng)絡部分還需要準備 HTTP、HTTPS,推薦:
最后別忘了自己回答一遍那被問爛了、寫爛了的問題:
越細越好,五百字以上吧,哈哈哈
C++ 后臺開發(fā)基本是離不開網(wǎng)絡編程的,其實甚至整個后臺開發(fā)也可以看做是在做網(wǎng)絡編程。
只不過別人的框架幫我們做了協(xié)議解析、網(wǎng)絡數(shù)據(jù)傳輸、解封包這些底層操作。
比如 SpringBoot 這種保姆級框架,基本上屬于將一個框架能干的事都干完了,以至于我們開發(fā)業(yè)務只需要定義接收和返回包的數(shù)據(jù)格式,然后做邏輯處理就完了。
像序列化、解封包、IO 處理這種網(wǎng)絡編程必備的臟活業(yè)務開發(fā)根本不會接觸到。
但是網(wǎng)絡編程技能還是很重要的,特別是對于 Linux C++ 開發(fā)來說。
Linux 下網(wǎng)絡編程核心的包括系統(tǒng)編程和網(wǎng)絡 IO 兩個部分:
推薦的書:
這兩本是磚頭書,雖然是網(wǎng)絡編程和 Unix 系統(tǒng)編程方面的無出其右的圣經(jīng),但主要用途還是墊顯示器(逃, 個人覺得這種書不是面向讀者的,具體原因和如何閱讀這種書在后文介紹。
我強烈推薦,這本書前半部分基本是在重復計網(wǎng)基礎知識,但是后面幾章關于高性能服務器程序框架、高性能IO、IO復用、定時器、多線程編程、線程池和進程池還是講得非常全面到位的,值得一看,看完基本上對于整個網(wǎng)絡編程就有了框架。
這本書同樣強烈推薦,這是陳碩大佬寫的書,說實話第一部分:C++ 多線程系統(tǒng)編程都直接把我看蒙了,沒有想到 C++ 里要做到線程安全這么難,第一章我看了兩三遍才看懂吧。。。 這是難得的講解 C++ 多線程編程的書。
并且在書中,陳碩大佬用了一章講解了 Muduo 網(wǎng)絡庫設計與實現(xiàn),Muduo 比較適合學完基礎的網(wǎng)絡編程后繼續(xù)進階學習如何設計和寫一個網(wǎng)絡庫,是一個高質(zhì)量的 Reactor 網(wǎng)絡庫,采用 one loop per thread + thread pool 實現(xiàn),代碼比較簡潔,書和源碼搭配著看作為學習網(wǎng)絡編程方面來說是非常不錯。
學完網(wǎng)絡編程就可以寫點小項目練手了,這里列舉幾個項目:
作為 C/C++ 程序員,編寫的程序不像 Java、Python 這些是在虛擬機上,直接就是在操作系統(tǒng)上運行,那么就必須了解操作系統(tǒng)底層機制和運行原理。
就和 Java 程序員要求了解 JVM 是一個道理,你得熟悉代碼運行的平臺,才能在出問題的時候準確定位到。
這個也是在我們學校在大三開設的一門課程《System Programing》,從 CMU 引進的,教材也是沿用 CSAPP,這也是我覺得大學上過最值的課了。
我重新認真讀 CSAPP 就是在大三上這個課期間,包括做了每個章節(jié)附帶的 lab, 這是我當時做 Bomblab 的題解:
https://www.jianshu.com/p/479333cbccc4
這里推薦兩本書:
不需要我多介紹了
別被名字欺騙了,這不是教你養(yǎng)生的,而是學了會掉頭發(fā)的硬核知識
兩本書側(cè)重點各不相同,CSAPP 非常巧妙的把數(shù)字電路基礎、二進制與指令集體系、匯編語言、程序設計及優(yōu)化、存儲器體系結構、鏈接與裝載、進程、虛擬內(nèi)存這一堆來自各不同的計算機學科的核心知識點串在一起,并以程序員的視角呈現(xiàn),所以這本書的英文名字叫《Computer Systems A Programmer's perspective》。
而程序員自我修養(yǎng)則重在鏈接、目標文件、裝載、庫與運行時,看完這本書你會了解到一個 C/C++ 程序是如何被編譯成目標文件的,以及 Linux 下目標文件的格式,不同目標文件又是如何被鏈接成一個可執(zhí)行程序,在鏈接時如何處理符號、重定位、地址解析等,以及靜態(tài)鏈接、動態(tài)鏈接區(qū)別等等,最后可執(zhí)行文件又是如何被加載進內(nèi)存,如何和虛擬內(nèi)存空間映射的。
你可能會覺得這個又是只能用于面試,實際派不上用場的知識?
那簡直大錯特錯,說真的,這兩本書,我是反復看了三遍以上,當然后續(xù)看都是挑著重點看的。
舉個例子吧,寫 C/C++ 的同學沒少遇到這些編譯錯誤吧:
undefined reference to xxx
Symbol key multiply defined (by xxx.o and yyy.o)
在我大一的時候遇到這些問題簡直一臉懵逼,根本連報錯都看不懂。
特別是涉及到多文件編程的時候,經(jīng)常傻乎乎的在頭文件中定義變量,導致變量多重定義,這些問題沒有學過鏈接知識的其實很難理解。
在實際編程也是經(jīng)常會遇到的。
又比如extern、static 這些關鍵字是如何在編譯鏈接時起作用,變量的申明與定義又有什么區(qū)別?
這部分可以算是真正的內(nèi)功了,提升你對計算機系統(tǒng)的理解,也有助于解決實際編程過程中會出現(xiàn)的問題,當然也會在面試中出現(xiàn)。
數(shù)據(jù)庫首先要學會 SQL 的使用,這里推薦《MySQL必知必會》。
數(shù)據(jù)庫原理方面可以看看《數(shù)據(jù)庫系統(tǒng)概念》,這本書挺厚的,包含了從 SQL 到數(shù)據(jù)庫設計再到數(shù)據(jù)庫原理、分布式數(shù)據(jù)庫都有,可以挑著看,比如關系模型、數(shù)據(jù)庫設計(三大范式)、數(shù)據(jù)磁盤存儲和組織方式、索引、并發(fā)控制等。
當然了整個數(shù)據(jù)庫最重要的還是索引和并發(fā)控制(鎖、MVCC等),這部分也是面試??嫉模?/p>
這部分推薦兩本書:
這兩本主要對索引、innodb存儲引擎、鎖、并發(fā)控制講得比較清楚,建議挑對應章節(jié)看。
首先需要掌握常見的數(shù)據(jù)結構:
常見的算法:
視頻可以看看 :
這兩個是我看過覺得不錯的才在這推薦,第一個是初學數(shù)據(jù)結構時跟著看,第二個是大三復習時刷的。
入門版書籍可以看看:
稍微進階點的:
這本書強烈推薦,難度適中,但是全面。
終極版:
這個量力而行就好了。。。 推薦理由是:我不推薦顯得沒有逼格(:
有了基礎的算法思想和數(shù)據(jù)結構儲備,剩下的就是刷題了:
建議必刷
建議分類刷,先易后難,比如數(shù)組、二分、二叉樹、動態(tài)規(guī)劃,一個一個系列搞定,總結經(jīng)驗,保證 150 道簡單和中等以上吧
最重要的是,保持手感,有空就刷一道。
有些同學喜歡看視頻,那我也在這里統(tǒng)一推薦一下吧
你的一站式學習網(wǎng)站,用你想學的關鍵字在這搜就完了
基礎課程學習
一些技術課程、公開課學習
Linux C/C++ 可以去看看黑馬的,我試看過幾集 IO,講得還是不錯的,就是有點慢,個人覺得不如看書。
刷題可以看看牛客左神的視頻
計算機網(wǎng)絡可以看看 B 站韓立剛或者 mooc 哈工大的
操作系統(tǒng)可以看看學堂在線上清華的《操作系統(tǒng)》
如果你認真看過我前面介紹每一部分的學習路線時,可以發(fā)現(xiàn)我特別強調(diào)學習抓主線,并且將每一個基礎知識的主線給大家列出來了。
這里再次強推,學習新東西的時候,重點是先對整體脈絡、知識結構有一個大概的映像和了解,然后抓住這個領域的主線,順著主干,突出重點去學習。
集中時間,速戰(zhàn)速決,不要將時間線拉得太長,越長可能越堅持不下去,效果越差。
對于細枝末節(jié)的內(nèi)容,可以留到實踐的時候,用到了再去查!
如果一頭扎進零碎的知識,去看手冊、字典型的書,那必然是事倍功半的。
細節(jié)留給實踐去補充,我們的時間要花在刀刃上,注重知識的體系性和框架的建立。
說實話,其實這些書籍或多或少都被各路大神推薦過,確實經(jīng)典。但是大神們卻很少告訴你他們是如何去看的,該怎么去看這些書,難道一本本一頁頁的挨著啃嗎?
這部分才是我今天最想說的部分,「該如何去看大厚書」。
比如我后臺就經(jīng)常有同學問:
這些書該怎么看,可能過來人,準備過秋招的都比較清楚,但是作為還在大二、大三的會比較懵逼。
就拿我當時親身經(jīng)歷來說,在網(wǎng)上搜網(wǎng)絡編程如何學習,很多人都推薦 UNP、APUE。
好嘛,買來看,從第一頁挨著挨著看,而且書中的示例代碼我大部分也照著敲了,最后看了七八章,發(fā)現(xiàn)始終是在學一些 socket api 和 系統(tǒng) api 的用法,沒摸到網(wǎng)絡編程的框架思維。
后面我又去搜,看到有人推薦《Linux高性能服務器編程》,去豆瓣看了下了目錄,似乎正是我想要的東西。
直接找來 PDF 開始看,果然這本書才真正讓我理解了網(wǎng)絡編程的整個套路和框架,學到了各種事件處理模式、計時器、信號處理、線程池這些網(wǎng)絡編程中很重要的東西。
當然 UNP 和 APUE 也是不能丟的,這兩本書我當做了字典查詢,比如學到了 IO 部分,回去看 UNP 中關于五種 IO 模型的介紹。
用到 connect、listen、bind 這些函數(shù),再回去看 UNP 第四章,不得不說,UNP 關于這些 socket API 的使用和各種異常情況的處理方式都介紹得非常詳細和深入,不愧是網(wǎng)絡編程領域的圣經(jīng)。
但是初學者看卻容易在細節(jié)中迷失,抓不到綱領,這也是這類書的缺點。
類似 UNP、APUE 這種書本身是面向知識體系的,而不是面向讀者,它們其實更像字典,把這個領域內(nèi)的所有知識,非常細致的堆疊在一起,看上去就是平鋪直敘,充斥著細節(jié),對讀者極其不友好。并且書里內(nèi)容實在大而全,很多根本不用學。
比如 UNP 講了 sctp 這種協(xié)議用法、多播、unix 域協(xié)議這些實際用得很少的東西,挨著看不僅會看不下去,而且比較浪費時間。
但是它們又是經(jīng)典的,確實是這些領域內(nèi)在體系性和深入性上都做得非常好的書。
什么書才是面向讀者的呢?
那就是抓住該領域的核心主干,提綱挈領,帶領讀者由淺入深,同時又有一定的細節(jié),看完讓人茅塞頓開。
比如《自頂向下》、《Linux高性能服務器編程》、《Linux多線程服務端編程》、《STL源碼剖析》、《Effective C++》、《CSAPP》、《程序員自我修養(yǎng)》等都有各自想要論述的主線在里面,看起來也是一環(huán)扣一環(huán),非常循序漸進。
我的看書方法就是對于面向知識體系那種堆砌細節(jié)的書,我們先瀏覽目錄,做到對整本書有映像,再大致看一些我們關心的部分,比如 UNP 和 APUE 中 IO、文件、進程控制、信號、線程、線程控制、基本套接字編程 這些是比較重要的模塊,其它邊角知識,可以用到再去查。
還有一點,很多同學反映看不懂類似 CSAPP 這樣的書,那我們都知道,任何一本書基本上都是有前置依賴的。
沒有掌握要求的背景知識去看肯定很吃力的。
就比如我大一下只有基礎的 C 知識和一丁點計算機導論知識,然后屁顛屁顛的跑去看 CSAPP(學長畢業(yè)擺地攤賣書我瞎買的),那時候只知道這本書被譽為神書,但是看到前兩三章就蒙了,真的有點難,對于當時的我來說太底層了,根本不知道在說啥,看過也只是看過,就像天空飛過鳥兒,但沒有痕跡。
直到后來大三再次拿起,我才意識到這本書的偉大之處就在于將計算機不同學科知識有機的串在了一起。那時候看,更多是一種補充、深入學習以及完善了,因為很多知識分別在數(shù)字邏輯、匯編語言、操作系統(tǒng)這些課程中學過了。
所以要明白,你看不懂不是因為你笨沒天賦,而是你有前置依賴的知識沒有完成,還沒學會走,就想跑了。
一般來說,每本書的首頁會介紹看這本書需要哪些前置知識,可以關注一下。
還有一種看書的方法,我在復習的時候采用過,那就是橫向?qū)W習。
比如我復習操作系統(tǒng),在《操作系統(tǒng):精髓和設計原理》中看到了關于內(nèi)存、虛擬內(nèi)存的各種介紹,看完理論再去看《Linux內(nèi)核設計與實現(xiàn)》12 章「虛擬內(nèi)存」、15 章『進程地址空間』,最后再去看《CSAPP》第 9 章『虛擬內(nèi)存』,這樣看下來,基本上內(nèi)存這塊理解得比較透了,這些書關于這塊的介紹是各有優(yōu)缺點的,正好互補。
又比如在《精髓與設計原理》中介紹了進程加載和鏈接,其實講得比較偏理論,看完還是覺得似懂非懂。
那我又會去《CSAPP》看第 7 章「鏈接」,這一章基本講清了靜態(tài)鏈接、目標文件、可重定位目標文件、引用解析、加載這些關于鏈接的核心概念,但是一個章節(jié)講這么多,難免不夠深入。
我又會去看《程序員自我修養(yǎng)》這本書第 4 章「靜態(tài)鏈接」、第 6 章 「可執(zhí)行文件的裝載與進程」、第 7 章 「動態(tài)鏈接」,這本書核心主題就是鏈接、加載,所以這一路看下來,對于鏈接、加載這塊基本上搞得比較透徹了,也許沒幾個面試官有你清楚。
同樣索引你也能從《數(shù)據(jù)庫系統(tǒng)概念》、《高性能MySQL》、《MySQL技術內(nèi)幕》中挑選對應的章節(jié),串起來看,取每本書優(yōu)點,這樣學習真的很高效也很深入。
這就是我在復習的時候采用的用知識點串聯(lián),跨多本書高效精準的復習方式,效果也很不錯,春招十幾次面試沒有一次因為這些基礎知識掛過。
啰嗦了一大堆,就是回答這些問題的:
“有些書看的找不到重點,看不下去了,怎么辦,比如深入理解計算機系統(tǒng),UNIX 網(wǎng)絡編程,APUE,求指教”、“我不是科班 CSAPP 可能不是全部看得懂,該怎么辦?”、“大佬,這么多書看得完嗎”、“剛開始看這些書很痛苦怎么辦”
這個不好說,根據(jù)你的基礎和學習效率不同,比如我大一、大二對于一些基礎的知識學得比較認真,基礎還算可以,按照這樣一套走下來也就大半年。大概每天花四五個小時以上吧。
如果真的是連計網(wǎng)、操作系統(tǒng)理論這樣的東西一點基礎都沒的話,那估計得一年以上,畢竟這些內(nèi)容基本覆蓋了科班的核心課程,人家上三年課,你一年解決,已經(jīng)算很快了好吧。
一年真的足夠從小白學起嗎?
感覺是差不太多的,但是估計得每天付出五六小時以上了,并且學習方法得當。
你去牛客就會發(fā)現(xiàn),存在各路大三、研一自學轉(zhuǎn)碼的同學,最后還能成為 offer 收割機,所以,不要懷疑一年不夠,最關鍵的是你要找到正確的路線,然后執(zhí)行下去。
文中推薦的書真的全部要看嗎?
當然不是,我自己都沒看完,但是我的策略已經(jīng)說過了,基本上大部分書都看了重要的章節(jié),這樣看起來是很快的。
并且隨著你看書越來越多,基礎越來越好,你會發(fā)現(xiàn)每本書前面幾章都是鋪墊基礎知識,大部分可以直接跳過,舉個例子
《Linux高性能服務器編程》這本書前幾章是這樣的:
你覺得這些章節(jié)在看過《自頂向下》、《TCP/IP詳解》之后還有必要看嗎?我反正是半天掃過去就完了。
最后,不管說再多方法,再多的路線,最終都需要自己花時間去啃、去執(zhí)行。
還有一個很多選擇 C++ 方向同學都存在的疑惑,在這里我也想解釋一下:
C++ 語言特性多,又難學,很多都是底層開發(fā)才會用到,C++ 就是個坑,是否應該轉(zhuǎn) Java、Go 呢?
當然不是的,的確在頭條、美團、阿里這種業(yè)務部門使用 Go、Java 系更多,首先還是那個觀點,校招生對于企業(yè)來說都是一張白紙,面試官考察的是你的基礎知識和聰明度,來決定是否有培養(yǎng)潛力,語言確實不重要。
那你可能會說,明明各種面經(jīng)上常常出現(xiàn) ConcurrentHashMap、虛表、虛函數(shù)實現(xiàn)機制這樣和語言強相關的問題。
在我看來啊,面試深入問一些語言實現(xiàn)細節(jié),其實不是在考你語言,而是看你是否有主動鉆研的意識,是不是只停留在應用的層面,同時也借語言考察一些數(shù)據(jù)結構、操作系統(tǒng)方面的基礎知識。
所以呢,我覺得 C/C++、Java、Go 你深入學習哪一個都可以,關鍵還是找對相應的學習路線,一直堅持學下去,不要每天都停留在我到底是學 Java 好還是 C++ 好這樣無解的問題。
另外,想對學 C++ 的同學說,可能你會發(fā)現(xiàn)身邊同學都在搞 Java、Go之類的,找工作缺少一些一起復習準備的朋友,有些甚至勸你別學 C++。那這個時候你一定要堅定自己的選擇,多在??突蛘呔W(wǎng)上找找同方向的朋友一起交流、學習。
說實話,就找工作這塊來說,個人覺得區(qū)別真的是不大的,不管從薪資、面試難度來說都是差不太多,更多的還是算法和基礎知識。
而且也有不少同學 Java 進騰訊需要轉(zhuǎn) C++,C++ 進阿里、美團需要轉(zhuǎn) Java 的,這都不是事兒。
那 C++ 目前應用場景有哪些呢?
一句話,對性能或者執(zhí)行效率要求比較高的應用,比如游戲引擎、infra、推薦引擎、存儲等,當然也能拿來寫業(yè)務(沒錯說的就是鵝廠),也有做 C++ 客戶端開發(fā)的,主要是 MFC、QT 等。
說實話,像游戲引擎、infra這類都是門檻比較高的,并且招聘的數(shù)量也有限,一般人很難進,而且目前互聯(lián)網(wǎng)公司的業(yè)務部門大多使用的是 Java、Go這類語言。
所以 C++ 的需求量是相比 Java、Go這類少很多的,但是同時學習 C++ 也沒 Java 那么多,所以相對來說競爭還沒那么大,并且 C++ 學的不錯,你同樣可以去面阿里、美團這種 Java 技術棧的公司,大廠基本不會限制語言的。
這里給一份我的面經(jīng)和刷題筆記, 包含各大廠Java、C++ 等面經(jīng), 看完一定有幫助:
pdf都可以在這個開源倉庫進行下載:
https://github.com/imarvinle/awesome-cs-books------update-----
這里有一份現(xiàn)代C++必學書單推薦:
編程指北:想學好 C++,這些書你必須知道 | C++學習路線還有另外一個谷歌大佬也出了一本,很棒:
編程指北:看完這本谷歌師兄的刷題筆記,直接秒殺了 200 道 LeetCode 算法題上面文章有所刪減,全文可以看看這里:
萬字長文 | 這可能是東半球最保姆級的后臺服務器開發(fā)學習路線
最后再給大家分享下我整理的這些書,可以在這里獲取,對于學習計算機的同學幫助非常大,且十分系統(tǒng):
這篇文章有點長,一下子可能一下子看不完,大家可以先收藏著,碼字太累了,收藏的時候也請來一個素質(zhì)三連哦~
在當今技術迅猛發(fā)展的時代,服務器端開發(fā)成為了軟件工程師的熱門領域。而C語言由于其高效性和靈活性,在服務器端開發(fā)中依然占據(jù)著重要地位。因此,接受一次系統(tǒng)的C語言服務器培訓將對您成為一名頂級C語言開發(fā)者起到至關重要的作用。
選擇一門適合自己的C語言服務器培訓課程意味著您將得到一套完善的知識體系,從而更好地應對日益復雜的服務器開發(fā)挑戰(zhàn)。一個理想的C語言服務器培訓課程應該具備以下幾個特點:
通過系統(tǒng)的C語言服務器培訓,您將獲得以下幾個顯著的益處:
C語言服務器培訓為您成為頂級C語言開發(fā)者鋪就了堅實的基礎。通過系統(tǒng)學習和實踐,您將能夠掌握服務器開發(fā)的關鍵技能,提高自身的就業(yè)競爭力,并在項目中迅速解決各種服務器開發(fā)難題。不要錯過這個機會,開啟您的C語言服務器培訓之旅吧!
感謝您閱讀本文,希望這篇文章能夠為您提供關于C語言服務器培訓的專業(yè)參考和實用指南。
如果有 C++ 背景可以考慮用 Thrift,這個需要服務器和客戶端一起使用。
如果只考慮服務器,Go 和 NodeJS 都是不錯的選擇,看看官方的例子就已經(jīng)比較清楚了?! ≈劣?socket 連接的穩(wěn)定性,主要還是在于 TCP 心跳檢測和數(shù)據(jù)重傳做的好不好,對于信道不好的情況,比如使用 3G 卡做聯(lián)網(wǎng)時,要每隔幾十秒就發(fā)一個沒有數(shù)據(jù)的心跳包,保證盡早檢測到斷線請求,盡早重連。服務器端性能應該問題不大,就算設備每秒鐘都發(fā)數(shù)據(jù)只要業(yè)務不太復雜就不會遇到什么瓶頸。C#是一種通用、面向?qū)ο蟮木幊陶Z言,廣泛應用于各種Web應用程序的開發(fā)。在C#開發(fā)中,Web服務器是一個非常重要的組成部分,它負責處理客戶端發(fā)送的HTTP請求,并返回相應的響應數(shù)據(jù)。下面我們就來介紹幾種常見的C#開發(fā)中使用的Web服務器。
IIS是微軟公司開發(fā)的Web服務器軟件,它是Windows操作系統(tǒng)的一部分,可以直接在Windows系統(tǒng)上安裝和使用。IIS支持多種Web應用程序技術,如ASP.NET、PHP、CGI等,是C#開發(fā)中最常用的Web服務器之一。IIS具有穩(wěn)定性高、性能優(yōu)異、安全性強等特點,是企業(yè)級Web應用程序的首選。
Kestrel是.NET Core框架內(nèi)置的跨平臺Web服務器,它是一個高性能的HTTP服務器,可以直接在C#應用程序中使用。Kestrel具有輕量級、跨平臺、可擴展等特點,非常適合用于開發(fā)微服務和容器化應用程序。Kestrel通常作為反向代理服務器的前端,與Nginx或Apache等服務器配合使用,提高應用程序的性能和可靠性。
Nginx是一款開源的高性能Web服務器和反向代理服務器,廣泛應用于各種Web應用程序的開發(fā)和部署。Nginx具有高并發(fā)處理能力、低內(nèi)存占用、易擴展等特點,非常適合用于處理大規(guī)模的Web流量。在C#開發(fā)中,Nginx通常作為反向代理服務器,與Kestrel等Web服務器配合使用,提高應用程序的性能和可靠性。
Apache是另一款廣泛使用的開源Web服務器軟件,它支持多種編程語言和Web應用程序技術,包括ASP.NET。Apache具有穩(wěn)定性高、擴展性強、安全性好等特點,是C#開發(fā)中常用的Web服務器之一。與Nginx類似,Apache也可以作為反向代理服務器,與Kestrel等Web服務器配合使用,提高應用程序的性能和可靠性。
總之,在C#開發(fā)中,IIS、Kestrel、Nginx和Apache是幾種常見的Web服務器選擇。每種Web服務器都有自己的特點和適用場景,開發(fā)者需要根據(jù)具體的項目需求和部署環(huán)境,選擇合適的Web服務器來部署和運行C#應用程序。
感謝您閱讀這篇文章,希望通過這篇文章,您可以了解到C#開發(fā)中常用的Web服務器,并能夠根據(jù)自己的需求選擇合適的Web服務器來部署和運行您的C#應用程序。