您現在的位置是:首頁 > 攝影首頁攝影

面試技術崗,你真能講明白技術嗎?

由 InfoQ 發表于 攝影2021-07-24
簡介技術規範,回答“怎麼用”的問題,反映你對該技術使用方法的理解深度

如何講一個技術

面試技術崗,你真能講明白技術嗎?

給面試官講明白技術,你不僅要懂技術,還要懂面試官。今天我們就從這兩個方面出發,講講如何讓面試官聽到滿意的答案,從而提高你的面試成功率。

對於程式設計師職位的面試,技術問題佔的比重非常大。技術問題的回答質量,決定了面試成敗。除了面試之外,講技術的場景還有很多:你和同事討論技術問題,選擇技術方案,都是在講技術。

你可能會說,把技術講明白有什麼難的,只要我懂就能講明白。呵呵,你輔導過孩子作業麼?有時候

那種

抓狂,是你對題目本身再明白也無法解決的。例子有點極端,我是在強調:

給面試官講明白技術,你不僅要懂技術,還要懂面試官。

今天我們就從這兩個方面出發,講講如何讓面試官聽到滿意的答案,從而提高你的面試成功率。

技術的水有多深?

我們先說技術可以從哪些方面來講,看看技術的水有多深。

技術是為了解決問題而生的。本質上,技術就是解決問題的方法。問題規模越大,難度越複雜,就要引入多種技術。這些技術組合搭配起來,構成該解決方案的一棵“技術樹”。其實,每一個分支和葉子都有多種可選的技術,隨著更多的創新出現,這些分支和葉子也在演變,使得整體方案在空間和時間上,能更高效更節省地解決問題。我們對這些分支和葉子技術點的瞭解和運用,甚至對它們演變的推動,都體現了我們的經驗和技能。

那麼,一個技術領域,我們需要闡述哪些層面呢?我覺得可分兩個維度,一個是技術的設計維度(從技術內部看),另一個是技術的應用維度(從技術外部看),如下圖所示。

面試技術崗,你真能講明白技術嗎?

我們以 Java 多執行緒為例,解釋下這兩個維度。

1。 應用維度

應用維度主要從問題、技術規範、最佳實踐、市場應用趨勢這四個層面來解釋。

問題

:從技術的應用維度看,首先考慮的是要解決什麼問題,這是技術產生的原因。Java 多執行緒的產生,是因為要併發,併發使得程式的多種功能能響應更快,使用者體驗更好。

問題這層,用來回答“幹什麼用”。

技術規範

:接下來,技術被研發出來,人們怎麼用它才能解決問題呢?這就要看技術規範,可以理解為技術使用說明書。在 Java 世界裡,你可以實現 Runnable 介面、擴充套件 Thread 類來實現程式碼併發;同時,Java 提供 synchronized 關鍵字,以及各種鎖,來幫你控制併發中的程式碼行為和衍生問題。這需要了解介面和關鍵字的使用規則和潛在影響,以及各功能的細微差別。比如, sleep() 和 wait() 的區別是什麼, 為什麼 wait() 需要在同步程式碼塊內使用,而 sleep() 不需要。

技術規範,回答“怎麼用”的問題,反映你對該技術使用方法的理解深度。

最佳實踐

:你把該技術運用到多種不同的場景時,會發現同樣的使用方法,會有不同的效果,這是因為問題上下文不同了,該技術有不同的適應面。從而你可能踩了很多坑,知道了該技術的“脾性”,從中總結出最佳實踐。這緣於在不同應用場景中,對技術表現差異的比較和把握。

最佳實踐回答“怎麼能用好”的問題,反映你實踐經驗的豐富程度。

比如:

在多執行緒場景下實現鎖來確保執行緒的同步,但是加鎖、釋放鎖是個非常消耗資源的操作,沒有獲得鎖的執行緒還需要進入阻塞狀態,等待被喚醒。 如果多個執行緒的競爭並不激烈,可以考慮使用 CAS 的方式實現無鎖的執行緒同步,執行緒可以一直執行,不用阻塞。但是使用 CAS 還需要考慮使用時間戳等方式來解決 ABA 問題。

