架構設計貴在務實

(本文是我給溫昱先生新書寫的讀后感節選。)

我最早聽說“軟件架構”這個概念以及UML的名字,是在1999年的水木清華BBS上。當時有一篇文章介紹了軟件架構作為一個相對獨立的領域的發展情況,順便提到在此前一年被接納為OMG標準的UML。該文作者斷言,UML的出現將能“徹底”改變軟件開發的工作方式,甚至“若干年之后,不通UML者無法染指軟件開發”。三年之后,《程序員》雜志專訪Ivar Jacobson時,UML已經是盡人皆知。記得Jacobson在那次采訪中勸告中國的開發者,趕快去學習RUP。從那時候起,越來越多的人頂上了“軟件架構師”的頭銜,張口模式閉口架構,一時間好不風光。然而最初的熱乎勁過去之后,人們發現,“不通UML者無法染指軟件開發”的預言似乎落了空,而一些軟件架構師們似乎也并不那么神乎其技,很多時候反而不如那些實實在在寫代碼的人管用。他們所宣傳的那些架床迭屋的抽象層,那些復雜精致的模式設計,看上去精美無比,柔性十足,然而實踐當中一個出乎意料的小變更,便常常能把這一切打得粉碎。他們樂談的松耦合,小接口,往往只是說起來好聽,實際很難落實,或者代價過高,有的時候,反而是反其道而行之,才更“管用”。

為什么會出現這種情況?我想這里有客觀和主觀的原因。

就客觀原因來說,軟件開發畢竟還是年輕的行業,各方面還在劇烈發展和變化中。如果把軟件技術做一個層次劃分的話,軟件架構及設計屬于上層建筑,而像程序設計語言、技術平臺、數據管理技術、網絡體系結構等,均在其之下,屬于基礎。這幾年隨著互聯網的飛速發展,基礎尚且在劇烈變化當中,上層建筑自然會搖搖晃晃,甚至趕不上趟。具體來說,當今的軟件體系結構設計總體上是基于面向對象思想,而且是強類型語言時代的面向對象思想,而動態語言的出現和流行,實際上很大程度上顛覆了傳統面向對象思想的一些原則。例如,人們曾經認為封裝非常重要,對象成員能夠隱藏便應當盡量隱藏,但是Python和Ruby中public是常態,private反而是變態,實踐當中也工作的很好,甚至更好。再例如,幾年來人們津津樂道的設計模式,其中有很多在動態語言里毫無必要。而很多在關系數據庫時代被視為秘笈的數據存儲與訪問模式,比如層次關系的表達,反規范化的經驗,放到后關系性數據庫里就沒有多大意義了。再諸如應用的Web化、RIA、SOA等基本思想的變遷,都是能引起整個軟件技術格局強烈震蕩的大事件,所有這些進行中的劇烈變化,不可能不對軟件架構的設計產生影響,從而使得很多關于架構設計的思想迅速過時或者必須調整。如果架構師們不能夠充分重視實踐,與時俱進,那么就很有可能做出不合時宜的設計。

?就主觀原因來說,很多軟件架構師走入了一個誤區,即一旦升級為架構師,就可以脫離具體的代碼實踐,可以陽春白雪了。事實上,由于下層技術的變化迅速,架構師一旦脫離代碼實踐,脫離現實應用,很快就會與實實在在的軟件開發工作產生距離感,忘卻一線開發者需要面對的現實問題,做出一些不切實際的設計決策。這樣的設計,或者執行不下去,或者執行下去也代價巨大,該解決的問題沒解決,卻在無關緊要的問題上大做文章。毫無疑問,這樣的設計得不到一線開發者的衷心支持,得不到好的結果。架構設計跟開發發生矛盾,誰有問題?多半是架構設計出了問題。因為開發直接面對實踐,直接從事實踐,開發出了問題,那就是實踐在向自以為是的偽真理宣戰了。然而,一部分架構師不去檢討自己脫離實踐的設計,卻搞起本本主義,硬拿書本教條死扣實際。另一方面,如果開發者對于架構設計的原則和嘗試缺乏了解,不愿意提高對于軟件架構設計的認識和理解,不愿意付出對長遠有利的代價,也不理解,不支持,甚至消極抵制架構師的決定,那么同樣會引起架構設計與開發之間的矛盾。結果往往是,兩個必要的角色之間產生矛盾。開發者抱怨架構設計華而不實,架構師抱怨開發者不嚴格按設計行事,進而相互質疑對方角色的必要性。開發者認為架構師就是吃干飯的文人,根本應該人間蒸發,沒有存在的必要,而架構師則覺得開發者是一群無組織無紀律的驕傲的野貓,幻想有朝一日自動代碼生成器能把這幫不聽話的開發者趕出山門。

