第1章
序曲:從古到今話計算
我們人類對計算的需要,可能起源于逐漸開始積累物質財產這個大的背景。這樣的需要很快演變成為我們需要記錄家庭或部落所擁有的財產,比如多少頭牛和羊,等等。一旦可以做簡單的加減法,與之相關的“記錄信息的需要”也隨之而來,有了記錄,信息保存的時間可以更長,而且還可以分享給其他的人。早期用來記錄信息的載體是鵝卵石或實物,但發展到后來,人們發現可以用符號來代替。
人類不斷進化并開始以部落的方式定居之后,產生了其他的需要,比如需要測量磚瓦的尺寸和標定地界。一旦有空閑時間,我們人類又在好奇心的驅使下想要計算時空的距離和恒星的位置。
很快,與計算有關的活兒被視為是一種繁重而乏味的體力活兒。于是,很快出現了可以幫助提高計算速度的機械裝置。算盤是第一個具有開創性的計算器。
最后,不同的決策支持工具先后問世。對快速計算、永久性數據存儲和復雜決策的需要是最終啟發我們人類設計和開發計算機及相關軟件的關鍵因素。
人類對計算的需要
這樣一本講軟件工程和計算機發展史的書,不應該開門見山就直接從某個具體的時間(比如1930年)開始。沒錯,數字計算機和軟件設計的確是1930年到1939年之間才首次明確提出來的,但它們的出現實際上離不開歷史上幾千年以來的許多發明。
古往今來,人類對計算有不同形式和類型的需要。當然,更需要以固定格式來保存計算結果。
還有一種不太容易明確的需要是對不同的選項進行邏輯分析。一個典型的例子是產品的市場化是走平穩的長線還是走快而陡峭的短線。再比如,某塊特定的土地最適合種植哪一種農作物?
更重要的決策還有某個部落是否應該對另一個部落發動戰爭。在今天,有些決策關系到健康,甚至生死攸關,比如,對付抗藥性肺結核這一類大病,究竟用什么療法才最有效?
再有就是影響到經濟發展的決策。一個典型的例子是共和黨與民主黨。哪些選擇對美國經濟最有利,雙方的觀點截然不同。
要在不同的對立選項之間做出選擇,雖然不可能雙方都對,但雙方顯然都有可能選錯。(也可能有其他更好的選擇或壓根兒就沒有什么更好的選擇)通過對民主黨與共和黨的辯論進行分析,我們發現雙方貌似都是錯的,而且,無論采取哪個黨派的執政路線,最后都可能不利于美國經濟健康發展。
在計算機或軟件設計專業人員看來,建一個強大的數學模型來比較提高稅收(民主黨目標)、減少開支(共和黨目標)或兼顧兩者所造成的經濟影響,應該不是特別困難吧。
然而,民主黨與共和黨都沒有用真實的財政模型來展開理性的辯論,而是停留在巧言辭令的層面,沒有任何實質性的信息或論據來支撐自己的論斷。共和黨與民主黨的演講簡直讓人大跌眼鏡,雙方都在極其能事指責對方,但都拿不出什么確鑿可信的數據。
這類問題在美國很多州和市也發生過。比如,2012年美國大選前,羅德島州議會通過一項不明智的決議,每個投票站的選民人數提高一倍,目的是使投票站的數量減半。
這個愚蠢的決定造成一個不可避免的后果,選民必須排成長隊,足足等上四個小時才能投票,有些投票站甚至還得開放到深夜。
這個問題并不是特別復雜。每個投票站每小時的人流量在很多年前就是知道的。但羅德島州議會疏忽了對投票站減半后之于選民等待時間的影響進行充分而必要的計算。
結果,2012年大選中,羅德島州很多選民等不起四個小時,有的甚至沒有投票就直接走人。他們的選舉權被這個“腦殘”議會所通過的愚蠢決議給剝奪了。議會的這項決議太差勁兒了,在沒有對投票站減半對投票時間的影響進行建模之前,絕對不應該予以通過。
今天,政府出臺的法律是否明智,頒布的法規有沒有經過大腦,其決策影響評估都可以用計算機和軟件輕松算出來,甚至還能夠從根源上消除可能出臺類似愚蠢決議的任何想法。
事實上,古往今來,人類一直都在運用數學知識做出邏輯選擇,記錄數據和信息,在這樣的大背景下演繹出軟件和計算機的發展歷程。下面幾個問題與軟件和計算機的發展史緊密相關:
* 我們用的是什么類型的計算?
* 我們需要保存什么類型的信息或數據?
* 對于需要長期保留的信息,哪些存儲方法最合適?
* 面對復雜的選項或決策,哪些分析方法對我們有幫助?
* 在進行數據與知識的交流時,有哪些最佳方法?
穿越古今,從大歷史觀的角度來考慮這五個問題,縱覽計算機和軟件逐步用于解決這些問題的過程,是非常有意思的。
對數字序列的早期認識
說起來,我們人類可能是先學會說話,后來才慢慢開始學會數數的,至少可以數手指頭,從1數到10。早在3.5萬年以前,尼安徳特人①和克羅馬農人②可能就會數數,有考古發現為證:捷克斯洛伐克距今3.3萬年的狼骨和非洲距今3.5萬年的狒狒骨,上面都有并排的劃痕。
這些劃痕記錄的是過去了多少天,還是多少件物品,或只是單純記錄過去了多少時間,我們對此不得而知。狼骨最有意思,因為上面的55個劃痕被分成5組,很有可能是用來記錄物品或時間的。
考古還發現,距今5萬年的乳齒象象牙上有16個孔,這些孔的用途也是個未解之謎。尼安德特人和克羅馬農人在公元前4.3萬年~公元前3萬年之間融合,所以這些飾品可能來自其中任何一方,也可能來自同時代但現在已經滅絕的其他部落。
有趣的是,雖然現代人額前葉更寬、更高,但尼安德特人和克羅馬農人的頭顱和腦容量都略大于現代人。雖然腦容量與智力水平并不直接相關,但確實可以表明很早以前就存在某種形式的抽象和推理。巖洞壁畫的歷史可以追溯到4萬年以前,這說明人類在當時至少已具備某種形式的抽象能力。
除了計算物品和財產,對時間流逝保留類似的跟蹤記錄也十分重要。對于年,人類有主觀的了解可能是距今1萬年前的事。隨著1萬年前農業時代的到來,了解特定農作物的種植時間和收割時間對糧食生產有很大的幫助。
目前已知的第一批人類定居點是公元前7000年土耳其的加泰土丘。這個泥磚構造的小鎮大概有幾百個居民。考古人員在此發現了農業時代的小麥、大麥和豌豆。肉類食品來自牛和其他野生動物。
箭頭、錘頭、陶器、銅和鉛等考古發現表明這里發生過某些形式的交易。如果沒有物品記錄方法,交易是很難實現的。此外還有許多壁畫,或許可以說明人們對藝術有興趣。
早期人類對數學的認知可能來源于幾個關鍵問題。
* 史前的數字和數學知識
通過計算物品來記錄主權(所有權)
理解加法和減法兩種基本運算
測量角度,比如東向或西向,以免迷路
計算時節,用來輔助農業生產
計算日常時間,用來協調集體活動
* 早期文明后出現的數學和數學知識
為建筑用途而計算實際的長寬高
為交換物品而計算重量和體積
計算長途距離,比如兩個城市之間
計算山體的高度以及太陽高出地平線的位置
理解乘除法數學運算
* 牧師或巫師傳授的數字或數學知識
計算天文時間,比如日食,比如恒星的運行位置
測量運動物體的速度
測量曲線、圓和不規則的多邊形
測量加速度等變化率
測量音速和光速等不可見的物理現象
* 數學家提出并發展起來的數字和數學知識
對博弈和賭博中的概率進行分析
理解抽象概念,比如0和負數
理解復利等復雜問題
理解非常復雜的問題,比如無限性和不確定性
理解抽象概念,比如無理數及量子的不確定性原理
經過仔細觀察,借助于石頭或劃痕以及用來測量長度的木棒,史前的數字和數學知識很容易理解和掌握。加減法的演示也很容易,從一堆石頭中簡單增減石頭即可。
早期文明中,為了了解數字和數學知識,需要物理設備與抽象推理相結合。顯然,有些刻度尺用來稱重,有些角度計算器用來測量山體高度。有些記錄方法用來跟蹤系列事件,例如長時間觀測和記錄恒星在空中的位移。
來自祭司或巫師的數字和數學知識,結合了抽象推理、精準計時、精準實測,讓人清楚認識到數學所代表的東西是看不見、摸不到或不能直接測量的。這就要求有人花時間做智力研究,不再像以前那樣繼續從事農耕或狩獵。
數學家提出并發展起來的數字和數學知識,可能是促成計算設備以及計算機和軟件最終問世的主要原因。要求對以前的事物有系統化的認知,同時還要結合精準的測量以及對數學推導有強烈的求知欲。這些知識可能起源于數學素養良好并可以在新的方向以創造性思維擴展早期數學概念的人。
考古發現,古城摩亨朱-達羅③曾經有過復雜的數學運用。事實上,天平秤和稱重計就是在這里發現的。
古城摩亨朱-達羅在巔峰時期可能有3.5萬居民。它的街道布局為緊湊的網格狀,磚和建筑物都有標準的尺寸,顯示出重復使用的跡象。顯然,這些都是需要精確測量的。
摩亨朱-達羅和印度北部城市哈拉帕在建筑風格上很相似,表明古印度曾經有過中央機關。兩個古城都發現過一大批描有動物圖像和符號的石版,只不過其含義目前還無法破譯。有些石版的封泥時期甚至可以追溯到公元前3300年。
其他古代文明也發展了計數、算術以及長度、重量和尺度單位。埃及和巴比倫在公元前2000年就有算術。
隨著城市成為定居點并逐漸擴大,人們的閑暇時間也增多,出現了非體力勞動和狩獵的職業。這些職業不依賴于體力,毫無疑問,牧師和巫師就屬于這一類。他們的時間從生存和覓食中脫離出來之后,開始進一步理解以更多形式出現的數學知識。
長期跟蹤恒星的運行軌跡,測量更遠的距離,如不同村莊的產權邊界和距離,測量船只的航行軌跡和位移,這些都需要更復雜的數學計算,需要精確測量角度和時間段的變化。造船業的到來,還需要更高深的數學知識,因為船體必須要能彎曲,單是直線測量還不夠。
在河里或海邊蕩舟或劃船,不需要太多或根本不需要用到任何數學知識。但是,一旦駛入大海開始遠航,就必須認識星座,以免迷失方向。
由于大陸漂移的原因,澳大利亞遠離其他所有大陸,沒有陸橋在任何位置與它連接。然而,大約距今4萬年前,就有人類在此定居,顯然是通過長途遠洋航行過去的。波利尼西亞群島和復活節島也遠離所有大陸,但幾千年前也有人類定居,這說明人們對星座有早期認識,也用到過某些數學知識。
埃及、美索不達米亞、中國、印度和南美等很多古文明很快就積累了相當復雜的數學知識。這些數學知識往往都與基本功扎實的專業人員有關。
大家都知道,許多古文明,如中國、蘇美爾人、巴比倫人、埃及人、希臘人,都在兒童教育上投入了大量時間和精力。但很多人不知道,印度、中美洲和南美洲其實也曾經大力提供類似的訓練,比如奧爾梅克人、瑪雅人、印加人以及后來的阿茲特克人。
日本也有正規的培養體系。針對上層階級,日本的培養體系既包括兵器的運用,也包括智力教育,比如閱讀、寫作和數學。所有這些古文明都建立了正規的兒童培養體系和信息記錄方法。
印度北部那蘭陀大學④大約建立于公元前472年,后來一直持續到大約12世紀。公元500年左右,這所大學的招生規模達到頂峰。這是古代人員規模最大的大學之一,有1萬多名來自亞洲及世界各地的學生,教職人員2000多名。它是世界上第一批開展數學、物理、醫學、天文和外語教育的大學。
那蘭陀大學曾經有一個活躍的翻譯團隊,他們把梵語和印度語的文獻翻譯成了多種其他語言。事實上,那蘭陀大學圖書館在12世紀穆斯林入侵印度時被毀于一旦,關于那蘭陀大學的許多信息都來自中國保存下來的中文翻譯文獻。據說圖書館規模很大,大火一直持續了六個星期。
即使與希臘和羅馬相比,印度的學者也很先進。零的概念和對星座的認識都早于歐洲(美洲中部奧爾梅克人對零的了解和運用也早于希臘人)。
在古代,每1000個人中超過950人是文盲或只會簡單的計數和簡單的測量。然而,有極少數人有能力學會更復雜的計算,天文、建房搭橋、導航和造船等行業的發展需要用到這些數學知識。
那些為數學發展提供原動力的發明
自從開始知道計數和數字概念,使用數字化信息的人就飽受困擾,因為總是需要運算速度更快、結果更可靠(相較于不借助于任何設備的人腦)。為了理解計算機和軟件的重要性,我們有必要先了解早期人類為提高計算性能而做出的許多嘗試。
同時,更有必要思考計算機和軟件的真實作用及價值。各種計算裝置為人類思維能力提供的服務包括但不限于:
* 加減乘除基本運算
* 科學數學,包括功率、正弦和余弦等
* 金融數學,包括單利、復利和利率等投資回報率
* 邏輯計算,比如不同替代方案的路徑和選擇
* 時間、距離、高度和速度的計算
* 從大量分散信息的集合中推導收斂,得出有用的歸納和總結
* 演繹邏輯,從規律中得出結論
在為寫本章內容而展開調研時,我從網上搜到大量有趣、有用的資源。比如,IBM制作了一個圖解數學史,甚至還可以下載到iPad上看。⑤維基百科和其他網站資源也有數十個計算機硬件史以及多個軟件發展史。現在全球各地已經有十多個計算機博物館,比如英國的倫敦科學博物館,就陳列了一個還可以正常使用的巴貝奇分析機。
本書將綜合介紹六大發明,它們彼此促進,最后相互關聯并促成了現代軟件的誕生。
在這六大發明中,排在第一位的是數學。計算設備、計算機和軟件的初衷都是為了加快數值計算。數學運算大概是從加減運算開始,而后才引入乘除運算。再之后,出現其他更多更抽象的運算形式,比如幾何、三角、代數和微積分等。
第二種形式的發明是記下想法和信息,以便于分享、傳播和長期保管。這類發明包括寫入系統和物理存儲設備。針對寫下的數據,存儲方式包括石板、泥版、紙莎草、動物皮、紙以及最后出現的磁存儲和光存儲。存儲位置包括手稿、書籍、圖書館以及最后出現的數據庫和云存儲。
第三種形式的發明是物理計算設備,用于協助人類學者進行(比單憑人的腦力和體力)更快、更準確的計算。常用數值表是第一個用來加快計算速度的方法。物理設備包括算盤、量角器、星盤、測量設備、機械計算器、計算尺、模擬計算機和最后出現的電子數字計算機。
第四種形式的發明是信息發行渠道。毫無疑問,第一種渠道是口頭傳播,讓學生或學徒記下來。但不久之后,出現了信息的傳遞,包括石頭和骨頭上的劃痕,泥版上留下的記號,最后出現的象形文字、表意文字(比如漢字這樣的方塊字)和最后的字母表。
第五種形式的發明是軟件。這是最近出現的,2013年所用的所有軟件使用年限都不到50年,50%以上的軟件使用年限可能還不到20年。
第六種形式的發明是間接發明。這些催生發明的發明雖然與計算機或軟件不直接相關,但有助于促成發明本身的問世。這些激發新發明的發明中,一個是專利系統,另一個不容忽視的是塑料。