市場應用趨勢

:隨著技術生態的發展,和應用問題的變遷,技術的應用場景和流行趨勢會受到影響。對於 Java,從低併發逐漸發展到高併發,如何充分利用系統的能力,減少響應時間變得非常重要。

這層回答“誰用,用在哪”的問題,反映你對技術應用領域的認識寬度。

2。 設計維度

應用維度是從外部看技術的應用。那麼,從內部能看到技術的哪些層面呢?

目標

:為了解決使用者的問題,技術本身要達成什麼目標。比如,Java 多執行緒要在優先順序排程、鎖、資訊同步等方面達成怎樣的目標,才能更好地實現併發。

這層定義“做到什麼”

實現原理

:為了達到設計目標,該技術採用了什麼原理和機制。Java 多執行緒的實現原理包括核心執行緒、使用使用者態執行緒、使用使用者態執行緒加輕量級程序混合等部分,還包括硬體指令集、Test and Set、各種鎖等。

實現原理層回答“怎麼做到”的問題。

把實現原理弄懂,並且講清楚,是技術人員的基本功。

優劣侷限

:每種技術實現,都有其侷限性,在某些條件下能最大化的發揮效能,缺少了某些條件則暴露出其缺陷。比如在 Java 多執行緒程式設計中,採用共享記憶體的方式,鎖的開銷比較大,程式設計師程式設計難度較大,容易出錯,難以除錯。

優劣侷限層回答“做得怎麼樣”的問題。

對技術優劣侷限的把握,更有利於應用時總結最佳實踐,是分析各種“坑”的基礎。

演進趨勢

:技術是在迭代改進和不斷淘汰的。瞭解技術的前生後世,分清技術不變的本質,和變化的脈絡,以及與其他技術的共生關係,能體現你對技術發展趨勢的關注和思考。

這層體現“未來如何”。

比如:

Java 5 提供 jcu 包,實現了多種鎖結構,簡化開發;Java 7 加入 Future 來獲取執行緒返回值;Go 語言中“協程”的概念,也被第三方引入,擴充套件了 Java 的多執行緒功能,比執行緒切換更快,效能得到了很大的提升。

總地來說,從技術內部(也就是設計維度上)看,包括目標、實現原理、優劣侷限、技術演進趨勢。而從技術外部看,也就是市場應用維度上看,包括問題、技術規範、最佳實踐、市場應用趨勢。它們是逐層遞進的關係,代表了你對技術把握的深度。

對於一項流行的技術,大部分人可以講清實現原理和技術規範,也就是說能搞懂它的工作原理和使用方法,這是技術人員的基本功。再上面的技術侷限性和最佳實踐,只有經過深入的鑽研,甚至讀原始碼,以及多場景的實踐之後,才能講出深刻的認識。對於最上面的趨勢層,需要具有相當程度的“T”型技術體系,對相關技術有橫向和縱向的對比之後,才能總結得出來,考驗應聘者的知識面和洞見。

但是,如果有人恰好讀過幾篇有深度的技術文章,上面的某些層他也可能照本宣科地講出來。那麼讓你和他可以區分開的“殺手鐧”就是技術實戰:如果你在“最佳實踐”部分中,能結合自己的專案經歷,找到該技術的一個應用例子,特別是棘手的問題,講清你是如何調優或者解決的,不僅會彰顯你真實的技術水平,而且最有說服力,也是面試官最看重的。當你把問題的解決過程,跌宕起伏地講出來,面試官也會跟你一樣嗨起來。

講到這,你可能要問,難道面試中的每個技術問題,都要按照上面兩個維度八個方面去解釋麼?不是的,你還需要弄懂面試官想聽什麼,能聽什麼,然後再按需呈現。下面我們談一下如何弄懂面試官的需求。

面試技術崗,你真能講明白技術嗎?

你有多懂面試官?

只聽懂面試官說的字面意思,不一定能給面試官滿意的答案。很多時候,應聘者並不能準確理解面試官想要聽的點。下面列出了幾種情況及其解決方法。

