本文作者

作者: 兇殘的程序員

鏈接:

https://blog.csdn.net/qian520ao/article/details/107515896

本文由作者授權發佈。

人在年輕的時候,最核心的能力是什麼?

我認爲是:篤定一件事並有耐心長久堅持的能力。

所謂的幸運,就是當你準備好了的時候,機會來了。

很認同作者寫的話,我一直認爲努力與堅持是抓住機會的核心要素,很多我認定有意義的事情,我都會堅持去做。

在這個公衆號,我收到過一個比較多的問題就是:「鴻洋,我想知道怎麼成爲高級、資深研發工程師?」,「我學了 framework,掌握了音視頻就是高級研發了嗎?」

我現在會回答,這些職級並不是你學了什麼東西,你就是了,而且是加入一家職級外界認可的公司,你在這個公司的所做的貢獻得到公司的認可,公司賦予你這樣的職級,而不是自封的。

所以,說的直白一點,加入一家好的公司,是我們職業生涯中一個很重要的目標。

好了,下面可以看看作者這篇文章咯。

1

概述

轉眼距離上一篇學習總結博文已有2個年頭,有興趣的可以看看 

2018年android面試分享和學習總結

https://blog.csdn.net/qian520ao/article/details/79601179

像對於我這種普通平凡的開發來說,想要在編程開發這條路上走的長遠,對職業的規劃是必不可少的,每個階段都需要有下一階段的規劃。

該篇文章傾向思考與覆盤篇,預計閱讀時間爲 18 分鐘。

2

階段規劃

初入職場 > 小規模公司 > 中型團隊開發 > 一線公司團隊開發 > 一或二線公司團隊管理

如何走出小規模公司?

小規模公司按我理解指的是 0 - 200 人公司,Android 開發 1 ~ 3 個,拍着腦袋做事,團隊不穩定,容易整個部門被GC (Garbage Collection)

由於畢業學校很難在簡歷上發出亮點,再加上零碎的Android知識,畢業後能進一家互聯網公司拿着不少的工資已經很快活了,但是短暫的快感帶來的是無盡的空虛,而且很容易一葉障目,感覺自己還挺能。

很幸運在 17 年中旬受到阿里棒喝,由於17年開始寫博客,Android 自定義貝塞爾曲線  https://blog.csdn.net/qian520ao/article/details/68952079 這篇文章發佈到 github 沒多久點贊數蹭蹭往上漲,3 個月後阿里突然主動聯繫到我,邀請我進行電話面試。當時感覺自己還挺能,但現實往往挺殘酷,java 相關問題只知道皮毛,很快就敗下陣來。

不得不說,好的博客文章能夠提升曝光率 ,大廠內推往往有不錯的獎勵金,如果博客文章寫的好,就會有人願意去內推你,給面試機會。

怎麼進入中型公司?

中型規模的公司有一定研發人員,一般情況下會有5 - 12 Android 開發維護一個 App。

團隊成員有一定的項目開發經驗,不會像小公司經理一樣問你:「這個功能會不會做,能不能獨立開發App」這種毫無水平的問題。

舉個例子,中型規模的團隊可能會問到:

HashMap 數據結構是怎樣的,可以多線程使用嗎,多線程需要使用哪些集合?

只要你能回答上以下內容,面試官會微微一笑

數組作爲哈希桶,擴容時候已鏈表形式,超過8個節點結構改爲紅黑樹。
不能多線程使用,多線程可以用 ConcurrentHashMap

可能有些面試官會追加繼續問:

ConcurrentHashMap 爲什麼可以多線程使用, jdk 1.7 和 1.8 有何區別

如果能回答

1.7 使用 Reentrantlock , 將哈希桶分段,每個 Segment 作爲一個鎖粒度
1.8 使用 synchronized , 鎖粒度更細,鎖對象是每個鏈表的表頭

能往上面的內容聊一個大概,面試官應該會欣慰的認可你的水準。

可以說如果將市面上大部分常見的面試題掌握,那麼進入中型的公司是力所能及的。

中型公司一般是 2 輪技術面試,第一輪成員骨幹或者組長面,聊個大概水平和深度。第二輪總監或者技術經理面,聊聊項目或者技術。(一般總監不會參與編寫Android代碼,所以如果問技術,那麼問網絡相關的可能性最大)

  • 有學歷,有背景(履歷不錯)

  • 有博客有亮點

  • 掌握常見面試題(java & Android)

  • 平時有記錄項目中遇到的問題,並能解決

  • 表達能力強

  • 運氣加成,問的都會

符合上述 3 點或者以上,進入中型公司應該不在話下、遊刃有餘。

怎麼擠進一線大廠

騰訊、阿里巴巴、字節跳動、華爲、美團、滴滴、百度 …

一線大廠一般有很多部門負責不同的項目,裏面不乏知名大學畢業,技術大牛,往往在某一領域已經做到極致,有專門的團隊負責某一功能點(性能優化、性能監控、中間件工具組件等),能投入人力物力去做好項目,並且薪酬福利可觀,只是工作強度會很大。

在上家公司期間,有幸我們組有位中山大學畢業的小夥計,從他身上看到很多優秀的學習習慣和方法,在這裏不得不承認比你優秀的人還比你努力,是什麼能讓他變得如此優秀?

  • 多寫多練,沒有捷徑  :知識面廣的人一定是不斷積累形成的廣度,一道難題他能解答,更多的可能在於 1. 這道題他做過 2. 做過相似的題型。例如 鏈表中環的檢測 ,沒有做過或者瞭解相似題型的人,是很難能夠寫出答案的,但實際上它並不難。

  • 善於思考,系統性學習  :例如網絡編程 TCP / UDP 工作中接觸的概率不大,大多數人都是衝着面試去學的,百度谷歌一下 TCP / HTTP 面試相關,知道有三次握手、四次揮手滑動窗口等,但很難把這些知識內容關聯成網狀結構,看了沒多久又會忘得差不多。這裏我建議系統性學習,從文檔、書籍中更全面更系統地瞭解這些內容,加入到大腦的一個記憶分支中。

  • 不要試水,一步到位  :人都會有僥倖心理,抱着試試看的態度。編碼、學習、或者是面試,沒有一次性做到位的決心。事實上重構、重新開始、重新面試都會花費更多的時間。像大廠的面試週期都要半個月或者一個月,沒有通過的話不僅浪費時間,而且這段時間心情複雜、焦慮、期盼。因此如果想面試跳槽,儘量一步到位、下定決心,把目標放高一些,進不了一線大廠也能找到一個好的公司。

這次換工作其實只面了兩家公司:騰訊和字節跳動。
兩家都是內推的方式,如果身邊有大廠的朋友,建議內推試試,避免在 HR 這關被篩了簡歷。
說實話並沒有能接受兩家都黃了的心裏準備,但如果現實殘酷,我想我也能找到一家不錯的好公司吧。

3

進大廠需要如何準備

說實話想擠進大廠需要 7 分實力和 3 分機遇,並不是每個部門每個面試官都那麼強,也是會有人在大廠裏摸魚或者更多的負責管理相關(軟技能強)。

因此我們要做的是不斷積累,提升知識面的廣度和深度,也就是提升自己通過的概率。

大廠面試通常會問答哪些問題呢?什麼樣的深度?

  • 廣度 :其實提問的題型大多數能夠谷歌或者百度到,或者平時編碼能接觸到,我建議可以通過整理面試題、整理市場上Android相關書籍目錄,羅列出包括網絡編程、java、Android都有哪些知識點,  先歸納,再系統性學習 。現在網絡發達資料齊全的時代,找信息找資料並不難,難的是將這些信息資料分門別類地整理,並消化它們。

網上的面試題或者學習資料,建議將它們作爲複習目錄大綱,每個點都需要找到相關書籍或者文檔再深入研究。

下面舉個網絡相關的面試題,首先我們百度輸入 android tcp 面試題, 找一篇文章看看

  • 網絡分層

  • TCP/IP五層模型

  • 三次握手與四次揮手

  • TCP爲什麼三次握手不是兩次握手,爲什麼兩次握手不安全

  • 爲什麼TCP是可靠的,UDP早不可靠的?爲什麼UDP比TCP快?

  • http協議

  • https

