當程序猿遇上數學
曾經一直有人問數學老師,學數學有什麼用?我去買菜難道還要用到微積分嗎?我去開會難道還要用到線性代數嗎?這估計是很多人學不好數學、不想學數學而找的借口,但這個問題究竟要怎麼回答呢?今天我就站在程序員的角度上來回答下這個問題。
隔壁老王是一個剛入職的程序猿,最近正在被資深程序猿小明帶著。
小明:老王,你數學怎麼樣啊?
老王:啊,數學?加減還可以,乘除就要看了。
小明:¥#…&*)@!
1Mission One
小明:老王,最近射擊師小紅設計了一套不錯的UI動效,你不還是單身狗嗎,給你個機會去聊聊妹吧,把這套動效完成好!
老王:跪謝小明,保證完成任務!
小紅:動效很簡單,就幾個動畫,幾個自定義View,自定義View要能適配各種大小,點擊的時候判斷區域來顯示動態效果。
老王:包在我身上,so seay,just do IT。
過了幾天……
小明:時間就是金錢,我的老王,工作完成的怎麼樣了啊?
老王:尼瑪,這玩意算不清楚了啊,怎麼一會要算大小,一會大小算的又不對,還得去學自定義View的繪製原理,這什麼鬼!
小明:卧槽,你不是說你加減法不錯的嗎??這裡都是最簡單的加減法啊!!好好了解下自定義View的onMeasure和onLayout的含義和流程,下面就是完全的數學計算了啊!實在不行,公司有一本《Android群英傳》,裡面的第三章『Android控制項架構與自定義View詳解』,對自定義View的流程進行了非常詳細的講解,可以好好參考下。
老王:嗯嗯,太好了,我馬上去看!
的確,很多人抱怨自定義View很難,而實際上,一個基本的自定義View,使用到的,實際上就是最簡單的加減法,根據坐標、大小,來計算自己的位置,大小,而很多人覺得複雜,只是被一些高級的自定義View給唬住了,往往看見非常複雜的坐標運算,就放棄了。實際上,只要你『明知山有釜,偏向釜山行』,靜下心來仔細分析每個公式的含義,相信很快就能了解它的作用,同時,只要你淡定下來,好好梳理下你要實現的自定義View的顯示,根據Android所提供的那些API進行編寫,寫上幾個,就有套路了,畢竟,加減法還是很簡單的嘛!
2Mission Two
小明:感謝天,感謝地,你的自定義View終於寫好了,可是動效呢?難道你看片只看截圖?趕緊給我動起來!
老王:哦,我一般都是老司機帶著看的。我嘗試下自己動動吧。
a few days later……
小明:時間就是金錢,我的老王,工作完成的怎麼樣了啊?
老王:為了部落,我的女王!
小明:別BB,今天搞不定,晚上團隊保健,哦不,團隊活動你別來了。
老王:可是,這個區域真的很難啊,我數學不好,可是要判斷『一個點擊點是否在一個閉合路徑內』,這個問題很難啊,我在網上找了,這個至少要用到高中數學啊!!
小明:卧槽,你似不似傻!Android提供的API你都了解嗎?通過Region不就可以很方便的判斷了嗎??還演算法,算你妹啊!
老王:嗯嗯,太好了,我馬上去看!
的確,很多人抱怨自定義View裡面要做很多很複雜的判斷,一會牽扯到這個演算法,一會牽扯到那個演算法,但實際上,這些都是你對Android API不了解所造成的,很多常用的演算法的判斷,都被Android所封裝了起來,你只需要簡單的調用即可,否則,你就會花費大量的時間,來做一些無謂的工作。另外,掌握好Android的一些API,可以給你提供更簡單的繪製方法,例如對Canvas的旋轉、鎖定、圖層等API的使用,有時候就可以讓複雜的角度計算,變成加減法的運算。
3Mission Three
小明:老王,小紅跟我反映,你上次的動效很僵硬啊,完全不像是一個高級工程師寫出來的東西啊
老王:卧槽,我本來就不是啊。
小明:你都工作好幾天了,是時候向高級程序猿進軍了!來,把這個動效改的更自然一點吧!
老王:哦,是不是寫完就是高級程序猿了。
數日後……
小明:時間就是金錢,我的老王,工作完成的怎麼樣了啊?
老王:我看了,要模擬更加真實的動畫,就需要用到TimeInterpolator和TypeEvaluator,還有各種函數的計算,這明顯要用乘除法了啊!
小明:卧槽,你高中數學老師在哪,看我打不死他!幾個函數圖像都不能理解,你還想進階高級程序猿!好好看看微信公眾號『Android群英傳』的這篇文章吧模擬自然動畫的精髓——TimeInterpolator與TypeEvaluator,要想多學乾貨,一定要多看這個公眾號!
的確,程序開發中的很多細節,都需要使用數學來進行精益求精。文中的這個例子,就是一個比較典型的代表,函數圖像在開發中有很多用處,但這並不代表我們需要去推導、去研究新的函數,至少老王的高中數學還達不到這水平,我們只需要去了解、知道如何使用、計算就OK了。讓專業的人去做專業的事,我們是程序開發、而不是數學家。
4Mission Four
小明:老王,你已經是高級程序猿了,是時候給你一些高難度的任務了。
老王:我才工作幾天啊!
小明:嗯,不錯,這次的圖像處理任務就交給你了哈,頑張ってください!
逝者如斯夫……
小明:時間就是金錢,我的老王,工作完成的怎麼樣了啊?
老王:圖像的處理要使用到矩陣這些知識,我現在正在複習線性代數!
小明:卧槽,複習你妹啊!圖像處理也好、Matrix變換也好,用到的線性代數最多不超過線代的第一冊、第二章、第三節!了解最基本的矩陣知識就可以了啊,實在不行,去看看公司那本『Android群英傳』的第六章和第七章吧!
老王:嗯嗯,我馬上去看!
的確,矩陣在Android中用的非常多,很多程序都是通過矩陣來進行運算的,這也是線性代數的實際意義所在,很多人剛開始學習線代的時候,認為好像壓根都沒有一點用,但實際上,這些都是現代計算機的基礎知識,掌握好這些知識,可以讓你在後面開發程序的時候,對這些處理有更加深刻的認識,因為雖然SDK給我們封裝了很多矩陣的操作方法,但是,知其然,and其所以然,會讓你對知識點有更加深刻的理解,同時,遇到問題,也有更多的思路去分析。
5Mission Complete
老王:小明,你簡直比數學老師還牛逼啊,短短几天,我的數學突飛猛進啊,我感覺現在已經直逼高等數學了啊!
小明:你知道我為什麼要用自定義View來給你講解數學嗎?自定義View對於初學者來說,是學習Android常常遇到的第一隻大老虎,而且也是最能看出一個程序猿數學基礎的知識點,一個自定義View,說白了,就是讓你教計算機這個『智障』如何去畫畫,計算機什麼都不懂,他只能按照你的思維去繪製,而你需要做的,就是將View拆解成坐標點、已經點運動的軌跡,那麼這裡所用到的知識,包括但不限於以下幾種:
函數圖像
三角函數
角度與弧度
直線方程
貝塞爾曲線
矩陣
掌握這些基礎知識,不僅僅是學好自定義View,更是學好編程的基礎,當然,這裡面的大部分知識,在高中數學就已經基本學完了,大學裡的高數,不過是進一步的補充和優化,如果你是一般的應用程序開發,那麼這些就夠了,但如果你是一些比較專業的應用開發,例如圖像、音頻處理這些App,就需要比較專業的數學知識了。
所以說,程序猿需要數學嗎?如果你只想重複寫寫那些頁面,調整調整UI的話,那確實不需要,但一個不想當醫生的廚師不是一個好程序猿,如果你要讓你開發技能更上一層樓,那你就必須對數學有所了解,不管是最簡單的取模、排序,還是一些常用的演算法、圖像處理、圖形變換,或者說,是一些動效、UI,這些都需要數學知識來支撐。
另外,我想說的是,即使對於非程序猿,哪怕是文科生,數學依然是非常有用的一門學科,但它對於這些人的幫助,並不是在於方程、函數,而是數學思維的培養,數學思維,讓一個人的思維更縝密、邏輯有條理,這才是數學對人最大的幫助!
老王:小明說得對!小明真牛逼!
以上內容純屬虛構,如有推廣,是我故意的!
推薦閱讀:
※Android學習筆記之StudyJams篇——一、 Building Layouts
※我的學習之路
※Android主流框架面試要點(一)
TAG:Android學習 |