離職後的這幾天頗為忙碌。尤其是,終於買了一台筆記型電腦。
早在幾個星期前,我就打算買一台筆電了。想要重量輕、規格好(CPU 夠快、記憶體 1GB、硬碟也不能太小、最好還是寬螢幕)、價格也合理的機型。在網路上看了幾天、到 Nova 看了一回、嫌 Sony 的太貴,只能在 Asus 的 W5 與 acer 的小狗機之間作選擇。但 Asus W5 只支援到 768 MB RAM,acer 的品質一般來說又頗差,怎麼辦呢?
最後是找到 HP Compaq 的 B1800。除了光碟機是 Combo 外,大致上都相當滿意(不過,事後從 CNET 的報導中,知道含電池的重量其實是 1.86 公斤,比型錄上聲稱的 1.6 公斤重了不少,令我有些被騙的感覺)。
接 下來的事情,就是安裝軟體了。由於無線基地台與 Hub 的位置弄錯了,花了許多時間在安裝與測試(最後還是在貓的指導說明下,才知道弄錯了)。更扯的是,我不知道這台筆記型電腦必須在按了某個按鍵後,才會打開無線上網的功能,竟花了數個小時的時間在檢測基地台與筆電間的安全設定。
不過,安裝設定好了後,敲打著筆電的鍵盤、上網查資料寫 Blog,也覺得頗為滿足。
而花錢買東西就是這樣,經常可以得到許多「擁有新東西」的興奮。難怪許多現代人,會喜歡藉著添購新事物來抒發鬱悶、讓自己「似乎」可以活得快樂些。
星期二, 8月 30, 2005
我看紐約時報的感想
數個月前,回實驗室參加 meeting,項老師鼓勵大家看每週聯合報所附的紐約時報 (New York Times) 精選。
自己的英文程度不佳,是早就知道的事。看英文報紙,不懂的單字頗多,即使是一篇短文,都要看上半個小時。但許多知名的教授(像是李家同)都極力推薦大家看紐約時報,我想,我是該每天儘量抽出些時間來嘗試閱讀。
說真的,看了幾個星期後,我覺得台灣的報紙,真的不知道在報導些什麼。報導的主題狹窄、內容貧乏就算了,連寫篇「好文章」的基本訓練都沒有。
紐約時報的每一篇報導 --- 即使是短短的幾段文字 --- 都是自給自足 (self-contained) 的。每一篇都像個完整的故事,重要的個體(人、事、時、地、物)都有被清楚交代;而故事人物的心情起伏,描述也是生動極了(我目前其實是透過聯合報的中文 翻譯 與解說來感受的。說來也頗自卑:我對英文字詞的微妙用法了解非常有限;看到不同的形容詞此起彼落地出現,通常只能瞠目結舌,更不用說是了解吸收)。
項老師說,學習英文,除了多看多學習外,沒有其他的訣竅;而紐約時報的文章,多半都是「好的英文」。我看了這幾週後,有一個很強烈的感覺:「好東西該與好朋友分享」,真的該向大家極力推薦。
自己的英文程度不佳,是早就知道的事。看英文報紙,不懂的單字頗多,即使是一篇短文,都要看上半個小時。但許多知名的教授(像是李家同)都極力推薦大家看紐約時報,我想,我是該每天儘量抽出些時間來嘗試閱讀。
說真的,看了幾個星期後,我覺得台灣的報紙,真的不知道在報導些什麼。報導的主題狹窄、內容貧乏就算了,連寫篇「好文章」的基本訓練都沒有。
紐約時報的每一篇報導 --- 即使是短短的幾段文字 --- 都是自給自足 (self-contained) 的。每一篇都像個完整的故事,重要的個體(人、事、時、地、物)都有被清楚交代;而故事人物的心情起伏,描述也是生動極了(我目前其實是透過聯合報的中文 翻譯 與解說來感受的。說來也頗自卑:我對英文字詞的微妙用法了解非常有限;看到不同的形容詞此起彼落地出現,通常只能瞠目結舌,更不用說是了解吸收)。
項老師說,學習英文,除了多看多學習外,沒有其他的訣竅;而紐約時報的文章,多半都是「好的英文」。我看了這幾週後,有一個很強烈的感覺:「好東西該與好朋友分享」,真的該向大家極力推薦。
星期六, 8月 27, 2005
浮濫的商業口號
有一陣子,我對陳腔濫調的口號頗感厭煩。
部分原因是,這些口號看起來、聽起來都冠冕堂皇,合理正當,但經過一段時日後,總會覺得它們與實際的執行落差太大。由於我的邏輯感似乎常常會告訴自己:「必須強調前後的一致性」,因而時常會對於對這類的矛盾衝突感到不舒服。
恰好那時正在看「隨機的致富陷阱 -- 解開生活中的機率之謎」這本書(時報出版)。作者提到 (p.90),我們或可用隨機的方式,模擬公司執行長的言談,用以確定他說的話是真具有價值,或者只是經過修飾後的胡言亂語。
也想起傳統的人工智能 (Artificial Intelligence) 中,有著一個「電腦作文」的主題:希望電腦可以藉由一些規則與亂數,隨機地自動產生文章。要產生商業口號,應該比作文容易得多吧?心血來潮,就寫了一段小程式來玩。這個程式在剛剛的執行中,產生了這樣的幾個句子:
雖然最後一句顯得相當古怪(「相信」如何對客戶提供更好的服務?),但大致上,讀起來也真像會議中所常聽見的執行長用詞呢。
部分原因是,這些口號看起來、聽起來都冠冕堂皇,合理正當,但經過一段時日後,總會覺得它們與實際的執行落差太大。由於我的邏輯感似乎常常會告訴自己:「必須強調前後的一致性」,因而時常會對於對這類的矛盾衝突感到不舒服。
恰好那時正在看「隨機的致富陷阱 -- 解開生活中的機率之謎」這本書(時報出版)。作者提到 (p.90),我們或可用隨機的方式,模擬公司執行長的言談,用以確定他說的話是真具有價值,或者只是經過修飾後的胡言亂語。
也想起傳統的人工智能 (Artificial Intelligence) 中,有著一個「電腦作文」的主題:希望電腦可以藉由一些規則與亂數,隨機地自動產生文章。要產生商業口號,應該比作文容易得多吧?心血來潮,就寫了一段小程式來玩。這個程式在剛剛的執行中,產生了這樣的幾個句子:
我們日新又新,致力於股東的持股價值
我們堅持誠信為企業之本
我們致力於追求卓越
我們發揮己長,並且改善缺點
我們相信如何對客戶提供更好的服務
我們堅持誠信為企業之本
我們致力於追求卓越
我們發揮己長,並且改善缺點
我們相信如何對客戶提供更好的服務
雖然最後一句顯得相當古怪(「相信」如何對客戶提供更好的服務?),但大致上,讀起來也真像會議中所常聽見的執行長用詞呢。
星期五, 8月 26, 2005
珍重再見
辦完離職手續,正式與公司揮手告別。
回首過往,已如雲煙。在這家公司,工作了三年又四個半月。從早期對未來的憧憬想像、中期對產品的積極找尋、以及晚期對軟體的品質管控,自己多多少少是有著一些感觸。
就如同波普 (Karl Popper) 認為科學的真理必須靠臆測與否證 (conjecture and refutation) 來向前推進;對於公司在某個時刻的發展選擇,事後也多半隻能以成敗論英雄,卻很難累積一致的經驗與規則。以事後諸葛的角度,我們是可以舉出許多例子,來說明為何會導致現在的失敗;但是處在多種相互衝突的選擇間,其實也沒有絕對的定律來告訴管理者該如何做。
於是,我們可以看到許多彼此矛盾的商業策略、前後不一致的銷售模式,讓公司裡的員工經常無所適從。而或許也因為如此,保持「簡單、清楚、一致」的商業策略與貫徹執行,才更讓人感覺其重要性。
有趣的一個經驗是,「當你已不在乎你的職位,反而能夠做好這個職位所該做的事」、「當你不在意能夠得到什麼而盡力付出,反而能夠得到最多」。我想,這或許就是一般人的盲點:只看見自己想要的,卻忘記團隊是需要關注到他人需求後,才能夠團結併發揮力量。
回首過往,已如雲煙。在這家公司,工作了三年又四個半月。從早期對未來的憧憬想像、中期對產品的積極找尋、以及晚期對軟體的品質管控,自己多多少少是有著一些感觸。
就如同波普 (Karl Popper) 認為科學的真理必須靠臆測與否證 (conjecture and refutation) 來向前推進;對於公司在某個時刻的發展選擇,事後也多半隻能以成敗論英雄,卻很難累積一致的經驗與規則。以事後諸葛的角度,我們是可以舉出許多例子,來說明為何會導致現在的失敗;但是處在多種相互衝突的選擇間,其實也沒有絕對的定律來告訴管理者該如何做。
於是,我們可以看到許多彼此矛盾的商業策略、前後不一致的銷售模式,讓公司裡的員工經常無所適從。而或許也因為如此,保持「簡單、清楚、一致」的商業策略與貫徹執行,才更讓人感覺其重要性。
有趣的一個經驗是,「當你已不在乎你的職位,反而能夠做好這個職位所該做的事」、「當你不在意能夠得到什麼而盡力付出,反而能夠得到最多」。我想,這或許就是一般人的盲點:只看見自己想要的,卻忘記團隊是需要關注到他人需求後,才能夠團結併發揮力量。
星期四, 8月 25, 2005
迷宮製作的演算法與圖例
且鼓起勇氣,試著談談「電腦平面迷宮」製作的技術細節。
需要勇氣,是因為談技術,通常容易流於枯燥與沈悶。然而,若我想要寫一篇關於「迷宮」主題的文章,卻非得督促自己去嘗試描述技術細節。因此,就讓我試著接續先前對迷宮的製作,做些更深入的描述與討論吧。
先前提過,可以用樹狀結構來產生迷宮。現在,我們可以將演算法(產生迷宮的方法)說得更仔細些。注意到,在這兒一個節點就是一個迷宮的格子;而相鄰的兩個節點間,如果沒有連結,我們說兩個格子間有一道「牆」。
直接看以上的演算法,可能會有「霧煞煞」的感覺。配合著一個實例來對照,應該會比較清楚。
首先,假設我們要產生一個 3x3 的小迷宮。為了方便說明,我們將迷宮的格子標上號碼(英文字母 A~I),如右圖 (a) 所示。現在,且讓我們跟著演算法的步驟走一回:
需要勇氣,是因為談技術,通常容易流於枯燥與沈悶。然而,若我想要寫一篇關於「迷宮」主題的文章,卻非得督促自己去嘗試描述技術細節。因此,就讓我試著接續先前對迷宮的製作,做些更深入的描述與討論吧。
先前提過,可以用樹狀結構來產生迷宮。現在,我們可以將演算法(產生迷宮的方法)說得更仔細些。注意到,在這兒一個節點就是一個迷宮的格子;而相鄰的兩個節點間,如果沒有連結,我們說兩個格子間有一道「牆」。
- 一開始,任選一個節點。
- 將這個節點四周「可被打通的牆」(不含迷宮的外圍),放入一個「連結集合」C 裡。
- 將此節點,放入「已處理之節點」集合 T 裡。
- 如果 C 為空集合,表示迷宮已經產生完畢,我們停止程式。若 C 不為空集合,從中任意挑選一道牆(假設這道牆連結節點 n1 與 n2,而 n1 在集合 T 裡),並打通它。
- 如果 T 的節點與節點 n2 間,有連結在 C 裡,則將這些連結從 C 裡移除。
- 將 n2 標示為「已處理」(放入集合 T 裡),並回到步驟 (4)。
直接看以上的演算法,可能會有「霧煞煞」的感覺。配合著一個實例來對照,應該會比較清楚。
首先,假設我們要產生一個 3x3 的小迷宮。為了方便說明,我們將迷宮的格子標上號碼(英文字母 A~I),如右圖 (a) 所示。現在,且讓我們跟著演算法的步驟走一回:
- 任選一個節點。假設我們選到 B。
- 將節點 B 四周「可打通的牆」放入集合 C。參考下圖 (1) 中的黑色虛線。
- 將節點 B 放入「已處理」的節點集合 T(含有圓點的格子)。如下圖 (1) 所示。
- 執行演算法步驟 (4)。因為 C 不為空集合(圖 (1) 中有黑色虛線存在),所以我們從中任意挑選一道牆,例如 B-E(n2 為節點 E)間的牆,把它打通。
- 接下來,進行演算法的步驟 (5) 與 (6),可以得到下圖 (2).
- 接著,我們再次進行演算法的步驟 (4),假設這回從 C 選出 A-B 間的牆來打通。進行步驟 (5) 與 (6) 之後,我們得到下圖 (3)。
- 重覆執行步驟 (4),假設這回選出 D-E(n2 為節點 D)間的牆來打通。
- 執行步驟 (5)。注意到,節點 D 與 A 之間,原本有「可被打通的牆」,但因為 A 已經被放入「已處理」的節點集合 T 裡,我們在此必須把 D-A 之間的牆從集合 C 裡移除(用紅色虛線表示已由 C 移除的牆)。
- 執行步驟 (6),將節點 D 加入集合 T 之中。至此我們得到下圖 (4)。
- 仿前步驟 (4)、(5)、(6),破除 E-H 的牆,將 H 加入 T 後,得到下圖 (5)。
- 依循步驟 (4)、(5)、(6),破除 H-I 的牆,將 I 加入 T 後,得到上圖 (6)。
- 依循步驟 (4)、(5)、(6),破除 I-F 的牆,將 F 加入 T 後,得到上圖 (7)。
- 依循步驟 (4)、(5)、(6),破除 F-C 的牆,將 C 加入 T 後,得到上圖 (8)。
- 依循步驟 (4)、(5)、(6),破除 D-G 的牆,將 G 加入 T 後,得到上圖 (9)。
- 至此,C 已經變成空集合(圖 (9) 裡,已經沒有黑色的虛線,表示已經沒有「可被打破的牆」)了,因此程式停止。我們最後產生的 3x3 迷宮,就如上圖 (b) 所示。
星期二, 8月 23, 2005
Stop improving yourself and start living
昨天和 MPH 在 msn 閒聊。他說,想寫關於「Stop improving yourself and start living」的系列文章。
我說,這句話說得真好。我人屆四十,才驀然發覺,自己從前汲汲於改進自己(尤其是學識上的技術相關領域),努力想在工作上有所表現;卻忘卻了:眼前的生活,才是最值得珍惜與重視的。
自上週三起,努力進行的專案就被迫停止,而公司也進行裁減人力的動作。突然間,好像「沒有事情可以做」了。而前幾天早晨,我到台大醫院抽血檢查,在二二八公園走走逛逛,聽聽鳥叫蟲鳴,很強烈地感受到很久都沒有的舒暢。
我說,我想空出一年來整理自己這些年的感想;但一年後,似乎總還得去找份「正式的工作」。只是,為什麼「工作」在現代人的生活裡,竟然扮演了如許重要的角色呢?
我說,這句話說得真好。我人屆四十,才驀然發覺,自己從前汲汲於改進自己(尤其是學識上的技術相關領域),努力想在工作上有所表現;卻忘卻了:眼前的生活,才是最值得珍惜與重視的。
自上週三起,努力進行的專案就被迫停止,而公司也進行裁減人力的動作。突然間,好像「沒有事情可以做」了。而前幾天早晨,我到台大醫院抽血檢查,在二二八公園走走逛逛,聽聽鳥叫蟲鳴,很強烈地感受到很久都沒有的舒暢。
我說,我想空出一年來整理自己這些年的感想;但一年後,似乎總還得去找份「正式的工作」。只是,為什麼「工作」在現代人的生活裡,竟然扮演了如許重要的角色呢?
星期一, 8月 22, 2005
我想整理些什麼?
想花一年的時間,整理自己這些年對電腦(科學、軟體、程式)的心得與感想。
起因是這樣的:自己快要四十歲了。不知道是年歲的關係、還是工作的緣故,在電腦科學(或電腦工程?)領域浮沈了十幾年,了解的知識越多,卻越來越覺得喪失了年輕時的好奇與樂趣。
我在高中時,並沒有上過任何關於電腦的課程,也缺乏現今的網際網路來取得資訊。在大學時代,雖然仍對許多電腦相關問題感到興趣,卻總覺得缺乏一本整理過的書籍,能夠帶著我入門、領著我欣賞。如今,雖然電腦書籍已經稍嫌氾濫、Internet 與 Google 又威力龐大;但我仍然覺得,或許有些年輕朋友,會像我當初那樣,需要有人整理些有趣的主題,寫成可以動動頭腦、又可以學習到電腦技術的書籍。
因此,我想整理一些感想與心得,獻給約具備高中或大學一、二年級的數學程度、對電腦(程式)感到有興趣的朋友。此外,我也希望能藉著回顧年少輕狂,重新品嚐青春的淺淺歡樂與悲傷,讓自己的人生,有著更甘醇的韻味。
能不能做到呢?我自己也不是很有把握。在這幾個月裡,我雖然已經慢慢地從日記、筆記堆、與古早的軟碟片裡,找回一些曾經感到興趣的主題,卻總覺得不知道該如何著手來完成一篇文章。貓(LCAT)建議我從寫 Blog 開始、逐步練習寫作。我頗為贊同,所以就開始了「也是回顧」的漫筆。至於成效如何?就只能讓時間來說話了。
起因是這樣的:自己快要四十歲了。不知道是年歲的關係、還是工作的緣故,在電腦科學(或電腦工程?)領域浮沈了十幾年,了解的知識越多,卻越來越覺得喪失了年輕時的好奇與樂趣。
我在高中時,並沒有上過任何關於電腦的課程,也缺乏現今的網際網路來取得資訊。在大學時代,雖然仍對許多電腦相關問題感到興趣,卻總覺得缺乏一本整理過的書籍,能夠帶著我入門、領著我欣賞。如今,雖然電腦書籍已經稍嫌氾濫、Internet 與 Google 又威力龐大;但我仍然覺得,或許有些年輕朋友,會像我當初那樣,需要有人整理些有趣的主題,寫成可以動動頭腦、又可以學習到電腦技術的書籍。
因此,我想整理一些感想與心得,獻給約具備高中或大學一、二年級的數學程度、對電腦(程式)感到有興趣的朋友。此外,我也希望能藉著回顧年少輕狂,重新品嚐青春的淺淺歡樂與悲傷,讓自己的人生,有著更甘醇的韻味。
能不能做到呢?我自己也不是很有把握。在這幾個月裡,我雖然已經慢慢地從日記、筆記堆、與古早的軟碟片裡,找回一些曾經感到興趣的主題,卻總覺得不知道該如何著手來完成一篇文章。貓(LCAT)建議我從寫 Blog 開始、逐步練習寫作。我頗為贊同,所以就開始了「也是回顧」的漫筆。至於成效如何?就只能讓時間來說話了。
星期日, 8月 21, 2005
也談「說謊村」
我對益智性的小題目也頗感興趣。
「說謊村」是一類有趣的問題。在這類問題中,通常都會有
你來到一個村莊,卻不清楚它到底是「老實村」或「說謊村」。現在你只能詢問(當地)村民一個問題,來確認是否是在哪一種村莊裡。你該如何問這個問題呢?
對於忙碌的現代人來說,通常想個一兩分鐘,就可能懶得再去思考,直接看答案了。而看到答案是,問村民:「請問你住在這個村子裡嗎?」時,又會覺得:喔,答案好像不太容易想到?(出題、解題的人,怎麼這麼聰明啊?)
其實,我們可以反過來,從回答端來思考這個問題。也就是說,我們希望讓提問有「是」與「否」兩種回答;當聽到的回答為「是」,我們希望確定是在老實村裡;而聽到「否」 時,則了解是處在說謊村(也可以反過來提問另一種問題,聽到回答「是」表示是在說謊村,聽到「否」則表示在老實村)。
因此,關鍵是在於問一句話,讓老實村的人回答「是」,而說謊村的人回答「否」。因此,答案就浮現了:我們可以問一個「恆真」的問題,例如「請問 1+1=2 嗎?」、「請問你是(老實村或說謊村的)人嗎?」;或者,問「你住在這個村子裡嗎?」(因為我們已經假設問的是當地村民,所以這個提問必然是恆真的。)
〈問題二〉
另一個常見的問題是這樣的:「你在一條岔路上,遇到一位路人。這條岔路的一邊通往老實村,另一邊則通往說謊村;而這個路人,可能是老實村的村民,也可能是說謊村的村民。現在你只能問這位路人一句話,就必須決定岔路的哪一邊通往老實村。你該如何提問呢?」
這個問題的關鍵,其實是在問一句話,指涉到特定的一條路,讓老實村的人與說謊村的人,都會回答「是」。也就是說,對老實村的人而言,這句話是真的;而對說謊村的人來說,它卻是假的。例如,問「你從這條路回家嗎?」、「這條路通往你住的村子嗎?」。於是,我們(對於路人的回答)有如下的真值表:
而當我們聽到回答為「是」時,即表示所指的路通往老實村;聽到回答為「否」時,則表示此路通往說謊村。
「說謊村」是一類有趣的問題。在這類問題中,通常都會有
- 兩個地點:「老實村」與「說謊村」;與
- 兩種人物角色:一個是「老實村」的人,他永遠說真話;另一個是「說謊村」的人,他永遠說假話。
你來到一個村莊,卻不清楚它到底是「老實村」或「說謊村」。現在你只能詢問(當地)村民一個問題,來確認是否是在哪一種村莊裡。你該如何問這個問題呢?
對於忙碌的現代人來說,通常想個一兩分鐘,就可能懶得再去思考,直接看答案了。而看到答案是,問村民:「請問你住在這個村子裡嗎?」時,又會覺得:喔,答案好像不太容易想到?(出題、解題的人,怎麼這麼聰明啊?)
其實,我們可以反過來,從回答端來思考這個問題。也就是說,我們希望讓提問有「是」與「否」兩種回答;當聽到的回答為「是」,我們希望確定是在老實村裡;而聽到「否」 時,則了解是處在說謊村(也可以反過來提問另一種問題,聽到回答「是」表示是在說謊村,聽到「否」則表示在老實村)。
因此,關鍵是在於問一句話,讓老實村的人回答「是」,而說謊村的人回答「否」。因此,答案就浮現了:我們可以問一個「恆真」的問題,例如「請問 1+1=2 嗎?」、「請問你是(老實村或說謊村的)人嗎?」;或者,問「你住在這個村子裡嗎?」(因為我們已經假設問的是當地村民,所以這個提問必然是恆真的。)
〈問題二〉
另一個常見的問題是這樣的:「你在一條岔路上,遇到一位路人。這條岔路的一邊通往老實村,另一邊則通往說謊村;而這個路人,可能是老實村的村民,也可能是說謊村的村民。現在你只能問這位路人一句話,就必須決定岔路的哪一邊通往老實村。你該如何提問呢?」
這個問題的關鍵,其實是在問一句話,指涉到特定的一條路,讓老實村的人與說謊村的人,都會回答「是」。也就是說,對老實村的人而言,這句話是真的;而對說謊村的人來說,它卻是假的。例如,問「你從這條路回家嗎?」、「這條路通往你住的村子嗎?」。於是,我們(對於路人的回答)有如下的真值表:
而當我們聽到回答為「是」時,即表示所指的路通往老實村;聽到回答為「否」時,則表示此路通往說謊村。
星期四, 8月 18, 2005
Ackermann's function
我對 Ackermann's function (艾克曼函數)一直有著強烈的崇敬感。
讓我們先從兩個簡單的函數看起。如果 f(n) = nn,那麼 f(0) = 1, f(1) = 1, f(2) = 22, f(3) = 33, ..., 它增長的速率是相當快的(也就是說,f(n+1) 會比 f(n) 的值要大上大頗多)。而如果 g(n) = nn...n(共有 n 項),我們應該會對 g(n) 的增長速率感到些許敬畏、感到有些「遙不可及」。
可以想像,應該會有增長速率更快的函數。例如,Knuth 就曾提出一種 big-number(很大的數目)的表示法(注意到,這套表示法會用到無限多個(^, ^^, ^^^, ... )運算子;而且這些運算子都是右結合(right associative)的,例如 234 = 2(34) = 281):
Ackermann's function 的定義很簡單:
它簡單到用程式實作,幾乎只要照著定義抄就可以了。例如,以下就是一個用 PHP 實作的程式,它可以算出 A(3, 6) = 509:
令人驚訝的是,Ackermann's function 增長的速度非常快。現在的電腦威力已經很強了,但是要計算 A(4, 2) --- 更不用說是計算 A(5, 1) 了 --- 都還是會出現 Stack Overflow 或者 Out Of Memory 的錯誤訊息。事實上,Ackermann's function 增長的速度,比 m^n、 m^^n、甚至 m^^^n 都還要快。在數學上,它是一個 total recursive(全然迴歸:對於每個自然數 m, n,A(m, n) 都有定義)的函數,但是卻不是一個 primitive recursive(基本迴歸)函數。它增長的速度,遠超過一般人所能想像。
這也沒什麼嘛,數學的世界裡,本來就有許多令人驚詫的函數或定理,不是嗎?
是這樣的。十餘年前修習數理邏輯時,老師把「證明 Ackermann's function 非 primitive recursive」當成作業給學生做。那位老師 (Dr. Kueker) 很有趣,習題做錯後,他會點出錯誤所在(有時還會給一點提示),然後學生可以在學期內任何時刻再補交(如果還是做錯,可以下回再繼續補交)。重點是,這題我「證明」了三次,但每次都是錯的。一直到學期末,我想破了頭,都沒有證明出來。
也因為曾經努力數個月卻還是失敗,我對 Ackermann's function 一直有著頗為複雜的情感。有時,我會覺得:人就是這樣,對於盡力後依然失敗的情事,日後反而會留下最深刻的印象。
讓我們先從兩個簡單的函數看起。如果 f(n) = nn,那麼 f(0) = 1, f(1) = 1, f(2) = 22, f(3) = 33, ..., 它增長的速率是相當快的(也就是說,f(n+1) 會比 f(n) 的值要大上大頗多)。而如果 g(n) = nn...n(共有 n 項),我們應該會對 g(n) 的增長速率感到些許敬畏、感到有些「遙不可及」。
可以想像,應該會有增長速率更快的函數。例如,Knuth 就曾提出一種 big-number(很大的數目)的表示法(注意到,這套表示法會用到無限多個(^, ^^, ^^^, ... )運算子;而且這些運算子都是右結合(right associative)的,例如 234 = 2(34) = 281):
m ^ n = m m ... m (n 項) = m n
m^^n = m^m^...^m (n 項) = mm...m
m^^^n = m^^m^^...^^m (n 項)
m^^n = m^m^...^m (n 項) = mm...m
m^^^n = m^^m^^...^^m (n 項)
Ackermann's function 的定義很簡單:
它簡單到用程式實作,幾乎只要照著定義抄就可以了。例如,以下就是一個用 PHP 實作的程式,它可以算出 A(3, 6) = 509:
<?php
function A($m, $n) {
if ($m == 0) return ($n + 1);
else {
if ($n == 0) return A($m-1, 1);
else return A($m-1, A($m, $n-1));
}
}
print "A(3, 6) = " . A(3, 6);
?>
令人驚訝的是,Ackermann's function 增長的速度非常快。現在的電腦威力已經很強了,但是要計算 A(4, 2) --- 更不用說是計算 A(5, 1) 了 --- 都還是會出現 Stack Overflow 或者 Out Of Memory 的錯誤訊息。事實上,Ackermann's function 增長的速度,比 m^n、 m^^n、甚至 m^^^n 都還要快。在數學上,它是一個 total recursive(全然迴歸:對於每個自然數 m, n,A(m, n) 都有定義)的函數,但是卻不是一個 primitive recursive(基本迴歸)函數。它增長的速度,遠超過一般人所能想像。
這也沒什麼嘛,數學的世界裡,本來就有許多令人驚詫的函數或定理,不是嗎?
是這樣的。十餘年前修習數理邏輯時,老師把「證明 Ackermann's function 非 primitive recursive」當成作業給學生做。那位老師 (Dr. Kueker) 很有趣,習題做錯後,他會點出錯誤所在(有時還會給一點提示),然後學生可以在學期內任何時刻再補交(如果還是做錯,可以下回再繼續補交)。重點是,這題我「證明」了三次,但每次都是錯的。一直到學期末,我想破了頭,都沒有證明出來。
也因為曾經努力數個月卻還是失敗,我對 Ackermann's function 一直有著頗為複雜的情感。有時,我會覺得:人就是這樣,對於盡力後依然失敗的情事,日後反而會留下最深刻的印象。
星期三, 8月 17, 2005
星期二, 8月 16, 2005
團隊解散
公司無預警告知,決定結束目前正在進行的專案。
這表示,我接下來的一陣子沒有什麼重要的事情要做了(說真的,是有些措手不及)。也表示,讓自己和開發團隊互道珍重的時刻就要到了。
五年間,先後加入兩間新創公司。前一間公司在三年前關閉,而這一間公司目前也是經營得辛苦。我想,創業維艱啊。而或許也是因為年輕時包袱少,所以才不願進入政府官僚體系、才想到廣闊的業界闖天下吧?
而這幾年的工作,回顧起來,用到所學的多,但是額外的收穫卻少。只有這半年多,讓我感受到團隊的樣貌與價值。
也不是說過去就沒有分工合作,而只是總覺得彼此間,缺乏強烈的信任感與明確的方向。因此,雖然多少彼此還是有互相幫忙,但就是缺乏整體的步調與和諧的溝通,很容易在開發的前後期,產生認知上的不一致。
這半年來,嘗試用軟體工程的方式,構建一個軟體開發的團隊。從建立成員間的互信、專案的規劃、到產品的需求與規格、軟體架構的設計、程式的實作、以及系統的測試與除錯,我們都嘗試讓成員儘量發揮他們的所長、嘗試讓時程的溝通與掌握能夠貫徹。從一些成員的回饋,與幾位專案外的產品經理的談話中,我了解到,這樣「有系統的開發方式」,對專案來說,是很有幫助的。
很可惜,專案還是在未完成前,就要劃下句點了。現實生活中,不如意之事總佔了多數,令人嘆息。
這表示,我接下來的一陣子沒有什麼重要的事情要做了(說真的,是有些措手不及)。也表示,讓自己和開發團隊互道珍重的時刻就要到了。
五年間,先後加入兩間新創公司。前一間公司在三年前關閉,而這一間公司目前也是經營得辛苦。我想,創業維艱啊。而或許也是因為年輕時包袱少,所以才不願進入政府官僚體系、才想到廣闊的業界闖天下吧?
而這幾年的工作,回顧起來,用到所學的多,但是額外的收穫卻少。只有這半年多,讓我感受到團隊的樣貌與價值。
也不是說過去就沒有分工合作,而只是總覺得彼此間,缺乏強烈的信任感與明確的方向。因此,雖然多少彼此還是有互相幫忙,但就是缺乏整體的步調與和諧的溝通,很容易在開發的前後期,產生認知上的不一致。
這半年來,嘗試用軟體工程的方式,構建一個軟體開發的團隊。從建立成員間的互信、專案的規劃、到產品的需求與規格、軟體架構的設計、程式的實作、以及系統的測試與除錯,我們都嘗試讓成員儘量發揮他們的所長、嘗試讓時程的溝通與掌握能夠貫徹。從一些成員的回饋,與幾位專案外的產品經理的談話中,我了解到,這樣「有系統的開發方式」,對專案來說,是很有幫助的。
很可惜,專案還是在未完成前,就要劃下句點了。現實生活中,不如意之事總佔了多數,令人嘆息。
星期一, 8月 15, 2005
再談迷宮
利用樹狀結構,可以產生迷宮。
另一方面,因為樹狀結構保證了任兩個節點之間必然有唯一的一條路徑,我們也可以用程式將這條路徑「畫」出來。例如,右圖就顯示了從迷宮最左上節點,到最右下節點的路徑。
然而,產生了幾個迷宮與路徑後,會發現這種演算法所產生的迷宮,路徑似乎不夠「蜿蜒曲折」。一般的紙上迷宮,通常從起點到終點,路徑都會彎彎折折,迂迴纏繞,不像這裡產生的迷宮路徑,感覺起來頗為平順。
但是,要怎樣才能產生「蜿蜒曲折」的迷宮路徑呢?
我不知道。
雖然我猜想,應該有「直觀、漂亮、簡單」的演算法可以產生蜿蜒的迷宮。例如,或許可以嘗試讓迷宮的樹狀結構長得深一些,這樣就可以拉長迷宮的「直徑」(迷宮 中,最長的兩個節點距離),而或許路徑就會顯得比較迂迴曲折。但是,在沒有合適的模型來定義「蜿蜒曲折」、或者在還沒有實際的實驗觀察前,我現在就是不知道答案。
我覺得,許多問題就是這樣:當你不知道答案的時候,你會認為要回答問題頗有困難;但當你知道答案以後,你卻又覺得它一點也不令人感到驚奇。
而就如知道答案後,會覺得實在也沒有什麼:有時,我們會很容易覺得別人的想法比較優秀;覺得外國的月亮,就是比較圓。我想,不論是「棄之如敝屣、外國月亮圓」或者「閉門造車、敝帚自珍」,應該都與人性脫離不了關係吧。只是,既然覺得過度輕視自己、過度自以為是都不健康,我們就應該努力讓自己掙脫這樣的思想與心態,不是嗎?
星期六, 8月 13, 2005
迷宮
從小時候,我就對許多益智遊戲感到興趣。
一種簡單的遊戲是「走迷宮」:玩的人要從一個迷宮的某一點,走到另一點。一個典型的平面方陣迷宮,就如同右圖所示。
那麼,如何用程式來產生這樣的迷宮呢?
乍看之下,似乎不是那麼容易。然而,如果有一些圖論 (graph theory) 的背景,會發現其實是有相當漂亮的方法,來產生這類迷宮的。
將迷宮的每一方格視為一個節點 (node)。相鄰兩格若有路相通,則說此兩節點間有個連結 (link)。如此一來,迷宮中每個小方格最多會有四個(上、下、左、右)相連結的節點。要產生一個迷宮,只要任選一個小方格,再由此方格向外伸展連結, 產生一個樹狀結構 (tree structure) 來涵蓋所有的格子,就可以了。
由於在抽象模型上,我們是用 tree 來表示 (represent) 此迷宮,因此這個迷宮也會有一些有趣的性質。例如,迷宮中的任兩個方格,之間必然、且僅有一條路徑相通。
星期五, 8月 12, 2005
跟著感覺走
這兩天,因為接下來做些什麼好而煩惱。
一方面,明年就要 40 歲了,有股衝動:想嘗試做些自己很久以來就想做的事情(如果沒有在現在就嘗試,以後就會更難)。另一方面,這個年頭一般人似乎總得有個「工作」,最好 還是個「永久、持續性」的工作,大家才不會對你說東道西,指指點點。別人的想法,本來是不需要太在意的;但被親朋好友問多了 ,仍維持好耐性來委婉辯駁解釋,卻不是「一塊蛋糕」(piece of cake) 般地容易。
在這半年的軟體品質改善專案裡,我倒是真的體會到,溝通是一件多麼不容易的事。溝通看起來好像很簡單,就是把訊息傳遞出去;但實際上,人一多了,訊息的傳遞與解讀,就都會產生變化。
大多數人也同意:要讓一群人都真的能夠凝聚出一股共識(對許多事情有接近一致的卻的看法),是「團隊」價值的起步。而一個團隊,不是幾個人湊合在一起,講講彼此的 R&R (Role and Responsibility),然後各自「分工」做自己的事情,就算是團隊了。它需要「合作」:團隊的成員,彼此間要有互信的基礎,然後在充分溝通瞭解 下,對於未來的遠景(隱隱看到未來工作完成的樣貌)、使命(要用何種方式來達到遠景的目標)、計畫(較為詳細、合理的規劃)、執行方式,與稽核驗證,都能 有「共同體」(成員彼此依賴頗深)的感覺,才能夠算是達到一個團隊的雛形。
然而,由於團隊成員的背景與專長不同,因此強烈的互信與共識,就會需要有效的溝通,才有機會達成。
扯遠了。不管怎樣,在現實生活裡,「成王敗寇」才是遊戲的主要規則。而我這五年在業界闖天下,只能承認是以失敗收場。因此,當然有些悲傷、有些惋惜。
而對於我目前的困惑,貓的說法是「典型的中年危機」(他還建議我去看侯文詠「我的天才夢」這本書)。他的建議是就是:跟著感覺走。
喔~記得好像是蘇芮有首歌:「跟著感覺走,讓它帶著我,希望就在不遠處等著我 ...」。在現實的生活中,要真的能夠跟著感覺走,卻似乎是件頗為奢侈的事呢。
一方面,明年就要 40 歲了,有股衝動:想嘗試做些自己很久以來就想做的事情(如果沒有在現在就嘗試,以後就會更難)。另一方面,這個年頭一般人似乎總得有個「工作」,最好 還是個「永久、持續性」的工作,大家才不會對你說東道西,指指點點。別人的想法,本來是不需要太在意的;但被親朋好友問多了 ,仍維持好耐性來委婉辯駁解釋,卻不是「一塊蛋糕」(piece of cake) 般地容易。
在這半年的軟體品質改善專案裡,我倒是真的體會到,溝通是一件多麼不容易的事。溝通看起來好像很簡單,就是把訊息傳遞出去;但實際上,人一多了,訊息的傳遞與解讀,就都會產生變化。
大多數人也同意:要讓一群人都真的能夠凝聚出一股共識(對許多事情有接近一致的卻的看法),是「團隊」價值的起步。而一個團隊,不是幾個人湊合在一起,講講彼此的 R&R (Role and Responsibility),然後各自「分工」做自己的事情,就算是團隊了。它需要「合作」:團隊的成員,彼此間要有互信的基礎,然後在充分溝通瞭解 下,對於未來的遠景(隱隱看到未來工作完成的樣貌)、使命(要用何種方式來達到遠景的目標)、計畫(較為詳細、合理的規劃)、執行方式,與稽核驗證,都能 有「共同體」(成員彼此依賴頗深)的感覺,才能夠算是達到一個團隊的雛形。
然而,由於團隊成員的背景與專長不同,因此強烈的互信與共識,就會需要有效的溝通,才有機會達成。
扯遠了。不管怎樣,在現實生活裡,「成王敗寇」才是遊戲的主要規則。而我這五年在業界闖天下,只能承認是以失敗收場。因此,當然有些悲傷、有些惋惜。
而對於我目前的困惑,貓的說法是「典型的中年危機」(他還建議我去看侯文詠「我的天才夢」這本書)。他的建議是就是:跟著感覺走。
喔~記得好像是蘇芮有首歌:「跟著感覺走,讓它帶著我,希望就在不遠處等著我 ...」。在現實的生活中,要真的能夠跟著感覺走,卻似乎是件頗為奢侈的事呢。
星期四, 8月 11, 2005
我的情緒,有戲劇化的傾向
回學校找老師。
一個目的,是問問是否有 part-time job 的機會,可以讓我在明年,一邊整理出想寫的文章,一邊有個「工作」。
老師手頭,正在進行一項攸關台灣學術研究競爭力的計畫。他認為這項計畫極有其價值與意義,且剛好有一個 post-doctor 的缺額,因此建議我 take full-time job。我還是很擔心自己整理不出想要的東西呢。因此,不斷地詢問是否工作的負擔會太過沈重。
我說,我擔心因工作過重,而無法在明年達到自己所預設的目標。老師說,我有將情緒 dramatize(戲劇化)的傾向。是嗎?我因不知而感到好奇。
老師說,一個例子是,當初他建議我從研究 Theorem-Proving 轉到 Intelligent Agent 領域時,我的回答是:「已經花了這麼多時間在定理證明上,所以不該如此輕易轉移研究主題 ...」。他說,轉換 Topic 並不是什麼 big-deal,不需要如此悲壯的。
嗯,說自己 40 歲想要做些什麼,應該是有些 dramatizing 吧?然而,過了四十歲,要再找個理由來讓自己整理年輕歲月的痕跡,恐怕會更困難吧。為了不讓自己在往後的歲月後悔,似乎是應該找回自我,做些真正想做的事情的。
另一方面,家人們都希望我去找教職或研究的工作。我說,我覺得自己並不是那麼合適做研究,而或許教職是可以考慮。但現在競爭激烈,要進好學校教書也不是那麼容易啊。(事實上,我也一直沒有嘗試申請過,所以算是在逃避。)
太太說,我也不是那麼容易聽人勸的。她說,我最容易聽進去的話,多半是從貓那邊「敲邊鼓」來的建議。我想,這或許是因為貓的想法,最接近我的個性吧?
一個目的,是問問是否有 part-time job 的機會,可以讓我在明年,一邊整理出想寫的文章,一邊有個「工作」。
老師手頭,正在進行一項攸關台灣學術研究競爭力的計畫。他認為這項計畫極有其價值與意義,且剛好有一個 post-doctor 的缺額,因此建議我 take full-time job。我還是很擔心自己整理不出想要的東西呢。因此,不斷地詢問是否工作的負擔會太過沈重。
我說,我擔心因工作過重,而無法在明年達到自己所預設的目標。老師說,我有將情緒 dramatize(戲劇化)的傾向。是嗎?我因不知而感到好奇。
老師說,一個例子是,當初他建議我從研究 Theorem-Proving 轉到 Intelligent Agent 領域時,我的回答是:「已經花了這麼多時間在定理證明上,所以不該如此輕易轉移研究主題 ...」。他說,轉換 Topic 並不是什麼 big-deal,不需要如此悲壯的。
嗯,說自己 40 歲想要做些什麼,應該是有些 dramatizing 吧?然而,過了四十歲,要再找個理由來讓自己整理年輕歲月的痕跡,恐怕會更困難吧。為了不讓自己在往後的歲月後悔,似乎是應該找回自我,做些真正想做的事情的。
另一方面,家人們都希望我去找教職或研究的工作。我說,我覺得自己並不是那麼合適做研究,而或許教職是可以考慮。但現在競爭激烈,要進好學校教書也不是那麼容易啊。(事實上,我也一直沒有嘗試申請過,所以算是在逃避。)
太太說,我也不是那麼容易聽人勸的。她說,我最容易聽進去的話,多半是從貓那邊「敲邊鼓」來的建議。我想,這或許是因為貓的想法,最接近我的個性吧?
星期三, 8月 10, 2005
放下,也是另一個開始
說開了九月底就要卸下現在的工作。
除去工作上的壓力,最主要的原因,是因為自己明年就要四十歲了。40?是個年輕時很難想像的年齡呢。回顧自己這些年走過的痕跡,竟也感到茫然。
從 國中、高中時代,就開始對電腦程式感到興趣。最初,是由二舅花了幾萬元,買給大姊使用的 Commodore PET。8 位元的機器,記憶體很少,應該不到 64KB。但即使如此,我仍舊著迷於大姊用 BASIC 開發出來的一些小程式。對我而言,電腦程式蘊含了開發者解決問題的精密構思。不論是資料結構的巧妙安排、抑或是演算法的高明深刻,都深深地吸引著年輕的 我。
之後,APPLE II 開始流行。但讓自己印象最深刻的,卻是大一時玩的 Ultima IV。它讓我廢寢忘食,足足玩了一整個暑假。
大學時代,修習的是電機。然而,除卻它是第一志願外,我對電機其實並沒有什麼興趣。反而是在社團(應該是叫做計算機研究社吧)裡,找到一些志同道合、對電腦感興趣的朋友。
雖然在大一、大二時,也有計算機相關的課程,但不知是因為老師教得不夠好,還是自己不夠認真,總覺得不得其門而入。直到大三,修習 Compiler 與 Artificial Intelligence 的課程,才算是重新燃起自己對 Computer Science 興趣。
出國留學, 讀的就是 Computer Science。雖然 University of Maryland 並不算是很有名的學校,但是自己也真的學到了不少。其中,因自己對於計算理論還算頗有興趣,甚至還跑到數學系修習了數理邏輯與集合論的課程。對於 Goedel 的不完備定理,尤其感到讚嘆與折服。
出了一些狀況,讓自己在 Maryland 只取得碩士學位,就回到了台灣。第一個叩門詢問的老師,就是對定理證明相當有研究的指導教授。很遺憾地,雖然自己對數學頗有興趣,但是數學基礎卻著實不 夠,因而自己最終還是轉換了主題,研究 Intelligent Agent (智慧型代理程式)與 Information Retrieval (資訊檢索)。
畢業時,剛逢 Internet Bubble 的末期。加入了一間新成立的軟體公司,兩年後卻不幸關閉。接著,我就加入現在的公司,從事 mobile Internet 上的軟體架構與產品開發。
三年又過去了。算算自己在業界,也有五年以上的經驗。這些經驗是什麼呢?一時之間,竟然也想不起有那些。比較有收穫的,似乎只有這半年來,在公司所進行的 一個軟體品質改善專案。我覺得,自己學到了許多學校裡很難教的東西:包含軟體專案開發的團隊建構、角色職責、時程規劃與執行、以及「你給他人越多,自己學 到的就越多」。
雖然覺得公司的軟體產品還是有價值,但現在還是選擇了離開。原因,就是自己快要 40 歲了。我希望自己在明年,能夠整理出一些這些年的感想與心得,一些自己曾感興趣的演算法或電腦程式,寫些短文,算是對逝去青春的一些省思與留念。
但久沒寫作,雖然已經有了幾個主題,竟然連第一段文章也寫不出來呢。看來,自己還是得多練習、多督促自己,才有可能完成吧。
除去工作上的壓力,最主要的原因,是因為自己明年就要四十歲了。40?是個年輕時很難想像的年齡呢。回顧自己這些年走過的痕跡,竟也感到茫然。
從 國中、高中時代,就開始對電腦程式感到興趣。最初,是由二舅花了幾萬元,買給大姊使用的 Commodore PET。8 位元的機器,記憶體很少,應該不到 64KB。但即使如此,我仍舊著迷於大姊用 BASIC 開發出來的一些小程式。對我而言,電腦程式蘊含了開發者解決問題的精密構思。不論是資料結構的巧妙安排、抑或是演算法的高明深刻,都深深地吸引著年輕的 我。
之後,APPLE II 開始流行。但讓自己印象最深刻的,卻是大一時玩的 Ultima IV。它讓我廢寢忘食,足足玩了一整個暑假。
大學時代,修習的是電機。然而,除卻它是第一志願外,我對電機其實並沒有什麼興趣。反而是在社團(應該是叫做計算機研究社吧)裡,找到一些志同道合、對電腦感興趣的朋友。
雖然在大一、大二時,也有計算機相關的課程,但不知是因為老師教得不夠好,還是自己不夠認真,總覺得不得其門而入。直到大三,修習 Compiler 與 Artificial Intelligence 的課程,才算是重新燃起自己對 Computer Science 興趣。
出國留學, 讀的就是 Computer Science。雖然 University of Maryland 並不算是很有名的學校,但是自己也真的學到了不少。其中,因自己對於計算理論還算頗有興趣,甚至還跑到數學系修習了數理邏輯與集合論的課程。對於 Goedel 的不完備定理,尤其感到讚嘆與折服。
出了一些狀況,讓自己在 Maryland 只取得碩士學位,就回到了台灣。第一個叩門詢問的老師,就是對定理證明相當有研究的指導教授。很遺憾地,雖然自己對數學頗有興趣,但是數學基礎卻著實不 夠,因而自己最終還是轉換了主題,研究 Intelligent Agent (智慧型代理程式)與 Information Retrieval (資訊檢索)。
畢業時,剛逢 Internet Bubble 的末期。加入了一間新成立的軟體公司,兩年後卻不幸關閉。接著,我就加入現在的公司,從事 mobile Internet 上的軟體架構與產品開發。
三年又過去了。算算自己在業界,也有五年以上的經驗。這些經驗是什麼呢?一時之間,竟然也想不起有那些。比較有收穫的,似乎只有這半年來,在公司所進行的 一個軟體品質改善專案。我覺得,自己學到了許多學校裡很難教的東西:包含軟體專案開發的團隊建構、角色職責、時程規劃與執行、以及「你給他人越多,自己學 到的就越多」。
雖然覺得公司的軟體產品還是有價值,但現在還是選擇了離開。原因,就是自己快要 40 歲了。我希望自己在明年,能夠整理出一些這些年的感想與心得,一些自己曾感興趣的演算法或電腦程式,寫些短文,算是對逝去青春的一些省思與留念。
但久沒寫作,雖然已經有了幾個主題,竟然連第一段文章也寫不出來呢。看來,自己還是得多練習、多督促自己,才有可能完成吧。