超級程式設計師神話

aqee發表於2012-09-03

  上週我收到了一份郵件,一份讓我心緒不寧的郵件。

  郵件的作者基本上認為我在部落格裡和Pluralsight視訊節目裡談論的都是非常淺顯的話題,但發現我卻虛偽的倡議面試內容應該設計的複雜些,應該為“真正的程式設計師”或超級程式設計師而設計。

  這份郵件基本上表達了這樣一種觀點:開發應用程式的都不是“真正的程式設計師”,“真正的程式設計師”編寫的是有難度的東西,跟複雜的數學演算法相關的東西。

  真有超級程式設計師嗎?

超級程式設計師

  我並不認為這種對程式設計和軟體開發的認識和理解是他獨有的,或是個別現象。甚至IT精英Scott Hanselman也稱呼自己並且認為自己是欺世盜名的騙子

  Scott Hanselman的這篇文章讓我產生了共鳴,因為有時候我也有和他相同的感覺。

  有時候,我很懷疑,我是否真的有能力解決真正有難度的問題。

  讓我斗膽猜測一下,我猜測大部分的程式設計師在思想裡都會某種程度的承認,承認自己只是一個普通的程式設計師,但這世界上確實有一些超級程式設計師,他們在做一些諸如控制硬碟快取或為谷歌建立搜尋索引等非常複雜的演算法問題。

  好吧,不否認,當然會有一些程式設計師正在寫一些程式碼處理各種你我都不能理解的複雜問題,但他們跟我們這些餘下的程式設計師究竟有多大區別呢?

  在一個為企業開發應用的程式設計師和一個為谷歌寫搜尋演算法的程式設計師之間,或和一個開發用來控制讀寫頭從磁碟扇區讀取資料的物理操作的晶片程式設計師之間,有真正的不同嗎?

  在我回答這個問題之前…

  讓我們花幾分鐘時間談談他們所解決的問題。

  你曾經遇到過的需要去解決的最有難度的問題是什麼?

  你是如何著手去解決這些問題的?

  到最後,當你真正的解決了這個問題時,你是否覺得好像不是那麼難?

  當你回顧這段經歷,回頭來看這個問題時,你是否會發現,現在看來,它其實是個非常簡單的問題?

  你有很多疑問,我知道——可是我希望你在繼續往下閱讀前真正花時間思考一下這些疑問。

  理解“認知”和“現實”之間的差距。這是非常重要的。很多的程式設計師,包括我在內,都經常分不清兩者之間的區別。

  大家都知道,我們對一個問題的認知經常跟這個問題的真實情況有很大差距。當我們還不理解一個問題時,我們會把這個問題想象的比它本身要複雜。但是,一旦我們理解了這個問題,我們會發現這實際上是一個很容易處理的問題。

  讓我來給你一個現實的例子。看一看下面這個數學公式。

複雜公式

  我們可以把在看這個公式的人分成兩類人。

  1. 對高等數學有相當瞭解的人,他們能立即認出這個公式,能馬上知道它是幹嘛的。
  2. 從來都沒見過這樣一堆符號的人,他們的即時反應會認為這是某種複雜的演算法,可能需要幾年的時間才能弄懂。

  也許我說的並不很準確,但我想說的就是,在“會的人”和“不會的人”之間有一個清晰的分界線。

  我可以用你已經熟悉的知識對這些符號做一個簡單的解釋。

  準備好了嗎?

  這個公式跟下面這段程式碼是等效的:

var total = 0;
for(int i = n; i <= m; i++)
{
   total +=  f(i)
}

  這說明了什麼?

  我想說的是,在數學演算法中,在程式設計中,在我們的日常開發工作中,只有少數一些問題能稱得上是有難度的問題,而且通常這些比較難的問題都能夠分解成更小的問題(有時候需要多次分解),直到最後你需要處理的只是一個很簡單的問題。

  我的這個部落格的目的,我的Pluralsight視訊節目的目的,基本上都是告訴大家要把複雜的事情簡單化。我自己的生活也是這樣。

  如果你想成為一個成功的程式設計師,你必須自己要學會如何做到這些,它會是你能學到的最重要的一門技能。

  那麼,現在來回答最初的問題——不,我不相信這世上存在超級程式設計師。我不認為在企業應用程式設計師和那些被視作在研究真正複雜問題或“真正的程式設計”的程式設計師之間有什麼不同之處。

  但不要誤解我的意思,不要以為我是在說我不相信某些程式設計師會被其他程式設計師在技能高出好幾個數量級。我敢大膽的說,真正優秀的程式設計師在效率是會比普通程式設計師高出10倍甚至20陪。

  我想說的是,我們有一個習慣,總是忘記:當問題被分解成更小的問題後,所有的問題都變得如此簡單,而且所有的問題都能這樣去分解。

  我想說的是,這個問題是一種能夠阻擋你進步成為一個真正優秀程式設計師的問題,這是由於你自己的認知上錯誤導致的,你會把目前看上去複雜東西當作是不可理解的。

  我想說的是,當你在開發一個對自己來說似乎是很容易的企業應用時,你可能忘記了,對於那些對程式設計一無所知的所有你的朋友和家人來說,這是一個多麼困難或幾乎不可能完成的事情。

  仍然不贊同我的觀點?

  很好,你有這樣思考的權利。

  但我給你準備了一個難題。你想必一定是知道某位“超級程式設計師”了。也許你就是其中之一。如果是這樣,我們要聽你說說。請告訴我們一個非常有難度以至於其他的人有不可能理解的複雜問題。

  我並不是在挖苦你。我是很嚴肅的,如果你能夠證明我錯了,那就證明給大家看。我至今還未遇到過一個不能分解成簡單可理解的小問題的難題。

英文原文:The Myth of the Super Programmer

相關文章