算法是內功,程式設計師別冷落算法! - OSCHINA - 中文開源技術交流社區

2020-12-12 開源中國

李開複寫於 2006 年

算法的力量

算法是計算機科學領域最重要的基石之一,但卻受到了國內一些程式設計師的冷落。許多學生看到一些公司在招聘時要求的程式語言五花八門就產生了一種誤解,認為學計算機就是學各種程式語言,或者認為,學習最新的語言、技術、標準就是最好的鋪路方法。其實大家都被這些公司誤導了。程式語言雖然該學,但是學習計算機算法和理論更重要,因為計算機算法和理論更重要,因為計算機語言和開發平臺日新月異,但萬變不離其宗的是那些算法和理論,例如數據結構、算法、編譯原理、計算機體系結構、關係型資料庫原理等等。在「開復學生網」上,有位同學生動地把這些基礎課程比擬為「內功」,把新的語言、技術、標準比擬為「外功」。整天趕時髦的人最後只懂得招式,沒有功力,是不可能成為高手的。

算法與我

當我在1980年轉入計算機科學系時,還沒有多少人的專業方向是計算機科學。有許多其他系的人嘲笑我們說:「知道為什麼只有你們系要加一個『科學』,而沒有『物理科學系』或『化學科學系』嗎?因為人家是真的科學,不需要畫蛇添足,而你們自己心虛,生怕不『科學』,才這樣欲蓋彌彰。」其實,這點他們徹底弄錯了。真正學懂計算機的人(不只是「編程匠」)都對數學有相當的造詣,既能用科學家的嚴謹思維來求證,也能用工程師的務實手段來解決問題——而這種思維和手段的最佳演繹就是「算法」。

記得我讀博時寫的Othello對弈軟體獲得了世界冠軍。當時,得第二名的人認為我是靠僥倖才打贏他,不服氣地問我的程序平均每秒能搜索多少步棋,當他發現我的軟體在搜索效率上比他快60多倍時,才徹底服輸。為什麼在同樣的機器上,我可以多做60倍的工作呢?這是因為我用了一個最新的算法,能夠把一個指數函數轉換成四個近似的表,只要用常數時間就可得到近似的答案。在這個例子中,是否用對算法才是能否贏得世界冠軍的關鍵。

還記得1988年貝爾實驗室副總裁親自來訪問我的學校,目的就是為了想了解為什麼他們的語音識別系統比我開發的慢幾十倍,而且,在擴大至大詞彙系統後,速度差異更有幾百倍之多。他們雖然買了幾臺超級計算機,勉強讓系統跑了起來,但這麼貴的計算資源讓他們的產品部門很反感,因為「昂貴」的技術是沒有應用前景的。在與他們探討的過程中,我驚訝地發現一個O(n*m)的動態規劃(dynamic programming)居然被他們做成了O (n*n*m)。更驚訝的是,他們還為此發表了不少文章,甚至為自己的算法起了一個很特別的名字,並將算法提名到一個科學會議裡,希望能得到大獎。當時,貝爾實驗室的研究員當然絕頂聰明,但他們全都是學數學、物理或電機出身,從未學過計算機科學或算法,才犯了這麼基本的錯誤。我想那些人以後再也不會嘲笑學計算機科學的人了吧!

網絡時代的算法

有人也許會說:「今天計算機這麼快,算法還重要嗎?」其實永遠不會有太快的計算機,因為我們總會想出新的應用。雖然在摩爾定律的作用下,計算機的計算能力每年都在飛快增長,價格也在不斷下降。可我們不要忘記,需要處理的信息量更是呈指數級的增長。現在每人每天都會創造出大量數據(照片,視頻,語音,文本等等)。日益先進的紀錄和存儲手段使我們每個人的信息量都在爆炸式的增長。網際網路的信息流量和日誌容量也在飛快增長。在科學研究方面,隨著研究手段的進步,數據量更是達到了前所未有的程度。無論是三維圖形、海量數據處理、機器學習、語音識別,都需要極大的計算量。在網絡時代,越來越多的挑戰需要靠卓越的算法來解決。

再舉另一個網絡時代的例子。在網際網路和手機搜索,如果要找附近的咖啡店,那麼搜尋引擎該怎麼處理這個請求呢?最簡單的辦法就是把整個城市的咖啡館都找出來,然後計算出它們的所在位置與你之間的距離,再進行排序,然後返回最近的結果。但該如何計算距離呢?圖論裡有不少算法可以解決這個問題。

