姑且將寫程式要不要懂數學擺一邊,如果已經打定主意,想要成為一個懂程式、也能應用數學的程式人,該從哪邊下手呢?然而,數學有許多的面向,系統性地學習是必要的,從實務面著手也是可行的,當成閒瑕時的閱讀選擇也不錯,重要的是習慣將數學當成一個表達、思考的方向,就像是學習新語言那樣!

找本微積分的書來學吧!

其實,我們在成長的過程中都接觸過數學,只是有沒有學好的問題,學好其實不單只是在考試時能算出解答,還包括能否在生活上面對需求時,使用數學加以解決,就這點來說,許多人的數學應該都沒有學好,然後漸漸地,就忘了有些問題,是可以使用數學來思考、表達或解決,即便程式設計工作在其他領域的人看來,像是與數學有所關聯,很多情況下,程式人都沒有應用到數學。

也因此,許多人會覺得自己沒有數學方面的天分了,你說天分這東西是不是存在?任何領域確實都存在天分擁有者才能突破的屋頂,不過,大多數情況下,我們碰不到、也並不用去碰觸那個屋頂,只要夠用,將之當成是一個工具就可以了。而我們接觸數學,主要是習慣有這個思考方式,必要時拿來解決問題罷了,犯不著使用天分當作拒絕數學的藉口。

實際上,數學的基礎大多人都學過,需要的只是忘了過去的學習經驗,重新用另一個角度把那些基礎撿回來而已,在這個過程中,漫無目的地在網路上尋找,有點浪費時間,需要的其實是系統性地回顧,最好的方式找一本書好好地讀,從哪本書?雖然數學有許多面向,不過,這些的基礎,我想會是微積分。

正如維基百科上談到,微積分是「研究極限、微分學、積分學和無窮級數等的一個數學分支」、「在科學、經濟學、商業管理學和工業工程學領域有廣泛的應用」,別被嚇到了,其實不用成為微積分高手,而是要在數、函數、極限、連續、級數等的探討中,重新瞭解一個運算問題,是如何從簡單概念到複雜的思考過程,如果已經有點程式設計經驗的人,就會發現這個思考過程,跟程式設計確實是有很大的相似性。

當然,學習微積分本身還是會枯燥一些,這方面我有個建議,找那些補習班針對考試的微積分用書來看,因為有既定目的在,這些考試用書在理論與解題的偏重上會比較平衡,而且通常在解說表達上更容易理解,很諷刺地,學校應該是具備這類功能的地方,然而,補習班往往更擅長這件事,在我過去重拾微積分,甚至電子學等理論基礎的過程中,都是採取這樣的方式。

找一些要用數學解決的程式問題

不是每個領域的程式設計都會用到數學,這是個事實,如果平常工作的領域就是如此,想要在寫程式時,除了程式設計思維之外,還能夠訓練數學的思考方式,那麼,特意尋找要用數學解決的程式問題,就會是必要的方式。

如果要能系統地找出這類問題,方式之一,是從具有數學問題的演算法相關書籍中下手,像是《名題精選百則》就有〈數字問題〉,而《程式之美》中的〈數學之趣〉,也列舉了一些數學問題,這些甚至不需要實際寫程式就能解答,我們主要是能透過這些問題,提高思維能力;《改變世界的九大演算法》無疑也值得一讀,雖然歸類為科普叢書(意外地,中譯本被列在經營管理),裏頭沒有任何一行程式碼,卻能讓我們理解到數學家與資料科學家的重要性與成果。

相信不少程式人也察覺了,現在有些技術在使用前,必須具備有相關領域的數學基礎,沒有相關知識,在使用這些技術時會寸步難行,資料科學就是其中一例,幸而有些書設定的讀者,是只需要有基本的數學能力,然後採取一邊講解數學,一邊應用技術的方式進行,像是《Data Science from Scratch中文版|用Python學資料科學》,如果不想漫無目的地學習數學,這類書籍會是個方向。

當然,我這一年多來的最愛,3D程式建模也是其中一個例子,可惜的是,OpenSCAD的使用者相對來說不多,許多使用者多半也只用來做些簡單的設計,然後再經由其他建模軟體匯入修改,而我多半是透過其他3D書籍來學習必要的幾何數學,像是《JAVA 2D/3D繪圖程式設計實例應用》,近來我讀了一本《3D Printed Science Projects》,其中討論了3D數學函式、光與波、植物(像是花瓣的繪製)等,並使用OpenSCAD實作,如果對3D程式建模以及相關數學有興趣,可以參考看看。

Good Math

那麼,到底有沒有一本書,是專為程式人寫的數學書呢?《Good Math》會是個不錯的選擇。作者本身是個電腦科學家與軟體工程師,從小因為爸爸的職業,一直都有機會接觸到數學,因而對數學非常熱愛,他後來在開設的Good Math, Bad Math(http://www.goodmath.org/blog/)部落格中,分享他對數學的知識與熱愛,累積了上千篇相關文章。

雖然作者在《Good Math》的序中談到,書中每個主題都是獨立的,因而不用逐章閱讀,不過,我建議第一章、第二章還是可以看一下,其中討論到數字、什麼是自然數,然後從自然數延伸出整數的思考過程,值得好好玩味。因為,這就像建構軟體一樣,從最基本的元素開始,然後逐漸增加元件的過程。

如果開始覺得有些枯燥了,想看些與程式設計比較相關的東西,建議可以直接跳到第六部分〈Mechanical Math〉。一開始,你就會看到有限狀態機(Finite State Machine)的介紹,然後慢慢地理解到,Regular expression程式庫的實作,其實就是將Regular expression轉為有限狀態機。

接著下一章,會從圖靈機(Turing Machine)認識計算(computation)的本質,裡面提到,圖靈機是有限狀態機的延伸,並不是一個真實的機器,而是一個數學模型。書中,除了讓你瞭解特定目的圖靈機如何構造之外,還會知道有通用圖靈機(universal Turing machine),它可以接受其他圖靈機的描述(也就是現在所謂的程式了),從而模仿它的功能,如此一來,就可以為通用圖靈機編寫程式,以執行任何的運算。

這讓我回憶起過去曾經唸過的計算理論,不過,《Good Math》以更淺顯而直接的方式來進行表達。後續,作者還談到了圖靈完備(Turing complete)、λ演算等內容。如果對邏輯推演有興趣,也可以回頭看看第四部分的〈Logic〉,體會一下使用Prolog寫程式,會是什麼樣的方式。

讀一讀科普數學書

在日常的工作之外,還得花時間專心研讀數學相關的東西,其實也是滿累人的。數學有不同的面向,而其實現在有許多的數學科普書,也會從不同的角度來介紹數學,讓大家覺得數學很有趣,甚至也有不少是以漫畫的形式來表現,我有時也會看看這類的書籍,像是《世界第一簡單微積分》、《3小時讀通幾何》之類的,從輕鬆的角度來慢慢培養,其實也是個不錯的選擇。

從實用的角度來看,無論是哪種方式,時不時地接觸點數學,慢慢就會發現,數學其實有點像是程式語言,只不過,數學家是用數學符號來表達,而程式人是用程式語言來表達,而想要熟悉一門語言,就是經常地去接觸它,數學也不例外,當漸漸習慣數學的思考方式之後,在遇到問題時,除了程式語言之外,也會自然開始思考,這個問題是否有辦法使用數學來表達。

如果你願意,直接將數學看成是一門程式語言,也是很有趣,追求自我成長的程式人,每隔一段時間就會學習一門新語言,以獲得新的思考方式或啟發,那麼找個機會,就把數學當成是你的下一門語言吧!

專欄作者

熱門新聞

Advertisement