十月 29, 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一樣的人來幫忙,因為商業化可以很有效率的讓這個軟體持續成長,並直接讓更多人受惠。工程師雖然是做出產品的人,但如果沒有商人來把產品賣出去,換成資金進來繼續研發,現代社會就不會有這麼多種精緻、可靠、高品質的產品可以用,很多高科技原型就永遠都只會是工程師的玩具而已。

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

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


五月 6, 2010
» Use Clipboard to Extract Text with Sikuli

Sikuli 0.10 has added tons of cool new features. Now it is easier to write smarter scripts to do more interesting and useful tasks than you can ever imagine. Here is one of my favorites. The original idea of this script was contributed by RaiMan, one of the most active Sikuli users. I simplified it a little bit and made a video to show how it runs in a real environment.

The source code of the Sikuli script that downloads a bunch of files.

The script to download a bunch of files.

The goal of this script is to download all ZIP files whose file name starts with “Sikuli-IDE-osx” in a web page. To find all ZIP files is easy, because they have an identifiable icon. However, we can’t simply click on the icon. We need to click on the hyperlink next to the icon, instead. The really tricky thing is, how to know a hyperlink that starts with “Sikuli-IDE-osx”?

The simplest solution is capturing a screenshot of the text “Sikuli-IDE-osx”, and putting the screenshot as the parameter of click(). Unfortunately, this way is not really robust since the images of text only have tiny differences. Sikuli’s fuzzy image matching engine may treat “S1kul1-1DE-esx” as the same as what we want. So, a right way to do this is – extracting the text from the web page.

You may recall that there was an ancient technology named OCR (Optical Character Recognition), which recognizes text from scanned books. However, current OCR engines do not really work well. They are slow and inaccurate.

In fact, even without OCR, we still can extract text from the screen using Sikuli.

How?

Use the clipboard!

The following script tells you how to do that. At first, we use Sikuli to find all locations of the ZIP icon (line 7). On line 8, we sort the list of the matched locations by their y coordinate, it’s not necessary though. The key steps are line 10 and 11. We click on the space between the icon and the hyperlink next to it using the new target offset attribute of a pattern. (denoted by a small red cross in the ZIP icon on line 7. See the figure below for its setting window.)

And then we hold the mouse button and drag to the location 600-pixel right to the center of the icon. This step (line 2) actually simulates using a mouse to select a line of text with a dragDrop(). After the selection, we simply press Command+C (Ctrl-C on Windows) to copy the selected text into the system clipboard.

Copy (extract) text from a browser.

Aha! We got the precise text in the clipboard. :)

The rest of the script are trivial. Sikuli 0.10 provides a new API Env.getClipboard() to get the content of the system clipboard. We can use this function to get the text of the hyperlinks and then use Python’s string function (startswith) to filter out the files we need.

I also made a tiny video that shows how this script looks like when it is running.

一月 30, 2010
» Sikuli帶來的意義與無限的潛力

這禮拜真是我人生中最瘋狂的一天了..。

自從Sikuli發表後,我本來還打算一封封回覆所有的問題,後來發現排山倒海而來的郵件和留言速度遠大過我能閱讀和回覆的量。前幾天我優先把Sikuli比較大的bug和一些平台問題修掉,昨天釋出了0.9.7讓各平台都提升到同樣的版本(只剩Linux還是沒有抓圖的快捷鍵了),整體運行的速度也提昇了不少,並且新增了一個.skl格式讓人能透過command line或double-click直接執行script。如果之前下載過舊版的朋友強烈建議升級到0.9.7。

修完緊急的bug後,我們會再陸續補上一些文件和教學,說明一些常見的問題要怎麼解決。例如說,畫面上有多個一樣的元件(像check box, radio button)要怎麼處理如果按特殊鍵或是在不同的鍵盤排列上使用(用dvorak的人還真不少,一堆人跟我說type()在dvorak上會有問題)..。

但這篇文章中我想談的不是被上萬人盯著的壓力,而是關於Sikuli能帶來的改變,以及未來的潛力。

有些人說Sikuli看起來只是另一個按鍵精靈或是AutoHotkey,但其實Sikuli還有許多在這個直觀意義之上的潛力我們沒直接說出來。

