新人報道,沒有什么可分享的,就記錄一些自己求職的體會和心得。
我是在校招的時候參加了今日頭條的招聘,崗位是C++,最后成功拿到了入場券。但是這也絲毫不值得驕傲,大家都知道:技術日新月異,要是幾個月不更新自己的技術棧,就會被時代淘汰。簡單點說,我那個在學習scratch編程的小學生弟弟,都會關注MIT LKG團隊是否更新版本,3.0來了,那么2.0對不起了,轉手拋棄。
(更何況大佬那么多,我不過是個才入門的小弱雞~)
以下是我總結進入頭條的兩大決定性因素:
一是,刷面經和筆試題非常關鍵。你將會在搜集資料的過程中了解到頭條系的狀況,具體崗位所面臨的問題和筆面試的風格特征,做到有備無患。
二是,面試官會更偏愛邏輯思維強的人,在網上就有這樣一個例子:
且不說這個故事真實性如何,其中頭條系的風格是被體現得淋漓盡致。畢竟理工男是真的多,在工作中,會特別講究邏輯思維。沒有邏輯的人,是混不下去。
最后給大家分享一下我的面試過程,希望能給大家一些參考。
(題目順序有些不分先后,但大致有序)
第一面(50 min)
1、進程和線程的區別和其使用等
常規題。
2、tcp和udp的區別
常規題。
3、http協議和https協議的不同和其大概原理
還好前幾天看了一篇HTTPS的科普,我就講了一下https的加密方法,和公鑰私鑰的使用。
4、三次握手和四次揮手的過程和為何如此設計的原因
TCP連接是雙工的,圍繞這一點說了很多。
5、linux了解嘛?說一下基礎命令,做過linux的相關開發嗎?
不了解,基本命令也不會,很尷尬。
6、智能指針了解嗎?說一下
說了shared_ptr和auto_ptr這些,講了一下它們的表現效果和使用時機,還有可能造成的錯誤。
7、寫一下中序遍歷的非遞歸寫法
其實以前沒實現過非遞歸的,在紙上畫了一下,想到用棧,然后兩分鍾寫好就直接過了
8、幾個sizeof的題,就是int* a=malloc(10),cout<<sizeof(a)<<endl之類。
關鍵是還答錯了一個,很尷尬
9、多線程的同步方法和如何使用
鎖
中斷
信號量
原子操作
…
10、進程間通信的方法,還有它和socket通信的相同和不同點在哪兒,使用時機是何時?
管道
消息
共享文件
11、linux的進程間通信和windows有何不同?是否了解?
其實應該是消息機制的不同,沒說好。
面完面試官說馬上有第二面,等幾分鍾,我說ok,然后很快另外一個面試官就來進行第二面。
第二面(1 h 29 m)
1、聊項目,你這個項目的這個點是怎么實現的,難點在哪兒?
2、說說你做的最難的一個項目,講一下為什么,難點在哪兒?
3、說說你收獲最大的一個項目,說說為什么?
然后和我說了很久的項目的細節和效果表現
4、malloc和alloc的區別
為了說點我擅長的地方,我額外講了一下操作系統的頁和操作系統對進程的內存分配方式還有段頁的情況,內存碎片,還有malloc背后的空閑內存鏈表,然后回答了問題——兩者的不同點。
5、你實現的vector和STL的vector的區別和優越性。
空間復雜度很高,但是時間復雜度比STL的要低。
6、vector何時進行空間的搬運?
老問題。
7、大批量對象的搬運進行了怎樣的優化?
講了一下placement new 和operator new的不同表現,和通過placement new進行內存搬運的優點
8、為什么要vector的新空間為2倍?
我記不太清了,就隨便說了一下內存對齊之類的。
9、找出其他所有的數都出現兩次的數組中只出現一次的數。
這個一直想不起來最優解,關鍵是我以前刷過這個題。
先說了一個直接冒泡比較的暴力方法,然后用快排思想想了一個優化方法,還用到了map,就是想不起來異或這個簡單的方法,真是讓人頭大。
10、現場寫代碼,翻轉句子中的單詞(如hello world – > olleh dlrow),翻轉句子中單詞的順序(hello world --> world helllo)
這道題后一個也一直沒想出最優解。
差不多就是這樣了,感覺編程題的算法不算很難,但主要是考驗你的代碼能力和debug能力,對於基礎這些問的很仔細和全面,操作系統,C++,網絡,linux,數據結構和基本工作會用到的算法,都問了一個遍,問了的基本上都答上了(除了linux方面的東西,我直接說的我不太熟悉就沒再問了)。
面完第二天給我打電話約第二天晚上面試,然后第二天早上給我打電話,因為面試官臨時有事更改到了后一天,其實這樣也好,緩解了一下我的緊張。
第三面(45min)
感覺這面答得不算太好,雖然全都能說很久,但是深度沒說上去,一直在說車軲轆話。
1、自我介紹
2、介紹一下你的這幾個項目
3、你這個項目的細節
然后就一直在交流我的項目,說了挺久,感覺面試官是這方面的大佬
4、項目細節和我具體項目有關,就不多說了
5、講一下malloc的整過程
然后一樣的說。
6、講一下如何設計內存管理系統
我說要根據不同的使用習慣來構建不同的分配和管理策略,然后就說了一下不同情況如何進行內存管理。
7、如何進行內存碎片的管理?
我這里的確有點忘記了,就大致說了一下malloc的解決方式,感覺沒說好。
8、智能指針的實現方法
三面都有這個題,我就說了一下我熟悉的兩個auto和shared。
9、那你用代碼來實現一下這個shared_ptr
我就寫了一下,模版編程,第一次寫完一運行,爆了很多頁的錯,然后慢慢改,花了十多分鍾,最后也算寫好了。
然后寫了一段測試跑了一下,然后又有點錯,然后又改,慢慢完善,然后面試就基本上要結束了。
10、一段代碼,說一下運行結果
class A {
public: void f1() { }
virtual void f2() {}
};
A* a = nullptr;
a->f1();
a->f2();
1
2
3
4
5
6
7
比較簡單,但是直接說出來肯定沒什么亮點。
就再說了一下this指針,然后講了一下類與成員函數的關系,如何通過編譯器的方式去實現的成員函數,和成員變量的訪問方式……
11、有什么想問的嗎?
問了幾個組內的情況和我如果能進的話做什么的情況,就結束了。
以上~
希望能對大家有些幫助。