我是二本院校非科班的,從簡歷被拒,到拿下頭條面試,我花了一年的時間,
一、印象中的頭條
二、面試背景
三、準備面試
四、如何通過頭條筆試?
五、如何準備頭條面試?
六、一個關于如何進大廠的小建議
一、印象中的頭條
1.老板張一鳴跟我是福建老鄉,龍巖市在我朋友說來就是山溝溝,能走出美團王興和頭條張一鳴讓我卯足了去龍巖吃特產老鼠干的欲望,
2.給的錢多,筆試也賊難,參加過頭條筆試的同學都知道,頭條筆試可以筆試三次,就是不論你有沒有參加都有三次機會,筆試就5道演算法題,兩個小時,去年第一次看到演算法題就自閉了,第一次掛了,第二次又很認真地做,做到一半放棄了,沒過幾天又邀請我做第三次,有一種強行被侮辱的感覺,
3.內推被拒,正如我標題所說,簡歷被拒,去年3月份在知乎上看到一個頭條大佬說可以內推春季實習,于是私信并發了簡歷給他,看了我簡歷之后說頭條競爭激烈,我背景不夠,點到為止,,(打擾了)

二、面試背景
自從去年被頭條筆試的演算法凌辱和被頭條的前輩指教了之后對頭條沒啥好感了,也感覺進不去,所以后面大半年都沒關注頭條的招聘,直到以下兩件事情的發生,
1.有一天,之前一塊實習的哥們說進了頭條,我也蠢蠢欲動打算開始搞了,那時有一個不成熟的想法:「連他都可以進,我應該也可以吧,
2.正好在健身房認識了一個在頭條做教育的小leader,我覺得這是天意啊,于是免費給他上了節私教課,上完讓他幫忙內推,
三、準備面試
其實從十月份投遞簡歷開始準備面試到十二月份收offer,也不過2個月的時間,但這都是建立在我過去一年的積累啊,無數次的通宵自習室,圖書館的專屬椅子都被我坐的陷進去,避免誤導大家,這次也不做標題黨,寫了準備一年,踏踏實實干事,
每天早上,泡一杯咖啡,享受陽光灑在窗前的溫暖,翻開武林秘籍,開背!


邊背邊加上筆記,更有助于理解喲~
以下是我去年給自己訂的學習計劃:
一月:
Java入門
整個一月份都在刷入門視頻和《深入理解Java虛擬機》,又臨近期末,每天5點半起床,看兩個小時的視頻然后上課或者復習期末考,
二月:
劍指offer刷一遍、資料結構、JavaSE、JVM、多執行緒
①劍指offer有些搞不懂的直接跳過,等下個月第二遍再刷;
②資料結構重點是各種樹、二叉樹、紅黑樹的一些特性以及鏈表的特性;
③JavaSE主要是類物件介面的區別,能不能繼承,Static的特點,各種Hashmap,ArrayList等集合框架的原理原始碼;
④JVM是根據網上整合的高頻面試題進行學習的,刷了一遍面試題之后才去看周志華的《深入理解Java虛擬機》,JVM難的不是JVM布局,垃圾回收演算法等這些理論,而是結合代碼和專案場景,比如說一段代碼,有很多個類、方法,其中又有靜態類和全域變數,這時候專案跑起來的時候哪些先加載,哪些變數存放在哪個區,不止要懂理論,還要結合代碼懂理論,還有就是專案中的OOM,堆疊溢位,JVM的引數調優等等,
⑤多執行緒也是刷網上面試題和博客的,幾本多執行緒的書都是一坨一坨的,理解不來,先動手把幾個多執行緒實作方法實作了一遍,然后分析優缺點,再由此切進去執行緒不安全和各種鎖,多執行緒學習不同JVM,自己多動手,多除錯一下,控制臺都會告訴你答案,
三月:
劍指offer二刷,資料庫、作業系統、網路、準備面試
①劍指offer第二遍重點刷第一遍時思路懂代碼不懂的,
②Android面試題刷了網上搜集1307位元組跳動高頻面試題解,其他都是框架原理,原始碼決議等理論,
③作業系統刷高頻面試題,死鎖的產生條件、解決方法等等,資源調度演算法,并發和并行等,
④網路也是刷面試題,三次握手四次揮手以及為什么要這樣做、TCP和UDP、網頁請求程序、DNS決議程序、網路模型、回應碼的意思等,
⑤我每刷一道演算法或者理解了一道面試題都會進行整理,所以到面試之前看看整理的檔案和博客就行,例外輕松,這個月也繼續投遞簡歷進行面試,從三月份開始都是邊投邊準備,不存在全部準備好再去投,

以上資源均免費分享給大家,內容均放在了開源專案:【Github】,大家可以自行獲取,
三月份收了京東、瓜子二手車等二線大廠的offer,
四月:
專案、手寫劍指offer、繼續面試
①三月份被阿里閑魚部門的三面面試官懟了一發,說簡歷沒有混合開發專案面Android崗,理論會再多有什么用,于是打算在四月份補一下專案,

