2014年3月19日

十年職涯

算起來是 2003 開始做事的,到了去年 2013,十年了。這陣子碰到一些事情,結合起來有感而發,想寫寫東西,對這段歲月做個小結。

以前系上學的,偏重資訊系統(MIS),算是應用領域,接觸的多半是系統分析、Java 之類的技術,在 Windows 上面用 Visual Studio、Eclipse 之類的 IDE 寫程式。但第一次面試,就碰到蠻喜歡的主管,風馬牛不相及的跑去了嵌入式 Linux 領域。初接觸整個 Linux 世界,立刻就喜歡上那種「一切都有程式碼可以看」的感覺,從學著同事用 VMware 裝 Linux 然後用 Samba 開放出檔案,然後還是在 Windows 下用 UltraEdit 作業,到自己覺得要學就學整套,把筆電改灌 RedHat 7.2(那時候還沒有 Ubuntu,周遭則是沒人用 Debian)。記得有天問同事,在 Linux 底下哪套 editor 寫程式最好?記得他想了想,說看過評價是 Emacs 好,但他自己沒用過,所以不確定。就這麼一句話,開始我十年的 Emacs 坑。

部門後來從母公司切出,獨立出來一間新公司 QNAP(是的,就是後來上市發大財那間),環境較小,很快就覺得有些東西學不到。這時從其他公司挖角來的新同事建議,去他原先任職的公司 TrendMicro 長些見識,並幫忙找了介紹人。雖然 QNAP 已將我升遷為經理,但思來想去,仍然覺得成長比較重要。過去一看,的確制度好很多,也有很多高手。說來慚愧,當時對嵌入式系統的理解,竟然覺得重點就只是 cross compile,而且這錯誤觀念到了 Trend,依然沒有修正。因為當時部門所作的 network appliance 是 x86 base,程式則是 C/C++ 在 userspace 當一般 Linux program 來寫,差異只是跟 QNAP 一樣用 Makefile 硬做了一套充滿 hardcode 的 build system,所以比較麻煩點而已。真正重要的東西都沒學到,但至少對 unix system programming 有了比較好的基礎。

初生之犢,傻頭傻腦,建議我去 TrendMicro 的 QNAP 同事,以及當時還在 Trend 任職的介紹人,在知道我分配到的上司是某某人後,都有一些耐人尋味的反應。那些反應當下我不懂,不過現在算是懂了。他不是好老闆,我也太嫩不懂應付,一年多後就在考績被打 D 的情況下負氣離開,打算自己接案過活。離開前我問某高手同事,為何願意執行某些不合理要求,他說「我就做啊,反正到時候他自己會發現不行」。這句話可說比我在那裡全部其他經驗總和都還要震撼,也終於理解為何儘管高手如雲,部門開發的軟體中,卻仍存有一些愚笨的設計。

現在回憶起來,職涯中做錯的事實在不可勝數,但離開 TrendMicro 自行接案,卻是我最好的決定之一。Trend 給我很好的基礎知識與訓練,讓我在接案那段時光中能夠自行學習與成長,在那期間學了 Python,至今都還非常喜歡,並開始對 open source 有更多接觸,進而加入了帶給我決定性轉變的 Openmoko

在 Openmoko 真正開了眼界。Sean Moss-pultz 以他超凡的個人魅力集結了國內國外都堪稱頂尖的團隊,國外人馬如 Harald Welte, Michael Lauer,  Werner Almesberger 到後來的 Andy Green,國內如 Jserv, Olv, Tick 等人,搭配上開放的組織文化,我有種回到家的歸屬感,也真心相信可以在台灣做出一些什麼。這是一個站上世界舞台的機會,而且不是硬體品牌、代工,而是從裡到外,由 OS 到硬體,完全開放且自製的手機。

然而,夢想歸夢想,築夢仍需踏實。OM 自從換用一位錯誤的 CTO 之後,就漸走下坡,原本成員包括 Harald, Jserv 一個個離開,原技術團隊與 CTO 以及他帶來的人馬之間摩擦不斷,經營情況與氣氛都每下愈況。但這是一間真正讓我有認同感的公司,而且有非常喜歡的同事,我仍然相信一開始創立公司的那個 Sean,所以持續盡力去溝通。我認為這樣一個團隊,如果能夠不要有那些無謂的政治干預,絕對是有機會成功的。

可能是由於這樣的努力,在後期瀕臨破裂的時刻,Sean 做出一個大膽決定,指派我作為台灣工程團隊的負責人,給了三個月時間來做出一些成果。當時實在很高興,因為以那時的團隊實力,跟互相合作順利愉快的程度,三個月是綽綽有餘了。然而真正開始執行以後,由一些小地方,慢慢發現事情不是想像的那麼簡單。明明工程上一個暫時的決定,卻被解釋成長期的離譜判斷。在技術上決定性的差異,被解釋為不重要的細節等等。但這些都是經由旁敲側擊發現,實際上不確定未參與的會議發生什麼事,以及 Sean 究竟如何理解。此時心中竟然警鐘未響,僅僅想著三個月之後拿出成果就是了。我犯下關於人的,不可彌補的巨大錯誤。

於是,三個月變為不到一個月,在 CTO 強力鼓動下,Sean 打破承諾,解散團隊,開除大部分成員。我雖仍保有工作,但心下雪亮,對我動手,不過是時間問題。失去大部分同伴,OM 對我而言,也已經永遠失去了。等到離開那天終於到來,CTO 甚至懶得跟我解釋,我也沒問,彼此心照不宣。想起前陣子,一位之前公司的高層問我願不願回鍋,席間談及若回去,希望能穩定不要跳槽。我回答,從 Openmoko 以後,每一個工作,都是打定主意想長久做下去。離開,從來都不是我願意的選擇。

之後耳聞了一些 CTO 在 OM 的後續發展,原來他一直計畫在上海成立自己的公司,並且挪用 OM 資源去培養。Sean 後來告訴我僱用那位 CTO,是他在 OM 犯下最大的錯誤。相對地,即便已經察覺問題本質,而且有直接跟 Sean 溝通的管道,仍沒有足夠警覺性與手段去處理,則是我犯的最大錯誤,也對不起相信我並託付我溝通責任的台灣團隊。OM 的這群同事們,在戰火下培養出革命情感,雖已離開 OM,仍希望能一起工作。大家商討,都覺得當時剛開放出來不久的 Android,會是之後的趨勢,便決定集中研究。而之前離開 OM 的 Jserv 也回來加入,還多了 TrendMicro 時認識的 Thinker 為生力軍,大家仍推我帶頭,打算共創一番事業。這也就是之後圈內人所知的 0xlab。

在帶領 0xlab 這樣一個技術頂尖的團隊期間,我做了許多決策。其中有些後來證明是正確的,有些則是愚不可及;而有些,則是致命的錯誤。例如在成立之初,便決定以上游為目標,努力尋找進入 upstream 的機會,同時經營自有專案,直接以英文社群為主要舞台,配合贊助公司(也就是雇主)海華科技的業界關係齊頭並進,最終成功建立起直接對應到 TI, Broadcom, Qualcomm, Marvell 等大廠,甚至 Google Android 的工程管道。我們的主要專案 0xdroid 獲得廣泛應用與關注、Olv 成功進入 mesa 上游開發、Walkingice 以及 Bizkit 做的 0xbench 被大廠相繼採用、Erin 負責的 bluetooth 相關應用得到 Atheros 注意、Tick 成了 Broadcom 藍芽與 p2p 專家、Matt 與 Kanru 做了快速開機、Jserv 等人的 patch 進了 Android upstream,0xlab 並在 2.2 ~ 2.3.x 版間排名 Android 第十大貢獻者等等。期間並有幸接觸許多尊敬的前輩,包括台大資工教授也是 Android 核心開發者的廖世偉教授,以及中正的羅習五教授,還有國外的 David Rusling、Paul McKenney 等人。

對於資源有限下如何開發以 Android 為基礎的移動裝置,我們決定以社群為基礎,自行設計 UI 差異化,完全開放原始碼,發行一台初期以社群為主的裝置。這樣的作法與小米手機類似,但當然執行面條件完全不同,雖有正確看法,但對這需要怎樣規模的資源,以及如何執行是完全無知。再比如針對 Android 與各 IC 大廠整合問題,也希望以開放方式整合,使各廠所需投入資源減低,並有一共通基礎;這正是日後 Linaro 基於 ARM 在 Android 所想要達成的目標,也促成了彼此後來的合作。當時在 WMC 2011 展出的視訊 WiFi 無縫切換到大螢幕技術,現在也已經普及。

就我個人角色而言,面對如此出色的團隊,以及過去工作經驗,對領導的想像是,應該要提供一適合工程師工作的環境,並處理所有工程以外的問題,包括商業面所有事務,讓團隊能夠專心開發,不受打擾。為了達成此目標,我認為應該退出研發,將此責任交給技術名人 Jserv,把自己定位在柴米油鹽的商業面上。另外經由開放源碼的方式,讓團隊成員建立自己的 credit,累積成 0xlab 的 credit,自己只需隱身幕後,0xlab 的成功,便是我的成功。事實證明,方向雖有道理,但這決定是超乎想像的愚蠢,也對我自身造成深遠傷害,至今仍受影響。

不論能力是否最好,要領導,就要親力親為。就 0xlab 的例子,自己不做,會漸漸喪失對研發的直覺,也會與真實情況脫節,更別提在只看技術的開發者眼裡,會從一個還可以的工程師,變成一個忘記怎麼寫程式的笨蛋。另一個關鍵則是,當工程師建立起自己的 credit,就會有相應的工作機會出現。面對來自歐美公司的高薪挖角、優渥條件,或是大公司的工作機會,0xlab 其實是沒有競爭力的,這導致幾位夥伴相繼出走。日後才理解到,這完全是我自身的問題,搞錯了友誼與工作之間的關係。要防止這種事情的發生,並不是靠交情而已,還要加上商業與法律上的種種方式,將眾人利益確實捆綁在一起,確保目標一致才行。如果光講交情,朋友找到好的工作,還應該要恭喜他呢。然而對於新創事業,接二連三失去珍貴人才,是不能允許的。

至於 0xlab 是如何失敗的,我了解的範圍應該很接近全盤事實,有人比我知道更多,但也無須深究。這件事應該永遠都不會公開,因為在有人感興趣時,這件事不該說,說了對誰都沒好處。等到沒人感興趣,就更不用說了。總之,當時情形一片大好,無論在資金、已有生意、未來發展等方面,都看似毫無問題。然而因為沒有站在各人立場去通盤考慮利害關係,對人性缺乏理解,誤信人言,最終遭到背叛,是我再度在關於人的判斷上,犯下大錯。一夕之間,大好轉為大壞,那陣子不論經濟上、精神上,都經歷巨大創傷,更別提還有認識的人落井下石

在事件發生之後,整整一年都無所事事,一方面官司陰影籠罩,另一方面也尚未從打擊中恢復過來。往好處看,這段期間讓我重新排列生命中人事物的重要性,懂得該珍惜什麼;也經由這次打擊,真正把自己從以往著迷 RPG 與武俠故事,滿腦子都是義氣熱血與友情的傻瓜中稍微拯救出來,對世界的真相多一些了解。

或許是學不到乖吧,時間走到近兩年,仍是在新創公司打滾,對台灣環境、產業、商業操作,更重要的是社會真正運行的方式,有更多的體會。雖然仍然不時有愚蠢的失誤,畢竟還是活了下來,也做出了點成果,比起以往是好多了。一切還言之過早,就繼續努力,且看機運是否配合吧。

就在這幾天,陪伴17年的寵物貓咪走了,非常傷心,也再度理解到,不論職涯如何,對我而言,最重要的是身旁珍惜的一切。有人說做自己喜歡的事情最重要,我說,喜歡一開始只要有一些就可以了,能夠讓自己有能力照顧珍惜的東西,才是最重要的。做到這點,就會自然而然更喜歡在做的事情了。成功也好,失敗也罷,都不該忘記這才是最終目標、動力來源、以及真正快樂的方法。

2014年1月1日

新年新希望

許多人唸書時大概都讀過這段禱詞:
「請賜給我平靜,能接納我無法改變的事;請賜給我勇氣,能改變我可以改變的事;請賜給我智慧,讓我分辨這兩者的不同。」
當時這對我來說很不好懂。能改變的、不能改變的,不是很清楚嗎?我確定無法改變父母,但確定可以改變下次段考成績。事情總是黑白分明。

然而,許多年以後,近來卻越來越常想到這段話。既佩服其中可琢磨出的無窮意味,也嘆息這境界之困難。我不缺乏勇氣,但總沒有智慧,也無法平靜接受那不能改變的。因為那些不能改變的,是那麼疼痛。

我太老,也太累了。就這樣吧。

2013年11月12日

Valentino Rossi

Valentino Rossi 是機車賽事九屆世界冠軍,有 GOAT -- Greatest of all Time (史上最偉大)的暱稱。當年從 125CC 級別一路過關斬將,到 2000 年加入 500CC 比賽時,他開出的條件是指定 GP 賽事的傳奇技師 Jeremy Burgess,否則免談。Jeremy 手上包括 Rossi,出過三位偉大的世界冠軍。他幫助 Rossi 拿下了九座冠軍中的七座。其後,2010 年 Rossi 由於受傷等因素無法衛冕,並在 2011~12 轉而效命他的母國義大利 Ducati 廠隊。

可惜的是,很明顯 Ducati 未能符合他需求,2009 年在 Yamaha 時 Rossi 仍是冠軍,10 年第三,而加入 Ducati 後 11 年排名第七,12 年第六,13 年轉回 Yamaha 又立刻重回世界第四。在 Ducati 時代最低潮時,Rossi 與 Jeremy 仍然是最好搭檔,不離不棄。然而,既然已經重回 Yamaha,Rossi 無法滿足於第四名的成績,在今年賽季結束名次底定後,他在無預警情況下告知 Jeremy,他被開除了。明年他將與新的技師長配合,並將在年初的幾場比賽,決定以他 35 歲的「高齡」,是否到了該離開 MotoGP 的時候。

在 13 年的歲月中,Rossi 與 Jeremy 的情誼是毋庸置疑的。但在今年賽季裡,八次分站冠軍,總成績第二名的隊友 Jorge Lorenzo 與他是騎同樣的 Yamaha YZR-M1 廠車,出來的速度卻截然不同。分站賽事中,經常看到 Lorenzo 與 Honda 車隊的 Marc Márquez 與 Dani Pedrosa 三人在前獨走,Rossi 被拋在後頭,而以第四名結束比賽的景象。

對一位九屆冠軍而言,當他跑輸,不會去思考自己是不是沒有人家好,而只會想自己是不是沒有以前好。為了找出答案,他必須排除各種變數:既然車子已經是絕對有奪冠實力的 Yamaha,可能性就縮小到,要不就是自己已經不如以往,要不就是 Jeremy 的技師技術,已經無法跟上 GP 的發展。如果換了技師,明年還是無法順利表現,答案就已經昭然若揭:該是思考急流勇退的時候了。

反之,如果他選擇留下 Jeremy,明年前面三名車手仍是年輕力壯,但他就 35 歲了,沒理由比傾盡全力的今年表現更好。之後的一輩子,他都會想知道,究竟是自己不行了,還是車子調校不當。

於是,Rossi 做了自己的選擇。也許 Jeremy 會理解,也許不會。這就是夥伴、友情,與人生。

2013年11月4日

Hack Everything

是一句陳腔濫調。但話雖相同,對我來說有自己的解釋。

一直以來對於討厭的事情總是避開,但這常常造成阻礙。避免去碰是沒有信心:對於其中種種細微處是否能吻合自身價值觀、對於能否掌握界線沒有把握。但不去做就無法取得資源,而當嘗試困難、且無法以一人之力辦到的事情時,一切有用的資源都該想法子取得。

1. Understand the rules.

2. Play by the rules.

3. Exploit the rules.

Hack everything.

2013年9月23日

僱用比自己做得好的人

當公司成長,各類事務會越來越多。此時創業團隊必須想盡辦法改進效率,善用各種 GTD 工具,並且想辦法自動化所有例行性工作。因為一般來講創業團隊對公司了解深,由他們來執行,在初期是適合的,所以必須盡可能做最多的事。

然而再怎麼改進效率總有盡頭,勢必需要僱用員工來分攤工作。此時只要冷靜下來仔細思考,就可以明白一個淺顯的道理:創業者永遠必須想盡辦法僱用做某件事比自己好的人,來代替自己做那件事。退而求其次,也要一樣好。不然,公司的表現會隨著時間,持續比創立時低落。

如果找不到,那麼那件工作,就仍然該自己處理。找到了,也不能一副長官態度放手不管,仍然必須保持密切溝通,確實了解細節。因為那是唯一可以確定「他是不是真的做得比較好」的方式。

不能達到這目標的員工,就是不適任的員工。而若把人放在不適合的位置上,管理者要負責任。