五類編程

作者:YY碩
鏈接:https://www.zhihu.com/question/26445506/answer/32864879
來源:知乎
-------------------------------------------------------------------------------------------------------
 

1. 第一類是結構性的工作。這類工作把特定的代碼、代碼段(函數)、代碼庫構成具有特定功能的程序,這些程序可以接受特定的數據、輸出特定的數據。例子如網站的界面、 軟件的界面、 軟件的一些可視化功能,再複雜一些有網站前端如何與後端通信、如何分配用戶請求給後端,如何處理兩個並行的程序、通信過程、計算機系統等等。結構性工作需要的是經驗以及對已有數據結構的瞭解,並不需要特別高的數學水平。我說的經驗指的是對於一個特定的想要實現的功能,如何選擇程序邏輯和數據結構去實現,這種選擇的過程需要程序員有大量讀寫代碼的基礎,能夠把要實現的功能和自己以前實現過的或者看到過的功能聯繫起來,設計出解決方案並實現。舉個例子,比如說網頁設計,通過HTML的元素構建頁面,通過javascript給頁面元素以動態,這個過程基本是“所見即所得”的過程。
目前大部分的互聯網公司以及銀行系統需求的主要都是這類工作。爲了實現特定功能,程序有非常複雜的結構,必須要很多人一同參與編寫和測試,因此纔有了軟件工程這門學科的誕生。
結構性工作的巔峯產物是計算機操作系統。計算機操作系統雖然複雜,但是其中涉及到的數學並不多,最複雜的數學就是如何處理多個任務的調度以及進行內存分配管理,都可以抽象成簡單的離散數學和排列組合問題。不過,1萬行的操作系統和100萬行的操作系統的數學理論複雜度是差不多的,他們主要的區別是結構性的,而非數學上的。比如支持更多種CPU、硬件外設、網絡協議等等。

2. 第二類是效率性的工作。這類工作把特定的工程問題抽象成數學問題,然後發明新的數據結構或者操作邏輯去優化解決問題的效率。最簡單的例子是排序,用冒泡排序或者快速排序給大批量數據做整理有顯著的時間差別,這個大家都知道的……計算機科學家們主要從事的就是這類工作,需要極高的組合數學和圖論等知識。早期的效率性問題通常依靠較爲複雜的離散數學,而近年來大部分問題都是應用圖論來解決。解決這類問題需要程序員對大部分的數據結構都有深刻的理解,並且能夠進行嚴格的理論分析,能夠清楚地指出某種數據結構或操作邏輯的時間效率和內存效率。上面談到的cqf 16歲發明的數據結構,就屬於這類工作……反正我對這類工作毫無天賦,繼離散數學敗了以後,後來的高級算法課成績也很差。
效率性工作的巔峯產物是一套書叫做《The Art of Computer Programming》,作者是斯坦福大學的教授Donald.E.Knuth。這部神書包含了人類已知的大部分計算機算法的理論分析和最優形式, 50年來被公認爲算法領域的聖經。喫透這套書,就可以拿到世界上最好的程序員的工作了(比爾蓋茨說如果誰看懂了這套書,就請把簡歷發給他……),當然這很不容易。我至今只認真看了第一本的前言。

兼有前兩類工作的巔峯產物是淘寶網,尤其是雙十一前後的淘寶網。不解釋太多,大家可以看文章《揭祕在淘寶買東西背後的複雜技術》。Google這兩年在這方面做的不如淘寶,因爲中國人實在太多了……

3. 第三類是邏輯性的工作。指的是用計算機模擬人類的認知邏輯,這類工作包括語音識別、文字理解、信息檢索、數據分析等等。這類工作最早屬於高大上的人工智能、自然語言處理研究,後來隨着互聯網的興起開始逐步進入大衆視野。這類工作的主要基礎是概率統計、機器學習和數據挖掘的模型,包含的數學知識主要有概率、線性代數和圖論。由於互聯網公司和金融公司對於機器學習的需求,相關的基礎知識已經發展得非常成熟,如何學習這類知識也已經有很規範的教程。如今在硅谷,程序員不懂點機器學習,都不好意思出門和人打招呼。
這類工作的應用大約是這樣的:通過分析用戶在淘寶上買東西的數據,推測他還會買啥;通過分析股市的變化以及一些市場信息,推測股市下一步漲還是跌。還有就是分析搜索關鍵詞給出搜索結果,分析語音信號轉化成文字等等。這些不同的應用都是爲了分析數據,都有類似的處理模型和數學方法。
近年來在機器學習的基礎上人們發明了深度學習。這個我不是很懂,不好加以評論。但是我知道這類工作的主要目的是模仿人類的認知能力。特別地,機器學習領域最基礎最出名的模型“神經網絡”,已經被生物學家證明是比較好的對於人類大腦邏輯的模擬。
這類工作說簡單也簡單,說難也可以很難。你只需要學過大學一年級的線性代數,就可以理解神經網絡、支持向量機等機器學習的模型,然後自己訓練模型去分析數據了——這也是大部分硅谷公司的需求。百度新任首席科學家Andrew Ng在Coursera上有個機器學習的公開課,講完神經網絡之後他就說:“Good,你現在已經比大部分硅谷工程師更加了解機器學習了。”(真的不是黑麼)然而機器學習的模型背後的數學非常深奧,比如說神經網絡可以等效成一些複雜的高維拓撲結構,網絡的訓練實際上是這些拓撲結構做拓撲變換的過程。比如如果待訓練的數據維數非常高,要選擇合適的函數降維。爲了理解這些東西,需要深入學習線性代數、拓撲學、數學分析等數學知識。其實我說的我也不是很懂,我沒系統學過拓撲。

