小松鼠嚇了一跳,有了魔法眼鏡後,這世界看起來完全不一樣了

2014年8月3日 星期日

First you learn to code, then you code to learn

從 http://news.google.com/newspapers?nid=1913&dat=19790210&id=TokgAAAAIBAJ&sjid=4mUFAAAAIBAJ&pg=2068,1552271
改過來的話。

學習程式設計或其他很多東西,其實就像是讓你多長出一雙眼睛、手、腳一樣,帶你到不同的地方、看到原先看不到的東西,並起讓你能有觸碰、賞玩東西的能力。

我想很多人應該都有這種經驗,想起過去尚未學習過某種東西的自己,有種彷彿隔世的感覺,似乎已經無法想像過去那樣的自己跟現在的自己是同一個人的感覺。


大家應該也都有聽過滿出來的茶杯的故事:
飽讀詩書的學者,拜訪南隱禪師,尋求禪的道理。
南隱禪師為學者倒茶。雖然茶已從茶杯裡滿了出來,流到桌子上,禪師仍然繼續倒著……
學者嚇了一跳,急忙阻止:「禪師,已經滿出來了,不要再倒了!」
禪師並不理會,仍繼續倒,學者又說:「禪師,不要再倒了,杯子已經滿了。」禪師不理會學者,也不管茶流了滿桌、滿地,直到整壺茶都倒完為止,才停下來對學者說:「你就像這個裝滿茶的茶杯一樣,你的心裡和腦子裡,裝滿了自己的想法與理論,已經接收不了其他東西了。你來我這裡,尋求有關禪的學問,你若不肯在心裡清出空間,虛心接受我的道理,你要我如何教你呢?」
的確,要清空茶杯,才能倒茶進去。
但是,讓茶杯空出空間,除了把茶倒掉外,還可以想辦法讓茶杯變大。

長出學習之眼、手,就能讓空間變大。

2014年8月1日 星期五

就是因為沒有用,學校才要教啊!


這篇是大約一兩年前寫的草稿。因為很難說用很短的篇幅說清楚,所以一直沒有完成。
由於在 COSCUP 上面的演講提到一些內容,所以就把草稿直接放出來。

之所以沒有完成,是因為可以講的東西實在太多。比方在 COSCUP 有提到學習自己上廁所的部份,本來草稿中沒有,剛剛想到才補上。

有太多的內容沒有加進去,表達的不夠完整。所以不管你是要把他當成反諷、同意這個見解、或者當成過度功利價值觀的平衡都可。
總之,標題並不能照著字面上邏輯來讀。




我在課堂或演講時,時常會說我講的東西,一點實用價值都沒有。
其中一個原因是想強調,就是因為這些東西沒有用,才值得教、應該講。
那些挖苦、抱怨學校教的東西沒有用、產學落差太大的人,常常不是別有用心, 就是過份天真。

這篇文章的目的就是要說明一般教育的學校,特別是高等教育,本來就應該教不實用的東西(職校、職業訓練不算)。

這當然不是兄弟我獨創的見解,幾千年前,莊子就把「無用之用」講翻了。真講起來千頭萬緒,面向很多,不知如何說起,所以我下面分成幾個部份,用不同的例子、比喻來解釋。


******
很多人喜歡做瑜伽或者上健身房。你在做瑜伽(或者伸展操、重訓等等)時,做的動作和姿勢往往都相當詭異。
如果你在路上做這些動作,一定會被路人嘲笑。 所以以平常不會做這些動作。正因如此,刻意做這些動作,才能鍛鍊到這些平常用不到的肌肉。
所以俗話才會說,做出來會被嘲笑的動作,才有運動的價值。

你的大腦跟肌肉很類似。
那些日常生活練不起來的肌肉,很有可能在什麼時候會幫上你一把,就是你的價值。
這也就是為什麼學校教的東西,好像長大後都再也用不到的道理。學校應該教的是如果你沒在學校學過,那將來你就再也不會有動機和時間來學的東西。
更糟的是,如果你沒練過,會跟本不知道人類腦中有這塊肌肉。有時你會連怎麼輸的都不知道。


