計算機科學不等于數學
英文原文:Computer Science is Not Math
譯者:姚睿@大隱于微博
一些程序員認為“計算機科學就是數學”。誠然,計算機科學是數學的一個分支學科,而如今我們認為,這種作為計算機科學基礎的分支應當是“理論計算機科學“。如 Alonzo Church 的“λ-演算”和 Alan Turing 的圖靈機,他們為計算機提供了理論基礎。當時,二人都自認為是數學家,并明確地從事數學工作。那么如果計算機科學的基礎是數學,整個計算機科學怎么不是數學?
簡單說來,計算機科學的發展要遠勝于他的純理論根基的發展。人們發明了真實的計算機,它不再只是理論上的機器,這樣一來,人們必須面對復雜麻煩 的設計、實現、編程以及應用,在這些領域的研究同樣屬于計算機科學。我對計算機科學的工作定義是:一切皆是在抽象或實現層面的計算。
我認為數學、計算機科學及其理論基礎之間的關系見下圖:
露營伙伴
與物理學相似,我們也有兩個陣營:理論和實驗。然而這兩大陣營的關系并不像在物理學中的那樣。在物理學中,實驗師的工作通常是驗證理論家提出的理論。如果實驗師走在了理論家前面,即實驗師發現了現有理論無法解釋的結果,理論家就必須提出新的理論來解釋新的實驗結果。
計算機科學中并不存在“我解釋你的結果”和“我檢驗你的理論”的這種關系。所謂的實驗師在這里被稱為系統研究員,當一個理論計算機科學家證明了矩陣乘法的時間復雜度是O(n^2.3727),一個系統研究員就永遠不會得出相悖于這個理論的結果,這位理論家發現了一個數學真相——沒錯,我直白地使用“數學”一詞。
系統研究員所要做的,就是證明這一理論結果雖然看起來很有趣,但真實的系統無法因此受益。我們(我把自己歸為這一陣營)設計和實現新的系統,并從中了解什么是可行的、什么是有用的。
計算機科學理論家和系統研究員并不獨立地工作。我擅長數學和理論,以至于我了解自己什么時候在這兩方面做得不夠好。在曾經參與的一個項目中,為 了解決一個有趣的系統問題,我需要一個復雜的模型,這超出了我的能力范圍。這時跟我一同工作的理論人員就得向我了解信息,例如我們經過可靠測量可以從系統 中得到哪些信息;為了建立模型,還得了解我們的系統能夠提供哪些可靠的信息。雖然各自有著非常不同的任務,但我們都在從事“計算機科學”。
學科點名
身處系統陣營,我對于整個系統(至少)有一種直覺,從了解編譯器將為某一語言的語義生成何種代碼,到操作系統在某一負載下如何工作,以及處理器 本身如何執行。我的研究經常得到雜亂的實證結果。寬泛地說,我對提升軟件性能感興趣,那意味著大量的實驗、大量的結果和解釋。這些過程就不是數學。
也有人并不只是理論家或系統研究員。我給理論和系統之間劃了一道很寬的界線,這樣的劃分并沒有覆蓋整個領域,很多人同時從事理論和系統的工作,也可能有人覺得這兩類都沒有覆蓋自己的工作范圍。當然,這正是我要說的:計算機科學是一個龐大的學科,遠不只是數學。
有大量的計算機科學家,他們跨越了這條鴻溝,我認為這在編程語言中特別普遍。在編程語言的研究中所得出的結論或許是理論的,而同樣的研究人員, 他們能夠證明出某些東西,比如一個類型系統,這些人通常即設計語言,又實現了體現理論成果的編譯器。總之,理論和系統研究之間的界線并不像在物理學中那樣 清晰。
第二個例子:網絡。TCP 擁塞避免算法所負責的部分毫無疑問屬于算機科學。也有大量數學推理致力于設計和理解這些算法,然而一切如何實際運轉才是真正重要的。這些算法正是設計、實驗以及結果解釋不斷反復再反復的結果。
若有人簡單的認為“計算機科學就是數學”,他們就傷害了這個學科中真心不屬于數學的那些領域。我們確實是一直在使用數學推理,但所有的科學和工程都這么做。數學是所有實證學科的共同語言,但他們并不都講同樣的故事。
除了編程語言和網絡,計算機科學還包括操作系統、數據庫、人工智能、文件系統和存儲系統、處理器設計、圖形學、調度學、分布式并行系統等,我無法一一列舉,幸而有人這樣做了。所有這些領域都不同程度地“使用”數學,甚至有些還產生了理論性非常強的子領域。盡管我同意這其中的一些領域的理論基礎可以說是數學。比如,關系代數是數學,同時也是關系型數據庫的理論基礎。但如果斷章取義地說“數據庫就是數學”,那就忽略了所有系統層面上的設計和實現,而這些才是使真正的數據庫存于世的原因。
科學!
要探討計算機科學的特點,就不能忽略顯而易見的事實。它是科學嗎?我不會去討論這個,并非沒有這個興趣,實在是因為有人已經比我做的好了。Cristina Videira Lopes 在她的一篇出色的論文中涉及了這個主題,我從文章中也了解到 Stefan Hanenberg 的一篇論文中有類似的主題。在這個問題上我想說的一切都是源自他們的觀點。
良好初衷
那些聲稱“計算機科學就是數學”的人通常初衷都是好的,但他們一般認為計算機科學僅僅是編程,這當然不對。任何曾經指導過新手程序員的人都知道,向新手解釋那些偶然的復雜性下面所蘊藏的根本性的東西是多么困難。
把整個計算機科學的所有學科都稱為“數學”過于簡單粗暴。與數學相關、根基是數學,這是不錯——但是,稍等,把計算機的理論基礎同設計以及實現本身分為一類,仍然言之有義。這就是計算機科學。
<span id="shareA4" class="fl"> </span>