第七章:一面·技術面試
比約定的面試時間提前了二十分鐘,周天白來到望京科技園,他在樓下轉了會,十分鐘過后,他敲開了公司的門。
接待他的前臺小妹把他帶到了一間空曠的會議室,在辦公區(qū)旁邊,他隨意撇了眼看下,工位大約七八十個個,分為三個區(qū),員工看著都挺年輕,看上去都挺認真工作。
前臺小妹給他倒了一杯水放下一張面試職位表和一只筆之后就離開了。
大概十分鐘之后,一位中年男人進來了,周天白站起來微笑,來人點點頭:“坐下吧,我是今天的面試官王越,技術部負責人。”
周天白把剛才從包里拿出的簡歷雙手雙手遞給了面試官:“你好,王總,我是今天來應聘貴司軟件開發(fā)的周天白,這是我的簡歷?!?p> 面試官接過簡歷之后,瀏覽了一下,問他:“你是機械工程專業(yè)的,怎么會想到自學開發(fā)?”
“大二下學期的時候,開始對代碼感興趣就開始自學,了解越多學習越深之后更加愿意有意愿加入IT行業(yè),一邊學習一邊動手做項目。”
“哦,那你是怎么自學的呢?”
“了解階段是從簡單的基礎協(xié)議開始看的,在3Wshool網(wǎng)站上進行學習,決定入門后從軟件工程系同學那借了專業(yè)書籍,配合廖雪松老師的視頻,CSDN論壇,各個老師的博客?!?p> 他補充:“從命名、環(huán)境變量等基礎開始系統(tǒng)的學習,在實戰(zhàn)過程中給學校寫了網(wǎng)站和面向師生的APP?!?p> “我原計劃是報雙專業(yè)的,因為一點事錯過了報名時間所以經(jīng)常去軟件系蹭課?!?p> 面試人直接換了個問題:“4個瓶蓋換1瓶酒,要喝150瓶酒,最少多少瓶?”
“113瓶,買一瓶喝掉一瓶,攢夠4個瓶蓋就去換一瓶,最初的4瓶是需要購買的,之后每4瓶中就有1瓶是兌換來的,也就第(1+n*4),n=1,2,3...瓶都是兌換來的。n最大取37,所以只需要買113瓶。數(shù)學算法是:150/4=37.5,150-37=113?!?p> “給你一個5L和3L桶,水無限多,怎么到出4L水?”
“先將 3L 的桶裝滿水,倒入 5L 的桶里。再重新將 3L 的桶裝滿水,倒入 5L 的桶里,把 5 L 的桶裝滿后,這樣 3L 的桶中就剩下 1L 的水了。然后把 5L 的桶里的水倒掉,把 3L 的桶中剩下的 1L 水倒入 5L 的桶里。再打滿 3L 的水倒入 5L 的桶里,就是 4L 了。”
“能談談你對三次握手四次揮手的理解嗎?”
“TCP協(xié)議,在發(fā)送數(shù)據(jù)前,通信雙方必須在彼此間建立一條連接。在連接的建立過程中,雙方需要交換一些連接的參數(shù)。TCP提供了一種可靠、面向連接、字節(jié)流、傳輸層的服務,采用三次握手建立一個連接。
采用4次揮手來關閉一個連接。
第一次握手:客戶端發(fā)送網(wǎng)絡包,服務端收到了。這樣服務端就能得知道:客戶端的發(fā)送能力、服務端的接收能力;
第二次握手:服務端發(fā)包,客戶端收到了。這樣客戶端就能得出結論:服務端的接收、發(fā)送能力,客戶端的接收、發(fā)送能力;
第三次握手:客戶端發(fā)包,服務端收到了。這樣服務端知道客戶端的接受發(fā)送能力。
三次握手的目的并不只是讓通信雙方都了解到一個連接正在建立,還在于利用數(shù)據(jù)包的選項來傳輸特殊的信息,交換初始序列號ISN。3次握手是指發(fā)送了3個報文段,4次揮手是指發(fā)送了4個報文段。
更簡單的理解是處理客戶端和服務端之間的連接通信,確保雙方的接收發(fā)送能力?!?p> “什么時候用斷言?”
“通常在開發(fā)和測試時候開啟,為了提高性能,在軟件發(fā)布后,斷言堅持通常是關閉的。它是包含布爾運算表達式的語句,可通過其返回值來判斷驗證傳值參數(shù),但不能用斷言去改變程序的狀態(tài)。”
“簡歷上有說你有自己寫APP及網(wǎng)站,能看看嗎?”
周天白拿出自己手機在頁面上找到了“工大通”APP,雙手遞給面試官:“是這個,是一款校園軟件,面向師生,根據(jù)其身份來開放對應權限,產(chǎn)品需求15天,開發(fā)周期80天,測試發(fā)布一周。網(wǎng)站是我們學校的一個教務系統(tǒng)?!?p> 面試官接過手機后,點了APP,問道:“你們是幾個人,如何分工的?”
“四個人,我們宿舍的人都自學了開發(fā),需求階段是大家一起參與,開發(fā)是我和一位舍友負責后端接口及數(shù)據(jù)庫、運維,另兩位舍友負責前端,測試也是大家一起參與的?!?p> “好的,那你在測試過程中都會發(fā)現(xiàn)什么問題呢?”
“主要是空指針,回傳異常,判斷失誤等。”
“學生你們是根據(jù)學號來判斷用戶信息的,那老師和非在校人員是通過什么來判斷的?”
“老師的話是通過系別年級名字來唯一性校驗的,我們從學校網(wǎng)站上收集了一份老師名單加到了數(shù)據(jù)庫中,每月更新數(shù)據(jù)。非在校人員暫時沒有給登錄瀏覽權限。”
“你們數(shù)據(jù)大概有多少?如果數(shù)據(jù)多了,查詢耗時太慢怎么辦?”面試官問問題的同時也一直在用一只手滑動APP頁面。
“我們數(shù)據(jù)并不太多,不到一百萬。在之后的測試環(huán)境中構造過500萬數(shù)據(jù),模擬了慢查詢,簡單的單個條件查詢,耗時40秒。后續(xù)對數(shù)據(jù)控制了去重去空、加組合索引,創(chuàng)建內(nèi)存臨時表數(shù)據(jù)先插入臨時表中,優(yōu)化索引等操作來調(diào)優(yōu)?!?p> “好的,那兩個對象屬性名不一樣如何將一個對象的屬性值賦給另一個對象?”
“兩者屬性相同且都是公開的時候,直接傳,objA.屬性A=objB.屬性B;類型不同,可以強制轉換,或者構造對象,再依次復制內(nèi)部的屬性,或許用反射映射屬性?!?p> 當面試官劃到“找校友”這模塊時,搜索留言校友圈來回切換幾次后再搜索返回的時候,程序崩了,他稍微抬了下頭:“有過棧溢出導致進程崩潰卡死的問題麼?!?p> 周天白看到了頁面上明晃晃的“程序已停止”提示。
“有過,直觀點的看到StackOverflowError異常就去jvm上找,隱蔽一點的會從crash日志里查找或是借助coredump分析;”
“我們碰見過此類問題的大多是在寫代碼時出現(xiàn)遞歸死循環(huán),線程棧空間設置比較小。”
“嗯,即使有過一兩年經(jīng)驗的程序員有時候也會出現(xiàn)這樣的問題,那你們在學習過程中哪部分會學起來覺得吃力呢?”
“二叉樹,圖這類的算法在初步接觸的時候?qū)W起來是比較吃力用時也是比較久的,后面在實踐過程中也是有用到并不斷和軟件系工程的同學進行交流,有了更深層的了解和運用。”
“好的,關于你的情況我大概了解了,我這邊的面試先到此結束,接下來如果你有時間我再安排一次人力面試?!?p> “有的?!?p> “好的,那你稍等?!闭f完,面試官便起身離開。