當(dāng)前位置:首頁 > 公眾號精選 > 程序喵大人
[導(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

背景

某中上 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è)在看你最好看

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