前幾天,和一位友人熱烈地討論著程式設計者應該閱讀那些經典書籍。我建議了一些程式語言、演算法、設計模式、專案管理的書。突然間,我說,其實我很建議程式設計者讀一些關於電腦科學、程式設計、軟體產業歷史演變的書。友人有點詫異地追問原因,我知道這背後總有一些原因,但究竟是什麼,當時的我無法立即把這原因很簡短,並且清晰地回答出來。

之後,我細細地回想起這段談話,為什麼程式設計者應該多讀一些關於電腦技術領域、軟體產業歷史的書呢?我後來想出了一個屬於自己的答案。
想要更深入掌握技術,就得了解它背後的發展歷史與時代意義
認識歷史,就是認識過去的時代。了解電腦科學技術領域、軟體產業的歷史發展,最大的意義在於幫助我們了解這些技術為何會被發展出來,以及為什麼它們會發展成今日的面貌。所有技術的發展,其背後都有其緣由,以及歷史演變的脈絡。

好的,或許你會問,我只要學習好目前最新的技術,能夠好好地運用它們不就成了?再花時間,回頭去看這些已成往事不復存在的舊玩意,做什麼呢?這些豈不都是多費力氣?或許這世界有太多的人追逐著瑣碎的技術細節,卻還是忽略了這些技術的進化或更迭,總有萬變不離其宗之處。

我們可以說歷史有兩層意義,第一層是歷史的事實,也就是曾經發生過的事情;第二層則是對過去事情的理解,也就是事情為何會如此演變。也許我們談到了電腦科學技術領域、軟體產業的歷史,想到的也僅僅只是曾經發生過的事情,對於這些往事究竟是如何發生的,缺乏更深一層的理解。
舉例來說,有些程式設計者談論物件導向程式語言時,往往會對C++多有所責難。畢竟相較於近期的一些程式語言,C++的諸多設計,都顯得和這時代環境格格不入。

但這終究是忽略了C++的時代意義,還有它當初被發展出來的時空背景。最早的物件導向程式語言,可能是1960年代的Simula或是稍晚1980年代的Smalltalk。即使這麼早就有了物件導向程式語言的觀念,但是,物件導向程式語言開始為世人所接受,成為一個具有普遍性、能夠真正運用於實戰的程式語言,一直都必須等到C++問世之後,方才成為可能。

長久以來,C++被物件導向基本教義派評為不夠純粹的物件導向,回過頭來審視C++昔日所做的一些決定,是有深意的,像是:(1)選擇做為C的超集合,將C兼容於其中,這使得數量龐大的C程式設計者更有意願、也更能被吸引跨入C++的領域之中。(2)在純粹的物件導向與實用的物件導向之間取得一個平衡,雖然犧牲了純粹物件導向所帶來的強大彈性,但是,也因此,C++能允許程式設計者運用物件導向的主要機制來開發軟體,所得的程式在執行時又有著極高的效率。

「效率」二字,就是C++的時代意義。從今天的硬體水準來看,C++的效率在許多情境下無法構成一個吸引人的因素。但是,在當年,因為有了先天設計上將效率視為最高指標的C++,所以才使得這麼多的程式設計者開始接受C++,也因此開始接受物件導向程式設計的觀念,日後也造成了物件導向程式語言的風行,甚至成為最為主流的設計方式。

想要更深入的了解C++,你就必須了解這個時代意義,你才會明白背後有那麼多的設計,其實都是針對效率而考量。或許你會使用模版,接著無可避免地針對模版所衍生的各種問題,產生了抱怨,例如:為什麼C++不採取像Java或C#之類語言中的設計?

但如果你明白模版本身就是一個為了效率而生的機制,所以它用了空間換取時間,保留了靜態特性而損失了動態特性。它或許沒有你需要的一些東西,但它確實很快。

在了解C++之所以成為今日我們所見面貌的歷史緣由之後,有助於我們更了解C++本身,也有助於我們了解C++的後繼者,像Java或C#之類的語言,之所以融入了其他語言特色的方式及原因。

從歷史中歸納出技術發展法則,能幫助我們更快掌握新興技術
歷史除了能幫助我們更了解技術之外,還有一個很大的作用,那便是──歷史多半也都是重複在發生的事情。

最近「雲端計算」這個名詞被炒得火熱,成了當紅炸子雞,儼然成了灸手可熱的新穎技術。很多人當然也就不免開始追逐這項明星技術。

現在的雲端計算,其背後當然搭配了許多新的技術及架構,但如果你仔細察看它的主體精神,基本上還是一種以Thin Client(精簡型的客戶端裝置),透過網路取得更具威力之主機上的計算資源(無論是處理器、網路頻寬、儲存空間……),使得客戶端裝置不需具備強力的計算能力,卻能透過網路獲得雲端上主機的威力加持。

回想歷史,你會想到之前Sun主推的所謂網路電腦,在1990年代末期,Sun以Java為主體,打造出Thin Client的運算環境。倒推到更之前呢?還有一個客戶端更為瘦小的極端例子,也就是大型主機的時代。在那時,每個電腦的使用者,都僅能透過功能薄弱,只能從鍵盤輸入、從畫面接收電腦主機輸出結果的終端機,來和電腦主機進行溝通,而真正具有計算能力的其實是電腦主機。

回頭看看這段歷史的發展,當真驗證了像「天下大勢,分久必合,合久必分」一般的歷史趨勢。

在過去瘋狂打造超級集中化大型主機的時代,有人曾經想設計一個可供全波士頓使用的作業系統(此作業系統名為Multics,有了它的失敗,才有之後的Unix);而在這之後,也有人夢想著每個人家裡桌上,都應該擺著一臺他個人專屬的電腦(這個人的名字叫做Steve Jobs)。時代的鐘擺曾經一度擺盪到,人們相信聚集全世界的個人電腦的計算能力,可以比擬任何一部超級電腦。這種情況發展到極致,便有了所謂點對點(Peer-to-Peer,P2P)的計算模式。

在歷史上,人們對於計算資源究竟應該放置在伺服器端或者客戶端,看法一直在改變,有時把重心放在伺服器端,有時把重心放在客戶端。當客戶端逐漸強大,例如個人電腦強大到足以比擬工作站伺服器時,自然就會有人慢慢將計算重心移到客戶端。接著,分散式計算讓人們建立起另一種型態的「伺服器」端,人們不再期待單一強大的超級運算機器,而是串連起數量可觀的伺服器,成了計算能力更強大的「伺服器」端。當然,這麼一來,大家腦筋又會動到「伺服器」端去。可是,發展成熟的分散式計算技術被應用到客戶端之後,客戶端勢力自然又再度重振。如今,雲端計算的壯大,說明了天平又將再度倒回「伺服器」端。

如果,我們能明白這些發展的歷史,我們便能明白為什麼這個鐘擺會從某一端擺動到另一端,也能明白,為什麼它終將再度擺盪回去。今天雲端計算的Thin Client,像是iPhone、Android平臺的手機,都已經有了1GHz的計算能力,這種計算力都遠勝當年的工作站主機。而雲端上的主機,有許多甚至只是以個人電腦製成的。了解這演變的歷史,你便會明白,即便有各種新技術加入、電腦計算能力也大幅提升,但計算的型態本質上沒有什麼太大的改變,甚至連計算的重心會怎麼移動也都沒有什麼改變,那麼,究竟那種計算型態會成為當時的主要勢力,也就不難推論了。了解這段歷史,你就會明白,雲端計算技術有什麼是和過去相同的,而在舊瓶中究竟又裝了什麼新酒,你對它本質的理解,自然就能又快又準確。

歷史是我們的借鏡,它能幫助我們了解過去,所以才能幫助我們了解現在和未來。

專欄作者

熱門新聞

Advertisement