2013年2月27日 星期三

寫程式是一種超能力



昨天在Facebook上很多人分享這個「大部分學校都沒教的」影片,是由一個網站code.org拍的,找來柯林頓、比爾蓋茲、Mark Zuckburg等等一堆名人強調編寫程式的重要性。上這個網站登錄了一下,它是推廣寫程式教育的non-profit網站。我覺得這件事蠻有意義的,現在很多人還不懂寫程式在這個時代的的真正意義,寫程式這項技術其實比一般人想像中重要得多

電腦結合連結全球的網路,電腦不斷增強的計算能力和不斷下跌的價格,加上網路連結速度愈來愈快,一個人寫的程式可以瞬間成為全世界人使用的工具。網路上的內容,經過近二十年的累積,加上過去的文件也幾乎全部數位化,讓全世界的知識都存在網路上,經過適當的處理、建立索引,讓網路成為一個全知的智者,所有人類知識能回答的問題,幾乎全能在此找出答案。這樣的環境使得寫程式成為現代非常重要的能力

寫程式就是控制電腦照你的心意去做事的能力。我想會寫程式和不會寫程式的差別,就如同石器時代會用石器的人和不會用石器的人的差別。還有文字和紙發明後,會讀寫文字和不會讀寫文字的人的差別。學會控制電腦的能力,在這個時代的優勢非比尋常

影片中讓我印象深刻的是有一個人說coding是最接近超能力的一種能力。我想寫軟體之所以很像超能力,是在於它的可擴展性,石器時代的人就算再會用石器,他能做到的可能只是提升到三、五倍的生產力,但是現今軟體可以跑在網路上千百萬台計算設備上,你寫一個應用在AWS上、在Google App Engine上、在IOS上、在Android上,就能跑在千百萬台資料中心的伺服器,或是跑在幾百萬人的手機上面,這種近乎無限的擴展性,讓個人能發揮出超級英雄般的影響力。一個人寫了一個APP,在APP store上如果百萬人去下載,使用它,就能改善百萬人的生活,生產力可以到千倍萬倍,這就是超能力

軟體還有一個特性就是它是能夠一個人從頭到尾(end to end)全部做完的,因為現在有AWS、Heroku、Google App Engine這些平台,你只要有idea,有執行力,就能獨力完成一個有用的東西。如果是硬體,你得做晶片設計、得有半導體廠、有人幫你做機械設計、還有富士康大軍幫你製造。做軟體,只要一個人就可以做出來

以前在台灣高中以前不教程式(我已經很多年不在台灣生活了,不知道現在情況如何),一直到大學才有計算機概論這種課,但是也不很強調寫程式,只寫幾個很簡單的作業,頂多幾十行的code。當時感覺台灣的教授並不熱衷這些東西,台灣的教授大多一輩子待在學校,就發表論文、做研究而言,程式的技能並不重要,所以理所當然他們並不重視。出國之後,就我個人的觀察,我覺得台灣學生普遍程式能力低落,尤其是跟大陸學生和東歐學生比,差距非常大。我想另外的原因是台灣的強項是電子製造業,好的人才大部分去做晶片設計、半導體製造,較少人做軟體

如果你想自我充實程式能力,我有幾個建議

1. 線上課程
網路上很多教程式、計算機的課程,都教得非常棒。較理論學術的,像是courseramit opencourse,比較實際應用的像是w3schoolscodecademy。如果你知道還有什麼很好的課程,也跟我講一下,我也想知道

2. 線上競賽
這類網站上有很多題目,你寫程式去滿足題目的輸入輸出,上傳程式後網站會跟你說有沒有做出來,我覺得這是很棒的練習,玩起來像電動般好玩。最有名的是topcoder,很多大公司HR專門鎖定topcoder裡的高手,我組裡的一個捷克小弟就是這樣錄取的,直接從捷克錄取來