*********
很多人會發現有一個現象,那就是年輕人擅長電腦。
年輕一點的人,根本不用上課去學,就能毫無困難的使用 Office,操作瀏覽器或其他電腦上的軟體。
但為什麼老一輩的人會需要特別去學,而且還不容易學好?
原因之一是年輕一輩從小就有動機使用這些東西,常常用的東西,自然就會了,不用特別去學。
另外一個原因是,年輕人並不是直接去學軟體操作,而是在腦中建立了一個框架,一個系統。所以即使軟體推陳出新,改變很大,甚至還各式各樣新功能的網站、軟體、APP。只要理解了電腦軟體介面的「邏輯」和習慣,直接套用在新軟體上就能自己摸索熟練。
但建立這套腦中的框架、系統、邏輯要花很多的時間,短期的投資報酬率很低,所以只能從小開始學。
在電腦史前時代成長的老一輩,成年後就不容易再有這個耐性來慢慢建立這個腦中框架了(即使有耐性,學習力可能也不如小朋友)。

所以這告訴了我們兩件事情:
1 而那些實用的東西,往往不需太花力氣要學。至少,不需要直接去學。
2 學校教的東西是幫你建立框架、邏輯系統,應付各種可能的狀況。短期投資報酬率會很低,所以看起來很沒用。
至於要怎麼應用這個框架, 各行各業都有不同,而且會隨著時代改變,但不是什麼太大的問題,只要沒跳出框架,只是熟悉度的問題。做久了之後,誰都能熟練。

*********
講到要教實用的東西,小學的加減乘除應該夠基本、夠實用了吧?
其實不然。日常生活中真的用到加減乘除的機會比像像中少。你現在碰到一個二位數乘三位數的乘法,或者一堆數字的加法,難道不是拿出手機或用電腦來算嗎?
當然現在為了數零錢,有些人還用得到點加減法。先不說這還不需要完整的加減法。再過幾年,所有交易都卡片化了之後,只要刷卡就行了。真的有需要時,難道不能計算機按按嗎?到時真的需要花個好幾年的小學時間學這些偶而會用到的技術嗎?
你大概不會同意上面的看法,而且,隱約會覺得這些沒有用的東西還是有某種用處。(拿前面的運動做比喻,跑步相對來說沒用,因為要快的話,車子比較快,但跑步沒用嗎?)

**********
但你其實還學過比加減乘除還實用的技能。
最最最實用、常用的技能是什麼? 其實是自己吃飯、自己上廁所,但你真的覺得,不要說大學了,上小學之後,還要教這種程度的東西嗎? 還是相同程度的技能,因為你已經有了學習在家自己上廁所的經驗,根本就能無師自通了?
你甚至不會把他當成學習。
到了陌生的地方,你會自己找看起來像廁所的地方。真找不到,會問人。這種程度的學習,你根本不會放在心上,真的視為一種學習。
看到陌生的異國食物和餐具,你也會毫無困難的模仿他人的動作來吃(或者自主研發)。
很遺憾的是,很多人在中學或小學階段,過份把重點放在知識,而沒有把學習經驗等級提昇。到了高等教育就會出問題。
因為就像是上小學中學之後,老師最多只會告訴你廁所在哪裡,而不會再幫你把屎把尿了。你要是過去並不是真的學會上廁,而是填鴨式的應付。那你一進小學之後,必然是遍地屎尿了。
上大學也一樣,只不過你的遍地屎尿是比較屬於靈性層次,不容易被發現。



**********
Binary search,現在每種常用的語言都內建有這個功能的函式,自己手刻根本沒有必要吧?因為這個東西其實很難寫正確,1946年發表的演算法,到 1962 年才出現第一個正確的實作。對要求即戰力的產業來說,絕對沒有這個耐心讓你花那麼多的時間去想、去重複發明輪子。
這個就跟上面加減乘除的例子一樣。
沒有用的東西為什麼要學?
原因是「學習」和「研究」本身也是要學習以及研究的。這些看似沒用、只有歷史價值的東西,其實是讓你獲得學習以及研究經驗的好東西。這些東西特別困難、投資報酬率低,所以非常適合鍛鍊你的學習能力。觀摩前人解決困難問題以及犯錯的經驗,讓你學習怎麼摸索及解決問題。
就是因為這些東西沒用少用,當往後你碰到類似問題時,只有學過,才能很快模仿前人的解法。



所以無用之用,是為大用。不過上面這樣的說法,還太小看了這句話。

前一陣子我小孩學說話、唱歌。兩歲的小孩,常常唱歌的時候有個特性,重複的句子會省略。比方兩隻老虎就會變得很短。
而我聽當他在唱小星星的時候,則會變成鬼打墻,連唱 N 次才會唱完(請回憶一下歌詞)。
聽他在唱的時候,突然腦中跳出 Markov Chain 這個詞,他現在學習唱歌的方式,不正是 Markov Chain 嗎?
電腦在處理語言或者學習時,常常也會利用 Markov Chain 當模型。
我要說的不是腦中建立模型這回事。而是說你學過的東西,鍛鍊過的腦中肌肉,會影響你看事情的方式。
我看過一本育兒書中,以「小孩認為我們是因為怕他聽不懂才重複,所以要證明自己不需要這樣。」
這談不上誰對誰錯,我只是用這個例子說明你學過的東西,會影響你看這個世界的角度與方式。

我知道很多老闆希望學生一出社會就是即戰力,抱怨學校教的東西跟產業沒有接軌。他們說的,也不無道理,這是見仁見智的問題。
但這種價值觀已經影響我們太多了。 我們習以為常的已經把工作上用得到的才叫做有用。
但想想,如果學校也跟上潮流,只教有用的東西,那其實是很可怕的事情。
你工作已經很可憐的要賣身、賣肝、賣時間,當然也有賣腦。
但是你一定不願意把這些東西全部賣掉。你一定不希望你腦中的肌肉,全部都是為了工作而鍛鍊。
難道你連看世界的方法以及角度也要賣掉嗎?


所以學校一定要教沒有用的東西啊!


2014年4月22日 星期二

蟒極客的彩蛋: 把 Chrome 的 JavaScript console 變成 Python console.


之前在蟒極客 放了一個彩蛋, 在蟒極客首頁,把 Chrome 的 JavaScript console 變成 Python console.

因為我用的是 ubuntu 上的 chromium, 版本有點舊, 所以之前有點 bug, 一般的 chrome 不靈。

整修後,現在應該在 webkit based 的瀏覽器可用。沒有出錯的話,到蟒極客 用 Chrome 打開JavaScript console ,會變成 Python console。

比方可以試試看 import math 然後會發現 math. 後面的 auto completion 也可以用。或試試看 [x**3 for x in range(10)],語法是 Python3 語法。

(不過沒有用什麼太神奇的東西, python 是 brython)
有興趣,可以直接看 geekpy.org 的 html source 。

更新: 又修改了一個 bug,讓 ubuntu 的 chromium 也可以用了。

2014年4月11日 星期五

網路、開源與民主

這篇基本上是對「資安問題變國安事件?張善政:我們政府沒有那麼無能」有感而發的。一個官方表格都是用 MS Word 文件,很多網頁都還是 IE only 的政府這樣講,很沒有說服力啊。

有一種說法是,工業革命才讓民主制度可能。有一定程度的識字率,資訊才能廣泛傳遞。有了交通器材、電報,很多事情都能更有笑的完成。經濟繁榮了,大家也更有時間想到更進一步的需求。有了需求,就會想到參與決策的可能。
所以,現代的民主制度只是這種潮流之下的必然產物。

那網路革命呢?
代議制度只是用來解決 Scalability 的一種方式,這種制度的反應速度已經跟不上網路革命後,被稱為十倍速時代、甚至百倍速時代的節奏了。
電玩之所以吸引人,就是因為即時回饋。
民意選出來的民意代表,最後投票時聽的還是黨意。人民明明就不滿,但是一到選舉時還是含淚投票。為什麼?就是因為這個回饋機制很慢很間接,不會造成學習的效果。
反倒是婚喪喜慶什麼的,有來沒來,有送花沒送花什麼的,某某委員蒞臨,真情流露、有情有義的,反應就很直接也很快。

過去這樣是沒有辦法,投個票還要全國放假一天,勞師動眾的監票開票。但網路時代,你在網路上投票的次數還少嗎?
聚個會你都會上 doodle 問大家的時間。 排時間填意願你還會開個 google 文件或是表單來弄。
所以,很多東西,其實可以直接開放給全民公投,跳過代議制度這一層。
當然,這中間還有許多運作機制上的問題,一開始,也一定會有些很錯誤的決策,就像你選到很爛的民意代表一樣。但由於回饋迅速,而且要負責的對象比較明確,選民會開始學會事情。快則二十年,慢則五十、一百年,這種民主方式一定會變成常態。
太陽花學潮有很大一部分可以放在這個脈絡之下。割闌尾也可以算是加快回饋速度的一種嘗試。十年內就會有個人或組織,利用網路工具,打著服從民意的旗幟出來參選。

但資訊水準的普及度是一個很重要的問題。為了讓這種制度能夠公平,一定要讓資訊教育普及到弱勢的族群。雖然,弱勢族群再怎麼樣還是相對弱勢,即使是現在的代議制度也是如此。但至少要達到一個大家良心上可以接受的程度。所以,資訊教育的推廣和普及是目前一個很重要的工作。
開源軟體就很重要了。再回到工業革命以及民主的類比。當然經濟繁榮有利於民主的發展。但像是一些產油大國,經濟再好,也不容易促成民主。因為資源掌握在少數人手上。開源,就是讓所有人都能直接接觸資源的來源,避免資訊資源變成像是石油這樣的東西。
要讓每一個人,特別是弱勢族群都能掌舵資訊處理的能力,開源是不可或缺的。

弱勢學童的資訊普及教育,其實不需要二十年、五十年那麼久。真正資訊能力弱勢的,是中老年人(不是全部,而是很多)。聽到某些中老年人的言論,你可能會覺得他們好像是活在平行世界一樣。因為,不是好像,而是真的活在平行世界裡面。一個是有網路的世界,一個是沒有網路的世界。當然那些人的世界裡也是有網路,他們也會發發 email,上上 facebook,寫寫 blog。但這個網路跟網路世代眼中的網路不是一樣的東西。

2014年4月7日 星期一

近期的一些活動


蟒極客 高中/大學生 Python 程式比賽
歡迎參加。
分成高中以下,及大學組,每組前三名可以得 PyCon APAC 2014 的門票,應該還會有一些額外的獎品,比方我手上還有故宮艾雪魔幻世界畫展的門票。
同樣的錢,可以煩惱該買 One M8 還是 Sony Z2,但是也可以拿來辦一個比賽。


嘉義女中、北一女、IMO 選訓營演講宣傳(投影片在 http://b81.org/s)。

學界連署 hackpad SaveOurStudents 
http://saveourstudents.hackpad.com
這個其實有更深入的計畫,以後會慢慢補充(https://g0v.hackpad.com/3pPc7nysDqs)

花蓮.py 

四月活動,我可能講 壞狗搜尋 reboot 的相關內容。

順便一提
五月活動應該會是史上最強 花蓮.py 聚會,因為可能會有兩位 PyCon Keynote 等級的講者來給演講。
不過四月可能也不遑多讓,因為四月份的活動隔天會有 jserv 及翟本喬博士在東華應數的演講。


東華應數的有趣演講邀請

繼二月底請到撲克冠軍 Terry Fan,三月請到葉丙成教授。
四月份將會邀請魔術冠軍、視覺衝擊陳日昇,以及 jserv 及翟本喬博士來演講。



2014年4月3日 星期四

reveal.js


最近幾次演講的投影片,試著使用 reveal.js,Reveal.js 是 HTML based 的投影片工具
我最近的幾個投影片可以在 http://b81.org/s 找到。
Reveal.js 的
優點:

  1. 預設的 3D 旋轉換頁還挺有質感的。
  2. 支援 Markdown語法,可以把焦點放在內容上。如果習慣泛高橋流/類高橋流的簡報方式,寫起來還挺快的。
  3. 上下左右的二維、二階層簡報編排邏輯,比傳統的直線式簡報拓樸結構要容易整理。 不需要詳細說明的內容,可以很自然的按右鍵跳到下一個主題。
  4. 支援 code 的彩色語法,還有 MathJax 顯示數學。
  5. 因為是 HTML/CSS/Javascript based, 所以直接可以用這些來擴充、顯示所以有他們可以顯示的東西。
  6. 支援講者小抄功能。
  7. 支援 leapmotion 之類體感操控。


缺點:

  1. 放大縮小、換頁,會干擾一些 javascript module 以及  plugin 的功能。有時候也會干擾 CSS。
  2. 不像 Powerpoint 或是 Keynote 等,可以用所見即所得的方式編寫。
  3. MathJax 要支援黑底白字有一點麻煩。而且 Render 似乎不是很可靠。
  4. 預設的 syntax highlight 字有點小。
  5. 不同瀏覽器有時候會有差異,測試時要小心。
  6. 很懷疑如果亂搞 javascript , pdf export 能支援到什麼程度。

然後我發現一下子還真的想不到有什麼太大的缺點。

因為我的投影片中,常常會有數學式子,所以之前很常用 LaTeX 的 Beamer, Beamer 中也很容易做程式碼的 Syntax Highlighting, 比方我之前 COSCUP 的投影片。
但 Beamer 如果要放動畫或者其他效果就比較差了。

以下在我最近的投影片中的一些實驗:

  1. markdown 中放數學式子 http://b81.org/s/imo_algebra1.html#/1/5  (主要是不要讓 a_{x} 這樣的東西被 markdown 吃掉。)
  2. GIF 動畫 http://b81.org/s/from_star.html#/3 (按往下)
  3. 放互動式的 Python 程式碼。 (同上,繼續往下,用 Ctrl-Enter 執行程式碼)
  4. 放遊戲 http://b81.org/s/imo_algebra1.html#/4 (不過只有在 Firefox 排版正確)
  5. 放表格 http://b81.org/s/math2.html#/7/1 這個是拿來當計分板的,而且是用 livescript 寫的。
如果放入 d3.js,看起來應該也很有趣。
有興趣的話,不妨看看 html source,可以看到一大堆 markdown。


2014年2月27日 星期四

用 python turtle 寫 Flappy Bird

這個 Flappy Bird Clone 的主要目的是拿來當某種形式的初學者 Tutorial。
第一次使用是在花蓮.py 二月聚會,當作一系列介紹 Python 遊戲框架、引擎、工具的一部分。更精確地說,是拿來當作這一系列的開頭。因為在介紹這個簡單遊戲的撰寫過程後,就會發現 turtle 缺少什麼東西(進階繪圖功能、音效、物理引擎、碰撞偵測),然後我就可以順理成章地說,這就是為什麼我們需要遊戲引擎。替往後的介紹鋪路。
不過在寫這個 Demo 的時候,我主要還是以程式語言初學者 Tutorial 的方向來思考。所以寫的過程中,盡量不使用我認為比較進階和複雜的概念。所以複雜一點的 nested function、 OOP、decorator、 yield 這些都盡量避免了。
我還是有用一個 class 定義, 但那純粹拿來當成 struct 用,避免太多需要修改的 global variable。
裡面也有一個 lambda, 但那個 lambda 是準備拿來說明 lambda 語法的。
也許這個原因, 所以被 Keith Yang 發現在 Python 2.7 也能跑。
同樣也是因為教學的理由,所以只用內建的 turtle module。音效方面也捨棄 PyAudio 而採用呼叫 mplayer。
這個 project 以後會慢慢變成 step-by-step tutorial, source 在 https://github.com/tjwei/Flappy-Turtle
配合 python 3.3 或 2.7,使用空白鍵就能玩。