從許多方面看,程序員之間的差異都非常大,只有很了解程序設(shè)計(jì)的人才能完全理解這一點(diǎn)。大多數(shù)公司的高層管理者對所有的程序員一視同仁,這是一個(gè)可怕的錯誤。微軟公司的Bill Gates和Adobe Systems公司的John Warnock都沒有犯這樣的錯誤,因?yàn)樗麄儌z本質(zhì)上也都是程序員。
這種差異為什么很重要?也許不應(yīng)該很重要,但事實(shí)上,這種差異真的很重要。歷經(jīng)多年的程序員管理工作之后,我們?nèi)匀惑@嘆于程序員之間的巨大差異,需要有區(qū)別地進(jìn)行問題處理和激勵。對我們而言,有一點(diǎn)是毫無疑問的:要想成功地管好程序員,首先必須真正地了解每個(gè)程序員。
有一點(diǎn)值得重視:我們發(fā)現(xiàn)一般情況下,程序員的年齡、性別、種族或文化不會造成太大的差異。根據(jù)我們對數(shù)以百計(jì)的程序員招聘與管理的經(jīng)驗(yàn),程序員之間的差異主要來自個(gè)人內(nèi)在因素,而不是外在屬性。當(dāng)然,后天的訓(xùn)練和經(jīng)歷肯定是有影響的,但個(gè)人的天賦和與生俱來的特點(diǎn)才是真正的區(qū)別所在。
理解程序員的方法有很多種,我們從以下幾個(gè)不同的角度來考慮:
程序設(shè)計(jì)工種;
程序員的類型;
領(lǐng)域知識;
程序員的工作要求與能力;
工作地點(diǎn)與關(guān)系;
代系特點(diǎn);
個(gè)人特點(diǎn)。
1.程序設(shè)計(jì)工種
了解程序員的第一種方法是分析他們的程序設(shè)計(jì)工作可以歸為哪些類型。程序設(shè)計(jì)工作通常有下面4種類型:
客戶端程序員;
服務(wù)器程序員;
數(shù)據(jù)庫程序員;
Web開發(fā)人員及其他腳本編寫者。
當(dāng)然,可能有許多特殊的程序設(shè)計(jì)工作難以確切地歸結(jié)為上述某種類型。但總的來說,這4種類型已經(jīng)覆蓋了世界上的絕大多數(shù)程序員,其中每一種程序員擅長的問題解決方法、使用的工具以及側(cè)重的產(chǎn)品方向都各不相同。一些極有天分的程序員能夠勝任所有工作,但大多數(shù)程序員認(rèn)為自己雖然能完成所有的程序設(shè)計(jì)任務(wù),但其實(shí)只能把其中一種做好。
一般情況下,我們建議為不同類型的工作任務(wù)安排不同的程序員,不要指望哪個(gè)程序員能同時(shí)兼任多種類型的工作,否則你很可能會為這個(gè)決策感到后悔。因此,在雇用程序員或者為項(xiàng)目安排人手之前,首先必須明確自己需要什么類型的程序員。
1.1 客戶端程序員
把所有曾經(jīng)從事過程序設(shè)計(jì)工作的程序員都統(tǒng)計(jì)在內(nèi),大部分程序員都屬于客戶端程序員。這里術(shù)語客戶端(client)指的是程序所在的位置,通常是終端用戶的計(jì)算機(jī)上。個(gè)人電腦的出現(xiàn)催生了無數(shù)的“客戶端程序”——文字處理軟件、電子表格、工作效率程序、游戲以及眾多的實(shí)用工具(包括微軟的Word與Excel、Brøderbund的Myst游戲以及Lemke的GraphicConverter工具等)。而在個(gè)人電腦出現(xiàn)之前,程序員所編寫的大多數(shù)程序都在中央系統(tǒng)中運(yùn)行。程序的開發(fā)者負(fù)責(zé)把“客戶端結(jié)果”傳輸?shù)椒侵悄芙K端或者智能終端,或者通過打印出的報(bào)告提交“客戶端結(jié)果”。這些程序開發(fā)者也是客戶端程序員。
隨著低成本微處理器的普及,客戶端程序員逐漸把業(yè)務(wù)拓展到嵌入式應(yīng)用領(lǐng)域,所開發(fā)和交付的應(yīng)用可以在游戲控制臺、手機(jī)、iPad以及其他的消費(fèi)電子設(shè)備和終端用戶設(shè)備上運(yùn)行。
為什么把這些程序員都?xì)w類為客戶端程序員呢?因?yàn)樗麄冊诠ぷ鲿r(shí)幾乎可以完全控制自己的資源。客戶端程序員的任務(wù)范圍通常是有限的,所需要交付的產(chǎn)品也是明確的。因此,客戶端程序員/團(tuán)隊(duì)的職責(zé)很明晰,除了服務(wù)器端傳來的數(shù)據(jù)外也幾乎不依賴其他東西。
1.2 服務(wù)器程序員
你可以通過學(xué)習(xí)Java視頻來成為一名服務(wù)器端程序員這里術(shù)語服務(wù)器(server)不僅指出了程序所處的位置,還表明了編寫程序的目的通常是向遠(yuǎn)程客戶端傳輸信息和數(shù)據(jù)。服務(wù)器程序所在的機(jī)器通常離終端用戶都很遠(yuǎn),而且大多數(shù)這樣的程序必須能夠同時(shí)處理來自多個(gè)客戶端的多種行為,這就使得服務(wù)器程序通常比客戶端程序員開發(fā)的程序更復(fù)雜一些。在編寫和部署服務(wù)器程序時(shí),通常還要求在增加新機(jī)器與資源時(shí)能不用改變程序的基本結(jié)構(gòu),這又進(jìn)一步增加了開發(fā)服務(wù)器程序的復(fù)雜度。
隨著互聯(lián)網(wǎng)的出現(xiàn),術(shù)語客戶/服務(wù)器(client/server)就成了Web瀏覽器與(“在網(wǎng)上某個(gè)地方的”)Web服務(wù)器之間交互方式的代名詞。基于客戶端的Web瀏覽器很復(fù)雜,但實(shí)踐證明,創(chuàng)建能夠使數(shù)以百計(jì)或數(shù)以千計(jì)的終端用戶同時(shí)訪問同一臺Web服務(wù)器的服務(wù)器程序,確實(shí)是一項(xiàng)更為復(fù)雜的工作。構(gòu)建這樣的系統(tǒng)通常離不開在各個(gè)服務(wù)器系統(tǒng)與程序之間進(jìn)行接口轉(zhuǎn)發(fā)、數(shù)據(jù)傳輸及同步的工作。這類工作是典型的服務(wù)器程序員需要完成的任務(wù)。
1.3 數(shù)據(jù)庫程序員
數(shù)據(jù)庫程序員與客戶端程序員或服務(wù)器程序員不同,他們使用完全不同的程序設(shè)計(jì)語言和工具,編寫的程序給出的結(jié)果也截然不同。數(shù)據(jù)庫程序員通常是對終端用戶或應(yīng)用程序所使用或產(chǎn)生的數(shù)據(jù)進(jìn)行組織、存儲和提取工作。
這些年來,不同數(shù)據(jù)庫系統(tǒng)之間的差別逐年減少,數(shù)據(jù)庫程序員在一個(gè)數(shù)據(jù)庫系統(tǒng)中積累的“基本”技術(shù)技巧也更容易遷移到別的數(shù)據(jù)庫系統(tǒng)了。盡管像Hadoop這樣用于訪問TB級數(shù)據(jù)的“大數(shù)據(jù)”系統(tǒng)已經(jīng)涌現(xiàn)出來,但較常用的數(shù)據(jù)系統(tǒng)仍然是關(guān)系數(shù)據(jù)庫,包括Oracle、Microsoft SQL Server、IBM DB2、MySQL、Postgres和Berkeley DB。這些系統(tǒng)中的多數(shù)關(guān)鍵概念是相同的,它們都使用SQL語句(以及等價(jià)的API)來訪問數(shù)據(jù)。因此,有人可能會認(rèn)為,其中某個(gè)系統(tǒng)的大牛很可能也是另一個(gè)系統(tǒng)的大牛。但根據(jù)我們的觀察,除非是很基本的數(shù)據(jù)庫操作,否則在特定數(shù)據(jù)庫系統(tǒng)上的實(shí)戰(zhàn)經(jīng)驗(yàn)仍然是必需的。
數(shù)據(jù)庫程序員就像是汽車修理工。你可能會隨便找一個(gè)汽車修理工幫你換輪胎或者雨刮器;但是對于保時(shí)捷汽車上的重要問題,你一定不會讓一個(gè)完全不了解保時(shí)捷的修理工來做。數(shù)據(jù)庫程序員也是如此:我們可能會隨便找一個(gè)數(shù)據(jù)庫程序員撰寫報(bào)告來訪問Oracle數(shù)據(jù)庫中的數(shù)據(jù);但需要在數(shù)據(jù)庫系統(tǒng)(如Oracle、SQL Server)上進(jìn)行重要的開發(fā)時(shí),一定不會考慮實(shí)戰(zhàn)經(jīng)驗(yàn)不足的程序員。
1.4 Web開發(fā)人員及其他腳本編寫者
許多Web開發(fā)人員使用的開發(fā)工具完全不同于其他程序員,在大多數(shù)開發(fā)工作中,其他類型的程序員通常使用C、C++、C#、Java、Ruby等核心程序設(shè)計(jì)語言,Web開發(fā)人員通常使用格式化標(biāo)記語言(如HTML、XML、CSS、ASP/JSP)和腳本工具(如Perl、PHP、JavaScript)。Web開發(fā)人員的工作有時(shí)可以歸納為“剪切、粘貼和修改”(復(fù)制一些現(xiàn)成的代碼,進(jìn)行適當(dāng)?shù)男薷囊酝瓿刹煌娜蝿?wù))。他們也會使用更高層次的工具(如Flash、Dreamweaver或Cold Fusion)來簡化腳本編寫和部署過程。這就意味著只從事Web開發(fā)的程序員雖能夠從正規(guī)的計(jì)算機(jī)科學(xué)訓(xùn)練中受益,但又不像其他程序員那么依賴正規(guī)的計(jì)算機(jī)科學(xué)訓(xùn)練。
另一方面,更多的處理工作逐漸從服務(wù)器移至瀏覽器,通過JavaScript和基于AJAX的框構(gòu)來完成,這一變化也對Web開發(fā)產(chǎn)生了深遠(yuǎn)影響。瀏覽器兼容性問題是Web開發(fā)人員長期面臨的棘手問題。在客戶端引入更多的邏輯會加劇這些問題,要求Web開發(fā)人員引入更多的傳統(tǒng)程序設(shè)計(jì)原理,所引發(fā)的需求,要求Web程序員像客戶端程序員一樣技術(shù)高超。Web開發(fā)人員越來越需要學(xué)習(xí)客戶端程序設(shè)計(jì)及其所面臨的問題了。
前面描述的4種程序員類型是一般性的情況,一些技術(shù)高深的程序員實(shí)際上可以勝任所有這4種工作。但是,大多數(shù)程序員都只專精于其中一個(gè)領(lǐng)域,只有在編寫“適合自己”類型的代碼時(shí)才能獲得較大的產(chǎn)出。讓程序員加入風(fēng)格不合的項(xiàng)目往往只會引發(fā)災(zāi)難。程序員也許能夠勝任其他類型的工作,但大多數(shù)程序員對此沒什么興趣。而如果程序員對自己所從事的工作沒有興趣,那就遲早要出問題了。
2 程序員的類型
為了選擇合適的職員,我們還需要理解另一種看待程序員的方法。在上一節(jié)討論的幾種類型中,我們側(cè)重考慮了程序員所從事的工作的類型(即客戶端、服務(wù)器、數(shù)據(jù)庫、Web)。實(shí)際上,從技術(shù)知識、實(shí)踐經(jīng)驗(yàn)和程序員的專長角度去考慮也是很重要的,按這樣的思路可以把程序員分類為:
系統(tǒng)工程師/架構(gòu)師;
系統(tǒng)程序員;
應(yīng)用程序員;
非真正意義上的程序員。
2.1 系統(tǒng)工程師/架構(gòu)師
在所有開發(fā)類職員中,系統(tǒng)工程師/架構(gòu)師是更有技術(shù)和經(jīng)驗(yàn)的。要想理解所有相關(guān)的系統(tǒng)組件(操作系統(tǒng)、通信系統(tǒng)、數(shù)據(jù)庫、在線/離線訪問、安全性、硬件等)之間的復(fù)雜關(guān)系,需要對所有這些技術(shù)和系統(tǒng)都有豐富的專業(yè)知識和經(jīng)驗(yàn)。通常,在一個(gè)規(guī)模合理的團(tuán)隊(duì)中,只會有一兩個(gè)“真正的”系統(tǒng)工程師/架構(gòu)師。杰出的系統(tǒng)工程師/架構(gòu)師可以使團(tuán)隊(duì)中的其他人表現(xiàn)得更好。他們的系統(tǒng)工作起來會更可靠,通常看起來也更簡潔。
Gracenote就是由一個(gè)技術(shù)和經(jīng)驗(yàn)都很豐富的系統(tǒng)工程師/架構(gòu)師創(chuàng)立的,純粹由他完成的設(shè)計(jì)和實(shí)現(xiàn)創(chuàng)造出了一種令人難以置信的可靠、可擴(kuò)展而且靈活的服務(wù)。Google公司的聯(lián)合創(chuàng)始人Larry Page和Sergey Brin也是類似的系統(tǒng)工程師/ 架構(gòu)師,他們在設(shè)計(jì)和實(shí)現(xiàn)上培育的優(yōu)雅風(fēng)格幫助Google公司在技術(shù)和商業(yè)領(lǐng)域都取得了成功。
2.2 系統(tǒng)程序員
大多數(shù)系統(tǒng)工程師/架構(gòu)師都是從系統(tǒng)程序員做起的。系統(tǒng)程序員理解系統(tǒng)中所有組件的工作原理,包括客戶端和/或服務(wù)器端的操作系統(tǒng)和通信系統(tǒng)。Alan Kay在他的博士論文中引用了Bob Barton對其他程序員如何看待系統(tǒng)程序員的總結(jié):
系統(tǒng)程序員相當(dāng)于民間宗教中的大祭司。
——Bob Barton
系統(tǒng)程序員負(fù)責(zé)編寫與硬件交互的設(shè)備驅(qū)動程序,創(chuàng)建能夠?yàn)樵O(shè)備驅(qū)動程序和應(yīng)用程序執(zhí)行提供運(yùn)行時(shí)環(huán)境的操作系統(tǒng),為其他程序員創(chuàng)建編譯器和調(diào)試工具,通常還會為其他程序員提供工具和服務(wù)用于交付程序。
在過去,對社交能力正常的人來說,被稱為系統(tǒng)程序員幾乎可以說是一種侮辱。我們認(rèn)識許多系統(tǒng)程序員,他們的著裝和舉止如今已成為代表性的極客造型并流行開來。每當(dāng)我們想起自己認(rèn)識的那許多系統(tǒng)程序員,就會想到“我當(dāng)極客的時(shí)候,極客還不受歡迎”這句話(順便提一下,我們兩位也曾經(jīng)是系統(tǒng)程序員)。
2.3 應(yīng)用程序員
在專業(yè)程序員、學(xué)生以及自稱為程序員的業(yè)余愛好者中,絕大部分都屬于應(yīng)用程序員。應(yīng)用程序員開發(fā)的程序或其結(jié)果通常給終端用戶直接使用。應(yīng)用程序員開發(fā)的程序包括文字處理軟件、電子表格、日歷、Web瀏覽器、iTunes與Windows Media Player之類的媒體播放器、游戲等。應(yīng)用程序也可以由數(shù)據(jù)庫程序員開發(fā),以便對數(shù)據(jù)庫中取出或存入的數(shù)據(jù)執(zhí)行特定的操作。數(shù)據(jù)庫應(yīng)用程序包括財(cái)務(wù)軟件、機(jī)票預(yù)訂系統(tǒng)以及Oracle Financials之類的數(shù)據(jù)挖掘工具等。
一些應(yīng)用程序員能夠跳出代碼本身的束縛,與應(yīng)用程序的用戶產(chǎn)生同感,真正從用戶的角度看問題,從而很好地把握各種可視化、交互式的設(shè)計(jì)之間的細(xì)微差別。這樣的應(yīng)用程序員很適合從事用戶界面(UI)的開發(fā)。如果讓這樣一位有天分的應(yīng)用程序員與一名UI設(shè)計(jì)師(通常不僅有圖形設(shè)計(jì)背景,而且對人性甚至認(rèn)知心理學(xué)都有所研究)合作,將產(chǎn)生一加一遠(yuǎn)大于二的效果。
有一些項(xiàng)目(如MacOS的桌面UI——Mac Finder)側(cè)重于UI,要求整個(gè)團(tuán)隊(duì)都由這種有天分的應(yīng)用程序員組成。因此,Ron在蘋果公司領(lǐng)導(dǎo)Mac Finder團(tuán)隊(duì)時(shí),在尋找和面試候選人的過程中,特別看重程序設(shè)計(jì)技巧和用戶視角。他認(rèn)為:“只懂得程序設(shè)計(jì)技巧的程序員在那個(gè)團(tuán)隊(duì)中是無法取得成功的。”
2.4 非真正意義上的程序員
開發(fā)團(tuán)隊(duì)中有一些被稱為“程序員”的技術(shù)人員其實(shí)并不是真正意義上的程序員。他們當(dāng)中有些人使用圖形用戶接口(GUI)指定程序邏輯或商業(yè)邏輯,然后生成用戶可訪問的應(yīng)用程序;有些人則通過創(chuàng)建腳本或修改配置文件來定制顯示的內(nèi)容。這些“程序員”與真正的程序員之間的主要差別在于:他們使用現(xiàn)成的工具或應(yīng)用程序,而不是自己直接寫代碼。
這類“程序員”有其重要性和價(jià)值,但他們的技術(shù)深度通常不能與我們所討論的其他類型的程序員相提并論。隨著程序設(shè)計(jì)工具的出現(xiàn)和日益強(qiáng)大,像這樣的程序員正變得越來越多,但在本書中我們不會直接討論他們。
我們所介紹的許多程序設(shè)計(jì)技術(shù)也適用于這種另類的“程序員”。但根據(jù)我們的經(jīng)驗(yàn),他們中的多數(shù)人僅滿足于把自己的工作做好,而不像“真正的”程序員那樣渴求學(xué)習(xí)、動力十足。
3 領(lǐng)域知識
程序員在組織所處領(lǐng)域或行業(yè)的背景與知識也各不相同。
我們發(fā)現(xiàn)職位的分類、描述和需求中對經(jīng)驗(yàn)的要求是隨著經(jīng)濟(jì)狀況而變化的。經(jīng)濟(jì)狀況較好時(shí),組織需要具有寬廣領(lǐng)域知識的技術(shù)人員和技術(shù)經(jīng)理,希望他們能貢獻(xiàn)出創(chuàng)造性的思維、集體的智慧以及在其他領(lǐng)域已經(jīng)得到運(yùn)用的實(shí)踐。例如,Ron受雇從產(chǎn)品領(lǐng)域進(jìn)入金融服務(wù)IT行業(yè)時(shí),他的團(tuán)隊(duì)已經(jīng)有了豐富的交互計(jì)算經(jīng)驗(yàn)(Mac操作系統(tǒng))和娛樂產(chǎn)品(游戲與多媒體工具)。Web在1996年屬于新生事物,Schwab需要一個(gè)外部技術(shù)大神來領(lǐng)導(dǎo)其團(tuán)隊(duì)為投資者構(gòu)建具有高度交互性的Web工具。
而當(dāng)經(jīng)濟(jì)狀況不好時(shí),組織則會控制規(guī)模、縮減開支,只在核心領(lǐng)域功能方面進(jìn)行快速、有限的發(fā)展。企業(yè)在這一時(shí)期只能夠招聘很少數(shù)的新雇員,為了降低風(fēng)險(xiǎn),它們傾向于招聘在特定領(lǐng)域具有多年知識背景的專業(yè)人士。
不管經(jīng)濟(jì)狀況如何,每個(gè)團(tuán)隊(duì)都可以由具有程序設(shè)計(jì)天賦、領(lǐng)域知識、分析能力以及技術(shù)交流能力的人員混合構(gòu)成。其中領(lǐng)域知識在雇用程序員團(tuán)隊(duì)時(shí)是一個(gè)重要的考量因素。
4 程序員的工作要求與能力
要想成功地招聘和管理程序員,首先要認(rèn)識到每個(gè)程序員都有其自身的能力。就像雪花一樣,任何兩個(gè)程序員都不會是完全一樣的。我們常常會說,程序員之間寫代碼的能力可能相差一個(gè)數(shù)量級。這種差異是怎么出現(xiàn)的呢?教育、經(jīng)驗(yàn)、天賦以及直覺,還有其他無形的因素,都有可能導(dǎo)致這樣的差異。
多數(shù)程序員不需要借助顯式的排名或者頭銜,從直覺上就能理解同行之間的差異。但是如果能把程序員的類型與等級正式記錄下來,并簡要描述每種類型與等級的職位要求與能力,那么管理工作將會輕松很多,項(xiàng)目經(jīng)理將更容易找到各種任務(wù)和項(xiàng)目的較好人選,高級管理層也將能對組織及其構(gòu)成有更深刻的認(rèn)識。