2015年5月11日 星期一

程式與數學

「寫程式到底要不要把數學學好?」這是每個程式設計論壇必定出現的月經題。當然,站長的數學功力也不過中下,如同很多台灣人的觀念「你沒當過導演怎能批評電影難看?」、「你沒有博士學位怎能批評博士學位無用?」...這樣以站長的程度似乎也沒辦法說服大家數學的重要性,不過倒是可以分享幾個親身經歷,或是別處聽來的小故事。


在「如何避開老鼠屎」這篇舊文中,站長分享了用簡單的中位數來判別觸控輸入是否合法?但事隔多年後,站長發現自己的作法大錯特錯。為什麼?強者我朋友兼老長官,曾經有幸在他麾下服務的 ChamberPlus 大師在「一個A/D 的系統應用問題」這篇文章講的很清楚,面對電壓突然的變化,這是一個物理現象,要用濾波器的數學觀念來解決這個問題,很可惜站長的根基太差,當時無法知道要怎麼樣正確的面對這個問題,而只能傻傻的平均(同時不停被客訴為什麼觸控不靈敏)

站長還曾經去一間做液位感測器的公司求職。在考試結束後,該位主管向站長展示他們的一些工作流程與一些技術文件,站長親眼看到,大一微積分必考的三重積分求體積的公式出現在技術文件裡,原因很簡單,因為要做精準的液位偵測,必需要知道容器的容量形狀體積。

另外有一篇文章是站長常常跟別人分享的,不意外也是 ChamberPlus 大師的傑作:電子自學學習心得回憶,站長也親眼看過這本筆記,真的不簡單,什麼叫研發,這才叫研發好嗎!

正如同 XDite 講過的,數學程度好的人,他們解決問題時會先把問題想通才動手(強者我另一個朋友 Yukuan 也有同樣的傾向),但是一般的工程師就是不停的 try and error......

Programming Pearls 的作者 Jon Bentley(也是演算法宗師)講過,你要抗拒「不停把程式改到對的邪惡衝動」,而是要「徹底了解程式做了什麼?」

除了數學,也有人認為他的近親演算法無用,覺得會呼叫 API 就好了。如果是這樣,那為什麼 Microsoft、Google、Facebook 要爭相搶奪 topcoder 裡面的解題高手呢?(據說 Google 還聘用了一堆數學博士)

原因很簡單,我們面對的是一個每天在變化、極為複雜的世界,那些現成的罐裝解法(API),不可能適用於每個問題,就算問題極為接近,往往也被迫做出適當的修改,這些受過大量題目訓練的演算法高手,比一般工程師更快能 sense 到問題的本質,也能很快找出合適的演算法。(一個比喻是:受過這種考驗的工程師,本身氣場不同)

最後不得不提一下歷史上 trial and error 的名人,就是大名鼎鼎的愛迪生,他發明的直流電力系統今天幾乎已經無人使用,而大家每天使用的交流電力系統是他的死對頭 Tesla (是的,跟那個電力車公司同名)創造出來的。據說 Telsa 對愛迪生的評價是:

「他用的方法的效率非常得低,經常做一些事倍功半的事情,整體而言,我是一個很不幸的見證人,他如果知道一些起碼的理論和計算方法,就能省掉 90% 力氣。他無視初等教育和數學知識,完全信任發明家的直覺和建立在經驗上的美國人感覺」

要當愛迪生還是 Tesla,留給您自己判斷吧!

6 則留言:

  1. 小小指正一下: 是 trial and error

    回覆刪除
  2. 可惜一般大眾對Tesla的認識很少,只知道愛迪生!

    回覆刪除
    回覆
    1. 站長是從凡異出版的人物傳記知道他的,算一算也將近20年前的事了,可惜書已經絕版

      刪除
  3. 愛迪生的直流傳輸也不是一無是處
    在長途的傳輸上用高壓直流輸電比交流輸電成本更低 更有效率

    回覆刪除
    回覆
    1. 感謝您的補充與回應,這小弟也略知一二,不過這實在是要歸功後面半導體跟材料科學的進步,跟愛迪生本人關係到不大了。

      刪除