一部份的高三學生現在要到大學進行面試,高中部的輔導老師請我幫一些有意申請資訊、電機科系的同學進行模擬面試。
看了他們的書面資料後,覺得學生對於他自己要申請的科系完全不瞭解,貼了幾個範例程式碼就要說自己對資訊科系有興趣……所以我有一些話想對他們說。
很多同學提到在開學前這段時間想加強程式語言的練習,特別是 Python。熟悉語法當然是好事,但其實程式語言的學習在整個資訊或資工領域中只佔了極小的一部分。
你去看看各大學資工系的課程就會發現,真正學習「程式語言」的課,大多只出現在大一上學期,而且通常只有一門。後續雖然會有像組合語言這類的課程,但數量不多,有些甚至是選修。
學習 Python 的過程中,你學到了什麼?可能就是變數、陣列、條件判斷(if)、迴圈(for)、檔案讀寫等內容而已。這些內容換成 C 或 C++ 語言學習也差不多,甚至在國小、國一學習 Scratch 積木語言時,學的也是這些基本概念。所以,關鍵其實不在「語法」,而在於「背後的邏輯思維」。
資訊系在唸什麼
如果資訊系重點不是在學程式語法,那資訊系在研究什麼呢?
不論是資訊工程系還是資訊管理系都面臨了一個問題:「如果沒有念資訊的人也能寫程式,那我們資訊人的價值在哪裡?」
答案是:資訊系訓練出來的人,能寫出效能更高、結構更嚴謹的程式——往往是他人的 10 倍、甚至 100 倍。
換句話說,資訊系的畢業生擅長用更有系統、更高效率的方式來解決問題。
這種效率的差距,來自於對問題本質的深入分析、有效的問題拆解,以及透過數學手段來加速解題。也因此,資訊系裡其實有很多數學相關的課程。
舉個例子:有位同學寫了一個用來求某個數字所有質因數的程式。她的做法是從 2 開始,一直到這個數字本身,逐一嘗試當作除數來除,看看哪些能整除。以數字 33 為例,就是從 2 到 33 逐一測試是否能整除 33。
這樣的程式在處理小數值的時候沒有問題,但如果要分解的是像 1,000,000 這樣的數字,就得執行將近一百萬次的運算,效率明顯不夠理想。
怎麼優化呢?觀察 1,000,000 的質因數組合會發現,它可以寫成:
1 × 1,000,000
2 × 500,000
5 × 200,000
10 × 100,000
……
我們會發現每組乘積都是一個小數配上一個大數,這樣配對下去,兩邊會逐漸逼近某個「中間點」,也就是這個數字的平方根。以 1,000,000 為例,它剛好是 1,000 的平方。所以只要檢查從 2 到 1,000 的數字是否能整除它,就能找出所有質因數。沒必要從 1 一直檢查到 1,000,000。
這樣做,所需的運算次數從 1,000,000 次降到 1,000 次,效能提升了 1,000 倍。
但還能更快。
原本的程式是從 n = 2 開始,每次加一(n++),嘗試用 3、4、5… 直到 1,000,000 來除 (改進後的程式則是用 3、4、5… 直到 1,000 來除),但其實質因數分解的最終結果都是以質數呈現,例如:
1,000,000 = 26 × 56
也就是說,我不必測試 4、6、8、10 這些合數,只要用質數來試除就夠了。
如此一來我只需要準備小於等於根號 1,000,000(也就是 1,000)以內的所有質數 (總共 168 個) 來當除數就可以了。
程式的第一次改進讓執行次數從 100 萬次大幅降低為 1,000 次;第二次改進讓 1,000 次計算再降低至只需執行 168 次就完成計算,效率再提升 5.95 倍,相較原始版本快了 5,950 倍。
這樣,不論你要判斷一個小於等於 1,000,000 的數字是否為質數,或是要找出它的質因數,只要這 168 個質數就夠用了。
可能你會問:「老師,那我怎麼知道該準備幾個質數才夠?我怎麼知道會不會遇到超過 100 萬的數字?」這就是需要你自行分析。如果大多數情況下你處理的數字都在百萬以內,那這組質數就夠了;如果未來有機會處理更大的數字,就設計程式在遇到更大數字時,能動態擴充質數表。
這樣的邏輯分析與優化思維,在資訊系非常重要。其中一門核心課程叫《演算法》,專門研究如何用更快的方式解決問題;還有《資料結構》,則是研究資料該如何儲存與操作,才能更有效地進行查找、新增、刪除等操作。
簡單來說,程式語言只是讓你「實作想法」的工具,而不是資訊科學的全部。
再舉個例子:若我要檢查 1,000,001 是不是質數,經過分析,我知道祇要檢查 2 ~ 1009 這 169 個質數是否能整除 1,000,001 即可,即便我用 Scratch 這種給小朋友用的積木語言寫程式,寫出來的程式執行效率還是高於一個未經仔細思考、需要執行 1,000,001 次的程式──即便它是用 Python 或 C++ 撰寫的程式。
即使 Scratch 本身速度慢,但由於演算法優化得當,總執行時間反而更短。
哪些人適合唸資訊?
喜歡拆解問題、樂於思考與分析;對數學有興趣、不滿足於現況,總想找到更快、更有效解決問題方法的人——這樣的你,非常適合走進資訊的世界。相對地,若你對不斷鑽研、挑戰既有成果缺乏興趣,那麼資訊領域或許並不適合你。
沒有留言:
張貼留言