3. open source專案
參加open source的開發,這一點比較難做到。但是你至少可以把open source project下載,自己build、跑跑unit test看看,unit test是學習程式的好方法,你先學會跑test之後,就可以改東改西,跑跑test看看有什麼不同。再下一步是去找到專案的bug tracking page,這些是使用者回報的bug,open source上的人會想辦法解決這些bug,通常他們會很歡迎有人來幫忙,你可以找個簡單的trivial的bug看能不能解決它。參加開源專案是你學習大型程式的機會。你在線上競賽、或是上課裡學到的東西都是像玩具一樣的小程式,真正的大型專案是非常不一樣的。想找open source project,可以去Apache Software Foundation找找,裡面有很多有名的project像是httpd和Hadoop

4. 學習script、editor、version control等等周邊工具
對bash、awk、grep、sed等等工具要有些基本的了解,才能快速處理檔案。至少要精通一個好的editor,例如vim或是emacs,這類editor用到出神入化時就如同用意志直接控制游標,看code、改code、找code十分快速。最後要會用版本控制,像是git、svn這類東西,這是軟體開發不可缺的工具


2013年2月10日 星期日

練打字的好地方

打字對我來說是個重要的技能,是人和電腦通訊的物理層,打字速度就是人腦對電腦的上傳頻寬

我每天的工作很大一部分是對電腦輸入我腦中的東西,當然這打字速度並不是工作速度的瓶頸,不然我就會坐在那邊整天不停的打字。但是夠快的打字速度能讓我和電腦快速地來回溝通,腦中的想法也能更流暢地實現出來。我看同事之間,生產力高的人多半打字很快,也有少數例外,例如我之前的組有個同事只用一根手指打字,但他很強

我打字並不算非常快,但是應該有中上水準,中英打大致都在每分鐘80字左右,我最近想要再提升一些,所以找了幾個網站練習,這些網站有的非常好玩,會上癮,就來推薦一下


Type Racer
這個應該是最有名,也最好玩的,跟其他人拚速度,每個人會化身成一台車,看誰先衝到終點,很多高手,競爭之下很快會進步,裡面打的文章也很有意思,都是一些書、電影、歌詞裡面的佳句,打的時候可以順便讀一讀有趣的好文

網站也有支援中打的練習,但是文章就是英打的文章用電腦翻譯的,變成很古怪的文字,而且對無蝦米的支援不是很好,在打字中間的時候會一直顯示錯字,有點傷眼

