02-3. 四張王牌

https://teachinglondoncomputing.org/resources/inspiring-unplugged-classroom-activities/the-four-aces-activity/

Computer Science activities with a sense of fun: The Four Aces V1.0, 12 March 2014

Created by Paul Curzon and Peter McOwan, Queen Mary, University of London for Teaching London Computing: http://teachinglondoncomputing.org

本教材以創用CC 3.0 姓名標示-非商業性-相同方式分享釋出(creative commons 3.0 BY-NC-SA) https://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh_TW

在沒有人注意到的情況下,偷走他手中的四張Ace!

這個技法告訴我們,所謂的運算不是只有關注在對於科技的理解,所謂的運算思維也不是只把重心放在演算法上,更重要的是對於人們的理解,以及如何協助人們解決問題。

在這個單元可以學習到:

  • 人機互動
  • 可用性
  • 避免可能造成錯誤的設計
  • 運算思維

活動說明:

1. 我們需要一副普通的撲克牌,以及一張小桌子。

2. 在表演之前,請所有學生配合一件事,要是你早就知道魔術的技法或是你已經發現其中的奧妙之處,先不要講出來,讓其他人嘗試解出魔術背後的運作原理,最後會有讓他們發表看法的機會。

3. 徵求一位自願者,觀眾可以往前靠近,就近觀察你的表演。開始表演之前,先告誡學生以後千萬別賭博,尤其是遇到職業賭徒或是電腦科學家的時候。

4. 將四張Ace字面朝上放在桌上,然後在每張Ace上面隨意蓋上三張牌(字面朝下)。告訴大家,在樸克牌局的規則裡面,能夠取得越多張的Ace,則得到勝利的機會就越高(用機會來表示這個概念,因為比起取得全部4張ace,還是有同花順的組合可以贏過它)。好吧,既然Ace這麼重要,接下來就請觀眾緊盯著Ace的流向。

5. 把四張Ace翻過來讓它們字面朝下,然後將四個牌堆上下堆疊收攏在手上。

6. 開始做發牌的動作,向大家表示你現在要把16張牌平均分成四個牌墩(跟自願者說,他的牌墩是編號第四)。

7. 發完前四張牌之後,手上拿著第五張牌,指向自願者前方的那張牌並請他翻開,跟所有人確認這張牌的確是Ace、沒有被動過手腳。(趁大家在注意那張Ace的時候,將手上拿著的那張牌收到還沒發的牌堆的最底部)

8. 等大家檢查完那張Ace,請自願者保持字面向上放在桌上,並說明在撲克牌的術語中,這張叫做「底牌」。

9. 繼續把剩下的牌發完,因為所有牌都保持蓋著的狀態,這個時候大家會認為自願者的前方放的四張全部都是Ace。

10. 因為自願者此時擁有最大的組合,代表其他四個人完全沒有贏的機會。這個時候請自願者隨意指定兩個牌墩,如果他剛好指向第一、二號牌墩,那就告訴他「第一、二個牌墩的玩家發現贏不了你,所以宣布棄權」,接著收起那兩個牌墩的牌並棄置一旁;如果他一指的兩個牌墩包含第三號牌墩,那就先淘汰掉沒有被指到的那一墩,再讓他指向剩餘兩墩的其中一個,用話術確保最後被留下來的一定要是第三號牌墩

11. 從第三號牌墩的最底下抽出底牌,因為它是蓋著的,沒有人知道他的點數。告訴自願者,現在三號玩家願意用加倍下注籌碼為代價,跟自願者交換他的底牌。因為自願者就算換掉那張掀開的底牌,他認為手上僅剩的三張Ace仍然是最大的組合,所以換牌來換取贏得加倍籌碼,這個選擇是非常划算的。

12. 交換完底牌後,告訴大家,你將用一個沒有人知道如何運作的方式,將剩下的三張Ace從自願者手上偷過來。裝模作樣、呼風喚雨一番之後,與自願者一同將手上的所有牌打開,這個時候大家就會發現,你的手上竟然真的有全部的四張Ace!

運算思維:

又是一個自我運轉(self-working)的例子。這個魔術運用到的演算法,關係到一連串看似複雜的動作,其中還有一個關鍵點在於「觀眾並沒有辦法一次看到發生的所有事情」。所以對於魔術師而言,大量且熟練的練習是絕對必要的,他們必須用一個精彩且沒有破綻的表演,來確保觀眾只看到魔術師願意給他們看到的部份。

這個技巧被稱為「誤導(misdirection)」。在這個魔術的操作步驟中,最重要的一步是你手上拿著第五張牌、指向自願者前方的第四張牌、並請他翻開檢查的這個部份,因為所有人在這個時候只專注在那張Ace身上,將不會有人注意到你把第五張牌放回手上牌堆的最底部。只要這個部份順利瞞過所有人的眼睛,剩下的部份就是按照設計好的步驟一一執行完畢而已。

這個技巧跟運算思維又有什麼關係呢?有時候一群工程師共同操作一套大型的系統時,可能因為不可知的原因而讓所有人都沒發現到其實他們犯了相同的操作錯誤。這不是因為他們笨,而是當大家的注意力都放在同一個地方時,難免出現了盲點導致大家集體犯錯。所以一個良好的程式設計,應該考慮到這個情形,可以避免犯錯導致的後續問題,甚至可以協助修復錯誤。

魔術師致力於讓觀眾犯錯,而電腦工程師則是盡力避免讓使用者犯錯。這些技巧是從對於認知心理學上有所認知之後才逐漸發展出來的。

魔術 = 祕密的方法 + 表演

程式 = 演算法 + 互動介面的設計

寫程式是一回事,程式好不好用又是另一回事。有時候程式設計師在沒有好好測試他發展出來的程式時,可能就會讓這支程式很不容易使用,甚至是讓使用者在不自覺的情況下因此犯下錯誤。

像是我們常常在繕打文件的時候,因為突發狀況而來不及存檔,導致先前所有的努力功虧一簣,所以程式設計師就必須在文書軟體之中加上定時自動存檔的功能。

或是如果你的鬧鐘設定了時間,卻忘了將音量給切至有聲的狀態(早上起床後按掉鬧鐘,它就是無聲的了),結果第二天鬧鈴時間明明到了卻沒有發出任何聲音,可能讓你因此錯失了重要的考試,所以設計鬧鐘操作介面的設計師,就應該將之設定成定好鬧鈴時間之後,它就會自動將聲音切換成有聲狀態,或是你切掉鬧鈴的吵鬧聲之後,它會自動恢復成有聲狀態,直到你解除鬧鈴時間的設定。

當你有一天成為程式或是機器介面的設計師時,記得要考慮所有使用者可能犯的操作錯誤,避免因此造成重大的影響。想想看,要是醫院的自動給藥機器因為護理師不小心的設定錯誤,讓機器將錯誤份量的藥量打入病人體內,那是一件多麼可怕的事!

魔術示範: