之前答應大家,會邀請一些,剛參加完秋招的 offer 收割機,給大家分享一下,面試心得和復習路線。
背景
個人心得
基礎知識:
基礎知識是非科班和科班區別很大的一部分。科班有一整套系統的計算機學科培養體系。我在準備基礎的時候是按照考研課程進行系統學習的。
考研的基礎課程能讓你很大程度地接近科班學生的基礎。推薦 b 站的王道考研課程,可以二倍速快速過一遍,配合講義標注一些重點,日后可以反復觀看。
這些基礎不僅能方便日后學習編程語言和擴展知識時的理解,在秋招面試中也經常會涉及。
這里重點提一下算法 算法和數據結構課程中涉及的知識都是非常基礎的,一定要熟稔于心。在這個基礎上可以刷 leetcode 題來提升自己的能力。
通常剛開始刷會有一些曲折,比如遇到的題經常不會,然后一道題寫大半天。
我一般遇到不會的題超過 10 分鐘沒思路就會看題解,然后按題解的思路再嘗試自己寫出來。如果實在寫不出來就照著題解自己敲一遍,仔細領會每一句代碼的意圖。然后再做標記,第二天或者過幾天我會再嘗試自己寫一遍。
重復幾遍就會了,這樣至少能保證你刷到過的題你都能掌握。刷題順序的話,推薦按分類刷。我個人用的大力出奇跡,直接按題號順序刷,但是一開始刷的會有點吃力。
另外的話可以刷一刷每日一題和周賽。春招前我大概刷了 600+的題,周賽全國排名 3000+。

