Tuesday, April 9, 2013

寫程式是一種超能力



昨天在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,比較實際應用的像是w3schoolscodecademycode school。如果你知道還有什麼很好的課程,也跟我講一下,我也想知道

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這類東西, 這是軟體開發不可缺的工具

Reference:
http://pinky-monkey.blogspot.ca/2013/02/blog-post_27.html

No comments: