洞悉本質在不確定的世界預見未來
日記

是時候改變自學編程方法了

對於初學者而言,編寫可讀的代碼,然後讓學生形成自己的理解,歸納推理能力的形成非常重要。這種方法不僅對老師有意義,對於自學編程的人來說也不失為一種更好的學習方法。

改變教學方法

Jeff提出的教學方法叫做“預測至上”。

  1. 提出一個難題供學生解決。這個謎題很複雜,涉及你打算在當天教授的所有作品。
  2. 要求學生根據該謎題創建一些東西。
  3. 展示你自己的例子,說明我們正在做的事情是什麼樣子的,最好是以最完美的形式。
  4. 以學生建立的心智模型為例,將學術詞彙和定義黏貼到最後。

先給學生一段簡單的代碼,讓他們預測會發生什麼,然後從運行結果中學習語言的一些特性。換句話說,找到一種方法讓學生在要求他們學習一行代碼的各個部分的名稱之前,在自己內心深處感知一行代碼的作用。

為此,Jeff提出了編程教學的5條標準,符合這些標準的教學課程才能將知識點傳達到位:

  1. 還不知道此語法的學生,能找出這段代碼的作用嗎?
  2. 這段代碼是否與以後可能遇到的代碼合理的相似?
  3. 命名的文字是否有意義,變量是否命名正確?
  4. 問題是否允許學生專注於代碼中最重要的部分?
  5. 代碼示例是否需要某些先驗知識,還是能讓所有人都能理解?

具體來說,就是不直接提概念,而是先提出一個難題供學生解決。

這個難題包含了當天的知識要點,然後要求學生根據這個難題創造一些新的代碼,在解決問題的過程中學習專業術語。

幾個例子

Jeff首先展示了編程最基本的Hello World程序,他的方法與傳統方法略有不同。我們先看這段代碼:

name = "Tamara"
print("Hello" + name)

編寫代碼之前,先讓學生閱讀並理解代碼。運行以上程序會發生什麼?

一般,我們憑藉直覺能猜到運行結果中會出現Tamara,而實際的運行結果是HelloTamara,中間沒有空格。

接下來如何讓程序輸出帶空格的結果,必然要進行一輪調試。

在這個過程中,Jeff沒有說過字符串、變量等概念,但是在解決這個問題的過程中,我們已經掌握了print函數、字符串的拼接等一系列用法。

Jeff還舉了幾個例子,希望能糾正傳統教學課程裡死板的內容。

1、條件判斷

傳統教學:

if 1 > 2:
    print("1 大於 2")
else:
    print("1 不大於 2")

在這個例子中,學生只能查看代碼,而不能通過使用代碼學會條件判斷。

Jeff建議把代碼改成:

age = 15if age >= 18:
    print("你可以購買R級電影票")
else:
    print(f"再過 {18 - age} 年你才滿18歲")

終端中將輸出什麼內容?你的回答應該是:再過3年你才滿18歲。

接著,Jeff丟出了幾個問題:

整段代碼裡都沒有3,你怎麼知道會出現“ 3年”?我們如何更改程序來顯示其他語句呢?縮進對我們的程序有什麼作用。

通過這3問,學生知道了if-else語句的縮進格式,還知道如何用通過更改條件來實現其他的判斷。

2、數組

傳統教學:

a = [3, 2, 7, 5, 3, 9]print(a[2]) 
# returns 7

在這個示例中,為何a[2]的結果是7,沒學過編程的人可能無法理解,甚至會產生錯誤的理解:哦,原來是輸出第2個數字後面的一個數字。

Jeff建議改成:

favorite_foods = ["壽司", "玉米粽", "Mofongo", "披薩", "烤雞肉"]
print(favorite_foods[2])

這段程序的輸出結果會是什麼?我們如何打印出第一種食物、最後一種食物?如果把最後一句改成favorite_foods[10]會發生什麼?

通過這個簡單的示例,學生可以了解數組、索引已經索引超出範圍的錯誤。

3、對象

傳統教學:

Class Dog:
    def __init__(self):
        pass
    
    def speak(self):
        print("woof!)
Fido = Dog()
Fido.speak()

這段代碼雖然用小狗做例子,看似生動有趣,其實存在著一些問題:

  1. 狗並不存在於網絡空間中。
  2. 使用9行代碼來創建和調用函數,實際可以更短。
  3. 這種方法創建的所有狗都只有相同的功能,那為何還要創建一個類呢?

Jeff建議改成:

user1 = User("Ty", "Tdog@aol.com", 16, "Pa$$word")
user2 = User("Sarai", "SMendes@hotmail.com", 15, "Kangaroo!")
user3 = User("Osu", "Osu22@gmail.com", 12, "12345abcde")
print(user2.age)

提問環節:第一個用戶的電子郵件是什麼?哪個用戶的密碼最弱?最後一行將輸出什麼?

學生通過這種方式先學習了創建對象的方法,至於代碼中出現的User(),接下來就可以很自然地教他們如何創建類了。

最後附上Jeff博客的鏈接,希望他的方法對你學習編程有所幫助。

原文鏈接:https://blog.upperlinecode.com/stop-teaching-code/

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

back to top