第060封信 | 計算機科學與計算機工程的區(qū)別

☆怦然*%心☆_☆動,你好!

我們前幾天講了計算機科學里的一些思維方式,但是科學要通過工程才能變成產(chǎn)品,才能改變世界,具體做工程時,思維方式和科學研究又有所不同,今天我們就來看看它們之間的不同之處。我在昨天講,提高兩倍的速度對科學并沒有什么意義,因為還是在一個量級上,但是對工程確實有意義,假如你的計算機快了兩倍,你肯定會很高興。很多人問我,計算機科學和工程有什么差別?今天我們就這個話題聊一聊,我們從三個方向分析。

1. 方向和道路之分別。

科學常常指出正確的方向,而工程則是沿著科學指出的方向建設道路。如果沒有計算機科學給出最好的算法,我們修的道路通常缺乏方向性,是在繞路,但是,有了科學后,最終還需要工程把道理修通。

2. 科學和工程需要關注不同的事情,工作的環(huán)境也不同。

我在周一講,計算機科學家需要聚焦在量級上提高性能,為了做到這一點,他們需要構(gòu)建理想的環(huán)境,摒除一些不必要的干擾,把主要矛盾突出出來。比如提高計算機算法的速度時,不要過分考慮加載數(shù)據(jù)的處理器時間、計算機內(nèi)存的極限等邊界效應,要想辦法把所有沒必要的數(shù)據(jù)比較都省略掉。

但是,具體到工程上,節(jié)省幾倍的時間,甚至20%的時間是很有意義的。另外,理論上最好的解決方案,遇到極其糟糕的情況,可能會失去通常的表現(xiàn),這種時候需要有預案,這就是工程師們要考慮的問題。對于一個好的工程師來講,他最重要的能力是了解最新的科學進展,并且根據(jù)實際情況使用最新的技術解決實際問題。

在大學教育上,一個巨大的缺陷在于科學和工程分不清,大學做了很多原本是公司應該做的事情,比如今天中國一些大學津津樂道于制造超級計算機,這根本就是工程的事情,應該是聯(lián)想這樣的公司去做。這樣的教育導致了創(chuàng)新性的研究非常少,雖然發(fā)表論文不少,但大多是別人提出問題并給出了初步的答案后,中國的大學來完善。中國在今天,計算機工程做得不錯,科學還是比較弱。

3. 科學家和工程師跟錢的距離不同。

坦率地講,科學家通常是離錢比較遠的,即使是因為發(fā)明快速排序算法而獲封爵士頭銜的霍爾,也沒有多少錢。相反,在工程上實現(xiàn)了自己所發(fā)明的"網(wǎng)頁排名算法"搜索的佩奇和布林,即使所創(chuàng)辦的Google公司不上市,錢也少不了。要想當科學家,就要離短期的利益遠一點,這樣才能把目光放遠。不僅大學教授掙錢可能沒有工程師多,即使在大公司里,搞研究的收入常常不如做產(chǎn)品的。我在Google掙錢最少的四年,就是中間單純做研究的四年。

而科學家要想成為工程師,也不是說變就變的,思維方式需要改變,要從理想狀態(tài)進入到現(xiàn)實狀態(tài)。我們經(jīng)常發(fā)現(xiàn),很多教授辦公司反而不如他們的學生,因為教授是科學家,思維方式不適合做產(chǎn)品。

接下來,我就講講自己的親身經(jīng)歷,說說我的關注點是怎樣從工程到科學,再到工程的,從這個過程中你可以看出計算機科學家和工程師在不同身份時所應該采取的不同做事策略。

我27年前在中國做語音識別,那時中國這方面的工作剛起步,我們通常是把英語的方法改一改用于中文的識別。在此之前世界上也沒有什么人做中文的識別,這種工作算是科學還是工程呢?其實很難說清楚,但是工程的成分大一些。等我在美國做博士論文時,就必須做一些別人沒有做過的研究了,具體講,主要的工作是提出一個新算法,這個算法今天大家還在用,而且還時不時寫郵件向我詢問細節(jié)。直接聯(lián)系我的原因并非我論文寫得不通順,而是大部分計算機專業(yè)的博士生懶得讀我的博士論文,因為它讀起來更像是一篇數(shù)學論文,里面有20%的篇幅是公式的推導,我所提出的幾個引理和定理的證明。

這樣一項研究帶來什么結(jié)果呢?它比過去的機器學習算法簡化掉了很多重復的計算,以至于可以讓運行速度提高幾百倍到上千倍。在2000年之前,世界上做語音識別和機器翻譯的人開始嘗試一種在數(shù)學上非常漂亮的機器學習算法,當時IBM一個非常聰明的科學家,想辦法把整個沃森研究中心所有的計算機在空閑時都拿來使用,這樣計算了兩年,才得到一個結(jié)果,發(fā)表了一篇論文。于是接下來的兩年,全世界所有做語音識別的科學家對這種算法都望洋興嘆。