最有趣的是這個coding的打字競賽,程式師平常打的字跟平常的文章很不一樣,很多(#&*這些符號,這邊讓你可以練習到這類的字。我覺得練這個應該對寫程式的打字很有幫助,打字練習的內容是一些open source project,像是Linux kernal、Apache Tomcat。不過它的缺點就是排版很怪,沒有換行,而且裡面的內容不多,很快就會一直打重複的東西,有點無聊


Typing.io
讓你照著打open source project,排版比Type Racer的好,內容也豐富很多,而且一次打一大段,可以大概看到code在做什麼,也可以順便讀一下人家open source的程式是怎麼寫的。缺點是沒有別人可以對戰,只能自己一個人孤單的打字,沒有競爭的快感。不過我還是很推薦這個


Typing Maniac
Facebook上的打字遊戲,除了打字還有一些「放絕招」的遊戲元素,很容易上癮的遊戲。不過他的字都是從上面一直掉下來,很傷眼,不適合老人,我玩個一天就沒再玩了


如果你還不能盲打(打字不用看鍵盤),我建議你一定一定要先學會這個技能,因為你可能接下來幾十年都可能還得用這個方式和電腦溝通,這是非常值得投資的一項技能,我實在不能忍受有人整天打字卻還一天到晚要低頭找鍵,隨手上網查了這個站可以教你touch typing的
花個幾小時學一下,可以一生受用

最近一位強者同事送了我一個二手的Happy Hacking Keyboard,軟體工人贈鍵盤就有如劍客贈劍,得到他的鍵盤我覺得很榮幸,希望能像他一樣強。不過我用一用很不習慣,主要是「`」鍵移到右手邊,讓我在mac上沒辦法切換視窗,而且我是用vim不像他用emacs,我對ctrl鍵不是很依賴。所以我自己去買了另一個正常一點的機械鍵盤放在公司,打字卡啦卡啦的蠻爽的,不過希望不要被同事杜爛。在家裡就不敢用了,怕吵到小孩睡覺。拿到這鍵盤後看到上面寫Made in Taiwan,覺得很開心、賺到了。這不愧是台灣做的,品質非常好



2013年1月21日 星期一

evernote好用

最近很愛用evernote,只要腦子裡有什麼有趣、有用的想法、或是計畫要做的事情,就會打開evernote來記,現在一天平均大約會記十則的小筆記,用了evernote對我的生活有很大的改善

evernote是一個筆記軟體,會把你寫的筆記存在遠端,它存在有各種介面,有windows、有mac、有web、有ios、有android,基本上就是一個記事本,但你寫的東西會存在遠端,你換電腦後或是用手機的時候,這些筆記會同步到別的地方去

之前我覺得用gmail寄信給自己就可以了,何必再多一個地方放東西,很早以前曾經寫過一篇關於用gmail寫日記的文章,我用gmail寫日記已經行之有年了,累積了很多珍貴的想法和回憶 ,現在我用gmail搜尋日記可以快速找到過去幾年發生過的事情

不過evernote把這些提升到另一個境界,因為它介面好而且快。gmail是個email系統,不是為了給自己寫筆記而生,但evernote的介面就是為了做這件事而做的,不但可以快速的記事,搜尋和瀏覽也做得更好,還有各種方便的shortcuts,還有很多功能像是合併筆記,這些都是gmail裡辦不到的

evernote和gmail有一個根本的不同:就是evernote可以修改過去的筆記,用gmail就不行,一寄出去就不能改。所以這兩者的使用方式非常不同。用gmail我只是寫一篇文章,然後寄給自己,之後就處於一種唯讀的狀態。用evernote的時候,我常開了一個標題,過幾天有了新的資訊就一直修改、加入新的內容,讓我可以在同一個主題上長時間一直演進

寫筆記對我來說是一個思考的過程,想法打出文字後再讀入腦子裡反饋,這個迴路會讓想法一直修正改進,人腦無法同時記下很多事,但配合鍵盤和電腦成為思考工具就能,我想這就像人使用計算紙比心算能計算更複雜的東西是一樣的道理。所以能快速寫下想法是件很重要的事情。用evernote讓這些想法可以長時間一直跟著我到我的工作的電腦、家裡的電腦、手機、平板電腦,讓我能隨手可得

(題外話:這幾年用電腦寫日記的想法是,用電腦寫比手寫強多了,因為打字速度真的比寫字快太多了,速度快了,腦->手->眼->腦的這個迴路就更快,使得用文字思考的效率提升。)

另一個用evernote的好處是排除壓力,把一件不得不做的棘手事情寫到evernote裡面後,就可以先把事情先忘了,不用在腦裡一直想同一件事折磨自己。會有種安心的感覺:覺得未來的我會回去看這些note,然後把事情完成。現在的我可以專注於現在,就把它安心的交給未來的我

因為我的日記一直放在gmail裡面,我還是想保有它的連貫性。但我也想把它們放到evernote,所以我在gmail裡設了一個filter,讓自己寄給自己的東西就會被轉存evernote裡。基本上evernote有一個對應的信箱,只要寄到這信箱就會存到evernote,只要在gmail裡設定filter去寄給這個信箱就行了。

具體步驟如下
一、到evernote.com登入 -> 設定 -> 帳戶摘要 -> 記事電郵收件人(這就是evernote的email地址)
二、到gmail登入 -> 設定 -> filters -> 新增filter -> 把自己寄給自己的信forward到evernote

\


2013年1月19日 星期六

我的健身設備

現在我幾乎都在家裡訓練,因為比較方便又省時間。加上現在天氣變很冷,所以最近都不在外面跑步,我超怕冷。今天我要來介紹我家裡的健身設備

前院

現在比較少在前院訓練,因為很冷,但天氣好的時候在前院訓練真的是很不錯,因為空氣比較好。單槓是我自己鎖上去的,因為我的電鑽很爛,鑽的時候手痠死了,不過裝完後非常穩,在上面搖來搖去也不會有任何鬆動的感覺。單槓很高,要跳上去才抓得到

我在這常做的一個訓練:
「蹲伏起立引體向上」* 100
就是一個蹲伏起立後跳上去拉單槓,做一百個


車庫

我超愛車庫,之前的人生中一直住在公寓裡面,以前沒有住過有車庫的房子。直到去年買房子後,才知道車庫的好,可以放東西,可以運動,可以在裡面修理東西、搞東搞西的 (還可以創業)。我最近都是在車庫訓練

車庫有個裝在天花板的單槓,也很穩,不過沒有前院的那麼高,這個伸手就能摸到


可調式啞鈴是我買過最貴的器材,記得好像花了接近四百塊,底座一百五十塊還要另外買,長椅可以拿來做臥推,以前還沒買跳台的時候也拿它來當跳台用


Parallettes查中文翻譯查不到,我是拿它來做倒立伏地挺身,這樣可以加大活動範圍。槓鈴我拿來做挺舉,就是把槓鈴從地上拿到頭頂,雖然不重但活動範圍很大,做一百個也是會累死人的。這東西很便宜,Amazon加上運費才50塊


這個現在很少用了,因為單槓加上吊環也可以做dip

我買了這麼多東西,如果有人問什麼東西最值得買,我覺得是單槓,其他東西都可以不用。練胸肩、三頭肌就做伏地挺身,嫌不操的夠就做單手伏地挺身,跳躍伏地挺身,倒立伏地挺身。練下盤就做蹲站、蹲跳、單腿蹲站、單腿蹲跳。只有背部,沒有設備很難練到背,我想不出什麼方法可以徒手練到背。拉單槓對強化背部很有效

再來第二個值得買的就是跳繩,因為很便宜又不佔位,練雙迴旋跳繩非常有效


2013年1月12日 星期六

畢業後的第一篇paper

最近我們跟USC的研究人員合發了一篇Paper
http://smahesh.com/HadoopUSC/
講的是一種用在分散儲存系統的糾錯碼

我來用白話介紹一下,不過會有點長,要有耐心跟好奇心的小朋友才可以看下去哦。(之前在另一篇<上班以來做過的事>有簡單介紹過一點點)

分散儲存系統就像是現在很流行的詞「雲端」,可以把大量的內容存到這系統裡,這系統裡面的構成是上千上萬台電腦,最終會把你在客戶端的內容存到系統中某台電腦的某個硬碟上,這樣的系統存在相當多複雜的問題,像是怎麼分配那個檔案存在那台機器,怎麼讓很多人會同時讀寫

其中一個困難的問題就是:在機器故障的時候,怎麼讓系統還能正常工作

為什麼機器故障這麼重要,如果你家裡一台電腦一年才壞一次,照這速率,Data center裡的幾千台電腦,每天都會壞掉幾十台


上圖取自paper,顯示在Facebook一個3000台機器的機群裡,每天故障機器的數目。如果說我們對故障不做任何處理,讀寫就會失敗,還有可能會永久失去資料

一般的做法把資料分成小塊,每個小塊都存三個副本,這樣子如果有一個副本壞了,可以去讀其他兩個副本,而且在這時候要快點再多複製一個副本,以保持副本數為三,這方法可以抵抗兩台機器同時故障,但三台就不能保證,這方法的缺點就是三個副本會讓成本變三倍

我們在Facebook做了一個Project叫做HDFS-RAID。不同於三個副本的方法,我們用的是一份原來的副本,再加上一些糾錯碼(Error Correcting Code)。糾錯碼在通訊領域是已經非常成熟的技術,在DVD、WIFI、3G,有通訊的地方就有這技術。你想想看DVD為什麼常常刮得亂七八糟還是能看,就是歸功於這個技術

這個方法的好處有兩個,第一就是空間變小很多,因為加上的糾錯碼只有副本的0.4倍大,原本變大三倍的資料變得只有1.4倍,第二就是容錯能力變強,原本可以抵抗兩個錯誤,現在可以抵抗四個錯誤,也就是能在四台機器同時故障的情況下讀取

因為我的背景是無線通訊,做這件工作讓我學以致用,非常開心。在一次Hackathon裡我就寫好了ReedSolomon(某種糾錯碼)的encoder/decoder,之後又用了以前學過的矩陣計算的方法讓它加快許多,現在這些Code都已經上線跑了很久,節省了很多儲存成本,為公司省下了可觀的金錢

但是這方法有一個缺點,就是修復的時候,要讀取十個不同的副本才有辦法修復一個副本,也就是說修復的成本增加了十倍,在我們的系統中讀取是硬碟的讀取,是一個重要的資源,而且修復時間短是很重要的,因為沒修複之前如果有更多機器故障,就有可能失去資料。在一般通訊中的用的糾錯碼(像DVD、3G用的),通常讀取是沒有成本的(這些資訊通常已存在電路的暫存之中),所以這種問題和通訊的問題是很不同的

跟我們合作的USC教授學生們想出了一個新的糾錯碼可以降低讀取的成本,並且跟我們一起測試這些糾錯碼的好壞,我本來覺得這些學information theory的人應該是眼高手低,但是他們很快看懂code而且自己改了很多東西,讓我很驚訝,而且這個教授對實務的問題很有興趣,他一直說他想解決真正的問題,他的理論也很強,讓我很佩服,我覺得做研究就應該做到像這樣才有意義

不過這個Project已經是一年多前的了,學術界的速度龜慢,一年前做的東西到現在才發表,我早已經換到不同的組,做完全不同的事了

Paper和source code可在此下載


2013年1月4日 星期五

Pomodoro專心法


最近習得了一個增加工作效率的方法,覺得有效,來分享一下

最近我覺得上班變得很沒效率,很難專心,常常到處看看,讀信或看Facebook,或看股票、看特價網站或用訊息聊天,尤其遇到比較棘手的工作,就會這邊摸摸那邊拖拖

幾年前曾經讀過一本講克服拖延的書叫做<Now Habit>,還在這裡寫了心得,我重讀了這本書,希望能提升一下效率,書裡面有個重要的觀念就是以「專注的半小時」為工作單位,重讀完之後我就想找個計時的app來用,在找app的時候找到了一個關鍵字叫,「Pomodoro Technique」

Pomodoro Technique是一種時間管理的方法,跟<<Now Habit>>類似,非常簡單,基本上就是先跟自己宣告,說我接下來的半小時就是要做某件工作,例如:找某個Bug,寫某個Feature,寫篇Blog,做投影片,再來就按下半小時的計時器,在這段時間內,除了這件事之外,不能做別的事,例如不能上網看個股票,回個Facebook message之類的,如果想到有什麼重要的事,就寫在一張紙上,然後馬上回到這件事情上面,如果真的不得已被打斷的話,就要重新計時,直到計時完成半小時,就是「完成了一個Pomodoro」

我覺得這方法的好處就是能真正的專心,因為中間如果分心了這半小時就不能算,所以到最後只有專心的時間會記錄下來,如果一天完成了四次,就是完完整整的二小時的專注時間,二小時完全專注可以做很可觀的事,比東摸西摸八小時來得強多了

通常我完成幾個Pomodoro後,會給馬上自己一些獎勵,看看特價網站之類的,給自己心理上建立一個正回饋

除了專注半小時之外,這個方法還強調一個短時間的休息,專注半小時之後休息五分鐘再開始下一次,然後連續做完幾回

用這個方式工作之後,工作的單位就可以用Pomodoro的數量來計,例如可以規定自己一天要完成幾個Pomodoro,也可以記錄自己一週每天各完成幾個Pomodoro,這樣可以追蹤自己的工作效率

這裡有幾個Pomodoro apps可以試,有的可以幫你記錄一天完成幾次,不過我最後用的是這一個

名字的來由,Pomodoro是義大利文的蕃苆,因為料理計時器常設計成蕃苆的樣子,所以以Pomodoro來當作Timer的意思,叫「Timer Technique」聽起來太遜,所以找個延伸義的外來語Pomodoro,一時之間聽不懂就能嚇嚇人,感覺就比較強大




PS. 本篇文章,就是我用一個Pomodoro寫出來的

Update: Web版的Pomodoro TImer: http://tomatoi.st

2012年12月2日 星期日

快打旋風


最近又重新迷上了快打旋風

我國中時開始真正迷上這個電動,那個時候是快打旋風二代,記得國三時的暑期輔導,每天都會先到教室集合點個名,點完名後就把自己的桌椅拿去藏好,再從學校垃圾場裡的一個投垃圾的小洞爬出學校,前往電動間開戰

有一次爬到一半學校警衛狂衝過來,我正要開始爬,當下真的很緊張,想說我如果開始爬會不會被他衝上來抓到,後來我假裝自己是路人,就說我下課閒晃到這附近看見幾個人在爬牆,結果還被抓到訓導處審問了老半天,組長先是威脅一陣,後來又叫我邊半蹲邊想那些人是誰

不過我打死不認,一直說那幾個爬牆的我就是不認識,再蹲也想不出來,結果後來組長也沒辦法只好放了我,現在想想這事蠻好笑的

那時真的很迷電動,還有一次玩完回家,到晚上寫功課時才發現拿錯書包,很慌張地坐車回去找書包,小時候課本不見之類的小事都覺得很緊張,長大後覺得根本沒有什麼,小時候老師們都會很嚇唬小孩,都說被記過以後會找不到工作之類的

那個時候很窮,一道五元覺得超貴的,所以只跟電腦打,然後死了也絕不接關,都要把接關讀秒按掉再從第一關開始玩,這樣一個五元可以玩比較久

一直到高一還是常常在打快打旋風,不過好像到高二還是高三的時候就不流行了,到高三的時候我去電動間都是玩侍魂,後來阿扁就開始抓電玩了,我還有次打電動遇到警察臨檢,人生第一次坐上警車,被帶去警察局讓我爸領回,後來電動間就全部都關光光了,想想阿扁做這事真是有夠智障

我上班的地方有個區域放了很多電動,其中一台最熱門的就是這台快打旋風四代



我在公司有三個台灣好友,四個人有點像South Park裡那四個死小孩,每天在公司混在一起,互相幹譙跟聊八卦

三人裡面除了一位沒有童年的數學銀牌同事,其他兩位加上我都有深厚的快打基礎,一開始是跟這幾個台灣同事隨便打個幾場,後來漸漸開始跟他們以外的其他同事打,發現公司裡竟然有許多強者,我本來自以為自己快打旋風很強,沒想到自己竟是井底蛙,隨便就被其他同事幹爆了

後來發現了公司裡竟有一個聯盟,有個人寫了個網頁排賽程、計算戰績,就像網球一樣還有積分排名,真是太認真了!,而且這幫人下班後還會一群人帶著人手一支的搖桿,到會議室裡面研究招式

我跟另外幾個台客後來就加入這聯盟一起比賽,每天都要跟另一名選手打三局,然後每週有季後賽,贏的人就是該週冠軍,小弟我非常弱,但是上週有好好練習,有打進季後賽,但是遇到強者還是馬上被打爆了

快打裡面我最喜歡的角色是怪獸跟印度人,從國中起我就用這兩個人玩,以前大家都是用龍、肯或是阿力固,我就是偏偏喜歡用大家不用的冷門醜怪人,現在四代多了很多新人,也有很多新的玩法,我的招式都是從二代出來的,所以一開始都輸很慘,後來有漸漸學會四代的一些招,不過像focus還是cancel什麼的,腦子裡雖然知道有這些,但真正打的時候就想不到要用,只會用一些老派的二代打法

快打旋風真的是一個很棒的遊戲,從國中到現在,算算已經二十年了,春麗的生日是設定在1968年,都已經從當年的少女變成44歲的歐巴桑了,真是令人感慨,不過快打還是像當年我國中時玩的一樣,還是好好玩


簡單的東西有效,但很難商業化

昨天去參加活動,有人跟我說以前一直看我文章,但後來就停更了,其實沒有停更,我只是都換去 FB 分享了,因為 FB 才是流量所在,加上 FB 算法對外部連結的排序不太友善,所以我都沒在這邊寫了,想繼續 follow 我的人可以去下面兩個地方找我: fb.com/p...