Hey guys, 這裡是程式設計師cxuan,歡迎你收看我最新一期的文章,今天這篇文章源自於我一個忠實讀者的親身經歷,這篇文章寫了他從大一開始到進入騰訊的一系列感悟和總結,希望能夠幫到你。
菜雞歷險記
從二月底開始投簡歷,到四月拿到offer,我的春招結束了!
選擇直接工作,而不是想大多數人一樣選擇讀研,真的是一個很艱難的決定,參加校招所經歷的迷茫擔憂焦慮也不亞於參加一場研究生招生考試。
大學伊始,幾乎和大多數人一樣,我也想當一名好學生,像助班一樣閃耀,拿到高績點,參加各路競賽,獲取保研資格,把簡歷塞的滿滿當當,懵懂的認知甚至讓我在當時一度陷入唯績點論的思維,專心埋頭苦幹。
非常遺憾的是,在大一要結束的那一段時間裡,低到讓人抬不起頭來的gpa才讓我意識到並逐漸接受,自己也許真的不擅長考試(說到底還是菜 找藉口),即便大一也聽努力,gpa依然很低,這讓我開始逐漸懷疑起自己的能力。
現在看來績點固然重要,但其能夠證明的東西其實比較有限(起碼在計算機領域),除非確實很拔尖,其實大學裡很多課程都懂的。。在這裡我並不想去批判大學的教育,只希望gpa不要成為量化學生能力的唯一指標和對他人產生傲慢與偏見的理由。
在大一結束的那個暑假,搬到了新校區,開始新的生活,從那一段時間開始,我偶然間發現自己對各種amazing的技術有著十足的興趣,從爬蟲到web,從資料分析到機器學習,基本都有過一段時間的接觸,那段時間幾乎成為了我技術的啟蒙階段。
時間兜兜轉轉來到了大二,憑藉著自己對技術能力的熱愛,我滿懷自信的提交了轉去計院的轉專業申請,第一志願,上機考掛,第二志願,上機考過了缺掛在了面試上,一問原因才得知竟是績點低 + 大一掛了一門通識課。毫不誇張的說,在當時對我的打擊真的很大,質疑自己的聲音在我腦子裡不斷迴響,"你一個非科班比得過別人計算機系的同學嗎?" "你學技術不是在不務正業嗎!??" 那個時候幾乎因此喪到極點,而如果想再下一個學期轉專業將面臨著降級。
但是在那一學期,也有一些好事發生。在大二上憑藉我對技術的興趣,引起了Python課老師的注意,並邀請我加入其課題組,後面老師也變成了我的導師。我也很順理成章的結識了幾位研究生學長,在那段日子裡,幾乎有讀不完的論文,看不完的演算法,一切都很新奇,似乎很快就把我轉專業失敗的負能量拋之腦後。
晃晃悠悠大二就快結束了。雖然感覺演算法領域真的很酷,我也曾幻想著自己能一頭扎入人工智慧的領域,並且在導師的帶領下學習了一段時間,期間也參加了個比賽拿了個獎和水了一篇專例,其實在內心真的很感激,能在大學生涯遇到這樣一位願意為本科生付出如此心血的導師真的是我莫大的榮幸。但是反過來說,雖然演算法真的挺有意思也非常熱門,但其門檻真的很高而且競爭也越來越激烈。
如何看待2019年秋招演算法崗灰飛煙滅?
如何看待演算法崗一片紅海諸神黃昏?
。。。
各路985碩士海歸,頂會論文,top競賽balabala,著實勸退。本身對論文數學不感興趣的我最後還是放棄了,還是開發更適合我。
就目前而言,個人認為市面上需要的是具有紮實的計算機基礎且具有一定工程能力的演算法工程師,而不是各路導包調參俠,不管是哪個技術崗,都需要擁有紮實的程式語言、資料結構、計網、作業系統作為基礎。應當先成為一名合格的軟體工程師,再努力成長為一名合格的演算法/機器學習工程師。
在20年初,我也最終下定決心,決定未來在Java後端領域深入學習,現在看來,這個選擇不一定是最好的,但起碼不算差,同時我也退出了導師的課題組,雖然沒有繼續做下去,但還是打心底的非常感謝導師,因為在做競賽期間導師對我們的幫助可以說是至關重要,遇到一個願意為本科生付出如此心血的導師真的是我大學時光裡莫大的榮幸。
晃晃悠悠,從《Java核心技術卷 I》開始啃,一步一步開始深入,到逐漸開始完成些小專案,前路也慢慢變的明朗起來。
期間也遇到了幾個志同道合的小夥伴一起做專案,雖然有時真的蠻辛苦,但相信幾年後的我回想起來,這肯定是一段非常快樂且值得留戀的時光。
進入2021年,俗話說金三銀四,春招也逐漸逼近,從2月底開始,來來回回複習了半個多月,最終非常幸運的拿到了騰訊的暑期實習offer,也許和很多大佬比這不算什麼,但能進大廠也算是圓了大學一直以來的夢想了吧。
作為一個剛剛結束2021春招的人,談一談自己一開始的烏托邦與最後的現實,騰訊和阿里是我最早選定的目標(因為學校就在杭州,家在深圳),阿里提前批面了三個部門也都通過了,但最後內推流程只能選擇一個部門,一面很順利評價也很好,但在把我晾了近一個月後奇妙的把我掛了,然後被某部門撈,一面通過,二面評價也不錯,然後又等了半個多月,掛(面試體驗和鵝廠比相差甚遠,流程混亂,部門搶人現象也很嚴重),位元組一面掛(發揮最差的一輪面試),騰訊四輪技術面+一輪HR面過,海康一輪技術面通過。在拿到鵝廠offer後也長嘆一口氣,順便把後續的面試都推掉了。
很早之前就搭建起了公眾號和個人部落格,部落格也只是偶爾寫一下技術方面的文章,也許是忙碌(其實就是懶)的原因,一直都沒有付諸行動,希望能憑藉自己一點微不足道的經驗,分享一下自己的心路歷程,看心情更新:)
資料結構與演算法
一個可以肯定的點是,無論是哪種技術崗位,對於校招而言,技術棧的要求可能不會特別高,但對於思維的靈活性,編碼能力的考量,則是十分看中的,對於演算法的準備個人認為應該儘早開始,最好養成每天刷每日一題的習慣,從2020年初開始,我就在LeetCode開始了我的演算法學習之路,來來回回也刷了500題了,雖然水平遠不及acmer那樣,但紮實程度也足夠應付大廠的演算法考驗了。
養成一個刷題的好習慣,從長遠來看對編碼能力的提升很有幫助!
附上一些個人總結的不完全要點:
- 排序(快排、堆排、歸併、冒泡、希爾、選擇 等)基本思想 時間複雜度 穩定性 最好都能手寫
- DFS、BFS、回溯演算法
- 單調棧
- 貪心演算法
- DP(例如揹包問題等)
- LRU(雙向連結串列+HashMap)
- topN問題(海量資料找出第N大的資料)
- 大檔案統計詞頻(字典樹)
- 位運算
- 雙指標
- 連結串列
- 二叉樹
- 記憶化遞迴
- 二分查詢
- 堆(例如 大/小根堆)
- 圖(有向無向圖、dijkstra、floyd演算法之類的)
- 並查集
- 滑動視窗(Sliding Window)
- 紅黑樹
- AVL
- BTree、B+Tree
再附上一點比較熱門的演算法學習書籍和github地址吧:
- 劍指offer(非常經典,幾乎涵蓋了常見的演算法面試題)
- 演算法導論(可能會比較難,但是這本書也算演算法界的聖經了吧)
- labuladong 的演算法小抄:https://github.com/labuladong/fucking-algorithm
計算機網路
計網的重要性同樣不言而喻,個人總結的一些不完全的要點如下:
- HTTP 1.1、2.0 和 3.0 的新特性
- HTTP常見狀態碼及含義
- HTTPS(握手、CA、解決的問題、對稱加密與非對稱加密等)
- 常見HTTP請求方式的含義
- 如何優化HTTP/HTTPS
- OSI七層與TCP/IP四層區別及其含義
- TCP三次握手(是什麼、為什麼)
- TCP四次揮手(是什麼、為什麼)
- TCP TIME_WAIT CLOSE_WAIT狀態
- TCP長短連線
- TCP的特點及報文結構
- TCP是如何保證可靠傳輸的
- TCP的重傳機制
- TCP的流量控制與擁塞控制
- TCP滑動視窗
- UDP特點、使用場景、報文結構
- DNS解析及其過程
- IPv4、IPv6區別
- IP地址的分類
- 子網掩碼的含義
- DHCP協議
- ICMP協議(ping命令)
- MAC地址的含義
- 交換機和路由器的區別
- ARP協議
- 瀏覽器輸入url發生了啥
計網就沒啥好說的,基礎中的基礎,面試中的常客,各路謝希仁自頂向下黑皮書啃起來就完事了~
作業系統
個人總結的一些不完全要點:
- 作業系統的四個特性
- 使用者態和核心態(是什麼、為什麼)
- 上下文切換
- IPC通訊
- 執行緒同步的方式
- 程式、執行緒、協程的區別
- 程式的三態模型
- 程式排程演算法
- 死鎖產生的四大條件
- 死鎖的預防
- 如何解決死鎖
- Linux IO模型(阻塞式IO 非阻塞IO IO多路複用 訊號驅動IO 非同步IO)
- Reactor模型
- 零拷貝
- 虛擬記憶體
- 分頁 分段 段頁式區別及含義
- 頁面置換演算法
- 磁碟排程演算法
- Linux檔案系統組成
- 硬連結與軟連結
Java基礎
個人總結的一些不完全要點:
- 問到爛的HashMap、HashTable、ConcurrentHashMap
- 一些常見的集合類(TreeMap ArrayList LinkedList ArrayDeque之類的)
- equals和hashCode
- ==與equals
- 如何理解物件導向(抽象 繼承 多型 封裝)
- Java異常分類
- 深拷貝與淺拷貝
- 七大基本型別(語法糖 包裝類)
- Object類有什麼方法
- StringBuilder與StringBuffer
- String的intern()方法
- 為什麼String不可變
- jdk的新特性(8 lambda Optional 9 String改成byte[]儲存之類的)
- Java BIO NIO AIO
- 泛型和型別擦除
推薦書籍:《Java核心技術卷 I / II》,進階點看《Effective Java》《Thinking in Java》
這裡我個人並不是很推薦去看視訊,論知識的獲取而言,我更偏向自己探索吸收,而不是以"喂"的方式學習。
JVM
個人總結的一些不完全要點:
- Java 記憶體模型、執行時資料區
- Java 物件建立過程
- Java 物件的構成
- 類載入過程
- 類載入器及雙親委派模型(是什麼、為什麼、如何主動破壞、優缺點、如何實現)
- 堆記憶體分配分配策略
- 四種引用型別區別及含義
- 如何判斷物件已死亡
- 記憶體洩露分析
- 常見GC演算法
- 常見垃圾回收器(CMS、G1等)
- Java到底是值傳遞還是引用傳遞
- Full GC原因及排查
- JVM常用監控工具(例如 jmap jstack等)
- JVM常見引數(例如Xms Xms SurvivoRatio等)
周志明老師的《深入理解Java虛擬機器》啃起來就完事,涉及到的知識也和作業系統有些關聯,對於Java的學習,切勿停留表明語法,都動手實踐,切勿眼高手低。
多執行緒
個人總結的一些不完全要點:
- 執行緒池(Executor框架,為什麼阿里巴巴Java開發手冊不允許使用 Executors 去建立執行緒池,優點,如何使用,如何配引數「可以看看這篇:Java執行緒池實現原理及其在美團業務中的實踐」)
- AQS 原理
- 常見JUC工具類(CountDownLatch、CyclicBarrier、Semaphore、Atmoic原子類)
- synchronized關鍵字
- ReentrantLock可重入鎖
- 自旋鎖 / 互斥鎖
- 樂觀鎖 / 悲觀鎖
- 公平鎖 / 非公平鎖
- 讀寫鎖
- Java鎖升級流程(無鎖 偏向鎖 輕量級鎖 重量級鎖)
- ThreadLocal(使用場景 原理)
- volatile關鍵字(是啥、做了啥、禁止指令重排序、快取一致性原理、happens-before原則)
- Java執行緒的狀態(NEW RUNNABLE BLOCKED WAITING TIMED_WAITING TERMINATED)
- Object.wait Thread.sleep Thread.join Thread.yield方法作用
推薦書籍:《Java併發程式設計實戰》《Java併發程式設計的藝術》都很經典
Spring框架
個人總結的一些不完全要點:
- Spring IoC思想、特點、原理
- Spring事物
- Spring迴圈依賴
- Spring AOP原理(動態代理 JDK Proxy CGLib AspectJ java反射機制等)
- Spring MVC原理
- SpringBoot自動裝配原理
- Spring常見模組(ioc aop aspects jdbc jms orm web test)
- Spring事物傳播機制
- Spring用到的的設計模式
- Spring Bean的生命週期
針對Spring框架的學習一定要多實踐,多翻看官方文件,切勿只停留於片面的技術部落格,看看開源專案,從一個小demo開始做起,慢慢就會逐漸領會到框架的精髓。
MySQL
個人總結的一些不完全要點:
- 資料庫設計的三大正規化
- MySQL常見儲存引擎(InnoDB MyISAM Archive等)
- 死鎖 innoDB行鎖(gap X S鎖)
- MVCC機制(原理及實現 undo log 一致性檢視)
- 事物的ACID特性
- 事物的隔離級別
- 髒讀 幻讀 可重複讀
- 一條SQL語句執行的過程(binlog redolog)
- 索引(聚簇索引、輔助索引、聯合索引、原理)
- SQL語句分析
- 慢查詢分析
- SQL語句優化
- 讀寫分離 分庫分表(水平垂直拆分)
推薦書籍:《MySQL必知必會》《SQL基礎教程》
極客時間丁奇老師的《MySQL實戰45講》也有口皆碑,很推薦!
多聯絡SQL語句,在面試中有可能會讓你手撕SQL題,多在專案中對sql進行優化、分析。
Redis
個人總結的一些不完全要點:
- 五種資料型別(string、list、hash、set、zset)
- 其他資料型別(BitMap Geospatial hyperloglog等)
- Redis 單執行緒模型(為什麼高效?為什麼不用多執行緒?Redis6.0多執行緒的目的?)
- Redis IO 多路複用機制(select、poll、epoll、Reactor模型)
- 持久化機制(快照、AOF)
- Redis記憶體淘汰機制
- 如何判斷資料過期?
- Redis事物
- Redis漸進式rehash
- Redis叢集(主從複製、哨兵、cluster叢集)
- 如何保證資料庫快取一致性?
分散式相關
分散式領域的知識真的太多太多了,幾乎是一個無底洞,如果對其中一兩個框架比較熟悉其實在面試中也是很加分的。
不完全要點:
- CAP原則與BASE理論
- 分散式一致性相關(ZooKeeper、Paxos協議、ZAB協議之類)
- NoSQL(Redis、MongoDB、memocached等)
- SpringCloud(服務發現與註冊、負載均衡、閘道器)
- RPC框架(例如Dubbo這類,序列化協議protobuf這類)
- 訊息佇列(業內使用最多的Kafka、阿里的RocketMQ、RabbitMQ)
- 分散式事物、分散式鎖
程式設計工具
- Git
- Docker
- Linux命令
投遞與選擇
金三銀四、金九銀十分別對應春招和秋招的時間節點,春招大部分面向的是實習生的招聘,而最後在秋招環節,一大批的hc要被成功轉正的實習生所佔有。
可能對於想進大廠的雙非本科生而言,大三的春招就是你進大廠機率最大的時候,往往越到後面,面試的要求會越來越高,"機會是留給有準備的人"這句老話一點都沒有錯。
儘量選擇提前批,很多公司的提前批可以免去筆試,而且這時候hc多,面試流程快,只要通過面試基本就有位置。
在投遞上,儘可能進大公司,有大公司給你做的背書會讓你的職業生涯越走越順。
一點軟實力
拋開技術,其實無論是性格也好,還是情商也罷,雖然表面上看對技術崗似乎影響不大,但這玩意切切實實會潛移默化的影響別人對你的印象。
就比如在對一個問題的闡述上,一些人的發言聽起來就很有層次感,很舒服,包括與面試官的溝通(亦或是聊天瞎扯),一個性格隨和開朗,不卑不亢,說話有調理的人,誰不喜歡呢?
一位前輩也告訴我,拋開技術層面,面試官也會很在意你的價值觀與為人,如果價值觀或者人品出現問題則會一票否決。一個高傲,說話有稜有角,目中無人的候選人,即便技術再好可能也不太會博得面試官的認可。
其實軟實力這一塊要在生活中慢慢鍛鍊,與不同的人接觸溝通,適應不同人的性格。謙卑(不是自卑)的態度,坦誠的交流,冷靜的思考,往往是一場面試成功的潛在因素。
心態問題
「少抱怨,行動才是緩解焦慮的最佳途徑」
幾乎沒有人能夠做到安逸的度過一生,產生焦慮的情緒也十分正常,所有的焦慮都來自某種持續的心理矛盾。
- 警惕身邊販賣焦慮的訊息,冷暖自知
- 儘自己最大的努力,只為讓未來的自己不後悔
真的很推薦大家能養成堅持鍛鍊的習慣
每週三次、每次三十分鐘的體育鍛煉,與最強勁的精神藥物,有同樣的效果。
堅持鍛鍊給人帶來的好處,其實是潛移默化的,身體素質、心態、外表、性格都會慢慢變好,而且,晚上的時候,會睡得更好。
彷彿亂七八糟的想法和擔憂,全部隨著汗水流走了,夢中無事,睡眠質量的提高,這本身也能緩解焦慮情緒。運動可以讓身體產生內啡肽,極大地緩解焦慮水平,一般來說,跑步之後,雖然身體是累的,但精神明顯清爽很多。
給予自己積極的心理暗示,切勿盲目自信,盡力去做,不要讓自己後悔,不管結果如何。
說在最後
腳踏實地,保持謙卑。
技術這條路遠遠沒有盡頭,且不過是圍城罷了,外面的人想拼命往大廠鑽,中年程式設計師想拼命擺脫危機,但無論如何,做技術的一定要保持一個謙卑的心態。
一點拙見,還望包涵!
另外,我自己肝了六本 PDF,全網傳播超過10w+ ,微信搜尋「程式設計師cxuan」關注公眾號後,在後臺回覆 cxuan ,領取全部 PDF,這些 PDF 如下