當時我也想使用那種機器學習方法解決一些實際問題,但是要按照過去的速度運行程序,我顯然就不用畢業(yè)了。對我來講,三五倍地提高速度是沒有意義的事情,要提高就得從根本上提高,提高幾十甚至幾百倍。于是在大約半年的時間里,我就是一沓紙,一支筆地工作,推導數(shù)學公式,最后終于讓我發(fā)明了一種在量級上更好的算法,于是計算速度提高了好幾百倍,使得原來需要計算兩年的事情在當時縮短到一周左右。就這樣我得以在半年內(nèi)做了十幾次實驗,完成了論文。

不過,當時我在寫程序?qū)崿F(xiàn)我自己的算法時,并沒有去省最后10%、5%的計算機資源,因為即使再將程序速度提高10%,也不可能讓我早一天畢業(yè),更何況那么做還會花更多寫程序的時間。從這里可以看出,計算機科學所關心的問題是什么,是將注意力放在量級上,而不要太在意細小的成本。

好了,等到我畢業(yè)加入了Google,思維方式就不得不再從科學轉(zhuǎn)變成工程了。我的第一個項目是搜索反作弊,具體的方法是一種簡單的機器學習。既然是機器學習,就需要用數(shù)據(jù)訓練一個統(tǒng)計模型,當然模型就要占內(nèi)存。我當時產(chǎn)生的模型有多大呢?大約20M,也就是今天一張2000萬像素照片原圖的大小。這對搞科學的人來講,根本不是個事兒。

但是辛格博士(曾經(jīng)一度負責Google整個搜索部門)和我講了,你的方法很有效,但是我無法給你這么多內(nèi)存空間,因為我們是很多人一同在寫服務器的代碼,如果每個人都將代碼增加20兆字節(jié)(20MB),程序就太大(內(nèi)存),裝不下了。后來他教會我一種高度壓縮的、近似的模型,使得占用的內(nèi)存從20MB降低到3MB。20M和3M只差一個六倍的常數(shù),從算法的空間復雜度上講是毫無意義的事情,但這就讓我們的工作成果可以用于產(chǎn)品了。這是Google給我上的一堂計算機工程課。

我在那里接受的第二堂課是在工程上需要計較2%的運行時間。2002年,我在Google寫了它的中、日、韓文處理算法,由于要對這些語言采用特殊的搜索排序算法,使得搜索運算的時間長了2%。這在計算機科學上也不是個事,因此當產(chǎn)品部門的人要我提高速度時,我非常不愿意再花幾周時間修改代碼,于是我和產(chǎn)品部門的人爭執(zhí)了起來。

我的觀點是,隨著摩爾定律讓計算機的速度不斷提升,半年后新的服務器會讓我這點"減速"的副作用變得可以忽略不計。不過產(chǎn)品部門的人不是這么算賬的,他的負責人和我講,Google當時有2萬多臺服務器服務于全球搜索,大約10%的流量是中日韓文的,也就是說占用掉了2000臺服務器,增加2%的計算量,相當于多用40臺服務器,當時一臺服務器一年的折舊和使用成本大約是1000美元,40臺服務器就是4萬美元,足足值得一個工程師花一個季度的時間優(yōu)化代碼。沒辦法,我只好花了幾周時間優(yōu)化代碼,才獲準推出相應的服務。

我在后面還會不斷地講我在Google接受的工程訓練。總之,在從事了幾年的工程工作,我想問題的出發(fā)點就和過去不同了。等到幾年后,我離開工程部門,又跑到Google做研究了之后,想法又改變了,又不太在意工程的細節(jié)了。這倒不是我偷懶,而是對于搞研究的人來講,是要不斷嘗試新方法的,很多代碼只有我和小組的幾個人用,用不了幾個月就得更新,因此花很大的時間改進代碼,讓算法運行的時間快個一兩倍,最后節(jié)省一點運行時間沒有意義。

從這里,你可以看出不同的目的,對邊際成本的看法是不一樣的。因此,在現(xiàn)實工作中,沒有絕對的最好,只有在給定條件下相對比較好。

從計算機科學到工程的轉(zhuǎn)變,在思維上以下兩點最為重要。

第一,前者要在一個相對理想的狀態(tài)下工作,這樣可以將注意力集中在量級的改進上,也就是撿西瓜上。但是在產(chǎn)品中,并不存在理想的條件,各種細節(jié)都要考慮周到。

第二,也是最重要的,在工程中必須首先使用在科學上最好的方法,然后再作細節(jié)的改進。否則在細節(jié)上改進,提高了一點點效率,但是在宏觀上損失了幾十、上百倍的效率,一定做不成好產(chǎn)品。我在2007年之所以要寫《數(shù)學之美》,就是告訴從事IT的人別丟了西瓜。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容