从一道面试题谈起,大厂到底看重程序员的什么能力?
唐磊,他謙遜的自我介紹,是“在阿里云打工的清華學渣”。
上周的一篇《字符串比較,居然暗藏玄機》,我最早是在唐磊《這10行比較字符串相等的代碼給我整懵了》里看到的,我用通俗的語言,展開了“密碼破解”案例。文末卻沒有提引用的出處,這里和唐磊道個歉。
看了唐磊的其他一些文章,源于一線,深入細節,不禁想起了4-5年前提筆寫技術文字的自己。
希望他的好文被更多熱愛技術的小伙伴看到,這里轉一篇唐磊的好文。
文章:《從一道面試題談起,大廠到底看重程序員的什么能力?》
這是我在面試過程中,經常問的一道題。
一起看看,一起動筆試試吧。
實現一個函數,完成開根號的操作:
double sqrt(int v, double t)
要求:
(1)不能調用系統庫函數,例如 Math.sqrt(v);
(2)假設計算出的結果為 r,要求滿足這個條件:??,其中?是真實的值, t ?為給定的一個誤差范圍,例如0.1等,即你計算出的值要在給定的誤差范圍內;?
畫外音:例如,調用你的接口 sqrt(9, 0.21) 返回值屬于 [2.79, 3.21] 這個區間就行。
你可以拿出筆和紙,嘗試解答一下。
畫外音:leetcode上遇見過類似的也沒問題。
面試官:有什么思路嗎?
求職者:沒有啊。
可能候選人內心在罵你:出這樣的題目是不是有病啊,明明有 lib 函數可以直接用的。
我想說的是,面試,并不在于題目本身,而是以題目為抓手,考察候選人在分析問題和解決問題的能力,以及在交流過程中,所體現的理解能力,邏輯能力和思維方式,當然,也會從?Code 中考察候選人的編程習慣與編程風格。
此時,我會引導候選人:
面試官:根號10等于多少?
求職者:3點幾吧。
面試官:你怎么知道是3點幾?
求職者:9開根號是3,明白了,我再想想……
這里是希望提醒候選人,要先解決,再優化。在實際工作場景也一樣,先思考解決問題的方法,再考慮優化。
暴力搜索法
面試過程中,很多人能回答到這一步:
先用一個循環找到 r,使得 r^2 是離給定 v 最近的平方數,即你希望算根號10 ,先找到3,因為3^2=9 。然后再用一個循環, 每次 r+=t ,直到 r^2 > v ?為止。
面試官:這是一個可行的方案,但如果精度要求很高,v 也很大,如 sqrt(v = 10000000, t = 0.000001) 之類的,效率不會很低么?
求職者:可以這樣優化,比如設置一個步長,一次迭代后,如果沒有達到預期,可以不斷修改這個步長來增大逼近真實值的速度,比如10倍誤差,100倍誤差等。
其實,在與候選人的不斷交流中,可以看出候選人的理解能力,與解決問題的能力,這本身也是面試過程中的一部分。
面試官:恩,這樣做確實可以優化。但從本質上講,該題目其實是在一個有序的列表里,去搜索滿足條件的特定的值。除了你說的線性搜索,還有其它方法嗎?
?
求職者:二分搜索?
二分搜索法
提示二分,大部分候選人就能夠寫出二分框架,只是結束條件仍有疑惑,我會繼續舉例提醒他:
面試官:借助二分的意思就是,比如算 根號10,搜索范圍是?[0, 10]:
-
因為5^2 = 25 > 10 ,?所以 r 屬于[0, 5) ??
-
因為(5/2) ^2 = 6.25 < 10 ,?所以 r 屬于 (2.5, 5) ??
-
因為(3.75^2 = 14.0625 > 10) ,所以 r 屬于 (2.5, 3.75) ??
-
...
求職者:明白了。
能寫出二分,作為一線開發者基本就不成問題了。
但很多人都喜歡用遞歸寫,卻容易遺漏遞歸里的結束條件。所以一般情況下,代碼寫完后,我會讓候選人自己寫測試用例。
面試官:假設這個接口是別人寫的,應該從哪幾個角度去測試?
求職者:sqrt(-4, 0.21),哎呀,我這里忘了判斷了。改一下代碼。
求職者:sqrt(0, 0.21),sqrt(4, 0.21) 還有問題,再改改。
面試官:……
為什么要別人提示要測試用例,才去 check 自己寫的代碼的正確性呢。
能夠到達這一個步驟的人已經較少了,如果你有較全測試用例和邊界條件的判斷,再加上后面的結束條件能夠正確,基本上這道題目就算滿意了。
關于結束條件
本質上講,這個算法就是一個迭代逼近的過程,用二分的思路后,關鍵就在于什么時候結束。?題目中已經給了誤差條件??,難點在于其中的不知道,不太方便直接進行計算判斷。不少人用一個另外的結束條件來進行了判斷即:??,額,這一樣嗎?
其他解法
當然本題還有一些其他的數學解法,例如用牛頓迭代法,梯度下降法,泰勒公式展開等等。如果候選人能想到這些,說明他還是有一定數學基礎的,可以讓他講講。
?
結語
其實,上面大部分內容只談到了這道題目本身,也穿插了一些對這道題目的分析和理解,這樣的題目考察校招的同學會比較合適。
但類似的題目,社招完全不適用嗎?
社招的的同學,寫不出來就有很充分的理由嗎?
或許你在工作場景中不會遇到實際這種題目,但我其實想表達的是,作為一線的工程師,在面試官講解了二分算法,并且自己也能理解的情況下,寫出相關的 Code ,真的很過分嗎?
在日常有些場景下,“復制粘貼”工程師貌似也夠用,遇到問題,叫更高水平的人來幫你,這樣的話,你的核心競爭力在哪里?
我建議一線的程序員們,應該對基本的數據結構和算法有所了解,對常見的算法復雜度有所了解。這樣的要求,不高吧。
之前遇到過一些候選人,Java 開發七八年經驗了,卻不清楚 ArrayList, HashMap 內部是怎么做的。還有些候選人,口頭表達頭頭是道,結果落實到寫代碼就根本下不了筆。
希望我們不要拋棄一些基礎的東西,多培養一下我們的編程素養,在用編程語言,利用各種工具來實現我們想要達到的目的的時候,能做到“知其然,知其所以然”。
總結
以上是生活随笔為你收集整理的从一道面试题谈起,大厂到底看重程序员的什么能力?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 因为一个跨域请求,我差点丢了饭碗!
- 下一篇: 面试官:BigDecimal 一定不会丢