知乎萬贊:程序員如何才能拿到20K?
大家好,我是小林。
昨天在知乎上看到了一個問題:
程序員需要達到什么水平才能順利拿到 20k 無壓力?

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