②在補專案的同時,不忘演算法,練習白板寫代碼,
四月份收了騰訊、去哪兒一些offer,騰訊和去哪兒終面都得現場面,所以一天飛北京,一天飛深圳,拿到騰訊offer的時候跟HR商量能不能去上海或者北京的base,HR說不行,于是就沒去了,選作業和生活城市有一個硬性標準:離家遠!那些在北方讀書的同學畢業之后一直要往家里跑,而我則是一直往外跳,或許是因為在廈門待了四年吧,家鄉也是「圍城」啊,
5-12月:
看框架原始碼,面試,整理面經
如何閱讀原始碼?

1.深入決議微信 MMKV 原始碼
MMKV 是微信于 2018 年 9 月 20 日開源的一個 K-V 存盤庫,它與 SharedPreferences 相似,但又在更高的效率下解決了其不支持跨行程讀寫等弊端,
2.深入決議阿里巴巴路由框架ARouter 原始碼
組件化被越來越多的Android專案采用,而作為組件化的基礎——路由也是重中之重,因此詳細的分析阿里巴巴開源的路由框架ARouter,從原始碼的角度解釋為什么這樣使用,以及避免做什么,讓你使用地更加順滑,
3.深入決議AsyncTask 原始碼(一款 Android 內置的異步任務執行庫)
AsyncTask 是 Android SDK 中提供的一個用于執行異步任務的框架,在 Android 興起的早期被廣泛使用,但如今已經被 RxJava、協程等新興框架所取代,雖然它存在著一些不足,但我們還是可以嘗試了解一下它的實作原理以及存在的不足,
4.深入決議Volley 原始碼(一款 Google 推出的網路請求框架)
Volley 是 Google 開發的一款網路請求框架,目前已停止更新,雖然目前大家的關注焦點都在 Retrofit、OkHttp 等第三方網路請求框架,團隊的專案中所用的也是這兩個框架,但 Volley 中還是有非常多優秀的設計思想值得我們去學習的,
5.深入決議 Retrofit原始碼
在Andrroid開發中,網路請求十分常用,而在Android網路請求庫中,Retrofit是當下最熱的一個網路請求庫,
6.深入決議OkHttp 原始碼
OkHttp是一個處理網路請求的開源專案,是Android端最火熱的輕量級框架,由移動支付Square公司貢獻用于替代HttpUrlConnection和Apache HttpClient,隨著OkHttp的不斷成熟,越來越多的Android開發者使用OkHttp作為網路框架,
7.深入決議ButterKnife 原始碼
作為 Android開發者,大家肯定都知道大名鼎鼎的butterknife,它大大的提高了開發效率,雖然在很早之前大家就開始使用它了,但是只知道是通過注解的方式實作的,卻一直沒有仔細的學習下大牛的代碼,所以有必要系統的分析下 butterknife的實作原理,
8.深入決議Okio原始碼(一套簡潔高效的 I/O 庫)
Okio 中有兩個非常重要的介面——Sink 以及 Source,它們都繼承了 Closeable,其中 Sink 對應了我們原來所使用的 OutputStream,而 Source 則對應了我們原來所使用的 InputStream,
Okio 的入口就是Okio 類,它是一個工廠類,可以通過它內部的一些 static 方法來創建 Sink、Source 等物件,
9.深入決議SharedPreferences原始碼
SharedPreference 是一個 Android 開發自帶的適合保存輕量級資料的 K-V 存盤庫,它使用了 XML 的方式來存盤資料,比如我就經常用它保存一些如用戶登錄資訊等輕量級資料,
10.深入決議EventBus 原始碼
EventBus 是一個 Android 事件發布/訂閱框架,
傳統的事件傳遞方式包括:Handler(訊息處理機制,一般用于更新UI)、BroadCastReceiver(廣播接收者)、Interface 回呼,
EventBus優點:
- Activity、Fragment、Service與執行緒之間的通訊是很常見的,EventBus正好可以屏蔽一些執行緒切換問題,簡單地實作發布訂閱功能,
- 代碼簡潔,使用簡單,并將事件發布和訂閱充分解耦,
11.Android 自定義注解初探
由于之前用到的很多開源框架如 GreenDao、EventBus、ButterKnife、ARouter 等都使用了自定義注解,因此有必要去研究一下自定義注解,
12.View 的作業機制原始碼分析
13.Android 觸摸事件分發機制原始碼分析
14.Android 按鍵事件分發機制原始碼分析
15.深入決議 Handler 原始碼
Android 的訊息機制是基于 Handler 實作的,很多人以為,知道了 Handler、Looper、MessageQueue 就自以為了解了 Handler 的原理,但其實看原始碼的程序中慢慢就會發現,Handler 的內容可不止這點, 像同步屏障、 Handler 的 native 層的阻塞喚醒機制等等這些知識以前就沒有理解清楚,
16.深入決議Binder原始碼
Binder在Android中堪稱武林秘籍中的"易筋經",無論是菜鳥還是老鳥都對之神往,Binder架構是行程間相互通信的最常用手段,四大組件的基本功能都是依賴著Binder才能夠實作的,
為了開發者能夠使用java與cpp進行binder通信,binder的設計貫穿了framework、native和kernel層,開發者可以輕松的在上層使用binder向其它行程發起資料通信,
17.深入決議JNI原始碼
Android NDK開發中,常常因為效率、安全等原因,需要借助JNI的機制呼叫到Native環境中進行c/cpp操作,
18.深入決議Glide原始碼
Glide 功能豐富,圖片三級快取、可深度定制(繼承AppGlideModule、LibraryGlideModule實作更多功能)、修改網路請求庫、支持多種輸入輸出資源的轉換(例如輸入Stream,輸出bitmap等等)、生命周期的管理,因此很有必要深入決議原始碼
19.RxJava原理及如何封裝使用
RxJava可謂是Android開發人員必備技能,重要性就無需贅述了,
20.LeakCanary核心原理原始碼決議
LeakCanary是Android記憶體泄漏的框架,作為一個“面試常見問題”,它一定有值得學習的地方,
21.插件化架構定義及插件化架構的實踐思路分析
babel插件、webpack插件、vue-cli插件,為啥這么多的優秀框架都是使用插件系統?插件化架構是什么?帶來了什么好處?可以應用到什么場景呢?
以上資源均免費分享給大家,內容均放在了開源專案:【Github】,大家可以自行獲取,
總結:
一定要列好自己的學習計劃,也要學會根據自己的學習情況調整計劃,專案是面試的敲門磚,也是面試的大頭,我是從大二出去實習的,所以在專案這邊可以花較少的時間,不用從零開始學,底層理論一定要會,不然大廠無望,演算法一定要硬剛,總共就那幾種題型,我剛開始也很抵觸的,覺得太難了,后面迎難而上也就那么回事,第一遍不行就第二遍,不然就第三遍,直到現在劍指offer里面也有一些我不懂的題目,但我也不會去深究,大局為重,不摳細節,
四、如何通過頭條筆試?
這次的筆試里總共有5道,我AC了2.5題,第一題90%,第二題90%,第三題70%,不算好,但勉強通過了,去年的這個時候我可是連題目都看不懂的,看得懂的只知道用嘴怎么說,不會用代碼實作,通過這段時間的演算法訓練,總結了如下幾點演算法筆試經驗:
1.平時刷題一定要總結歸納,最好分類,比如關于樹的題型,鏈表的,陣列等等,觀察它們的解題思路,總結出解題套路,
2.積累工具類演算法,什么叫工具類演算法?就是你解一道演算法題需要用到另一種演算法,這個被呼叫的演算法就是解決這道演算法題的工具,比如常見的「陣列」、「鏈表」、「二叉樹」、「圖」以及常見的選擇和排序演算法都是經常使用的工具類演算法,
3.學會抽象題目,筆試演算法題不同于面試演算法,不會直白跟你說要使用哪種演算法去解答,更多的要自己學會抽象,拋開題目本身,要明白內部講的是什么,別被題目的糖衣炮彈迷惑了,只有把題目抽象成最原始的演算法你才能更好地使用工具類演算法進行解答,
1.1.1 常用的資料結構有哪些?
1.1.2 陣列
1.1.3 鏈表
1.1.4 佇列&堆疊
1.1.5 二叉樹
1.1.6 HashMap
1.1.7圖
1.1.8排序演算法有哪些?
1.1.9 查找演算法
1.1.10 串
1.1.12 其他演算法
以上資源均免費分享給大家,內容均放在了開源專案:【Github】,大家可以自行獲取,
八、如何準備頭條面試?
頭條面試和其他大廠可能大同小異,但就是這個小異才是關鍵地方,能異于其他人的地方,可以從如下幾個方面去做準備:
1.特意準備幾個面試題原始碼,像我在回答一些中規中矩面試題的時候,都會從原始碼角度出發,比如常見的HashMap等集合類,多執行緒的各種鎖以及OKHTTP框架的部分原始碼,
2.特意準備專案難點,面一些大廠的時候避免不了被問到專案難點,不可能用普通Bug含糊過去啊,這邊可以從專案用到的技術堆疊出發,去尋找技術堆疊在專案中會存在的難點,然后套進自己的專案,找個自己能懂,最好能全懂的,
3.針對性去了解公司的技術堆疊使用情況,比如頭條關注性能優化,眾人皆知,那為什么我不突擊學習一下呢?
九、一個關于如何進大廠的小建議
我一直崇尚「曲線救國」的做法,也一直在向別人傳播這種做法,現在能力背景不足沒關系,只要規劃好自己的學習路線,一步步階梯式往上爬,總可以實作目標,因為我自己二本出身,但我意識的早,大二就開始實習,用專案和實習經歷彌補我背景不足,然后一步步走到「offer自由」,很多時候并不是只有巨人才可以成功,你只需要做到行動上的普通人,就可以超過很多思想上的巨人,行動上的矮子,
本文在開源專案:https://github.com/Android-Alvin/Android-LearningNotes 中已收錄,里面包含不同方向的自學編程路線、面試題集合/面經、及系列技術文章等,資源持續更新中…
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/255936.html
標籤:其他

