Computer-電腦與人生


影響力

Saturday, October 29th, 2011

這個月資訊界有很多了不起的人去世,很多人爭相討論到底誰才真正改變了世界,誰的影響力才大。Steve Jobs的死訊讓千萬人悼念,但發明C語言和UNIX的Dennis Ritchie和AI之父John McCarthy的消息就沒有受到如此廣大的注目。剛好最近很常和人聊到相關的話題,所以想寫篇文章讓自己反芻一些想法,也順便交換一些意見。

四年前,當我在申請博士班時,我還不確定我想做什麼以及我能做什麼。我知道自己個熱愛技術、喜歡親手打造工具來解決問題的工程師。我喜歡憑一己之力解決問題的成就感,喜歡挑戰新鮮的事物,討厭做重複無趣的事情。當時我有兩條路可以選,出國念博士班,或是留在臺灣做軟體工程師。我幾乎沒什麼猶豫就選了出國,畢竟可以做自己真正想做的事,雖然收入會比去工作少,但只要夠生活其實也不是那麼重要。

到了美國後,做了幾年研究,朝了夢想靠近了一點,但對於很多事的想法都有些轉變。

先來說說一些關於影響力(impact)的想法。在學術界做研究,最直接的產物是論文(paper)。研究人員都希望自己的論文可以在自己的領域裡掀起一些漣漪,把自己的想法擴散出去,甚至流芳百世。但有個問題是,一個研究的影響力不是短時間內看得出來的,一個好的想法可能會埋在數十年前的論文中,直到某個人不小心看到了才衍生出諾貝爾獎等級的產物。所以做研究的人通常不太會計較論文寫出來後到底有沒有用,因為根本就沒辦法知道。一兩年內沒被人引用不代表十年後就不會有,同樣的,即使一時引起了廣泛的討論,可能過兩年就又沉寂下來被人遺忘。

這就是在學術界的難處,很多發明和想法的價值不是馬上看得到的,甚至最後演變成產品後大家也不會知道最原始想法的來源是誰。簡單的說,學術界缺乏一個有效率的機制來快速強化有價值的想法和研究,而只能讓這些論文自然的發展和淘汰。如果剛好有人發現某個論文的價值,就會把它實作成產品再推到市面上給一般消費者使用。但如果沒有的話,這些論文就等於是白寫了,也不會對學術界以外的人造成什麼影響。

我喜歡做自己喜歡的研究,但我也想要自己做的東西是有實用價值的,而不是紙上談兵的理論。所以在研究工作之餘,我也花了很多時間把我的研究成果(像是sikuli)打造成真正能用的軟體並公布出來,讓大家馬上就能享受到成果,而不是等若干年後有個很閒的人碰巧發現這想法才把它實作出來。之前有個朋友問我要怎麼在做研究和instant impact(立即的影響力)中做選擇,我的答案很簡單:「這兩件事並不是互相衝突的,是可以同時完成的」。

話雖如此,如果談到影響力的大小,那我的答案可能又會有點不一樣。讓我從另一個體悟說起。

這幾年來還有個很大的體悟是:「個人的力量是很渺小的,社會中每一種角色都很重要」。雖然看起來是小學生都知道的廢話,但工程師個性的人就是喜歡凡事自己動手做。馬桶壞了自己修,燈泡不亮自己換,就連公寓附的微波爐壞了我都想先幫他們debug一下確定問題根源後再找人來換。凡事自己做是很有成就感,但如果真的想擴大影響力時,就會有點力不從心。

舉例來說,Steve Jobs和Steve Wozniak當初打造蘋果一號和蘋果二號時,如果缺少了任何一個人,這件事都不會成功。很多技術本位的人覺得工程師才是真正做事情的人,如果不是工程師(Woz)打造產品,那商人(Jobs)要賣什麼?但反過來想,如果不是Jobs幫Woz把他的蘋果一號推銷出去,Woz也不能拿這個收入來繼續研發蘋果二號,而蘋果一號也就只會是他閒暇時候的個人玩具而已。這兩個人的角色不同,但卻是完全的互補對方的短處,而蘋果這家公司也就是建立在這樣的基礎上才能持續不斷把產品轉化成價值(也就是金錢),再拿回來繼續研發更好的產品。這個稱為「商業行為」的正向循環是人類社會中非常強而有力的發明,可以不斷自我成長,同時又讓更多人受惠。