事實上,開發者和架構師都是軟件開發中必不可少的角色,即使在單人開發的項目中,開發者本人也需要經常在這兩個角色之間切換。兩個角色的相互理解,和諧協作,才能夠共同克服現實困難,開發成功的軟件。在促進這種和諧的過程中,開發者應當積極學習架構設計的理論并充分實踐,而架構師則需要本著務實的態度貼近一線。

因為從事技術媒體工作,我也確實結識了幾個優秀的架構設計師,他們身上的共同特點就是務實。這些架構師都具有多年的軟件開發經驗,對軟件本質的理解相當深入,本身就是開發高手。與一般開發高手不同的是,他們充分實踐,但不宥于實踐,而是積極地學習軟件架構的理論,嘗試用理論來指導實踐。而與整天高談闊論的理論架構師不同的是,他們掌握了理論之后,一定要親自落實,用實踐來檢驗。當理論與實踐產生矛盾的時候,他們既不會輕易否定理論,更不會教條主義般地削足適履,而是認真分析矛盾產生的原因,研究可能的對策。在反復思考和實踐之下,他們敢于做出“離經叛道”的結論,敢于質疑大師偶像的論斷,更能夠在錯綜復雜的實際做出簡單、可靠、靈活而便于實現的設計,并且向開發者傳達意圖,答疑解惑,實現整個團隊的思想一致。他們做出的設計,開發者看得懂,做得出,自然會得到衷心的擁護。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454907.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454907.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454907.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php mysql刪除失敗_php+MySQL實戰案例【七】數據編輯、刪除

?本節內容中講解用戶管理模塊中的修改用戶信息和刪除用戶。修改用戶信息:可對選擇的用戶記錄進行編輯,可修改用戶名、密碼、性別、手機、郵箱和地址信息。刪除用戶信息:將列表中指定的用戶進行刪除操作。二、編輯用戶信息編輯用戶信息&#…

前端每周清單第 34 期:Vue 現狀盤點與 3.0 展望,React 代碼遷移與優化,圖片優化詳論...

作者:王下邀月熊 編輯:徐川 前端每周清單專注前端領域內容,以對外文資料的搜集為主,幫助開發者了解一周前端熱點;分為新聞熱點、開發教程、工程實踐、深度閱讀、開源項目、巔峰人生等欄目。歡迎關注【前端之巔】微信公…

1.three.js世界的4大要素

一、三大組件 在Three.js中,要渲染物體到網頁中,我們需要3個組建:場景(scene)、相機(camera)和渲染器(renderer)。有了這三樣東西,才能將物體渲染到網頁中去。…

架構設計 例子和實踐

系統設計說明書(架構、概要、詳細)目錄結構 雖然這些文檔一般來說公司都是有模板的,但我寫這些文檔以來基本上是每寫一次就把目錄結構給改一次,應該說這是因為自己對這些文檔的理解開始加深,慢慢的越來越明白這些文檔的作用和其中需要闡述的東…

activiti 批量 mysql_Activiti6系列(3)- 快速體驗

一、部署啟動activiti####1、部署,將兩個war包拷貝到Tomcat下即可。![](https://img2018.cnblogs.com/blog/1755845/201908/1755845-20190802010532367-2002399291.png)2、啟動tomcat,訪問http://127.0.0.1:8080/activiti-app默認賬號密碼:ad…

【啟動】Windows上啟動圖形化軟件,報錯: 無法啟動此程序,因為計算機中丟失api-ms-win-crt-runtime-1-1-0.dll...

今天在安裝了jetbrains官網上的ToolBox軟件后,沒有辦法啟動起來,報錯如下: 無法啟動此程序,因為計算機中丟失api-ms-win-crt-runtime-1-1-0.dll 嘗試重新安裝了并沒有什么用,現在來解決方法: 直接找到官方的…

論文: YOLO9000-Better,Faster,Stronger

論文閱讀: YOLO9000-Better,Faster,Stronger YOLOv2 是經過改造之后的YOLO Batch Normalization:在所有的conv layer后加了BN之后提高了2% mAP,BN可以幫助regularize模型,這樣的話就可以放棄 dropout。 High Resolution Classifi…

怎么ie取消要打開或保存來自_取消認證后,發票抵扣就這么簡單!

點擊標題下「中財訊集團」可快速關注3月1日起,取消增值稅發票認證的納稅人范圍擴大至全部一般納稅人。一般納稅人可以自愿使用增值稅發票選擇確認平臺查詢、選擇用于申報抵扣、出口退稅或者代辦退稅的增值稅發票信息。具體如何操作呢?掌握以下步驟&#…

Google發布文檔數據庫Firestore

Google發布了Cloud Firestore,它是用于移動、網絡和服務器應用程序的文檔數據庫。\\去年我們曾報道過Google Firebase,它是一種用于移動和網絡開發的數據庫,提供實時的和離線的數據訪問,與許多Google服務相集成。他們現在推出了一…

好的軟件架構設計

什么是架構 前言:軟體設計師中有一些技術水平較高、經驗較為豐富的人,他們需要承擔軟件系統的架構設計,也就是需要設計系統的元件如何劃分、元件之間如何發生相互作用,以及系統中邏輯的、物理的、系統的重要決定的作出。在很多公…

HihoCoder 1323 回文字符串

回文字符串 思路 動態規劃&#xff1a; 可以有三種修改決策 將開頭和結尾字符改成一樣在開頭加一個和末尾相同的字符在末尾加一個和開頭形同的字符代碼&#xff1a; #include <stdio.h> #include <iostream> #include <string.h> using namespace std; char …

python線程狀態_Python線程

1. 線程基礎1.1. 線程狀態線程有5種狀態&#xff0c;狀態轉換的過程如下圖所示&#xff1a;1.2. 線程同步(鎖)多線程的優勢在于可以同時運行多個任務(至少感覺起來是這樣)。但是當線程需要共享數據時&#xff0c;可能存在數據不同步的問題。考慮這樣一種情況&#xff1a;一個列…

JavaScript中錯誤正確處理方式,你用對了嗎?

JavaScript的事件驅動范式增添了豐富的語言&#xff0c;也是讓使用JavaScript編程變得更加多樣化。如果將瀏覽器設想為JavaScript的事件驅動工具&#xff0c;那么當錯誤發生時&#xff0c;某個事件就會被拋出。理論上可以認為這些發生的錯誤只是JavaScript中的簡單事件。 本文將…

文件分割機

文件分割與合并 要求&#xff1a;實現對大文件的分割與合并。 按指定個數切&#xff08;如把一個文件切成10份&#xff09;或按指定大小切&#xff08;如每份最大不超過10M&#xff09;&#xff0c;這兩種方式都能夠。 程序說明&#xff1a; 文件分割&#xff1a;把一個文件分割…

mysql pow函數怎么用_pow函數怎么用

PHP pow函數表示指數表達式。pow函數怎么用&#xff1f;php pow()函數 語法作用&#xff1a;pow()函數的作用是將一個數進行n次方計算后返回語法&#xff1a;pow(X,Y);參數&#xff1a;X表示要做處理的數字Y表示指定n次方中的n數值說明&#xff1a;返回X的Y次方冪&#xff0c;如…

【IntelliJ IDEA】添加一個新的tomcat,tomcat啟動無法訪問歡迎頁面,空白頁,404

第一部分&#xff0c;添加一個tomcat 1.先把Toolbar 和 Tool Buttons顯示出來 2.選擇Edit Configurations 3.添加一個新的tomcat server進來 解決no artifacts configured問題&#xff0c;就是沒有項目加入里面 先添加一個沒有的項目 啟動之后找不到 頁面 第二部分&#xff0c…

回文數-時間變換-判斷郵箱

class huiwenshu public class huiwenshu {public static void main(String[] args) {System.out.println("輸入...");Scanner in new Scanner(System.in);String number in.next();boolean flag true;for(int i0;i<number.trim().length()/2;i){if(!String.va…

mac eclipse tomcat mysql_mac下使用eclipse+tomcat+mysql開發 j2ee(一)

在這里是使用eclipse&#xff0b;tomcat&#xff0b;mysql的方式。1、軟件下載(1) eclipse我使用的是mac&#xff0c;因為本人是蘋果客戶端開發者&#xff0c;所以目前只有蘋果機器了。首先下載eclipse for mac&#xff0c;選擇mac 64位&#xff0c;下載eclipse-jee-kepler-SR1…

社交系統ThinkSNS-plus(TS+)V1.0發布!

2019獨角獸企業重金招聘Python工程師標準>>> 需要購買源碼的同志們&#xff0c;依然隨時可以聯系我們手機&#xff1a;18108035545&#xff08;同微信&#xff09;&#xff1b;電話&#xff1a;028-82884828 &#xff1b;QQ&#xff1a;3298713109&#xff1b; 從決…

《軟件架構設計》一書目錄

第一部分 軟件架構概念與思想篇 1 第1章 解析軟件架構概念 3 1.1 軟件架構概念的分類 3 1.1.1 組成派 4 1.1.2 決策派 5 1.2 軟件架構概念大觀 5 1.2.1 Booch、Rumbaugh和Jacobson的定義 5 1.2.2 Woods的觀點 6 1.2.3 Garlan和Shaw的定義 6 1.2.4 Perry和Wolf的定義 …