這麼做也許是最直觀的,但絕對不是最迅速的。如果一個城市只有為數不多的咖啡館,那麼這麼做應該沒什麼問題,反正計算量不大。但如果一個城市裡有很多咖啡館,又有很多用戶都需要類似的搜索,那麼伺服器所承受的壓力就大多了。在這種情況下,我們該怎樣優化算法呢?

首先,我們可以把整個城市的咖啡館做一次「預處理」。比如,把一個城市分成若干個「格子(grid)」,然後根據用戶所在的位置把他放到某一個格子裡,只對格子裡的咖啡館進行距離排序。

問題又來了,如果格子大小一樣,那麼絕大多數結果都可能出現在市中心的一個格子裡,而郊區的格子裡只有極少的結果。在這種情況下,我們應該把市中心多分出幾個格子。更進一步,格子應該是一個「樹結構」,最頂層是一個大格——整個城市,然後逐層下降,格子越來越小,這樣有利於用戶進行精確搜索——如果在最底層的格子裡搜索結果不多,用戶可以逐級上升,放大搜索範圍。

上述算法對咖啡館的例子很實用,但是它具有通用性嗎?答案是否定的。把咖啡館抽象一下,它是一個「點」,如果要搜索一個「面」該怎麼辦呢?比如,用戶想去一個水庫玩,而一個水庫有好幾個入口,那麼哪一個離用戶最近呢?這個時候,上述「樹結構」就要改成「r-tree」,因為樹中間的每一個節點都是一個範圍,一個有邊界的範圍(參考:http://www.cs.umd.edu/~hjs/rtrees/index.html)。

通過這個小例子,我們看到,應用程式的要求千變萬化,很多時候需要把一個複雜的問題分解成若干簡單的小問題,然後再選用合適的算法和數據結構。

並行算法:Google的核心優勢

上面的例子在Google裡就要算是小case了!每天Google的網站要處理十億個以上的搜索,GMail要儲存幾千萬用戶的2G郵箱, Google Earth要讓數十萬用戶同時在整個地球上遨遊,並將合適的圖片經過網際網路提交給每個用戶。如果沒有好的算法,這些應用都無法成為現實。

在這些的應用中,哪怕是最基本的問題都會給傳統的計算帶來很大的挑戰。例如,每天都有十億以上的用戶訪問Google的網站,使用Google的服務,也產生很多很多的日誌(Log)。因為Log每份每秒都在飛速增加,我們必須有聰明的辦法來進行處理。我曾經在面試中問過關於如何對Log進行一些分析處理的問題,有很多面試者的回答雖然在邏輯上正確,但是實際應用中是幾乎不可行的。按照它們的算法,即便用上幾萬臺機器,我們的處理速度都根不上數據產生的速度。

那麼Google是如何解決這些問題的?

首先,在網絡時代,就算有最好的算法,也要能在並行計算的環境下執行。在Google的數據中心,我們使用的是超大的並行計算機。但傳統的並行算法運行時,效率會在增加機器數量後迅速降低,也就是說,十臺機器如果有五倍的效果,增加到一千臺時也許就只有幾十倍的效果。這種事倍功半的代價是沒有哪家公司可以負擔得起的。而且,在許多並行算法中,只要一個結點犯錯誤,所有計算都會前功盡棄。

那麼Google是如何開發出既有效率又能容錯的並行計算的呢?

Google最資深的計算機科學家Jeff Dean認識到,Google所需的絕大部分數據處理都可以歸結為一個簡單的並行算法:MapReduce。這個算法能夠在很多種計算中達到相當高的效率,而且是可擴展的(也就是說,一千臺機器就算不能達到一千倍的效果,至少也可以達到幾百倍的效果)。 MapReduce的另外一大特色是它可以利用大批廉價的機器組成功能強大的server farm。最後,它的容錯性能異常出色,就算一個 server farm宕掉一半,整個fram依然能夠運行。正是因為這個天才的認識,才有了MapReduce算法。藉助該算法, Google幾乎能無限地增加計算量,與日新月異的網際網路應用一同成長。

算法並不局限於計算機和網絡

舉一個計算機領域外的例子:在高能物理研究方面,很多實驗每秒鐘都能幾個TB的數據量。但因為處理能力和存儲能力的不足,科學家不得不把絕大部分未經處理的數據丟棄掉。可大家要知道,新元素的信息很有可能就藏在我們來不及處理的數據裡面。同樣的,在其他任何領域裡,算法可以改變人類的生活。例如人類基因的研究,就可能因為算法而發明新的醫療方式。在國家安全領域,有效的算法可能避免下一個911的發生。在氣象方面,算法可以更好地預測未來天災的發生,以拯救生命。

所以,如果你把計算機的發展放到應用和數據飛速增長的大環境下,你一定會發現;算法的重要性不是在日益減小,而是在日益加強。

轉載自:伯樂在線

相關焦點

  • Hutool 2.16.0 發布,Java 工具集 - OSCHINA - 中文開源技術交流社區
    ClassUtil中對應方法引用此類方法ClassUil增加getConstructor方法,可匹配繼承參數優化ClassPath路徑轉為絕對路徑Direction增加方法從字符串轉換(大小寫不敏感)添加DigestUtil方法,用於md* sha1等摘要算法
  • 老程式設計師的下場 - OSCHINA - 中文開源技術交流社區
    長期從事編程活動的程式設計師都期望在50多歲時能爬到一個足夠高的職位,或者能順利的退休。但我在這裡討論的可能是一個你還沒有想過的問題:如果到那時你失業了呢?50多歲時你的職業仕途會成為一個問題。如果你有很好的技術,有人僱你,你會有一個很高的職銜,或你是一個專家,或有很好的人際關係,你都有可能找到一個新的職務。否則,你會從衣食無憂淪落為無家可歸。這是真的。我55歲,我的簡歷會讓你感覺非常優秀,10年前我能掙到多達100萬美元。現在我是一個流浪漢。我身體不是很好,沒有醫險,沒有牙醫。能找到的工作只是一些基本不需要技術的體力勞動,我也幹不了。我在試著做家教。
  • Delta Lake 進入 Linux 基金會 - OSCHINA - 中文開源技術交流社區
    「將 Delta Lake 引入 Linux 基金會的中立組織之下,將有助於依賴該項目的開源社區開發解決存儲和處理大數據(本地和雲端)的技術」,Linux 基金會戰略計劃副總裁 Michael Dolan 表示。
  • 人臉識別算法終於超過了人類本身 - OSCHINA - 中文開源技術交流社區
    而計算機科學家們當然是非常想要開發出一種算法,在各種情況下都能夠表現優異。現在,中國香港大學的湯曉鷗教授和他的學生路超超(對不起,譯者沒有找到這名學生的名字,只能音譯了)宣布他們攻克了這個難題。他們開發了一種叫「高斯」的人臉識別算法首次超過了人類自身。新的識別系統對於各種平臺都能夠提供人類級別的識別能力,從手機到電腦遊戲中的人臉識別,從安全系統到密碼控制等等。
  • 開源軟體蓄勢待發 - OSCHINA - 中文開源技術交流社區
    相關內容11家值得關注的開源技術公司優異的技術特性和相對低廉的價格的結合使得開源產品廠商比以往有了更多進入企業網絡的路徑。Likewise公司執行長 Barry Crist 稱:「在網絡泡沫時期,由於Linux比SPARC上的Solaris更為便宜,開源產品逐漸由Unix轉移到了Linux。
  • 關於編程裡的那些 ABCDEFG - OSCHINA - 中文開源技術交流社區
    它是一款開源 JavaScript 函式庫,由 Google 和它的社區來維護,用來協助單一頁面應用程式運行的。它的目標是透過 MVC模式(Model-View-Controller)功能增強基於瀏覽器的應用,使開發和測試變得更容易。函式庫讀取包含附加自定義(標籤屬性)的 HTML,遵從這些自定義屬性中的指令,並將頁面中的輸入或輸出與由 JavaScript 變量表示的模型綁定起來。
  • JDK/Java 15 發布 - OSCHINA - 中文開源技術交流社區
    339: Edwards-Curve Digital Signature Algorithm (EdDSA)使用 Edwards-Curve 數字籤名算法(EdDSA)實現加密籤名。與其它籤名方案相比,EdDSA 具有更高的安全性和性能,並且已在許多其它加密庫(如 OpenSSL 和 BoringSSL)中得到支持。
  • 算法與算法工程師,技術與技術人員
    但是,人一但把數據準備好,接下來就是機器學習算法發揮的時候了。但是,算法工程師的主要工作不在這裡,這是因為軟體有個特點,可以近乎無成本的複製。只要這個世界上有一個人實現了LR(智慧財產權的問題這裡不考慮,更何況開源軟體很多),其他需要用LR的人都可以拿過來用了。顯然,這些算法工程師們也正是這麼做的。
  • Git 2.4.3 發布 - OSCHINA - 中文開源技術交流社區
    Git是一個開源的分布式版本控制系統,用以有效、高速的處理從很小到非常大的項目版本管理。開源中國 Git 代碼託管平臺:http://git.oschina.net/Windows下的Git請看這裡:http://www.oschina.net/p/msysgitGit 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟體
  • 每個程式設計師都該閱讀的書 - OSCHINA - 中文開源技術交流社區
    國外知名網站stackoverflow上有一個問題調查: 哪本書是對程式設計師最有 影響、每個程式設計師都該閱讀的書? 第二名:1161票 《The Pragmatic Programmer》,中文版《程式設計師修煉之道》
  • 最讓程式設計師懊惱的 10 件事 - OSCHINA - 中文開源技術交流社區
    好吧,有些程式設計師可不樂意幹這事兒。大家經常做的是,快速瀏覽開源項目,然後開始不斷的搜尋文檔來獲取幫助。我敢打保票的說,不管在哪裡,幾乎所有的程式設計師被要求寫文檔時,都會說:「不能讓其他人去寫嗎?」5. 缺少文檔的程序好吧,我從來沒有說過我們程式設計師是說一套做一套的人。
  • 【分詞】從why到how的中文分詞詳解,從算法原理到開源工具
    分詞技術不僅僅適用於中文,對於英文、日文、韓文等語言也同樣適用。雖然英文中有天然的單詞分隔符(空格),但是常有單詞與其他標點黏滯的情況,比如"Hey, how are you."中的"Hey"和"you"是需要與身後的標點分隔開的為什麼需要分詞?能不能不分詞?中文分詞難在哪?
  • 開源春天,此時不來,更待何時? - OSCHINA - 中文開源技術交流社區
    隨後 Apache 軟體基金會與 OpenStack 基金會相繼出來澄清,表示「開源軟體、開原始碼協作、參與公開電話會議或私人會議以及提供贊助資金都是不受 EAR 約束的活動,因此不應對社區產生影響」。
  • 算法聖經《算法導論》第三版習題答案開源!
    》——一本每個程式設計師都會接觸的算法經典教材!不論你是寫 Java、C++、Python;也無論你是做前端還是 AI 人工智慧,都或多或少地接觸算法。《算法導論》這本書,可以稱作是算法學習領域的聖經了。今天給大家收集了一份非常不錯的資源,就是《算法導論》第三版的習題答案完整版!祝你事半功倍~書籍介紹:
  • 程式設計師真正的價值 - OSCHINA - 中文開源技術交流社區
    在微信上加了很多 MacTalk 的讀者之後,經常會收到一些奇奇怪怪的問題,關於職場、關於選擇、關於朋友、關於 Mac、關於技術等等,不一而足。但是我能回答的卻很少。我把這個想法告訴了這位程式設計師,得到的反饋是:對不起哥,沒有原始碼!
  • 給年輕程式設計師的建議 - OSCHINA - 中文開源技術交流社區
    偶爾的,我會被人問道:如何成為一名優秀的程式設計師,更或者,如何成為一名程式設計師。每次人們問起,我都力圖給出不同的答案。
  • 60% 的企業代碼庫包含開源漏洞 - OSCHINA - 中文開源技術交流社區
    近日,Synopsys 公司的黑鴨軟體(Black Duck Software)發布了開源安全與風險分析(OSSRA)年度報告,
  • Lambda全球首次實現PoST時空證明算法並開源
    今天在區塊鏈的核心領域——分布式存儲領域,Lambda團隊初步實現了該領域最為核心的算法,也就是PoST時空證明算法,並將該算法的核心類庫部分在GitHub上進行開源,開源協議遵守GPL V3。  FileCoin作為一個歷史悠久的項目,其白皮書所採用的技術方案多次更改,核心共識算法PoST v1從最早的類PoW共識,到2017完全推翻V1的設計,改用類似於Algorand的VRF算法,到加入Poreps的VDE實現,到引入新的VDF算法,並且檢索市場、小額支付等問題也尚未有完善的設計方案,FileCoin涉獵了太多的技術及學術難題,使得開發周期變得非常不可控
  • 開源社區的「忌諱」話題 - OSCHINA - 中文開源技術交流社區
    加拿大資深開源技術記者Bruce Byfield較早前發表了一篇名為「開源社區從來不想承認的九大事實」(9 Things That Are Never Admitted About Open
  • 字節跳動技術Leader們都在看什麼書?從推薦算法到前端開發純乾貨
    抖音推薦團隊Leader William說,這是他見過最好的機器學習、深度學習教材,理論與實踐結合,並且中英雙語都有,而且還是免費開源的資源。這本書的作者是Hulu中國負責人,書裡知識點很多,也有不少工業界的觀點,相關知識點最好都弄清楚,對從事算法工作會有比較大的幫助。這本書可以幫助讀者了解業界推薦系統的基礎知識體系,梳理推薦算法的發展脈絡。