最重要的話寫在前面:本文不允許任何公眾號、論壇社區(qū)、微博轉(zhuǎn)載缅帘。原因請見上一篇開頭。
(上)篇說過我的面試方法經(jīng)過三個階段的變化难衰,下面說說最后一個階段钦无。
第三階段:現(xiàn)場寫代碼
面試的歷程開始之初,請面試者現(xiàn)場寫代碼這個想法就不時在我的腦海里浮現(xiàn)盖袭。畢竟同樣是程序員失暂,水平如何,看一眼代碼是最快了解的方法(所以所有附 github 鏈接的簡歷我都給過了鳄虱,總共只有兩人)弟塞。但一直比較猶豫,開始沒有采用這個方法拙已,最主要的原因是怕面試者會累宣肚。因為寫代碼總歸是比較累的,尤其是在短時間內(nèi)高度集中精力寫代碼悠栓。之前我自己去下家公司面的時候霉涨,幾輪面試總共讓我寫了三個小時的代碼按价,緊張到我懷疑人生。候選人當(dāng)天可能還會有別家公司的面試笙瑟,我實在怕累著人家楼镐。還有一個原因是寫代碼耗時長,而面試者太多往枷,老大讓我 40 分鐘過一個框产;40 分鐘夠?qū)懯裁茨兀?/p>
但有一位先生讓我下定決心要請后面的面試者現(xiàn)場寫寫代碼,哪怕只寫兩三行错洁。當(dāng)時我還在采取第二階段的問題秉宿,我問:“您在開發(fā)方面感覺遇到過什么難點?” 他回答:“平常主要工作是畫畫界面屯碴,感覺沒什么難點描睦。有一次做橫屏的時候感覺挺麻煩,因為總體要求豎屏导而,只有一個界面橫屏忱叭,然后鍵盤會有問題……”
我覺得這個回答挺靠譜的,因為單個界面橫屏確實有點麻煩今艺。另外一個問題:“您做過哪些重構(gòu)韵丑?” 對方回答,上家公司把外包代碼直接拿回來用虚缎,mvc 分層不清撵彻,一個 viewController 好幾千行,里面大量繪制代碼实牡;他把 UI 的繪制都盡量分出去到單獨 view 里做了陌僵。我一邊聽一邊點頭,剛畢業(yè)的時候領(lǐng)導(dǎo)也帶著我做過類似的事铲掐。到這里為止拾弃,我對面試者的印象很好值桩。然后后面聊到自己封裝過的控件摆霉,我隨口問了一句:“一般什么時候用 weak?”
對方回答:“weak 啊…… weak 一般就是用來修飾 int 那些的吧奔坟⌒埃”
這個回答出乎意料。我覺得可能是個小口誤咳秉,正好電腦就在面前婉支,我說:“weak 修飾 int 肯定會報錯的呀±浇ǎ”一邊順手敲出來向挖,果然那一行紅了蝌以。
然而對方只是呆住了。1 分鐘面面相覷的沉默何之。
送走這位先生跟畅,我對自己的面試水平再次產(chǎn)生了深深的懷疑。一個工作三年溶推,重構(gòu)過幾千行 viewController 的工程師徊件,為何會不知道 weak 不能用來修飾 int 呢。這次經(jīng)歷給我敲響了警鐘:第二階段采用的諸如“工作中遇到什么難點”這類一般性問題蒜危,雖然比知識性問題聊起來開心很多虱痕,但它有一個弱點,就是這些問題都是可以提前準(zhǔn)備的辐赞。也許這位面試者部翘,先去向開發(fā)經(jīng)驗豐富的朋友請教,把他們的回答一一背下來占拍,準(zhǔn)備出一套天衣無縫的說辭略就。如果去面一個沒人會 iOS 的公司,他可能會被認(rèn)定為很優(yōu)秀晃酒、很有經(jīng)驗表牢;如果我沒隨口問這個問題,我可能也會把他放過去了贝次。
于是我決定崔兴,對于后面的每個面試者,都盡量讓他/她現(xiàn)場敲幾行代碼蛔翅;保證一下招聘的下限敲茄,起碼要招一個會寫代碼的人……
既然決定要寫代碼,出個什么題目呢山析?我想的是封裝一個簡單的小控件會比較好堰燎,最后選定的是公告欄,就是文字上下自動滾動的輪播笋轨。類似螞蟻金服首頁“聚寶頭條”后面那樣的文字滾動秆剪,內(nèi)容做一行 label 即可,停 2s 滾動一次爵政。只需要向一個方向滾動仅讽,不需要用手指能拖。點擊時觸發(fā)點擊事件钾挟,打個 log 即可洁灵。
我對自己選定的這道題還是比較滿意的,難度不大掺出,同時可考察的點卻不少徽千。出題的時候苫费,我都會先給面試者看我在自家 app 實現(xiàn)的這個小控件,一方面是為了更清晰地說明題目双抽,讓對方可以一邊看著例子一邊想黍衙,有助于想到怎么實現(xiàn);另一方面也是為了防止人家誤會我們用面試騙代碼荠诬,騙他們幫我干活><
雖然功能很簡單琅翻,但代碼寫起來也需要時間。我跟面試者說的是柑贞,30 分鐘隨便寫方椎,電腦已翻墻,允許上網(wǎng)查任何資料钧嘶,寫多少算多少棠众,寫不完也沒關(guān)系,咱們看看代碼有决。最終做過這道題的 8 位面試者有兩位能實現(xiàn)到 90%闸拿,有一半直到時間過完對于怎么實現(xiàn)效果還是沒有頭緒。實際上只要能寫出雛形书幕、能口述出后面準(zhǔn)備怎么寫的新荤,我這邊都給過了。
真的讓面試者做現(xiàn)場寫代碼這么辛苦的事台汇,我心里還是比較愧疚苛骨。所以對于每一個寫了代碼的面試者,我都會一行行幫他們 review苟呐,但愿他們費了這些時間精力的同時也能得到一點點收獲痒芝,這是我唯一能補償他們的了 >< 從大家的代碼來看,出現(xiàn)的問題還是比較集中的牵素,主要如下:
速度與編碼規(guī)范
速度方面严衬,因為給的時間實在不夠,所以只要思路可以笆呆,并不要求代碼量多大请琳。手快的工程師 30 分鐘一氣呵成寫了一百多行代碼,我非常欽佩膜拜腰奋。也存在略為過慢的工程師单起,30 分鐘只寫了不到 10 行代碼抱怔,就畫了兩個 label劣坊,也沒來得及想后面的思路。這種情況會讓人不免擔(dān)心他以后的開發(fā)速度屈留,所以就直接不能通過了局冰。
有一位面試者比較特殊测蘑。一上來我會先自我介紹,然后請對方也簡單自我介紹下康二,其實一兩句話即可碳胳,3~5 分鐘都比較正常。但這位說了足足 20 分鐘沫勿,都是前公司如何做業(yè)務(wù)挨约、如何運營這些跟技術(shù)無關(guān)的事,而且沒有空隙产雹,我都找不到打斷的機會诫惭。請他做這道題,他一聽就說肯定有第三方的實現(xiàn)蔓挖。我說別找第三方的夕土,嘗試自己寫一下吧。過了半小時回來瘟判,發(fā)現(xiàn)他還是從 Github 上下了一個第三方的實現(xiàn)怨绣,放進工程里交差。我不太開心拷获,進去第三方的源碼問了他幾個細節(jié)篮撑,果然他也沒有太深入的考慮。如果在工程開發(fā)中匆瓜,找開源的實現(xiàn)當(dāng)然沒有問題咽扇,雖然個人覺得這種簡單的控件自己寫反而問題少一些。但是在面試中陕壹,我都明確說自己寫质欲,還堅持用第三方庫,難免讓人認(rèn)為是對開發(fā)能力不夠自信糠馆。
編碼規(guī)范方面嘶伟,看看大家的不同習(xí)慣還是挺有意思的。有些朋友不愛空格又碌,等號九昧、加減號兩邊一概不空格;有些命名時駝峰與下劃線混用毕匀;還有幾位只用 instance variable 的方法存變量铸鹰,不用 property。當(dāng)然無論有什么個人習(xí)慣皂岔,我覺得都可以用寬容的眼光看待蹋笼,避免橫加批判。但是編碼比較符合大眾化的規(guī)范,命名比較好讀剖毯,看的時候肯定是更有好感的~
UI 上如何實現(xiàn)輪播效果
其實最簡單的實現(xiàn)就是兩個 label 循環(huán)圾笨,一上一下,上面滾出屏幕之后再重回到底部即可逊谋。不過實際上大家想到的方案五花八門:有好幾位想用 UITableView擂达、 UICollectionView 的,有用 UIScrollView胶滋,把每一個 label 排上去的板鬓。我覺得選用哪種方案都沒關(guān)系,用 scrollView 的不重用也不是什么大事究恤,只要能實現(xiàn)效果就行穗熬。但是這些思路基本都是把每行文字先從上到下排好,然后再第一行開始丁溅,一行行往下滾唤蔗。這就帶來一個共同問題:到最后一行怎么辦呢?
有一位工程師想到把第一行文字復(fù)制到最后一行窟赏;滾動到最后一行之后妓柜,不帶動畫重回開頭,我覺得是非常聰明的做法涯穷。不過其他人要么沒有想法棍掐,要么說只能從最后一行嘩啦啦 scroll 回第一行了。這樣看起來效果是不夠好的拷况,我覺得是一個在設(shè)計之初就應(yīng)該考慮到的問題作煌。
傳值方式
因為要求在 label 上加點擊事件,就會涉及到開發(fā)中最基本的問題之一:怎么把點擊事件傳出去赚瘦。寫到這里的人不多粟誓,主要是提問+口述,發(fā)現(xiàn)現(xiàn)在大家還是喜歡用 block 的多起意。有一位很認(rèn)真地寫了一個 delegate:
@protocol ScrollLabelDelegate <NSObject>
- (void)scrollLabel:(ScrollLabel *)scrollLabel didSelectIndex:(NSUInteger)index;
@end
@interface ScrollLabel : UIView
@property (nonatomic, weak) id <ScrollLabelDelegate> delegate;
寫得很規(guī)范鹰服,一下就把我征服了~
在這里我會順便問一個問題:“如果要用 delegate,一般用什么關(guān)鍵字來修飾 delegate 屬性揽咕?” 有 3 位面試者都很干脆地回答:“用 assign 呀悲酷。”我跟他們講了為何用 weak 比 assign 好一些亲善,猜測他們可能是看了同一個過時的教學(xué)視頻设易,所以留下了相同的錯誤印象。雖然現(xiàn)在開發(fā)中 delegate 用得相對少一些蛹头,但這些比較基礎(chǔ)的內(nèi)容還是要知道的~
防止 timer 造成的內(nèi)存泄漏
像 timer 這種東西顿肺,大家肯定覺得都是很簡單戏溺,雖然 API 記不住,用到的時候現(xiàn)查就好了挟冠。這次出的題,我是允許上網(wǎng)查任何資料的袍睡。實際上同樣是上網(wǎng)現(xiàn)查知染,開發(fā)經(jīng)驗豐富的工程師速度就要快很多,而經(jīng)驗不足的工程師還是免不了踩坑 >< 有一位不知道怎么斑胜,30分鐘全都用在試圖開一個 dispatch 的 timer 上控淡,還把自己帶的電腦的代碼拿出來抄,到最后這個 timer 還是沒調(diào)出來……
有好幾位用的 NSTimer止潘,把 timer 保存成一個 strong 的屬性掺炭,然后 timer 的 target 設(shè)為 self。當(dāng)我問到 timer 有些 API 會 retain 它的 target凭戴,會不會造成循環(huán)引用涧狮,這樣是不是有內(nèi)存泄漏的風(fēng)險?大部分工程師都表示沒聽說過么夫,還有一位回答:“沒關(guān)系者冤,只要在 dealloc 方法里把 timer 置為 nil 釋放掉就可以了〉祷荆” 但如果真的形成了循環(huán)引用涉枫,就不會自然走到 dealloc 方法。
回想上一篇文章腐螟,一些評論噴我問的問題是裝X愿汰,平常開發(fā)反正也用不到,用到時候再查不行嗎乐纸,有什么百度解決不了的問題嗎衬廷?我個人也不喜歡那種很底層、很偏的面試題汽绢,也同意網(wǎng)上很多面試題是平常開發(fā)用不到的泵督;但就這個細節(jié)來看,開發(fā)工程師了解一些內(nèi)存管理的知識還是有一定必要庶喜。這里如果考慮到了內(nèi)存泄漏小腊,只需 google “NSTimer retain cycle” 就有一堆一堆的結(jié)果,很容易就能找到解決方法久窟。但如果對這些沒概念秩冈,可能都不會意識到有這個問題的存在;或者像回答“在 dealloc 方法里打破循環(huán)引用”的那位朋友斥扛,想當(dāng)然地以為問題已經(jīng)解決入问。對于這些工程師來說丹锹,他們會想到去 google 一下嗎?最終結(jié)果就是一個隱患埋進工程里芬失。
面對“有什么百度解決不了的問題嗎楣黍?”,常見的問題確實沒有解決不了的棱烂,但前提是要大概有個概念租漂。所以雖然上篇文章被噴,過段時間我還是準(zhǔn)備學(xué)一點底層的知識颊糜,就算細節(jié)看完了就忘哩治,能補充下知識框架也是有好處的~
印象深刻的面試者
關(guān)于面試的經(jīng)驗,我能想到的都毫無保留地跟大家分享了衬鱼。最后一點篇幅业筏,跟大家閑聊一下印象深刻的面試者吧~
關(guān)于史上最短面試
給我印象最深刻的面試者非這位莫屬。
雙方剛坐下鸟赫,我說:“您好蒜胖,很高興認(rèn)識您,我先自我介紹一下:我是這公司的 iOS 開發(fā)抛蚤,在這公司快兩年了翠勉,一直是我一個人做……” 跟每個人我都先說這同一句開場白。
對方打斷我:“那咱們公司是獨立開發(fā)嗎霉颠?”
我:“是的对碌,不過公司6月會再招1~2個人≥镔耍”
一段沉默朽们。
我:“您換工作是想找一個不是獨立開發(fā)的嗎?”
對方:“是的诉位∑锿眩”
一段沉默。
對方:“那要不咱們今天就先這樣苍糠?”
然后起身走了叁丧。留下目瞪口呆的我。
大概是史上最短面試了岳瞭,哈哈哈拥娄。對方非常爽快,也節(jié)約了雙方的時間瞳筏,我很感激稚瘾。從此以后我的開場白多了一句:“這個職位是獨立開發(fā)的,能接受嗎姚炕?”
關(guān)于培訓(xùn)
做 iOS 的摊欠,對培訓(xùn)機構(gòu)的厲害都或多或少有所耳聞丢烘。有些朋友對培訓(xùn)出來的工程師一概否決,我倒是對培訓(xùn)機構(gòu)沒有反感些椒,我們這個級別的公司也無法要求太多播瞳。培訓(xùn)本身不是問題,簡歷造假才是問題免糕。所以對于幾位坦承自己是培訓(xùn)出來的面試者赢乓,感謝他們的誠實,我都愿意額外多給一些機會说墨。遺憾的是骏全,這幾位技術(shù)確實也都不過關(guān)苍柏,不知道是不是一個巧合尼斧。
有一些簡歷明顯能看出有偽造的痕跡,比如 95 年的孩子說三年工作經(jīng)驗试吁。我們篩簡歷篩掉了棺棵,不知為何 HR 還是幫忙約來了。自己解釋是有個親戚如何超生云云熄捍,最后造成自己身份證年齡兄蛐簟;兩年前那時候雖然培訓(xùn)班還不是特別火余耽,他出去面試缚柏,人家都不相信,說他是編的…… 一套話說得很熟練碟贾。簡單問兩個技術(shù)問題币喧,不知 delegate 為何物。我覺得并不意外袱耽,主要是前面的解釋過于流利了杀餐,有種銷售的感覺,感覺就不像真的了朱巨。
有一位大哥讓我印象很深史翘。他拿出自己帶的簡歷,把自己的學(xué)歷冀续、學(xué)位琼讽、四級證書全打印出來附到簡歷上了,厚厚一大疊洪唐。最后竟然還有離職證明跨琳,上面還蓋著紅章…… 面試時,他兩手平放在膝蓋上桐罕,并不看我脉让,直視前方桂敛,像背書一樣地說:“我叫某某某,5年工作經(jīng)驗溅潜,于某某年至某某年在某某科技有限公司工作术唬,某某年至某某年在某某網(wǎng)絡(luò)公司工作……” 技術(shù)問題完全聊不通,問他重構(gòu)過什么代碼滚澜,他說每次新建一個 view 都會重構(gòu)系統(tǒng)的 initWithFrame粗仓。我把他送走,覺得心里很難過:大哥年紀(jì)比較大设捐,至少 30 多了借浊,一看就是個很實在的人,完全不會騙人的樣子萝招;這樣去面試蚂斤,估計沒有公司會看不出來。要放棄的話槐沼,又不知道他在培訓(xùn)上投了多少積蓄和時間曙蒸。這件事讓我對培訓(xùn)機構(gòu)產(chǎn)生了很多惡感,為了多賺幾個錢岗钩,把這些根本不適合入行的人花言巧語騙了進來纽窟,讓他們陷入這樣困難的境地,去做這些不得以的事兼吓。
關(guān)于妹子
本次招聘共有兩位面試者是妹子臂港,只占了不到 1/10。不過她們的表現(xiàn)都不錯视搏,技術(shù)上都是過關(guān)的审孽。一個共同特點是溝通很優(yōu)秀,聊起來很輕松愉快凶朗。雖然最后結(jié)果比較遺憾瓷胧,一位妹子長期嚴(yán)重加班,沒什么時間學(xué)習(xí)棚愤,在老大一關(guān)沒有通過搓萧;另一位技術(shù)優(yōu)秀,經(jīng)驗也比較豐富宛畦,可惜自己希望轉(zhuǎn)管理瘸洛,可能感覺在我們這個規(guī)模的公司沒有發(fā)展空間吧。
所以就本次個例來看次和,感覺妹子普遍技術(shù)還不錯反肋,溝通也很有優(yōu)勢。但愿她們都能順利找到理想的工作踏施,也希望業(yè)界能少一些偏見石蔗,給妹子同等的機會罕邀,相信她們也能為公司帶來相匹配的貢獻。
關(guān)于優(yōu)秀的面試者
上一篇文章被噴了养距,雖然我很難過诉探,其實想想也能理解。反復(fù)列舉面試者各種表現(xiàn)欠佳的地方棍厌,行文確實容易給人一種盛氣凌人肾胯、居高臨下的感覺,比較招噴耘纱。
但真正招聘的過程遠沒有這些表面風(fēng)光敬肚。尤其是偶爾遇到一位優(yōu)秀的面試者,聊得很舒服束析,真是心里深受感動艳馒,幾乎是乞求的心態(tài)求人家來吧 >< 但結(jié)果人家可能并看不上我們,絕塵而去畸陡。這么來看鹰溜,突然覺得招聘跟相親差不多虽填,就是一個反復(fù)失望丁恭、互相傷害的過程;不僅求職方可能會高不成斋日、低不就牲览,招聘方也容易如此。
公司被拒絕的最主要原因大概是獨立開發(fā)恶守。上面說過有一位工程師聽說是獨立開發(fā)第献,扭頭就走了。還有兩三位優(yōu)秀的工程師兔港,雖然客氣一點庸毫,走完了面試的流程,但后面也明確提出不傾向于獨立開發(fā)衫樊。這種想法是很可以理解的飒赃,因為他們技術(shù)都非常不錯,都提到日常級別的開發(fā)已經(jīng)沒有任何能難住他們的問題了科侈,可能到了一個獨立開發(fā)的瓶頸階段载佳;這時候希望能有技術(shù)復(fù)雜一點的項目,或者大神帶帶自己臀栈,是一個很正常的想法蔫慧。小公司招人、留人最大的困難权薯,可能就在于此吧姑躲。
即使有幸人家能看得上我們睡扬,還可能有各種其他原因?qū)е抡劜怀伞1热?HR 可能會有一些自己的考慮黍析,有位非常熟練的工程師威蕉,老大也很滿意,HR 以跳槽太頻繁橄仍、興趣愛好過多的理由否決了韧涨。雖然不知道何為“興趣愛好過多” >< 但半年一次跳槽,引起 HR 擔(dān)心也是沒辦法的事侮繁。
再比如一位工程師虑粥,我請他自我介紹,他一副垂頭喪氣宪哩、不想說話的樣子娩贷,不介紹自己,只是發(fā)呆望著空氣锁孟、又反問我工作時間彬祖、加班情況。雖然對方不大客氣品抽,我還是提醒自己盡最大努力保持耐心和微笑储笑,認(rèn)真跟他聊。沒想到就這樣遇上了整個招聘中技術(shù)最優(yōu)秀的面試者:各種底層問題我盡力往深里問都能答出來圆恤,能看出水平在我之上突倍;小控件看一眼就說出清晰思路,我一聽就不用讓他寫了盆昙,直接過羽历。
雖然技術(shù)非常優(yōu)秀,但面試過程遠談不上輕松淡喜,他聽到每個問題基本都是皺著眉秕磷、一臉不開心,沉默一會才說出答案炼团,不時夾雜著嘆息澎嚣。他坦言上家公司嚴(yán)重壓榨過度、連軸加班们镜,自己現(xiàn)在已經(jīng)非常疲憊币叹、精力完全耗盡了。結(jié)果不出意料掛在了老大一關(guān)模狭,老大說颈抚,他只聊了兩句話就把人送走了,說感覺不到任何工作的激情,不適合公司現(xiàn)階段發(fā)展贩汉。當(dāng)然驱富,可能人家也沒看上我們公司。唉匹舞,還是真心祝福這個哥們換個輕松點的工作吧褐鸥,或者休個假放松一下也好,這樣下去真怕他抑郁了…… 以他的技術(shù)找個大廠完全沒問題赐稽,不過精神狀態(tài)不調(diào)整一下的話叫榕,找任何工作都會比較困難吧…… 也提醒廣大碼農(nóng)涤伐,照顧好自己疟暖,小心職業(yè)倦得昂凇至扰;如果感覺工作已經(jīng)耗盡了自己的全部活力,還是多為自己考慮吧陨亡,犧牲了健康不值得拧篮。
最后說說我們最終招到入職的小伙伴隐岛。其實看到他的簡歷史飞,有不錯的公司經(jīng)驗尖昏,我內(nèi)心就踏實一半了;聊了聊果然溝通很輕松构资、技術(shù)很優(yōu)秀抽诉。然后我就開始暗自祈禱,老大給過吧 HR 給過吧老板給過吧讓他來吧拜托了…… 所幸后面一路綠燈蚯窥,三天后就入職了掸鹅。目前工作了兩周塞帐,干活超快拦赠,各種給力:)一再感謝上天,能遇見一個對的人葵姥,會明白前面的所有辛苦都是值得的荷鼠。
篇幅寫到跟(上)篇差不多,也寫得很累了 >< 就到這里吧榔幸。感謝閱讀允乐,求輕噴。最后還是祝大家都能招到滿意的人才削咆,找到理想的工作:)