程式系統的複雜性

2021-05-07 20:48:18 字數 1309 閱讀 2525

近來在做一些專案,對程式複雜性給開發帶來的困難又有了進一步的認識。 對於乙個從零開始的系統,我們要做的設計有以下這些工作:

1.  確定系統架構,具體講就是要多少臺機器, 每個機器上執行哪些應用程式,每個應用程式的功能是什麼,這些程式通過什麼接**術進行互動。

2. 確定整個系統的資料模型。

3. 確定每個應用程式的資料結構,功能模組層次,模組之間的介面和介面呼叫規範,模組處理邏輯。程式之間的介面,介面呼叫規範。

4. 滿足可靠性和效能要求,安全要求等等。

其中2,3項工作最為複雜。 定義整個系統的資料模型會因為現實世界中實體關係的複雜性變得異常麻煩,舉棋不定確定不了乙個最優的方案,資料會有冗餘,還時常會在之後的開發工程中反覆修正資料模型。比如對乙個實體的分類有時就很複雜,很多的分類維度。有些維度之間是正交關係,有些維度之間不是正交關係;乙個維度之下,一些個體確定屬於乙個類別,另一些個體同屬於乙個維度下的多個類別。在做模型設計時,不論是程式的物件導向設計,還是資料庫的面向關係設計,都很難設計的很好,冗餘不可避免。

同樣,模組功能邏輯也可能很複雜,好處是內部邏輯的複雜性不會影響其他模組。而乙個模組介面的複雜性就會直接影響到其他模組,繼而會由其他模組反作用於這個介面。很多介面設計是有很嚴格且複雜的介面呼叫規範,或者說呼叫上下文,呼叫場景假設。在實際開發過程中,總不斷有新的功能要求或者效能要求打破這些限制,要求介面設計者不斷地修改或者增添。這種修改增添又會因為要向前相容變得讓人很頭疼。

資訊科技發展這麼多年,也不斷推出新的開發方**,希望能給程式開發找到銀彈,讓程式開發變得簡單高效,開發出的程式變得穩定可靠。 但結論大家都知道,沒有銀彈。對於第2,3項工作,最依賴的還是資深的架構師和經驗豐富的高階軟體開發工程師。在這一點上,資訊系統和其他行業確實有不同, 乙個複雜資訊系統的開發人員結構可能需要是紡錘型的而不是金字塔型的。乙個砌磚的小工不會因為砌磚技術差讓一座鋼骨架大樓倒塌,乙個不成熟的初級程式設計師卻可以隨便創造些越界,記憶體洩露讓乙個資訊系統崩潰。

越來越多的平台,讓我們開發乙個系統在很多方面不需要從零開始。比如訊息中介軟體完成分布式系統的非同步通訊,交易中介軟體幫助實現分布式事務,eai平台完成異構資料的轉換,soa平台實現異構介面的互聯互通,規則引擎完成規則的判斷和推導等等。但這些平台都是業務無關的,不會幫你來做第2,3項的工作,它們只是工具,起到的是筆的功用,寫文章還要作者自己來寫。對於複雜的資訊系統,期待乙個簡單的圖形化的統一開發平台,想拖拖拽拽元件圖示就完成乙個系統是不切實際的幻想。那是一些售前忽悠不懂行的甲方時經常勾畫美好場景,在poc時做些簡單的原型可能還行,當實際開發時這些標榜「不用編碼」的開發平台就會逐步顯示出其無法應付程式系統複雜性的本來面目。

程式的整體複雜性。

現在我們已經討論了什麼是函式和它們的一些基本功能,讓我們來仔細看看它們為什麼有用。為什麼要使用功能?新程式設計師經常會問 我們在 裡面放的 不能直接放在main裡面嗎?在許多情況下 特別是簡單的例子 它可以。然而,功能提供了一些好處,使他們非常有用的非平凡的程式。組織程式越來越複雜,有所有的 都生活...

簡化根本複雜性,消除偶發複雜性

根本複雜性 essential complexity 指的是問題與生俱來的,無法避免的困難。比如,協調全國的空中交通就是乙個 天生的 複雜問題,必須實時跟蹤每架飛機的位置 包括飛行高度 航速 航向和目的地,才能預防空中和地面上的衝突。像天氣驟變這樣的情況會令航班計畫全盤失效,航班時刻表必須適應不斷變...

複雜性思考

複雜性思考 基本資訊 原書名 think complexity 原出版社 o reilly media 譯者 張龍 叢書名 o reilly精品圖書系列 出版社 機械工業出版社 isbn 9787111419990 出版日期 2013 年5月 開本 16開 頁碼 117 版次 1 1 所屬分類 計算...