軟件搆造的復雜性

今天在arXiv讀到一篇有趣的文章《軟件圖與程序員意識》(Software graphs and programmer awareness)。作者探討的是程序不同模塊間相互依賴搆成的圖的統計性質。作者試圖從微觀的程序員開發行為來闡釋程序的宏觀統計性質。

今天在arXiv讀到一篇有趣的文章《軟件圖與程序員意識》(Software graphs and programmer awareness)。作者探討的是程序不同模塊間相互依賴搆成的圖的統計性質。作者試圖從微觀的程序員開發行為來闡釋程序的宏觀統計性質。

以前,我曾經做過一個統計,計量一些關鍵性系統模塊的復雜性。當時寫到:

硬件的飛速發展,網絡的出現,人機交互方式的變化正劇烈的改變着軟件產業的形態。那么影響軟件產業形態的因素有什么呢?從某一個視角來看,復雜性和經濟學是影響軟件產業形態的重要因素。

軟件搆造是一個非常復雜的過程。由于經濟學的原因,在攻克軟件搆造的復雜性過程中,發生了系統程序和應用程序的裂解,于是軟件產業也隨之分化成了不同的行業。在分化過程中值得注意的是一些關鍵性的系統,它們居于核心的,具有某種平台性質。比如操作系統內核、桌面系統、瀏覽器、Web服務器、數據庫服務器。

寫了一個小程序測試了一些系統的源程序行數,想看看現在的關鍵性系統究竟有多復雜。測試結果如下:

  • openoffice-1.0.2 3786802
  • linux-2.4.20 2964125
  • mozilla 2459987
  • sapdb 711151 (script for system tables not include)
  • j2sdk1.4.0 486376
  • amaya 7.2 452057
  • mysql 428500*
  • gcc-2.7.2.2 331209
  • lesstif-0.93.40 323526
  • httpd-2.0.44 297110
  • jfc 210022
  • HotSpot JVM 1.1 119093
  • javatool 101041 (estimated from bytecode)
  • hurd-0.2 97674
  • jigsaw 96061
  • berkleydb-3.2.9 86862
  • aspectj-1.0.6 84405
  • tomcat-4.1.10 64495
  • libwww 61347
  • zlib-1.1.4 9388

從上面的結果,我們可以看到:

  • 一個實用的基本的開發環境(編譯、調試、庫等)的代碼量應該在 100~500 kloc 附近,才有可能被廣泛使用。
  • 復雜的應用需要有 ~1 mloc 級別的代碼量。
  • 一台良好工作的 PC 所必須的支持軟件大致需要有 ~10 mloc 級別的代碼量。

今天再把當年的舊文翻出來,只是覺得這是一個可以繼續深究下去的課題。

從程序設計語言的角度看,一個程序設計語言可以通過其基礎的語言搆造來獲得普遍的計算能力,這解決了可計算性的問題,僅僅是第一步,后繼而來的是復雜性和經濟學的問題。在語言這個層次上,我們可以看到函數、類、模塊、包等分層,以及對分別編譯的支持,這是用抽象、分治、復用的手段解決復雜性。

除了這些手段,還有沒有其他的方法?我能想到的,還有meta-programming和combinator兩種途徑的DSL,以及generic programming。這些也是某種語言層次上的方法,但大的思路依然是抽象、分治、復用。

One thought on “軟件搆造的復雜性

发表评论

电子邮件地址不会被公开。 必填项已用*标注