在這幾年的軟體開發生涯裡,和不少程式設計者共事過。即使都是從事著相同的程式設計工作,但是所遇過的程式設計者,還是各自擁有不同的特質,甚至可以區分成不同的典型。

在這一回裡,就讓我們來談談這些常見的程式設計者典型吧。

寫出的程式碼難以維護的快手與完美主義者

首先要提的是,有一種程式設計者在解決程式設計問題時,寫出來的程式只要能解決眼前的問題就好,也就是說,只要會「work」,他是不管究竟有多「dirty」的。

這種人寫出來的程式,很難修改、不容易擴充、很容易產生副作用,可讀性差,也不好維護。雖然他寫出第一版的程式碼的時間可能很短、動作快,但這種程式設計者可能是大家都不太願意共事的。

在這個光譜裡的另一個極端,則是完美主義型的,在這種類型的程式設計者眼中,容不下任何一粒不完美的砂子,所以,他所寫下的程式碼,常常需要不斷精雕細琢,非得達到他心目中完美的境界,才算可以接受。

例如,所寫下的程式碼的擴充性,要達到所能想到最佳的擴充性、或是效能必須最佳化到想不出任何辦法再最佳化的程度。

其實,「dirty work」固然不可取,純粹的完美主義在實戰中也會產生問題,例如過去提過的「過度工程化(Over Engineering)」及「過早最佳化」的問題,而完美主義者產出程式碼所需的時間通常也都比較久。這並不是在說,你不應該試著總是寫下你最佳的程式碼,而是說,你需要視很多因素,來決定你究竟應該寫到什麼程度。

這是一種取捨,你知道最理想的情況為何,然後你知道現實的條件有什麼,因此,你做出了取捨,儘管那不是理想世界中的完美,但那是真實世界中的最佳。另一方面,程式碼是有生命的、能夠演化的,所以讓他們有能力演化、逐步的朝向完美,事實上更為重要。

事先規畫不足、搶著做,以及準備時間太長、動作太慢的人

有一類的程式設計者他們在著手解決程式設計問題時,往往急著動手開始寫下程式碼,因此,也不會對問題的背景做功課、做研究,就像是先調查是否有前人遇過類似的問題、他們是否有現成的方案了,或是他們遇到過什麼樣的問題。

這一類的人總像是急著動手,等到中間遇到問題,甚至是「卡關」了,才開始尋求解決方案,到這時候也常常發現,原來自己白走了許多冤枉路,原來前人早已有了不少心得,自己白白花費一堆力氣卻無成效。

當然,也存在另一種極端的人,則是凡事做盡功課,在解決每個問題前,總是要花費相當長的前置作業時間,來研究該問題從盤古開天闢地到現今為止的發展現況,非得把每一個細節都弄得一清二楚十分透澈,否則絕不開始動手。從做研究的角度來看,這樣當然是很不錯的態度,但是以軟體開發實務來說,還是需要拿捏一個平衡點才好。

說的比做的多的人

還有一類的程式設計者,是紙上談兵型的程式設計者。這一類的程式設計者很喜歡研讀、追求各種新的理論,因此在他們的口中或筆下時常聽到,或是看到各種最新的名詞及術語,但是他們似乎很少真的理解到這些名詞或術語在實務中的精神。

軟體開發是個講求實務的領域,我相信不論流派,幾乎所有的理論及術語,最終的目的,都是為了應用在真正的開發實務中、解決實際的開發問題的。但是,這些紙上談兵的程式設計者,大多時間都在紙上談兵,他們似乎時常誤解這些理論、術語名詞的真正意義,更使得他們即使打算在實務上應用,都會得到和預期不同的效果。

死忠支持特定對象的基本教義派

還有一類的程式設計者帶給人們的印象也十分鮮明,他們會特別偏愛某種程式語言、技術或平臺的,不在其偏愛名單上的,就總是看不上眼,也很難給予好的評價,就像是當初漢武帝獨尊儒術一般。他們不管在什麼類型的專案、什麼樣的應用裡,總是選擇他們所偏愛的語言、技術及平臺,而不管究竟是否適用。

事實上,每種語言、每種技術、每種平臺,之所以被推出都有其時空環境及應用條件,它們之間即使有所優劣,時常也都是在特定的比較基準下,才能展現出來,幾乎沒有獨占絕對優勢的語言、技術或是平臺。

能知道多種語言、技術、平臺在各面向上表現的優缺點,並依據自己的應用從中選擇出適合者的程式設計者,才是真正上等的。相反的,總是依據自己的偏愛來做選擇的,即使都能因為自己對它們的熟悉而使盡全力,也只能算是中等的境界。相對地,那些隨波逐流,人云亦云來做選擇的,只堪稱為下等了。

對於有問題的既有程式碼,遲遲不去處理的人

總是用dirty code 來快速解決眼前問題的程式設計者,會不斷積累愈來愈多藏有問題的 legacy code,而面對legacy code也有不同的因應態度,我知道有一類的程式設計者是從不處理他們所遺留下來的legacy code,因為他們深怕一動到這些legacy code,就會牽一髮而動全身,對他們來說,程式碼運行得好好的,幹嘛沒事去改它們,替自己招來額外的麻煩?

對,就像大多數的程式設計者特質,一樣有著光譜的另一端,這些程式設計者很喜歡整理legacy code,他們很痛恨那些他們眼中難以容忍的程式碼存在,尤其這些程式碼還是別人寫的。對他們來說,這些程式碼有如眼中釘、肉中刺,非得除之而後快。在沒有清除它們之前,是絕不動手開始寫新的程式碼。

當然,你也應該猜的出來,我的看法仍然是走中庸之道,視情況而定。總的來說,有問題的程式碼是應該要整理、翻新的,但是這時常也非一朝一夕之功,與其想要大刀闊斧,立馬幹掉它們,不如漸進地,持續翻修它們至新的面貌。

對於新技術、新概念的應用,有一類的程式設計者總是極力的追求。他們總是試著在每個新的專案裡使用新技術、新概念──即使這些技術或概念其實尚未成熟,但這類的程式設計者總是要當新事物的先行者,換句話說,也就是白老鼠。

將新技術導入專案,通常會帶來不低的風險,因為新技術所造成的問題,通常鮮少有前人走過的道路可供參考、借鏡。而新技術通常穩定性也不足,因為尚未經過太多實際的考慮及修正。

當然,也有相反的一個族群,在這個族群裡的程式設計者,總是不願意採用新的技術、新的觀念,對於新的事物,他們也是持比較保留的態度。他們不愛改變,只希望用自己已經熟悉、習慣的技術及模式來開發,這樣的保守心態,時常也會阻礙了進步的機會。

不偏不倚、持平看待,才是務實之道

在這回中,我們談到了一些程式設計者的典型,而上述典型之中,很多甚至剛好是互相對比,處於光譜的兩個極端的。而你會發現,我的主張幾乎都是落在兩個極端之間,究竟應該落在那裡,是視真實的應用情境而決定的,但通常最極端的選擇,不會是現實中的選項。

作者簡介


Advertisement

更多 iThome相關內容