看完Apple的例子後,讓我們來看不採用這個稱為(邪惡)商業行為的正向循環時會發生什麼事。以我自己的sikuli為例,我在去年初釋出第一個版本後,這一年多來有九個版本更新,其中三次是重大的更新,總共被下載了二十多萬次(在官方網站上,至於其他各地的mirror我就不知道有多少了)。看起來是不錯的數字吧?我當初釋出並open source的目的就是希望讓更多人使用,也希望有些開發者能進來幫助我開發、翻譯、寫文件之類的,好讓這個東西獲得一定的動能自我發展下去。

但過了一年多後,我發現事情沒有想像中的那麼簡單。一個不營利的open source專案是非常難自我成長的,因為缺乏直接的誘因($$$),我沒辦法雇別人來加入開發,只能祈求剛好有人對這東西「有興趣」,並且有足夠的「能力」、「時間」、「毅力」看懂我原本的code,並加入「符合專案方向」的修改。以上的條件要全部都能滿足,才會有人發個email給我說「嘿 我想送一個patch….」。此外,因為這專案開始只有兩個開發者,沒有其他專長的人,所以我們有很多事都沒辦法做。例如說,我們沒辦法一一回答用戶的問題,因為實在太多五花八門的問題了(客戶關係管理失敗);沒有人去推銷或廣告sikuli的存在(一切都靠口耳相傳);沒有足夠人力填寫和維護文件;沒有人幫我們在各種環境做測試(只好直接拿用戶當白老鼠);沒有專業設計師設計使用介面、網站、logo(一切都是我自己東拼西湊的);沒有人做市場調查,研究什麼功能才是最重要的(所有先做的功能都是我自以為重要的)….有太多事都是我們想做但無能為力的。雖然後來有個熱心的粉絲常駐在我們的論壇上回答絕大多數的問題,甚至還幫我們寫了大多數的文件,但開發力量還是一直很薄弱,有很多我們想做的東西一直都沒時間沒人力去做。看看這個commit log就可以了解了(前兩個是核心開發者,後面都是用戶):

1065 Tsung-Hsiang Chang (其中有19個是用戶送來的patch)
94 Tom Yeh
61 RaiMan
34 Karl-Michael Schneider
9 anatoly techtonik
1 Arnaud Gelas

殘酷的事實:雖然用戶不少,但所有的commit裡面只有11%是由核心開發者以外的人貢獻的(包括了code和documentation)。(更殘酷的是我一個人就佔了超過八成的commit,要是我停下來的話整個專案就等於是死了)

一個人的力量真的很渺小,我知道有很多事能做來讓這個軟體變得簡單、更完美、讓更多人能使用,但一個像這樣的open source專案缺乏誘因吸引更多不同專長的人加入,靠一兩個人閒暇的時間和力量是沒辦法長久經營下去的。這時候我就覺得非常需要一個像Steve Jobs一樣的人來幫忙,因為商業化可以很有效率的讓這個軟體持續成長,並直接讓更多人受惠。工程師雖然是做出產品的人,但如果沒有商人來把產品賣出去,換成資金進來繼續研發,現代社會就不會有這麼多種精緻、可靠、高品質的產品可以用,很多高科技原型就永遠都只會是工程師的玩具而已。

體會到這點後,突然也可以了解世界上很多職業存在的理由和價值。例如佔領華爾街的人說,華爾街只是把錢從一手拿進來,再從另一隻手轉出去,憑什麼可以從中獲得巨大的利益?回答這種問題的時候,其實只要想想:如果沒有這些人存在,世界會變什麼樣?一個簡短的答案可能是:沒有華爾街,大家的錢就會放在家裡,放再久也不會有利息(甚至還有可能發霉或被蟲吃掉),因為沒人把大家的錢拿去再投資;需要錢的人(例如想創業的人),也不容易借到錢或找到人投資,因為大家只能跟認識的親朋好友湊錢;假設有一兩個人願意借錢,運氣好可能不用利息,但同樣的運氣不好可能會被收高額利息而不自知(因為沒有流通的市場,所以也不會有一個大家公認的合理利率)。從這個角度一想,促進經濟有效率的流通(也就是把錢從一手拿進來,再從另一手轉出去)的確是非常重要,即使他們沒有實際生產出什麼東西,但也對社會帶來很大的價值貢獻。同樣的道理,工程師老瞧不起銷售人員憑一張嘴就可以拿高額獎金,但仔細想想,要是沒有人銷售產品,公司就沒有收入讓工程師製造更好的產品了。如果用經濟學來解釋,每個角色的價值都是市場決定的,如果銷售很簡單又好賺,那工程師就會自產自銷而不是交給別人來做了。

