身為一名程式人,心中隨時有許多待解的難題,有時解題的挑戰來自於語言或技術,有時來自於演算法、架構、管理等各個方面,現在許多應用更來自於數學相關領域。

你不得不承認,解題的樂趣就在於,挑戰經常以失敗做結,因而你得持續吸收新知、不斷練習,在偶然靈光一現時再度挑戰,直到想法被證明可行而解開問題的那一瞬間,接著再度迎接下一個挑戰。

初遇球極平面投影

在3D程式建模這領域中,我有許多待解的題目,有些題目來自於生活上各種物品的觀察,有時來自於3D社群網站上其他作品的啟發,更多是來自突然的異想天開。

我印象中最深的難題之一是〈挑戰OpenSCAD迷宮產生器〉,從那之後,我又接連挑戰了各種題目,像是用費式數列建立蓮花、嘗試三維的貝茲曲線、實作出三維樹木碎形等,在這個過程中發現,實現一個作品時的欣喜感,終究只是短暫,因為總在不久之後,我又飢餓般地尋覓下一個題目,再度進入自尋苦惱的日子。

談到我想面對的挑戰之一,是曾經在3D社群網站Thingiverse上見過Stereographic projection作品,那是一個鏤空的圓球器皿,如果拿個手機在球的正上方打燈,圓球器皿的影子會正確無誤地在桌面上,形成連續拼接的正方形,第一次看到這光與影構成的美麗畫面時,著實令人屏息,這無疑地是數學的藝術。

驚嘆之餘,帶來的就是好奇,這是如何辦到的?我搜尋了一下網路,在維基百科上〈Stereographic projection〉條目中談到,那是一種將球面映射到平面的投影法,若平面上置有一球,球面上有一A點,A點與球面正上方極點連成的直線,延伸至平面相交出來的點,就是球面A點在平面上的投影點。

一般而言,球面正上方的極點,中文稱為球極,因此,Stereographic projection中文翻譯為球極平面投影,簡單來說,這是一種以平面來看待球面的方法,某些行動相機App,也會運用此方式,以拍攝照片者為中心,製作出球面全景圖像,形成的圖像像是個小星球,而拍攝者位於星球的中心。

練習與思考的慣性

初遇球極平面投影作品的時候,我才進入3D程式建模不久,以當時之能力想解決這個題目,活像是唐吉軻德面對大風車一樣,當時身為唐吉軻德的我,根本看不出風車的樣貌,只能純粹幻想那是個巨人,別說用寫程式了,我連數學公式都還導不出來,維基百科雖然列出一些式子,當時的我根本就看不懂。

這題目就暫且擱著吧!後來的我,試著從一些小作品開始練習,每一次的練習就成為下個作品的養份,隨著作品的複雜度漸漸提高,透過基本圖案聯集、交集、減集等的方式,就不再能解決問題了,而且,不得不開始面對一些簡單的三角函式,或是幾何數學問題。

太久沒有接觸幾何計算,一開始多半是有點畏懼的,然而隨著解決的問題增加,信心就又多了那麼一些,緊接著又想進行下個作品來練習腦袋,漸漸地,腦海中經常會浮現,不知何時看過的那麼一句話「數學是一種思考的習慣」,漸漸也能夠體會到,自己每次面對的題目,不過是又一個引導出整個思考過程的起點。

既然如此,過程中解不出題目也沒什麼好怕的,那反而是個收獲,因為我會知道目前的思路不可行,下次嘗試不同的方式就是了。

這樣的想法,也回饋到我的程式設計思維之中,程式設計中存在著技術面、管理面等各式各樣的挑戰,我先前專欄〈程式設計的「設計」〉中談到「程式設計思維」時就提過,那是一種「設計思考過程」,而優秀程式設計師「可能終其一生,都在為了在程式中融入設計,而不斷地學習各種的設計思維」,當你開始有了練習與思考的慣性,面對問題就不會再有畏懼,而是會有種期待了。

挑戰與失敗的慣性

記得幾個月前,我重新看了一下球極平面投影的定義,數學公式有那麼點瞭解了,於是,我試著將公式使用程式實現,並運用當時已知的建模知識與經驗,做出了一個可將平面文字映射至球面的版本,這取得了階段性的進展。

當時的方式是以一個小方塊為單位,與平面上的文字取一個小交集,透過球極平面投影公式放到球面適當位置上,然而,球面上最後只是許多不連續的小方塊,這仍然不是我想要的,因為,不連續的小方塊是無法列印的。

事實就是如此,當你從待解問題集合中,重新拿出某個題目來挑戰時,沒有人能保證這次就能贏得挑戰,能取得階段性進展也不是常態,多半是以失敗收場,無論是何種結果,終究還是得將問題再度置回待解問題集合之中,等待下次的靈光一現,再度面對挑戰。

寫程式也是如此,特別是在面對不熟悉的技術或領域時。

像我最近為了深入瞭解Prolog,一如過去想認真瞭解某個語言時的作法,又開始用Prolog練習起〈常見程式演算〉中的題目,由於Prolog本身語法,以及邏輯式典範上的不熟悉,感覺每個題目都是舉步維艱,然而,挑戰與失敗已經是種慣性了,無論結果為何,持續地思考就是了。

此時,使用Prolog練習那些老掉牙的常見程式演算,給了我靈感,何不重新用OpenSCAD來挑戰迷宮呢?一年前的我花了近三天的時間,一年後的我會花多少時間呢?除了實作出來之外,這次何妨考慮一些效率、彈性與程式碼的可讀性呢?

幸運地,這次的挑戰是成功的,建模成功加上重構、排版程式並加上註解,大概三個多小時就完成了,當挑戰與失敗已成為一種慣性,這種成功的喜悅是進一步成長時很好的養份。

讓運算與思考成為習慣

既然有了重新實作的迷宮程式,上星期偶而地靈光一現,讓我又想從待解問題集當中,再度拿出球極平面投影來挑戰,來做個可以自動產生迷宮的球極平面投影如何?

不知為何,這次覺得一定能成功了,而當第一個版本實現時,心中頓時充滿了無限個爽字,然而,緊接著的又是下個想法的浮現,因此,從第一個版本之後,我又完成了數個版本,每個版本都改進了前一版本的問題,而每個版本又帶來一個新的想法與難題。

我到底完成了幾個版本呢?數不清了,應該是有十來個版本吧!我這輩子大概第一次這麼密集地不斷算數學,不斷導證新的公式,然後持續使用程式來實現。

其實,有的版本其實是以失敗做終的,頓時間我腦中出現了一個聲音:這些都是有關運算,而運算思維中真正要培養出的能力,不就是讓這種不斷重複練習、思考、挑戰與失敗的過程,成為習慣嗎?

現實的狀況是,我們會不斷地遇到各式各樣的難題,無論是程式設計上的,甚至是這些日子以來益發受到重視的相關數學應用,有些問題不會有模式、既有的程式碼可以參考,甚至現有的技術也可能不符合需求,有些挑戰也不會有現成的數學公式可以引用,你只能讓運算成為一種習慣,讓思考成為一種習慣,然後用這種習慣去面對問題,從而解決並發現新的挑戰。

作者簡介


Advertisement

更多 iThome相關內容