選單

遠離了刀耕火種,我們是否找到新的銀彈?——軟體與軟體工程現狀反思

遠離了刀耕火種,我們是否找到新的銀彈?——軟體與軟體工程現狀反思

軟體和軟體工程是計算機科學技術恆久的主題,不論資訊科技怎麼發展,網際網路形態如何演變,都繞不開這個關鍵核心的事物。在業界開發者的群體中,人們習慣用“銀彈”一詞來比喻解決軟體領域有共識且客觀存在的顯著問題的方法,軟體史上最著名的銀彈問題則源於經典之作《人月神話》一書。

上世紀70年代IBM System/360作業系統之父佛瑞德 布魯克斯其所著的《人月神話》一作系統性地解說了軟體工程、專案管理相關課題,書中透過計算、案例來證明軟體開發額外人力的投入無益於軟體工程生產力的提高,作者在之後的章節中追加了《沒有銀彈》一文,並作出了沒有任何一項技術或方法可使軟體工程的生產力在十年內提高十倍的假設。但是,這個假設在1990年代中期已被認為不再成立。

其實,銀彈問題的起源還可以追溯到軟體危機。軟體危機主要發生在那些開發週期長、費用昂貴、質量控制難以保證、生產率低下的大型軟體系統,它們的複雜性已遠超出人的智力範疇,大型軟體系統不能沿襲工作室的開發方式,就像製造小木船的方法不能生產航空母艦一樣。這種大型專案常伴高風險,一直到1980年代面向物件技術才解決了一部分在軟體危機上的窘境。

Linux不是銀彈,Git也不是

第一次銀彈問題的削弱出現在1990年代中後期,因為開發者普遍感覺到軟體工程生產力較十年前提升了十數倍,儘管他們依舊習慣於“沒有銀彈”的說法。那麼第一枚銀彈是誰?在那個時間點上很容易聯想到Linux。

但眾所周知的是,Linux本身不可能是銀彈,而重點是,它是世界上最龐大的開源軟體的軟體工程。基於這一點,Linux生態的開發者們有足夠多的時間和理由去試錯,《大教堂和市集》的作者埃裡克 雷蒙德提出林納斯定律:足夠多的眼睛,就能讓所有問題浮現。這句話非常契合那個時期,在Linux快速發展的時間裡,面向物件、高階語言、統一開發環境、專家系統、人工智慧,這些更接近“銀色子彈”的事物隨之伴生。這些技術的目的是讓具體應用的複雜程度與程式本身相分離,Git也是其中之一。

版本控制是軟體專案管理的重要一環,也是追求效率的主要改進方向,畢竟軟體工程少不了溝通和協作。Git並非一開始就流行於世,在其之前還有BitKeeper和Monotone,甚至更早的CVS。Git作為BitKeeper的開源替代品被林納斯 託瓦茲開發出來,此後一大批支援Git原始碼訪問的分散式版本控制網站(原始碼託管平臺)拔地而起,其中最大的擁有超過4000萬註冊使用者和1。9億程式碼庫。

Git也不是銀彈,因為工具本身帶來的提效和縮短開發進度,並沒有解決軟體工程的本質性難題,即如何從抽象性問題發展出具體概念上的解決方案。但這些年來湧現出來的工具和方法論,都可以看成是接近銀彈的事物。

遠離了刀耕火種,我們是否找到新的銀彈?——軟體與軟體工程現狀反思

刀耕火種的遠去和新的銀彈問題

現在的軟體和軟體工程領域,早已遠離了刀耕火種的年代,擺在我們面前的是模組化的高階程式語言、高度整合的環境,各種庫、各種框架,彈性計算帶來的流水線和自動化工具,我們正處在一個“敏捷”的時代。儘管在軟體工程生產力得到較高程度解放的今天,開發者們已不太關心當初的那個銀彈問題,但是我們卻面臨著新的問題,這迫使人們去尋找新的銀彈。

軟體工程自動化帶來的結果就是高頻迭代,但是創新大幅減少,99%的程式設計師在實現需求,只有不到1%的程式設計師在創造工具和方法。但我們認為這也是技術程序的一個必經階段,需求爆炸要求自動化,自動化帶來DevOps,DevOps造成分工更加精細化,乃至CI/CD管道部署,一個高度自動化流水線已然在軟體工程領域形成。

程式設計師的精細化分工造成綜合素質整體下滑,至少過去20年都是如此。當代程式設計師很少去研究彙編和機器語言,因為這完全沒有必要,現在的開發環境是建立在“高度文明”之上的,絕大多數開發者只需關注邏輯的實現,底層世界與之無關。但是數字文明的底層世界是C語言,再下面是組合語言和機器語言,這也是回溯技術程序的事實,現在的“高度文明”不可能是空中樓閣。

高度自動化讓程式設計師看起來更像是流水線上的零部件,而不是一個創作者。殊不知人類智慧最偉大的地方並非只有邏輯思維,更多的是創造思維。肯 湯普遜和丹尼斯 裡奇為了使開發UNIX更高效設計了C語言;林納斯為了更好地管理Linux核心開發了Git。許許多多的工具一開始也許只是因為一個小目的被創造出來,但是它們後來逐漸成了開發者世界的大器。數字文明會否出現斷層是一個警惕性問題,也許過去20年我們失去的,才是今後我們想要的銀彈。

遠離了刀耕火種,我們是否找到新的銀彈?——軟體與軟體工程現狀反思

最後

之前9月的時候,曾有訊息曝出林納斯怒噴某程式碼託管平臺“合成了一堆無用的垃圾”一事,儘管林納斯並非因平臺本身或者其他專案的粗糙而惱火,而是為即將用於Linux Kernel 5。15的一個驅動程式的合併感到不滿。此事也折射出社會化程式設計也不是銀彈。

銀彈問題總是關乎程式設計師、組織和需求的問題,它們一直在變化。有位“謙遜的程式設計師”曾經說得好:軟體危機的主要原因,毫不客氣地說,在沒有機器的時候,程式設計根本不是問題;當我們有了電腦,程式設計開始變成問題;而現在我們有巨大的電腦,程式設計就成了一個巨大的問題。

文/陳徐毅 高階工程師,科技專欄作者,中國計算機學會會員。

本文刊發於《中關村》第220期