第一,Sikuli最重要的革命是程式碼的可讀性(readability)和易用性(usability)。把螢幕截圖直接放在程式碼裡面,讓人能直接「看到」他想控制的東西,這是從來沒人想過的事情。以往的方法,不管是透過應用程式自己的程式介面(API)或是透過XPath拿到網頁裡的某個元件,都是只有程式設計師才能寫、才能讀懂的神秘外星語言。機器喜歡精確的語言,人類花越多力氣把事情描述的越清楚,機器就越容易讀懂。

可是,有沒有人想過,人類發明這麼多程式語言來操控電腦,究竟是便利了人類還是便利了電腦?現在我們每天用的程式語言,不管是C++、Java、C#、Python、Javascript..都是只有程式設計師才能寫才能讀的語言。更諷刺的是,這些「現代」語言跟五十年前就有的LISP、Fortran本質上並沒有什麼不同,一樣都是純文字,一樣要求精確嚴謹的語法,一樣是架在百層高塔的系統架構上。即使是訓練有素的程式設計師,要寫程式做些有用的事情也都得先翻翻充滿黑話的說明文件,看看需要的功能對應到什麼函式,運氣不好可能還得學個COM+之類的鬼東西才能使用。

如同我在追求神乎其技的程式設計之道(十):程式設計師的生產力之謎中提過的一樣,即使同為程式設計師,運用電腦的效率依然會有數十倍甚至百倍的差距。如果每天都要按一百個按鈕,程式設計師可以找到適合的命令列工具使用,或是自己寫程式呼叫應用程式提供的函式,就可以用一個按鍵取代這一百個按鈕。那完全不懂程式的一般使用者呢?恐怕只能兩手一攤任由別人寫好的軟體擺佈。也就是說,即使一個人掌控了鍵盤和滑鼠,但實際上卻是被別人的軟體限制住,如此使用電腦其實完全沒有自由可言。

Sikuli的革命把寫程式的門檻降低了,人們和系統或應用程式溝通不再需要讀用黑話寫的文件,也不用搞懂底層的架構是怎麼做的,只要把平常使用鍵盤滑鼠的方式,再加上想控制目標的螢幕截圖,就可以輕易寫成能自動執行的程式。

Sikuli Script範例

除了好寫外,任何人看程式和圖都能很容易讀懂程式到底做了什麼事,於是Sikuli很自然就能成為一種寫教學文件的最佳媒介。以往的教學文件常常step by step列出使用者要做的事,加上使用者應該要看到的畫面,很巧的是這兩者Sikuli script都有。但比傳統的文字描述更好的是,只要把Sikuli的指令混用在文件中,或是透過簡單的對應把文字描述轉成script,這樣一份文件不只人能看懂,連電腦都能執行這些步驟並且一步步告訴你要按的按鈕在哪裡。

第二,除了直觀上的GUI自動化外,其實Sikuli更重要的意義是提供了一種把使用者操作UI的互動過程記錄下來的新方法。以程式設計師的黑話來說,這可以說是GUI操作過程的serialization,如果用一般人的方法說,這就是把人機互動過程「數位化」的一種方法。

電腦發展的過程中,一條必經之路就是把人類周遭的一切資訊全部數位化。一旦資訊被數位化,就可以輕易儲存在電腦裡,或是透過網路分享給別人,電腦科學家也才能發展更多方法來處理、分析、運用這些資料。在21世紀的今天,人們把聲音、影像、文字全都數位化了,所以我們可以輕易的複製、傳播、使用這些資訊。但在人們如此依賴電腦的今天,人和電腦的互動過程其實一直沒有一個好方法可以記錄,所以更別提要複製或是分享這種互動過程。

而Sikuli在這個人機互動領域開了一條全新的道路,這也是為什麼Sikuli的論文是出現在「User Interface Software and Technology」的會議上,而不是在討論程式語言的會議上。

人機互動的過程一旦能被一個標準的方法記錄下來,接著就能複製,就能分享,就能讓電腦自動執行或是演算這些過程。未來的應用方式有千百種,唯一的限制只是看我們的想像力而已。

第三,Sikuli把電腦視覺的研究領域,從真實世界延伸到電腦的桌面上。這點說起來真是很有趣,電腦視覺的研究人員數十年來嘗試想讓電腦能像人一樣「看」這個「真實世界」,可以像人一樣認得別人的臉,或是認得馬路長什麼樣才能讓電腦自動開車,但卻沒什麼人想到讓電腦「看」電腦自己輸出的畫面。在技術上來說,電腦螢幕上的資訊全都是電腦自己產生出來的,沒有光影問題,沒有角度問題,辨識上的難度遠低於真實世界所需的難度。以現在的電腦視覺技術來說,辨識螢幕上的東西簡直可以說是殺雞用牛刀。

Sikuli把電腦視覺和人機介面兩個研究領域打通了,有很多古老的問題(例如OCR,文字辨識)在真實世界很難解決,但在電腦桌面上卻可能可以發展出又快又準確的方法。Sikuli也可能激發更多人把電腦視覺應用到軟體介面上的創意,讓使用者介面不只是簡單使用,也能讓每個人能真正隨心所欲的操控電腦。

第四,建立在Java平台上並且open source的Sikuli,很有潛力能讓每個人都能打造給自己的專屬程式。

Sikuli不只是提供了一堆自動按滑鼠和按鍵的指令集而已,每一個Sikuli script都是一個和Python語法相容的程式。這意味著你可以使用任何的Python語法,不管是迴圈、if、定義function、或是定義class,每一個Sikuli script都是一個真正的Python程式(嚴格來說,應該是Jython,但這中間的差別並不太重要)。除此之外,Sikuli核心是跑在Java平台上,所以可以輕易的使用任何Java的函式庫。例如說,你可以用swing建立一個新的視窗包含了兩個按鈕,按下第一個就用Sikuli執行每天上班前的例行工作,而按下第二個紐則執行下班前的例行工作。會寫程式的人可以輕易混用Sikuli和現有的函式庫,把Sikuli當成和系統或其他應用程式溝通的媒介,並在上層建立自己的新介面。也就是說,這就是桌面環境的mashup,可能的應用是無限大。

雖然不懂程式設計的人,難以撰寫複雜的GUI程式或是資料處理。但Sikuli結合了現有的平台並且open source,這樣的好處是會有來自世界各地有閒有能力的人幫忙讓Sikuli變得更簡單更好用,並結合其他的程式語言或是函式庫讓寫程式的整體門檻大大降低。

雖說Sikuli現在還不是那麼完美,但我相信open source會加快Sikuli的發展,讓更多有興趣的人進來幫忙。很多技術上的問題其實都好解決,例如有人問到是不是桌面換個skin後script就廢了,或是能不能在背景執行script。這些問題其實都有好幾種可能的答案可以解決,只是有沒有必要現在就做而已。技術問題向來都不是能阻擋我的絆腳石,真正困難的只有突破自身創意和想像力的界線而已。

每個人使用電腦的方法都不同,軟體公司設計的軟體也只能按照大部分使用者的需求和習慣所設計。但不論有多少功能,總是不可能涵蓋到每個人的大大小小需求。讓每個人都能寫程式(不論他們是不是知道他們正在寫程式)是我一心嚮往的目標之一,或者說是我希望每個人都能100%按照自己的意願花最少力氣完成最多工作。但在今天的電腦環境上,不會寫程式就有太多事都無法做到,即使會寫程式的人,也不見得願意花那麼多力氣去研究讓自己未來更省力的方法。

這個問題的癥結不在於使用的人太懶惰或是不夠聰明,而是電腦太難用。一個人得經歷幾年的訓練才能熟悉這種用程式「掌控」電腦的感覺,實在太不合理。或許沒有人想研究讓寫程式變得更簡單是因為怕丟了自己的飯碗,但我偏偏就覺得每個人應該要有聰明使用自己工具的自由,而不是反過來被工具限制了自己。所以,我希望Sikuli能讓更多人把使用電腦的自由搶回自己手中,而不是被軟體工程師們掐住脖子動彈不得。

寫到最後,能參與Sikuli這個project其實最需要感謝的人是和我合作的Tom Yeh,在我進MIT前他就在跟我老闆Rob Miller討論用螢幕截圖來搜尋文件的可能性,所以其實在我還在當兵時我們就已經搭上線開始合作了。後來我到了MIT後,一連串的討論就激發出許許多多混合螢幕截圖和電腦視覺所產生的點子,其中第一個成果就是現在的Sikuli。

Sikuli Script只是這一串研究的開端和基石,在這之上其實我們還做了很多東西。例如說我們已經有一個能錄製螢幕和使用者動作的程式,可以把使用者的動作自動轉換成Sikuli Script,也就是說使用者一行程式都不用寫,只要把想做的步驟做一次,程式碼和螢幕截圖就會自動產生出來讓你修改或直接使用。用這個錄製程式,我們可以輕易的在現有的GUI系統上觀看全系統的操作歷史,甚至是自動redo某一部分操作。有這些系統做基礎,我們能做的事情實在太多了,我只怕自己時間和能力有限,沒辦法把所有的點子都做出來。所以,這也是我們把Sikuli公開的目的,希望開放這塊寶石後,能有更多人發揮想像力發明出更有趣更有用的東西來,並徹底打破現今使用電腦的方法,一起來改變世界吧!


一月 25, 2010
» Change The World!

之前一直沒機會跟大家分享我在MIT到底在做什麼研究,但拜登上MIT首頁的一篇報導「Picture-driven computing」所賜,我這兩年的project Sikuli像原子彈爆炸一般透過slashdot和twitter以不可思議的速度擴散開來。而這幾天,剛好碰上學校每年都會舉辦的滑雪三天三夜旅行,我照著計劃坐上遊覽車到四小時車程外的緬因州滑雪。第一天晚上到旅館發現沒網路可用,只好早早上床睡覺養足隔天的精神。到了隔天中午,在雪場的餐廳吃午飯時,我想說該來試試有沒有網路用,於是拿出ipod touch連上網後,沒想到迎面而來的是近百封關心sikuli的郵件。在震驚之餘,我還沒意會過來到底發生什麼事了,直到我看到一封來自跟我同實驗室的學長Michael發給實驗室所有人的信,標題寫著:「Sikuli on Slashdot!」,接著我才意識到:啊!原來是遭到slashdot effect攻擊了!(slashdot是全世界關心科技、網路、電腦技術的人幾乎必看的網站,只要某個網站一被登上slashdot,馬上就會遭到來自世界各地數以千計的閱覽攻擊,其效果等同於分散式阻斷服務(DDoS)攻擊,而這現象就被稱為slashdot effect。我以前都以為只有網站會有突然出現的巨大流量,沒想到連我的信箱也會…)

在這件事情之前,我從沒體驗過媒體和網路的力量可以有多麼驚人。從MIT News發出的一篇報導,隔天被轉載到一小部分科技、技術網站,並且在twitter上開始有人開始口耳相傳這個新玩意。再過一天,有人把這消息推上了Slashdot: MIT Offers Picture-Centric Programming To the Masses With Sikuli,很快的sikuli這名字開始傳遍世界。我在twitter上搜尋了sikuli,想看看人們都說些什麼,結果看到由各種不同語言寫的tweet不斷湧出,就在我還沒看完一頁時又冒出 「xx more tweets since you started searching」 的訊息。搜尋出來的tweets除了絕對多數的英文外,也看到很多俄文、法文、日文,反倒是中文的消息最少,實在讓我有點哭笑不得。(關於訊息的傳播,我也透過這次的事件觀察到不同國家對同一事件反應的一些有趣現象,以後再另寫新文跟大家分享。)

人在偏僻的山中滑雪,突然看到這麼多人們在討論著我的project,還有信箱裡塞滿各種關於sikuli的問題,讓我興奮得不得了。當時我的心情其實完全顧不得滑雪了,但難得的旅行還抱著電腦一直坐在餐廳裡實在也有點可惜,只好趁著有網路時把每封信大略瀏覽一下,下午就趁著坐纜車上山的空檔想想怎麼回覆這些郵件。

太陽下山後,我終於按奈不住卸下裝備就拿著電腦回到餐廳裡繼續連上網,結果又是更多的郵件湧入、更多的tweets、更多的衝擊。而當初把sikuli open source的決定,也讓我接到來自世界各地開發人員的意見和回饋,有人在一天內幫我把Linux上還沒實作的幾個功能寫完並送了patch給我,也有人為了在它的64-bit Windows上執行而直接hack了沒有原始碼的二進位EXE wrapper。除了寫程式的人外,有專業的user experience designer願意加入,也有人志願幫忙移植到Linux的工作。看著這些不知道什麼時候才能回完的信,我突然發現,我似乎真的做了一件不得了的事….。

在MIT裡其實常常能看到許多很驚人的點子,但可惜的是即使在MIT,大部分的東西也都停留在為研究而做的雛形階段,研究人員雖然產出了論文,但如果沒有對的人讀到那些文章,很多好點子也不過是停留在紙上變成可回收的資源而已。

Sikuli的論文其實在去年九月就在ACM關於user interface中最頂尖的會議UIST上發表了,在當時還拿了Best Student Paper Award,但為什麼一直到今天才突然爆發開來變成人們口中「革命性的新發明」呢?

說起來這還是得感謝MIT有自己的News office,一個記者剛好問了我老闆最近有沒有什麼有趣的研究,於是sikuli這個字就從這篇報導散播開來。但除此之外,我也蠻慶幸之前自己決定要把sikuli release出去,而且老闆也很支持我這麼做,整學期都沒問我「研究」上的進度。(把程式release跟研究本身沒什麼關係,有些教授對這些研究結果的實作是否能實用也不太關心,甚至覺得做這些事是浪費時間。)

其實一般人可能很難想像,要把一個研究用的雛型打磨到能夠公開讓任何人用的程度,所花費的力氣可是遠超過寫出最重要的核心功能。我花了幾個星期研究怎麼把Java程式包成Mac上的.app,研究怎麼把.sikuli變成能夠點兩下就打開的document package,怎麼把sikuli會用到的一大包dynamic libs包進.app中讓使用者不用安裝其他的相依函式庫…。搞定Mac後,我又花了一陣子把Sikuli移植到Windows上,雖然上層是Java寫的很好解決,但有部分程式碼是透過JNI連結到C++呼叫OS提供的API才能完成的。因為我一直都用Mac開發,所以這些東西本來都只有寫Mac版的,但為了要真正讓多數人能用這個軟體,只好跟老闆要了一台PC裝上Windows來完成這些相依平台的程式碼。Windows並不是我熟悉的平台,除了國中時玩過VB外,之後就幾乎沒在Windows上寫過什麼程式了。所以為了搞定Windows的移植,除了得速成學會一些Windows API外,還得搞定DLL+EXE的包裝,最後再包成installer讓人能一路按Next就裝完整個軟體。雖然這些事情我都是第一次做,但還好沒遇到太多困難,即使每個禮拜都要花兩三天寫Distributed Algorithms的作業,剩下的時間也剛好夠我處理完這些瑣碎的工作。

完成Mac和Windows初步的包裝後,我也一邊開始做網站、API文件,也請跟我合作的Tom一起寫了一些教學文章,順便讓實驗室的同學們當一下測試的白老鼠。因為周圍沒什麼人用Linux desktop(真是有點出乎意料?),所以Linux版就暫時被我擱著沒動。
後來大家都去放聖誕假期時,我趁著空閒做了一個demo的影片放到youtube上,但因為我也還不急著釋出public beta,所以也沒跟其他人說我做了這個影片。

就在MIT News來採訪的前幾天,0xlab剛好有幾個人突然寫信問我有沒有Linux版的sikuli。雖然不知道他們怎麼發現的,但看到有人想用我也就有了勁想把Linux版趕快完成。花了一天在我新要來的PC上裝好ubuntu後(還包含一個小時在搞定這台電腦的無線網卡driver…。沒想到到了2010年我竟然還在做這種事情…),再修一修Makefile後就包了一個功能不全的Linux版放到網站上。

有句話說「機會是留給準備好的人」。當sikuli被公諸於世的時候,之前做好的事情就突然就派上了用場。MIT News促成了這個好機會讓sikuli這個很酷的想法脫離UI研究會議的小圈圈,進入世界上有網路的每個角落,這時我之前憑著一股熱血就自顧自的作了這麼多的雜事,突然都有了它的意義。於是,在機會到來時,demo的影片加上能下載試用的軟體讓人們親眼看到並且能把玩這個革命性的點子,結果就讓twitter上充滿了一大片的「holy crap this is awesome! http://sikuli.csail.mit.edu」。

我一直夢想著要做些不一樣的事情來改變世界,徹底發揮我的長處做出能夠對世界產生巨大影響力的東西。還記得三年前我在申請MIT時,在SOP上大膽的寫了我的目標「I believe that programming environments should be smarter and more intuitive, and it is my goal to reinvent one that allows beginners to learn easily and adepts to be more productive.」,而三年後的今天,我非常興奮我踏出了改變世界的第一步。


A Feedjack powered Planet
A Django site.