未來屬於演算法,而不是代碼!

作者|Cathal Horan

編輯|薛命燈

原文鏈接:未來屬於演算法,而不是代碼!

大數據在人類歷史長河的各個時期一直存在著,只是要等到技術發展到一定階段,它才開始嶄露頭角。而它的未來又在哪裡?來自 Intercom 的工程師 Cathal Horan 表達了他對大數據的看法,他認為,未來屬於演算法,而不是代碼。以下內容翻譯自 Cathal 在 hackernoon 網站發表的博文,已獲得翻譯授權。

「大數據時代」的稱號並不能為當今世界所獨享,數據充斥著人類文明歷史長河的各個時期。縱觀這些歷史時期,通過從離散到抽象的轉換,我們就會明白為什麼演算法比代碼重要。

說到大數據……

如果我們把整個人類歷史看成一天,那麼我們只能從晚上 11 點 7 分開始說起。這是安靜的一天。但是在隨後的一丁點時間裡,我們積攢了很多知識和故事,並打算將它們傳達給其他人。你可以想像最開始人類通過對話的形式將知識代代相傳,從父輩傳給子輩,從老師傳給學生。但是整個社會的知識量增長迅速,以至於最初的對話形式無法傳達這麼多的信息。

我們需要將這些信息編撰成冊進行保存和傳播。通過書寫的方式將知識編撰成冊代表著這些時期在技術上的重大轉變。事實上,蘇格拉底(柏拉圖「斐德羅篇」里的角色)認為這種技術轉變比不上最初的對話形式,擔心它會降低我們開發智慧和知識的能力。所以很自然地,我不認為蘇格拉底會喜歡電視。

問題的核心是,對話代表了一種離散的溝通手段。你知道你的交談對象是誰,而且參與對話的人通過論證和反證的方式進行直接的互動。反過來,書本是一種抽象的溝通手段,作者和讀者之間不存在直接的互動。作者並不知道誰讀了他的書,也不知道有多少人、在什麼時候、在哪裡讀了他的書。有時候,我們可能知道潛在的讀者群體是誰,然後根據讀者群體進行內容裁剪。不過大多數時候,書本都只是一種抽象的傳播知識和學習新技能的手段。

等腰三角形的大數據

當我們從簡單的計算形式轉變為由定理、符號和演算法組成的抽象形式(我們現在稱其為數學),就開啟了另一個大數據時代。第一批有記載的計算髮生在公元前 2500 年的美索不達米亞。當時,美索不達米亞人需要計算出一穀倉的糧食能夠養活多少人。

美索不達米亞人有具體的問題關注點,他們很清楚需要解決的問題是什麼。他們的計算都是很離散的,因為每一次計算只能解決一個問題。這也就是為什麼評論家們認為它們不是數學。直到公元前 500 年的古希臘,畢達哥拉斯學者們(可以把他們認為是早期的 Google 使用者,哈哈)開始針對三角形提出了一些奇怪的問題。比如,他們想知道等腰直角三角形的三個邊能否都是整數(這聽起來像不像一個 Google 風格的面試題?)。

如果你想通過離散的方式來解答這個問題,那麼可以像美索不達米亞人那樣做。不過,隨著數字的增加,這種方式會顯得很笨重。要證明這個假設,你需要進行多少次計算(其實這個假設是錯誤的,三個邊不可能都是整數)?等腰三角形問題的不同之處在於,它不存在具體的關注點。我們不知道三角形的大小,也不知道它們的邊長,而且它們的大小可能是無限的。如果我們在數字上應用推理,那麼就進入了數學領域,大數據也就接踵而至。畢達哥拉斯式的思維方式體現了數學的抽象特徵,在今天,我們使用符號、規則和推理來解答這類抽象的問題。

或許你想知道人類歷史上的其他大數據時期,不過我想直接跳到 20 世紀,看看代碼如何成為現代技術領域的重要組成部分(如果你有其他大數據時期的資料,可以在評論里告訴我,我相信它們會很有趣)。

代碼的崛起

1945 年,當 Grace Hopper 開始在 Harvard Mark I 計算機上工作時,編碼(或者說編程,不過我們不打算在這裡區分它們有什麼不同)這項工作的重要性就開始凸顯出來。在這之前,電腦(如果可以這麼叫它的話)充其量只是個計算工具。以二戰為例,當時的大炮需要藉助矩陣進行輔助瞄準。矩陣是一些方程式的計算結果,這些方程式使用數百種不同的計算因子,比如距離、海拔、風速、溫度、濕度,等等。電腦(computer)這個名字的由來也是很偶然的,人們用它描述在二戰中操作計算機的女性,她們被稱為「computer」。操作員們必須使用打孔卡和曲柄來處理方程式。一個打孔卡需要 170 個人月才能完成。

這個與我們之前討論的事情有什麼相似之處?美索不達米亞人使用黏土矩陣來進行計算,而到了 20 世紀,計算媒介變成了編碼。雖然已經有了長足的進步,不過編碼仍然是一種離散的操作,因為它執行的是具體的計算任務,只是效率上有所提升而已。編碼解放了人工操作,讓我們可以處理更多的數據。

演算法與代碼

演算法:一系列用於描述一個問題解決方案的步驟,符合正確性和有限性的標準。是與具體實現相互獨立的抽象計算步驟。

代碼:一系列計算機指令。它們是計算的具體實現,使用一種特定的編程語言,運行在一個特定的平台上。

