今年的春招(暑期實習)批已經過去大半了,相信不少同學已經拿到了心儀的offer了~本來打算暑假有空再寫寫這段經歷,不過今天正好有空就記錄一下吧,希望能給正在或者今後要找前端實習、工作的同學一點點啟發和建議。(由於我妹子在北京讀書,所以實習的話我只想著申請北京的實習機會,這是本文的大前提)。
我自己是北郵研二的學生,「主修」前端。我自己的面試經歷不多,從1月份到現在總共只面了3家:頭條,騰訊·微信和螞蟻金服·支付寶,很幸運都拿到了offer。其實我覺得主要還是內推對我的幫助特別大,沒有內推的話我估計也很難拿offer了。所以經驗第一條:能找內推儘量通過內推來獲取面試資格。幫你內推的學長學姐一般會幫你查看(甚至修改)簡歷,有的可以直接部門直推給leader,等於省去了HR篩簡歷的步驟,所以能找到內推就儘量走內推而不是單純走網申吧。
頭條
1月份的時候有個頭條的學長通過郵件聯繫到我,對我的做的PicGo很感興趣。跟我要了非常簡陋的簡歷,就把我內推了。
不過後來面試郵件發來後我才知道給我的推的職位是iOS研發工程師。他們組是移動端的組,要招前端,但是可能沒有前端名額,就用iOS的職位給我內推了。然後我也就稀裡糊塗的去面試了。說實話畢竟是第一次面試,並且當時周邊的同學也都沒有開始找實習,在僅有的幾天時間裡我準備的特別不充分。
頭條總共面了我三面,都是視頻面。其中一面二面是連著的(一面一結束,馬上二面面試官來面我)。由於這個組的性質比較特殊,來面我的面試官都不是寫前端的,因此問的網絡、計算機相關的問題會更多點。我事後(3月份面完微信和螞蟻之後)才覺得當時1月份面頭條的時候簡直回答得一塌糊塗。
不過感覺自己做的很正確的一件事就是面試完馬上把問題記下來了。從中也看出三家公司的側重點不同。
頭條一面
頭條一面是個年輕的小哥,是做移動端的。先問了我的項目,因為都是前端的他也沒太瞭解,就開始問問題了:
- UTF-8 UTF-16 和 Unicode 什麼關係 【當時不會 | 編碼規則和字符集】
- TCP三次握手可以理解,為什麼需要四次揮手 【四次揮手是2+2】
- 常見的HTTP狀態碼 【相信你們都會】
- GET\\POST請求區別 【常規問題】
- HTTP報文分為幾部分,分別說了啥,頭部尤其重要 【當時說的不全 | 3個部分,以及請求和響應報文的區別】
- HTTPS與TLS或者SSL有了解麼,加密是對稱加密還是非對稱加密 【當時不是特別瞭解 | 二者都有】
- JS內存管理機制 【標記-清除】
- 數組和鏈表區別和應用場景 【查找-操作】
- 動態數組如何實現,查找和插入哪個代價大【當時不會】
- Electron的原理,簡單描述 【Node.js+NativeApi+Chromium】
- Vue的原理,簡單描述 【Object.defineProperty + Dep + Watcher】
- 平時怎麼學習新知識,從什麼渠道 【博客、掘金、GitHub、StackOverflow等】
- 開發項目中遇到最困難、最有挑戰的事 【PicGo的插件系統】
- 算法題1,求數組裡最大和的子數組 【思路說了,沒寫出來】
一面算法題雖然思路說對了,但是沒寫出來的時候我覺得自己已經涼了。結果居然面試官說「你等一下,我去叫二面面試官」。
頭條二面
和一面就隔了3分鐘。二面是交叉面,是另外一個部門的面試官來面的。這個面試官年齡一看就比一面面試官大。簡單自我介紹之後,他就開始問我問題了:
- 如果我是一個Leader,想要把APP裡某個頁面的首次開屏渲染時間降低,如何協調前端、服務端、客戶端同學。【我說了緩存相關的,不過面試官說不夠】
- 從輸入一個URL到最終用戶看到界面,經歷那些步驟【常規題】
- 對HTTP/2有沒有了解,以及QUIC協議【都瞭解過,稍微說了一下我的認知】
- HTTP緩存,304狀態碼如何而來【常規題】
- 算法題2,單鏈表是否交叉,如何算重疊個數【說了一下思路,但是不是最優解】
算法題2現在看來真的超級簡單。當時我真的沒刷過題,平時對算法訓練也很少,所以說的思路能過但是不是最優解。面試官說「行吧」(當時覺得涼了哈哈)。
頭條三面
三面和二面隔了大概幾天吧。其實面完二面覺得還是很懸,結果還是收到HR的三面約時間電話。三面面試官是部門leader了。這個面試相對來說最輕鬆,基本沒有問什麼複雜的問題:
- 談項目 【簡歷上的,主要是PicGo】
- Electron原理 【一面說過了】
- markdown渲染原理 【正則匹配】
- 對前端框架的想法 【從開發效率到後期維護還有工程化角度說了自己的認知】
- 有什麼想問的 【問了以後要做啥】
由於卡著1月底快過年了,所以HR那邊在年前給了我口頭offer,年後回來就給我發了正式的offer。
作為人生中第一份offer,還是挺激動的。不過不是 前端開發 的職位讓我心裡一直有點不舒服。我想去的其實是專業的前端團隊,以及之後入職後做的東西也不是自己特別喜歡的,所以我在想著年後回學校再找找有沒有自己更喜歡的實習崗位。當然頭條這個崗位也很棒了!
經驗總結二:算法、數據結構和計算機、網絡基礎知識很重要,哪怕是前端研發工程師,也是一名工程師。 所以我寒假回去後就開始針對自己薄弱的算法和數據結構部分開始了惡補。
騰訊今年春招(暑期實習)開始的時間特別早,從2月底就開始能網申、內推了。尤其3月份一整個月是提前批,並且4月1號之前沒走完流程的同學,都要必須參加4月份的筆試。所以理論上是越早內推越好,越到後面簡歷越多而且萬一4月前流程沒走完,就得參加筆試了。
本來我想著先面幾家小一點的公司攢攢經驗再去投騰訊和螞蟻金服的,畢竟這兩家門檻還是相當高的。原本打算投北京微信的前端崗,但是問了上一屆的一個學長說北京的微信不招前端,於是我的重心就放在螞蟻金服的北京實習了。不過有件事情的發生打破了我原本的規劃。
我有個在微信工作的學長,聽說了我的情況之後幫我從微信HR那邊問到北京微信今年招前端的情況,但是HC很少。我一聽,呀,好機會。趕緊修改了簡歷發給了學長。內推後沒兩天我就收到了北京微信的現場面試邀請,心裡還是很忐忑的,畢竟那可是微信啊。而且也是我的第一次現場面試。
到現場後,有個年齡跟我相仿的學長找到了我,說「我是你的一面面試官」。微信的現場面試沒有我想象中那麼拘謹(兩個人一間小屋子那種),是在開闊的大廳裡,有很多小圓桌,光線也很好。總之面試體驗還是很好的。同時我還看到了很多其他來面試的人。
一面面試官說他也是北郵畢業的,一下子就感覺放鬆了不少。接下去就基本是他拿著我的簡歷開始問問題了。
- 問實習做了啥 【研究生導師的公司】
- PicGo做了啥 【簡述了一下誕生的過程和它的作用】
- Electron是啥,為什麼選擇用Electron 【用的人多】
- MVVM與Vue的理解 【數據驅動】
- vue的雙向綁定的原理 【Object.defineProperty + Dep + Watcher】
- vue的生命週期以及做了啥,用來幹嘛的 【beforeCreate、created、mounted等】
- 講講Virtual Dom 【稍微說了一下理解】
- 寫過render函數麼,跟template有啥區別 【寫過,說了一下區別】
- vue的服務端渲染和客戶端渲染區別是啥,服務端渲染作用是啥 【SEO友好,首屏渲染速度等】
- 講講this指針和箭頭函數 【常規題】
- const和let與var的區別 【常規題】
- 說說webpack、rollup的tree shanking 【說了tree shanking是啥以及如何實現的】
- webpack的loader和plugin區別是啥 【loader處理某一類文件而plugin可以做「任何」事】
- promise的finally如何實現 【說了一下我的想法,但是後來想想有點不對】
- 瀏覽器和Node端的事件循環的區別 【說了一下我的印象,與setTimeout有關】
一面的問題基本都答上來了,面試官也覺得很滿意,就讓我等會,叫來了二面面試官,跟我說是專門搞算法的。(心裡一涼)
面試官跟我說他是北師畢業的,跟我的學校(北郵)很近(哈哈)。然後說,「我們來到簡單的算法題吧,不需要你寫,只需要你說說思路」
- 算法題:m*n的矩陣,只有0、1,找出最大的只包含1的矩形面積。【說了最蠢的解法...面試官一直引導我也沒想出怎麼實現更優解】
- PicGo做了啥,為啥star這麼多 【講了一下作用】
算法題又是沒做出來(雖然說了最蠢的解法)心裡又是一涼,感覺gg。結果面試官說「小夥子思維還挺靈活」(有麼!)然後讓我等會,叫來了三面面試官。
三面是個女leader,她對我說「前面的面試官對你的評價很高啊」。於是開始問我的個人經歷和項目相關。最後問了我什麼時候能來?我一聽奇怪,我不是投的暑期實習麼?然後她說最近有個項目急著要上線,所以缺人,就額外要了一個前端的HC。我說我實驗室暑假前並不放人...所以需要再考慮一下。並且這個時候我聽聞他們組實際是做AI的,而前端如果我去了也只有兩個人。到這時我感覺有點不對勁,不過leader說之後還有一個廣州的電面要我準備一下。
沒過兩天就是4面,也是我第一次電話面試。四面就純粹圍繞著我做的項目PicGo開始說了。問的比較注重的部分是我對於PicGo的思考。從開發者和使用者和產品的角度去說明。比如如何維護、如何打磨產品,遇到的問題如何克服,與用戶的意見不同時如何應對等等。我感覺更考量我對PicGo的認知和未來的規劃,到底是一個用心做的產品還僅僅只是一個star收集者。
四面面完,沒兩天三面的leader就打電話過來問我啥時候能去實習。然而在四面面完的這幾天裡,我就決定了不去了。首先實驗室6月底前放不了人;第二個跟我預期的有所出入,我以為是微信的前端團隊招實習生(但不是),因為我其實想在前端這塊能繼續做深入一些,所以就還是把這個offer給拒了。當時想法是如果北京微信這邊沒有喜歡的崗位,那也沒事,好好準備一下螞蟻金服的面試就好。
回宿舍我跟舍友一說我把微信的offer拒了,他們只丟過來一句「暴殄天物」。捨得捨得,有舍才有得,後面會再說。
螞蟻金服·支付寶
在面微信的面試階段前,有個支付寶的北郵師兄通過微信聯繫上我。他說關注我的GitHub好久了,想給我內推到支付寶的前端團隊那邊。我自然是開心地答應了。不過我當時想著先完善簡歷+先把微信面完。不然一下子準備兩個大廠的面試,壓力大不說,萬一時間撞上了反而更尷尬。在拒了微信後我把簡歷發給了師兄,開始了支付寶那邊的內推。
支付寶這邊技術面總共三面+HR一面。全程電話面試。
支付寶一面
內推沒多久,一面面試官就通過微信聯繫我,跟我約好了面試時間(第二天晚上7點半)並說「我這一面很輕鬆的」。在面試之前我有聽說螞蟻金服的面試是比較難的,雖然師兄說很簡單但也是做好了被掛的準備。
7點半準時電話響起。面試官說他也是北郵畢業的,讓我稍稍有所放鬆。然後接下來的問題就讓我冷汗直冒。
- 介紹一下做的項目 【實驗室項目+個人項目】
- 前端工程化的理解 【流程+規範+自動化等】
- 對Webpack做了哪些配置來提速 【很多,具體可以參考我這篇文章】
- 一段代碼輸入babel,把結果再輸入babel,結果一樣麼 【我說應該不一樣,但是沒說出為什麼】
- 配置過babel哪些屬性 【presets,plugins,env等】
- PicGo的插件如何發佈、安裝,如何確保插件安全性 【通過npm發佈,安全性沒有考慮很完全,然後跟面試官聊了安全方面的考量】
- Electron如何實現跨進程通信。還有哪些其他跨進程通信的例子 【ipcMain和ipcRenderer,跨進程通信的比如socket等,我瞭解的不多】
- Electron打包體積、編譯速度相關如何考量,怎麼優化或者怎麼做的 【我是通過CI打包,沒通過自己的機器。所以沒有特別考慮這方面的。不過不需要用babel轉譯能節省一些時間】
- 為什麼選TypeScript來開發,說說對TS的理解 【靜態類型、語法檢查等】
- TypeScript的interface編譯後會佔用空間麼,enum呢?(運行時和開發時不一樣)【前者答出來了,後者不確定】
- 說說什麼是服務端渲染以及Vue的服務端渲染如何實現 【直出HTML,通過render函數將VirtualDom渲染模板】
- 如果Vue2沒有實現VirtualDOM,可以做到服務端渲染嗎 【可以】
- Vue的diff算法如何實現 【說了一下之前自己看過的實現】
- 【算法題】求兩個序列裡的最長公共子序列 【稀裡糊塗說了一通,好像沒錯,後來想想其實不對】
- 簡單說說Vue的響應式原理 【Object.defineProperty + Dep + Watcher】
- 你有什麼要問我的嗎 【主要做什麼?答:螞蟻森林,螞蟻莊園等】
一面的難度應該是面的這三個大廠以來最難的。面試過程中我還是比較緊張的,不過一開始確實緊張,後面說開了就好多了。面試官面完之後說等二面聯繫我吧。二面面試官是他們部門的leader。
支付寶二面
一面面完的第二天面試官就加我了,直接約了當天晚上7點半的電面。(等於昨天一面今天二面...)事前我從內推我的師兄那裡瞭解到二面面試官是很厲害的一個人,所以難度應該會比一面面試官高。聽到這個消息不覺嚥了一下口水,難受。
7點半準時電話響起。二面面試官的聲音和語氣給我的感覺是一開始比較低沉的,感覺比較嚴肅。然後後面的問題果然「沒讓我失望」地難。
- 學前端的經歷?【15年開始自學,簡單說了一下】
- 對計算機的體系結構的認知 【懵了,不知道說啥】
- 有沒有經歷過jQuery時代 【有】
- Webpack優化是怎麼做的 【跟一面說的差不多】
- 上述的優化是基於什麼方向去做的 【從cache、減少文件搜索路徑、多進程優化等做的】
- 上述的優化有沒有量化出問題(比如看看每塊耗時多久等等)再針對性地做優化 【用了profile查看了開發階段的編譯耗時,做了一個簡單的插件做了開發階段的速度提升,但是原理我也沒說地太清楚】
- vue-hot-reload原理是啥 【我只打上來websocket+jsonp做的更新,但是實際上更復雜】
- 在vue項目裡如果我更新了一個js腳本但是頁面不更新,我要怎麼讓vue-hot-reload去更新 【真不會】
- 在vue項目裡如果我更新了一個js,但是不想讓頁面重新刷新,而只是更新我js的執行部分,我要怎麼讓vue-hot-reload去更新【真不會】
- vue的template是如何轉換成render functions的 【說了一下正則匹配,AST,但是不知道是如何有機串起來的】
- 接上一問,光是正則匹配是無法解決所有問題的,還需要啥,然後怎麼做,要哪些階段?(AST)【說了大概,但是不知道是如何有機串起來的】
- AST相關知識掌握程度是多少,去哪裡瞭解的 【不多,相關博客,跑了一些DEMO】
- 寫Electron的時候遇到了哪些問題(解決的或者沒解決的都說說)【系統級別的右鍵菜單實現、插件系統等】
- base64怎麼編碼的 【常規題】
- 從輸入一個地址到瀏覽器展現網頁的過程 【常規題】
- DNS查詢用TCP來做可以麼 【可以,但是慢】
- HTTPS握手加密過程 【常規題,這次會了,面頭條的時候還不全會】
- setTimeout和Promise的異步的區別,在瀏覽器和Node下的區別 【事件循環的區別,我說了具體的例子】
- 如何用Jest做的Koa和Vue的測試 【對Koa做了api的測試,對Vue做了界面的單元測試】
- CSS和JS哪個更熟悉?【JS】
- 接上問,CSS的transform有哪些屬性 【rotate,translate等】
- 接上問如何實現一個div既平移又變色?transform的矩陣有了解過麼 【沒答出transform可以帶多個屬性,知道矩陣,沒寫過】
- Vue的響應式原理,以及如果一個變量不在頁面上出現過(或者使用過),響應式系統是怎麼應對的 【render Watcher沒有get到這個變量就不會收集它的依賴】
- 父子組件如何分開收集依賴,或者說父子組件如何確保父組件只收集自己的依賴,子組件只收集自己的依賴 【父子組件有自己的生命週期】
- 在Watcher內再new一個Watcher後,如何保證依賴收集不會出錯 【同一時刻只有一個Watcher在工作】
- 問一下算法和數據結構掌握程度 → 說一下快排吧 【說了一下快排原理】
- 你上面跟前端無關的知識都是從哪裡獲取的 【實驗室項目、同學、自己搗鼓、博客等】
- 你有什麼要問我的嗎 【這個組杭州和北京的部門做的東西一樣麼,做什麼】
面完感覺很涼,問題的深度是真的深。之前的面試很少有完全答不上來的,而這次二面對 vue-hot-reload 的問題就基本沒有答上來。面試官最後給我的反饋大概還是不錯的,所以我就在忐忑中等待三面的通知。
支付寶三面
過了幾天,三面面試官通過電話跟我約了時間,聽聲音還是很和善的。不過,問題還是依然很有難度啊!問題不多,總共問了三個問題,但是第一問就讓我很難受:
- 【算法+前端】給定一定數目的粒子,每個粒子有4個屬性【位置座標,半徑,速度,加速度】。求問在如下數量下,用什麼方式繪製這些運動粒子,用什麼數據結構來存儲。
- 20個 【DOM,Canvas】
- 500個 【DOM,Canvas】
- 20000個 → 200w個 【Canvas,但是不夠,因為沒有必要把200w個點都渲染出來,只需要渲染可視區的。所以問題的關鍵是如何找到只在可視區出現的圓,這是一道數據結構+算法題。】
- 接上一題,如果是500個用DOM來繪製的粒子,請問使用Vue或者React的VirtualDom技術來實現,對比用原生操作DOM(假設極致優化)來實現,哪種方案的性能更好。【我說了原生操作,並給出VirtualDom不適合這個例子的理由】
- 給定一個APP內的營銷頁面,用戶可能在離線狀態下打開APP。如果營銷頁面的圖片已經過期了,應該要被撤下,否則會引起歧義。請問用什麼辦法能夠撤下。如果不能用JS,如果用戶修改了客戶端時間呢?【問題難度一步步加深,先問常規離線模式實現,然後開始不讓用JS,並且客戶端時間不準確怎麼做。沒答全。】
這個面試總共只有45分鐘不到,面試官說不能太長否則影響我的評價。我就說我第一題答得不夠好。面試官說「不是不夠好兄弟,是很不好!你第二題答得很不錯,第三題有所偏差,但是你第一題答地太差了」
哈哈,當時聽完覺得應該是涼了吧~然後面試官最後說了一句,「等之後HR會聯繫你」。噫,所以還是有戲?
經驗總結三:只知其然不知其所以然是不行的,要對原理了解更深才能更好地解決問題。
不過人生總是有所波瀾。
在我面支付寶結束前後,微信那邊的HR小姐姐聯繫到我問我為什麼把北京的崗位拒了。我說了之前我考慮的理由(主要是團隊不符合預期啊啥的)。本來以為跟微信的緣分就這樣了。然後HR小姐姐不死心,幫我聯繫了廣州微信小程序的前端部門,問我去不去那邊實習。我跟妹子商量了一下,暑期實習去廣州兩個月也能接受。於是就答應了。不過小程序那邊還需要加面 。小程序這個部門做的是小程序開發者工具的,我覺得很合我的胃口,正好我也比較喜歡寫工具類。
一波三折,在等待支付寶HR給我電話的這段時間裡,我在兩天內就拿到了微信小程序的offer。
三月最後一週的週一下午,我記得很清楚。3點開始一面。面試官給了我一個鏈接,讓我一小時內做完題然後他再跟我電話聊。
一個小時總共兩道題:
第一題
實現一個 HardMan:
HardMan("jack") 輸出:
I am jack
HardMan("jack").rest(10).learn("computer") 輸出
I am jack
//等待10秒
Start learning after 10 seconds
Learning computer
HardMan("jack").restFirst(5).learn("chinese") 輸出
//等待5秒
Start learning after 5 seconds
I am jack
Learning chinese
不難,主要是鏈式調用要處理好this以及用一個setTimeout做異步調用任務隊列。我沒有用ES6的Class實現,用了常規的funciton實現如下:
const HardMan = function (name) {
this.queueList = [() => console.log(`I am ${name}`)]
this.learn = function (subject) {
this.queueList.push(() => console.log(`Learning ${subject}`))
return this
}
this.handleTime = function (time) {
return () => new Promise((resolve, reject) => {
setTimeout(() => {
console.log(`Start learning after ${time} second`)
resolve()
}, time * 1000)
})
}
this.rest = function (time) {
this.queueList.push(this.handleTime(time))
return this
}
this.restFirst = function (time) {
this.queueList.unshift(this.handleTime(time))
return this
}
setTimeout(async () => {
for (let todo of this.queueList) {
await todo()
}
}, 0)
return this
}
第二題
微信小程序團隊一共有 n 名成員,決定出去秋遊,在海邊遇到出租摩托艇的傑克馬,馬先生手上有 m 輛待出租的摩托艇,價格分別是 b1 、b2 ... bm; 由於習慣了微信支付,團隊中每個人身上的現金都有限,分別是 a1 a2 ... an,對了,一起出門的老闆還帶有 S 元的團隊經費,這個經費是每個人都可以使用的
那麼考慮以下兩個場景
場景1 團隊成員都很有愛,都願意借錢給其他同事,那麼這時候團隊最多能租到多少摩托艇
function max( Array n, Array m, S) {
return num;
}
我的答案:
// 能借錢說明可以把錢彙總起來從而算出能接多少摩托艇
function max(n, m, S) {
let sum = n.reduce((a, b) => a + b, 0) + S
m = m.sort((a,b) => a - b)
let num = 0
m.forEach(item => {
sum -= item
if (sum >= 0) {
num++
}
})
return num
}
場景2 團隊成員都十分小氣,是不願意借錢給別人的,那麼請考慮以下兩個問題
//問題一 老闆是否能想到一個策略,使得所有人都能租到摩托艇?
function isAll(Array n, Array m, S){
return bool;
}
我的答案:
// 將摩托艇的費用和個人費用排序使得錢最少的人租最便宜的車,一一對應
// 如果錢不夠再向老闆借錢
// 直到老闆的錢S被借完為止
function isAll (n, m, S) {
if (m.length < n.length) { // 摩托艇不夠
return false
}
m = m.sort((a, b) => a - b)
n = n.sort((a, b) => a - b)
let length = n.length
for (let i = 0; i < length; i++) {
let diff = n[i] - m[i]
if (diff < 0) {
S += diff
if (S < 0) {
return false
}
}
}
return true
}
//問題二 請問給出一個策略
// - 使得整個團隊租到最多的摩托艇
// - 在租到最多摩托艇的情況下,整體的支出儘量的少
function max( Array n, Array m, S) {
// 採用動態規劃解,
return {
num,// 多少摩托艇
cost // 總體資金支出
}
因為時間關係我沒有寫完。所以跟就把大概寫了,這是道揹包問題,後面跟面試官說了一下思路。
// 一個揹包問題,不過我沒寫出來
// 以dp[i][j]代表第i個人要不要買第j輛車
// 有兩種情況
// 1. 第i個人沒租車,那麼意味著第i - 1個人可能租這輛車
// 2. 第i個人租了車,那麼意味著是在i - 1個人租了j - 1輛車的情況下租了j這輛車
// 統計最高的S不為負數的J即為買了最多的車。
// 當J相同的情況下比較S的大小,S越大說明越省錢
// 優化思路:1. 當S小於0的時候就沒必要繼續算了 2. 一開始兩個數組依然像第二題一樣排序
這兩個筆試題做完,面試官電話就過來了,簡單問了一些問題:
- 對著筆試題的一些提問,比如第一題的this指針問題,第二題的思路問題 【一遍過】
- HTTPS建立連接過程 【常規題】
- 前端緩存的認知 【常規題,緩存的類型,不同緩存的作用等等】
- 前端安全的認知 【XSS,CSRF等】
- 有什麼想問的嗎 【為啥小程序開發者工具用NW.js而不是Electron】
面試官問了大概半小時,就說之後二面的leader會聯繫我。由於筆試題都做出來,所以感覺還是比較良好的。只是不知道二面來得這麼快。
二面面試官隔了大概半小時就打電話來了,主要就看著我的PicGo這個項目在問,可能是因為技術棧(Electron)和小程序開發者工具(NW.js)比較接近吧。
- 為什麼選擇Electron而不是用網頁實現PicGo 【因為需要做配置、插件化、需要用到Node.js的API等】
- 介紹一下PicGo
- PicGo如何做的更新策略,如何實現靜默更新,如何實現代碼級別熱更新,如何在讀寫文件權限不夠的情況下熱更新 【更新策略其實很簡單,後面面試官問的更新策略是我未實現的,但是跟他一起談了一下思路】
- 寫PicGo遇到的最大的問題 【插件系統】
- 插件系統如何實現 【讀配置、加載、生命週期函數等等】
- 寫PicGo遇到過安全相關的問題麼,如何處理 【插件的安全相關】
- 寫PicGo遇到過性能相關的問題麼 【有,相冊頁圖片多會卡頓,說了如何處理等】
- 有什麼想問的嗎 【沒啥了】
面試官的語氣非常和善,跟我探討的時候也是基本以商量的語氣。末了還誇了一下這個項目做得還是挺完整的。(其實還有一個很重要的「測試」部分沒寫。。。)考察的重點問題已經不是功能問題,而且類似安全、更新策略等這些平時可能寫東西的時候不會太注意的問題。所以如果只是一個玩具項目,可能確實談不上來。還好之前很多坑自己踩過,所以跟面試官聊起來也比較愉快。
經驗總結四:一個好的(開源)項目非常加分。好的意思不是star多,而是你對它的思考、實踐多。 經驗總結五:如果你有一個做得很好的項目,一定要讓面試官看到,並引導他問你的項目來把你熟悉的東西說出來。
第二天收到HR電話聯繫說已經通過面試了,第三天就發了Offer。
由於小程序這個組做的東西是開發者工具,很合我的胃口,於是我就接了這個Offer,而此時我還沒接到支付寶的HR電話。微信的這個「搶人」速度是真的快。
最後
支付寶HR電話在後面好久才打來。此時我已經接了小程序的offer了,於是暑期就沒辦法去支付寶實習了。我說了一下我暑假可能沒法去實習,但是秋招還要回北京秋招。所以問能否保留秋招終面資格(跟去年一樣)。支付寶的HR給我的反饋就是不一定,不好說。我想想反正如果不保留資格,到時候回北京再面就是了。
於是前兩天終於發來的offer,也只能拒掉了。同時我也只能跟頭條的HR說了一下情況,真的很不好意思,秋招還有機會。
我的春招(暑期實習)之旅也就這樣結束。其實我大可接受支付寶的offer實習然後直接轉正,不過我想著既然有一個更喜歡的機會去嘗試一下又何嘗不可呢。其實從第一次拒絕微信的offer到後面又接了小程序的offer,我覺得都是因為我想做自己喜歡做的事吧。
最後經驗總結六:Do what you love, love what you do.
希望這份經歷也能給你帶來幫助。
最後 小編親自整理2019年4月最新Web前端angualr,html5,Javascript,nodejs,react,vue以及web前端交互的電子書和視頻合集 關注私信666 即可獲取! 僅限前50位!
閱讀更多 軟謀前端 的文章