你準備好了嗎?加油呀!
本文作者
作者: 兇殘的程序員
鏈接:
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 的技術問題了解面試者的基礎能力,能到達第三輪面試說明基礎能力合格,再通過項目問題考察面試者的項目/合作能力,當然如果是在線面試會有可能讓面試者寫編程題或者算法題。
對於面試者來說,能做的就是提升面試通過率,系統性學習和總結。
人在年輕的時候,最核心的能力是什麼?
我認爲是:篤定一件事並有耐心長久堅持的能力。
所謂的幸運,就是當你準備好了的時候,機會來了。
推薦閱讀 :
推薦一個更貼近 android 場景的啓動框架 | Anchors
直面底層:經常用的ViewTreeObserver 背後的原理
掃一掃 關注我的公衆號
如果你想要跟大家分享你的文章,歡迎投稿~
┏(^0^)┛明天見!