為什么要重視項目介紹?
你可以嘗試著講一遍你的項目經歷。我第一次講的時候就挺亂的,卡殼、專業詞匯匱乏、邏輯混亂、用詞不當、沒有介紹到項目重點……
項目經驗面試在面試中占很大比重,面試官通過一些專業性的技術問題來了解你的技術水平,問題從哪來?要么來源于結構化面試題庫(每個面試者的問題都一樣,多出現在校招一面),要么,就是從你的簡歷中項目經驗來。所以對項目整體而深入復習的重要性不言而喻。
介紹項目時面試官會考察應聘者的溝通能力和思考能力,我們大部分情況都是做產品的一個功能或一個模塊,但是即使是這樣,自己有沒有把整個系統架構或產品搞清楚,并能介紹清楚,為什么做這個系統?這個系統的價值是什么?這個系統有哪些功能?優缺點有哪些?如果讓你重新設計這個系統你會如何設計?這些都是值得你好好思考的。
項目介紹思路
這部分技巧對簡歷上的項目介紹也是通用的。
首先用一句話介紹這個項目做了什么,打個比方,我使用XX 框架實現了一個 XX
-
主要功能
挑亮點和創新點講,細碎的功能點一句帶過。
-
然后講基本的實現:主要運用到的技術點有XXX。
(這里面試官從你介紹的技術點切入考察,所以要好好回顧復習項目中運用到的技術點細節。)
-
架構
(面試官還會問一問為什么你選了這樣的架構/方法來實現。)
-
我在項目中的角色
主要介紹項目中的職責和作用,是多面手 or 組長 or 技術 。這點主要凸顯你的工作量和貢獻率。
注:可以在簡歷上附上項目github地址,上傳重點功能的演示 gif ,讓面試官可以很直觀地評估你的項目規模和難度。
面試官會考察些什么?
知己知彼,摸清面試官心理,你才能有針對性去準備。
1. 能力、技術
-
考察深度:深入了解哪個技術?
整個項目中用到了哪些開源框架?他們的實現思路是什么?你看過他們的源碼嗎?你不僅僅是要會用開源庫和第三方SDK,還需要知道實現原理和技術細節。不然一個都是第三方堆砌起來的App,問這個說不了解,用的第三方框架,問哪個說不了解,用的SDK,你還要面試官問什么?[攤手]
-
考察廣度
在進行技術選型的時候,你有過什么考慮,做過多少調查。詳細地了解不同的工具/框架 思想的對比。最后是什么原因,你選定了這個技術。記住一句話:技術沒有優劣,只有合不合適。功能點的實現方式有很多,往往選擇的是最適合的。
同時面試官可能會考察你是否關注產品數據,是否關注合理的工作流程,是否關注前后臺交互時的相關知識和流程,是否關注測試自動化、持續集成等其他方面。
2. 潛力
-
做項目中怎么解決問題?
主要展示自己解決問題的思路。
-
舉一反三的能力
面試官會提出和項目技術類似的點,考察你是否能將新知識點聯系到已學的技術,然后嘗試解決它。
-
優化項目哪些部分
面試官意在考察你的思考力和動手能力,開源庫多多少少都會有坑,你是否在應用中排查出坑并且能埋坑。
-
如何快速學習項目需要的技術點
首先,找資料順序是:官網文檔->權威書籍->google->StackOverflow->博客。其次,新技術的學習非常考驗基礎。打個比方,沒學過RxJava,但是如果你知道設計模式的觀察者模式,理解起來就很快。
3. 細節
-
sdk的細節了解在哪里
自己造輪子確實費時間,但是你又是否知道SDK做了哪些優化?
自定義控件優化
-
作品對比
自己的項目有沒有和市面上的競品比較過,客觀地評價下從別人的作品中學到了什么,基于此你有沒有改進自己的作品?
-
算法
主要是一些坑和解決思路、解決的靈感來源等,在項目中肯定會涉及到數據結構,比如緩存最近100條點擊記錄,超出100條則移除最早緩存的記錄,自己實現。可能你會想到用隊列或堆實現,那可以去看看緩存算法Lru算法的原理,用的什么容器,為什么這么設計?
4. 主動性
- 是否做過知識總結、知識沉淀?(這就是平時注重博客積累的好處了)
- 是否實踐過知識分享?
- 是否主動給項目提出過意見或建議?
5. 溝通能力
在面試的過程中,悄聲無息進行的還有另一項考察 —— 溝通能力。想想自己面談時是否能讓面試官感覺舒服,是否能清晰表達自己的要點,是否能清晰表達自己未來的個人發展規劃。可以嘗試模擬面試錄下音,看是否有過多的語氣詞表達出的不自信。
6. 例子
說了這么多,搞個直觀的例子談談。
問:
項目中推送是怎么實現的?
答:
剛開始做推送的時候,對目前主流的推送方案大致了解了一下。發現推送實現不止一種。
(展示技術選型和方案,簡單談下就ok)
(1)GCM服務
優點:Google提供的服務、原生、簡單,無需實現和部署服務端。
缺點:該服務在國內不夠穩定、需要用戶綁定Google帳號。
(2)XMPP:
優點:開放性,標準性,可擴展,跨平臺,且已有開源項目。
缺點:數據冗余(基于XML),不支持二進制數據,協議雖然完整擴展性雖然好,它耗費網絡流量很大,跑起來比MQTT慢很多;有高達70%的流量是耗費在XMPP本身的標簽和編解碼上面。
(3)MQTT
優點:協議簡潔、小巧、可擴展性強、省流量、省電。
缺點:不夠成熟、實現較復雜、服務端組件rsmb不開源,部署硬件成本較高。
(4)HTTP輪循
優點:實現簡單、可控性強,部署硬件成本低。
缺點:實時性差。
(體現技術細節)
所以后續選型,我選擇了 XMPP + MINA + AndroidPN 來實現推送。
(體現項目優化改進之處,體現自己的思考和能力,對開源項目進行改造)
但是 AndroidPN 開源項目也存在一些不足之處:
-
如果將消息從服務器上推送出去,就不再管理了。
我的做法是:客戶端收到推送后給服務端一個反饋,如果服務端在一定時間內沒有收到反饋,則重發。
-
androidpn服務器收到消息后如何知道要發給哪個用戶?
所以我加了個tag維度來做用戶分組
-
一旦服務器重啟了,客戶端似乎不會自動重連,需要用戶自己中斷后臺Service再重啟應用。
完善的方法是加上心跳機制和斷線重連
-
AndroidPN服務器不保存消息。就是說它一有消息就會發出去,即使客戶端根本不在線,它也不會重發。
解決方案是讓服務端保持對客戶端狀態的監控
再問:
怎么不用現有的極光推送?
答:
極光推送初始的版本文檔不全,接入麻煩,同時我對推送的原理很感興趣,所以想自己實踐下。
問題示例
最后,是面試官針對項目面試可能提出的問題匯總。
你參與的項目是獨立完成的還是團隊協作完成的,在團隊里是什么角色?是負責人還是參與者?
項目執行過程中的難題你是怎么處理的?
問一些專業性的技術問題來了解你的水平。
-
如果是沒有明確結果的項目,你從項目里學到了什么,有什么經驗教訓?
看你的項目經驗,還有思維邏輯性,對項目整體的認識,包括技術的選型和架構的設計等等。
項目技術點具體的使用場景,比如多線程的控制、性能優化、數據庫設計、加密混淆等等。
挑一個你最熟悉的項目講講吧。
-
講解你是怎么從0到1對項目進行開發和改造的。
題目確立 -> 產品需求開發 -> 概要設計 -> 詳細設計 -> 測試用例 -> 編碼 -> 測試 -> 優化 -> 宣傳視頻海報的制作。
開放性問題
當然,存在有的面試官傾向于問一些開放性的問題。主要看重你是如何解決問題的,看你的思維方式是怎么發散的。
比如面試官問我,你為什么覺得你做的產品就比別人好?你為什么要對你們的產品進行性能優化,主要瓶頸在哪里?你是通過什么方式進行優化?你優化的點是怎么考慮的?你在使用第三方服務是處于什么目的,你對它的評價是什么,它們給你帶來的好處是什么?讓你去思考如何更好的為開發者提供服務,你覺得還有什么東西是開發者需要的?你對開發工具類產品感興趣嗎?
可以從這些問題看出,面試官并不僅僅看重你的技術能力,還有你對產品的認識。面試官想找的人不僅僅要在技術上有亮點,還有其他方面能吸引到他們。
最后
最重要的一點:不知道的技術點不要不懂裝懂。很多時候我們都會遇到一個情況,就是面試官的問題我不會,這時候大多數情況下不要馬上說我不會,也不要糊弄回答,要懂得牽引,轉移話題往類似的你擅長的技術點方向去,不然當你抱著僥幸心理隨便回答出問題后,面試官會一直沿著往下深挖,挖到挖不出來為止,這就很尷尬了。
關于面試,你可能還想知道: