這些並不是計算機科學

原文地址:這些並不是計算機科學


*本文由IDF實驗室志願者童進翻譯,章典校驗,原文《What Computer Science Isn’t》由匿名作者撰寫。

免責聲明:我希望這篇文章能清晰的表達我的意圖。我絕不是來宣稱編程、軟件工程、測試、質量管理以及其他實際工作或相關領域沒有計算機科學重要。這些高度相關的學科絕對與計算機科學一樣重要和有用。相反,我想表達的是,對於計算機科學應該包含什麼存在着普遍的誤解,這種誤解在很大程度上是大衆流行文化的產物和普遍的錯誤認識根深蒂固的結果;特別是構成計算機科學基礎的深厚理論核心不能也不應該被忽視。此外,儘管事實上許多學生(包括我上學時)在學習時不能充分理解這個理論,但這完全與其它更注重實踐的知識一樣重要。

此外,我也並不是想說:不是可計算性理論或複雜性理論的計算機科學領域不是真的計算機科學、完全沒有趣味或不值得研究。但是,我真心想指出:人們在幾乎所有計算機科學分支上所做的工作組成了”嚴格意義上的計算機科學”,其他的則是別的領域了。這並不意味着,這些人不是真正的計算機科學家,或在其它領域所做的工作並不重要。例如,我做計算生物學方面的研究。我每天工作的一部分會是計算機科學,一部分是軟件設計和編程,一部分是生物學,其中有很多是統計學或其他數學的分支。這些其他工作與我所從事的計算機科學一樣有趣、充實和重要,他們只是不屬於計算機科學而已。在下面的文章中,我不是要冒犯計算機科學或其它領域的任何人,而是想幫忙澄清公衆對計算機科學的誤解。

我原本打算將這篇文章的標題定爲“什麼是計算機科學?”但是給文章起這樣一個標題,感覺更像是一本書或者至少是一份聲明,而不像一篇博客。相反,我意識到,關於什麼不是計算機科學——特別是人們通常錯誤的與計算機科學混爲一團的東西,我是可以寫一篇合適篇幅的文章(或者幾篇)的。

這裏有兩個領域是大家經常和計算機科學混淆的,而且是最普遍。第一個(這在家裏經常碰到,如果你是計算機科學家,而你有家人不是)就是“技術支持”。例如,人們認爲計算機科學是學習特定計算機或軟件是如何工作的,以及當它們損壞時如何修理的。因爲,事實很可能是:一個典型計算機科學家安裝打印機驅動程序可能比一個典型的外行人更順利,但這與他們在計算機科學方面的正規教育沒有任何關係,更多的是因爲他們(通常是這樣,但並不總是)花了大量的時間與電腦打交道。

然而,將技術支持與計算機科學混爲一團雖然很普遍,但並不有趣。特別是它們如此不同,應該很容易清除這種混淆;可能需要一些類比的幫助。有兩個很好的例子(一般是對的,但是對於Edgar Dijkstra來說可能不正確),真的是直奔問題的本質:

“計算機科學不是計算機,就與天文學不是望遠鏡一樣。計算機科學的本質和數學是一樣的。”

————Michael R. Fellows (1991) “小學中的計算機科學和數學”

以及

“我們想讓我們的孩子們————未來的民衆————在學校裏學習計算機科學的什麼知識呢?我們需要消除計算機科學就是計算機的謊言。與天文學關於望遠鏡、生物關於顯微鏡、化學關於燒杯和試管一樣,計算機科學不是關於電腦的。科學不是一門研究工具的學問,科學研究的是如何運用工具,並研究當我們利用工具時能有什麼發現。”

————Micheal R. Fellows, Ian Parberry (1993)

“SIGACT(美國計算機協會算法和計算理論特別興趣小組)讓兒童對計算機科學感興趣”.

發表於1993年1月的Computing Research News

好了,言外之意就是:總的來說與天文學(或天體物理學)不是望遠鏡一樣,計算機科學不是電腦或“工具”。你也許會猜測一個天體物理學家對望遠鏡的瞭解比一個館員更多,這僅僅因爲他們可能會更頻繁地使用它們。但是,他們所做事情的核心與使用望遠鏡本身沒有任何關係。計算機科學家和電腦的關係同樣如此。

另一件人們通常與計算機科學混爲一團的事情是計算機編程(CP),這個需要更細緻的區別。這個誤解更難糾正,因爲絕大多數的計算機科學家會編程。事實上,他們中的許多人經常編程。然而,編程自身並不構成計算機科學。讓我用一件事來引出這個區別。

我的指導教授本學期教學時開設了一門新課,叫做“算法與數據結構(針對科學工作者)”。課程的名字應當相當明確的表明教學目的:這個課程的目的是教科學工作者(如技術主管和數學能力強的(研究生)學生)如何理解、開發和分析算法和數據結構。隨着計算機技術在不同的科學領域內變得更加流行,對計算機專家的需求不斷增加,因此也需要其它領域的科學家對所採用的計算機技術有一個基本理解。所以有很多人對這個課程感興趣,許多人報了名。

