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,覺得很開心、賺到了。這不愧是台灣做的,品質非常好