|
英文原文:Software Development Lessons Learned from Poker
?。ㄗ髡撸篔ay Fields,譯者:李劍)
2008年5月19日
我以前不是做軟件開發(fā)的。在加入ThoughtWorks兩年之前,我主要靠玩撲克為生。當(dāng)然,如果你曾跟我打聽過我前臂上的紋身,那你肯定已然聽過我的故事了。要是還沒有,等下次我們一起喝一杯時(shí),我可以講給你聽。
我從未因?yàn)榛ㄟ@么長(zhǎng)時(shí)間玩牌而感到過遺憾,從中我學(xué)到了一些放之四海而皆準(zhǔn)的知識(shí)。開發(fā)軟件的時(shí)間愈久,我就愈加確信這二者之間具有令人難以置信的相似性。
學(xué)習(xí)
我學(xué)習(xí)打撲克和學(xué)習(xí)軟件開發(fā)的方式是一樣的:盡可能多讀書。我用兩年的時(shí)間,讀完了所能找到的每一本有關(guān)撲克的書。最后竟至39本之多。編程亦如是。此刻,我面前仍然擺著接下來要讀的5本書;而在過去三年ThoughtWorks的工作中,我翻爛的書亦不在少數(shù)。
我認(rèn)為,無論編程還是玩牌,閱讀書籍、博客與雜志都是要想有所成就的必備條件;而若要以二者為謀生之業(yè),僅靠讀書卻是遠(yuǎn)遠(yuǎn)不夠的。也許你可以把書本上的一切知識(shí)都裝入腦中,但知道在何時(shí)應(yīng)用何種規(guī)則,這才是真正高手的標(biāo)志。
誠然,開卷有益。但總要走過萬里路,方能對(duì)應(yīng)用特定技術(shù)的具體環(huán)境爛熟于心。書本不可能把所有情況都囊括一空,只有通過親身體會(huì)得來的經(jīng)驗(yàn),才能讓你在某些狀況下為自己或是雇主做出快速而正確的決策,而這些決策可能價(jià)值幾千乃至數(shù)百萬美元。
經(jīng)驗(yàn)之寶貴,世間無物可代。
藝術(shù)的巔峰
你可以設(shè)計(jì)出擊敗普通撲克玩家的計(jì)算機(jī)程序。遵守一些基本規(guī)則,自然就可獲勝。但迄今為止,還沒有任何程序可以擊敗最好的撲克玩家。因?yàn)閾淇思寄苓_(dá)到巔峰時(shí),也就成了一門藝術(shù)。軟件開發(fā)亦如是。要想成為一個(gè)還行的開發(fā)者,只要遵循一系列最佳實(shí)踐即可。如果按照經(jīng)典參考指南一類的書籍行事,開發(fā)出還不錯(cuò)的應(yīng)用程序應(yīng)該不成問題,而且效果會(huì)勝過其他最常見的做法。有了這么多失敗的項(xiàng)目作為前車之鑒,我相信,還不錯(cuò)的應(yīng)用就足以令大多數(shù)管理層甘心掏腰包了。
當(dāng)然,有些經(jīng)理有更高的標(biāo)準(zhǔn)。在銀行、創(chuàng)業(yè)公司、醫(yī)療系統(tǒng)等領(lǐng)域,標(biāo)準(zhǔn)則更為嚴(yán)苛。“還不錯(cuò)”自是遠(yuǎn)遠(yuǎn)不夠。那些經(jīng)理會(huì)很樂意為最佳選擇買單,他們期待的是遠(yuǎn)超常人的技能。但問題在于,專家級(jí)程序員的技能與普通程序員不同。普通程序員知道做事的方式;專家知道做事的目的。普通程序員會(huì)僵化跟隨模式書籍中的指示,就如遵守參考指南一般;專家則明白對(duì)模式的創(chuàng)新可能會(huì)帶來指數(shù)級(jí)的性能改善。
他們看到的絕非同一個(gè)世界,所以普通程序員很難跟專家對(duì)面交流。做藝術(shù)評(píng)論家易,做優(yōu)秀的藝術(shù)評(píng)論家難。
決策技能
在撲克和編程中有一條絕對(duì)真理:幾乎沒人能像他自我感覺的那么良好。有自知之明是不錯(cuò)的開始,但人們依然很難知道自己與專家之間的差距。程序員接觸專家的機(jī)會(huì)并不多,也就無法公正評(píng)判自己的技能。在牌桌上,每個(gè)人都是為了錦標(biāo)而來,可大多數(shù)人都會(huì)過高評(píng)價(jià)自己的牌技,這總是讓我驚訝不已。
程序員之間亦是如此,而且大多數(shù)人可以獲得的信息更少得可憐。一個(gè)從不參加任何大會(huì)的技術(shù)領(lǐng)導(dǎo)人,只能跟自己的團(tuán)隊(duì)成員一比高下。當(dāng)然,他可能已經(jīng)很優(yōu)秀了,否則也不會(huì)成為技術(shù)領(lǐng)導(dǎo)。但如果與整個(gè)行業(yè)中最出類拔萃的人相比,他又處于什么位置?如果覺得在自己的圈子里已經(jīng)一覽眾山小了,那碰到不同意見時(shí),他又會(huì)作何反應(yīng)?有些人會(huì)視之為學(xué)習(xí)的契機(jī)并為此感到興奮,但絕大多數(shù)都會(huì)對(duì)不同意見嗤之以鼻。
團(tuán)隊(duì)協(xié)作
乍看上去,撲克是一種彼此對(duì)抗的游戲。但事實(shí)很少如是。即使在賭注最小的牌桌上,通常也至少會(huì)有幾個(gè)人常打交道。他們不會(huì)達(dá)成條件一致對(duì)付牌桌上的其他人——他們也不必如此。大家都明白一條道理:你不是要去跟牌玩得好的人對(duì)著干,贏他們的錢,而是要從水平低的人身上賺錢。專業(yè)牌手甚至?xí)褚粋€(gè)團(tuán)隊(duì)一樣協(xié)同工作。有些人彼此利益相關(guān),故而一人得利則眾人均有收益。他們不僅互相了解,而且認(rèn)識(shí)很多人。如果出現(xiàn)一局精彩牌局,樓層經(jīng)理會(huì)跟他們打招呼;侍者會(huì)為他們的對(duì)手調(diào)制酒精度高的飲品;和手(即發(fā)牌者)會(huì)故意“犯錯(cuò)”以影響某人心情(很少有人在心情不好的時(shí)候能夠打好牌)。每個(gè)人都在協(xié)同工作,確保大家都能掙到錢。
頗為有趣的是,程序員的情況也與之相似。很多人都坐在格子里,完全依賴自己解決問題。他們往往工作在代碼個(gè)人獨(dú)有制模式之下。我曾親眼目睹,在這種程序員交付的應(yīng)用中,集成問題一直都是大家的心病。而更為不幸的是,集成之痛還只是最小的問題。假設(shè)IT部門把業(yè)務(wù)需求鎖定為500頁的需求文檔。如果公司決定改變業(yè)務(wù)方向,隨之而來的系統(tǒng)變更需求將令人痛不欲生。數(shù)以百萬計(jì)的金錢付諸東流,因?yàn)槌绦騿T開發(fā)的特性已不再具備業(yè)務(wù)價(jià)值,而IT部門還沒有找到更好的方式來應(yīng)對(duì)業(yè)務(wù)變化。
當(dāng)然,情況并非總是如此。專家懂得協(xié)作。他們會(huì)跟其他專家協(xié)作,但也不排斥與經(jīng)理、客戶、業(yè)務(wù)部門、分析師、質(zhì)保人員,以及所有可以為成功貢獻(xiàn)力量的人協(xié)作。他們胸懷大局:只有協(xié)作,才能讓每個(gè)人有所收獲。
度量
雄心勃勃的牌手常常討論他們贏了多少手牌,又輸了多少手。他們討論最多的還是本該贏但卻輸?shù)舻哪菐资峙?。有時(shí)人們會(huì)犯錯(cuò)誤輸錢,但他們一般都不會(huì)記得這幾手是怎么輸?shù)舻?。相反的是,如果有些牌局只是因?yàn)槭謿獠缓枚數(shù)?,他們就?huì)記得那一局中的每一處細(xì)節(jié),他們還會(huì)在故事中透露對(duì)手必然獲勝的幾率,來證明自己根本沒有勝出的機(jī)會(huì)。真正的牌手知道他們輸?shù)暨^多少手牌,以及失敗的大概幾率。他們懂得度量。而且專業(yè)牌手會(huì)專注于重要的度量標(biāo)準(zhǔn)。你贏了多少手,輸了多少手,這無關(guān)緊要;重要的是你贏了多少錢,輸了多少錢。而且,為你的狗屎運(yùn)(譯者注:bad beat,即開局時(shí)輸家比贏家牌好,贏的幾率更大,但關(guān)鍵時(shí)刻贏家卻來了更好的牌。碰到狗屎運(yùn)——take a bad beat——用來形容輸家,來了狗屎運(yùn)——lay a bad beat——用來形容贏家)苦惱實(shí)際上等于替你對(duì)手的牌運(yùn)犯愁。既然你的收入來自于對(duì)手的錯(cuò)誤,那你就是在抱怨為什么對(duì)手把錢給了你。
有度量標(biāo)準(zhǔn)是好事,不過專業(yè)人士懂得哪些標(biāo)準(zhǔn)重要,哪些只會(huì)分散注意力,哪些介于二者之間。
軟件開發(fā)也有很多度量標(biāo)準(zhǔn),而且有很多標(biāo)準(zhǔn)身上的光環(huán)已經(jīng)遠(yuǎn)遠(yuǎn)超出了它們所應(yīng)有的范圍。例如,知道代碼行數(shù)幾乎不能帶來任何價(jià)值。復(fù)雜應(yīng)用需要相當(dāng)多的代碼,但這個(gè)“相當(dāng)”到底是多少?它得依賴于語言、工具及其他因素。
修復(fù)的bug數(shù)量也是個(gè)很有趣的話題,只是略遜于前一個(gè)。為什么人們會(huì)在乎修復(fù)了多少個(gè)bug?Bug數(shù)量也許有其價(jià)值,但是修復(fù)的bug數(shù)目并不能為我們帶來多少有用信息。
特性完成率是我自己最喜歡把玩的一個(gè)標(biāo)準(zhǔn)。除非我們使用特性來評(píng)估工作量,否則知道完成了多少特性又有何用?而且,如果已經(jīng)對(duì)工作量做出了評(píng)估,那為什么不把剩余工作與已完成工作相比較,從而得到工作進(jìn)度呢?我很難從特性完成率中看到價(jià)值所在。
代碼覆蓋率讓我想起了記錄狗屎運(yùn)。這項(xiàng)度量是有意義的,但很多人都沒抓住重點(diǎn)。代碼覆蓋率低意味著可能有問題存在,但是代碼覆蓋率高只能表示你有一個(gè)很大的代碼覆蓋率數(shù)值。高代碼覆蓋率與高質(zhì)量之間沒有必然聯(lián)系。
注意人,而不是邏輯
如果看過有玩牌鏡頭出現(xiàn)的電影,你大概聽過這樣一句話:你不是在與撲克玩,而是與人玩。此言極是。牌手無疑都是心理學(xué)家。有時(shí)你確實(shí)需要某些牌,但拿一手好牌只是賺錢的一部分而已。一旦有了好牌,你就需要知道怎樣利用好它們。你是應(yīng)該加注,還是先讓牌然后加注,還是徹底讓牌,還是跟進(jìn)?這些做法依賴于很多因素,但關(guān)鍵還是要了解牌桌上的對(duì)手。當(dāng)你得到一手好牌,首要目標(biāo)就是盡可能多地從對(duì)手那里贏錢,而達(dá)到這種目的的唯一方式則是想辦法讓對(duì)手給你更多的錢。了解邏輯可以幫助你贏得幾手牌,了解人則可以幫助你贏錢。
在交付軟件時(shí),人處于同樣重要的地位。如果軟件只是讓一切工作起來,那只要把它變成自動(dòng)化的工作,事情就容易得多了。但軟件卻遠(yuǎn)非功能組合這么簡(jiǎn)單。在一場(chǎng)高爾夫球比賽中,人們會(huì)賣出軟件包;在全家到迪斯尼免費(fèi)旅游時(shí),人們會(huì)簽下軟件服務(wù)合同;為了避免法律糾紛,人們會(huì)履行合同去構(gòu)建已經(jīng)毫無用處的軟件;為了超越競(jìng)爭(zhēng)對(duì)手,人們會(huì)使用軟件來加快業(yè)務(wù)響應(yīng)速度。
人們使用軟件、開發(fā)軟件、維護(hù)軟件,或是在某種程度上依賴軟件。軟件開發(fā)與這個(gè)世界有著千絲萬縷的聯(lián)系,要把洋洋灑灑的變量組合成簡(jiǎn)單方程,生產(chǎn)出高質(zhì)量的軟件,又與登天何異?但是,軟件開發(fā)高手需要考慮每個(gè)人引入的所有已知與未知的變量,做出他們力所能及的推測(cè)。知道應(yīng)該做什么會(huì)讓你受益,而知道必須做什么所帶來的價(jià)值卻是難以衡量。了解邏輯可以幫助你交付應(yīng)用,了解人則可以幫助你交付價(jià)值。
在殘缺的信息下工作
有關(guān)這點(diǎn),剛開始打牌的人處理的非常好:打好每一手牌,老老實(shí)實(shí)押注,從不虛張聲勢(shì)。這便是了,新手就應(yīng)該只做該做的事情,除非你的錢多得沒地方花了。難點(diǎn)在于如何從初學(xué)者的水平提升。大量信息霎那間紛至沓來,你需要注意牌桌上每個(gè)人的每一處細(xì)節(jié):他們?cè)鯓咏涣鳎銖那案麄兠總€(gè)人打過什么交道,他們所鐘愛的玩牌方式,誰在贏,誰在輸,凡此種種不一而足。而且,你也不可能知道對(duì)手手里的牌是什么,下一張牌又是什么。你所擁有的信息已超出所能處理的極限,而且這遠(yuǎn)非全部。
編程亦如是。領(lǐng)域?qū)<覠o所不知,但把一切都向你傾囊相授卻毫無意義。何況,你也不一定需要所有的領(lǐng)域知識(shí)。你需要熟悉團(tuán)隊(duì),但同事總有些事情是你永遠(yuǎn)無法知曉,或者不能完全理解的。不過,編程高手能夠把必要的領(lǐng)域知識(shí)融會(huì)貫通,掌握?qǐng)F(tuán)隊(duì)的動(dòng)態(tài),并始終提供技術(shù)上的真知灼見。他們知道他們永遠(yuǎn)無法成為百曉生,他們知道什么事情值得思考,哪些應(yīng)該置之不理。縱使面前洶涌澎湃的信息仍是殘缺不全,他們也總能做出正確的決定。
即時(shí)反饋
普通牌手在反饋信息少的游戲中表現(xiàn)最好。因?yàn)榕剖质歉鶕?jù)信息而贏錢的。在5張牌梭哈中只有一輪押注的機(jī)會(huì)。各位玩家只有一次機(jī)會(huì)來分析你給出的信息,而你也只有一次機(jī)會(huì)犯錯(cuò)。專家級(jí)牌手更喜歡多輪的游戲。游戲中的回合數(shù)越多,他們就有越多機(jī)會(huì)從低水平的對(duì)手身上撈到好處。他們喜歡即時(shí)反饋,并根據(jù)反饋?zhàn)龀稣{(diào)整。在有多個(gè)回合的游戲中,每一個(gè)回合都可以得到反饋,專業(yè)玩家就會(huì)根據(jù)當(dāng)前局勢(shì)調(diào)整打法。
編程高手同樣喜歡即時(shí)反饋。從業(yè)務(wù)人員即時(shí)反饋回來的信息,可以避免你在構(gòu)建業(yè)務(wù)應(yīng)用時(shí)走上彎路。從另一個(gè)程序員即時(shí)反饋回來的信息,可以在軟件產(chǎn)品化之前發(fā)現(xiàn)bug。持續(xù)集成服務(wù)器可以提供即時(shí)的集成反饋,從而避免集成之痛。喜歡敏捷的人能馬上說出迭代是一個(gè)有著顯著成效的實(shí)踐,因?yàn)樗梢宰尦绦騿T和業(yè)務(wù)人員得到即時(shí)反饋。不過,作為一個(gè)編程高手,縱使他不喜歡敏捷,他也能夠意識(shí)到即時(shí)反饋的價(jià)值;即使在非敏捷的環(huán)境中,他也會(huì)爭(zhēng)取得到更多的反饋,從而避免浪費(fèi)時(shí)間精力。即時(shí)反饋可以讓你了解前行的方向正確與否,每一個(gè)專家都會(huì)珍視這些信息。
上下文為王
無論撲克還是編程,沒有絕對(duì)正確或是絕對(duì)錯(cuò)誤的選擇。如果你有一對(duì)K,那么在翻牌之前你該不跟么?也許吧。這要看你是在打比賽還是賭錢、有上限還是沒上限、你坐在哪個(gè)位置上、你是否已經(jīng)不跟過一次還是已經(jīng)封頂了等等。我在撲克中學(xué)到了一點(diǎn),那就是在給出答案之前,一定要綜合考慮所有的因素。
在編程中沉浸的時(shí)間愈久,同樣的體會(huì)在我心里就愈加深刻。Java在有些時(shí)候是不錯(cuò)的選擇,但它并非萬能。所有的編程語言均如此。工具亦然。Hibernate很不錯(cuò),但它不適用的地方還有IBatis,當(dāng)IBatis也不適用的地方還會(huì)出現(xiàn)或自己創(chuàng)造新的解決方案。幾乎沒有一款解決方案能夠絕對(duì)有效,它只有在恰當(dāng)?shù)男蝿?shì)下才會(huì)發(fā)揮應(yīng)有的作用。在錯(cuò)誤的環(huán)境中,它也許會(huì)成為毒藥。
所以,面對(duì)一門新的語言或者工具,無論是你是打算棄若敝履,或是愛不釋手推而廣之,不妨先想想它的適用環(huán)境,盡量做到對(duì)癥下藥,量體裁衣。
it知識(shí)庫:從玩撲克到軟件開發(fā),轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。