1.如何準(zhǔn)備代碼考查
很多面試的能力都不是突擊可以獲得的。項目經(jīng)歷不是,代碼能力也不是。如果說項目經(jīng)歷的獲取還需要環(huán)境支持的話雄嚣,代碼能力的提高基本只需要自己投入就可以了。
在網(wǎng)上有很多練習(xí)編程的網(wǎng)站,特別是像面向求職者的 LeetCode 一類的網(wǎng)站缓升,提供了各大公司的代碼考察題目鼓鲁,并且大部分題目還有標(biāo)準(zhǔn)解答和示意代碼。你可以在上面一遍一遍地練習(xí)港谊,以提高自己的代碼轉(zhuǎn)換能力和邏輯思維能力骇吭。我建議大家至少做 100 道 LeetCode 里面 Facebook、Apple 這些大公司的代碼題目歧寺,很多題目都設(shè)計得非常好燥狰,既是很好的練習(xí)題,又可能在實際工作中用到斜筐。Google 的面試題通常還要更難一些龙致,對自己要求更高的同學(xué)也可以挑戰(zhàn)一下。
除此之外顷链,在紙或白板上寫代碼的能力也需要好好練習(xí)目代。紙上寫代碼麻煩的地方在于不方便及時涂改,所以需要思考得比較清楚再動手寫嗤练。準(zhǔn)備一些 A4 紙榛了,然后拿 LeetCode 題目多練習(xí)幾次,慢慢就會有感覺煞抬。
我最后總結(jié)出來在紙上寫代碼的要訣是:一定要先把整體邏輯框架梳理清楚霜大,然后再填充細節(jié)。所以你可以用文字此疹、流程圖或任何你喜歡的方式先把代碼整體邏輯描述在紙上僧诚,然后檢查沒有邊界問題后遮婶,再在紙上細化成具體的代碼蝗碎。
2.寫代碼之外的溝通
即使是做代碼題目,必要的溝通交流也是必須的旗扑。我見過很多候選人聽完題目就埋頭寫代碼蹦骑,完全不和面試官交流,這其實是非常錯誤得做法臀防。如果寫代碼完全不需要交流眠菇,那么為什么不當(dāng)做筆試題,而要耽誤面試官的時間坐在你旁邊袱衷?難道就只是為了監(jiān)督嗎捎废?
其實,解決一道代碼題目的思考過程是非常有價值的致燥,面試官問你一道代碼題目登疗,其實是希望和你一起溝通交流,了解你的思路,幫助你找到最好的解法辐益,最后才是把代碼完成的事情断傲。
所以,當(dāng)面試官給你一道題目智政,你首先要做的是和面試官足夠地交流认罩。你可以首先確保你完整地理解了題意,這可以通過詢問題目的一些細節(jié)來達到续捂,比如問輸入的數(shù)據(jù)范圍垦垂,輸出的具體要求,一些異常的情況是否要考慮等等牙瓢。
等你完全理解題意之后乔外,下一步就是將你的想法說出來。你完全不必擔(dān)心沒有一下子說出最好一罩、最完美的解法杨幼,大部分好的代碼題目都可以一題多解,你可以先說一個最簡單直接的方法聂渊,然后說出這種方法的時間復(fù)雜度差购、空間復(fù)雜度。一般面試官都會問你有沒有更好的做法汉嗽,或者你也可以直接說想思考有沒有更好的做法欲逃。接著你可以試試看能不能想出一些辦法,即使一些辦法沒有完全想清楚所有細節(jié)饼暑,也可以說出來稳析。好的面試官如果發(fā)現(xiàn)你的方法完全方向不對,還可以及時干預(yù)弓叛。
你如果在思路上有卡住彰居,你甚至可以請求面試官給你一些 “提示”。雖然這可能使得你面試表現(xiàn)稍微減分撰筷,但是比起完全沒有寫出代碼來說也要好很多陈惰。
除了寫代碼之前和面試官交流、確認解法毕籽,寫完代碼之后抬闯,你也需要和面試官討論你的代碼細節(jié)問題。通常代碼中多多少少會出現(xiàn)一些問題关筒,面試官會給你一些引導(dǎo)溶握,幫助你發(fā)現(xiàn)并且修改有問題的代碼。
3.如何準(zhǔn)備系統(tǒng)設(shè)計
如果你是一個應(yīng)屆生蒸播,通乘埽考查的系統(tǒng)設(shè)計題都不太難,你只需要有一些系統(tǒng)設(shè)計的基礎(chǔ),都不至于完全答不上來肉微。在準(zhǔn)備資料上匾鸥,可以看看《設(shè)計模式》相關(guān)的書虑瀑。如果有機會實習(xí)榨汤,可以多嘗試一些不同的職位,如果你同時嘗試過客戶端和服務(wù)器端開發(fā)举瑰,在系統(tǒng)設(shè)計上就可以更加綜合考慮設(shè)計方案在多端的實現(xiàn)難度劳曹,以便做出權(quán)衡奴愉。
另外,你可以通過學(xué)習(xí)分析一些開源項目的代碼铁孵,來學(xué)習(xí)架構(gòu)設(shè)計锭硼。在網(wǎng)上,你通常也可以搜索到一些常見的系統(tǒng)設(shè)計題目蜕劝,在本書的上一節(jié)中檀头,我也提供了好多系統(tǒng)設(shè)計題。把這些系統(tǒng)設(shè)計題目仔細研究岖沛,嘗試自己實現(xiàn)一下暑始,通過實踐并且和同學(xué)討論,相信你也會有不錯的成長婴削。
雖然沒有標(biāo)準(zhǔn)的答案廊镜,但是系統(tǒng)設(shè)計還是有一些解題套路,下面我就給大家介紹一下唉俗。
首先系統(tǒng)設(shè)計題都非赤推樱考查一個人知識的全面性。所以大家應(yīng)該平時多了解一些 iOS 之外的技術(shù)虫溜,比如適度了解一下 Android 端雹姊、Web 端以及服務(wù)器端的各種技術(shù)方案背后的原理。你可以不寫別的平臺的代碼吼渡,但是一定要理解它們在技術(shù)上能做到什么容为,不能做到什么乓序。你也不必過于擔(dān)心寺酪,面試官在考查的時候,還是會重點考查 iOS 相關(guān)的部分替劈。
在知識足夠?qū)挿旱那闆r下寄雀,你需要首先和面試官明確問題的各種細節(jié),比如假如題目是“設(shè)計一個類似微博的信息流應(yīng)用”陨献,你需要了解清楚這個信息流應(yīng)用更多的技術(shù)要求盒犹,比如:
信息流的內(nèi)容是否包括圖片,文字,語音急膀。
平均每個用戶每天有多少的信息流更新量沮协。
是否需要做圖文混排。
是否需要做圖片的緩存卓嫂,歷史信息的緩存慷暂。
斷網(wǎng)情況下是否需要顯示離線內(nèi)容。
發(fā)送失敗情況下是否需要暫存內(nèi)容晨雳。
系統(tǒng)對核心功能的性能(例如發(fā)送行瑞,刷新)的要求是多少。
有一些技術(shù)細節(jié)可能是面試官想考查的餐禁,你問的時候他就會要求多一些血久;有一些技術(shù)方案明顯很復(fù)雜的,你提出來帮非,他即使不考查你氧吐,也會覺得你的考慮是足夠周全的。
在確定技術(shù)細節(jié)要求后末盔,你就可以開始講你的系統(tǒng)架構(gòu)設(shè)計了副砍,這個時候講的要訣是先框架,再細節(jié)庄岖。你需要先把各個模塊的層次畫出來豁翎,比如剛剛那道題目,你先介紹一下整體 App 是怎么和服務(wù)器通訊的隅忿,服務(wù)器端的信息流大概是如何存儲的心剥,然后你就需要詳細介紹 App 的部分。
在介紹 App 的框架時背桐,先畫出 Model 層优烧,Controller 層,View 層链峭。然后再進一步細化畦娄,比如把 Model 層細化到本地存儲,圖片緩存弊仪,網(wǎng)絡(luò)請求等模塊熙卡。View 層如何處理圖文混排,Controller 層如何與其它層通訊励饵。
當(dāng)框架介紹得差不多的時候驳癌,你需要把后續(xù)的選擇交給面試官。面試官可能會選其中某一個模塊役听,讓你做更細一步的設(shè)計颓鲜。比如讓你設(shè)計網(wǎng)絡(luò)通訊的 RESTful 接口表窘,細化緩存相關(guān)的 API 名字。面試官甚至可能選一兩個具體的函數(shù)甜滨,讓你寫寫乐严。面試官也可能進一步挑戰(zhàn)你的一些設(shè)計細節(jié),這個過程中衣摩,你可能需要修正自己的設(shè)計麦备,也可能需要解釋你的設(shè)計。
5.復(fù)盤
復(fù)盤是一個人持續(xù)提高和進步的源泉昭娩。也許你覺得你的面試表現(xiàn)很好凛篙,但是為什么面試沒有通過呢?當(dāng)你被拒的時候栏渺,與其抱怨面試官或者面試流程不公正呛梆,倒不如靜下心來想一想,看看是不是自己忽視了某些細節(jié)或者關(guān)鍵點磕诊。如下圖所示:
除了復(fù)盤算法和系統(tǒng)設(shè)計題填物,也需要復(fù)盤一下自己整體的面試流程是否表現(xiàn)正常。例如:
(1)我的自我介紹是否流利霎终?
(2)我的項目溝通是否介紹清楚了滞磺?
(3)面試官有沒有完全理解我介紹的項目挑戰(zhàn)?
(4)我的時間控制是否到位莱褒?
(5)我有沒有遲到击困,中途接電話,或者任何被認為不禮貌的行為广凸?
(6)我做得不好的地方阅茶,有沒有短期可以改善的?
(7)我做得不好的地方谅海,短期不能改善的脸哀,我能不能用別的方式適當(dāng)彌補?比如面試中強調(diào)自己的強項扭吁。
每次面試后撞蜂,做一個小結(jié),可以使得自己每次都會有一點點進步侥袜,幾十場面試下來蝌诡,相信大家都會有不小的成長。