問答雙方角色不同(比如專案經理面試架構師的情況),思考角度不同,導致對同一個技術話題,展開的方向不同,自然理解上會發生分歧。

工程思維的人想的是如何得到結果,你可以著重講技術內部維度的內容;而使用者思維的人想的是那個結果可以用來幹什麼,你就要側重到應用維度上了。(當然,專案經理不應該面試架構師人選,但是事實上這種安排還真有。)

問答雙方的知識結構和水平不一樣,理解深度和寬度不同。

你覺得小兒科的知識,對方卻可能完全聽不懂。這需要你瞭解對方的技術水平,採用適當的技術語言或者業務語言來表達。不要滿嘴都是你專用的術語或者縮寫,誰知道你說的“FID”“CPS”代表什麼呢。

上下文理解不同,面試官的問題意圖不能被應聘者理解。

面試官的問題之間或多或少是有聯絡的,你需要根據問題的上下文,結合前面問答中面試官的語言或者肢體反饋,分析他的意圖,搞清他是在問“為什麼”,還是“是什麼”,或者“怎麼用”,從而調整要表達的內容。

面試官沒有問清楚。

比如,“請你解釋一下 HTTPS”,這樣的提問就不夠具體,原因可能是面試官怕問到你能力臨界點之外,但也可能是他本身就沒把問題想清楚。

所以,遇到問題不清楚的時候,你需要從面試官的語言和關注點上,推測他的角色、知識結構、溝通風格,回憶最近幾個問題的關係,來推測問題意圖。如果推測不出來,就直接問他,比如,“我對該技術領域瞭解 ABCD,請問您對哪方面更感興趣呢”,透過這樣的問題,來確定要講的內容。這裡的要點是“充分溝通”,否則你可能講半天,對方還是不明白。自顧自地講高深的內容,效果不一定好。

注意表達方法

回答提問時還應注意選用適當的表達方法,展示你的表達能力。這裡,我給你一些建議。

結構化表達,幫助面試官梳理資訊邏輯。

比如,使用列表,或者使用結構化的語言序號“第一……第二……”。關於表達邏輯,芭芭拉 · 明託的《金字塔原理》可能會幫到你。

視覺化。

用畫圖或者演示的方法,直觀形象地表達複雜的技術問題。

舉例子和做類比。

舉常見的例子,類比成常見的事物,這樣把高深的原理說簡單,對方不僅能聽懂,還會讚賞你的表達能力。比如:

有人問“Java 執行緒和程序有什麼區別”,知乎上有人回答:“如果一個大火鍋一個人吃,就是單程序單執行緒;一個大火鍋多人吃,就是單程序多執行緒;如果他們分開吃小火鍋,就是多程序多執行緒了。”

把內容說簡短很不容易。馬克 · 吐溫曾給讀者回信說:我沒有時間給您寫封簡訊,所以就寫了封長信。把內容陳列出來容易,但是長話短說很難。需要你深刻理解本質,區分每塊內容的重要等級,再梳理邏輯和分析取捨。

對比。

電影《無雙》中有一場面試,郭富城跟周潤發在酒吧見面,郭富城講作畫的工藝:“……把紙放進碳酸鈣和木質素就能泡出質感。行家用的油墨多數都是植物油,幹得快,穩定。而我用核桃油、煤灰和松節油混合……”這裡他是在把兩種技術進行對比,來突出自己採用的技術有多麼專業和獨特。

講故事。

如果你能找到一段相關經歷,講述該技術的應用或者學習細節,展示你學以致用的能力,效果會非常好。你可以說“這個技術,我上個月正好在某某專案上用過,當時的情況是……”

靈活運用以上方法,能讓你的表達效果事半功倍。以上這些表達方法,不僅適用於技術,在其他專業問題上,也同樣見效。但是請注意,回答時一定注意詳略。如果你在某一個問題上糾纏太久,會影響後面知識點的考查。你需要邊講邊注意面試官的反應,如果他有看錶、看簡歷等厭倦或者著急的情緒訊號,就要趕緊調整到下一點了。

推薦閱讀

從 Google 的一道面試題說起