如果業界中不用高階演算法和資料結構,那為什麼還要學?
源自 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 邏輯,你將始終面對複雜問題的恐懼和解決它們的成就感。
相關文章
- 為什麼要學習資料結構和演算法?資料結構演算法
- 為什麼要學資料結構?資料結構
- 我們為什麼要學習資料結構和演算法?(一)資料結構演算法
- 《資料結構與演算法JavaScript描述》選讀:為什麼要學習資料結構和演算法資料結構演算法JavaScript
- 《資料結構與演算法之美》為什麼要學習資料結構和演算法 (讀後感)資料結構演算法
- 為什麼演算法和資料結構重要?演算法資料結構
- 為什麼要學習python中的高階知識Python
- 如果null很糟糕,那為什麼現代程式語言還要實現它?Null
- 個人站長未來那麼不看好,為什麼還要學習SEO?
- Python中的高階資料結構Python資料結構
- Python 中的高階資料結構Python資料結構
- 資料結構與演算法——常用高階資料結構及其Java實現資料結構演算法Java
- javascript資料結構與演算法--高階排序演算法JavaScript資料結構演算法排序
- 深度學習為什麼需要那麼多的資料?深度學習
- 高階資料結構---堆樹和堆排序資料結構排序
- 大資料和Hadoop什麼關係?為什麼大資料要學習Hadoop?大資料Hadoop
- 企業為什麼要建資料倉儲?
- FTP這麼“好用”和“便宜”,為什麼企業還要替換掉?FTP
- 高階資料結構詳解資料結構
- 【C#進階】高階資料結構和演算法_2024-06-22C#資料結構演算法
- python演算法與資料結構-什麼是資料結構Python演算法資料結構
- 為什麼我要放棄javaScript資料結構與演算法(第二章)——陣列JavaScript資料結構演算法陣列
- 為什麼資料備份那麼重要?
- 為什麼大神的UI設計那麼高階?答案盡在此文…UI
- 如果要學習web前端,需要學習什麼Web前端
- 資料治理為什麼要清洗資料
- 2020年了,為什麼IT行業還那麼“吃香”?行業
- 《Java 高階篇》五:資料結構Java資料結構
- 高階資料結構-可並堆資料結構
- 為什麼還要記密碼密碼
- React元件方法中為什麼要繫結thisReact元件
- 大資料分析師要學什麼專業?大資料
- 乾貨 | 學習大資料為什麼要先學Java?大資料Java
- 文字編輯工具那麼多,運維為什麼要學vi/vim?運維
- 為什麼那麼多人要學Java?這三個原因告訴你Java
- 演算法與資料結構高階排序演算法之歸併排序演算法資料結構排序
- 為什麼網際網路行業薪資高?那麼哪些崗位最有前途?行業
- 為什麼不用資料庫儲存圖片?資料庫