資訊的本質
當我說我熱愛演算法和資料結構時,大家總是一臉困惑。多數人都大概知道程式設計師在做什麼,卻不明白 Computer Science(資訊科學)究竟有什麼用。就算有人了解,也覺得它沒有什麼實際關聯性。就讓我用一個簡單的例子來說明,應用層面的 Computer Science 其實無所不在。
想像一下,你有一大堆襪子等著分類整理。這實在不是什麼令人興奮的消遣。你已經把這件事拖了很久,現在要做,恐怕得花上一個小時才整理得完。

來源:這款遊戲叫做 Sort the Socks,可以在 App Store 免費取得。
考慮了一下你的選擇,你決定找人幫忙。你和一位朋友一起動手,大約只花了一半的時間就完成了。
資訊科學家可能會把這堆襪子稱為資源。而你和你的朋友則被直接降格為工作者。你們兩個可以同時處理這個問題——也就是平行地進行。這就是 Parallel Computing(平行運算) 的精髓。
現在,整理襪子之所以很適合平行處理,是因為它具備一些特性。
- 工作可以被很好地分割。對每個工作者來說,找到一雙襪子所花的時間都差不多。
- 找出另一雙襪子是完全獨立的工作,可以同時進行。
指派越多工作者來處理這個任務,你就能越快完成。
- 1 位工作者需要 60 分鐘。
- 2 位工作者需要 30 分鐘。
那麼 3 位工作者需要多久呢?沒錯!大約 20 分鐘。我們可以為這種關係寫下一個簡單的公式:
嗯,這樣算不完全正確。我們忘了考慮 overhead(額外開銷):當 Mary(瑪麗)想拿起一隻襪子時,Stephen(史蒂芬)可能也正好伸手要拿同一隻。兩人相視一笑,其中一人就去拿另一隻襪子。在運算中,工作者也可能會做同樣的事。嗯,不會相視而笑,但會去挑另一個任務。當許多工作者共享資源時,這種情況會相當頻繁地發生。而解決這種狀況總是需要多花一點時間。所以,因為這個緣故,我們離理想的整理速度還有一點差距。
但情況還會更糟!假設你有 100 位工作者要處理 100 隻襪子。一開始,每位工作者可能各拿起一隻襪子並試著找到配對。問題來了:當他們每人各拿起一隻襪子後,就沒有襪子剩下了。所有工作者都處於等待狀態。整理工作就永遠卡住了。這就是 deadlock(死結),也是平行運算中最令人畏懼的情境之一。
在這種情況下,一個簡單的解法是把襪子放回去,等待一段時間後再試著拿新的襪子。另一種擺脫困境的方法,是強制規定一種整理時的「協定」。可以把協定想成是工作者之間為了達成共同目標而達成的默契。
所以,在我們的例子中,每位工作者可能只負責一種顏色的襪子。第一位工作者拿綠色襪子,第二位拿灰色襪子,以此類推。透過這個簡單的技巧,我們可以避免 deadlock,因為我們處理的是完全分開的任務。
但還是有個問題。如果只有四隻綠色襪子,卻有 4000 隻灰色襪子呢?第一位工作者很快就會閒得發慌。他一下子就把兩雙襪子整理好,然後只能看著第二位工作者整理剩下的部分。這可不太有團隊精神,對吧?
像這樣分割工作,只有在我們可以假設每種顏色的襪子數量都差不多時才有意義。這樣才能讓每個人的工作量大致相當。
下面的長條圖可以讓你了解我的意思:
在這個例子中,每種顏色的襪子堆大小都差不多。對我來說,這看起來是每位工作者都很公平的工作量。
在第二個例子中,分布並不平均。在這個例子裡,我可不想去整理灰色襪子。我們得再多想一下。
我們能怎麼做呢?
大多數時候,換個方式來分割工作會很有幫助。舉例來說,我們可以讓兩位工作者一起整理那一大堆灰色襪子。一位整理大雙的襪子,另一位整理小雙的。不過,我們又遇到了另一個問題:誰來決定在這種情況下什麼算「大」、什麼算「小」呢?
所以,與其絞盡腦汁想出更聰明的方法,我們決定務實一點。每個人就各自拿一堆大小差不多的襪子——不管顏色或尺寸——然後開始整理。
很可能,每一堆裡都會剩下一些找不到配對的襪子。沒關係。我們就把它們全部丟在一起、混一混,再重新分成幾堆,然後再整理一次。我們就這樣重複直到完成。我們把這叫做 task queue(工作佇列)。它有兩個好處:第一,你不需要工作者之間有額外的約定,第二,它在工作者數量增加時也能合理地擴展,而不需要對問題領域想得太複雜。
distributed systems(分散式系統) 最棘手的地方在於,看似直截了當的解法在實務上可能會徹底失敗。
如果我們的小襪子堆看起來像這樣呢?

每一堆裡的配對數量……實在令人沮喪。我們可以做的是,先跑一個非常快速的預先分類步驟來增加配對的數量。或者,也許你能想出更好的點子?
最酷的是,一旦你找到更快的方法,它也能套用到類似的任務上。
像這樣的問題,其根源都來自資訊科學,而且它們無所不在。就我個人而言,我不太喜歡 Computer Science 這個詞。我比較喜歡德文的「Informatik」,我會大致把它翻譯為「Information Science(資訊科學)」。因為我們在這裡所做事情的真正本質,是要為一整類問題找到通用的解法。我們思考的是物件的本質及其特性。我們不是在整理襪子;我們試圖回答關於資訊的根本問題。也許現在你就能理解我為何對這個領域如此熱情了。
喔,對了,這裡還有一篇相關文章是關於我為何熱愛寫程式。
隨機一篇部落格