背景介紹
努力了十多年,進入了一所普普通通的學校。
名校帶來的不僅是title,更是環境的薰陶。
最近想找重新找份好點的工作,而一些offer給出的條件是,至少211學校,有點無奈。
雖說名校背景並不能完全代表一個人的能力,但至少證明別人在高中及之前比你付出的多。
不得不承認,在某些情況下,雙非學校會受歧視。
首先的話,介紹一下自己的情況吧。雙非一本畢業一年的程序員,可以說學校不太好(和985,211相比)。家中條件不好,所以沒打算考研,想出來就業早點孝敬父母。畢業實習完想再找個好點的工作,從年前開始正式學習,前段時間拿到頭條的offer,還不到3個月,這3個月來各種焦慮,失眠,自我懷疑都經歷了一遍,實屬不易。
面試經歷
字節跳動是6面技術面 + 1面 HR 面,有趣的是三面都是視頻面試,雖然應聘的部門就在上海,但不需要趕過去現場面。
而且整體流程非常專業:面試前會有專人打電話約時間、面試後會及時通知你面試結果並約下一面的時間、面試中是在牛客網上視頻面試(網站上配置有白板可以寫代碼)。
再說面試內容,字節跳動或者說我們熟悉的“頭條”的特點的確是面試過程中算法比重很高,但面試官絕不是無腦問算法題。
比如一面問的算法題是線段樹 —— 這個數據結構我的確不熟悉,但面試官在提問過程中不斷引導和考察其他方面的東西,我能比較好得回答出來,最後雖然沒有命中最優解“線段樹”,但還是讓我過了。
如何準備頭條面試?
頭條面試和其他大廠可能大同小異,但就是這個小異才是關鍵地方,能異於其他人的地方。可以從如下幾個方面去做準備:
1.特意準備幾個面試題源碼。像我在回答一些中規中矩面試題的時候,都會從源碼角度出發。比如常見的HashMap等集合類,多線程的各種鎖以及大數據框架的部分源碼。
2.特意準備項目難點。面一些大廠的時候避免不了被問到項目難點,不可能用普通Bug含糊過去啊。這邊可以從項目用到的技術棧出發,去尋找技術棧在項目中會存在的難點,然後套進自己的項目,找個自己能懂,最好能全懂的。
3.針對性去了解公司的技術棧使用情況。比如頭條使用Go,衆人皆知,那爲什麼我不突擊學習一下呢?比如從業內人士得知頭條最早使用的是Kylin框架,後面慢慢轉爲ClickHouse,那我必須瞭解一下兩者的不同啊,而且可以結合頭條的業務場景。
頭條1面 - 基礎面
- 你們 Android 開發的時候,對於 UI 稿的 px 是如何適配的?
- 兩個值相等的 Integer 對象,== 比較,判斷是否相等?
- Activity A 跳轉Activity B,Activity B再按back鍵回退,兩個過程各自的生命週期
- 子線程是否可以 context.startActivity() (如ApplicationContext), 會不會有什麼問題?
- Handler機制整體流程; Looper.loop()爲什麼不會阻塞主線程; IdHandler(閒時機制); postDelay()的具體實現; post()與sendMessage()區別; 使用Handler需要注意什麼問題,怎麼解決的?
- Native、H5、RN頁面混合跳轉時,頁面清棧的橋如何實現的?
- 怎麼計算一個View在屏幕可見部分的百分比?
- ClassLoader 的雙親委派機制
- 簡單介紹下 Https 的原理
- 什麼情況會導致內存泄漏,如何修復?
- 下載一張很大的圖,如何保證不 oom?
- 有沒有做過UI方面的優化,做過哪些?
- WebView 與 JS 交互方式,shouldOverrideUrlLoading、onJsPrompt使用有啥區別
- Flutter、Kotlin接觸使用過沒有
- 其他項目相關問題
- 算法 - 二叉樹輸出第 k 層節點元素
頭條2面 - 項目專項
- Native、H5、RN頁面混合跳轉時,頁面清棧的橋實現
- 頁面混編框架的設計與難點
- RN 通用容器的設計
- 用戶行爲監控方案設計
- JS 錯誤治理方案
- RN 頁面對用戶行爲的監控與JS錯誤治理,在問題發現有什麼收穫、優化點
- 美團 RN 相對於原生 RN 的有什麼優勢
頭條3面 - 基礎加深
- 你們公司 Picasso 有使用過沒,介紹下
- Picasso 單引擎,在多 Bundle 的情況下怎麼保證數據隔離的?
- 美團 RN 與 Picasso 的區別
- RN 的頁面追蹤埋點如何實現的
- 美團首頁是否是 RN 頁面,MTFlexBox 原理
- synchronized 修飾 static 方法、普通方法、類、方法塊區別
- synchronized 底層實現原理
- volatile 的作用和原理
- 一個 int 變量用 volatile 修飾,多線程去操作 i++,是否線程安全? 如何保證 i++ 線程安全? AtomicInteger 的底層實現原理?
- 說下對線程池的理解,以及創建線程池的幾個關鍵參數
- Handler 機制又問了一遍
- 介紹下 Binder 機制,與內存共享機制有什麼區別?
- Java 集合,介紹下ArrayList 和 HashMap 的使用場景,底層實現原理
- ArrayList 與 LinkedList 的區別
- 算法 - 兩個有序的鏈表的合併
- 算法 - 輸入一個字符串(不含和.)、正則(字母、和.任意組合),判斷字符串是否合法
- 簡單介紹下,項目中遇到的一些技術難點
頭條4面 - 交叉面
- 下面的代碼, str 值最終爲多少? 換成 Integer 值又爲多少,是否會被改變?
- APK 爲什麼要簽名? 是否瞭解過具體的簽名機制?
- 爲什麼要分 dex ? SDK 21 不分 dex,直接全部加載會不會有什麼問題?
- 常見的設計模式有哪些? 你提供的 JS 錯誤治理方案,用了哪些設計模式?
- 算法 - 二叉樹層序遍歷,奇數層逆序遍歷節點,偶數層正序遍歷
- 未來 3~5 年的規劃是什麼?
- 你覺得你的優點是什麼? 缺點是什麼?
- 現在的職級,近期的績效如何
頭條5面 - 部門 TL
- 商業化部門相關的業務介紹 (核心大概是商業化部門壁壘高,培養一個人成本高,比做其他業務更有含金量,可以積累很多業務策略知識),然後讓問他問題
- 未來幾年的規劃? 生活上有什麼規劃?
- 你覺得你的優點是什麼? 缺點是什麼?
- 現在的職級,近期的績效如何
- 爲什麼給你這麼好的績效?
- 有沒有看其他機會? 阿里面試的情況
頭條6面 - 大 Boss
- 算法 - 數組插入,考慮擴容
- 在項目的遇到的比較有挑戰的事是什麼?
- 你在之前公司負責的業務有哪些?
- 未來幾年的規劃是什麼?
- 你覺得你的優點是什麼? 缺點是什麼?
- 現在的職級,近期的績效如何
頭條HR 面
- 本科和研究生專業都是偏硬件的,是否有相關的軟件經歷?
- 去上家公司之前有沒有 Android 開發經歷?
- 當時爲什麼要選擇去上家公司? 爲什麼要選擇來這裏?
- 爲什麼要換工作? 期望以後的工作是怎樣的?
- 幾次晉升中,業績亮點是什麼?
- 家是哪裏的,有回家那邊發展的打算沒有?
- 有打算再去看看快手之類的工作機會沒有?
- 問一些阿里現在的面試進展和情況
- 期望的薪資
如何成功拿到offer?你需要一份這樣的程序員面試指南
八月過完就到了金九銀十,是程序員扎堆求職的高峯時段;
你做好去面試的準備了麼?
你知道該如何做準備?
還毫無頭緒?
那麼,接下來的內容你需要看看。
面試準備
面試的準備時間一般別低於2天,如果可以,再延長些,但別太長。比如是去現場面試,可以找的藉口就比較多,比如項目忙,會多,時間間隔別超過5個工作日。比如週二收到通知,就儘量約到週五,如果是是週三週四,那麼別超過下週二。
瞭解公司的相關情況。面試前應到公司的網站上或別的渠道,提前瞭解公司的企業背景、業務模式、主營產品等, 面試的時候就可以做到有的放矢。當面試官問道這些問題的時候,你一無所知,這就不是尷尬能形容的了。因此,不妨先研究下想要應聘的機構,深入瞭解其工作規範以調整回答問題時的方向和重點。
一份順眼的簡歷
如果你想增加入選的機會,那還得花點心思在簡歷上。網上有很多資源,可以多下幾個模板比較一下,選一個適合自己職業的風格。程序員最好簡單一些,能凸顯重要部分就可以了,但是,要記住表格形式的簡歷是大忌。
簡歷控制在一張A4紙以內,最好不要超過兩張。原因很簡單,因爲HR和麪試官平時都挺忙的,沒有那麼多時間看簡歷,很多面試官會要求你自我介紹,其實就是他們沒看簡歷。
技能只寫最重要的,寫點和職位相關,直接能讓面試官重視的技能,比如面試運維開發時,就寫自己實現過CMDB,上線,工單系統,Django,Flask用的很熟練等,直接命中面試官的用人需求!
乾貨儲備(核心技能)
1、專業知識準備
收集相關面試題並熟練掌握。面試官有時候也會照着網上的題庫問你問題,最好能按自己的理解,用自己的語言去闡述問題。
2、項目經驗
項目的研發背景、整體業務流程、開發週期、負責的模塊、技術實現細節、技術亮點等。你自己做過的每個項目都要搞清楚。
3、瞭解熱門前沿技術
比如你面試的是 Android 開發崗位,除了 組件化 你還能聊聊最新的 Jetpack Compose;比如現在微信小程序開發又火起來了,你也在關注和學習,甚至能解決面試官的一些問題。瞭解這些熱門的前沿技術絕對會成爲你面試時的加分亮點。
面試應注意的地方
面試是個技術活,其本質上是一次溝通的過程。候選人要在限定的時間和條件內向面試官展現自己的才能,而面試官同樣也要在有限的時間和條件內發現候選人是否適合該職位。
程序員的面試不同於一般崗位的面試。除了禮節外,你還需要注意以下幾個方面:
1、溝通能力
一個談吐落落大方,邏輯性強,不謙卑也不張揚的人,是受歡迎的,溝通能力好甚至比技術本身還要重要,你技術好,說不出來等於沒用。在平時你就應該注意這個方面,練習把邏輯性的實現思路表達清楚,那樣,你的BOSS一定是喜歡你的。
2、技術細節
程序員面試必然要問技術細節,如果不是那種研究性高深崗位,面試官通常只需要獲取到某個點,只要你答上點了,就OK了。技術面試,一定是要結合開發場景的,而不是隻講知識點,只講知識點那叫背,頂多也就是看書多了,結合項目場景的應用回答知識點,纔是最有價值的。
3、整體實現方案
最後考驗你的就是整體實現方案了,可能是一個陌生的功能需求提出來,不管你做沒做過,讓你設計這個功能的整體方案。這一點上是考驗你的設計能力,經驗。
另外,與面試官相談的切記要誠實,不要弄虛作假。碰到不會的或者瞭解不深的,直接跳過,最好將面試官引導到自己擅長的領域。
面試之後覆盤
覆盤很重要,沒有覆盤的行動往往是無效的,因爲沒有經過總結和沉澱。大家要養成經常覆盤的習慣。
面試結束後你可以回顧一下:是否表現得沉着自信、充滿活力、輕鬆自如?對面試官提問的反應是否恰當、準確、靈活?關於面試官的提問,你是否還可以做出更好的回答?將這些寫成一篇面試總結,對你以後的面試也會很有幫助。
面試遭遇失敗是很正常的事情,善於總結自己的失敗原因纔是最重要的。不要因爲面試失敗而灰心、喪失鬥志。也不要因爲面試通過而沾沾自喜,等待你的將是更美好的未來,繼續加油!
將每一場面試都當作免費的培訓,積極調整心態,不但能達到一個雙贏的局面,還可以減少緊張的情緒,從而獲得更好的表現。
總結
關於面試,你必須要知道的事情:
做好個人職業規劃是前提!
面試時,幾乎所有人都會被問到一個問題—你的個人職業發展規劃是什麼?
其實職業規劃是會反映出你和公司今後發展方向的匹配度,也會側面反映你的個人能力。
針對性地“準備”好你的職業規劃,讓企業看到你並不是胡亂海投,同時也是爲自己釐清方向。
參加面試的小夥伴一定要根據自己的情況做好職業規劃,明確發展方向,不僅可以提高面試成功的概率,更是對自己未來負責。
衝擊大廠需要儲備哪些技能?
Android學習是一條漫長的道路,我們要學習的東西不僅僅只有表面的 技術,還要深入底層,弄明白下面的 原理,只有這樣,我們才能夠提高自己的競爭力,在當今這個競爭激烈的世界裏立足。
如果你覺得自己學習效率低,缺乏正確的指導,可以參考下下面分享我多年工作以來收集整理的學習路線,給大家做個參考:
接下來是每個模塊我整理出來的文檔學習資料,幫助大家更細緻化的學習。
《Android彙總複習資料—Java》
《Android彙總複習資料—Android》
《Android彙總複習資料—Android擴展》
《Android彙總複習資料—Kotlin》
《Android彙總複習資料—Flutter》
《Android彙總複習資料—算法》
除了上面的學習路線,還可以額外的配合以下方式學習,效果翻倍~
①看視頻進行系統學習
前幾年的Crud經歷,讓我明白自己真的算是菜雞中的戰鬥機,也正因爲Crud,導致自己技術比較零散,也不夠深入不夠系統,所以重新進行學習是很有必要的。我差的是系統知識,差的結構框架和思路,所以通過視頻來學習,效果更好,也更全面。關於視頻學習,個人可以推薦去B站進行學習,B站上有很多學習視頻,唯一的缺點就是免費的容易過時。
另外,我自己也珍藏了好幾套視頻,有需要的我也可以分享給你。
②讀源碼,看實戰筆記,學習大神思路
“編程語言是程序員的表達的方式,而架構是程序員對世界的認知”。所以,程序員要想快速認知並學習架構,讀源碼是必不可少的。閱讀源碼,是解決問題 + 理解事物,更重要的:看到源碼背後的想法;程序員說:讀萬行源碼,行萬種實踐。
主要內含微信 MMKV 源碼、AsyncTask 源碼、Volley 源碼、Retrofit源碼、OkHttp 源碼等等。
③面試前夕,刷題衝刺
面試的前一週時間內,就可以開始刷題衝刺了。請記住,刷題的時候,技術的優先,算法的看些基本的,比如排序等即可,而智力題,除非是校招,否則一般不怎麼會問。
關於面試刷題,我個人也準備了一套系統的面試題,幫助你舉一反三:
④2020大廠面試高頻知識點
- 圖片
- 網絡和安全機制
- 數據庫
- 插件化、模塊化、組件化、熱修復、增量更新、Gradle
- 架構設計和設計模式
- 性能優化
- Android Framework
- Android優秀三方庫源碼