掌握了上面這些網絡知識,能通過面試嗎?

很遺憾,並不一定能。

舉個例子,大廠的網絡編程面試題可能如下:

網絡編程相關

TCP 三次握手的時間是多少
如何處理數據傳輸錯誤
TCP的可靠傳輸機制是什麼
TCP傳輸的一個報文段有多大
說說滑動窗口和擁塞控制

深度大概如上所述(再深我也不會了…),如果單從網上的面試題或者零散資料去查去看,多數情況是回答不上的。

這就需要有兩手準備,通過書籍或者官方文檔,系統性的學習 TCP / UDP / HTTP ,文章末尾我會有一些書籍文檔推薦。

下面舉java相關的:chestnut:

java 涵蓋的知識點一般有: 線程與併發、JVM、集合

集合

HashMap 有哪些高效的運算,如何擴容

答:取key的hashCode值、高位運算、取模運算


當length總是2的n次方時,h& (length-1)運算等價於對length取模,也就是h%length,但是&比%具有更高的效率。可以參考美團的:Java 8系列之重新認識HashMap

https://tech.meituan.com/2016/06/24/java-hashmap.html

線程

Synchronized 和 ReentrantLock 還有生產者消費者也是作爲大廠高頻的面試題出現,對於 Synchronized 他們問的會更深沉一些。不光要會用 Api , 也需要實現的機制是什麼。

Synchronized 的 jvm 實現機制是什麼
鎖是什麼,存儲在哪裏,包含哪些屬性
wait 和 sleep 有什麼不同,wait 和 notify 的機制是什麼

ReentrantLock 的原理 (CAS + AQS)
公平鎖和非公平鎖的實現?
AQS 核心功能原理分析,內部的數據結構是什麼?

可能會有人覺得這些應該是後端的事情,客戶端很少會涉及多線程,即使要用,看一下 Api 文檔能用就行。

實際上當你瞭解學習了 ReentrantLock 、AQS ,它們很可能會在後續的知識點產生影響,並且幫助你建立網狀知識結構。

再說一個很實際的例子,線程池也作爲高頻的面試題,線程池中有阻塞隊列例如 LinkedBlockingQueue , 重要的是 LinkedBlockingQueue 的實現機制就有 ReentrantLock ,而
ReentrantLock 又依賴 AQS。

這就呼應了上面我舉的爲什麼這道難題他能答的原因 1. 這道題他做過 2. 做過相似的題型。

所以在刷面試題或者看書籍文檔的時候,不妨換位考慮一下: 如果我是面試官,我會出什麼樣的題目看起來比較有深度?

---- 謝邀,人在美國剛下飛機

算法

鏈表中環的檢測 ,沒有做過或者瞭解相似題型的人,是很難能夠寫出答案的

上面說的這句話是很有事實依據的,前Google工程師王爭在他的課程裏也有提到:

對於算法,多寫多練,總結覆盤,除非要你去做推薦算法或者人工AI大數據計算,否則Android面試官不會爲難你,只會考察一下算法的基本功,代碼編程能力。

我總結了下,常規的算法數據結構大概有以下 5 種,你可以選擇一招鮮喫遍天,把它們死啃下來。當然,當你開始入門並上手算法題,也會從中找到樂趣和成就感。(這道題我只要 O(1)時間複雜度!不需要額外空間!給你們看看我的題解)

  • 數組與矩陣

  • 鏈表

  • 棧和隊列

  • 字符串

  • 位運算

哪有什麼天生如此 只是我們天天堅持.

4

書籍/文章推薦

網絡相關

  • 《計算機網絡》(第七版) – 謝仁希
    這本書可以看 第五章-運輸層, 系統性的學習 TCP/UDP 協議

  • HTTP 相關的可以看看我的專欄:HTTP系列,面試必備悔無早學 https://blog.csdn.net/qian520ao/category_9390810.html

  • 或者訂閱極客時間的課程: 透視HTTP協議

附加參考書籍:

  • 計算機網絡(原書第7版) : 自頂向下方法

  • 圖解TCP/IP(第5版)

  • 圖解HTTP

java