以前我總覺得商人是邪惡的化身,但當自己想開始把影響力擴大時,就會發現每一種角色都是不可或缺的。經營公司也不見得是要以賺錢為目的,而可以是為了研發更好的產品而建立的一個生態系統。而社會中每一種角色都有其重要性,每一種人的貢獻和影響力也很難比較,與其爭論這些事,倒不如做好自己認為最重要的事來改變這個世界。

做研究與寫論文

Thursday, March 3rd, 2011

最近有幾篇頗有爭議的文章「陳鍾誠給李家同的一封公開信」 「陳鍾誠給李家同的第二封公開信」,針對李家同批判他是現在學術界獨尊論文的始作俑者,並指出應該要有其他的研究產物或評鑑方法(像是寫一個作業系統、做一個CPU之類的)。雖然李家同常常講出令人啼笑皆非的話,但就這兩篇文章而言我還真覺得李家同挺無辜的,連學術界獨尊論文的事也怪到他頭上實在有點牛頭不對馬嘴。

雖然我博士班還沒畢業,但我也寫過幾篇論文,也做過有上萬人使用的系統,我非常了解擅長實作不擅長寫論文在學術界的苦悶和無奈。但隨著我在MIT的時間越來越長,也對這個現象慢慢有了不同的看法。

話說我很愛寫程式,遠勝於寫論文。我可以不眠不休的寫程式,但沒辦法這樣寫論文。如果我當初碩士畢業後直接去工作,就可以在任何我想去的公司愉快的全職寫程式,但到頭來我還是來念博士班了,為什麼?很簡單,我需要有個環境能讓我不計後果的做各種嘗試和試驗。我喜歡寫程式,尤其是沒人做過的程式(一直重複寫留言板和twitter client可不好玩)。做沒人做過的事雖然好玩,結果可能會出乎意料的好,但也有可能會大大的失敗 – 而這就是研究。在公司裡做工程師寫程式就不太能做這樣子的事情,因為公司要考量風險,可能會大成功的東西也意味著可能會大失敗,而大部分的公司沒辦法禁得起這種失敗,所以只好跟著別人的屁股走。

MIT是個很酷的地方,歷史上有很多有名的系統都是在這裡誕生的,像是Ethernet、Emacs、GCC、LISP(語言和第一個compiler)…。如果說要在學術界動手做真正的系統,那MIT一定是世界上數一數二的地方。那麼在這個地方,博士班學生要如何畢業,教授要如何升等呢?

很不幸的,答案是:寫論文。

在資訊科學這領域,美國學校不像台灣獨尊SCI論文,事實上美國人大多不知道SCI是什麼東西,但不是這樣就代表美國不寫論文。在這邊搞電腦、資訊研究的,一樣要寫論文,而且只投到各子領域的一兩個頂尖會議去。(一個大家都知道的潛規則是,三篇頂尖會議的長論文=博士畢業)

台灣有台灣的遊戲規則,美國也有自己的遊戲規則,但即使是MIT的系統hacker們,也擺脫不了寫論文的命運。(例如說,Richard Stallman其實有寫Emacs的論文,做PostgreSQL的Stonebraker也有一大票的POSTGRES論文

我以前覺得寫論文很痛苦,也懷疑有多少人會去看這些紙張(論文英文就叫paper,所以名符其實就是一堆紙),對我來說直接把程式寫出來讓人用似乎更能直接造福人們。我到現在其實還是這麼覺得,所以我花了很多時間把SIKULI open source,建立起一個community,並持續更新千百個跟研究完全無關的功能,目的就是讓所有人能更直接的享用到這個研究的成果。(而很不幸的是,做這些事情跟我能不能畢業沒什麼關係,但還好我老闆還是支持我的。)

但同時,我也覺得論文的存在有其必要性。我認為做研究可以產出多樣化的「產品」,這產品可以是程式碼,可以是影片,或其他任何形式的媒介。而追朔到其核心,研究的產出最重要的是「想法」,也就是 “idea”,而論文只是最簡單又最容易被其他人接受的傳播媒介而已。

為什麼說論文有其必要性,就是因為論文是傳播想法最有效的媒介。論文的架構設計得讓人可以很容易抓到重點,也可以很容易的深入核心想法。如果寫過論文的都知道,論文的架構是死的,一定都有abstract、introduction、related work、conclusion等等,這種架構讓人能各取所需,要深讀或略讀都很容易。但如果說研究的產出是一個軟體系統,我們該從何了解這個系統的「想法」在哪呢?為了要讓一個系統達到「可用」的程度,整個系統裡面至少90%以上的程式碼都是純粹的工程產物,跟核心概念一點關係都沒有。而程式碼又是很難讀的東西,如果別人要了解這個研究的創新在哪,讀程式碼一定是不得已的最後手段。

我絕對贊成做研究的人也得懂如何實作。很多好的idea其實老早在數十年前的論文就出現過了,但一直到現在都看不到,常常只是因為沒人去把它實作出來而已。做研究最難的事就是找到新的idea,如果只是學人家實作一個作業系統或是CPU,那也不過是照本宣科,沒什麼「研究」的價值和貢獻。像MIT這種強調”Mind & Hand”(手腦並用)的地方,很多教授都有很強的實作能力,但他們一手寫程式,另一隻手還是寫論文,因為他們知道這樣才能得到務實的經驗,而同時也能把這些貢獻和想法用最有效的方法傳播出去。

如果你問我,「我在學術界,但我擅長寫程式,不擅長寫論文,該怎麼辦?」

我覺得答案很簡單:如果你有很多創新的點子,那就開始練習寫作和英文,因為不管在什麼領域,如果你沒辦法好好的把想法傳達給別人,那也是孤掌難鳴;如果你沒有什麼點子,只是喜歡寫程式,那更簡單了,趕快quit去做工程師專心享受寫程式的時光吧。

延伸閱讀:
我看李家同的是與非。此文的觀點跟我很接近,所以他講過的很多東西我就不再重複了。

附帶一提,最近在facebook上成立了粉絲頁,歡迎大家加入多多交流!

Google Canlendar支援Safari了..

Friday, June 23rd, 2006

剛剛不小心在Safari中連到Google Calendar,沒想到竟然可以用了..Q_Q

GDB的妙用

Wednesday, June 21st, 2006

今天有個同學跑來跟我求救。他說有隻重要的程式在工作站上面跑,但沒有放在screen裡面,可是Windows的鍵盤滑鼠都卡死了,有沒有辦法能重新開機(也就是關掉windows上的terminal, putty)而且讓程式能繼續跑下去..。
其實我以前也遇過同樣的問題,只是一直沒去想怎麼解決,後來都習慣用screen,就自然不會遇到這問題了。可是我最近發現,其實有不少人都不知道UNIX上有screen這個好東西,於是只要跑些重要的程式,就得擺一個terminal在桌面上,而且千千萬萬不能關掉,否則跑了數天的結果就這樣白費了。

今天再次碰到這個問題時,仔細想了一下,terminal關掉會讓程式中斷的關鍵在於,程式會在terminal關閉時收到SIGHUP這個signal,而不處理這個signal的結果就是結束程式。在以前還不知道screen這東西前,都得用nohup這個指令來事先攔截SIGHUP。

那現在碰到的問題就是,有沒有辦法在程式執行到一半的時候,先在它收到SIGHUP之前把這signal擋下來?或是直接在它執行中修改它的程式碼,讓它忽略SIGHUP…?

想在runtime時變更程式的行為,讓我馬上想到gdb這個好東西。gdb可以在程式執行到一半時,attach到它的process上,接著就能做所有gdb能做的事情..。gdb能做的當然不只是debug啦,gdb可以在runtime改變程式的執行流程和行為,還能攔截程式本來應該要收到的signal…,咦,這好像就是解答了嘛!

Debugging with GDB可以查到,只要在gdb裡輸入這樣的指令,底下的程式就不會收到SIGHUP了。


handle SIGHUP nopass

所以這問題的解法很簡單。

  1. 從另一台電腦連上正在跑重要程式的工作站
  2. 用ps和grep找出那個程式的pid
  3. 用gdb attach它: gdb [program] [pid]
  4. 在gdb內輸入: handle SIGHUP nopass
  5. 把當掉的windows重新開機,在gdb內輸入continue讓程式繼續執行
  6. 你會看到gdb攔截到SIGHUP的訊息,再輸入continue就可以了

Why is Lisp so great?

Monday, June 12th, 2006

自從看完了駭客與畫家後,就開始看Common Lisp相關的書和文章。其中我最有興趣的是Paul Graham不斷提起的macro。

一開始我還不了解macro到底強在哪裡,為什麼能讓Lisp如此特別,直到發現Why is Lisp so great? or Why so many parenthesis?這篇文章,才大大一驚,原來macro是這樣玩的!

這篇文章舉了Haskell著名的quicksort implementation為例

qsort []     = []
qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x
                 where
                   elts_lt_x   = [y | y < - xs, y < x]
                   elts_greq_x = [y | y <- xs, y >= x]

這份實做真的非常漂亮,短短幾行就說完了qsort。
但如果用原始的Lisp語法寫起來還蠻複雜的,因為Lisp沒有提供list comprehension(Haskell的中括號)這種特殊的簡潔語法。但透過macro,就可以自己幫Lisp加上新的語法,而且完全不用動到compiler。

(defun qsort (ax)
  (and ax
       (let ((a (car ax))
             (x (cdr ax)))
         (append (qsort [y (y < - x) (< y a)])   ; A
                 (list a)          ; B
                 (qsort [y (y <- x) (>= y a)])))))   ; C

多麼神奇的特色啊,也難怪Lisp可以活這麼久而且永遠有許多死忠支持者..。

Google Browser Sync

Thursday, June 8th, 2006


Google又有新東西了,這次是Google Browser Sync

它是一個firefox extension,可以全自動sync不同電腦間的browser設定,包括bookmark, history, cookie, saved password(註), 甚至可以把目前看的所有tabs存下來,再到另一台電腦打開..。

註.
連saved password都要放到google上,真是有點恐怖。雖然它號稱會用你的PIN code加密過,但真的能這麼放心的把密碼也交給google嗎?

Google Notebook

Tuesday, May 16th, 2006

http://www.google.com/notebook/

Google又有新東西啦,這次是notebook。還是只支援IE和Firefox,不支援Safari,而且也不能作中文search @_@

搭配它的Firefox extension還不錯用,可以很方便記錄網頁上的資料。
看來有機會讓我改掉用BBS作記錄的習慣…

Vim7嘗鮮

Wednesday, May 10th, 2006

剛發現Debian的experimental pool中其實已經有vim 7.0 beta了,所以就裝來玩玩了。 為了用tab page,還得設一些新的key binding。 很多人都用Ctrl-T來開tab,但ctrl-t在trace code時很常用,所以我只好mapping到別的鍵了。

map tl :tabnext
map th :tabprev

map tn :tabnew

map td :tabclose

另外,設定cursorline和cursorcolumn兩個option可以使游標所在的行、列高亮度顯示出來。設定spell可以開啟新的spell checking功能。

Vim7

Wednesday, May 10th, 2006

Vim7正式推出了,以下是官方公佈的一些新功能:

  • Spell checking support for about 50 languages
  • Intelligent completion for C, HTML, Ruby, Python, PHP, etc.
  • Tab pages, each containing multiple windows
  • Undo branches: never accidentally lose text again
  • Vim script supports Lists and Dictionaries (similar to Python)
  • Vim script profiling
  • Improved Unicode support
  • Highlighting of cursor line, cursor column and matching braces
  • Translated manual pages support.
  • Internal grep; works on all platforms, searches compressed files
  • Browsing remote directories, zip and tar archives
  • Printing multibyte text

因為debian還沒有推出正式的package,我也就還沒試用。但從上面看來,我最期待的就是tab page, undo branches了 :-D

微軟正黑體

Friday, April 28th, 2006

有人把Windows Vista裡的”果然很正正黑體”拿出來,放在browser裡面效果還真是不錯。

將網頁的字型換成「微軟正黑體」

Debugging Backwards in Time

Friday, April 21st, 2006

剛發現這篇文章: Debugging Backwards in Time

簡單的說,這篇文章的作者實做出一個稱為ODB(Omniscient Debugger)的除錯器,它可以讓debug變得像操作錄影機一樣,把整個程式執行過程的變化全部錄下來,於是你就能輕易地在執行時的時間點跳來跳去。

以往只能從頭慢慢開始下一步,頂多設些中斷點。有了ODB後,debug完全不同了…。要是不小心跑過頭,可以來個”上一步”,甚至可以直接從 exception發生的地方倒帶,看看到底哪裡發生了不該發生的事。這種debugger是每個程式設計師的夢想,但現在竟然成真了!

相關的link:

  1. Bil Lewis, “Debugging Backwards in Time”, 2003.
  2. Presentation video