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