人們可以藉助這種直接向計算機發送編碼指令的方式來實現更為複雜的指令序列,並以演算法的形式呈現出來。演算法比編碼的出現要早得多。穆斯林數學家 Al-Khawarizm 早在公元 820 年就對解決線性方程和二次方程式的演算法進行了描述。演算法一詞來源於這位數學家的拉丁文名字「Algoritmi」,而「algebra」則來源於「al-jabr」,Al-Khawarizm 用它來解決二次方程式問題。演算法由一系列有限的計算或指令組成,併產生一個結果。正如我們所知道的那樣,代碼是向計算機發出指令的一種方式,很適合用於實現演算法。它們只不過是一系列按照一定次序執行的操作。

與早期的大數據時期一樣,我們這個時代的信息量也在增長。根據摩爾定律,我們在編碼的設計和使用方面所作的改進換來了性能的提升,從而能夠應付不斷增長的數字化需求。你可以繼續編寫代碼從資料庫查詢相關的資源列表。這些操作的離散特徵仍然被保留了下來,因為人們仍然在通過編寫代碼告訴硬體應該做哪些事情。就算操作變得越來越複雜,它仍然只是人類的編碼指令。不過,演算法已經開始展露頭角,正在創造一個抽象的新時代。

演算法的崛起

所以說,演算法和代碼之間有很大的不同。代碼可以用來實現演算法,而且代碼的實現方式會影響到性能。例如,如果你要從一個序列里找出最大或最小的元素,那麼二叉堆的性能相比其他的數據結構要好很多。不過,你已經沒有必要通過編寫代碼來實現一個演算法,就像沒有必要通過聽音樂來寫歌一樣。

雖然每個人都知道摩爾定律的魔力,驅動數字經濟發展的性能改進遵循的就是摩爾定律,但鮮有人知道,在很多領域,演算法所產生的性能改進已經超過了硬體所帶來的性能提升。實際上,2010 年的一份官方報告表明,演算法已經為很多領域帶來了顯著的性能提升,比如語音識別、神經語言處理和物流。

「更加令人感到吃驚但同時又令人難以理解的是,在很多領域,演算法為性能帶來的提升已經遠遠超過了處理器速度提升所帶來的性能改進。」

——面向總統和國會的報告:設計數字的未來

抽象演算法

我們現在擁有大量的數據,這意味著我們不能再用離散的思維來思考問題。大數據促使我們轉變思維。它促使我們向後退一步,去尋找能夠處理數據洪流的方法。按照傳統的方式,你可能會根據一些指定的模式或參數編寫代碼來查詢數據。例如,你可能想從資料庫中查找在過去兩周買過 2 件商品並且支付超過 30 歐元的顧客,因為你想聯繫到這些顧客,並向他們推薦一些優惠活動。你使用這個模式來查找匹配的數據。不過大數據卻正好相反,你先有了數據,然後查找可以匹配這些數據的模式。

想想看,有這麼多的數據,但是我們卻找不到匹配的模式,所以我們要回退一步。我們通過集群、分類、機器學習和其他新的支撐技術來尋找模式,而能夠幫助我們做到這點的是演算法,不是代碼。要找到隱藏在暗處的模式,跨出這一步是必需的。與光譜一樣,有一些波長的光線我們是看不到的,而超過一定數據量之後的模式我們也是看不到的,它就是大數據。

我們不僅可以從中搜索到模式,它還能夠生成做這些事情所需要的代碼。Pedro Domingos 在「The Master Algorithm」一書中描述了如何使用「學習者演算法」來創建新的演算法,這些演算法可以反過來為我們編寫我們所需要的代碼,「通過機器學習,計算機可以自己編程,我們就可以解放了」。為了實現這個目標,我們需要更好地理解這些演算法的原理,以及如何讓它們與我們的需求相匹配。否則,我們就無法向抽象轉變。

「工業的發展讓手工勞動自動化,信息的發展讓腦力勞動自動化,而機器學習則讓它自己自動化。如果沒有機器學習,程序員就會成為發展瓶頸。而有了機器學習,發展的速度就會加快。」

——Pedro Domingos,「The Master Algorithm」

思考演算法

不過,不管如何從離散轉變成抽象,我們仍然需要程序員,但這不是重點。並不是說代碼已經變得不重要了,也不是說代碼就不會再帶來任何改進。重點在於,我們要開始思考演算法,這不僅僅是數學家或學者的事情。我們周邊充斥著各種演算法,以致於我們不需要知道如何編寫代碼來使用它們,或者理解它們。現在,有一些人通過新的演算法對不同的領域進行優化和改進,他們使用了遺傳編程(genetic programming)和大數據技術。人們甚至創造了更好的優化技術,他們觀察金屬的冷卻過程,並通過演算法對其進行建模(被稱為模擬退火演算法,這就是我們應該從演算法角度開始考慮問題的一個最好的例子)。

編碼作為新數字經濟的關鍵技能,就像學習如何閱讀一樣,已經模糊了我們對演算法的理解。演算法正逐漸成為我們生活的組成部分,從電影推薦到新聞過濾和尋找合作夥伴。我們要更好地理解它們,這樣才能更好地理解和掌控我們的未來。

閱讀原文


推薦閱讀:

還在用著5年前的cpu和顯卡,是一種什麼感受?
熊寫代碼這三年:閱讀寫作與技術成長
理論上任何代碼都可能沒有bug么?
像寫詩一樣寫代碼
編寫整潔的 PHP 代碼

TAG:算法与数据结构 | 代码 | 大数据 |