計算機科學與計算機工程的區別
我們前幾天講了計算機科學裡的一些思維方式,但是科學要通過工程才能變成產品,才能改變世界,具體做工程時,思維方式和科學研究又有所不同,今天我們就來看看它們之間的不同之處。我在昨天講,提高兩倍的速度對科學並沒有什麼意義,因為還是在一個量級上,但是對工程確實有意義,假如你的計算機快了兩倍, 你肯定會很高興。很多人問我,計算機科學和工程有什麼差別,今天我們就這個話題聊一聊我們從三個方向分析。
1. 方向和道路之分別
科學常常指出正確的方向,而工程則是沿看科學指出的方向建設道路。如果沒有計算機科學給出最好的算法,我們修的道路通常缺乏方向性,是在繞路,但是, 有了科學後,最終還需要工程把道理修通。
2. 科學和工程需要關注不同的事清,工作的環境也不同。
我在周一講,計算機科學家需要聚焦在量級上提高性能,為了做到這一點,他們需要構建理想的環境,摒除一些不必要的干擾,把主要矛盾突出出來。比如提高計算機算法的速度時,不要過分考慮加載數據的處理器時間、計算機內存的極限等邊界效應,要想辦法把所有沒必要的數據比較都省略掉
但是,具體到工程上,節省幾倍的時間,甚至 20% 的時間是很有意義的。另外,理論上最好的解決方案,遇到極其糟糕的情況,可能會失去通常的表現,這種時候需要有預案,這就是工程師們要考慮的問題。對於一個好的工程師來講,他最重要的能力是了解最新的科學進展,並且根據實際清況使用最新的技術解決實際問題。
在大學教育上,一個巨大的缺陷在於科學和工程分不清,大學做了很多原本是公司應該做的事倩,比如今天中國一些大學津津樂道於製造超級計算機,這根本就是工程的事情,應該是聯想這樣的公司去做。這樣的教育導致了創新性的研究非常少,雖然發表論文不少,但大多是別人提出問題並給出了初步的答案後,中國的大學來完善。中國在今天,計算機工程做得不錯,科學還是比較弱。
3. 科學家和工程師跟錢的距離不同。
坦率地講,科學家通常是離錢比較遠的,即使是因為發明決速排序算法而獲封爵士頭銜的霍爾,也沒有多少錢。相反, 在工程上實現了自己所發明的網頁排名算法搜索的佩奇和布林,即使所創辦的Google公司不上市,錢也少不了。要想當科學家,就要離短期的利益遠一點,這樣才能把目光放遠。不僅大學教授掙錢可能沒有工程師多,即使在大公司裡,搞研究的收入常常不如做產品的。我在 Google 賺錢最少的四年,就是中間單純做研究的四年。
而科學家要想成為工程師,也不是說變就變的,思維方式需要改變,要從理想狀態進入到現實狀態。我們經常發現,很多教授辦公司反而不如他們的學生,因為教授是科學家思維方式不適合做產品。
接下來,我就講講自己的親身經歷, 說說我的關注點是怎樣從工程到科學,再到工程的,從這個過程中你可以看出計算機科學家和工程師在不同身份時所應該採取的不同做事策略。
我 27 年前在中國做語音識別,那時中國這方面的工作剛起步,我們通常是把英語的方法改一改用於中文的識別。在此之前世界上也沒有什麼人做中文的識別,這種工作算是科學還是工程呢?其實很難說清楚,但是工程的成分大一些。等我在美國做博士論文時,就必須做一些別人沒有做過的研究了,具體講,主要的工作是提出一個新算法,這個算法今天大家還在用,而且還時不時寫郵件向我詢問細節。直接聯繫我的原因並非我論文寫得不通順,而是大部分計算機專業的博士生賴得讀我的博士論文,因為它讀起來更像是一篇數學論文,裡面有 20% 的篇幅是公式的推導,我所提出的幾個引理和定理的證明。
這樣一項研究帶來什麼結果呢?它比過去的機器學習算法簡化掉了很多重複的計算,以至於可以讓運行速度提高幾百倍到上千倍。在 2000 年之前,世界上做語音識別和機器翻譯的人開始嘗試一種在數學上非常漂亮的機器學習算法,當時 IBM 一個非常聰明的科學家,想辦法把整個沃森研究中心所有的計算機在空閒時都拿來使用,這樣計算了兩年,才得到一個結果, 發表了一篇論文。於是接下來的兩年,全世界所有做語音識別的科學家對這種算法都望洋興嘆。
當時我也想使用那種機器學習方法解決一些實際問題,但是要按照過去的速度運行程序,我顯然就不用畢業了。對我來講,三五倍地提高速度是沒有意義的事清,要提高就得從根本上提高,提高幾十甚至幾百倍。於是在大約半年的時間裡, 我就是一沓紙,一支筆地工作,推導數學公式,最後終於讓我發明了一種在量級上更好的算法,於是計算速度提高了好幾百倍,使得原來需要計算兩年的事清在當時縮短到一周左右。就這樣我得以在半年內做了十幾次實驗,完成了論文。
不過,當時我在寫程序實現我自己的算法時,並沒有去省最後 10%, 5% 的計算機資源,因為即使再將程序速度提高10%,也不可能讓我早一天畢業,更何況那麼做還會花更多寫程序的時間。從這裡可以看出,計算機科學所關心的問題是什麼,是將注意力放在量級上,而不要太在意細小的成本。
好了,等到我畢業加入了Google,思維方式就不得不再從科學轉變成工程了。我的第一個項目是搜索反作弊,具體的方法是一種簡單的機器學習。既然是機器學習,就需要用數據訓練一個統計模型,當然模型就要佔內存。我當時產生的模型有多大呢,大約 20M,也就是今天一張 2000 萬像素照片原圖的大小。這對搞科學的人來講,根本不是個事兒。
但是辛格博士( 曾經一度負責 Google 整個搜索部門 )和我講了,你的方法很有效,但是我無法給你這麼多內存空間,因為我們是很多人一同在寫服務器的代碼, 如果每個人都將代碼增加20兆字節 ( 20MB ),程序就太大( 內存 ),裝不下了。後來他教會我一種高度壓縮的、近似的模型,使得佔用的內存從20MB降低到3MB, 20M和3M只差一個六倍的常數,從算法的空間複雜度上講是毫無意義的事清,但這就讓我們的工作成果可以用於產品了。這是Google給我上的一堂計算機工程課。
我在那裡接受的第二堂課是在工程上需要計較2%的運行時間。2002年, 我在Google寫了它的中、日、韓文處理算法,由於要對這些語言採用特殊的搜索排序算法,使得搜索運算的時間長了 2%。這在計算機科學上也不是個事,因此當產品部門的人要我提高速度時,我非常不願意再花幾週時間修改代碼,於是我和產品部門的人爭執了起來。
我的觀點是,隨著摩爾定律讓計算機的速度不斷提升,半年後新的服務器會讓我這點減速的副作用變得可以忽略不計。不過產品部門的人不是這麼算賬的, 他的負責人和我講,Google當時有 2 萬多台服務器服務於全球搜索,大約 10% 的流量是中日韓文的,也就是說佔用掉了 2000 台服務器,增加2%的計算量,相當於多用 40 台服務器,當時一台服務器一年的折舊和使用成本大約是 1000 美元,40 台服務器就是4萬美元,足足值得一個工程師花一個季度的時間優化代碼。沒辦法,我只好花了幾週時間優化代碼,才獲准推出相應的服務。
我在後面還會不斷地講我在 Google 接受的工程訓練。總之,在從事了幾年的工程工作,我想問題的出發點就和過去不同了。等到幾年後,我離開工程部門,又跑到 Google 做研究了之後,想法又改變了, 又不太在意工程的細節了。這倒不是我偷懶,而是對於搞研究的人來講,是要不斷嘗試新方法的,很多代碼只有我和小組的幾個人用,用不了幾個月就得更新,因此花很大的時間改進代碼,讓算法運行的時間快個一兩倍,最後節省一點運行時間沒有意義。
從這裡,你可以看出不同的目的,對邊際成本的看法是不一樣的。因此,在現實工作中,沒有絕對的最好,只有在給定條件下相對比較好。
從計算機科學到工程的轉變,在思維上以下兩點最為重要。
-
第一,前者要在一個相對理想的狀態下工作,這樣可以將注意力集中在量級的改進上,也就是撿西瓜上。但是在產品中,並不存在理想的條件,各種細節都要考慮周到。
-
第二,也是最重要的,在工程中必須首先使用在科學上最好的方法,然後再作細節的改進。否則在細節上改進,提高了一點點效率,但是在宏觀上損失了幾十、 上百倍的效率,一定做不成好產品。我在2007年之所以要寫《數學之美》,就是告訴從事IT的人別丟了西瓜。
吳軍:希望我的經驗對從我的經歷可以看出思維方式不對, 做的工作一定很平庸, 你能有所幫助
來源:《吳軍-計算機科學與計算機工程的區別戶 》