本文最初發佈於Medium網站,經原作者授權由InfoQ中文站翻譯並分享。
你把鬧鐘設定在了下午2:45。
Web開發面試預定在下午3:00開始。
你耐心而緊張地看着時間一點點流逝,神經都繃得死死的,兩手不知不覺間微微顫抖,等待着手機鈴聲響起的一刻。你在想面試官會對你拋出一堆什麼樣的面試問題。你的精神越來越脆弱,汗珠一滴滴落了下來。“我真的爲這次編程面試做好準備了嗎?"你開始質疑自己。
你看了看手機——下午3:05。沒有未接來電。什麼都沒有。
你着急地再次確認了一遍——下午3:15……還是沉默。
你在壓力下已經過了半小時,滿頭大汗,默默地抱怨,心跳聲清晰可聞。你開始胡思亂想,突然驚慌失措……是電話號碼填寫錯誤了嗎?還是他們乾脆把你忘了?
你的腦海裏爆發了激烈的戰鬥,想要克服焦慮的情緒。希望之火快要熄滅了,你抓起滿是汗水的手機,最後再確認一遍……然後,它響了。
立刻接通,說出“你好”二字,試圖掩蓋顫抖的音調,壓制嘴脣和手指的抖動,同時與腦海中湧起的緊張感搏鬥。彼此介紹已畢,然後是……針對Web開發人員的五花八門的面試問題讓你措手不及,你的答案几乎沒一個像樣的。
你意識到自己已經搞砸了。排山倒海的焦慮感迎面襲來。你感覺胸口壓了一塊大石,連呼吸都成了困難。頭暈眼花,突然什麼都想不起來了。你忘了自己在哪裏,在和誰交流……什麼都忘掉了。雙手被汗液浸溼,連握住手機都成了難事。
你知道,想要留下好印象的機會已經十分渺茫了,如果事前的準備能更充分些,或許結果就不會那麼糟了。
爲避免這種情況,你需要爲下一次編程面試做足準備。你需要大致瞭解對方會問出哪些針對Web開發人員的面試問題。在參加電話或現場面試之前,這樣的準備工作可以增強你的自信,並減少焦慮情緒。
在本文中,我將討論開發面試流程背後的規則——面試官最可能問哪些問題?如何漂亮地給出迴應,讓苛刻的他們點頭稱讚?
軟件開發面試是一種談判
首先,你需要意識到Web開發面試更像是一場談判。你可能從小就被教導要在面試過程中無懈可擊,並準確回答所有問題,這樣才能給面試官留下好印象,拿到工作。
現實根本不是這麼回事。
當然,你肯定要給人留下深刻印象纔行。但是,如果你覺得面無表情地盯着你的面試官,然後像機器人一樣回答所有面試問題……就能留下好印象的話,你的誤會就大了。
你需要與未來的僱主輕鬆地交流,同時展現出自信、知識和好奇心,最重要的是熱情。
僱主在招聘員工時主要會考慮以下內容:
- 性格。
- 基本資格。
- 文化認同。
- 熱情。
你的性格需要有足夠的適應性,意思是說你應該能輕鬆與團隊打成一片。你還要提出清晰明確的問題,並對面試官的提問給出詳盡的答案。
當然,你還需要具備符合崗位要求的基本資格。似乎很多人都將注意力集中在了這一點上(這當然沒錯),但這只是整個等式中四分之一的部分。
文化認同——這與你的性格息息相關。你必須能夠與團隊保持同步,並融入團隊認可的文化氛圍。
最後,對工作充滿激情。你會發現這種熱情的影響力多麼驚人。
比如說,你的簡歷可能不如其他競爭對手那麼亮眼。但如果你表現出強烈的熱情,願意全力以赴,那就可以擊敗其他求職者贏得工作。當然,這一套並不是每次都行得通。不過僱主一般更有可能僱傭熱情滿滿的員工。
下面,我們就來看一看你可能會遇到的一些最常見的Web開發面試問題(和答案)。首先從專業軟件工程師的行爲問題開始,然後轉向更偏技術的問題。
無論你是前端,後端還是全棧軟件開發人員,這些常見的計算機科學麪試問題都會幫助你爲下一次編程面試做好準備。
注意:某些行爲問題在Web設計面試中也會遇到。因此如果你是Web設計師,那麼本文也能幫你備戰下一次Web設計面試。
你開始編程的契機是?或者爲什麼你選擇了軟件開發這個職業?
多數面試官會從介紹性問題問起。應對這些軟件工程師面試問題時,只需照常回復即可。儘量坦誠地回答。告訴他們是什麼激發了你對編程的興趣,以及爲什麼你要申請這個職位。
到目前爲止,你的編程經驗有多少?
如果你正在申請入門級的Web開發人員工作,由於你可能剛剛畢業或剛從培訓班出來,面試官不會要求應聘者有多年經驗(他們甚至可能會跳過這個問題)。但是,如果你要應聘的是高級軟件工程師,則需要有多年的經驗打底才能應聘這個Web開發崗位。
你熟悉敏捷方法嗎?
你需要熟悉諸如看板和Scrum之類的敏捷框架,因爲今天的公司都在採用敏捷實踐,並逐漸淘汰瀑布流模式。面試官還可能問你有關SDLC(軟件開發生命週期)流程的問題。
你正在使用哪些編程語言?
問題很簡單。你應該重點提到那些Web開發工作用的最多的語言。
如今,擁有多種語言(例如C++、Java和Python)的開發經驗肯定會給你的面試官留下深刻的印象。
你最擅長的語言是什麼?
坦率回答,並給出具體解釋。有時,面試官可能會進一步詢問:“使用這些語言時你會感到興奮嗎”,但這種情況很少見。你的答案當然應該是肯定的,然後說明你爲什麼會感到興奮。
你是否有興趣進一步發展自己的技能?
這更偏向於一個軟技能問題。軟件工程是一項工作,你需要不斷提升自己,增強自己的技能水平。僱主想看到的是,他們的開發人員擅長最新的技術並在不斷打磨自己的技能。因此,這個面試問題的答案顯然是肯定的,你還可以多談一談你在學習新的編程技能時最感興趣的內容。
你最喜歡從事哪些類型的項目?
談一談與你應聘的崗位類型接近的那些項目。如果你沒有類似的案例,那就坦誠相待,並告訴他們點燃你對軟件開發的激情的因素都有哪些。
談一談你最引以爲傲的軟件工程項目。你在其中具體有哪些出色的表現?
問到這個問題時,面試官想要聽到的答案應該涉及一些非常困難的挑戰,你的團隊裏很少有人能應付這些挑戰,而解決問題的就是你。要記住,關鍵在於不要討好面試官,對方很容易就能看出來的。你會給人留下糟糕的印象。談到那些只有你才能解決的問題時,語氣要輕鬆自然。這裏的要點是你應該展現自信和頭腦,並謙虛地回答問題。
談一談你最失敗的軟件開發項目。再來一次的話你會怎麼做?
這又是一個軟技能問題。生活就是不斷吸取教訓的過程。儘可能坦誠,公開承認你過去犯了哪些錯誤。談談你學到了什麼教訓。總之,請告訴對方你是怎樣應對最失敗的經歷,並變得更加強大的。
你對我們公司瞭解多少?
面試之前要做足功課。瀏覽他們所有的社交媒體資料,找出那些能讓你的面試官印象深刻的邊緣信息。對公司表現出熱情。熱情在面試過程中起着重要作用。
你是否對我們公司的某個項目感興趣?
和上面一樣——在面試之前做足研究和分析工作,表現出你的熱情。告訴面試官你爲什麼想要參與那些項目。這樣他們就能知道你的熱情背後有着怎樣的動力,並且知道你不是在特意討好他們了。
上面這些Web開發面試問題可能出現在電話面試中,也可能會在現場問到。
下面的技術面試問題通常會出現在現場面試裏,但有時也可以在遠程面試時提到。如果是遠程的情況,面試官會要求你共享屏幕,看你怎樣一邊寫代碼一邊回答面試問題。
請記住,你會被問到的技術問題類型在很大程度上取決於你申請的崗位類別。我們將嘗試覆蓋一些最常見的軟件開發面試問題,並給出合理的答案選項,這樣你就可以根據自己的情況做調整了。
技術面試問題
你如何管理類模塊和資產?
編寫程序的方法有很多,而且沒有對錯之分。你想加入的公司可能有一套編寫代碼的標準,並且可能會將你的答案與他們的標準做比較。通常,大多數公司都希望聘用習慣最簡單編程方法的開發人員,並對那些喜歡複雜方法的應聘者敬而遠之。這是因爲公司都希望能輕鬆維護代碼和編寫文檔。
具體講一下AJAX(JavaScript)。能談一談你上次使用它的情況嗎?
當面試官問你這類軟件工程師的“解釋性”問題時,重點實際上不是要背定義,而是告訴對方你在編程中是怎樣用這些技術的。這會告訴面試官你實際上可以“思考”,並展示出你編程的方式。
AJAX是"異步JavaScript和XML"的縮寫。AJAX是一種藉助XML、HTML、CSS和JavaScript創建更好、更快、更具交互性的Web應用程序的技術。
你如何向非技術背景的利益相關者解釋API的概念?
API是不同軟件產品之間的通信使者。它讓各個軟件系統之間可以相互通信和同步。例如,你可以使用Facebook的API在你自己的網站上顯示你在Facebook發佈的帖子,並允許人們直接在你的網站上共享或評論你的帖子,無需切換到Facebook上。
解釋非功能性需求和功能性需求?
非功能性需求描述了系統的類型(可訪問性、可維護性、安全性)。而功能需求描述了系統的特定功能細節。
黑盒測試和白盒測試有什麼區別?
黑盒測試僅用於在給定輸入的情況下建立正確的輸出。相比之下,白盒測試還涵蓋了這個功能的實現——測試它的實現是否正確。
可以談談模型-視圖-控制器(MVC)架構嗎?
它將數據與用戶界面分離開來。MVC架構主要用於GUI應用程序。模型層包含數據,視圖層將數據發送給用戶,而控制器則是根據用戶輸入對模型進行更改。
什麼是遞歸函數?
直接或間接調用自身的函數。遞歸會一直持續到函數到達一組參數,並返回一個值而非遞歸調用自己爲止。遞歸函數可以很快地解決某些問題。
請以最簡單的方式解釋大O符號。
大O符號告訴我們一種算法有多快。無論你要評估別人的算法還是自己的算法,這都非常重要。
大O符號(也稱爲朗道符號)告訴我們函數的運行時或空間要求隨輸入增長的情況。也就是說算法速度不是以秒爲單位,而是以操作數量的增長情況來衡量。
A*算法的機制?
這是一種廣泛用於尋路和圖遍歷的計算機算法。它與一種啓發式函數搭配,這種函數會估算從節點A到節點B的成本。每個步驟中的節點都擠在一起放在優先級隊列中。
它使用公式f(n)=g(n)+h(n),將與起始節點相鄰的每個節點及其成本估算值添加到隊列中。g(n)是從起始節點到節點n的實際成本,而h(n)是啓發式函數。在每一步,具有最低成本估算值f(n)的節點都會進一步擴展。當最後一個節點是擴展節點時,路徑就完成了。
你對面向對象編程(OOP)有什麼看法?
你可以在freeCodeCamp上參考這篇關於OOP的詳盡指南。這篇指南細化解釋了這個概念。
https://www.freecodecamp.org/news/object-oriented-programming-concepts-21bb035f7260/
你的SQL技能怎麼樣?
也許數據庫不是你工作的核心內容,但你也需要了解數據的結構。你談到的SQL實踐經驗肯定會爲你的Web開發面試加分不少。
編寫一個函數來計算第N個斐波那契數。
以下代碼段來自Geeksforgeeks。這是一個很好的例子。
https://www.geeksforgeeks.org/program-for-nth-fibonacci-number/
在C++中:
//Fibonacci Series using Recursion
#include<bits/stdc++.h>
using namespace std;
int fib(int n)
{
if (n <= 1)
return n;
return fib(n-1) + fib(n-2);
}
int main ()
{
int n = 9;
cout << fib(n);
getchar();
return 0;
}
// This code is contributed
(Credits to Akanksha Rai)
反轉一個字符串(str:String)
面試官要求你反轉字符串時,並不是說他們會要求你在生產代碼中實際實現reversed()。他們只想看看你是用什麼方法來解決問題的。
顯然,大多數大型技術企業都會向你提出算法問題,尤其是FAANG公司。
以下代碼段來自Geeksforgeeks。它給出了一個完美的例子。
// A Simple C++ program to reverse a string
#include <bits/stdc++.h>
using namespace std;
// Function to reverse a string
void reverseStr(string& str)
{
int n = str.length();
// Swap character starting from two
// corners
for (int i = 0; i < n / 2; i++)
swap(str[i], str[n — i — 1]);
}
// Driver program
int main()
{
string str = “geeksforgeeks”;
reverseStr(str);
cout << str;
return 0;
}
歸根結底,公司要找的是聰明的人。算法問題是一個很好的篩選手段,可以淘汰很多“愚蠢”的候選人。
一道編程題:
以前微軟在面試中用過這道題,它是一道很好的編程題目。
你有一個介於1到N之間的N+1個整數的列表。你知道其中至少有一個重複項,但也可能有更多重複項。例如,如果N=3,則你的列表可能是3、1、1、3,或者可能是1、3、2、2。打印出一個不止一次出現在列表中的數字。(也就是說,在第一個示例中,你可以打印“1”或“3”,而不必同時打印兩者。)
最明顯的方法是將列表中的每個數字與其他所有數字對比,這個方法具有O(n²)的時間和O(1)的空間複雜度。
那麼我們假設列表很大,所以你需要更快的算法。
我可以只使用一個布爾數組,然後使用整數值作爲索引(時間複雜度爲O(n))來遍歷列表,數組/哈希的空間複雜度是O(n)。
假設列表特別大,所以你不能複製它。也許你有8GB的內存,而列表有6GB大。
我可以對數字排序並對比相鄰的對。如果我使用像mergesort這樣的原地排序算法,那就是O(n*logn)的時間複雜度和O(1)的空間複雜度。
如果你想要比O(n²)更快,又負擔不起那麼多額外空間,還無法操縱原始列表,該怎麼辦?例如,列表可能位於只讀CD上。
(到這裏,幾乎所有人都需要一到兩個提示。)
我想我可以二進制搜索重複的數字。例如,我遍歷列表並統計1到N/2之間的整數數量。如果計數大於N/2,那麼我就知道該範圍內存在重複項。否則,重複項必然存在於N/2+1到N的範圍內。一旦我知道重複項所在的那一半範圍,我就可以在那一半進行遞歸和二進制搜索,然後繼續重複該過程,直到找到重複的數字。時間複雜度爲O(n*logn),空間複雜度爲O(1)。
小結
寫到這裏就差不多了。無論你是初級Web開發人員還是高級軟件工程師,都希望你能從本文找到有用的面試問題和答案。你可以再讀一遍,以進一步增強信心。
請記住,你在Web開發面試中的表現並不會影響你的軟件工程技能。如果你頭幾次搞砸了——沒什麼大不了的。只需準備下一次面試即可。最終,你將在自己夢寐以求的公司中找到一個職位,你所經歷的所有面試都是有意義的。
如果你正在尋找DevOps工具(帶有直觀的問題跟蹤器、git存儲庫、內置的CI/CD和可發佈的文檔),請隨時嘗試Codegiant(https://codegiant.io/home)
原文鏈接:https://blog.codegiant.io/25-web-developer-interview-questions-and-answers-3030b21ae016