這位非科班出身的讀者好猛!(附C 復(fù)習(xí)路線)
時(shí)間:2021-10-14 16:55:09
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]今天分享的這位老哥是真的猛,我們一起往下看吧。這篇文章會對正在準(zhǔn)備秋招的你幫助很大,建議收藏!以下為正文作者:xu背景某中上985傳統(tǒng)工科本碩,本科期間只上過大學(xué)生程序設(shè)計(jì)和微機(jī)原理兩門計(jì)算機(jī)相關(guān)的公共基礎(chǔ)課。研一開始準(zhǔn)備轉(zhuǎn)行,恰好研一暑假因?yàn)橐咔闊o法返校,遂背著老師投遞了華為中...
今天分享的這位老哥是真的猛,我們一起往下看吧。
這篇文章會對正在準(zhǔn)備秋招的你幫助很大,建議收藏!
以下為正文
作者:xu
考研的基礎(chǔ)課程能讓你很大程度地接近科班學(xué)生的基礎(chǔ)。推薦 b 站的王道考研課程,可以二倍速快速過一遍,配合講義標(biāo)注一些重點(diǎn),日后可以反復(fù)觀看。
這些基礎(chǔ)不僅能方便日后學(xué)習(xí)編程語言和擴(kuò)展知識時(shí)的理解,在秋招面試中也經(jīng)常會涉及。
這里重點(diǎn)提一下算法 算法和數(shù)據(jù)結(jié)構(gòu)課程中涉及的知識都是非?;A(chǔ)的,一定要熟稔于心。在這個(gè)基礎(chǔ)上可以刷 leetcode 題來提升自己的能力。
通常剛開始刷會有一些曲折,比如遇到的題經(jīng)常不會,然后一道題寫大半天。
我一般遇到不會的題超過 10 分鐘沒思路就會看題解,然后按題解的思路再嘗試自己寫出來。如果實(shí)在寫不出來就照著題解自己敲一遍,仔細(xì)領(lǐng)會每一句代碼的意圖。然后再做標(biāo)記,第二天或者過幾天我會再嘗試自己寫一遍。
重復(fù)幾遍就會了,這樣至少能保證你刷到過的題你都能掌握。刷題順序的話,推薦按分類刷。我個(gè)人用的大力出奇跡,直接按題號順序刷,但是一開始刷的會有點(diǎn)吃力。
另外的話可以刷一刷每日一題和周賽。春招前我大概刷了 600 的題,周賽全國排名 3000 。
數(shù)據(jù)庫:寫一個(gè)簡易數(shù)據(jù)庫,這個(gè)部分可以看 MIT 的數(shù)據(jù)庫課程,里面的作業(yè)就是寫一個(gè)數(shù)據(jù)庫。除此之外,前面提到 redis 就是用 C 寫的,所以也可以用 C 寫一個(gè)類似的簡易版非關(guān)系型數(shù)據(jù)庫。
tinySTL:實(shí)現(xiàn) STL 常用的容器和函數(shù),能夠?qū)Φ讓訑?shù)據(jù)結(jié)構(gòu)有更清晰的認(rèn)識。
rpc:rpc 是分布式系統(tǒng)中最重要的一環(huán),可以參考 Dubbo 和 grpc 實(shí)現(xiàn)一個(gè)簡易 RPC
flamingo:如果時(shí)間充裕的話,推薦這個(gè),寫一個(gè)類似 QQ 的軟件。github 上搜一下就有,感覺比較牛逼,而且資料和教程都很全。
選擇合適的數(shù)據(jù)結(jié)構(gòu),比如之前的筆試題:如果按題目的意圖,可能你要建立鏈表節(jié)點(diǎn)的結(jié)構(gòu),然后針對輸入去解析數(shù)字,構(gòu)建鏈表,寫翻轉(zhuǎn)鏈表的函數(shù),再遍歷鏈表輸出。
但實(shí)際上,這題只需要用字符串就可以,對整個(gè)輸入的字符串做 reverse,再針對每一個(gè)數(shù)進(jìn)行一次 reverse 就可以了。
取巧,對于一些輸出 true/false 或者數(shù)字的題,實(shí)在寫不出來,隨便打印一個(gè)答案可能就能拿幾十分。
項(xiàng)目上每一個(gè)點(diǎn),都要問自己:除了這樣做還能怎么做,你為什么選擇這樣做,這樣做的優(yōu)點(diǎn)是什么,以及這樣做的底層是怎么實(shí)現(xiàn)的。比如我做的網(wǎng)絡(luò)庫,最常見的問題:select,poll,epoll 優(yōu)缺點(diǎn),選擇的原因,底層原理。
當(dāng)你回答完之后,再往下挖,可能就會問 epoll 為什么用紅黑樹,紅黑樹的底層原理和優(yōu)缺點(diǎn)。知識點(diǎn)要學(xué)會發(fā)散。
比如問完紅黑樹,面試官可能會問你其他的樹和數(shù)據(jù)結(jié)構(gòu),比如 avl 樹和紅黑樹的區(qū)別,紅黑樹和快表的區(qū)別。
再發(fā)散問,可能問 redis 為什么用快表不用紅黑樹??傊跍?zhǔn)備面試時(shí)也要學(xué)會發(fā)散地思考。
很多時(shí)候,面試官可能不了解 C ,或者說投遞的崗位不是用的 C ,所以面試官不會問很多 C 的知識,而是會問一些操作系統(tǒng)或者網(wǎng)絡(luò)或者數(shù)據(jù)庫等通用的知識,因此這些通用的基礎(chǔ)知識一定要扎實(shí),否則怎么能比得過那些語言對口的競爭者呢
掌握主動(dòng)權(quán),面試官的問題很多都是從你的角度來問的,比如你的簡歷提到了 xxx,那么你講一下 xxx 吧。再比如,你剛剛回答里面提到了 xxx,那么你講一下 xxx。所以,自己是能夠掌握一些面試中的主動(dòng)權(quán)的。
因此,自己掌握的知識點(diǎn)和看過的書都可以在簡歷上有所體現(xiàn),在簡歷中的每一個(gè)點(diǎn)都足夠熟悉,不熟悉的不放上去。然后在回答問題中,也要盡量回答自己熟悉的點(diǎn),對于不熟悉的點(diǎn)可以快速帶過,對熟悉的點(diǎn)可以適當(dāng)展開。
面試過程中要適當(dāng)反問面試官,了解面試官提問的意圖,可也以讓他給你做適當(dāng)?shù)奶崾?。比如一個(gè)很泛的問題可能你覺得有好幾個(gè)方面,所以要了解面試官想讓你深入哪個(gè)方面。
分享一個(gè)編程設(shè)計(jì)小技巧(沒有兩三年工作經(jīng)驗(yàn)估計(jì)看不懂)
多線程學(xué)習(xí)指南
這里收集了100多篇C 原創(chuàng)文章(入門進(jìn)階必備)
點(diǎn)個(gè)在看你最好看
這篇文章會對正在準(zhǔn)備秋招的你幫助很大,建議收藏!
以下為正文
作者:xu
背景
某中上 985 傳統(tǒng)工科本碩,本科期間只上過大學(xué)生程序設(shè)計(jì)和微機(jī)原理兩門計(jì)算機(jī)相關(guān)的公共基礎(chǔ)課。研一開始準(zhǔn)備轉(zhuǎn)行,恰好研一暑假因?yàn)橐咔闊o法返校,遂背著老師投遞了華為中央軟件院的暑期實(shí)習(xí)(非應(yīng)屆投遞暑期實(shí)習(xí)是有風(fēng)險(xiǎn)的),華為對計(jì)算機(jī)基礎(chǔ)要求比較低,對學(xué)歷背景較好的非科班同學(xué)比較友好。研二暑假通過了百度,字節(jié),阿里,騰訊,美團(tuán),攜程的后端開發(fā)崗實(shí)習(xí),去了阿里淘系實(shí)習(xí),秋招目前收獲阿里,字節(jié),拼多多,美團(tuán),網(wǎng)易意向書,騰訊,華為,米哈游錄用排序中。在春秋招的面試基本沒有掛過。個(gè)人心得
基礎(chǔ)知識:
基礎(chǔ)知識是非科班和科班區(qū)別很大的一部分??瓢嘤幸徽紫到y(tǒng)的計(jì)算機(jī)學(xué)科培養(yǎng)體系。我在準(zhǔn)備基礎(chǔ)的時(shí)候是按照考研課程進(jìn)行系統(tǒng)學(xué)習(xí)的。考研的基礎(chǔ)課程能讓你很大程度地接近科班學(xué)生的基礎(chǔ)。推薦 b 站的王道考研課程,可以二倍速快速過一遍,配合講義標(biāo)注一些重點(diǎn),日后可以反復(fù)觀看。
這些基礎(chǔ)不僅能方便日后學(xué)習(xí)編程語言和擴(kuò)展知識時(shí)的理解,在秋招面試中也經(jīng)常會涉及。
這里重點(diǎn)提一下算法 算法和數(shù)據(jù)結(jié)構(gòu)課程中涉及的知識都是非?;A(chǔ)的,一定要熟稔于心。在這個(gè)基礎(chǔ)上可以刷 leetcode 題來提升自己的能力。
通常剛開始刷會有一些曲折,比如遇到的題經(jīng)常不會,然后一道題寫大半天。
我一般遇到不會的題超過 10 分鐘沒思路就會看題解,然后按題解的思路再嘗試自己寫出來。如果實(shí)在寫不出來就照著題解自己敲一遍,仔細(xì)領(lǐng)會每一句代碼的意圖。然后再做標(biāo)記,第二天或者過幾天我會再嘗試自己寫一遍。
重復(fù)幾遍就會了,這樣至少能保證你刷到過的題你都能掌握。刷題順序的話,推薦按分類刷。我個(gè)人用的大力出奇跡,直接按題號順序刷,但是一開始刷的會有點(diǎn)吃力。
另外的話可以刷一刷每日一題和周賽。春招前我大概刷了 600 的題,周賽全國排名 3000 。
編程語言
C 和 C 語言其實(shí)很像。上述算法與數(shù)據(jù)結(jié)構(gòu)課程的或者說理工科學(xué)校應(yīng)該都會有的程序設(shè)計(jì)類的基礎(chǔ)課都會教一些 C 語言的基礎(chǔ)。在這些基礎(chǔ)上,看下列書應(yīng)該就足夠了。下面的書我基本上都看過一遍或者挑章節(jié)看過,受益匪淺。當(dāng)然,語言還是要多用多寫,可以通過刷題和項(xiàng)目來反復(fù)鞏固和記憶。書籍推薦
- 《C primier》第五版,比較厚,但是很全面,可以慢慢看
- 《STL 源碼剖析》,可以配合 b 站侯捷的視頻一起食用,講得非常好。
- 《深入理解 C 對象模型》,看前幾章應(yīng)該就夠了
- 《Effective C 》,個(gè)人感覺書上的知識點(diǎn)有些陳舊
- 《Modern Effective C 》,有 C 11 新特性
- 《C 并發(fā)編程實(shí)戰(zhàn)》,學(xué)習(xí)并發(fā)的基礎(chǔ)知識就夠了,書在實(shí)現(xiàn)上用的 C 11 多線程,但在實(shí)際的開發(fā)中使用的大多是 posix 多線程。
C 崗位的選擇
C 的崗位相比與 java 會相對少一些的。java 擁有更好的生態(tài),使得它在業(yè)務(wù)開發(fā)上可以更靈活和方便,不過校招一般不會對語言做限制。如果大家在秋招中想繼續(xù)從事 c 相關(guān)的開發(fā),那可以留意一下以下 C 崗位??梢匀タ纯垂倬W(wǎng)對應(yīng)的 JD,然后對自己感興趣的崗位做針對性的查漏補(bǔ)缺:- 游戲服務(wù)端和客戶端:網(wǎng)易互娛和雷火、米哈游、騰訊 IEG
- 推薦和搜索引擎:阿里和 pdd 兩家 Java 為主的大廠,在這塊用的都是 C
- 機(jī)器人、自動(dòng)駕駛開發(fā):無人駕駛企業(yè),華為車 BU
- 音視頻流開發(fā),比如 B 站
- 用 C 比較多的互聯(lián)網(wǎng)企業(yè):騰訊和百度
擴(kuò)展知識
這個(gè)部分我就介紹以下自己看得一些視頻和書,給大家做參考。linux
linux 是后端開發(fā)工程師必知必會的操作系統(tǒng),而且要對底層原理有詳細(xì)的了解。- 《深入理解 Linux 內(nèi)核》可以結(jié)合操作系統(tǒng)課程對照著來看,有些部分在實(shí)際實(shí)現(xiàn)上和操作系統(tǒng)課程所講的有些出入。
- 《UNIX 環(huán)境高級編程》 堪稱圣經(jīng)的 APUE,介紹的是 unix 系統(tǒng)的基本原理和系統(tǒng)調(diào)用,可以說是必看。覺得書太厚了看不下的推薦一個(gè) B 站的課程,講得非常好,可以跳過前面數(shù)據(jù)結(jié)構(gòu)的部分直接看后面的。
- 《UNIX 網(wǎng)絡(luò)編程》介紹了 UNIX 網(wǎng)絡(luò)方面的原理和調(diào)用方法,是對 APUE 的擴(kuò)充。如果這本書看不下去的可以直接看下面這本。
- 《Linux 多線程服務(wù)端編程:使用 muduo C 網(wǎng)絡(luò)庫》介紹了如何使用 C 開發(fā)高性能服務(wù)器,這本書個(gè)人認(rèn)為寫的非常好,我也是照著這本書寫了自己的服務(wù)器的項(xiàng)目。
- man 手冊,可以直接在命令行查看系統(tǒng)調(diào)用的使用方法
數(shù)據(jù)庫
- 數(shù)據(jù)庫基本原理,B 站有很多類似的課程,我看的是東南大學(xué)的數(shù)據(jù)庫原理及應(yīng)用
- 《Mysql 必知必會》,講 mysql 的用法,也可以去看 B 站狂神的視頻
- 《MySQL 技術(shù)內(nèi)幕 InnoDB 存儲引擎》這本書寫得非常不錯(cuò),有很多面試常見的知識點(diǎn)
Nosql
- 《Redis 設(shè)計(jì)與實(shí)現(xiàn)》介紹了 redis 的源碼設(shè)計(jì),redis 有很多設(shè)計(jì)非常巧妙的數(shù)據(jù)結(jié)構(gòu),以及它在時(shí)間和空間上的高性能是怎么做的??傊锩嬗泻芏嘧屓擞∠笊羁痰狞c(diǎn)。另外 redis 本身是用 c 語言寫的,所以感興趣的話還可以直接去看源碼。
- b 站狂神講 redis 使用講的也挺好的
GCC GDB
這部分都是 C 開發(fā)和調(diào)試的輔助工具,有些面試比較喜歡問這個(gè),b 站也有類似視頻,都大同小異,我這部分準(zhǔn)備地也不好- 常見編譯選項(xiàng)
- GDB 原理
- GDB 常用命令
- 線上進(jìn)程如何調(diào)試
設(shè)計(jì)模式
- 常見的設(shè)計(jì)模式用途和優(yōu)缺點(diǎn)
- b 站上有設(shè)計(jì)模式的課程,我看的是李建忠的課程,感覺講得挺好的
分布式系統(tǒng)設(shè)計(jì)
- 這部分知道 CAP/BASE 是啥應(yīng)該就夠了,我看了一遍這個(gè),感覺和沒看一樣哈哈
docker
這部分的話只是自己感興趣所以看的,面試一般不會問- b 站狂神的 docker 教程教你如何使用 docker
- 《自己動(dòng)手寫 docker》教你如何實(shí)現(xiàn)一個(gè) docker,以及 docker 底層的原理。docker 是用 go 寫的,還可以順帶學(xué)一下 go,照著敲一遍最后寫出來還是蠻有成就感的。
關(guān)于項(xiàng)目
C 一般都是用來造輪子,所以在項(xiàng)目上大多都是偏底層的一些工具。和 Java 選手對比起來,在面試中會吃虧一些,Java 選手對高并發(fā),實(shí)際的業(yè)務(wù)場景中的問題和解決方法會有更深刻的認(rèn)識。下面舉一些常見的項(xiàng)目:網(wǎng)絡(luò)庫/web 服務(wù)器:基本 C 的人手一個(gè),??鸵灿匈u類似的課程,我也是參考 muduo 寫的。這個(gè)的話最好測一測 QPS 來體現(xiàn)那能達(dá)到的效果數(shù)據(jù)庫:寫一個(gè)簡易數(shù)據(jù)庫,這個(gè)部分可以看 MIT 的數(shù)據(jù)庫課程,里面的作業(yè)就是寫一個(gè)數(shù)據(jù)庫。除此之外,前面提到 redis 就是用 C 寫的,所以也可以用 C 寫一個(gè)類似的簡易版非關(guān)系型數(shù)據(jù)庫。
tinySTL:實(shí)現(xiàn) STL 常用的容器和函數(shù),能夠?qū)Φ讓訑?shù)據(jù)結(jié)構(gòu)有更清晰的認(rèn)識。
rpc:rpc 是分布式系統(tǒng)中最重要的一環(huán),可以參考 Dubbo 和 grpc 實(shí)現(xiàn)一個(gè)簡易 RPC
flamingo:如果時(shí)間充裕的話,推薦這個(gè),寫一個(gè)類似 QQ 的軟件。github 上搜一下就有,感覺比較牛逼,而且資料和教程都很全。
關(guān)于筆試
筆試通常都是ACM 模式,需要自己處理輸入和輸出,對 C 其實(shí)不太友好輸入的處理,未給定行數(shù)的情況,不知道行數(shù),可以用?string?s;
?while(cin>>s)?{
??...
?}//可以讀到EOF
萬能頭文件#include//包含了所有常用的頭文件
//??秃唾愸R都能用,有些編譯器不支持
學(xué)點(diǎn) python,前面提到,筆試對 C 其實(shí)不太友好,比如筆試經(jīng)常會用到字符分割,字符串和數(shù)字轉(zhuǎn)換,C 可能要寫 for 分割,用 atoi 或者 to_string 做轉(zhuǎn)換,用 python 就會很方便。再比如一些大數(shù)相加,用 C 只能用字符串或者鏈表來做加法,python 就不用考慮溢出選擇合適的數(shù)據(jù)結(jié)構(gòu),比如之前的筆試題:如果按題目的意圖,可能你要建立鏈表節(jié)點(diǎn)的結(jié)構(gòu),然后針對輸入去解析數(shù)字,構(gòu)建鏈表,寫翻轉(zhuǎn)鏈表的函數(shù),再遍歷鏈表輸出。
但實(shí)際上,這題只需要用字符串就可以,對整個(gè)輸入的字符串做 reverse,再針對每一個(gè)數(shù)進(jìn)行一次 reverse 就可以了。
取巧,對于一些輸出 true/false 或者數(shù)字的題,實(shí)在寫不出來,隨便打印一個(gè)答案可能就能拿幾十分。
//翻轉(zhuǎn)鏈表
//輸入:1,23,456,78
//輸出:78,456,23,1
其他一些輔助手段一些 ACM 選手喜歡加一些這樣的操作提高碼字速度和 IO 速度,但個(gè)人感覺對于一般的筆試而言,提升效果有限。//1、cin的效率不如scanf,cin會有緩沖區(qū)??梢詤⒖糀CM比賽時(shí)用到的優(yōu)化方法
//2、用宏定義,比如#define?pair?PII,這樣每次敲定義的時(shí)候只要敲PII就夠了
#include?
using?namespace?std;
//#define?ACM_LOCAL
#define?fi?first
#define?se?second
#define?il?inline
#define?re?register
const?int?N?=?1e5? ?10;
const?int?M?=?5e5? ?10;
const?int?INF?=?0x3f3f3f3f;
const?double?eps?=?1e-5;
const?int?MOD?=?1e9;
typedef?long?long?ll;
typedef?pair<int,?int>?PII;
typedef?unsigned?long?long?ull;
int?main()?{
?ios::sync_with_stdio(0);
?cin.tie(0);
?cout.tie(0);
?//solve
}
關(guān)于面試
面經(jīng)非常重要,面試中一半的問題都可以在??兔娼?jīng)中找到。因此可以找??蜕舷嚓P(guān)高質(zhì)量的面經(jīng)自己做整理然后過一遍。
面試一般分為基礎(chǔ)知識和項(xiàng)目經(jīng)歷兩部分,如果項(xiàng)目經(jīng)歷比較少就會著重問基礎(chǔ),如果面試官對項(xiàng)目經(jīng)歷感興趣可能全部都會問項(xiàng)目。項(xiàng)目上每一個(gè)點(diǎn),都要問自己:除了這樣做還能怎么做,你為什么選擇這樣做,這樣做的優(yōu)點(diǎn)是什么,以及這樣做的底層是怎么實(shí)現(xiàn)的。比如我做的網(wǎng)絡(luò)庫,最常見的問題:select,poll,epoll 優(yōu)缺點(diǎn),選擇的原因,底層原理。
當(dāng)你回答完之后,再往下挖,可能就會問 epoll 為什么用紅黑樹,紅黑樹的底層原理和優(yōu)缺點(diǎn)。知識點(diǎn)要學(xué)會發(fā)散。
比如問完紅黑樹,面試官可能會問你其他的樹和數(shù)據(jù)結(jié)構(gòu),比如 avl 樹和紅黑樹的區(qū)別,紅黑樹和快表的區(qū)別。
再發(fā)散問,可能問 redis 為什么用快表不用紅黑樹??傊跍?zhǔn)備面試時(shí)也要學(xué)會發(fā)散地思考。
很多時(shí)候,面試官可能不了解 C ,或者說投遞的崗位不是用的 C ,所以面試官不會問很多 C 的知識,而是會問一些操作系統(tǒng)或者網(wǎng)絡(luò)或者數(shù)據(jù)庫等通用的知識,因此這些通用的基礎(chǔ)知識一定要扎實(shí),否則怎么能比得過那些語言對口的競爭者呢
掌握主動(dòng)權(quán),面試官的問題很多都是從你的角度來問的,比如你的簡歷提到了 xxx,那么你講一下 xxx 吧。再比如,你剛剛回答里面提到了 xxx,那么你講一下 xxx。所以,自己是能夠掌握一些面試中的主動(dòng)權(quán)的。
因此,自己掌握的知識點(diǎn)和看過的書都可以在簡歷上有所體現(xiàn),在簡歷中的每一個(gè)點(diǎn)都足夠熟悉,不熟悉的不放上去。然后在回答問題中,也要盡量回答自己熟悉的點(diǎn),對于不熟悉的點(diǎn)可以快速帶過,對熟悉的點(diǎn)可以適當(dāng)展開。
面試過程中要適當(dāng)反問面試官,了解面試官提問的意圖,可也以讓他給你做適當(dāng)?shù)奶崾?。比如一個(gè)很泛的問題可能你覺得有好幾個(gè)方面,所以要了解面試官想讓你深入哪個(gè)方面。
總結(jié)
以上是個(gè)人的一點(diǎn)心得,僅供參考,不一定適合所有人。因?yàn)樽约簩?dǎo)師比較放養(yǎng),給了我很多空閑的時(shí)間可以去學(xué)習(xí)自己感興趣的東西,也真的非常感謝我的導(dǎo)師,希望能讓我順利畢業(yè)哈哈哈。后續(xù)我也會整理一些面經(jīng),希望能幫助到大家。分享一個(gè)編程設(shè)計(jì)小技巧(沒有兩三年工作經(jīng)驗(yàn)估計(jì)看不懂)
多線程學(xué)習(xí)指南
這里收集了100多篇C 原創(chuàng)文章(入門進(jìn)階必備)
點(diǎn)個(gè)在看你最好看