我的一位已經完成了大約3/4課程的助教朋友在午餐談論中向我提及:學習該課程的很多同學對缺乏編程作業表示擔心和困惑。現在的情況是,原來課程教學大綱明確規定課程本身將包括少量的編程作業(大約2次作業),取而代之的是大量的書面作業。而且很明顯,課程主要是關於算法的設計和分析——目標是在課程結束後,學生應該能夠設計高效的算法以解決他們遇到的問題,並能分析(如證明)這些算法的正確性、描述運行時間。然而,儘管事實上該課程的內容和目標描述得很清晰,我們仍能理解學生的困惑。特別是,那些自身並不是計算機科學家的人(如其它領域的科學家),對計算機科學家就是程序員,計算機科學是編程的想法已經深入人心。

補充說明:爲了不歪曲上面的課程或我的看法,我要對上文進行如下澄清:我不會主張學習這門課的人不要去實現算法。事實上,他應該去實現,學生們應該被鼓勵這樣做。由於人們對“算法設計與分析”的普遍誤解,人們報名課程所能學到的東西不同於他們當初預期學習到的東西(也不同於算法設計與分析)這種情況是可以很常見的。構建最短路徑算法,並且用大量例子測試驗證計算的最短路徑是很有效的,它會幫助你理解這個算法。然而,這並不能正式的證明算法的正確性,對正確性的證明與實現一樣也很重要。這就是我想在這裏說明的:並不是實踐不重要(其實他們是極其最重要的),同時理論也不是愚蠢的、迂腐的浪費時間,而是它們自身都是很重要(值得研究)的。此外,課程本身包含編程作業。然而,從作業的量和重點來講,編程作業沒有其他書面作業那麼多。

撇開與計算的理論基礎之間的關聯,真正的編程語言與計算機科學幾乎沒什麼關係,就像天文望遠鏡和天文學的關係一樣。編程語言非常重要,他們的執行速度、表示形式和特性使得構建高效和可擴展的軟件會有很大的不同。然而,從計算機科學正確性的角度看,Haskell和BrainF&K是等價的;他們是圖靈完備的語言,有能力執行相同的一組計算 *(見下文)。然而,算法作爲設計對象和完成特定實現是不一樣的。這個認識是理解計算機編程與計算機科學不同的基礎。計算機科學是數學:它是研究什麼是可計算、什麼是有效計算的科學,它是關於有效計算過程的設計和分析。無需瞭解源代碼的特徵便可以設計一個算法、證明其正確性、描述它的運行時間,所有這些工作在計算機科學領域都十分吻合,而且都不需要(或掌握)一點編程。現在,爲了使設計的算法有用,我們必須實現它,不僅要考慮理論,還要考慮實際因數(例如算法是理論有效的或實際有效?對於現實世界的數據,爲了使實施可行,需要做怎樣的設計和工程決策?等等)。

所以,儘管編程與隨後的程序執行是極爲重要的,儘管它們對於大部分計算機科學研究貢獻很多,但是這些工作本身不是嚴格意義上的計算機科學。也許這裏我們還能用另一個比喻。計算機科學中的算法設計與分析可能類似於發現伯努利原理(把關於發明與發現的重大哲學討論放一邊),而工程和算法的高效實現(計算機編程)則類似於在這個原理上構建一個機翼。它不是一個很好的比喻(肯定不及望遠鏡的例子好),但它確實講述了相互關聯但卻有千差萬別的計算機科學學科與計算機編程之間的重要差異。

不幸的是,我不認爲這種混淆會很快消失,因爲計算機科學本身就在他們的課堂上繼續更嚴重的混淆計算機科學和計算機編程。這種混淆本身並不壞。事實上,沒有設計和構造軟件(計算機編程工作)能力的計算機科學專業的畢業生,和有這種能力的相比,被僱用的機會少得多,儘管也許更多的人在讀研究生期間會繼續做理論工作。然而,這兩個學科間的混淆確實使他們間的差別更加難以區分,並且它使得向其它領域的人解釋計算機科學是什麼、關於什麼變得更加困難(例如它不是關於Python、Matlab或一般的編程)。我不知道如何解決這個問題,但我知道它存在而且看起來不會很快消失。

*gasche在Reddit的帖子引用本博客的鏈接,原文並不能傳達我的實際意圖。雖然Haskell和BrainF&* K從可計算性理論的角度來看是等價的,並且它們都體現了圖靈完備的計算模型,但對於它們間事實存在的的理論差別並不能視而不見。請注意,不論如何,給你一個BrainF&* K解釋器,你可以寫出Haskell的編譯器(用其它的方法也可以做——參考這裏)。很明顯,在它們之間存在着現實差別,但正因爲此才把這兩個例子擺在第一位。我希望在算法和算法實現的不同之間領悟到的,就正如Landau(大O)所言,其核心思想gasche在Reddit上解釋得相當不錯:

這裏傳達的想法是:

儘管一個給定的程序在不同的機器上或用不同的編譯器,其執行速率可能要快十倍,我們決定把這些細節抽象出來,並觀察在大量輸入時的執行性能,這樣就能排除機器性能和其它技術的影響,給出結論。(當然,有時你在工作時想做更加精確的分析,採用科學的方法做更少的近似估算,如用改良的抽象機器模型做無緩存算法)。

所以論點是,算法描述了進行計算的過程,在很大程度上它獨立於任何特定的語言(語義形式),適用於廣泛的計算模型。算法的設計和分析直接處理解決方案的可計算性和高效性(漸進性)問題。顯然,運用算法來解決現實世界中的問題,具體實現和實現的特性是極爲重要的。然而,算法的設計和分析可以獨立於任何特定的實現。雖然理論和實踐經常被一起研究並協同作用,但它們往往有着不同的目標,有時解決不同的問題。

(全文完)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章