有許多讀者寫信給我,諮詢是關於學習數學和計算機算法意義。這個話題,在個人專欄很是文章都提到。在個人書《逆襲大學——傳給IT學子正能量》中,在這方面寫了很多文字,現將當中的9.5節全文摘錄在此文中,以供參考。html
不少其它話題,見《逆襲大學——傳給IT學子正能量》全書文件夾。面試
一個程序設計的剛開始學習的人。在剛剛開始學習時,會以爲編程中語言是最重要的。算法
沒有語言,沒有掌握好編程語言,寫不出程序來。數據庫
然後又知道熟練運用語言僅僅是學會了一種表達的方式而已。如同一個三歲的小孩,空有伶牙俐齒,說着幼稚的話。編程
小孩要說出成熟的話來,還需要有思想,會思考。學編程也是同樣。學會了語言。還應該學會思考,學會給出問題的解決方式。設計模式
經典著做《計算機程序設計藝術》的做者,著名計算機科學家高德納(Donald Ervin Knuth)之前說過:「軟件設計者需要的最主要的構件是算法、語言和數學。」在專業基本功能方面,環繞算法和數學,積累足夠的專業基本功。這是計算機類大學生該有的準備。安全
很是多人在開始一個新的學習歷程時,老是關心需要有什麼基礎。上二年級要先上過一年級,要學會走先得要學會爬。這樣一種思惟easy理解,體現的是一種對系統學習的指望。實際上,無論要進到哪個領域學習,老是可以找到一個入口。隨時開展體驗便可。網絡
隨着體驗的加深。逐漸地將需要學習的其它內容拉進來。一種體系就這樣逐漸創建。在編程中,有必定的算法基礎是佔有優點的。數據結構
但現實的方法是,先從一種編程語言開始學習。經過學會編寫一些不需要複雜算法的程序。對編程有了感性認識,而後再進入算法與編程緊密結合的學習階段。機器學習
從這個意義上講,編程是不需要基礎的。
剛開始編寫的簡單程序,要處理的數據不復雜,構造一些表達式即可以完畢。
進一步的學習。利用一些很是樸素的算法思想就能解決的問題。在很是多時候都可以不用意識到算法兩字。剛開始學習的人甚至都先沒必要關注效率等project中必須關注的重要指標。能解決這個問題。能將學習進行下去便可。
算法這樣一個重要的領域。不該該成爲剛開始學習的人起步的包袱。
編程學習中要先放開步子來,利用很是天然的思惟。解決需要體驗的問題,享受由此而來的一切成就感。
編程不需要有基礎。這句話是對的。其語境是面向白紙一張似的剛開始學習的人。從零開始學起,避其高深之處。找到入口得門而入。不論什麼的學習都可以這樣開始。編程要以算法爲基礎,這也是對的。其語境是面向已經具有了必定的程序設計基礎的學習者,要獲得提升,要將編程從關注語言的級別。提高到真正解決這個問題能力的級別。這就需要知道算法的重要性。
算法無論是做爲思考的中介,仍是思考的結果,都是在編程學習起步以後必須正視的問題。由關注語言的學習,轉而到對算法的重視。到達的就是一個新的層次。高層次老是在低層次積累到必定程度才幹到達。一方面,從低層次起步時。需要安於當前階段。經過學習和實踐,完畢該有的積累。還有一方面。積累到必定程度時,再行突破,到達另外新的層次。
可以對算法的學習給予超出編一手好程序的指望。遞推方法使用「步步爲營」的策略。不斷利用已有的信息推動求解,終於獲得收斂的解。枚舉(窮舉)方法有個霸氣十足的別名——暴力求解。從全部候選答案中去搜索問題的解;遞歸方法是一種直接或者間接調用自身的辦法;分治方法將要解決的問題劃分紅若干規模較小的同類子問題。將子問題的解逐層合併產生終於的解;貪婪方法從初始解開始就在追求接近給定的目標。以求儘量快地獲得最好的解;試探算法選擇一種可能進行試探,發現選擇錯誤就即時回退,而後繼續試探;分枝限界法意圖找到最優。將不可產生最優解的分支儘量早地剔除候選隊伍。算法思想的光芒普照天下。這種策略事實上並不限於編敲代碼。
學計算機的人是能幹大事的,學計算機的人是多面手。他們的底氣是掌握這些歸爲類的方法和策略。
算法學習中會遇到很是多問題,結合着數據結構,環繞着抽象數據類型漸次展開。算法研究人員和算法的學習者並不是整天鑽在抽象的符號當中工做,經典算法經過是藉着經典的詳細問題。甚至是一些好玩的故事來體現。
查找和排序既是在計算機系統中使用頻率最高的問題,又是特別能體現算法思想的問題。
揹包問題、貨郎擔問題、流水線調度問題。相應着無數的各式應用。
在智能計算中大顯身手的模擬退火算法、遺傳算法、神經網絡等等,來自大天然的智慧,促成了計算的成長。
效率問題是程序設計中的核心問題之中的一個。
程序執行要儘量快,佔用內存空間要儘量小。算法的學習中,處處都體現出了這種「精打細算」的味道。咱們能順暢地讚揚視頻,遊戲中享受着逼真的感受,點擊「搜索」,瞬間就有搜索結果呈現在眼前,可以體會一下這些應用背後高效率的算法立下的奇功。到了移動計算、物聯網的時代。手機、平板電腦這些低速計算設備,以及計算能力更加有限的專用設備顯得更加劇要,對效率的追求不降反升。在環境保護日益受到重視的今天。計算機設備的耗電量已經成爲用電大戶,中國全部臺式機的用電量,至關於三峽電站發電量的總和,用上更快的算法,意味着計算機執行時間的減小,「綠色計算」成了業界的共識。
隨着技術的發展,不斷有執行更快、存儲量更大的計算機被製造出來,也有了將不少其它的計算機鏈接起來組成機羣。提供了超級的計算能力。在這種背景下。有人質疑:「現在的機器設備已經足夠快,還用如此費力地用人腦在算法方面有那麼多的考慮嗎?」他們主張。遇到問題,用暴力求解方法寫成程序,交給足夠快的超級計算機。一切搞定。甚至我親自聆聽過一位著名教授的言論:「咱們不需要在算法方面花那麼大的精力。利用機羣,添加並行度,是一種更直接和簡單的方法。」教授的言論有些道理,但事情並不是如此。
舉一個實例。在物理學、力學以及信息處理的很是多領域,常常需要用到離散傅里葉變換。從算法複雜性度量的角度看。假設直接用公式計算,需要n^2次乘法。假設可以利用指數函數的週期性和其它一些計算技巧,則可以把計算量減小到nlogn次,這個方案叫作高速離散傅里葉變換。算法關注計算規模。當n值很是大之後將會體現出高效算法的必要性。假設現在要用計算機對衛星拍攝的照片進行分析處理,對10×10 cm^2的照片每隔1微米進行劃分而後進行計算。用傳統的傅里葉變換算法,需要計算n^2=1016次。即一億億次,假設用百萬次級的計算機。需要300年。這種算法是在實際應用中不能接受的,而使用高速算法,則可以在1小時內得到結果。
在摩爾定律的做用下,計算機的能力在飛快地增加。價格也在不斷降低。但是,永遠不會有太快的計算機。因爲總會產生出新的應用。進入了大數據的時代,需要處理的信息量更是呈指數級的增加,已經給計算、存儲的設備提出不少其它的挑戰。
基於互聯網,現在每人天天都會創造出大量照片、視頻、語音、文本等數據,日益先進的存儲手段使咱們每個人的信息量都在爆炸式的增加,互聯網的信息流量和日誌容量也在飛快增加。在科學研究方面,隨着研究手段的進步,數據量更是達到了史無前例的程度,三維圖形、海量數據處理、機器學習、語音識別,都需要極大的計算量。在將來。更需要依靠卓越的算法解決這個問題,更需要大量的掌握了算法規律和方法的高水平人才承擔責任。
面對一塊巨石,等待一位大力士將之強力搬開是一種辦法。找來一根槓桿,用很是小的力量也可以將之撬動。常期望着高性能的計算機求解。依靠的是大力士,而在算法上作文章,用的倒是巧勁。咱們需要的是智慧的力量,體現出的是智慧的美。當遇到不論什麼大力士都沒法撼動的巨石時。咱們僅僅有依靠智慧了。
學計算機。要關注算法的學習。除了在課名中就帶有「算法」的課程。專業核心課程差點兒都是環繞算法展開的,僅僅只是針對的是專門的問題:操做系統關注的是系統資源分配、管理的問題和解決算法;編譯原理關注人工語言處理的算法;計算機網絡中的重點——協議實際就是算法;計算機圖形學關注圖形表示的數據結構。以及圖形顯示、變換等的算法。多媒體技術基礎是圖像、音頻、視頻編碼、壓縮的算法;password學中是保證信息安全的算法。人工智能中涉及各類決策、模式匹配、優化算法。並行計算是多處理機同一時候完畢一個任務的算法。各類基礎的課程,雖然其描寫敘述的方式中數學味濃一些,涉及的也是算法。離散數學、可計算理論是算法,線性代數、數值分析、機率論和數理統計中也是算法。認識不到這一點,有些同窗就會聲稱的「操做系統中全是些概念。背一背就過了」、「機率論沒實用」之類的斷言。真的會將本身學習的方向引入歧途。甚至找不到方向和動力。經歷了求職的大學生會發現,技術類崗位的筆試、面試,考到、問到的內容,需要的是算法基礎。
在企業招人的考試中都是這樣,可以知道算法的基礎性做用。
學得常用的算法,學會算法分析和設計,這是計算機類專業大學生應該達到的程度。遇到要解決的問題時。爲問題創建計算模型。用已有的算法解決這個問題。進一步,能依據詳細問題的實際情境,從多種算法中選擇一個最合適算法。更高的要求,解決這個問題沒有現成的算法可以利用。憑藉着算法方面的良好素質,可以在已經有的算法基礎上進行改進,甚至運用學到的算法策略,設計出新的適用算法。這是充滿創造性的工做。在高等教育中專科、本科、碩士、博士的不一樣層次,都設有計算機專業。不一樣的學歷側重不一樣。學歷越高,對算法要求有更深刻的學習,並且要學習和研究的算法。由通常性算法問題逐漸過渡到專門的算法。
有人說:「本科生用不着學太多的算法。」他當即可以舉出的樣例就是。現現在有多少碼農的工做需要算法?很是多人的工做,拖拖控件,寫些調用數據庫的語句,如此而已。這是業內一部分技術人員的工做場景,但這不是全部。不能成爲咱們放鬆學習算法的理由。
要在行業的生態系統中生存發展,對大學生的要求不能僅僅看着技術生態鏈中的一部分。縱觀行業中高薪的、核心的技術崗位。豈是僅僅會拖控件就能勝任?萬萬不可以將剛進入行業時立足的工做形態,看成長期發展的形態。這句話背後的事實是,有些本科生連拖控件的要求都達不到。
這句話也還提醒咱們,專業基礎很是重要。但基礎不是全部。花一段時間,實踐應用開發,學習和體會拖控件之類的其它技能和要求,這也是大學中必要的安排。
很是少用到算法的人,有些人是知其有且知其沒必要用,而有些人是不知其有。進而需要用時固然也不知用,這雙方面的差距很是分明。
實際上,人們之因此說算法很是重要,是因爲不論什麼的程序,不論什麼的軟件。都是由很是多的算法和數據結構組成的。大學階段學習的算法都是主要的算法。是做爲每一名專業人員都需要有的公共知識,實在沒必要因爲「很是少用到」就生出「放一放」的心思。
這樣看來,有的程序猿很是少用到算法的背後,體現的是軟件行業中的分工不一樣。
可以將軟件開發工做分爲算法密集型、業務邏輯密集型和使用體驗密集型三種類型,這三種類型的工做對算法的要求各不想同。算法密集型的如搜索引擎、遊戲引擎開發、模式識別等,這些主要的任務都與算法密切相關;業務邏輯密集型。典型的如信息管理系統,當中工做量最大的是實現用戶的業務需求,熟悉用戶的業務並按要求完畢應用更重要;使用體驗密集型,如教育、遊戲軟件開發,更注意友好的界面、方便的操控和愉悅的使用體驗。在後兩種類型的工做中,會有90%以上的代碼僅僅是涉及到業務流程,以及用戶界面,的確不需要直接使用什麼算法。但是,每每就是餘下的10%代碼,有至關高的性能要求。所採用的算法決定了系統整體的性能,決定了產品的競爭力。想在軟件行業成爲有競爭力的從業者。有儘量好的算法功底,也就成了天然的選擇。
傳說中,數學對計算機很是重要。但有些程序猿也宣稱感受不到數學對他們的意義。事實上考察下來,與對算法的態度對照下來。有關用不用數學的觀點,也是大體相似的。
有位學生給我來信,他很是想知道高數和線性代數對計算機專業有什麼做用,要學到什麼地步。這個問題在和大學生交往過程當中沒有少被問到。一些人僅僅是問問而已,還有的是想找個理由不想學那麼多數學,固然應該都是遇到了困難。有些計算機類專業的學生,對學數學有情緒。
數學對於計算機學科的重要性常被人談起。數學與計算之間存在着不可切割的聯繫:數學起源於對計算的研究,計算做爲數學的研究對象已有幾千年,數學仍在爲計算提供着理論、方法和技術,而計算科學爲數學提供了能本身主動計算的設備。併爲更有效地完畢任務提供了project方法和技術手段。計算之前是數學的一個分支,而當其承擔起構造能本身主動計算和會思惟的機器的任務時,逐漸發展出了其特有的成分,並具備了不少其它project性質的內容,造成了本身的體系。
雖然現在計算與數學已經再也不等同看待,但縱觀學科間的聯繫,計算與數學之間的親緣關係仍是近期的。
數學,對於計算機專業人員的做用主要表現在兩個方面:
第一方面。是數學的思惟之用。
數學是科學之母,承載的是一種科學家思考和解決科學問題的詳細方式和途徑。學數學的過程,就是要得到這種思考和解決這個問題能力的過程。還可以得到從事IT行業的技術工做中需要的邏輯思惟能力和嚴謹的工做做風。
還有一方面。是數學的直接之用。數學可以直接應用於解決一些問題。數學是從各類實際應用需求中抽象出來的理論,之因此要將實際抽象成理論,目的就在於將直擊本質的、具備普適性的理論更好地指導實踐,將已有的理論,伸入到無限的應用場景中。在計算機project實踐中,要大量用到數學各個分支的知識。好比
· 無論二維平面畫圖仍是三維動畫軟件。都需要有幾何學的支持;各類圖形軟件開發中,需要用線性代數中的座標變換、矩陣運算。
· 遊戲開發中圖形處理是一個重頭戲,此外,還涉及物理方程和公式,想一想憤慨的小鳥在被彈射出去的那一剎那,彈力、重力、滾下斜坡。通通要用到;
· 談及數據壓縮與還原、數據加密與解密,以及倍受關注的信息安全,離不開數論、代數編碼理論,小波函數等數學分支;
· 在人工智能及其衍生的各個領域。涉及決策、智能的話題。機率、統計不能不提。
這種樣例數不勝數。有很是多人感嘆。搞計算機,學多少數學都不算多。
IT業是一個包容性很是強的行業,很多從業人員並不是計算機專業畢業,甚至有很多沒有接受過大學教育。很是多在校大學畢業生很是在乎這種「搶飯碗」的事情,也爲此表示擔心。
應該要意識到。一些簡單的專業技能、通常的程序設計技術,門檻並不高,掌握起來相對easy,讓不少其它的人有機會從事合適的工做。要能接受這種事實。
而做爲計算機類專業的大學生,需要知道本身的競爭優點和不可替代性,就在於在接受專業培養的過程當中。具有了專業的思惟,積累了紮實的關於計算的基本理論,掌握了不少其它人員並不深究也深究不了的東西。好比,算法、計算機體系結構,等等。
用專業的思惟分析和解決這個問題,有能力研製大型系統。從事底層開發,這需要有專業的知識結構和技能做爲支撐,當中數學方面的知識,在爲專業理論充當支撐。數學專業的畢業生到軟件企業中從事軟件設計與分析工做的工做要有優點。而計算機類專業的畢業生從程序猿起步的居多,緣由就在於數學專業的學生在分析推理能力方面,從所受的訓練要比計算機類專業的學生多。計算機類專業畢業的學生有本身的特色,倒不用對數學專業的學生有多少羨慕。但從中應該看到數學對計算學科的重要意義。
至於和別人搶低端飯碗的專業畢業生。一方面。這僅僅是在剛進入行業的一種方式,還有一方面,有些畢業生沒有具有專業的核心能力。不得不這樣去作。
只是,也有IT行業的專業技術人士說,他們在工做中根本沒有感受到數學的存在。甚至有人以爲程序猿不需要了解數學,更重要的是要去了解設計模式、面向對象原理、軟件工具、界面設計,以及一些其它相似的東西。數學很差也可以作一個很是專業的程序猿。
這種感受是對的,這也是在行業內的一種生存方式。
爲何會有這種感受?從數學的思惟之用看。當訓練出來了專業思惟,在解決這個問題時。天然而然就用上了。這是一種最佳的效果。我之前與個人學生談離散數學很是重要,其重要程度甚至到了差點兒感受不到其存在的程度。這句話聽起來矛盾,我要說的是,要讓離散數學的精髓成爲你的思惟習慣。遇到問題。不用想用離散數學中的哪一個定義、定理,但確實就是那樣想了,那樣作了,這和武術中的「出手不見招」的境地是同樣的。
從數學的直接之用看,大學教學需要關注到將來各類可能的用途,要考慮到大多數人的需要。這樣一來,對某些人,天然會有一部分用不上。
工做中是否要用到大量的數學。和從事的工做領域有很是大的關係。好比:
· 投身到科學計算。以及近幾年很是熱門的數據分析領域,數學知識時時要用。
· 從事遊戲開發,涉及圖形處理、實體建模、逼真效果展現,數學很是重要。
· 從事系統開發中最核心的工做。在算法層面考慮問題。數學基礎很差不行。
· 涉及信息安全領域,沒有數學功底無法玩。
然而。假設從事的是系統實現環節的工做。如大多數信息系統開發中的實現、測試工做、人機交互界面設計、系統管理等崗位,真的就不需要太多的數學,感受不到數學的存在也就不足爲奇。
另一個因素是,軟件業內的分工進一步細化。很是多在開發中需要用到的底層處理由成熟的軟件組件提供。用到的數學就「藏」在這些組件中,不需要開發者考慮了。好比:
· 搜索引擎構造中要用到複雜的算法,而大多數的開發直接引入類庫,如開源的Lucence,調用函數便可;
· 遊戲開發中要到各類計算模型。足以將眼下游戲開發隊伍中一大半人淘汰,但使用功能強大的遊戲開發引擎,如2D的Cocos和3D的Unity,難度、成本減小,開發週期縮短,開發質量提升,何樂而不爲?
因而可知,數學對於計算機類專業很是重要。但也不是重要到每個人都必需要精學多學的那種程度。行業中有分工,每個層次、每個領域需要的能力結構和要求也各不一樣樣,實在也沒有必要千人一面地作出硬性的要求,要求你們都向數學專業的學生靠攏。另外,在有限的大學時間內,僅培養出突出的數學能力是不夠的。誠如上述所提到的純粹project的能力,也是不可或缺的部分。在這一方面,計算機類專業的培養方案仍是考慮了這種需求。當中,對計算機科學技術專業。在數學及其它的理論方面的要求相對要高。而對於軟件project、網絡project等專業,project能力要求相對更重要。
這不能成爲一些同窗放棄培養方案內正常的數學課要求的理由。
數學的思惟之用和直接之用並不是可以嚴格劃分開來的,數學之用的無限可能也不是哪位老師能任意講清。在大學這樣一個重基礎的學習階段。仍是要有些耐心。完畢該有的積累。咱們應該看出,達到培養目標的畢業生,在各類崗位上的遊刃有餘。數學和算法能力強的。將擁有不少其它的選擇機會。即便是在利用Lucence和Unity開發探索引擎和遊戲,假設能對其內部的機制多一引發瞭解。你的層次將不只僅是「使用」,而可以是「駕馭」,意味着工做質量的提升。意味着你的我的價值和潛力。而假設過早地放棄了對專業核心能力的追求。在崗位選擇以及發展空間上面臨的限制,也就顯而易見了。
除非是因爲各類緣由真的失去了機會,咱們再做退而求其次的打算。
=================== 迂者 賀利堅 CSDN博客專欄================= |== IT學子成長指導專欄 專欄文章的分類文件夾(不按期更新) ==| |== C++ 課堂在線專欄 賀利堅課程教學連接(分課程年級) ==| |== 我寫的書——《逆襲大學——傳給IT學子的正能量》 ==| ===== 爲IT菜鳥起飛鋪跑道,和學生一塊兒享受快樂和激情的大學 ===== |