最近在「iThome 雜誌」的技術專題上連載我對軟體架構的看法,並利用一些以往所碰過的個案來探討。每一個單元以一張(最多兩張) UML 圖為主軸,再以此延伸,以文字敘述出來,文章內容會有些批判與暗諷性質,當然不會指名道姓。
連載主題:軟體架構鮮思維—利用 UML 圖看圖說故事。
第一期的主題是從我以前 Blog 所整理出來的,題目是:「漫談系統整合—誰是老大?」因為雜誌版面有限,無法將我完整的內容刊出,所以待雜誌出刊後,同時我會將我的原稿公布在 Blog 內,供讀者們參考。
另,包括大陸的雜誌,也同時有邀稿,所以關於爾後的投稿內容,我均會公布在新分類「雜誌邀稿」上。
前言
筆者擔任軟體顧問輔導與服務已多年,本身所擔任的角色為 “軟體架構師(Software Architect)” 一職,輔導的對象為一般軟體 ISV(Independent Software Vendor) 以及中、大型公司的 IT 部門。擔任架構師多年,經常一直思考架構師的職掌及所該具備的技能與素養,也逐漸培養出一種直覺、感覺,往往一眼可以看出某系統的架構好壞、或是軟體設計師的設計意涵等...。也藉此,筆者準備在本連載單元內,以曾經輔導過的個案,或所經歷、看過的一些 “現象” ,包括個人的心得與體會等,以 UML 圖來 “看圖說故事”,每一個單元都是一段個案、故事,同時也是案例分析。藉由各種面象與分析,帶領讀者們來看待與解釋架構,在之前,筆者先對 “架構” 一詞作個基本的說明。
由於國內軟體應用開發廠商係偏以專案開發(Project-based)的方式來從事應用軟體開發,而專案開發,先天有個不良的本質 – 時間永遠不足,所以專案開發的首要目標是要在有限甚至不合理的時程內把系統給 “做出來”,再來是求效能佳,至於彈性、可維護性等,那是以後的事情,而根本問題是,那個 “以後” 也就是系統爾後糾纏不清的 “病因”,同時,這也導致軟體開發人員普遍存在一個很大的茫點 – 見樹不見林。
那個 “樹” 代表著軟體技術人員只重視將系統給做出來的實體平台“技術”,諸如深入去瞭解 “如何用” .NET 或 J2EE 的系統平台技術;或是系統分析人員往 “問題領域(Problem Domain)” 的方向鑽研。兩者卻鮮少用心於 “純” 軟體設計,俱足軟體領域應有的技能與技術,那麼,什麼是 “純” 軟體的技術? 答案又是很簡單:抽象(Abstraction)、封裝(Encapsulation)、介面(Interface)與相依性(Dependency)分析的觀念 …等。
兩者的角色,一則往系統面的技術鑽研;一則往問題領域面的知識來走,兩者是越來越偏離,而不容易有互補了。自然而然,這也就如 “第五項修練” 一書所提及的,開發團隊已經喪失了整體系統思考的主動積極,同時,那個 “林”,也就是一種 “整體”,或稱之為 “架構(Architecture)”,早已蕩然無存,不知架構為何物了。
什麼是架構(Architecture)?
架構(Architecture)一詞,非常之難解釋,若真要一言以蔽之,那麼,可以說, ”架構” 是一種整體觀,需要保持從各角度看待架構時,仍有一致性與調和的觀點。
對 ”架構” 要能有充分的理解與認識,至少要能確實瞭解與體會下列幾個與架構至為關鍵的意涵與術語,包括了:整體-局部(Whole-Part)、觀點(View),包括巨(Macro)觀與微(Micro)觀、焦點(Focus)、層次(Layer)與廣度(Boundary)等。
擔任軟體架構師(Software Architect)必備的素養,即在於:觀照整體的能力。
筆者在輔導許多軟體公司的專案開發與教育訓練時,發現到與開發團隊對 “架構” 一詞的認知與定義大不相同。個人發現到,大部分的 IT 技術開發人員,所表達出來的架構,是比較偏向於實體層次如 .NET, J2EE 的 IT 技術層次。不是不對,而是 IT 實體層次僅是架構的觀點之一,並不足以代表整體的架構觀。
筆者想試著利用以上述幾個術語來解釋 “架構”。畢竟,架構的設計,牽涉到相關於設計中系統的議題與範圍太廣了,包括:團隊開發的共識、開發流程(Development Process)的制訂,分工與外包(Outsourcing)控管、系統的彈性、延展(Scalibility)與維護性等。
金剛經有云:「凡所有相,皆屬虛妄,見諸相非相,即見如來」。
“相”,是被具化、可以看得到的形,如同軟體模型,是被具化的產出(Artifact),也就是 “相”。而 “如來”,是不著相的,架構即為如來,所以架構也可以說是一種空、無。
問題來了,既然不著相,你又如何知道何為正道,何為如來?
佛教禪宗有個「以指標月」的譬喻:對於一個從不來不知月亮為何物的人,在蒼茫的星空中,不知那一個叫做月亮,這時候就需要一個認識月亮的人,用手指著月亮說:「那就是月亮」。同樣的道理,你又能如何瞭解甚至來驗證架構(如來)的正確性呢?
有經驗的架構師(Architect),會以各種不同的角度(以上所涵蓋的幾個術語),建構各類型的軟體模型,來看待並解釋「架構」。如同「以指標月」一般,對架構有深一層體會的架構師,會以導師(Mentor)的角色,利用各種工具來具化產出,以引導系統開發團隊的成員們認識「架構」。
UML, 程式碼等只是個標示工具,而所謂「架構」,是一種共識、一種默契、一種無以言欲的整體調和感。