前言
本人是國內某985大三本科生,說來慚愧,大一剛學完C語言還是勉強會用函式的水平,準確來說我的程式設計生涯開始於大一下學期,這兩年間我算是進步速度比較快,中間也比常人花了更多時間在程式設計和看書上。
廢話不多說,下面是面經。
美團美團一面面了74分鐘,比較重基礎,演算法,作業系統,網路,Android,Java挨個問了個遍。
個人感覺還行,不過美團面試流程太慢,至今未等到二面。
演算法
常用排序演算法複雜度比較器用的哪種?快排怎麼寫?完全二叉樹高度為n結點最多有多少漢諾塔問題怎麼解決連結串列和陣列比較?作業系統
程序衝突生產者消費者問題設邏輯分頁和物理分頁好處是什麼什麼是髒記憶體網路
http1.1相比以前版本有什麼改變七層/五層模型tcpip分別對應哪層https的對稱加密Java
public等四個許可權關鍵字的區別synchronized的用法區別,可否巢狀hashmap底層實現,擴容策略,初始化arraylist和linkedlist的實現和區別classloader的作用,雙親委託gc演算法(優缺點)為什麼叫新生代老年代(晉升機制)強軟弱虛四種引用的區別Android
activity退出怎麼儲存資料怎麼把資料寫入檔案picasso的快取策略lrucache底層實現linkedhashmap底層實現快取檔案怎麼命名RxJava優缺點,實習專案相關自定義view有幾個構造方法,第三個引數作用listview的convert view作用,用viewholder為什麼可以最佳化他。百度百度一面問了很多效能最佳化的問題,
二維陣列二分查詢的最優演算法陣列元素從左到右從上到下遞增retrofit原理recyclerview和listview異同各自快取原理handler原理activity生命週期四種啟動模式區別singletask啟動standard的activity在哪個棧android多程序和多執行緒的實現程序和執行緒區別java泛型型別擦除發生在什麼時候,萬用字元有什麼需要注意的。hashmap刪除鍵值對的過程擴容演算法hashcode和equals有什麼關係java保證執行緒安全有哪些方法volatile和synchronized各有何作用瀏覽器開啟一個網頁的過程發生了什麼擅長android哪些方面?騰訊內推一面:
final作用下拉重新整理載入更多的原理RxJava優點mapflatmap的原理可不可以多次subscribeOn,ObserveOn,會有什麼後果lambda表示式?和匿名內部類的不同http協議和https,ssl和tls握手內推二面:
自我介紹,專案經歷java finalize關鍵字的用法try 裡面return了finally還會執行嗎?執行順序是?wait和sleep的區別,應用場景gc發生在什麼時候死鎖發生的條件tcp三次握手的過程?如果確認訊號沒傳到伺服器會發生什麼?為什麼不是兩次握手?一個無序陣列怎麼找出兩個和為特定值的數?快排後首尾兩遊標12個雞蛋有一個質量不同,如何只稱三次測出開發過程中有沒有實際遇到記憶體洩露情況,怎麼解決的activity四種啟動模式區別和應用場景service生命週期,兩種啟動方式的區別實現ipc的方法有哪些?handler的內在原理訊息佇列為空會怎樣?換主題功能怎麼實現?如果有機會來騰訊實習,你比較感興趣的技術有哪些?網申一面:
當時面完沒記錄,主要是針對簡歷提問,大致問了:
動畫handler的原理GC雙親委託模型容器類原始碼四大元件紅黑樹activity四種啟動模式及其用途Java實現執行緒安全有哪些方式TCP三次握手四次揮手執行緒程序區別Android多程序相關socket相關怎麼設計一個檢測記憶體洩漏的第三方框架為什麼用Picasso不用更好的庫RxJava相關手寫一個執行緒安全的單例模式網申二面:
技術總監面,學到了很多。基礎真的很重要。基礎不好就會更早迎來瓶頸。
大致問了專案:
NP問題斷點除錯功能怎麼設計也聊到一點在實驗室做過的APK逆向工程寫編譯器APP啟動過程以及其中的堆疊分配以及技術成長道路什麼的這是印象最深的一次我感覺面完非常暢快並且受益匪淺,正了我在技術方面的誤區,非常感謝面試官。
HR面:
HR面就輕鬆一點了。
面了哪些公司,為什麼沒過家庭情況愛好專案經歷和自己負責的部分,成績對部門瞭解多少看過哪些專業書籍想去哪裡發展,經常回家嗎和聊天差不多。面完第二天顯示已完成所有面試。
總結就是簡歷很重要,一份好的簡歷可以大大提升拿offer的機率,簡歷上實習經歷和專案經歷是亮點。
面試之前準備工作也很重要(尤其簡歷上的東西要非常熟悉,面經也可以刷一刷)。
基礎知識也很重要,切不可只會寫Android APP而忽視了演算法,網路等基礎。個人認為,對校招來說,想進大公司光能夠寫出漂亮的APP是不夠的。正如二面面試官所說那樣,非科班的也能做。
基礎和深度是很重要的,比如Android可以多看看原始碼或者原理,而Java,演算法,網路,作業系統,編譯原理這些都應該熟練掌握。下面推薦一些我大一到大三看過的技術書籍。
推薦書籍c++ primer plusefficient c++CSAPPthinking in java深入理解Java虛擬機器Android開發藝術探索Android開發進階:從小工到專家(何紅輝著)第一行程式碼第二版(郭霖著)effective Java作業系統概念演算法導論資料結構與演算法分析(Java語言描述)Java8函數語言程式設計劍指offer組合語言(王爽著)計算機網路(謝希仁著,據說是考研書)資料庫系統概念設計模式之禪(好在通俗,想了解更深還是《Android原始碼設計模式》更好)一些沒看過但是據說不錯的:
這裡給大家提供一個方向,進行體系化的學習:
1、看影片進行系統學習
前幾年的Crud經歷,讓我明白自己真的算是菜雞中的戰鬥機,也正因為Crud,導致自己技術比較零散,也不夠深入不夠系統,所以重新進行學習是很有必要的。我差的是系統知識,差的結構框架和思路,所以透過影片來學習,效果更好,也更全面。關於影片學習,個人可以推薦去B站進行學習,B站上有很多學習影片,唯一的缺點就是免費的容易過時。
另外,我自己也珍藏了好幾套影片,有需要的我也可以分享給你。
2、進行系統梳理知識,提升儲備
客戶端開發的知識點就那麼多,面試問來問去還是那麼點東西。所以面試沒有其他的訣竅,只看你對這些知識點準備的充分程度。so,出去面試時先看看自己複習到了哪個階段就好。
系統學習方向:
架構師築基必備技能:深入Java泛型+註解深入淺出+併發程式設計+資料傳輸與序列化+Java虛擬機器原理+反射與類載入+動態代理+高效IOAndroid高階UI與FrameWork原始碼:高階UI晉升+Framework核心解析+Android元件核心+資料持久化360°全方面效能調優:設計思想與程式碼質量最佳化+程式效能最佳化+開發效率最佳化解讀開源框架設計思想:熱修復設計+外掛化框架解讀+元件化框架設計+圖片載入框架+網路訪問框架設計+RXJava響應式程式設計框架設計+IOC架構設計+Android架構元件JetpackNDK模組開發:NDK基礎知識體系+底層圖片處理+音影片開發微信小程式:小程式介紹+UI開發+API操作+微信對接Hybrid 開發與Flutter:Html5專案實戰+Flutter進階知識梳理完之後,就需要進行查漏補缺,所以針對這些知識點,我手頭上也準備了不少的電子書和筆記,這些筆記將各個知識點進行了完美的總結。
3、讀原始碼,看實戰筆記,學習大神思路
“程式語言是程式設計師的表達的方式,而架構是程式設計師對世界的認知”。所以,程式設計師要想快速認知並學習架構,讀原始碼是必不可少的。閱讀原始碼,是解決問題 + 理解事物,更重要的:看到原始碼背後的想法;程式設計師說:讀萬行原始碼,行萬種實踐。
4、面試前夕,刷題衝刺
面試的前一週時間內,就可以開始刷題衝刺了。請記住,刷題的時候,技術的優先,演算法的看些基本的,比如排序等即可,而智力題,除非是校招,否則一般不怎麼會問。
關於面試刷題,我個人也準備了一套系統的面試題,幫助你舉一反三:
總結改變人生,沒有什麼捷徑可言,這條路需要自己親自去走一走,只有深入思考,不斷反思總結,保持學習的熱情,一步一步構建自己完整的知識體系,才是最終的制勝之道,也是程式設計師應該承擔的使命。