如果業界中不用高階演算法和資料結構,那為什麼還要學?

Jerason Banes發表於2015-09-25

這個源自 Quora,題主還補充說:

我和我認識的人從未用過任何高階演算法和資料結構,我們中的有些人已經在業界工作 20 年了。你是如何激勵自己去學習高階演算法和資料結構的呢?或許,參加程式設計比賽會有點用…

下面是來自 Jerason Banes 的回答,1.4 K+ 頂

恭喜你!我剛把你的簡歷扔到“不要”的那堆中去了,嘴裡還碎碎唸叨著,「為什麼怎麼會有你這樣的小孩,業界出什麼問題了,我為什麼要重新訓練每一個我招來的工程師」。你也很可能認為資料庫很神奇,只要再丟一個索引到裡面,就可以解決你的所有問題,對麼?

我為什麼要這樣做?我是一個脾氣暴躁的老頭,喜歡隨心所欲得給應聘者設定難題嗎?

事實上,答案正好相反。如果你學習過,而且是一名接受過訓練的工程師(注意我一直使用這個詞),你會發現面試過程相當的簡單。我經常問一些很簡單的問題,例如「寫一個FizzBuzz程式」,「JavaScript是函式化語言?」。電話面試中有幾個超級難的問題,我並沒有問。因為這些問題會吸引你學習,併為我工作。

如果我不是在設定難題,我到底是做什麼的?

我正在設計一個系統,可以基於千兆兆(10的15次方)位元組規模的資料提供分析結果。由於 Google 讓每個人相信,他可以在全網查詢他輸入的東西,所以我也必須要在自己的網路應用程式中提供類似表現。

要做到這個,異常困難。我找了一下  EMC SAN 磁碟規格說明,上面都告訴我沒有足夠的吞吐量。雖然我可以尋求一些無限頻寬的昂貴硬體,但是我不為 Google 工作的,我預算有限啊。我需要找到一個方法,利用一堆廉價貨,讓它們在一起來提供互動速度。一個超級強大的裝置不能做到的,但一堆平行 IO 卻可能實現。

我現在所要做的,就是要求我的工程師們對這些結構寫查詢程式碼……臥槽,剛才有個童鞋嘗試把整個程式碼載入到記憶體中,結果把整個結構的棧搞掛掉了。我們回退了他的程式碼。他說這程式碼在他的測試環境上是可以工作的,他不理解為什麼會這樣。我搖搖頭,把他拉到白板前,給他解釋記憶體背後的原理,記憶體就像資料的蓄水池,容量是有限的。一個直管的通過量(資料流),只受限於時間(資料移動的速度),而不是容量。

他說他明白了,以後會避免犯類似的錯誤。嗯,他可能會避免,也可能還會犯錯。有智力解決複雜計算機問題的人鳳毛麟角。大部分人看上去有機會,但做到的只是極少數人。特別是這個世界還有很多愚蠢的想法,比如“為什麼我要學習資料結構和演算法”之類的?

我最終可能會炒掉那個工程師。這相當糟糕(譯註:艱難的決定),因為在其它方面我還是很喜歡他的。他只是不適合這個工作。

你要知道,你對程式設計的理解,會體現在你自己選擇的工作態度上。畢竟這些不是有趣的工作,賺的也不是很多。你做的事情也不是真正重要的。

如果你覺得作一個低工資的程式設計師也還好,你最終會改行去做其它的事情,那你不用去學演算法和資料結構。如果電腦科學真的吸引你,你知道該做什麼。

後記

首先,感謝大家對這個帖子如此關注。也有批評者花時間給了有理有據的反駁,得以讓這個對話繼續下去。對於成為這樣重要主題的中心,我誠惶誠恐。

接下來,我想和那些覺得這帖子有些刺耳的人解釋下。當我決定回這個問題時,我想讓答案比以往的更有影響力。以往的答案有些是很好的,但缺少和年輕人的內在聯絡,讓他們不容易理解。電影會以呈現原始場景的方式引起觀眾的共鳴,我發帖目的也是一樣的。

我收到的另外一類質疑,覺得這是一個虛構的故事。請理解,這只是對我所處理問題的一種提煉。這些情況都出現過,只是順序不是你在帖子裡看到的。例如,上次我談到有個工程師在流程式碼中間使用 ArrayList 緩衝區,他並沒有被解僱的風險。事實上他是一個相當優秀的工程師,只是當時沒有考慮到。

他的程式碼在程式碼審查事被發現,並沒有進入產品。我給他和他的同事們作了關於資料倉儲的培訓,讓他們理解內在的原理,希望避免類似問題再次發生。

解僱人是一件困難的事情。你必須這樣開始,“我做錯了什麼?”,“我要怎樣解決這個問題?”。找到滿足他們個人和適合他們的學習方式,通常需要一個漫長的過程。很多人都回答好的領導力和培訓。有一些已經超過我的能力範圍。

因為一開始就把重點放在不要招不合適的人,那些我不得不解僱的人,都是不適合團隊的(例如,社會問題沒有得到改善),或者很長時間都沒有掌握他們學習的東西。後面這種情況,對我這樣善解人意的領導而言很難,因為他們的表現看上去有改善,但之後又回落到之前的表現。幸好這樣的情況很少,但卻讓人印象深刻。

我現在停下來說一些我見過很棒的工程師,他們在構建大規模程式碼上沒啥經驗,但他們對出現的機遇會很興奮。在某些情況下,這些人會比那些對自己技能有信心的人,更加主動學習和提高。這遠不是一個硬性規則,只是一個有趣的觀察。

第三點,我注意到有人質疑我的經歷只是例外。我建議你們去看下“自我選擇的態度”部分。我不得不招技能不好的工程師,是因為大公司們(Google,Orbitz,NavTec,SalesForce等)展開了對工程師的搶奪大戰,儘可能快地去得到他們。大資料帶來對熟練工程師的需求激增,結果導致整個市場的短缺。這也就是為什麼我不得不冒險招人,並且希望我提供的訓練是足夠的。我們找到剩下的這些工程師,希望把他們訓練出來。這對軟體工程師有利,前提是你願意認可電腦科學,理解事物工作的本質是相當重要的。否則你會在電話面試中敗下陣來,可能永遠不知道原因。

最後,有些人對我描述的工作環境很感興趣。我目前正在招人,如果你在芝加哥而且覺得你很適合,可以直接和我聯絡。

讓你瞭解一下你所要進入的領域,我為健康分析中心服務。這行業中的事務處理程式碼很可能佔 95 %,大多數函式庫和軟體都關注在這些上。分析只佔 5 % ,只能使用少數 BI 工具。這些工具在我的行業中不好用,因為我們關心這些資料的細節(比如每個病人),並通過摘要方式找到那些事例,而不是結束它們。這帶來很大的挑戰,讓我不停工作下去。一言以蔽之,你需要了解資料庫優化的思想,你會從事定製大規模的謂詞引擎,你將開發定製化的 OLAP 邏輯,你將始終面對複雜問題的恐懼和解決它們的成就感。

打賞支援我翻譯更多好文章,謝謝!

打賞譯者

打賞支援我翻譯更多好文章,謝謝!

任選一種支付方式

如果業界中不用高階演算法和資料結構,那為什麼還要學? 如果業界中不用高階演算法和資料結構,那為什麼還要學?

相關文章