超級(jí)程序員神話
上周我收到了一份郵件,一份讓我心緒不寧的郵件。
郵件的作者基本上認(rèn)為我在博客里和Pluralsight視頻節(jié)目里談?wù)摰亩际欠浅\顯的話題,但發(fā)現(xiàn)我卻虛偽的倡議面試內(nèi)容應(yīng)該設(shè)計(jì)的復(fù)雜些,應(yīng)該為“真正的程序員”或超級(jí)程序員而設(shè)計(jì)。
這份郵件基本上表達(dá)了這樣一種觀點(diǎn):開(kāi)發(fā)應(yīng)用程序的都不是“真正的程序員”,“真正的程序員”編寫(xiě)的是有難度的東西,跟復(fù)雜的數(shù)學(xué)算法相關(guān)的東西。
真有超級(jí)程序員嗎?
我并不認(rèn)為這種對(duì)編程和軟件開(kāi)發(fā)的認(rèn)識(shí)和理解是他獨(dú)有的,或是個(gè)別現(xiàn)象。甚至IT精英Scott Hanselman也稱呼自己并且認(rèn)為自己是欺世盜名的騙子。
Scott Hanselman的這篇文章讓我產(chǎn)生了共鳴,因?yàn)橛袝r(shí)候我也有和他相同的感覺(jué)。
有時(shí)候,我很懷疑,我是否真的有能力解決真正有難度的問(wèn)題。
讓我斗膽猜測(cè)一下,我猜測(cè)大部分的程序員在思想里都會(huì)某種程度的承認(rèn),承認(rèn)自己只是一個(gè)普通的程序員,但這世界上確實(shí)有一些超級(jí)程序員,他們?cè)谧鲆恍┲T如控制硬盤(pán)緩存或?yàn)楣雀杞⑺阉魉饕确浅?fù)雜的算法問(wèn)題。
好吧,不否認(rèn),當(dāng)然會(huì)有一些程序員正在寫(xiě)一些代碼處理各種你我都不能理解的復(fù)雜問(wèn)題,但他們跟我們這些余下的程序員究竟有多大區(qū)別呢?
在一個(gè)為企業(yè)開(kāi)發(fā)應(yīng)用的程序員和一個(gè)為谷歌寫(xiě)搜索算法的程序員之間,或和一個(gè)開(kāi)發(fā)用來(lái)控制讀寫(xiě)頭從磁盤(pán)扇區(qū)讀取數(shù)據(jù)的物理操作的芯片程序員之間,有真正的不同嗎?
在我回答這個(gè)問(wèn)題之前…
讓我們花幾分鐘時(shí)間談?wù)勊麄兯鉀Q的問(wèn)題。
你曾經(jīng)遇到過(guò)的需要去解決的最有難度的問(wèn)題是什么?
你是如何著手去解決這些問(wèn)題的?
到***,當(dāng)你真正的解決了這個(gè)問(wèn)題時(shí),你是否覺(jué)得好像不是那么難?
當(dāng)你回顧這段經(jīng)歷,回頭來(lái)看這個(gè)問(wèn)題時(shí),你是否會(huì)發(fā)現(xiàn),現(xiàn)在看來(lái),它其實(shí)是個(gè)非常簡(jiǎn)單的問(wèn)題?
你有很多疑問(wèn),我知道——可是我希望你在繼續(xù)往下閱讀前真正花時(shí)間思考一下這些疑問(wèn)。
理解“認(rèn)知”和“現(xiàn)實(shí)”之間的差距。這是非常重要的。很多的程序員,包括我在內(nèi),都經(jīng)常分不清兩者之間的區(qū)別。
大家都知道,我們對(duì)一個(gè)問(wèn)題的認(rèn)知經(jīng)常跟這個(gè)問(wèn)題的真實(shí)情況有很大差距。當(dāng)我們還不理解一個(gè)問(wèn)題時(shí),我們會(huì)把這個(gè)問(wèn)題想象的比它本身要復(fù)雜。但是,一旦我們理解了這個(gè)問(wèn)題,我們會(huì)發(fā)現(xiàn)這實(shí)際上是一個(gè)很容易處理的問(wèn)題。
讓我來(lái)給你一個(gè)現(xiàn)實(shí)的例子。看一看下面這個(gè)數(shù)學(xué)公式。
我們可以把在看這個(gè)公式的人分成兩類(lèi)人。
對(duì)高等數(shù)學(xué)有相當(dāng)了解的人,他們能立即認(rèn)出這個(gè)公式,能馬上知道它是干嘛的;從來(lái)都沒(méi)見(jiàn)過(guò)這樣一堆符號(hào)的人,他們的即時(shí)反應(yīng)會(huì)認(rèn)為這是某種復(fù)雜的算法,可能需要幾年的時(shí)間才能弄懂。
也許我說(shuō)的并不很準(zhǔn)確,但我想說(shuō)的就是,在“會(huì)的人”和“不會(huì)的人”之間有一個(gè)清晰的分界線。
我可以用你已經(jīng)熟悉的知識(shí)對(duì)這些符號(hào)做一個(gè)簡(jiǎn)單的解釋。
準(zhǔn)備好了嗎?
這個(gè)公式跟下面這段代碼是等效的:
- var total = 0;
- for(int i = n; i <= m; i++)
- {
- total += f(i)
- }
這說(shuō)明了什么?
我想說(shuō)的是,在數(shù)學(xué)算法中,在編程中,在我們的日常開(kāi)發(fā)工作中,只有少數(shù)一些問(wèn)題能稱得上是有難度的問(wèn)題,而且通常這些比較難的問(wèn)題都能夠分解成更小的問(wèn)題(有時(shí)候需要多次分解),直到***你需要處理的只是一個(gè)很簡(jiǎn)單的問(wèn)題。
我的這個(gè)博客的目的,我的Pluralsight視頻節(jié)目的目的,基本上都是告訴大家要把復(fù)雜的事情簡(jiǎn)單化。我自己的生活也是這樣。
如果你想成為一個(gè)成功的程序員,你必須自己要學(xué)會(huì)如何做到這些,它會(huì)是你能學(xué)到的最重要的一門(mén)技能。
那么,現(xiàn)在來(lái)回答最初的問(wèn)題——不,我不相信這世上存在超級(jí)程序員。我不認(rèn)為在企業(yè)應(yīng)用程序員和那些被視作在研究真正復(fù)雜問(wèn)題或“真正的編程”的程序員之間有什么不同之處。
但不要誤解我的意思,不要以為我是在說(shuō)我不相信某些程序員會(huì)被其他程序員在技能高出好幾個(gè)數(shù)量級(jí)。我敢大膽的說(shuō),真正優(yōu)秀的程序員在效率是會(huì)比普通程序員高出10倍甚至20陪。
我想說(shuō)的是,我們有一個(gè)習(xí)慣,總是忘記:當(dāng)問(wèn)題被分解成更小的問(wèn)題后,所有的問(wèn)題都變得如此簡(jiǎn)單,而且所有的問(wèn)題都能這樣去分解。
我想說(shuō)的是,這個(gè)問(wèn)題是一種能夠阻擋你進(jìn)步成為一個(gè)真正優(yōu)秀程序員的問(wèn)題,這是由于你自己的認(rèn)知上錯(cuò)誤導(dǎo)致的,你會(huì)把目前看上去復(fù)雜東西當(dāng)作是不可理解的。
我想說(shuō)的是,當(dāng)你在開(kāi)發(fā)一個(gè)對(duì)自己來(lái)說(shuō)似乎是很容易的企業(yè)應(yīng)用時(shí),你可能忘記了,對(duì)于那些對(duì)編程一無(wú)所知的所有你的朋友和家人來(lái)說(shuō),這是一個(gè)多么困難或幾乎不可能完成的事情。
仍然不贊同我的觀點(diǎn)?
很好,你有這樣思考的權(quán)利。
但我給你準(zhǔn)備了一個(gè)難題。你想必一定是知道某位“超級(jí)程序員”了。也許你就是其中之一。如果是這樣,我們要聽(tīng)你說(shuō)說(shuō)。請(qǐng)告訴我們一個(gè)非常有難度以至于其他的人有不可能理解的復(fù)雜問(wèn)題。
我并不是在挖苦你。我是很?chē)?yán)肅的,如果你能夠證明我錯(cuò)了,那就證明給大家看。我至今還未遇到過(guò)一個(gè)不能分解成簡(jiǎn)單可理解的小問(wèn)題的難題。
原文鏈接:http://www.aqee.net/the-myth-of-the-super-programmer/
【編輯推薦】