本節書摘來華章計算機《軟體工藝師:專業、務實、自豪》一書中的第1章 ,[英]桑德羅·曼卡索(sandro mancuso)著 愛飛翔 譯, 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
21世紀的軟體開發
我還記得自己剛工作時的情景,那是20世紀90年代。上了三年班之後,我覺得自己已經是資深開發者(senior developer)了。我當時已經可以把彙編指令和pascal代碼混在一起寫,博得友人贊賞,而且熟練使用至少四門程式設計語言。更重要的是,我可以寫出難懂的delphi代碼:隻用幾行語句和幾個晦澀的windows應用程式程式設計接口(application programming interface,api)就可以把程式寫好,而這樣寫出來的代碼很少有人能看懂。
當時的人就是那麼看待程式設計資曆的。沒法了解一段代碼通常表明你的程式設計水準還不夠高。能寫出誰都看不懂的代碼,你立刻就成為高端開發者了。當時的人經常能聽見項目經理和開發者在說這樣的話:“我們現在還不能修改這段代碼,必須要等henry hacker度假回來才行。他寫的代碼别人都看不懂。”
工作七年之後,我已經不滿足于做一個資深開發者了,我覺得自己應該往更高的級别努力。我不想再被當成開發者了,更不想被人冠以程式員(programmer)、碼農(coder)等名頭。從那時起,我決心自稱軟體架構師(architect)。我覺得這個稱呼很好。當時我已經在一家大型咨詢公司上班了,我們的産品全都是大型企業級java程式(當時叫作j2ee程式)。而且我們也采用了rational統一流程(rational unified process,rup)——先繪制用例圖、類圖及序列圖,然後再寫代碼。
在這家大公司工作了一段時間後,我升入架構團隊,在那裡,我們必須首先查閱《設計模式》(design patterns)那本書,然後才敢建立自己的類模型。我非常熟悉gof設計模式及core j2ee模式,而且也懂得運用uml(unified modeling language,統一模組化語言)和rational rose來模組化,此外,還獲得了一些java認證。我能力、經驗及所獲認證都遠遠超過了對軟體架構師的要求,這種感覺不錯。
身為一名架構師,我要和業務分析師溝通,了解功能及非功能需求,并繪制圖表,精确地指明開發者必須要完成的任務。有時我也會反複思量:到底應該怎樣建立抽象模型,才能令系統在不影響其他事物的情況下順利演進呢?想這種問題時,我通常會憑着感覺在心裡來回盤算。這時我并不知道系統在五年内需要添加哪些具體功能,是以不太可能準确判斷出系統的走向。于是我加入抽象層,到處運用設計模式。這種愚蠢的做法在今天看來是過度設計(overengineering),但在當時看來,卻是一種高端的架構技術。
在架構組待了幾個月後,我發現自己經常需要和原來所在的開發團隊成員相溝通,溝通的次數遠遠多于和本團隊架構師打交道的次數。我要經常和開發者一起吃午餐,談論他們的代碼,并叫他們告訴我程式的不同部分是如何實作的。我也發現自己在空餘時間要花比從前更多的精力來寫代碼。後來,我終于明白出現這種狀況的原因了:上班的時候根本沒寫代碼,是以必須用下班後的時間把欠的那部分代碼補上。
幾乎有一年時間,每天上班都在畫圖、寫文檔,這種工作我厭倦了。于是我告訴老闆,自己想回到開發團隊。他聽了很驚訝,因為他根本就不明白我當時的想法。他說:“你在技術架構師的職位上表現得很好啊。你知道嗎,很多開發者都想來架構團隊呢。你這個位置,很多人想坐呢。”這些我當然知道,我原來就是個開發者。我當然知道很多開發者都想成為架構師。我告訴老闆:“那問題很好解決嘛,你從這麼多開發者裡挑一個跟我對換就行了。”一周後,我又回到了開發團隊。這次,感覺依然很好。
今天回想起來,我意識到這個決定是多麼重要。記得當時我花了幾周時間來衡量到底應不應該回到開發團隊。如果繼續留在架構團隊,那我就在一家大公司裡擁有架構師這個頭銜,我在别人眼中會顯得很有資曆,我會容易受到賞識(架構師都是老手,沒有聽過“初級架構師”(junior architect),對吧?),有指揮别人的權力,比其他開發者地位高,容易受到管理層注目,容易升職,職權也更大(架構師談論的都是些大話題)。可是回到開發團隊我就會變得很開心。架構師這個工作我感覺不太有意思,架構師整天畫圖并讨論一些長遠的目标,但那些目标基本上都經不起時間的考驗。于是,我決定選擇快樂一些的工作,每天寫寫代碼就很開心。我從此發誓,自己隻選那種讓我早晨一醒來就很樂意去上班的工作和職位。
這種決定會徹底而永久地改變你的職業生涯。假如當時繼續留在架構團隊,不寫代碼,我再想重新當一名開發者可能就難得多了。越不寫代碼,就越難重拾開發者的身份。
問題的重點不在于架構師和開發者哪個更好。今天我甚至都不認為自己當年在那家公司裡面做的是架構工作。我的意思是,應該根據自己的興趣來選擇職業道路,做自己喜歡的事。無論是架構、軟體開發、測試、業務分析、管理還是其他工作,你都應該在喜歡的前提下去做,這一點相當重要。
本章接下來要讨論究竟什麼樣的開發者才是資深開發者,21世紀的開發者又要面對哪些新挑戰。