Saturday, March 7, 2009

牛仔程式員

牛仔程式員

在上一回中,我們提到了所謂的「英雄程式員」。英雄程式員是軟體開發團隊中擔負起救世主角色的程式員,這樣的程式員的特質便是他會試著一肩扛起整個開發的重責大任與成敗,即使燃燒自己也毫無怨言。除了英雄程式員之外,還有一類的程式員同樣是我們在軟體開發中,時常會遭遇到,而且特色相當鮮明的,這一類的程式員就是「牛仔程式員(cowboy programmer)」。



我們大多數人從西部電影中獲得對「牛仔」的典型印象
- 獨來獨往、視法律如無物、衝勁十足、速度飛快。軟體開發領域裡的「牛仔程式員」差不多就是這樣。撰寫程式時,牛仔程式員最重視完成的速度,他會竭盡所能的抄小路、走捷徑,即使只是一時取巧的方法,只要能縮短完成的時間,牛仔程式員的心裡,放不進其他的考量。牛仔程式員不會關心這樣的程式別人是否能夠輕易的讀懂,也不會深謀遠慮到在意日後這樣的程式是否好維護、容易擴充,只要在當下能夠達成目的就成了。



牛仔程式員喜歡獨來獨往、單打獨鬥,不喜與他人打交道,更不喜歡結群成隊,他不容易融入團體開發,喜歡單憑自己的力量解決問題。當然,他更不會受開發程序所限制、也不會遵守「別人訂下」的開發規範、命名慣例,他有他自己的一套,自成一格的開發方法。牛仔程式員熱愛冒險、有衝勁、喜歡嘗試新鮮的事物,一旦設定了目標,便不顧一切的往前直奔,直到解決問題為止。



大多的牛仔程式員某種程度都能稱的上高手,而且對程式設計充滿熱情。



雖然牛仔程式員能解決問題,但解決問題的方法有時充滿太多的黑技(hacks),只能取巧於一時。一旦要在這薄弱不甚堅固的基礎上繼續發展,便會像是在危樓上再加蓋,整個系統搖搖欲墜。這些黑技有時艱深難解,不僅他人有時難以明白,日子久了,連原作者牛仔可能都回憶不起來。



雖然牛仔程式員解決問題的速度很快,但是因為寫死(hardcode)太多應用時的條件,使得解決方案不易被擴充成為通用性的方案,只能適用於十分狹窄的問題情境。也因為一心追求完成的速度,更使得牛仔程式員時常不做設計,拿到問題立即埋頭苦幹,直接開始撰寫程式碼。



牛仔程式員獨來獨往、喜做化外之民的性格,使得他不易被管理。牛仔程式員通常有他自己的時程表版本,而不會受到別人對時程規劃的影響。他當然也不會理會開發方法論、開發程序、程式碼版本控制,他覺得那樣實在太受拘束了,他有他自己的一套。牛仔程式員也不喜歡和其他人溝通,因為那樣實在太麻煩、太浪費時間了。自由不受拘束是牛仔程式員重要的信仰價值之一。



牛仔程式員有自己獨立的價值判斷,他多半能做出你需要的東西,但是作法可能會大大的出乎你意料之外。有些牛仔程式員會覺得自己所採用的方法是最理想的方法,自己寫下的程式碼是最為優雅、最具自我說明力的。倘若別人不能讀懂他所寫下的程式碼,代表別人的能力不足,不能理解如此美好的事物,因而不具備和他共事的資格。



具有上述特質的程式員,偶而會在我們的開發生活中出現。說實在的,大多數人在初學程式設計時,多半都具有牛仔程式員的特質,因為未經太多的團體開發經驗及訓練。隨著團體開發的經驗日漸增加,牛仔程式員的特質也就日漸減弱。但是,仍有一些個人性格突出且鮮明的程式員,並不會因此而改變,他還是他自己,而這也正是牛仔的精神特徵之一。



很明顯的,牛仔程式員會是團體開發裡的一大難題。對於牛仔程式員來說,其實他不需要其他人,他也會盡可能的避掉和別人相介接的機會。團體和個人,對他來說並沒有太大的分別,他最喜歡的還是單兵作戰,團隊對他而言形同跘腳之石。對團隊來說,牛仔程式員難以管理。你無法預期指派給他一份工作,究竟何時能夠完成、會以什麼方式完成。而牛仔程式員的產出,也都具備它獨有的型式,和團隊所訂定的規範不盡相同,也不易為其他成員所使用、修改、以及擴充,甚至只能暫時的解決問題。



現代的軟體開發,幾乎不可避免的都是以團隊的形式進行。這並不代表非得要團隊才能開發出卓越的軟體,而是代表著一種從手工業邁向工業的型態轉移。牛仔程式員也能開發出好軟體,但牛仔程式員的個人戰力,通常勝不過集結成軍的開發團隊。面對軟體需求的快速變化,只注重眼前,而不預見未來的牛仔式程式設計風格,更讓牛仔們不容易輕易的針對變化做出因應。



如果程式設計是你的正職工作,不知道你有沒有感受到本文中所提到的種種問題呢?你是否總是一心求快而用了許多旁門左道的技巧,這些技巧或許可以暫時的解決問題,但卻總不是長遠之計,以致於在很短的時間內,就失去了作用,引發你的程式必須大幅的修改呢?你的程式碼是否總是個人風格太過強烈,以致於無法為他人輕易閱讀、無法與他人共享、也無法為他人所用呢?你是否總是不遵守團隊的規範以及開發流程,使得你總是自外於團隊,也讓團隊不知如何運用你的力量呢?那麼你或許就是一名典型的牛仔程式員。



如果你是一個團隊的領導者,而你的團隊成員中正好有如此的牛仔程式員,相信你會時常為他頭痛,因為牛仔程式員管理起來有著極高的難度。他對於遵守正式的開發流程興趣缺缺,就算表面上願意遵守,通常也是陽奉陰違,甚至在背地裡怨聲載道。指派給牛仔程式員的工作,究竟何時會完成難以估計,有時很快、有時很慢,這並非他不認真或努力,只不過他對工作優先序的定義往往和你不同。他也無法與他人共事合作,無法產出其他人能重覆運用的成果。他所寫下的程式碼,能解決當下的問題,但一旦遇上需要改變時,更動的幅度有時很大。沒有人能輕易讀懂、也沒有人能夠接手維護。



身為牛仔程式員的你,應當盡量避免在團隊的開發中展現你太多牛仔的特質。在正職工作以外的開發,或許牛仔式的程式設計風格是一種樂趣,值得享受。但面對自己的正職工作,應當還是將重心放在如何讓整體戰力提昇,而不是一味的追求個人的成就滿足。



身為牛仔程式員管理者的你,應該試著找出你團隊中的牛仔程式員,試著加以誘導,讓他們明白牛仔式程式設計的得與失,認可團體的價值,改變他們自行其事的工作模式。那些無法扭轉其心態的牛仔程式員,也並非一文不值,他們仍然可以發揮的地方,例如讓他們獨立處理一些概念驗證(Proof of Concept,POC)性質的專案。這類的專案需要快速的驗證某個技術上的想法是否可行,其產出多半不會留到正式專案中使用。POC專案十分適合交由牛仔程式員負責,因為他實作速度快,程式碼也不需要與他人共用或是與其他專案共享。做為開發團隊的管理者,總是會遇上不同特質與類型的程式員,每種程式員都有優點及缺點,取其優點而避其缺點,才能發揮每一位程式員的力量。

No comments: