何為站在軟件之外看軟件?在最近的程序人生的講座、報道,談及最多的問題就是站在軟件之外看軟件。
內外的概念是一個物理概念,我來講一個物理上的例子來理解如何是站在軟件之外看軟件:凡讀此書之人,都知道愛因斯坦,也都知道愛因斯坦的相對論,如此足矣。大家都能理解我們生活在這個三維的空間,愛因斯坦的相對論補充了三維空間的理論,在此基礎上添加了時間的第四維,作為常人無法理解時間一維到底如何被看及。
首先,我們知道復數表示論的四個象限,第一象限是正正象限,第二至第四象限都有虛軸;再看在三維空間上建立一個八個相空間,其中也僅有一個相空間是正正正的相空間。其次,我們看一個問題,臺灣島的海岸線有多長?我們根據地圖,按比例測出一個數值來可以表示該海岸線的長度;我們也可以事必躬親拿著米尺來量一下,我們會發現,我們測定結果比我們計算出來的大許多;為了精確起見,我們拿來厘米尺,再測量,又大了許多;再者我們使用游標卡尺來測量,我們會發現,我們測得的結果是我們根據地圖測出來的幾千萬倍?為什么?原因很簡單,在刻度的范圍內,我們把曲線當成直線來測量了,再逐漸細化的過程中,問題被測定更精確,再精確測量結果的同時,我們發現真正測量結果是無窮大。奇怪?回到上面問題:我們為什么不能理解四維,有兩個方面,一是我們始終站正的相空間上,二是我們拿我們認為最精確的刻度去度量空間。如果我們可以做到在空間之外看空間,那么我們可以把時間的概念引入,我們甚至可以從長度,寬度加時間來計算精確的體積(原始的體積定義是:長*寬*高),但有一點,因為精確的體積是無窮大?無窮大不能被理解,即真實空間不能被理解。好了,如此一點說明,你可能對我們理解時間的概念有所變更了(足矣),回到正題!
何為軟件之外呢?
軟件之外就是軟件構架的思想,我們如何構架軟件模型,一個問題--為什么軟件人才流動如此讓一個體制完好的公司處處面臨危機--被提及時存在如下的問題:一公司的體制并沒有完好,至少人力資源不體制不完好,二項目計劃時沒有考慮項目如此類的風險,三本質而又沒有邊際問題是企業文化不健康。在一個健康的體制上才容易構建系統的整體模型并易于實施。
軟件之外是一個站在如何實施軟件開發的新高度,如何度量項目的進度,我們有無一個標準來衡量?假如完全根據進度來實施將會如何----機械化。
一.在軟件之外看軟件什么
軟件的實施需要工程化,而不是機械化,人是活動的,無法實施機械化,更何況軟件的開發過程也是一個創造性過程。
再講一個普通的例子,我在從事電力系統自動化項目實施時,有位自動化資深的客戶給我講了一個道理,他說:在世界上有兩種人是推動社會進步的,一是勤勞而聰明的人,他在創造世界;一是愚笨而懶惰的人,他在要求別人創造世界。這樣,自動化就出現了,它第一種人為第二種做的,但到現在也無法滿足第二種人的需求。
這雖然是個笑話,但從其中可以體會到一個道理,在從事工程項目時有兩個方面一個是客戶的需求,一個項目實施者。
既然軟件從無到有再到無的過程,被稱為軟件工程(將在第二章詳細討論),軟件之外的問題也就是工程的實施者和軟件的需求者。
先來談軟件的需求,在第二節,我們討論了信息系統,作為目前的世界被稱為信息的時代的世界,其信息的重要性是不言而喻的。我們構建一個系統,系統為之服務,服務者作為計算機所能提供的就是數據服務或數據化的服務。
在日常生活中,我們需要被服務的事物越來越多,而這些服務就是我們的需求,這些需求由系統來解決或提供,而這些系統向人們提供數據服務就是我們在工程中實施的對象。
那么,軟件工程的實施對象從事什么樣的服務。
一個事物被實施后,尤其是軟件,它的目標就是人們為之的定義的功能,對于對象的本身稱為操作,軟件的操作就是自動地按照一定的邏輯來整理、分析和抽象數據。
軟件的需求和軟件的實施分開來談是沒有意義的,但作為理解上,一個大腦很難對兩個事物進行同時分析。軟件的實施是軟件工程的整個過程,需求其實就是一個被服務的對象的思想或思想過程。
軟件的實施就是把對軟件的需求包裝成軟件的一個過程。
軟件之外是什么?一是什么將被包裝成軟件,二是如何包裝成軟件。
二.如何看軟件
如何"看"軟件?這個"看"字包含有眾多的含義。
首先,軟件是虛的,是被比特存儲的,不是使用顯微鏡就可以看見的,看軟件分兩個方面,一是看(觀察)軟件執行情況,二是看(分析)軟件執行過程。
其次,我們還應該考察的是軟件被構建的過程,也就是軟件之外的第二個問題,在構建過程中有什么被記錄,記錄構建的過程的標識?
最后,軟件被使用于何處,使用過程記錄。
"看"軟件的過程,是一個識別的過程,在識別的同時也還需要分析、記錄、再分析、再記錄等,若我們在參與軟件的實施,那么這些分析記錄的文檔是不是軟件的一部分。
當然是,但不是軟件的執行部分,它是軟件的服務部分! (其執行部分也是服務部分,軟件的介紹將在第二章詳細討論。)
如何分析和記錄軟件的實施過程,UML提出"統一軟件開發過程",對軟件的實施過程進行了詳細地定義和描述。
打開UML等圖書,首先有一堆關于圖的描述被說明,同樣,UML的也是定義在各類圖的基礎上,但什么是圖呢?
對于圖,有兩種解釋,一是名詞,說明一類(實體的)事物;二是數學概念,定義一類(抽象的)事物。名詞是采用點線等方式描繪出的符號(說成符號也不大恰當);而數學概念是采用集合來定義的,描述各個元素之間關系的描述。
對于軟件工程的實施,主要的是描述各個對象之間的關系,在第一節中,我們已經把事物對象描述為一個集合或一個集合中的元素,如此現在采用"圖"來定義各個元素之間的關系最為切當。
三.什么是圖
有序對G=(V(G),E(G))稱為一個圖,其中V(G)是一個非空的有限集。V(G)中的元素稱為G的頂點,E(G)是V(G)中全體不同元素構成的不同無序對集合的一個子集,E(G)中的元素稱為G的邊。
前面已經說過,序對是一個關系的序,所以圖的定義就變為:把集合中的元素和集合中各元素的關系描繪出來的圖形的形式。
在圖中,描述集合元素是對象的定義,而描述元素關系時是行為的定義。所以圖也可以定義成:把對象和對象行為描繪出來的圖形的形式。
如此,就明了了,圖就是對象(采用一種符號表示)和對象行為(也采用一種符號表示)按照一定的邏輯關系組成的符號(組)。
(其實,在數學上若想搞清楚圖的定義首先必須搞清楚群的定義,因為圖的同構在群的基礎說就簡單多了,至于群,在本書上沒有介紹,大系統的系統分析員或研究數據結構的讀者可以參考一下其相關資料。)
對于圖還有如下定義:我們稱
V(G)是圖G的頂點集(元素集),E(G) 是圖G的邊集(元素關系集);在不至于混淆的情況下,有時分別用V和E表示G的頂點集和邊集。
G的頂點數|V(G)|有時也稱為G的階(對象元素的個數),通常用p來表示;G的邊的數目|E(G)|一般用q表示。
為了方便,我們通常用uv來表示邊{u,v}(其中u,v是V(G)的元素)。
邊{u,v}是一個序對,或我們稱為關聯(該詞不是數學術語),該關聯的意思是兩的元素間的有關系。有圖為有向圖時,該關聯可以表示元素間的所屬,但該處的有序對僅表示兩個元素間的相關聯的一一映射,若元素間存在多對一的映射的話,即在面向對象的分析設計中存在一個對象擁有多個子對象。
一個對象是一個類元(class unit)的實例,一個類被多個子類繼承,每個子都可實例化時,其分析類元的"圖"在類元(一個元素,就是圖的一個頂點)上將有多邊,這個邊就是我們描述圖時稱之為的度。
如果e=uv∈E(G),則說e關聯(該詞是數學術語)u和v,稱u,v分別為e的端點,并且稱這兩個頂點是相鄰的。在這種情況下,我們亦稱v是u(或者u是v)的一個相鄰者。
描述相鄰者時,其不一定有關系,若稱為相鄰關系也為關系的話,那么,這個相鄰關系可能會體現的在時間順序上。事件或觸發過程將依此關系為依據。
對相鄰關系元素的取值,在數學上具體定義如:
設u∈V(G),u的鄰域,記作Ng(u)(在不至于混淆的情況下記為N(u)),它是G中全體相鄰于頂點構成的V(G)一個子集合,即
與G的同一個頂點相關聯的兩條邊稱為相鄰邊。
和同一個元素發生關系,作為元素本身肯定是被觸發的,無論關系的緊密與否,這和描述對象無關。
在圖的定義中,如果我們刪去"邊必須相同的"的限制,則導致的結果稱為多重圖;連接同一對頂點的兩條或者更多條邊(但是有限的)被稱為多重邊。
如果我們再在多重圖中刪去"邊必須連接不同的頂點"的限制,即允許有自環的存在,則由此導出的結果稱為偽圖。
圖的定義在日益被描述清楚,如何對圖的具體定義,對圖的定義,我認為無須具體了解,在系統分析中由于人們對UML認識和使用的日益廣泛,于是圖示來描述問題被廣泛采用,其實在對事物(系統)分析最被人接收的還是圖。
對圖的定義和實質地認識,我認為還是必要的,如果我們先來描述UML語言,再來描述圖(即便是UML圖)我們還有許多疑問,這些疑問在那里?對圖能描述什么?如何來描述?圖元間的關系如何?當然,對于那些簡單的圖來說,自然沒有研究如此之深的必要,但對于大系統必要使之。
從簡單圖到多重圖是一個拓撲的過程,但對于系統來說是一個拓展的過程,從建立簡單的模型到大系統的模型的建立的過程。
若系統內模塊存在同構或同胚(概念將在下面敘述)等情況,其模塊的構建就存在封裝性,就有必要對其基礎的模塊進行封裝以便重用。
在圖的定義里,如果我們把"無序"兩個字改為"有序",便得到所謂的有向圖的概念。更確切的講,所謂的有向圖D是一個有序對(V(D),A(D)),其中V(D)是一個非空有限集, V(D)的元素稱為頂點,A(D)是由V(D)中的元素組成的一些有序對構成,并且要求:
①構成有序對的兩個元素不同;
②任何兩個有序對不同。
顯然,A(D)是一個有限集。A(D)中的元素稱為弧。
在不至于混淆的情況下,我們通常將弧(u,v)(u,v是D的頂點)用uv來表示。如果e=uv是D的一條弧,則稱u和v是相鄰的且稱e是從u關聯到v;我們也稱頂點u控制頂點v。形如uv和vu的一條弧稱為對稱弧。
設D是一個有向圖,它的逆仍是一個有向圖,記為D',D'的頂點集為V(D')=V(D),弧集為A(D')={vu;uv∈A(D)};有向圖D的基礎圖是指向無向邊來代替D中每一條弧而得到的圖或多重圖。 一個圖的頂點為位置無關,圖中兩個頂點之間的連線與它的長度,曲直或者形狀也是無關的,這要考慮的是兩個頂點之間是否有線相連,這正是所謂兩個頂點之間的拓撲性質。正如此,有些表面上似乎完全不同的圖,卻是相同的。于是我們稱這兩個圖是同構的。
在這里,我們將需要認識到,建立模型時由于各個人的知識范圍,認知渠道極其經驗等方面的影響,所建的模型可能在表面上完全不同,但表達的內容和表述的形式卻是完全相同的,關于圖的特性,比如說同構等,將是對模型的基礎。
圖同構的定義
設G1,G2是兩個簡單圖,圖G1與G2被稱為是同構的,寫著G1≌G2,如果存在一個從V(G1)到V(G2)之間保持相鄰性的1-1映射σ。就是說,在V(G1)到V(G2)之間存在一個1-1映射σ,使得對于Ⅴu,v∈V(G1),uv∈E(G1),當且僅當 σ(u)σ(v)∈E(G2)。
我們把從V(G1)到V(G2)之間的保持相鄰性的這個1-1映射σ叫做圖G1到圖G2間的一個同構映射。
判斷兩個圖是否具有良好的實際應用的背景。最直接的應用就是應用于系統工程中,判斷兩個系統是否同構,在這個系統上建模中具有非常使用的價值。另一個直接的應用是在計算機(主要是軟件工程)中構造某種類型的圖(比如UML的各類圖)時,排除同構圖。當然判斷兩個圖的同構是非常困難的事,但UML的各類圖中,一般都較為簡單,當然我們不能阻止你構建一個龐雜的系統模型。
當然對于圖應用并不僅僅,在判斷兩個圖的是否同構上,另外,我們通過對圖的認識,建立一個合理的模型,比如一個基圖就可以表述完整的,你卻采用了多重圖來描述,在某些方面會給系統帶來額外的負擔。[NextPage]
設v是圖G的一個頂點,我們把關聯的頂點v的邊數目稱為v的度數,簡稱度,記為d(v)。何謂度,度即是集合中關系(數),在前面我們說過,關系是笛卡兒積的一個子集,這個子集就是邊,其元素的個數就是度。圖G的最大度和最小度是指圖G中度數構成的集合的中的最大值和最小值,分別用Δ(G)和δ(G)表示。
四.圖研究什么
在面前圖的研究領域上存在一個問題:在使用計算機構造圖時會出現同構現象。
一般情況下,以何種方式?構造什么樣的圖?圖本身就是一種可以能被描繪成圖一個集合,在軟件領域,我們關心的基本上是序列(集合),這個問題在建模表現得很突出。
圖有兩個方面,一個是邊,一個是頂點。
頂點是沒有序列的概念的,那么的邊的序列如何定義?是方向?
在圖上,我們一般是采用研究圖的(某個頂點的)度數來研究圖的構造的。以下看一下度的序列。
設圖G為簡單圖,則:
① 0≤di≤p-1,I=1,…,p;
② 在d1,d2,…,dp中至少存在兩個值相等。
關于①的證明由圖的定義易知,關于②證明由①易證。
設π=(d1,d2,d3,…,dp)是一個非負整數的單調遞減(或單調遞增)序列,如果存在一個p階簡單圖G,滿足π(G)= π,則稱π是可圖序列的,或簡稱π是一個圖序列,并稱G是π的一個實現。
在圖的序列領域中主要研究如下問題:
第一:圖序列的基本特征是什么?即一個非負單調遞整數序列π=( d1,d2,d3,…,dp)是圖序列的充要條件是什么?
第二:π=(d1,d2,d3,…,dp)是一個圖序列,那么π對應的實現有多少?
第三:如何把圖序列π=(d1,d2,d3,…,dp)對應的實現全部構造出來。
對于研究的問題,第一個問題是圖論實施的基礎,我們來考察系列的隊列,是研究有向的關系(可以看成采用序列表示的事件觸發的關系),設一個序列是圖序列,但該序列不是用來表示我們要研究的圖,而研究我們圖的元素關系的圖。
對于第二個問題,則是我們開始關心的問題,對于一個圖序列實現什么是至關重要的,建立一個關系,其關系到幾個元素,關系是什么?比如一個人結婚,我們找到一個關系:請親戚朋友吃酒,關系幾個元素(來那些人),各個關系什么,有的是親戚有的是朋友。
對于第三問題是實質性問題,就是我們需要解決的問題,如何把序列(對應的元素或關系全部構造出來!)的實現(關系的構造圖)全部構造出來。
下面來研究一下圖系列的基本性質:

五.圖的同構與拓撲


六.樹
樹和數據結構,樹是簡單的圖,學過數據結構的就知道類似"兩叉樹"的理論,簡單地講樹就是在圖的所有結點中,任意兩個結點之間只有唯一的一條簡單路徑的圖。
在自然界中,樹是一中根在下的有枝的植物,至于植物它的枝是梯形結構的,我們在圖論中描述樹時,我們常常把根畫在上面,而把"枝"畫在下面。
樹的術語和特征(采用語言的描述時稱為語義)











