2021 屆本科,從我和身邊同學拿到的offer來看,去一二線大廠的普遍能拿到30w以上,月薪20k上下,甚至有更高的。
說實話,現在技術崗(主要指后端(Java、C++、Go........)之。
能做到以下幾點,拿到一二線大廠offer 20K 上下的薪資非常容易:
- 算法題,技術面試筆試都考這個,所以Leetcode至少得刷兩三百道吧,《劍指offer》所有題目過一遍,搞過ACM當然更好,不刷題的話,那只有掛等著你了,畢竟現在很卷,面試官也只能通過算法題來加大篩選。
在這里也送大家一本幫助我拿到BAT 等一線大廠 offer 的算法筆記,是一位ucloud大神寫的,對于算法薄弱或者需要提高的同學都十分受用,算法一定是計算機學習的重中之重:
BAT面試官編寫的leetcode刷題筆記,看完秒殺80%的題目
- 數據結構,不要求你手寫紅黑樹,但是 AVL 哈希表 堆這些簡單的數據結構得自己實現過;鏈表、線性表必須熟悉到不能再熟悉,語言的標準庫實現得了解下吧?什么 Java hashmap,C++ vector 你得知道實現吧。
- 計算機系統知識,內存、堆棧、函數調用、數的表示等等,至少《CSAPP》得過一遍吧?(PS:這本書真的很適合程序員補齊計算機基礎。
- 操作系統,這些東西你總得知道吧:
- 操作系統由哪些構成、進程的狀態、切換、調度
- 進程間通信方式(共享內存、管道、消息)、進程和線程的區別、線程的實現方式(一對一、多對一等)
- 互斥與同步(信號量、管程、鎖)、死鎖檢測與避免
- 并發經典的問題:讀者寫者、哲學家就餐問題
- 為什么需要虛擬內存,MMU 具體如何做地址轉換的
- 內存為什么分段、分頁、頁面置換算法
- 文件系統是如何組織的、虛擬文件系統(VFS)是如何抽象的
最好再結合Linux實現看下,推薦《Linux內核設計與實現》,比如linux中就沒有線程和進程的區分,就是一個task_struct
另外,學習操作系統我也非常推薦去做下 MIT6.828,實現一些線程管理、文件系統等,計算機科班不就是搞這些的么。
- 計算機網絡,這個感覺相對簡單,但是計網知識比較繁雜,很多同學都反映網絡很難學,一大堆的網絡協議,依次學完后,還是不知道網絡是怎么構成的。
這就是沒有用對學習方法,導致只見樹木,不見森林。
學習時,推薦你抓住一條主線 「一個數據包是如何發送出去的?」
帶著這個問題依次去學應用層、傳輸層、網絡層、鏈路層,思考這些層之間是如何串聯起來的。
這就是自頂向下的思路,那自然要推薦:
這本書從我們最常接觸的 HTTP、FTP、SMTP 等應用層協議講起,可以清晰看到引入各個層的作用。
學習每層協議的時候,最好自己抓包看下,wireshark抓包遇到三次快速重傳會怎么樣?這樣映像會更加深刻
另外說一點,學習的時候注意收集優質的資源,并歸檔,比如我自己整理的電子書庫,絕不是在網上那種打包下載的,而是自己需要學到某個方向知識的時候,需要看了,去網上挨個找的,最后匯總而成。這部分我是會不斷把它完善的,當成自己的小電子書庫,不多,但貴在精。
我整理的這些書大家可以在這里獲取,對于學習計算機的同學學習以及校招復習幫助非常大,且十分系統:
書單:
計算機必看經典書單
- 數據庫:sql得會寫吧,這個推薦看下《SQL必知必會》,幾個范式有沒有正式運用過? 如何進行領域建模、數據庫設計,才能夠使得每次查詢的開銷最小?
數據庫原理方面可以看看《數據庫系統概念》,這本書挺厚的,包含了從 SQL 到數據庫設計再到數據庫原理、分布式數據庫都有,可以挑著看,比如關系模型、數據庫設計(三大范式)、數據磁盤存儲和組織方式、索引、并發控制等。
當然了整個數據庫最重要的還是索引和并發控制(鎖、MVCC等),這部分也是面試常考的:
- 索引存儲結構:B樹、B+樹索引、Hash索引
- 索引的使用:主鍵索引、覆蓋索引、最左前綴原則、索引下推等
- 鎖:樂觀鎖、悲觀鎖、表鎖,行鎖,意向鎖,讀鎖,寫鎖等等
- MySQL InnoDB MVCC 實現機制
- 存儲引擎:InnoDB、MyISAM等,各自的優缺點
- 事務:ACID理論
這部分推薦兩本書:
- 網絡編程,后臺開發基本是離不開網絡編程的,其實甚至整個后臺開發也可以看做是在做網絡編程。
只不過別人的框架幫我們做了協議解析、網絡數據傳輸、解封包這些底層操作。
比如 SpringBoot 這種保姆級框架,基本上屬于將一個框架能干的事都干完了,以至于我們開發業務只需要定義接收和返回包的數據格式,然后做邏輯處理就完了。
像序列化、解封包、IO 處理這種網絡編程必備的臟活業務開發根本不會接觸到。
但是網絡編程技能還是很重要的,特別是對于 Linux C++ 開發來說。
Linux 下網絡編程核心的包括系統編程和網絡 IO 兩個部分:
- 進程間通信方式: 信號量、管道、共享內存、socket 等
- 多線程編程:互斥鎖、條件變量、讀寫鎖、線程池等
- 五大 IO 模型:同步、異步、阻塞、非阻塞、信號驅動
- 高性能 IO 兩種模式:Reactor 和 Proactor( 但是 Linux 下由于缺少異步 IO 支持,基本沒有 Proactor
- IO 復用機制:epoll、select、poll(破解 C10K 問題的利器)
推薦幾本書:
- 《Linux高性能服務器編程》
- 《Unix網絡編程》
- 《Unix環境高級編程》
- 編程語言:雖然說語言不重要,但是總得擅長一門語言吧?C++的話,那幾本書(Effective三部曲,《Effective C++》、《More Effective C++》、《Effective STL》、STL 源碼剖析、對象模型)都得過一遍吧? Java的話,JVM原理得看下吧?GC 得看下吧?JDK重要集合類庫得看吧
- 項目:說句實話,學校里接觸的項目能有多高大上?如果只是用幾個框架的那種,我建議不要寫到簡歷上,不如去github上參與開源項目,GSOC了解一下?當然如果你的實驗室很厲害,跟導師做的項目很牛逼另說。還有一條路就是上面的5,6,7,任何一個花上半年時間去實現一個簡陋的原型(比如實現一個簡單的內核),都是非常好的簡歷加分項。事實上,國外名校這些課的最后的project都是讓你實現一個原型。
- 英語: 這個面試一般不會涉及到(除非是英文面試),但是我仍然認為英語是很重要的能力。具體的來說,就是“遇到一個撒比問題不去打擾同事自己谷歌或者bing從stackoverflow找到回答并且獨立解決” 或者“老板讓我去接觸一個沒搞過的東西我硬著頭皮點開文檔看了兩天兩頁終于能解決問題” 的能力。
- 信息采集能力:對于學校不太好(非C9)的同學,這個能力其實是最關鍵的。最優秀的同齡人在學習些什么?我想去的公司想招聘什么樣的人才?面試會問什么?春招秋招到底是什么,如何投遞?實習真的很重要嗎? 這些問題,你去百度,去知乎搜索,去牛客網搜索,其實都有回答。為什么說這個能力重要?舉個例子,BAT熱門崗位留給秋招的坑寥寥無幾,因為坑都被實習轉正的同學占了,如果你之前不知道春招,沒有去實習,能去BAT熱門崗位的機會自然就很渺茫了。又比如,秋招各家公司筆試難度都明顯高于面試難度,原因一方面是篩人,另一方面是筆試作弊現象很嚴重。如果你知道春招、秋招提前批是不用筆試的,是不是你的機會又多了幾分?
- 社交能力:幾個關鍵字:頭條白金碼 、組內直推 自己去牛客搜索吧。
以上是對本科研發崗的要求。算法崗和研究生的要求我不太清楚,想必只會更高。
當然,我上面說的這些要求,對于絕大多數同學來說都非常遙不可及。
但是,如果你在一個很普通的高校,不拿最高的標準要求自己,那你的結局就是和你的那些學長學姐一樣,去個普普通通的公司,過普普通通的一生。
另外,如果你還是大一、大二的學弟學妹,再給幾點建議:
其實這是我一直推崇的 CS 科班學生的典型學習路線,基本上基礎課跟著國外 CS 名校課程來,準沒錯。
能夠做到 50%,應該國內 BAT 這種公司的 offer 就比較好拿了,但是問題在于,我們剛上大學的時候其實很難從一開始就有如此清晰而明確的規劃。
不少同學往往是到了大三下,發現身邊有同學都拿到頭條、ucloud的實習offer了,突然意識到,好像快要找工作了。
然后才匆匆開始認真撿起來學習,而平時都是把老師布置的作業完成就好了。
所以對于還在校的CS專業學弟學妹,有幾點建議:
- 提高信息搜索、采集能力
做公眾號這段時間,很多同學問我要xx Lab的資料,csapp的 lab 資料,其實我想說這些東西我去找和你去找都是一樣的,打開Google,輸入對我發的那些關鍵字,你就能找到。
而且你找到的將會是一手資料,而我發給你以及諸如網盤上下載的,其實都是 N 手了。 - 多看信息密度大、質量高的資料
比如那些經典的書籍、課程,不要整天在CSDN、掘金這些博客平臺逛,當然,我不是說這些博客都不好。
而是,你學習的資料,大概決定了你所能學到知識的上限,這些博客大多也是作者看完了其它書、專欄之后自己寫的總結。
快速了解可以看博客,但是想要學得深入,不該省的時間終究是省不了的。
自己看書,雖然更費時間,但是知識會更加的系統和全面。 - 要有危機意識
現在計算機很火,各種轉碼、跨考計算機的同學很多,競爭也很大,每年看牛客上的經驗貼,都會發現,cpp primer 雖然很厚,但總會有人過了兩三遍,而你也許一遍還沒過完,也總有人 leetcode 刷了七八百道,而你也許直到面試前,劍指offer還沒看完呢。
想要拿到滿意的offer,就早點開始認真學習、好好準備、刷題,面向就業學習蠻好的。 - 每個人都能學好計算機,你需要的是持續不斷的努力
我們會在各種論壇上看到一些前輩侃侃而談他們的經驗,也許有很多技巧、有天賦。
但最本質的一定是他們持續不斷的付出,一萬小時定律我一直堅信。
換到 CS 專業,可以類比出”10 W行代碼”定律,在本科四年,或者研究生三年,不說10w 行,幾萬行代碼總的有吧。
寫代碼很多情況下,就是無他,唯手熟爾。
自己粗略的統計了下,加上寫的各種 lab,大學寫的代碼應該是接近10w 行的。 - 最后,在這里送大家算法筆記,幫助我和一起找工作的同學拿到BAT 等一線大廠 offer ,是一位ucloud大神和谷歌大佬寫的,包含了C++、Go、Java等版本,對于算法薄弱或者需要提高的同學都十分受用,算法一定是計算機學習的重中之重:
贊同0