以 JVM、線程與併發、集合 爲大綱進行知識拓展。

JVM:

  • 《深入理解Java虛擬機》-- 周志明

  • 或者閱讀我的專欄: 《深入理解Java虛擬機》的讀書筆記 , 大廠問的JVM相關問題基本能覆蓋到。 https://blog.csdn.net/qian520ao/category_9271488.html

線程與併發:

  • 《Java併發編程的藝術》-- 方騰飛 / 魏鵬 / 程曉明

集合:

  • ArrayList、LinkedList、CopyOnWriteArrayList

  • HashMap、LinkedHashMap、ConcurrentHashMap

  • SparseArray、ArrayMap

附加參考書籍:實戰Java高併發程序設計(第2版)

這裏推薦氪肝男孩 jsonchao 的 Android面試 Java篇 , 以這篇文章提及的知識點作爲複習內容,系統深入的學習 java。

https://juejin.im/post/6844904079152381959

Android

Android 涵蓋點比較廣,建議以官方文檔爲主 :Android 開發者指南 ,官方文檔很詳細並且幾乎覆蓋所有的 Api ,如果你想學習Jetpack, 也建議從官方文檔入手 Android Jetpack ,比大多數博客更權威,是一種不錯的知識和資源獲取途徑。

可以把 Android 分爲以下幾個大綱

  • Android 基礎Api : RecyclerView、Handler、Jetpack…

  • Android 系統源碼 : Activity源碼、View繪製機制、事件分發機制、Window機制、AMS、WMS、PMS、Binder。

  • Android 第三方庫 : Okhttp、Glide、EventBus、ARoute等

  • Android 性能優化 : 卡頓、內存、啓動、崩潰、安裝包、ANR…

按照上面大綱展開拓撲結構學習,最終形成知識大網。當然每個知識點都需要深入探索

Android 系統源碼 可以嘗試看看我的Android源碼專欄 《Android源碼分析系列》 ,不僅有源碼分析,而且有關聯有總結,容易形成網狀知識結構。 https://blog.csdn.net/qian520ao/category_7292173.html

Android 性能優化 直上雲霄的 Android開發高手課 , 作爲應用的性能優化可以說是一門相當優秀且卓越的課程。

附加參考書籍:

  • 《Android開發藝術探索》

  • 《深入理解ANDROID 卷3》

  • 《Android進階解密》

算法

算法沒有什麼竅門,多學多練多總結

訓練階段可以按照

  • 《算法 第4版》 學習數據結構和算法思想 , 或者按照極客時間上王爭的 數據結構與算法之美 課程來學。

  • 預備了理論知識後開始編碼上手, 先按照 《劍指offer》 這本書的算法題目在牛客網上刷題 牛客網–劍指Offer

  • 可以說當你把《劍指offer》算法題都刷完了,算法這一關的通過率可以達到 60%。如果想要有更高的造詣,那就按照Leetcode 題解 - 目錄上整理的題目大綱以及解題思路,更全面系統的提升算法能力。到達這一步,算法面試的通過率可以達到 90% 。

4

寫在最後

這篇博客主要在於總結和覆盤,所以沒有涵蓋太多的面試題。

更多的是提供大廠技術面試的一個方向,他們如何考察面試者的水平。可以說大廠會系統性的篩選面試者,一二輪面試通過 java、Android 的技術問題了解面試者的基礎能力,能到達第三輪面試說明基礎能力合格,再通過項目問題考察面試者的項目/合作能力,當然如果是在線面試會有可能讓面試者寫編程題或者算法題。

對於面試者來說,能做的就是提升面試通過率,系統性學習和總結。

人在年輕的時候,最核心的能力是什麼?

我認爲是:篤定一件事並有耐心長久堅持的能力。

所謂的幸運,就是當你準備好了的時候,機會來了。

推薦閱讀

開發一個 IM App 需要會多少知識點?

推薦一個更貼近 android 場景的啓動框架 | Anchors

直面底層:經常用的ViewTreeObserver 背後的原理

掃一掃  關注我的公衆號

如果你想要跟大家分享你的文章,歡迎投稿~

┏(^0^)┛明天見!

相關文章