兼有前三類工作的巔峯產物是IBM的計算機waston。2011年Waston在美國的智力問答比賽“Jeopardy!” 中擊敗了兩位經驗老道的人類選手。這件事之所以令人震驚,是因爲Jeopardy中主持人提出的問題大部分無法直接理解,而是隱藏在英語俚語和雙關語當中的巧妙語言。Waston在人工智能史上的地位遠遠超過當年擊敗國際象棋大師的Deep Blue。 關於Waston的一些原理,可以讀文章《IBM Watson機器人算法介紹

4. 第四類是仿真性的工作。這類工作主要集中在遊戲和動畫領域,其他邊緣一點但是更加高要求的有飛行器設計、氣象、天文等。仿真意味着在電腦的環境中虛擬出現實世界,這就需要程序員理解力學和光學等物理學理論。比如最簡單的,任何3D遊戲引擎開發的第一步都是學習剛體變換等力學知識,用來把模擬出來的小人或者飛船等物體進行移動。剛體變換有很多種表示方法(茴香豆的茴字有四種寫法……),背後有不少數學理論。此外爲了仿真毛髮、浪花、濺起的塵土等等這類細小的物體,也有自己相關的物理和數學知識。可以請看《愛麗絲的髮絲──《愛麗絲驚魂記:瘋狂再臨》製作點滴》感受一下。
不同的行業對於仿真的需求不一樣,因此要求的專業知識也不同。遊戲和動畫的需求是儘可能地真實表現場景,而飛行器設計上用的仿真更強調空氣動力學和結構力學,因爲要用仿真分析飛行器飛行時的受力情況。天文、氣象和其他需求仿真的行業又有各自的側重點和知識領域,各個行業應該也都有自己暫時解決不了的問題。這些具體的知識區別我也不是很清楚,按照我對某些行業的理解,可能無非就是牛頓力學、動力學、微積分、微分方程和線性代數,因爲都是在經典力學範疇內的物理,就那麼點東西,從本科畢業開始算,把數學認真學個三年左右之後就能進入某個行業了。
這類工作的巔峯產物隱藏在大衆視線之外。比方說美軍號稱在海灣戰爭開始之前,就已經通過仿真軟件把戰鬥推演過好多次了,最後真打起來的時候“就像打電腦遊戲一樣”(語出《失控》)。再比如說,現在很多超級計算機都被用在氣象預測上。2008年北京奧運會前夕,北京氣象局就購買了一臺計算能力排全球前十的計算機,用來在奧運會期間提供氣象預測。當然,這些巔峯產物依然有很大的侷限性。美國人預測不出他們會陷入伊拉克和阿富汗的戰爭泥潭,北京氣象局預測不出幾年後北京常常會有霧霾。當然我們也不能太強求,畢竟這種工作有點奪取上帝視角的傾向。這都說明了在仿真計算領域,人類還有很長的路要走。

5. 第五類是物理性的工作。“物理”指的是這類工作中產生的代碼要直接與物理世界發生接觸,比如從傳感器獲取世界的信息,控制執行器進行特定的運動等等。這類工作主要集中在航空航天工業以及機器人產業當中,是我現在主要從事的工作。 這類工作主要分爲兩部分,一部分是觀測(如何通過傳感器數據瞭解自身和世界的狀態),另一部分是控制(如何根據自身和世界的狀態規劃自身的下一步運動),兩者都需求很多物理學和數學的知識,控制需要剛體力學和運動學、系統理論、控制論等,觀測需要信號處理、系統建模、機器視覺、概率統計、優化等等。
物理性工作的一個主要特點是,代碼與硬件以及機械緊密耦合,測試很困難(想想該怎麼給一顆導彈debug……),所以通常這類工作要和仿真類工作同步展開,先在仿真平臺上做測試,然後再移植到真的機械上面去。而且程序員要深刻理解運行自己代碼的平臺的硬件和機械的性能和極限,一行錯誤的代碼很有可能會導致嚴重的事故(一個小數點點錯導致火箭發射失敗這種故事我們小時候應該都聽說過)。
這類工作近年來也開始進入普通行業,比如任何安卓手機現在都內置慣性導航元件,上面說的“觀測”中的算法就可以寫在手機裏,用來獲取手機相對於世界的位置。
這類工作的巔峯產物是Boston Dynamics公司製造的大狗機器人和Petman機器人,可以自行百度瞭解一下。

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