最佳化問題
學校教的最佳化問題與職場上的相當不同。
在學校裡求學時,最佳化問題在許多不同的課堂裡都出現過:最快的排序法、快取、最短路徑、最小等待時間、最大容錯率…。
這些最佳化問題往往:
理論很深
最佳化單一指標
是基礎知識
老實說,上述的知識,工作多年來,除了面試求職時容易用得上之外,我沒有覺得特別有用。少數特別有用的那回,其實我對圖學領域學得很淺,而我也只講了一句「要不要用 Bipartite Matching ?」而已。
另一方面,我在職場上開發軟體時,遭遇過的最佳化問題通常是:
不特別難,但是知識的廣度要夠。
要最佳化多個指標:正確性、機器執行效能、開發成本、日後的維護等
是綜合應用
用資料庫查詢 (Database Query) 常見的題目:Top n Per Group 為例子,這是一個職場上的最佳化問題。問題可參考下圖的圖示。比方說,「有某班級學生的考試成績資料,而我們想找出,國文、英文、數學、理化、社會、自然每個學科最高分的前三名學生。」這就是一個 Top n Per Group 問題。
首先,第一眼看來實在有夠簡單的,讀者可能看完了題目都還不明白,「這個怎麼可以算是一個題目,因為連大一新生都寫得出來?」
問題是…如果真的很暴力地『先寫 1 個查詢,把成績對學科分群;再寫 6 個查詢,對每個學科排序找前三名。』就立刻得到了 N+1 查詢問題。由於應用程式與資料庫之間的往往有 I/O ,參考下圖,機器的效能會極差,N+1 的解法通常是不行的。
我經過一些研究之後,學到了應用 SQL 窗口函數的解法,本來以為自己算是了解這個問題了。
不料,最近寫文章時,也順便了研究一下在 Datomic 資料庫裡,該如何寫出 Top n Per Group 。這才突然想通:「唉,窗口函數的解法很不直觀啊。要是 SQL 有辦法與 Datomic 一樣提供使用者免布署 (deploy-free) 就可以直接使用的『自訂聚合函數』(user-defined aggregate),這題就簡單多了。」
總結
學校教的最佳化問題與職場上遇到的其實差異很大,是否在學校表現優秀的學生,也會自然而然地在職場上表現優秀呢?如果不是的話,那程式設計領域的招募、面試方式應該要對此做出回應,不是嗎?



