引入新編程語(yǔ)言的經(jīng)驗(yàn)教訓(xùn)
引言:這些年我(在工作中)使用過(guò)很多編程語(yǔ)言:(馬上能夠想到的有)Cold Fusion、HTML、Javascript、php、 SQL、 CSS,、ASP(經(jīng)典ASP和.net)、C#、Ruby、Flex、Java以及Clojure。每個(gè)語(yǔ)言都有自身的優(yōu)缺點(diǎn)。作為一名程序員,你可以很容易地指出這些缺點(diǎn)——概括起來(lái)就是一句話(huà):
我痛恨所有的編程語(yǔ)言—— Matt Foemmel
我認(rèn)為一開(kāi)始就考慮到這個(gè)問(wèn)題很重要。在某些時(shí)候,你會(huì)對(duì)現(xiàn)在提倡的東西開(kāi)始厭惡,所以請(qǐng)想象一下別人對(duì)它的感受。
在2008年,我在DRW的一個(gè)代碼庫(kù)中引入Clojure語(yǔ)言。這篇博客討論了過(guò)去幾年中,我在引入新語(yǔ)言的過(guò)程中得到的經(jīng)驗(yàn)和教訓(xùn)。
選擇語(yǔ)言
在組織里引入一門(mén)新的語(yǔ)言并非易事。如果你想要成功,你需要選擇一門(mén)編程語(yǔ)言,它不但能夠滿(mǎn)足廣泛的技術(shù)要求同時(shí)還要得到大家的認(rèn)可。在加入DRW 的時(shí)候,我100%用Java編程,盡管事實(shí)上我編寫(xiě)的大部分代碼只需要在眨眼之間運(yùn)行完成(250毫秒)。我們編寫(xiě)代碼要求運(yùn)行時(shí)間比眨眼還要短,Java是絕對(duì)正確的選擇,但使用Java編寫(xiě)其他代碼讓我感覺(jué)Java成為了一種負(fù)擔(dān)。
偶爾我會(huì)抱怨這種負(fù)擔(dān),我的老板開(kāi)始對(duì)JRuby發(fā)生了興趣。我認(rèn)為選擇JRuby對(duì)我們已經(jīng)是一個(gè)勝利,但就我個(gè)人而言更想聽(tīng)到支持非Java語(yǔ)言的呼聲。如果考慮JRuby,那么我認(rèn)為任何高級(jí)的動(dòng)態(tài)類(lèi)型語(yǔ)言都可以勝任。
然而,在我對(duì)JRuby生成好奇心之前,我已經(jīng)開(kāi)始學(xué)習(xí)Haskell了??偟恼f(shuō)來(lái),在貿(mào)易公司使用的軟件要求運(yùn)行“快速”。如果我要成功地引入一門(mén)新語(yǔ)言,它必須運(yùn)行得“幾乎和Java一樣快”。Haskell執(zhí)行速度很快我已有所耳聞,它同時(shí)也滿(mǎn)足了我的另一個(gè)選擇條件:
一門(mén)編程語(yǔ)言,如果不能對(duì)你思考編程的方式產(chǎn)生影響,就不值得去學(xué)習(xí)。—— Alan Perlis
我認(rèn)為,如果我發(fā)現(xiàn)一門(mén)編程語(yǔ)言“性能足夠好”,發(fā)布程序速度更快,并且能夠提高我們的編程水平,那么在它上面花時(shí)間就是值得的。
我玩過(guò)一點(diǎn)Haskell,但是學(xué)習(xí)曲線(xiàn)似乎太陡峭。學(xué)習(xí)Haskell需要一些時(shí)間,但更重要的是:我們的產(chǎn)品已經(jīng)運(yùn)行在JVM上。如果我需要得到任何幫助,應(yīng)該能夠輕易地融入現(xiàn)有的基礎(chǔ)設(shè)施。想想Clojure,它的性能足夠好,比Java更簡(jiǎn)潔,并且比我之前用過(guò)的其他語(yǔ)言更加有效。 Clojure同時(shí)也是動(dòng)態(tài)類(lèi)型的高級(jí)語(yǔ)言(像Ruby一樣),所以我希望能夠得到老板的支持。
讓同事們盡可能地減少學(xué)習(xí)的痛苦是一個(gè)很大的要求——我認(rèn)為這是接受新語(yǔ)言的關(guān)鍵。Clojure看上去是最佳的選擇,因?yàn)槲覀儸F(xiàn)在已經(jīng)在工作中已經(jīng)使用下列工具:
- 整天使用IntelliJ
- 使用JUnit運(yùn)行所有測(cè)試
- 使用TeamCity創(chuàng)建CI和artifact
- 在服務(wù)器上運(yùn)行JVM
- 使用Yourkit進(jìn)行動(dòng)態(tài)分析
Clojure能夠滿(mǎn)足我的所有條件,其他同事接受起來(lái)也會(huì)更容易。
作為學(xué)習(xí),我更推薦Haskell或者OCaml,但他們并不適合在實(shí)際中選用——我懷疑是否能夠成功地將他們應(yīng)用到開(kāi)發(fā)中。當(dāng)我需要在 Clojure方面給與專(zhuān)業(yè)指導(dǎo)時(shí),我會(huì)依賴(lài)其他人認(rèn)可的“最佳”JVM服務(wù)器設(shè)置。如果一旦選擇了Haskell或者OCaml,我將需要在更多方面成為專(zhuān)家(例如部署、內(nèi)存模型、函數(shù)庫(kù)、新開(kāi)發(fā)工具等等)。
不論是當(dāng)時(shí)還是現(xiàn)在,我都認(rèn)為Clojure是在技術(shù)要求和公司環(huán)境下的最佳選擇。
Hello World
引入一門(mén)新的語(yǔ)言是一個(gè)微妙的行為。你需要兼顧很多的相關(guān)內(nèi)容。我不確定同事們會(huì)對(duì)使用Clojure作何反應(yīng),所以我在家里預(yù)先寫(xiě)好了代碼。雖然大家都需要集成測(cè)試,然而沒(méi)有人積極行動(dòng)。于是我開(kāi)始用Java編寫(xiě)集成測(cè)試,然后寫(xiě)出了Clojure的版本。我非常了解Clojure并能夠向其他人展示它的簡(jiǎn)潔——這是團(tuán)隊(duì)在集成測(cè)試中最看重的東西。除此之外,因?yàn)闇y(cè)試并不是實(shí)際產(chǎn)品運(yùn)行的代碼,因而并不真正需要考慮實(shí)際執(zhí)行速度。
集成測(cè)試是一個(gè)引入新語(yǔ)言的好地方,其實(shí)任何非產(chǎn)品代碼都是好的選擇。例如,你也可以選擇數(shù)據(jù)庫(kù)遷移腳本、日志文件解析器、第三方軟件模擬器或者軟件部署。只要你的選擇不會(huì)馬上帶來(lái)痛苦,你應(yīng)該能夠很容易地從任何遷移到新語(yǔ)言的失敗中恢復(fù)過(guò)來(lái)。
當(dāng)我完成了Java和Clojure版本的測(cè)試以后,我給開(kāi)發(fā)組里的其他人展示了這兩個(gè)版本。我告訴他們?yōu)槭裁次彝扑]Clojure版本,并詢(xún)問(wèn)他們能不能用Clojure做一次嘗試。我也做出承諾,讓他們很難拒絕做這樣的實(shí)驗(yàn)。
你的使命
為了讓我的伙伴們減少接受新語(yǔ)言的恐懼,我做出了下列承諾:
- 如果你想要編寫(xiě)代碼,我會(huì)和你一起做(假如你想要和我一起工作的話(huà))
- 如果你不想編寫(xiě)代碼,我會(huì)將缺失的部分補(bǔ)上
- 如果你覺(jué)得用新語(yǔ)言寫(xiě)代碼讓你難以接受,我會(huì)在我的個(gè)人時(shí)間將所有的內(nèi)容重新用Java寫(xiě)一遍
很明顯地,你需要在使用新語(yǔ)言編寫(xiě)很多代碼之前讓團(tuán)隊(duì)接納——否則你會(huì)獨(dú)自一個(gè)人在晚上和周末加班。
工具支持
運(yùn)氣好的話(huà),你的團(tuán)隊(duì)已經(jīng)有了一套他們喜歡的工具。不論工具是什么,你的新語(yǔ)言應(yīng)該能夠很好地被支持。對(duì)我而言,這就意味著在IntelliJ上 Clojure應(yīng)該像Java一樣被執(zhí)行。很大程度上La Clojure插件完成了這項(xiàng)重任;然而,我需要編寫(xiě)一個(gè)而是框架讓我能夠運(yùn)行指定的測(cè)試并且無(wú)縫地將現(xiàn)有JUnit測(cè)試集合集成進(jìn)去。這里要說(shuō)的是,請(qǐng)為團(tuán)隊(duì)成員消除所有新語(yǔ)言可能帶來(lái)的阻力。學(xué)習(xí)一門(mén)新語(yǔ)言的要求是合理的,但僅僅為了適應(yīng)一個(gè)(在那個(gè)團(tuán)隊(duì)里)未經(jīng)實(shí)際驗(yàn)證過(guò)的語(yǔ)言而改變團(tuán)隊(duì)的工作,這也許是一個(gè)過(guò)分的要求。
你也可能需要作出一些犧牲。我喜歡在emacs中編寫(xiě)Clojure;然而我寧愿在IntelliJ中編寫(xiě)Clojure而不是Java。在轉(zhuǎn)向新語(yǔ)言剛開(kāi)始的脆弱時(shí)期,你會(huì)是需要作出妥協(xié)最多的人。
尋找同盟軍
對(duì)新語(yǔ)言熱愛(ài)程度的不同會(huì)讓事情的發(fā)展也有所不同。當(dāng)別人開(kāi)始感興趣的時(shí)候,你應(yīng)當(dāng)盡己所能地鼓勵(lì)他們。然而,不要強(qiáng)迫別做事情——這是最容易樹(shù)敵的辦法。希望你能找到一些和你一樣對(duì)新語(yǔ)言感興趣的伙伴——與他們一起緊密工作并提高你的水平。你需要尋找更多的支持者,否則你會(huì)成為團(tuán)隊(duì)中唯一強(qiáng)迫別人做他們不喜歡事情的人。
你不可避免地需要做一些調(diào)研,需要相關(guān)工具的支持,而且需要處理比開(kāi)始預(yù)期更多的問(wèn)題。當(dāng)你發(fā)現(xiàn)自己捉襟見(jiàn)肘的時(shí)候,會(huì)需要其他人來(lái)助你一臂之力。即使一切運(yùn)轉(zhuǎn)正常,你也會(huì)發(fā)現(xiàn)需要一些支持者來(lái)幫助你維護(hù)日益增多的新語(yǔ)言代碼。
最后,最糟糕的情況是當(dāng)你離開(kāi)團(tuán)隊(duì)時(shí)沒(méi)有一個(gè)留下的人愿意維護(hù)這些代碼。當(dāng)人員發(fā)生調(diào)整時(shí),采納新語(yǔ)言會(huì)很容易成為大問(wèn)題。
了解所有事情
很明顯地你不可能確切地了解所有的事情,但當(dāng)問(wèn)題出現(xiàn)時(shí)你需要能夠馬上給出或想出一個(gè)答案。在將新語(yǔ)言放進(jìn)如何代碼庫(kù)之前,你一定要通讀幾本新語(yǔ)言的書(shū),因?yàn)榇a庫(kù)是你的同事賴(lài)以工作的基礎(chǔ)。這樣還不夠,你還要知道如果遇到問(wèn)題你能夠去哪里尋求幫助。對(duì)于Clojure,得到問(wèn)題回復(fù)方式就是 IRC,如果問(wèn)題不是很緊急或者需要詳細(xì)描述你的問(wèn)題,你可以通過(guò)郵件列表來(lái)尋求答案。如果你真的想要掩蓋自己的不足,你需要和語(yǔ)言的作者或者社區(qū)的領(lǐng)袖人物建立某種關(guān)系。
一旦人們接受了你介紹的新語(yǔ)言,他們會(huì)開(kāi)始做一些你意想不到的事情。你需要了解語(yǔ)言的缺點(diǎn),并想到可能因此帶來(lái)的后果。你還需要成為一名專(zhuān)家,通曉?xún)?nèi)存分配、性能、部署、工具集成、函數(shù)庫(kù)支持、升級(jí)計(jì)劃以及除了語(yǔ)言文法之外的所有問(wèn)題。
你的支持者越多,需要“知道所有事情”的情形就越少。然而,在每天完成工作以后,你還是應(yīng)當(dāng)盡可能地去了解相關(guān)的技術(shù)。如果出現(xiàn)問(wèn)題,所有人都會(huì)認(rèn)為這是你的錯(cuò)。這就是引入新語(yǔ)言應(yīng)當(dāng)承擔(dān)的責(zé)任,所以你應(yīng)當(dāng)更好地理解你正在做什么。
獲得幫助
如果你的公司愿意讓你引入新的語(yǔ)言,那它一定愿意提供支持。有可能你已經(jīng)得到了一些培訓(xùn)預(yù)算??纯从袥](méi)有機(jī)會(huì)能夠讓語(yǔ)言作者或者社區(qū)領(lǐng)袖和你一起工作,或是提供相關(guān)的培訓(xùn)。如果你在新語(yǔ)言的各個(gè)方面都有問(wèn)題,那么讓語(yǔ)言的作者和你一起工作會(huì)帶來(lái)巨大的好處。當(dāng)然一切進(jìn)展順利的時(shí)候,如果團(tuán)隊(duì)中其他對(duì)新語(yǔ)言感興趣的同事能夠從語(yǔ)言作者(或者某個(gè)社區(qū)領(lǐng)袖)那里學(xué)習(xí),那么將預(yù)算投給這樣的培訓(xùn)會(huì)給你帶來(lái)巨大的好處。無(wú)論是你自己或是感興趣的支持者,利用公司的培訓(xùn)預(yù)算來(lái)推廣新語(yǔ)言都是有益的事情。
成為擁護(hù)者而不是狂熱分子
每天結(jié)束工作的時(shí)候,并非每個(gè)人都能會(huì)妥協(xié)。這沒(méi)有關(guān)系。不要將自己的觀點(diǎn)強(qiáng)加給對(duì)此沒(méi)有興趣的人。最有可能的情況是,總會(huì)有人對(duì)“正確”選擇充滿(mǎn)熱情。也許你對(duì)自己推薦的語(yǔ)言報(bào)以熱情,但你的隊(duì)友可能非常喜歡之前的語(yǔ)言。你們不必為此分出誰(shuí)對(duì)誰(shuí)錯(cuò)。人們只會(huì)用自己喜歡的語(yǔ)言編程,任何試圖讓他們嘗試別的方式都會(huì)弊大于利。喜歡用新語(yǔ)言的人們會(huì)聚集在一起,而不喜歡的人也會(huì)如此。沒(méi)有任何理由強(qiáng)迫別人接受。
起初我對(duì)這個(gè)問(wèn)題的看法是“如果我提出一個(gè)好的辦法,那么所有人都會(huì)接受它。”事實(shí)并非如此,所以我寫(xiě)了一篇軟件開(kāi)發(fā)中的妥協(xié)。我了解到一個(gè)人眼中“更好的辦法”在另一個(gè)人看來(lái)卻是“更糟糕的選擇”。最后,團(tuán)隊(duì)分成了用Clojure編程和不用Clojure兩個(gè)小組。這對(duì)兩方都有好處,想要用Clojure的人會(huì)有更好的環(huán)境,而其他人也不用強(qiáng)迫使用Clojure.
這種劃分當(dāng)然只是私下的,在公司里我們?nèi)匀皇?ldquo;一個(gè)團(tuán)隊(duì)”。但我們開(kāi)發(fā)不同的應(yīng)用程序,通過(guò)發(fā)消息交流或者不溝通。我強(qiáng)烈建議一個(gè)小組按照不同的想法和規(guī)模分開(kāi)(7個(gè)人的團(tuán)隊(duì),我認(rèn)為分成4人和3人兩個(gè)小組是可以接受的),但永遠(yuǎn)不要在公司里公開(kāi)。逐漸的,其他因素會(huì)讓團(tuán)隊(duì)規(guī)模縮小,這種劃分會(huì)變得多此一舉。如果團(tuán)隊(duì)沒(méi)有因?yàn)槠渌蛑亟M,我仍然堅(jiān)信組內(nèi)劃分是最好的選擇。
尾聲
引入一門(mén)新語(yǔ)言對(duì)于任何上規(guī)模的組織都是一件需要多年才能完成的事情。自打引入新語(yǔ)言開(kāi)始,你的責(zé)任就永遠(yuǎn)不會(huì)“結(jié)束”。反過(guò)來(lái)說(shuō),你已經(jīng)開(kāi)始使用適合這項(xiàng)工作最好的工具。希望所有說(shuō)過(guò)和做過(guò)的事情都是值得的。就自己而言,我對(duì)自己的選擇感到高興,但我也期待未來(lái)的幾年里在“引入新語(yǔ)言”這個(gè)話(huà)題上能有更多的收獲。
英文原文:jaycfields
原文鏈接:http://blog.jobbole.com/13401/
【編輯推薦】