一個非科班生的逆襲之路
你好,我是坤哥,前不久收到一位讀者的 offer 咨詢,我一看好家伙,拿到了好幾個大廠的 offer,薪資都很給力

更為難能可貴的是這位朋友是非科班出身的,讀碩期間才轉的計算機,我覺得他的學習經驗對一些讀者應該會有幫助,所以邀請他給大家做了一次分享。
另外我想說的是近期雖然一些大廠裁員力度比較大,但我依然覺得互聯網行業(yè)依然是個值得投入的行業(yè),無論是薪資(畢竟一年頂其他行好幾年)還是競爭環(huán)境(無需復雜的人際關系,基本只憑技術說話)對普通人都非常友好,踏踏實實練好內功,不愁下家。一只站在樹上的鳥兒,從來不會害怕樹枝斷裂,因為它相信的不是樹枝,而是它自己的翅膀,希望這篇文章能幫助一些朋友順利卷入互聯網
2021秋招總結
1.寫在前
本人非科班,雙非本/211碩,雖然不是生化環(huán)材,但是就業(yè)前景也不是很樂觀。我身邊很多轉碼的同學,而且很多碩士,研究生現在真的越來越多了,可能大部分人讀研只是為了混個學歷,包括我。如果說你還是本科或者專科,如果沒有好的機遇,繼續(xù)深造還是對的,真正找一個自己喜歡的事并堅持做下去,難能可貴。我可能恰恰相反,也許有很多像我一樣的,讀研之后方向也不明確,被導師壓榨。
其實,我轉碼是受實驗室?guī)熜钟绊懀鳛橐粋€非科班的,從來沒想過自己以后會搞編程。轉碼的學習經歷也和很多同學相似,當時是和舍友一起,在秋招的時候才發(fā)現學院也有好幾個轉碼的。讀研期間最開始接觸的就是python了,好像研究生最開始學的大都是python,也有matlab,學習了半年多,然后就去學Java了。說真的,語言本身其實沒有那么重要,在學習初段可能只是接觸了常見語法和基本使用,好多東西往往是觸類旁通的,但是非要選擇一門語言,經過很多人的推薦,最終還是選擇了Java,原因還是Java生態(tài)強大,招聘的崗位也相對更多一些。也會出現入職后被要求使用另一種語言,比如遇到有些公司入職后要轉Go或者C語言,只要你能接受,大部分公司還是愿意的。總之,選擇一門語言就好,其他的有需要再去學,不在多,在精。
至于如何去學習,感覺自己做的并不好。其實,無非就是理論+實踐。理論最好是看一些比較權威的書籍,這樣會更加系統(tǒng)和全面,我大部分是看的技術博客和視頻,有利有弊,好處就是有些牛人的講解能夠深入淺出,但是我覺得忘得太快,可能是方法不對,而且有的地方沒有聯系起來;實踐是很重要的,小到一個排序算法、多線程demo,再到一個后臺系統(tǒng),都需要你去實踐。包括我在內,許多非科班同學的實踐能力可能比較弱,大佬除外,有時可能知道大體思路,但是總是"提筆忘字",總歸還是訓練的太少了,對于系統(tǒng)級的項目可以跟視頻或者幾個人一起做就好了。所以,理論和思考固然重要,多去練習更加重要,眼高手低是不對的。
2.時間線
2020.1-2021.3
這個階段正是寒假階段,比較重要,為什么呢?因為春招和實習一般在三月份就已經啟動了,如果早有準備,可以找找實習或者用春招鍛煉一下自己,以八股和算法,有項目更好了。如果你一點沒準備,一般是炮灰,大佬除外,很后悔當時沒有意識到這點。其實自己當時也在準備,但是還沒有進入“備戰(zhàn)”狀態(tài),只是慢悠悠的刷個算法題,效率比較低。所以,規(guī)劃好這個寒假。
2021.4-2021.6
這時候春招已經接近尾聲了,實習是可以找找的。但是自己太菜了,準備的太晚了,八股沒怎么看,算法也一般,基本上是一輪游,當時就面了兩三家,感覺自己啥也不會就繼續(xù)復習了。如果早做準備,多投幾家,情況會截然不同,因為實習難度會比秋招小很多,同時,作為非科班的同學,有一份實習經歷是非常重要的,你可以走實習轉正,也可以把實習作為跳板進入大廠。總之,找一份實習很重要,尤其是對非科班的同學。
2021.7-2021.10
這段時間一般就是秋招了,現在公司一般會把時間提前,不是過去的金九銀十了,應該是金八銀九。很多公司在七月份就放出提前批,可以多去嘗試,這不和秋招沖突,也就是你有兩次機會。比如,我當時投了美團提前批,但是只有客戶端崗位,然后栽在終面,面試官還是很厲害的,一針見血。后邊我又投了美團的正式批崗位,并拿到了正式批 offer,也可能是不同的部門,面試官沒有過問之前的面試。
之后又面試了字節(jié)提前批-客戶端,是內部實習的群友內推的,找一個能實時聯系的內推人還是挺好的。至于為什么是客戶端,當時也是隨便投了一下,周圍很多非科班的朋友也投了客戶端或者測開。這里說一下,客戶端比較難招到人,如果你想去大廠,會相對簡單點。后端投遞的人太多,但還是供不應求,選擇哪個方向要想清楚。
后邊我基本投遞的是后端的崗位,進入了海投階段,但是很多可能因為簡歷不符合都石沉大海了。結果就是之后的一個半月里從機試到 hr 面掛了一遍,差不多進入面試的有二三十個,包括百度、滴滴、阿里、榮耀、華為等等,但還是太菜了,整個秋招就是大碗掛面,有個公司流程很快(半天面完),比如百度系,有的公司能拖一個多月,比如小米、榮耀等,最后面試的是華為,是十一之后了。其實,到最后就已經很疲憊了,拒了好多公司的面試和筆試。所以,爭取在前期發(fā)力,不排除公司補錄,但是只能等集郵大佬拒絕 offer 之后才可以,主動權要掌握在自己手中。總之,秋招越早準備越好,公司 hc 比較多,精力也會相對更加充足,拿到 offer 的幾率就會比較大。
2021.11-2021.12
一般通過 hr 面之后,不出意外你會很快收到公司的意向書。之后就是開獎了,hr 會和你談薪,發(fā)正式 offer,這段時間往往是比較煎熬的,也是一場博弈,有些人單車變摩托,前提是你要有Argue的籌碼,比如你拿到了薪資更高或是大廠offer,亦或是你在大廠有實習經歷。一般很少有A沒的,有時會比較難,但還是要盡力嘗試一下。
注意,接收郵件offer,有的也叫兩方,這是不用賠違約金的,身邊很多朋友簽了兩方違約也沒賠錢。但是,還是謹慎考慮,一般會有截止時間,需要考慮清楚,企業(yè)招人成本也是很大的。三方就要更加慎重考慮了,如果沒想好,一定不要著急簽,如果被催,那就好好和hr說一下,就是盡量拖。也可以以逼簽為由催其他公司給你開獎,不是特別著急還是不建議。
當時也拿到了幾個Offer,比如字節(jié)、美團、百度、滴滴、轉轉、58、用友,大華,也有一些通訊公司,榮耀、華為、小米、中興。因為字節(jié)出來的比較早而且薪資還可以,所以拒了一些公司,簽了字節(jié),不久也被華為后端撈了,其實后期也一直在糾結后端和客戶端的崗位,也發(fā)現了很多和我相同困惑的朋友,有的堅持后端,有的去了客戶端,一般來說就是大廠和中廠,薪資差距這兩個因素吧。如何選擇,看看你當前最關注的兩個因素是什么了,魚與熊掌不可兼得,如果你知道你簽這家公司會有很好的發(fā)展,那你一定會簽,但是你不知道。
3.面經總結
下面主要總結了一些秋招過程中自己和周圍朋友遇到的面試高頻題,主要面試崗位還是后端和客戶端,網上也有很多面經,這里僅供參考。
基礎知識
(1)語言基礎(Java)
本人是Java選手,而且周圍朋友也是用的Java語言,這里只涉及秋招中遇到的Java高頻面試題。
Java虛擬機(JVM)很重要啦,高頻八股,比如JVM內存結構(各個部分的功能)、類加載機制(類的生命周期、雙親委派模型)、垃圾回收機制(可達性分析算法、Full GC、垃圾回收算法優(yōu)劣和適用場景、常見的垃圾回收器CMS和G1)、強軟弱虛四引用;
Java語言本身,比如包裝類與基本類型(緩存機制)、泛型的理解、String(不可變性,看看源碼是怎么重寫的)與StringBuffer/StringBuilder 區(qū)別、static關鍵字(修飾變量和方法)、final關鍵字(不能被重寫和繼承)、Java異常、Object 類有哪些方法;
面向對象的三大特性(最好結合場景理解)、重載與重寫、接口與抽象類、equals與==、hashcode 之間的區(qū)別、Java 內部類、Java是值傳遞(創(chuàng)建副本)、淺拷貝與深拷貝、反射機制(原理、優(yōu)缺點啥的,動態(tài)代理的實現方式之一,但是實際環(huán)境中用的 cglib,也要知道)、注解的基本原理。
(2)集合
Java的集合體系(Collection 和 Map 兩大接口)、集合存儲(是否能存儲null、是否有序/安全);
List(ArrayLis,LinkedList的區(qū)別、應用場景、擴容機制)、線程安全的List;
Map(HashMap和ConcurrentHashMap結構、jdk1.7和1.8的區(qū)別、get和put方法的流程、如何擴容、解決hash沖突的方法、線程安全性)。
(3)并發(fā)
創(chuàng)建線程的幾種方式(別忘了線程池)、啟動線程用 start 方法(區(qū)別 run 方法)、wait 與 sleep 方法的區(qū)別(最重要一點為是否釋放同步鎖)、線程的6種狀態(tài);
為什么用線程池、線程池的核心參數、線程池工作流程(核心線程數 -> 阻塞隊列* -> 最大線程數 -> 拒絕策略*)、線程池的 5 種狀態(tài);
說說多線程(或并發(fā))編程、并發(fā)編程的三大特性、JMM 模型(實現原理、內存屏障、happen-before原則)、ThreadLocal線程本地變量、死鎖的四個必要條件(缺一不可);
AQS關鍵字、Volatile關鍵字(弱同步機制,不能把保證線程安全)、synchronized 關鍵字(用法、底層實現、特性、鎖優(yōu)化)、ReentrantLock(特性,與 synchronized 區(qū)別)、樂觀鎖 CAS(如何實現,存在的問題以及如何去解決)、公平鎖與非公平鎖、鎖可重入性。
計算機基礎
(1)操作系統(tǒng)
說說進程與線程、進程的狀態(tài)與切換(就緒、運行與阻塞之間的轉換)、進程調度算法、進程之間的通信方式、進程同步、線程的通信方式(共享內存和消息傳遞)、fork 函數、銀行家算法;
內存的管理方式、邏輯地址與物理地址、頁面置換算法、什么是虛擬內存、生產者-消費者模型。
(2)計算機網絡
ISO 七層模型、HTTP各個版本之間的特性和區(qū)別、常用的 HTTP 方法(get 和 post 的區(qū)別)、HTTP的報文格式、常見的HTTP狀態(tài)碼、數字簽名、HTTPS(原理、與HTTP之間的聯系);
TCP三次握手與四次揮手(高頻問題、有很多細節(jié),比如狀態(tài)變化等)、TCP與UDP的區(qū)別、TCP怎么保證可靠傳輸、流量控制(滑動窗口機制)、擁塞控制、TCP粘包的解決方案;
DNS協(xié)議、輸入url到顯示的內部過程、Cookie 與 Session 的區(qū)別。
數據庫
(1)MySQL
內連接和(左/右外)連接、數據庫操作的基本命令(CRUD)、MySQL結構(Server層和存儲引擎層)、日志模塊(Redo log和Bin log)、SQL執(zhí)行很慢的原因、InnoDB和MyISAM的區(qū)別;
對 MySQL索引的理解、索引劃分(B+樹/哈希、聚簇/非聚簇區(qū)別)、主鍵索引與唯一索引的區(qū)別、回表查詢、創(chuàng)建索引需要注意什么、最左前綴原則;
事務(ACID特性)、事務的隔離級別(如何解決并發(fā)事務帶來的問題)、MVCC多版本控制原理;
MySQL 中有哪幾種鎖(按對數據的操作類型和粒度)、InnoDB 3種行鎖算法、MySQL死鎖。
(2)Redis
Redis基本特性、5 種基本數據類型(底層實現)、Redis 持久化機制(RDB/AOF)、緩存一致性、緩存雪崩/擊穿/穿透及對應的解決方案、為什么Redis是單線程,為什么Redis快?
數據結構與算法
(1)數據結構
數組:1. 兩數之和、15. 三數之和、53. 最大子序和、88. 合并兩個有序數組、33. 搜索旋轉排序數組、54. 螺旋矩陣、42. 接雨水、64. 最小路徑和、4. 尋找兩個正序數組的中位數、41. 缺失的第一個正數
、287. 尋找重復數、189. 旋轉數組、283. 移動零、128. 最長連續(xù)序列、162. 尋找峰值;
鏈表:206. 反轉鏈表、92. 反轉鏈表 II、143. 重排鏈表、19. 刪除鏈表的倒數第N個節(jié)點、21. 合并兩個有序鏈表、141. 環(huán)形鏈表、160. 相交鏈表、24. 兩兩交換鏈表中的節(jié)點、328. 奇偶鏈表、148. 排序鏈表、83. 刪除排序鏈表中的重復元素、82. 刪除排序鏈表中的重復元素II;
二叉樹:236. 二叉樹的最近公共祖先、102. 二叉樹的層序遍歷、103. 二叉樹的鋸齒形層次遍歷、199. 二叉樹的右視圖、94. 二叉樹的中序遍歷、104. 二叉樹的最大深度、110. 平衡二叉樹、129. 求根到葉子節(jié)點數字之和、662. 二叉樹最大寬度、112. 路徑總和;
哈希表:3. 無重復字符的最長子串、76. 最小覆蓋子串、136. 只出現一次的數字、349. 兩個數組的交集、242. 有效的字母異位詞、718. 最長重復子數組、560. 和為K的子數組;
棧與隊列:42. 接雨水、232. 用棧實現隊列、155. 最小棧、225. 用隊列實現棧、394. 字符串解碼、739. 每日溫度、84. 柱狀圖中最大的矩形、456. 132模式;
除此之外,還有并查集,前綴樹、堆。
(2)算法
排序算法(常考冒泡/插入/快排/歸并/堆排序)的基本思路、時間復雜度分析、穩(wěn)定性判定、常考手撕,補充題4. 手撕快速排序、56. 合并區(qū)間、253. 會議室 II、215. 數組中的第K個最大元素;
動態(tài)規(guī)劃(DP):53. 最大子序和、5. 最長回文子串、300. 最長上升子序列、70. 爬樓梯、72. 編輯距離、91. 解碼方法、44. 通配符匹配、494. 目標和、647. 回文子串、376. 擺動序列、279. 完全平方數、718. 最長重復子數組、1143. 最長公共子序列;
回溯算法:93. 復原IP地址、面試題 08.12. 八皇后、51. N皇后、46. 全排列、78. 子集、39. 組合總和、17. 電話號碼的字母組合、77. 組合、40. 組合總和 II、47. 全排列 II;
常考算法還有滑動窗口、二分查找、雙指針、貪心算法,LRU。
項目
當時簡歷上就寫了個RPC,但感覺現在人均RPC了,其實本來有寫分布式的項目(尚硅谷),但是自己不是很熟,就沒寫;另外,寫了兩個實驗室項目湊數,一個深度學習算法,另一個偏向系統(tǒng)設計。
(1)RPC
講講這個項目你做了啥,有什么同類型的技術(比如Dubbo,gRPC),你去看過嗎?
RPC的調用流程是什么,客戶端怎么調用服務(動態(tài)代理,創(chuàng)建代理類),服務端掛掉怎么辦?
如何實現對象的序列化和反序列化,幾種常見的序列化方式(Json、Kryo、Hessian);
網絡傳輸(通信交互),我用的是Netty框架,基本原理、線性模型、零拷貝;
服務注冊與發(fā)現,我用的Nacos,或者是用Zookeeper,為什么用它搞清楚;
其他:比如線程池使用,負載均衡策略,設計模式(責任鏈模式)。
(2)實驗室項目
這類項目面試官一般是不懂的,需要你去講,就用star法則就好了,比如介紹一下項目背景,做了啥,你的職責,取得了什么結果,也可以說說你的感想和收獲;
在這一部分,我在有些項目中擔任負責人,面試官就會問很多場景題,怎么去解決問題,這種問題答案比較開放,注意邏輯清晰就好了。
其他
(1)框架
客戶端沒要求,如果是后端崗位,主要就是SSM、Spring全家桶,包括Spring的兩大核心組件(iOC和AOP經常問),Spring Boot自動裝配原理,Spring MVC的執(zhí)行流程;
我被問最多的就是 RPC,設計細節(jié),為什么用這個組件,怎么通信,還有延伸出的場景題。
根據每個人的項目,可能接觸其他框架。有點需要注意,了解框架底層是加分項,但如果你簡歷或者項目沒用到,面試官也不會問,切記不懂裝懂。如果真的被問到,你不熟悉,你可以說你使用過,但是底層源碼還沒看到這里,轉移話題(你比較熟悉的),比如正在看jdk源碼,集合的源碼等。
(2)設計模式
六大設計原則,基本思想、每個設計原則最好想一個經典的案例;
常見的設計模式, 理解并了解使用場景(自己項目中用到更好),比如單例模式(會手寫其中的一種方式,線程安全性分析)、代理模式、工廠模式、觀察者模式,適配器模式。
4.一些建議
早做準備,注意總結
寒假時間很關鍵,要注重效率和總結,包括算法和八股。比較好的辦法是寫博客,這樣便于后期復習,可以在任意的平臺,我當時記錄在簡書上了,寫的時候直接用word可以,當時龍哥就是用 word 整理了一些八股總結,不過直接用 markdown 更加方便一些,更適合隨時貼代碼。
算法題是一個長期積累的過程,主要就是 leetcode 和劍指 offer,面試題也大都出自這里,在精不在多,應對秋招兩三百道 leetcode 足矣,但是如果你有時間多刷肯定是好的。算法題幾乎占據了秋招的半壁江山,遇到有個群友三面做了九道算法題,學好算法進大廠也不是夢。對于剛開始準備的同學可以看看左神的算法課程,講的比較清楚。
八股文的話,初期還是建議多看看書,或者看看視頻也可以,無論看什么一定要總結。如果到了寒假就要有針對性的去準備,無非就是語言本身、數據結構與算法、計算機基礎(網絡和操作系統(tǒng)),還有就是一些常見的設計模式,框架也要了解一些,這個在網上有很多技術博客總結和視頻。
以面代練,注重復盤
在秋招剛開始,我是有點畏懼面試的,總是感覺自己沒準備好,不是這沒看就是那沒看。其實,只要你邁出那一步,一切都煙消云散。面試是檢驗你復習成果的最好方式,也能最高效的找出你當前的漏洞。同時,你可以借此機會和面試官溝通,比如一些技術問題,保持一種謙遜的態(tài)度是很重要。排除一些大佬吊打面試官,我一般是被面試官吊打的那種。
面試復盤很重要!你面試下來肯定會存在很多問題,也許是技術問題、也可能是溝通表達,最好做一下記錄。看牛客網很多人會去寫面經,這是很好的,記錄一些問題,方便自己,也能幫助其他人。我這個地方做的不好,最開始是用筆去記,后邊會用手機錄音,記錄整個面試過程(但是幾乎沒去聽過)。我遇到不止一次被問到相同的問題,但是總是感覺自己回答的不好。所以,一定要復盤,重點關注自己不會的或者回答不是特別流暢的問題。
Coding 一般是面試的最后一個環(huán)節(jié),但有的公司上來就是算法題。雖然 Coding 能力是一個積累的過程,但是算法臨陣磨槍卻有奇效,就是面哪個公司刷該公司的高頻面試題,比如看看codetop 或者找找牛客網面經。一般公司會使用賽碼網或者牛客網出算法題,可以直接運行,不用寫輸入輸出;但是有些公司也會自己出題或者自己描述(原題居多),記得有一次,面試官口述算法題,說了半天是個兩數之和,測試用例還是錯的。還有一點就是遇到簡單題要矜持,不要一兩分鐘就做出來了。做題前后多和面試官交流,一定先嘗試去寫,如果真的一頭霧水,可以說說思路,也可以讓面試官換題,這是下策,我沒有試過,但是我朋友有一次換了題之后也沒做出來,就很尷尬;做出來的,可以嘗試多解(面試官一般也只是讓你說說思路)。
邏輯清楚,自信沉穩(wěn)
面試回答過程中,邏輯一定要清楚。客觀題也要組織好語言,可以開門見山,上來給出答案,緊接著給出解釋或者自己的理解;也可以先解釋分析,最后給出總結。總之,讓面試官知道你在說什么,尤其是在介紹項目的時候,怎么能夠通過幾句話把一件事描述清楚也是不簡單的,如果不知道怎么組織語言,Star法則是很好的模板。
客觀題一般兩種問法,一是自由發(fā)揮,比如說說虛擬機、多線程等,這種范圍比較大,回答要全面,而且回答經得住面試官推敲的問題,簡單來說,就是引導面試官往自己準備的問題,切記說自己不會的,給自己挖坑。同時,一些問題需要總結,可以借此說說自己的理解,錯了也沒關系;另一個是具體問題,這種情況很可能會遇到自己的盲點,因為面試官對你不了解,只能隨便問,這里有一個技巧就是通過簡歷或者自我介紹引導面試官,把自己熟知的內容寫在簡歷,我曾遇到不止一個面試官對著簡歷提問。如果真遇到自己的盲點,那就盡量平行遷移,回答相似的技術問題,有時答非所問(適用少部分題目,有時候是你真的搞混了),有些不計較的面試官直接就過了,這是下策,我之前就被美團終面面試官吊打,可能也有壓力面的成分。
另外,自我介紹是非常重要的,是開場戲,也可以緩解緊張。注意,稿子還是要背的,但是一定要很自然和自信的說出來,把每一個想呈現給面試官的點說清楚,可以說說自己的一些經歷,但最好還是專業(yè)一些,不要抓住自己的愛好長篇大論,有實習和項目經歷就可以聊聊了(我是非科班的,就說了說在實驗室做了啥),不宜過長,建議30~90秒吧。面試官一般都很好,語氣和態(tài)度都很好,一般很少遇到奇葩。因此,放慢語速,保持自信和沉穩(wěn),想清楚再說,至少想想自己會不會,確定一條主線,就是回答的方向。
以上均是一個非科班轉碼菜鳥的拙見和感想,如果有不當之處還請大佬們指正,希望能幫助到也想轉碼的朋友!
5.資料推薦
編程書籍
Java語言:《Java編程思想》、《Java核心技術 卷1》;
算法:《算法》(第四版)、《程序員面試指南》、《劍指Offer》;
計算機網絡:《圖解HTTP》、《計算機網絡》(自頂向下方法);
數據庫:《MySQL必知必會》;
其他:《鳥哥Linux私房菜》、《圖解設計模式》、《重構》;
視頻推薦
黑馬程序員/尚硅谷/狂神
左神算法
極客時間
博客網站
知識點總結:CS-Notes/JavaGuide
算法題解:windliang/代碼隨想錄(c++)/liweiwei1419/Krahets/labuladong
刷題網站:牛客網/Leetcode/Codetop企業(yè)題庫/AcWing
你好,我是坤哥,前獨角獸技術專家,現創(chuàng)業(yè)者,持續(xù)分享個人的成長收獲,歡迎大家加我微信,圍觀朋友圈,關注我一定能提升你的視野,讓我們一起進階吧!

2萬字系統(tǒng)總結,帶你實現Linux命令自由

小學就開始學編程了,恐怖如斯!

炸了!JetBrains 宣布:IntelliJ IDEA 徹底棄用 Log4j。。
— 【 THE END 】— 公眾號[程序員黃小斜]全部博文已整理成一個目錄,請在公眾號里回復「m」獲取! 最近面試BAT,整理一份面試資料《Java面試BATJ通關手冊》,覆蓋了Java核心技術、JVM、Java并發(fā)、SSM、微服務、數據庫、數據結構等等。
獲取方式:點“在看”,關注公眾號并回復 PDF 領取,更多內容陸續(xù)奉上。
文章有幫助的話,在看,轉發(fā)吧。
謝謝支持喲 (*^__^*)
