精選文章

如何教自己寫程式 (上) - 為什麼寫食譜比寫程式容易?

April 03, 2017 15:38


這個系列的的對象是教師、家長,目的是讓讀者了解程式的本質、學程式的認知過程、以及運算思維。
進而能夠從學生的角度思考:怎麼教,才能讓初學者了解、吸收。
本篇探討的是程式的本質,再從本質出發,探討為什麼很多人不易入門程式。

本文作者為 橘子蘋果兒童程式學苑執行長 束凱文。

很多人認為寫程式是一件不容易的事情,但一件事情之所以難,一定有原因。
我就用「食譜」為例子,解釋一下:為什麼學程式對一些人來說很困難。

你會寫食譜或看食譜嗎?

就算你不會寫食譜,大概也看得懂食譜。

為什麼呢?因為裡面的每一字、每一句你大概都看得懂,腦中也有畫面,因為你即便沒親自煮過菜、大概也看過別人煮菜。

食譜跟程式碼很像,都是一份「讓讀者能夠照著指示達成特定目的」的資料。

食譜,是給人看的,目的是讓執行者能照著指示夠做出一道菜。
程式,是給電腦看的,目的是讓電腦照著指示做出各種運算及輸出。

如果你會做菜、有語言能力,基本上就具備了寫食譜的能力。
那麼既然程式和食譜這麼像,為什麼對很多人來說,寫程式還是一件有點困難的事情呢?
接下來,我們分兩點來探討。

困難點1: 能下哪些指令?

試著思考一下:如果今天要你寫一份食譜,而讀這份食譜的「人」是一個外星人,事情會有什麼不一樣?

首先,你可能會面臨一個問題:外星人用的是什麼語言?
為了不讓事情複雜化,我們假設這個外星人看得懂英文好了,那麼下一個你會面臨的問題就是:外星人能夠執行「打蛋」、「攪拌」、「判斷是否呈現黏著狀」等指令嗎?因為我們並不知道這個外星人是否具有肢體,並且對「黏著狀」的定義是否與地球人一樣。

怎麼樣?有沒有發現問題瞬間困難了不少?
提升的難度其實就來自於:我們並不知道這個外星人到底能夠幹嘛、具有什麼器官。

有沒有覺得似曾相似?

沒錯,很多人剛接觸程式設計時並不知道電腦具體能夠執行什麼指令。這邊的「指令」是很細膩、明確的,例如「舉起鍋鏟」就是一個明確的指令 (如果一份意大利麵食譜的內容是:1. 煮一份意大利麵 2. 端上桌。我想你應該會想把它燒掉)。
具體來說是在特定環境下,你能操控電腦進行怎樣的指令。

距離來說,我們要寫一個猜數字的遊戲程式前,或許就得知道:
  1. 電腦(使用特定程式語言) 如何產生特定範圍內的隨機數字
  2. 電腦(使用特定程式語言) 如何記住數字
  3. 電腦(使用特定程式語言) 如何提供界面讓使用者輸入數字
  4. 電腦(使用特定程式語言) 如何比較數字
  5. 電腦(使用特定程式語言) 如何在螢幕上顯示訊息
如果在了解電腦(程式語言)大致能做什麼事情之前,就想寫出一個程式,你將會同時面臨「學習程式語言的指令/語法」以及「邏輯組合」等問題,自然會舉步維艱。

困難點2: 表達夠清楚嗎?

接下來要面對的問題就有點殘忍了:你能夠進行有效的表達嗎?

信不信由你,就算你會做菜、會寫字,也不代表你一定能寫出一份人人看得懂、而且能夠正確無誤照做的食譜。因為你很可能:錯字連篇、文法怪異、順序錯亂、敘述不明確....等等。

「這個人表達能力真差,根本聽不懂他在說什麼!」
雖然當事者可能不是你,但相信你在生活中多少會聽到這類抱怨。

跟電腦溝通的時候,你得把他想成一個「小孩子」(只是這個孩子運算能力比你強很多),盡可能讓指令明確、可以在無歧義的情況下被執行,舉例來說:「稍微移動一下」、以及「顯示一下就消失」都是不夠明確的指令。如果你看到以下的食譜,恐怕也會吐血:
  1. 把一些蛋、麵粉、牛奶、糖,放在一起攪一攪
  2. 放到容器裡面,再放進烤箱裡面烤一陣子
  3. 從烤箱拿出來就完成了
為什麼你會吐血?
因為你不知道「一些」是多少,「一陣子」是多久,照著這種食譜做出來的蛋糕,恐怕會是個災難吧。
即便如此,我們在生活中還是會不自覺做出一些不夠明確的表達,所以表達並不是一件很簡單的事情,對人表達都這麼困難了,更何況電腦又比人類龜毛一百倍。

程式語言也是一種語言,只是溝通的對象是電腦,請別忘了這點。所以要寫好程式以前,也練練自己的表達能力吧。
(當然,我認為寫程式的過程本身就是在訓練表達能力了,這麼棒的技能,不學可惜呀~)

小結

寫這篇文章的目的不是只要告訴你「學程式很困難」,而是為了指出學程式的路上會遇到的最主要問題,讓你知道學/教程式路上要克服的癥結點為何,對症下藥、才能一帆風順。(問題真的不是「指令背不起來」、或是「自己不夠聰明」啦)
下一篇要分享的是「運算思維」,並提出一個簡單、卻又泛用的心法,讓學程式、或者教程式的人能夠更好上手。

如果你是學校老師,歡迎成為橘子蘋果的學校夥伴,我們將與您分享資訊教育資源,請透過這個網址申請:http://bit.ly/oa-partners
如果你是學生家長,歡迎加入橘子蘋果的課程,可以透過這個表單聯絡我們:http://bit.ly/oa-contact