若是業界中不用高級算法和數據結構,那爲何還要學?

 

我和我認識的人從未用過任何高級算法和數據結構,咱們中的有些人已經在業界工做 20 年了。你是如何激勵本身去學習高級算法和數據結構的呢?或許,參加編程比賽會有點用…程序員

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

恭喜你!我剛把你的簡歷扔到「不要」的那堆中去了,嘴裏還碎碎唸叨着,「爲何怎麼會有你這樣的小孩,業界出什麼問題了,我爲何要從新訓練每個我招來的工程師」。你也極可能認爲數據庫很神奇,只要再丟一個索引到裏面,就能夠解決你的全部問題,對麼?面試

我爲何要這樣作?我是一個脾氣暴躁的老頭,喜歡爲所欲爲得給應聘者設置難題嗎?算法

事實上,答案正好相反。若是你學習過,並且是一名接受過訓練的工程師(注意我一直使用這個詞),你會發現面試過程至關的簡單。我常常問一些很簡單的問題,例如「寫一個FizzBuzz程序」,「JavaScript是函數化語言?」。電話面試中有幾個超級難的問題,我並無問。由於這些問題會吸引你學習,併爲我工做。數據庫

若是我不是在設置難題,我究竟是作什麼的?編程

我正在設計一個系統,能夠基於千兆兆(10的15次方)字節規模的數據提供分析結果。因爲 Google 讓每一個人相信,他能夠在全網查找他輸入的東西,因此我也必需要在本身的網絡應用程序中提供相似表現。網絡

要作到這個,異常困難。我找了一下  EMC SAN 磁盤規格說明,上面都告訴我沒有足夠的吞吐量。雖然我能夠尋求一些無限帶寬的昂貴硬件,可是我不爲 Google 工做的,我預算有限啊。我須要找到一個方法,利用一堆廉價貨,讓它們在一塊兒來提供交互速度。一個超級強大的設備不能作到的,但一堆平行 IO 卻可能實現。數據結構

我如今所要作的,就是要求個人工程師們對這些結構寫查詢代碼……臥槽,剛纔有個童鞋嘗試把整個代碼加載到內存中,結果把整個結構的棧搞掛掉了。咱們回退了他的代碼。他說這代碼在他的測試環境上是能夠工做的,他不理解爲何會這樣。我搖搖頭,把他拉到白板前,給他解釋內存背後的原理,內存就像數據的蓄水池,容量是有限的。一個直管的經過量(數據流),只受限於時間(數據移動的速度),而不是容量。數據結構和算法

他說他明白了,之後會避免犯相似的錯誤。嗯,他可能會避免,也可能還會犯錯。有智力解決複雜計算機問題的人百裏挑一。大部分人看上去有機會,但作到的只是極少數人。特別是這個世界還有不少愚蠢的想法,好比「爲何我要學習數據結構和算法」之類的?函數

我最終可能會炒掉那個工程師。這至關糟糕(譯註:艱難的決定),由於在其它方面我仍是很喜歡他的。他只是不適合這個工做。工具

你要知道,你對編程的理解,會體如今你本身選擇的工做態度上。畢竟這些不是有趣的工做,賺的也不是不少。你作的事情也不是真正重要的。

若是你以爲做一個低工資的程序員也還好,你最終會改行去作其它的事情,那你不用去學算法和數據結構。若是計算機科學真的吸引你,你知道該作什麼。

後記

首先,感謝你們對這個帖子如此關注。也有批評者花時間給了有理有據的反駁,得以讓這個對話繼續下去。對於成爲這樣重要主題的中心,我坐臥不安。

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

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

他的代碼在代碼審查事被發現,並無進入產品。我給他和他的同事們做了關於數據倉庫的培訓,讓他們理解內在的原理,但願避免相似問題再次發生。

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

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

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

第三點,我注意到有人質疑個人經歷只是例外。我建議大家去看下「自我選擇的態度」部分。我不得不招技能很差的工程師,是由於大公司們(Google,Orbitz,NavTec,SalesForce等)展開了對工程師的搶奪大戰,儘量快地去獲得他們。大數據帶來對熟練工程師的需求激增,結果致使整個市場的短缺。這也就是爲何我不得不冒險招人,而且但願我提供的訓練是足夠的。咱們找到剩下的這些工程師,但願把他們訓練出來。這對軟件工程師有利,前提是你願意承認計算機科學,理解事物工做的本質是至關重要的。不然你會在電話面試中敗下陣來,可能永遠不知道緣由。

最後,有些人對我描述的工做環境很感興趣。我目前正在招人,若是你在芝加哥並且以爲你很適合,能夠直接和我聯繫。

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

相關文章
相關標籤/搜索