為什么新人不會編程
我們都生活在一個這樣的噩夢中:一個新手開發人員前來工作,你歡迎他的參與,卻發現他達不到你對進度的要求,而且他的提問也顯示出他對基礎知識的無知。即使他最終把工作完成了,編寫的程序也很笨拙,需要更能干的人從頭重寫。然而錄取他的面試官們或人力資源部門(如果你的公司中也有這種官僚體制的寄生蟲的話)卻信誓旦旦地表示,他們只聘用精英人才。
這是一個大問題,尤其是現在,有愈演愈烈的趨勢。每天我都從招聘人員那兒收到騷擾郵件,每個IT公司都極度渴望聘請程序開發者,但是優秀的程序員是不可替代的。一個優秀的程序員可以輕易完成相當于一個平庸的程序員五十倍的工作,而拙劣的程序員最終只會產生消極的生產力。因此,對任何公司來說雇傭這樣的人都是一個可怕的錯誤;對新創公司來說,這簡直就是具有毀滅性的公司殺手。既然這樣,為什么這種情況出現得如此頻繁呢?
就如同有很多殘留問題困擾著現代軟件工程一樣,這都是微軟的錯。當微軟還是一個人人都暗自想去工作的邪惡帝國時,就以用令人絞盡腦汁的問題面試而著名。例如:為什么井蓋是圓的?當然,他們也問剛畢業的大學生一些關于計算機科學理論的問題,如:請寫一個二分查找程序。
每個IT公司都希望能像微軟一樣,甚至Google也這么希望過,直到目前大家都想成為Google歌這樣的公司。因此這種相互模仿的面試傳統就延續了下來。看看這兩個關于面試問題的最新信息,一個來自準員工,一個來自谷歌面試官。這里引用了兩句谷歌面試官說的話,很有啟發性。我甚至不必說這是一個很好的標準。和如果有任何值得欣慰的地方,至少我們再也不問復雜的謎語問題了,那個實在是相當令人反感。
令人高興的是,Google似乎有點意識到他們的招聘方法存在問題,可惜的是他們沒有設法解決。Jean Hsu也撰文表明她對技術面試效用的疑問。根本問題是,目前通過行業標準化的軟件面試所需要的技能并不是一個優秀的軟件開發人員所需要的技能,或許這其中有某些相關性,但這個相關性就跟奧克蘭突襲者隊挑選出跑得最快的人,卻無盡沮喪地發現國家橄欖球聯盟并不是一個跑步比賽是一樣的。
事實上更糟糕。因為至少接球員是需要跑的,而我卻可以無所畏懼的向你保證,沒有哪個被聘用的軟件工程師必須寫一個二分查找程序。這就如你選擇承包商一樣,因為他們知道怎樣用煤、鐵、爐子和風箱來鍛造和澆鑄鋼材。事實上他們只需要知道最近的一家家得寶(全球最大的家居建材零售商,美國第二大零售商)的地址,以及用在那里買的鋼材來做什么用。
你通常試圖在雇員身上找尋的東西,Joel Spolsky曾給出了準確的解釋,即:就是聰明(Smart)并且能做事(Get things done)的人。(大學院校中到處都是具備前者而不具備后者的人。)不過,首先你必須構建一些其它的能力,也就是說不能完全不具備任何能力。你會驚奇的發現,如此多的完全不勝任的應聘者出現在技術面試中。谷歌的二分搜索大概是打算作為他們的FizzBuzz(分支切換)一個你進入谷歌大門必須越過的障礙。這個FizzBuzz在真正的面試開始前占據了足足五分鐘。
那么,一場真正的面試包括什么呢?請允許我提出一個愚見:不聘用沒有任何成就的人。證書和學位從來都不是成就,我是指有實際用戶的真實項目。現在Google App Engine和Amazon Web Services提供免費的第三方服務,而且要注冊成為一名Android開發人員,并在Android Market發布程序也總共只需25美元。在這樣一個世界里,任何軟件開發人員沒有借口說他沒有自己制作的網站、應用程序或服務。(編注:因此,新人在參加全職工作前,去承接網站開發項目或者軟件開發項目,從中學到的知識和積累的經驗,對新人而言是一項非常寶貴的財富。)
舊的面試體系以有限的信息為基礎,你只能通過應聘者的簡歷了解他們。但是,如果你只面試有成就的人,你將會有一個更寬廣的平臺來開展工作。避開FizzBuzz,直接讓應聘者展示他們的代碼,并解釋他們的設計決策,如果讓他們現在重新做的話,又會有什么不同。你在一旁觀看時,讓他們實現一個或者兩個功能,這樣你就能知道他們實際上是怎樣工作的以及他們在工作中的想法。這才是你想從一場技術面試中得到的,而不是通過一些過時的算法和數據結構來對此進行估量。這個世界總在不斷前進。