編程語言
書籍推薦
《C++primier》第五版,比較厚,但是很全面,可以慢慢看 《STL 源碼剖析》,可以配合 b 站侯捷的視頻一起食用,講得非常好。 《深入理解 C++對象模型》,看前幾章應該就夠了 《Effective C++》,個人感覺書上的知識點有些陳舊 《Modern Effective C++》,有 C++11 新特性 《C++并發編程實戰》,學習并發的基礎知識就夠了,書在實現上用的 C++11 多線程,但在實際的開發中使用的大多是 posix 多線程。
C++崗位的選擇
游戲服務端和客戶端:網易互娛和雷火、米哈游、騰訊 IEG 推薦和搜索引擎:阿里和 pdd 兩家 Java 為主的大廠,在這塊用的都是 C++ 機器人、自動駕駛開發:無人駕駛企業,華為車 BU 音視頻流開發,比如 B 站 用 C++比較多的互聯網企業:騰訊和百度
擴展知識
linux
《深入理解 Linux 內核》可以結合操作系統課程對照著來看,有些部分在實際實現上和操作系統課程所講的有些出入。 《UNIX 環境高級編程》 堪稱圣經的 APUE,介紹的是 unix 系統的基本原理和系統調用,可以說是必看。覺得書太厚了看不下的推薦一個 B 站的課程,講得非常好,可以跳過前面數據結構的部分直接看后面的。 《UNIX 網絡編程》介紹了 UNIX 網絡方面的原理和調用方法,是對 APUE 的擴充。如果這本書看不下去的可以直接看下面這本。 《Linux 多線程服務端編程:使用 muduo C++網絡庫》介紹了如何使用 C++開發高性能服務器,這本書個人認為寫的非常好,我也是照著這本書寫了自己的服務器的項目。 man 手冊,可以直接在命令行查看系統調用的使用方法
數據庫
數據庫基本原理,B 站有很多類似的課程,我看的是東南大學的數據庫原理及應用 《Mysql 必知必會》,講 mysql 的用法,也可以去看 B 站狂神的視頻 《MySQL 技術內幕 InnoDB 存儲引擎》這本書寫得非常不錯,有很多面試常見的知識點
Nosql
《Redis 設計與實現》介紹了 redis 的源碼設計,redis 有很多設計非常巧妙的數據結構,以及它在時間和空間上的高性能是怎么做的。總之里面有很多讓人印象深刻的點。另外 redis 本身是用 c 語言寫的,所以感興趣的話還可以直接去看源碼。 b 站狂神講 redis 使用講的也挺好的
GCC+GDB
常見編譯選項 GDB 原理 GDB 常用命令 線上進程如何調試
設計模式
常見的設計模式用途和優缺點 b 站上有設計模式的課程,我看的是李建忠的課程,感覺講得挺好的
分布式系統設計
這部分知道 CAP/BASE 是啥應該就夠了,我看了一遍這個,感覺和沒看一樣哈哈
docker
這部分的話只是自己感興趣所以看的,面試一般不會問
b 站狂神的 docker 教程教你如何使用 docker 《自己動手寫 docker》教你如何實現一個 docker,以及 docker 底層的原理。docker 是用 go 寫的,還可以順帶學一下 go,照著敲一遍最后寫出來還是蠻有成就感的。
關于項目
tinySTL:實現 STL 常用的容器和函數,能夠對底層數據結構有更清晰的認識。
rpc:rpc 是分布式系統中最重要的一環,可以參考 Dubbo 和 grpc 實現一個簡易 RPC
flamingo:如果時間充裕的話,推薦這個,寫一個類似 QQ 的軟件。github 上搜一下就有,感覺比較牛逼,而且資料和教程都很全。
關于筆試
筆試通常都是ACM 模式,需要自己處理輸入和輸出,對 C++其實不太友好
輸入的處理,未給定行數的情況,不知道行數,可以用
string s;
while(cin>>s) {
...
}//可以讀到EOF
#include<bits/stdc++.h>//包含了所有常用的頭文件
//牛客和賽馬都能用,有些編譯器不支持
學點 python,前面提到,筆試對 C++其實不太友好,比如筆試經常會用到字符分割,字符串和數字轉換,C++可能要寫 for 分割,用 atoi 或者 to_string 做轉換,用 python 就會很方便。再比如一些大數相加,用 C++只能用字符串或者鏈表來做加法,python 就不用考慮溢出
選擇合適的數據結構,比如之前的筆試題:如果按題目的意圖,可能你要建立鏈表節點的結構,然后針對輸入去解析數字,構建鏈表,寫翻轉鏈表的函數,再遍歷鏈表輸出。
但實際上,這題只需要用字符串就可以,對整個輸入的字符串做 reverse,再針對每一個數進行一次 reverse 就可以了。
取巧,對于一些輸出 true/false 或者數字的題,實在寫不出來,隨便打印一個答案可能就能拿幾十分。
//翻轉鏈表
//輸入:1,23,456,78
//輸出:78,456,23,1
其他一些輔助手段一些 ACM 選手喜歡加一些這樣的操作提高碼字速度和 IO 速度,但個人感覺對于一般的筆試而言,提升效果有限。
//1、cin的效率不如scanf,cin會有緩沖區。可以參考ACM比賽時用到的優化方法
//2、用宏定義,比如#define pair<int, int> PII,這樣每次敲定義的時候只要敲PII就夠了
#include <bits/stdc++.h>
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
}
關于面試
面經非常重要,面試中一半的問題都可以在牛客面經中找到。因此可以找牛客上相關高質量的面經自己做整理然后過一遍。
面試一般分為基礎知識和項目經歷兩部分,如果項目經歷比較少就會著重問基礎,如果面試官對項目經歷感興趣可能全部都會問項目。
項目上每一個點,都要問自己:除了這樣做還能怎么做,你為什么選擇這樣做,這樣做的優點是什么,以及這樣做的底層是怎么實現的。比如我做的網絡庫,最常見的問題:select,poll,epoll 優缺點,選擇的原因,底層原理。
當你回答完之后,再往下挖,可能就會問 epoll 為什么用紅黑樹,紅黑樹的底層原理和優缺點。知識點要學會發散。
比如問完紅黑樹,面試官可能會問你其他的樹和數據結構,比如 avl 樹和紅黑樹的區別,紅黑樹和快表的區別。
再發散問,可能問 redis 為什么用快表不用紅黑樹。總之,在準備面試時也要學會發散地思考。
很多時候,面試官可能不了解 C++,或者說投遞的崗位不是用的 C++,所以面試官不會問很多 C++的知識,而是會問一些操作系統或者網絡或者數據庫等通用的知識,因此這些通用的基礎知識一定要扎實,否則怎么能比得過那些語言對口的競爭者呢
掌握主動權,面試官的問題很多都是從你的角度來問的,比如你的簡歷提到了 xxx,那么你講一下 xxx 吧。再比如,你剛剛回答里面提到了 xxx,那么你講一下 xxx。所以,自己是能夠掌握一些面試中的主動權的。
因此,自己掌握的知識點和看過的書都可以在簡歷上有所體現,在簡歷中的每一個點都足夠熟悉,不熟悉的不放上去。然后在回答問題中,也要盡量回答自己熟悉的點,對于不熟悉的點可以快速帶過,對熟悉的點可以適當展開。
面試過程中要適當反問面試官,了解面試官提問的意圖,可也以讓他給你做適當的提示。比如一個很泛的問題可能你覺得有好幾個方面,所以要了解面試官想讓你深入哪個方面。
總結
以上是個人的一點心得,僅供參考,不一定適合所有人。因為自己導師比較放養,給了我很多空閑的時間可以去學習自己感興趣的東西,也真的非常感謝我的導師,希望能讓我順利畢業哈哈哈。后續我也會整理一些面經,希望能幫助到大家。
只要你肯踏實努力,進大廠遠比你想象的要容易。切記在學習的過程中,保持謙虛,不要眼高手低,一步一個腳印,踏實進步。希望在明年的秋天聽到你們的好消息。
另外如果想要加入秋招小隊的同學,可以在公眾號后臺回復 校招/社招。
往期推薦