程式跟生活息息相關,但教材都很硬,既然它就在描述生活,為什麼不 說故事學程式 呢?易懂也易記。
本文想跟這樣的你溝通:1)你知道 AI 很快會取代人類寫程式的工作;2)你想學程式到能讀懂以與 AI 交流;3)曾學程式被嚇到卡關,需要重新打通任督二脈。那麼本文對你有益,雖然沒有教學,但觀念花了很多年想通,我覺得是讓我突破卡關往前走的關鍵,如果你想深入研究程式設計,網上有充足的資源。
如果你想成為偉大工程師,或你已經是駭客等級高手,你會覺得無聊。
本文目錄
幾十年才學會程式語言
我是好奇的 ADHD 兒,想理解一切新奇事物,這症頭在手機出現後更嚴重,不懂立刻拿起手機查,「不懂」更讓我好奇。
像我們這樣的人,電腦簡直是個引力無限大的黑洞。
還沒網路的黑科技時期
家裡第一台電腦是小學時仿冒 Apple II,上面有 2 個軟碟機,開機嘎嘎響,在黑底綠字螢幕上玩波斯王子。有位跟我一起騎腳踏車,後來上電子科的鄰居,平時幫人家裝電腦賺錢,他的玩具都是電路板、蜂鳴器這些東西,我第一次看到寫程式,是他用 BASIC 語言寫我不知道在幹嘛的軟體。
直到上大學,覺得前途未卜,就先學英語和電腦吧!於是買了人生第一台 486 電腦,記得要買 40MB 的硬碟,學姐說她哥在中央大學後門開了一家電腦公司,於是她哥親自從中壢送板橋裝上電腦,當年 40MB 至少值這一趟客服。
現在 1000 倍容量 4GB 隨身碟,去小七就可以買了
當時是巷內小店,後來發展成遊戲軟體通路、投資了連鎖網咖及一堆事業,她哥哥被冠上「大亨」尊稱,後來倒了,也風光一回。
有了電腦,我想學程式了,高手建議學 C++,「非常適合入門」,我買了一本大部頭 C++ 書,少說 8 公分厚,但始終停留在第一章。到現在還是覺得編譯式語言難,也許「初學者」也有分等級,我算程度較差的。
當兵時我負責繪圖和編輯書籍,很閒,同梯用他被分配的那台 286 黑白電腦,用組合語言寫遊戲,他嘗試教我,比 C++ 更難。
在沒有 Internet 的時代,寫程式還是神祕黑科學,不管 BASIC, C++, 組合語言,我不得其門而入。
網路改變流行,變簡單了
當兵時從空中英語教室文章知道了「world wide web」,隨後十餘年全球風起雲湧,我也成為其中一員。
這時,網路用的 JavaScript 和 PHP 成為熱門語言,我發現 Codecademy 這線上教學網站提供免費課程學 JavaScript,很熱衷地上了 200 堂課,每一堂課都很短,教一點點東西,網站發信來稱讚我,發給我一大堆徽章,但我卻連說「我會了」的信心都沒有。
JavaScript 比 C++ 和組合語言簡單太多了,但就算上了 200 堂課,想寫個簡單的東西不知如何開始,所以我不敢說我會了。很多人學了多年英語,但見到老外張口結舌一樣吧!單字、文法、翻譯、考試技法都會,就要把這些技能組合起來會話卻難上加難。
Java、C++ 是「編譯語言」,寫完經過編譯手續轉成看不懂機器碼安裝到電腦,早年寫程式很賺,原始碼值錢當然不讓你看;有 Internet 後,程式碼放伺服器,不編譯你也看不到啊!所以 JavaScript, Python, PHP 這種「直譯語言」就流行起來,比較簡單,原本的窄門開了。
當時上班的公司經營不善,我失業了,利用勞保補助去巨匠上了幾個月《Android App 開發》職訓課,實際上為了湊政府專案時數,有關軟體一切都教了,包括 Android, Java, HTML, CSS, JavaScript, PHP, SQL, Photoshop… 如果我都能學好就是全端工程師了!
但連續幾個月朝九晚五滿堂學電腦,回家就累翻了,怎麼可能吸收?我不知道那班有幾位成為程式設計師,我程度不夠,但隨後幾十年在科技圈混,多憑這時期學到的基礎知識,至少每個技術都接觸、操作後,就發現所有資訊科技,不管網路、單機軟體、手機 App、系統平臺、無人機、AR/VR、AI… 其實都大同小異,掌握任何一種,資訊產業就都不至於聽不懂了。
我終於懂了
雖然 Java 沒去考證照,但自學過讓 JavaScript 課程聽懂了,但還沒打通任督二脈,直到一個插曲。
補習班有的老師面前擺一台 iPad,上課就把 iPad 上的程式碼抄在教室電腦上,一位心高氣傲的老師對這種上課很不屑,從來兩手空空來上課,有一次教我們怎麼做 Carousel,就是首頁上常看到的幾張圖片輪播,但老師的程式碼是從最左邊第一張播到最右邊第五張,又刷地跑回最左邊再輪播一次,有位同學問老師,可以播完第五張後不要倒轉,繼續往右跑但會顯示第一張嗎?
心高氣傲的老師是不服輸的,他開始程式實作,在臺上喃喃自語「從第一張到第五張,然後就把第五張接過來……」他把他打算怎麼做的步驟用文字分點列出,然後再想第一點、第二點… 的達成語法,完成。
程式課程都是簡化過的,甚至幫你準備好素材只要組合起來,我從來沒有自己寫過一支程式,不知從何開始;這就像上了幾年英語只有填空題或是單字重組,從來沒有叫你實際講出一句話,每次想講話腦中就是各種文法交織,怎麼有辦法講出一句來?
但這次我看到從零寫程式的流程,他先寫出步驟(Flowcharts 流程圖),在每個步驟下寫一些假程式碼(Psuedo code 偽程式碼),例如「如果圖片已經跑到第五張,就再在右邊加上一張,把第一張接過來」。
我通了,原來寫程式跟講故事一樣!只是聽故事的不是人而是電腦,所以要用程式語言講故事!
先前的 200 堂課是小拼圖碎片,我以為是學得不道地組不起來,現在知道,工程師不是由下而上拼圖,而是由上往下的心智圖!他把大步驟定出來,想出大致寫法,最後才查語法細節,程式碼只是枝微末節!
從這學到:如果你打算每一課讀完再組合,這跟從前的英語教育一樣大錯特錯,程式不是難在認識拼圖,而是難在理解拼圖間的關係。這就是為什麼把你丟到美國立刻英文變好?要吃飯一定要點餐,就算不會也得比手劃腳,這時旁邊人點餐的單字會印象深刻,就學會了。
程式語言也是,老師不管是一個一個語法教,或是老師做專案給你看,都學不好,想學好要自己計劃專案、自己想辦法,老師只能稍微提醒你。
從起心動念想學程式,到這堂課我敢說「我懂了」,花了超過 10 年。
20 年後我會了!
在電信公司上班時,老闆來自西門子團隊,這些超理智人用專用的心智圖軟體,在那之前我讀過心智圖書,但紙筆畫心智圖不方便幾乎沒練習過,軟體的方便讓它成為我每天的工作夥伴,就是把思考的一切整理成一棵樹。
這棵樹換成 Word 就是「大綱模式」,用「條列 + 內縮」的格式把複雜概念筆記成一棵樹,整理好資訊,大腦才有餘裕思考更大的主題,於是我用「內縮法」模擬心智圖作筆記很喜歡內縮能幫我整理得乾乾淨淨。
在中國工作時接觸到 Python,居然是個用「內縮法」整理的語言,好親切啊!那時老闆資金卡住動不了,上班沒事做的我就跟鄰座的 PHP 工程師一起學 Python,才知道工程師會「刷題」,練了一個月熟練的我終於可以說「我會寫程式」了,離大學時想學程式,過 20 年了吧!
初學者要學什麼語言?
「初學者應該學什麼程式語言?」很爭議,Python 常被推薦,但有人說「我就是無法習慣 Python 奇怪的語法」,每個人都推崇他熟練的語言。我摸索多年真誠告訴你,雖然我沒很喜歡 JavaScript,但如果你一點基礎都沒有,它是最容易入門的,只需瀏覽器就能玩,不像很多語言還要下載一堆軟體設定半天才能啓動,然後打開軟體界面複雜到倒彈三步。
除了 JavaScript,最親切的是 Python,它不像別的語言一堆括號,讀起來像英文,程式碼短,不會自己嚇自己。也因為它簡單,很多人用,程式庫超多,它像萬用的萬金油,如果你這輩子只打算學一種語言,選它很好,因為我們想得到的大部分問題,它都有寫好的程式庫,比如爬蟲抓網頁只有 Python 能解決,數據分析、人工智能,也是 Python 的拿手好戲。
這種「應用面廣泛」就像你買了一台 Toyota 休旅車,所有零件都能找到便宜副廠貨,夠高能載人也能載貨;但如果買 Alfa-Romeo,就是一場昂貴辛苦的修理之旅了。
它俩好入手另一個原因是它們比較「不嚴謹」,這不是負面批評。本文前提是你想學個語言的「概念」趕快開始操作 AI,你很少需要自己寫,選個好入門的語言,先求「不放棄」。
就像初學打籃球,先求「籃下擦板上籃」就不容易放棄,如果一開始就「三分球」或「扣籃」二選一,大部分人第二天就不來上課了。
而且就算 Python 沒有這麼嚴謹完善,每種程式語言的概念差別很小,擁有一個基礎再學其他語言,比新手小白快多了。
如果一開始就學 C++、Java,它們很厲害、很嚴謹、很快速,但光學會它們像六法全書那麼厚的使用手冊,初學者就嚇跑了。
好奇可以讀 Java 的官方參考文件(https://docs.oracle.com/javase/8/docs/api/),印出來比六法全書厚,我覺得光理解語言本身就累了,沒力氣想用它還能做什麼了。
程式自學法:學少別學多
你可能會問「你憑什麼談程式?你功力比別人強嗎?」正好相反,我能談就是因為我不強!
你身邊總有幾個成績好又成功的菁英吧?不少臺大人說從小覺得學習簡單,三兩下輕鬆搞定。雖然多數人智力相差不多,但確實有些人更強,眼神都比較清澈!不過他們沒經歷過數學不及格的掙扎,怎麼能理解別人卡關的原因呢?沒遇過困境的人,你確定他從不需使用的脫困法有用?
反之,我的經歷告訴你了,你卡關,參考我脫困的經歷,因為它們實戰過。
身為終於脫困的我,要先翻掉你的想法。
程式課程總有幾十堂課,一個個細節教,你都交錢了當然要給你乾貨啊!這樣的課程也賣得特別好,要學當然要學透徹,哪有人學個半瓶醋?一個願打一個願挨。早年我就是這麼想,尤其我這種假冒者症候群特別嚴重的人,很怕一點沒學好被人看成外行。
後來我發現,放棄就是從這些細節來的。
你有沒有發現當 Google Map 唾手可得,路癡反而越來越多?照著走,同一條路走 10 次不一定記得路。但關掉 Google Map 自己走一趟,一邊走要一邊想方位、地標、路名… 你就真的會走了。
我們擁有 AI,建議把上課時間極力壓縮,學到必要的,趕快自己走一次。坐在課堂上看老師說的那麼簡單,都懂了啊!那是他懂,不是你懂啊!
拿學英語比喻,會字母、幾百個單字,和基礎文法,就開始「用」英語吧,用很爛的英文說和寫很短的句子,叫 AI 糾正你,告訴你錯在哪裡,看不懂再去找資料,一用就會了。千萬不要花好幾年學文法、考試,最後發現除了考試一句話都說不出來。
下面要做的就是告訴你哪些是「必要的」,縮短讀書上課時間,趕快進入做中學才能真懂。
程式是什麼?
我們都以為電腦天生有軟體 App,但 Game Boy 程式是燒在硬體中,一台只有一個遊戲。但如果幾萬的電腦也只有單一功能,就難賣了,「軟體」讓電腦抽換軟體就可以做不同的工作。
紅樓夢作者曹雪芹的家裡是「江南織造府」,江浙一向是絲綢重鎮,有位知識淵博的金鐘獎大編劇長輩告訴我,他參觀過一個專門織大尺寸絲綢的傳統作坊,木造織布機有幾層樓高,它太大了,要一組人一起操作。
絲綢布料上的「織花」是織布時一根根換紗線顏色產生的,小型織布機就由「織女」控制,而這麼大的織布機,每個人只能顧一小部分功能,怎麼知道何時換什麼紗線來織出花色呢?很有趣的,作坊把織花步驟寫成一首歌,整個團隊一邊工作一邊按照節拍唱,歌詞內容就是經線往上或往下,以及緯線現在要換什麼顏色的色紗,大家一起合唱,每個人會用相同節奏前進,工作可以協調完成。
不同花色唱不同的歌。在同一台織布機(硬體)織出不同的花色,這就是軟體啊!無獨有偶的,西方的軟體也是從織布產生的靈感。
記錄中第一個軟體設計師愛達·勒芙蕾絲(Augusta Ada King, Countess of Lovelace)1 的維基百科說「華特·艾薩克森認為來自她在織布機上的觀察:『她看到有些織布機以打孔卡當指令,織出美麗的花樣…』」,東西方都因為織布的關聯發展出「軟體」,只是東方沒發明電腦。
Program 台灣翻成「程式」,中國翻成「程序」。唱歌織花只能按照流程一步步走,叫「程序」(Process)很適當,但我們印象中的程式可沒這麼傻,它會判斷!
說故事學程式 |如何判斷|條件
大學時跟幾個朋友一起租房子住,有一天我起牀煮了開水就匆匆去上課,中午吃飯在麪店看到老闆那一鍋煮麪水,才想起「我好像忘了關瓦斯!」衝回宿舍的路上,想像樓下都是消防車,完了,我害死人了!
還好同學起牀幫我關火了,他們還活着!
至今幾十年,我煮開水只用快煮壺,搬到北京、搬回臺北,住進屋第一件事就是買快煮壺;如果不得已要用瓦斯,我會站在爐子旁直到水開;如果非離開廚房不可,我有好幾個定時器,離開前一定會定時,以免忘了這回事。
「程序」就像瓦斯爐只會不停加熱直到你關掉,這根本無法省力,「程式」就像快煮壺煮開會聰明地關機,台灣翻譯真的好,這樣的程式才有用。
快煮壺為什麼聰明?可以很簡單的用「如果…就」來達成:
if(判斷條件, 通過判斷要做什麼, 未通過判斷要做的什麼)
if(溫度達到100度, 斷電, 供電)
這行程式讓快煮壺可以判斷水煮開了沒,室友就不會死,真是了不起的發明。
快煮壺裡面有一片 100 度時變形的記憶金屬,會讓按鈕跳起來,導致斷電,降溫後,又會聽到「嗒」一聲,金屬片回到原狀的聲音,只是按鈕沒按下,不會重新煮。這說明不用軟體也能寫程式,晶片就是這樣用電晶體刻了無數個程式。
判斷式有很多變形,例如用 if…elseif…elseif…else 同時判斷一堆條件;或把判斷式放進另一個判斷式中的「巢狀判斷」可以先判斷 A 再判斷 A.1…;還有,如果選項太多了,Switch 可以把各種結果一字排開,輸入哪個就跳到哪裡去……
不用展開說,因為我們只要看懂,這些先跳過,跟 AI 協作過程中你一定會看到示範,它的示範是為了解決你的問題,做幾次就懂了。
說故事學程式 |如何監聽| While 迴圈
只用 if 寫的快煮壺程式有個問題,它只在煮開水第一秒判斷,知道「溫度不到 100 度,我繼續供電」,然後就下班了,結果溫度達到 100 度時還在繼續供電,造成火災!
就像我用瓦斯爐煮開水時就站在旁邊「監看」,要持續觀察水開了沒,程式也要設個機器人監看。
這個監看的程式就是迴圈(Loops),Loops 就像動物園裡焦慮的黃鼠狼,它們在野外原本要做很多運動,現在把它關在小房間裡體力無法消耗,我看着它繞着籠子不停轉圈,每次轉到籠門口就往外看一下飼養員有沒有送飯來,一整天不停的繞,蠻可憐的。
黃鼠狼可以用 while loop,它會持續繞圈監看,如果送飯來就停下來吃飯,不然看一眼停下來半秒鐘又會繼續繞圈。
while True:
繞圈()
if 到達籠子門口(): # 如果走到門口
if 飯送來了(): # 檢查是否有飯送來
吃飯()
break # 停止繞圈
else: # 飯還沒送來?
等待(0.5秒) # 等半秒繼續繞
我們用這焦慮的黃鼠狼監控水是否燒開,它每繞一圈就來看是否需要關電,如果還不用,那一秒後再來檢查:
while True:
if 溫度 >= 100: # 如果溫度達到100度
斷電 # 關閉電源
break # 停止監控
else:
# 如果溫度未達100度
供電 # 持續加熱
等待(1秒) # 暫停一段時間後再進行下一次檢查
因為有這隻黃鼠狼在幫我們監控,就不用盯着了,你看到前面學到的 if 被放在 while loops 裡面,終究還是靠它來判斷的,只是這個 if 是騎在黃鼠狼肩膀上不停繞圈,不停判斷。
說故事學程式 |如何省力| For 迴圈
有一部 NHK 紀錄片是禪宗佛寺生活,和尚每一陣子要出門化緣,原來化緣不是乞討,他向你化緣讓你得到供奉的機會,是你的祝福,所以和尚要依照規定每 N 家住宅敲一家的門,就算這家看起來窮到不可能供奉,也不能剝奪他被祝福的機會。
那為什麼和尚不敲每一家的門呢?或許戶數太多,每家都敲門花掉太久時間。
在機器發明前,重複的工作是人來做,但機器發明早期,還是有機器殘留的工作無法自動化,那時人應該比沒機器更累,你看過卓別林《摩登時代》的片段嗎?一位負責栓螺絲的工人面對生產線不停流過來的機件,不停栓螺絲被逼瘋了,那是因為早期的機器可能還不會栓螺絲,人要補這個洞。
人類總想用機器幫我們處理重複工作,loops 就是來做這件事的。
如果像煮開水,我不知何時煮開,要一直迴圈到水開為止,就用 while loops,但我知道要繞幾圈,就可以用 For Loops,它能「窮盡」或「遍歷」。
讓我們把和尚對每一戶都化緣寫成 For Loop:
# 假設社區有 n 戶人家
total_houses = n
# For loop 遍歷每一戶人家
for house_number in range(1, total_houses + 1):
print("和尚走到第", house_number, "戶人家")
knock_door(house_number)
say("阿彌陀佛,請施捨一些食物或金錢")
received_items = beg_for_items(house_number)
# 如果收到東西,記錄下來
if received_items:
print("收到的東西:", received_items)
else:
print("第", house_number, "戶人家拒絕了施捨")
這是 ChatGPT 寫的程式碼,我不由得笑出來。
設定社區有 n 戶人家,因為每個社區不同,到時候把 n 填入實際數字就好了。
接下來在所有門牌號碼中,從第一戶開始,和尚走路、敲門、說話,把收到的供奉標註門牌號碼記錄下來,沒收到則記錄這家不供奉。
用虛擬和尚,現在可以每家都化緣,每一戶都有機會累積功德了。
說故事學程式 |如何與世界連結|變數、類型、和容器
變數、類型,和容器,在正規課程通常分成好多章講,但我們是基於要 AI 自動 coding 的懶人,用一張 Excel 表就搞懂多個觀念,假設下面這張是 Excel 表。
記錄 ID | 門牌 (int) | 是否敲門 (bool) | 供奉物 (list) | 回應 (str) |
---|---|---|---|---|
1 | 1 | true | [“Rice”, “Banana”] | “Thank you” |
2 | 2 | true | [] | “Sorry, no donation” |
3 | 3 | false | [] | “No answer” |
4 | 4 | true | [“Money”] | “Thank you” |
5 | 5 | true | [“Water”, “Cookies”] | “Thank you” |
變數(variable)
小朋友大約到高年級能懂變數,這是因為程式碼通常寫成「houseNumber = 1」,後來會變化,讓人很誤解「它不是 1 嗎?為什麼會變成別的呢?」,用過 Excel,很易懂了。
上表有五欄(Excel 直排叫「欄」 Column,橫排叫「列」Row)的最上面一列就是「變數」。
例如「是否敲門」的值就是從「KnockOnDoor = true」接下來 ture、false、true、true,不是這個數字變了,而是程式每跑一輪,所有變數值都會改變,因為和尚去了下一家,情況當然就不同了。
表中有 5 條記錄記錄的是程式變化的過程,就是一直被填入不同的「值」。
類型(types)
在表頭欄位名稱旁有這欄的類型,例如「門牌」要輸入整數(int),「是否敲門」輸入布林(bool,只有是、否兩種可能),「回應」輸入字串(str),這些設定 Excel 都有。
類型作用是什麼?你可以打開 Excel 試試看,如果這一欄的格式是「文字」(string),你輸入「11/26」就呈現這幾個數字;而如果格式是日期(datetime)的話,11/26 會被記錄成 2024/11/26 10:00’20。
因為 Python 和 JavaScript 不嚴謹,類型錯了程式還能跑,但結果卻錯了,找半天找不到問題,會讓你很灰心,一開始設定好,就減少錯誤了,所以每一欄都要說明類型。
容器(containers)
在「供奉物」這一欄,居民供奉的物品可能很多種,例如 1 的「米飯、香蕉」,人看起來是 2 件,電腦卻看成一串包括標點的字串。只有一格卻要輸入很多內容怎麼辦?用容器把一堆內容裝起來,比如「列表」(list),電腦會找逗點,數裡面有幾個,而不會看成一大串字。
各語言容器大同小異,拿 Python 來說,除了 List 以外,還有幾個主要的:
- 元組(Tuple):例如來儲存「供奉物」,輸入後就不可修改;
- 集合(Set):如「記錄 ID」像身份證號不能重複。
- 字典(Dictionary):用來儲存很多有不同名字的內容,像「和尚:唐僧;大徒弟:孫悟空;二徒弟:豬八戒;三徒弟:沙悟淨」。
一樣,這些複雜的容器類型會在實作中不停使用,看不懂再去查,多用到就會記得。
說故事學程式 |如何偷懶|函式
和尚做的事情不少,敲門、說話、拿到供奉、說說話,每件事都要記錄,如果在每個程式裡都寫記錄的程式碼,不是要一直重複內容嗎?
下面是解決方法,首先把寫記錄工作寫成函式:
FUNCTION RecordResult(houseNumber, response)
// 記錄敲門結果
PRINT "House Number:", houseNumber, "Response:", response
END FUNCTION
然後,敲門後只要引用這個函式,內容就不用重新寫了,只要寫函數第一行的名稱和要求的參數。
FUNCTION KnockOnDoor(houseNumber)
IF TRUE // 有人回應
RecordResult(houseNumber, TRUE)
ELSE // 無人回應
RecordResult(houseNumber, FALSE)
END IF
END FUNCTION
其他動作要請它幫忙記錄,也可以都寫進去,就是一個萬能記錄員了。
這段程式碼很簡單,會覺得多寫幾次也沒關係啊!但實際寫程式時,一個函式也可以打包上百行程式碼,它一方面讓你偷懶到處用,另一方面可以把相關的程式碼打包在一起。這種把亂七八糟的內容裝箱叫「封裝」,在編輯器裡可以摺疊起來,眼不見爲淨。
這什麼語言的語法?是「僞程式碼」(Psuedo code),很直覺,在計劃階段用這種方式筆記,就不用記各種語言規定。
說故事學程式 |如何一致|類別
剛學程式都用簡化例子,例如:老師舉辦郊遊,叫我去詢問報名意願。假設報名郊遊人數為 X,而 X = 0(初始值為零),用 For 迴圈,每迴圈一次 X + 1,經過 15 圈以後,X 變成 15,所以報名有 15 人。
報名結束,現在要幫大家保旅遊平安險,老師問我「15 個人的姓名分別是什麼?」啊!沒問,好那我再問一次。
完成後老師問「有沒有家長要陪同?」啊!沒問!再問一次…
我這種員工,說一動做一動,很快就要被開除了!
要怎麼不這麼欠揍?把需要的資料列表,每個報名的人都填寫一張,姓名、座號、電話、地址、爸媽是否要陪同、陪同者姓名…,現在老師問什麼都回答得出來。
當然我們可以把這 15 張報名表輸入 Excel 編成表格,讓我們這麼想「類別 = 一張表格」。
照這麼說,剛剛和尚化緣的例子就是一張表,它也是個類別?前面的表只有 5 筆資料,現在產出了第 6 筆,它是個新的記錄(entry),空的,還沒有填寫內容。
記錄 ID | 門牌 (int) | 是否敲門 (bool) | 供奉物 (list) | 回應 (str) |
---|---|---|---|---|
1 | 1 | true | [“Rice”, “Banana”] | “Thank you” |
2 | 2 | true | [] | “Sorry, no donation” |
3 | 3 | false | [] | “No answer” |
4 | 4 | true | [“Money”] | “Thank you” |
5 | 5 | true | [“Water”, “Cookies”] | “Thank you” |
6 |
讓表可以增加一列的程式長成下面這樣:
CLASS MonkBeggingRecord
// 屬性
ATTRIBUTE recordID // 記錄 ID
ATTRIBUTE houseNumber // 門牌號碼 (int)
ATTRIBUTE doorKnocked // 是否敲門 (bool)
ATTRIBUTE itemsReceived // 供奉物 (list)
ATTRIBUTE response // 回應 (str)
// 建構函式 (Constructor)
FUNCTION INIT(recordID, houseNumber, doorKnocked, itemsReceived, response)
THIS.recordID = recordID
THIS.houseNumber = houseNumber
THIS.doorKnocked = doorKnocked
THIS.itemsReceived = itemsReceived
THIS.response = response
END FUNCTION
// 方法:顯示紀錄
FUNCTION DisplayRecord()
PRINT "Record ID:", THIS.recordID
PRINT "House Number:", THIS.houseNumber
PRINT "Door Knocked:", THIS.doorKnocked
PRINT "Items Received:", Join(THIS.itemsReceived, ", ")
PRINT "Response:", THIS.response
END FUNCTION
END CLASS
看起來很複雜?其實就分三部分,讓我們名詞解釋一下:
- 第一部分「屬性」(attributes),剛好可以對照表的 5 個欄位名稱;
- 一張表應該是填相關內容
- 例如收入 10 萬元,只寫數字以後就找不到了,加屬性就方便查詢,「來源」是接案酬勞、「日期」是11/22 入帳、「帳號」是匯到中國信託帳戶、「匯款者」是ABC公司
- 屬性就像是一些標籤,用來讓你的一筆資料變得豐富,也容易查詢。
- 第二部分「建構式」(constructor),它告訴程式,當產生一條新記錄時,每個欄位如何處理;
- 前面產生了很多屬性,用這些屬性來「蓋」一筆新資料
- 那這些欄位就是新增那筆記錄的「構造」,所以叫建構式 constructor;
- 第三部分「方法」(methods),產生的新紀錄是空白的,用它修改內容,現在就有內容了。
- 對一筆資料中的某屬性「增刪查改」(CRUD, Create, Read, Update, Delete)需要「方法」< = 又來一個名詞?
- 其實「方法」就是放在類別裡用來操作的「函式」,通常工作不是「取得」(get)內容,就是「設定」(set)內容,所以稱作「getters」、「setters」。
- Getter,想知道第三筆資料裡和尚得到什麼供奉物,就寫一個函式叫 get_item_received(3),它會告訴我第三筆記錄裡什麼也沒得到。
- Setter,和尚想起來其實得到一根香蕉,就用 update_item_received(3, [banana]),把第三筆記錄的供奉改成香蕉
- 如果有 10 個屬性,每個都有增刪查改 4 個方法,就有 40 個,也太多了吧?所以有些編輯軟體會幫你寫好,這些很基本
- 除了 getters, setters 之外,其他功能也可以寫成方法,比如我想讓供奉物列出時翻譯成日文,可以寫個 get_item_received_jp() 函式,中間串接 Google 翻譯。
如何使用?在 Excel 目前記錄最下面一行按右鍵增加新列,就會產生新的空白列,再填入內容。這個增加一列,在程式中就是對這個類別(class,等於一張表)增加一個「實例」(instance,等於一條新列)。
從上面的例子知道,1)類別可以把一筆資料的內容預先定義好,不會丟三落四;2)類別是產出「實例」的工廠。
既然是個工廠,叫「類別」就很容易懂:
- 「學生」類別,含有名字、性別、學號;「老師」類別,含有名字、性別、工號。
- 學生工廠的產品(學生)是一個類別,而老師工廠的產品(老師)也是一個類別。
相信學生不會跟老師擺在一類,所以它倆分屬不同類別。
類別另一個好處是容易為函數、變數命名,因為函數、變數命名在程式中必須唯一。那假如有個變數 name,要描述學生名字只好叫 student_name,老師名字叫 teacher_name,男學生名字是 male_student_name… 每個名字都要去檢查有沒有被用過,程式越複雜名字越長。
但在 class 裡,學生表有 name,老師表也有 name,反正不在 Excel 同一張表,欄位名稱一樣沒關係啊!在程式裡使用通常這樣寫 student.name() 和 teacher.name(),點前面是類別名稱,點後面是欄位名稱,很清晰吧!也不用發揮創意命名。
網頁用 API 向後端要資料,它會傳來一個 json 檔,例如前端網頁詢問後端「請列出所有老師」,後端不只給老師的姓名,而是把姓名、性別、工號都傳過來,每個老師傳一次。
如果不這麼做,問它老師姓名就傳姓名、問性別再傳一次,前端網頁要自己把每次傳來的資料湊成一張表,不是很容易出錯嗎?
學這些就夠了,趕快開始行動
這些基本功能就像基本的字母、單字,每種程式語言都有,找個教程,把目錄讀一讀,把上述這幾塊找出來學完就「儘快開始實作」。
附上我當年學基本語法的網站,就網上找的,免費、簡單,不求鉅細靡遺,不用準備練習環境,打開就學,雖然淺嘗而止,但未來會碰到的都收錄了,可說麻雀雖小五臟俱全。
- https://www.learnpython.org/:簡單的 Python 課程,直接網頁練習,簡單的英文,大不了右鍵翻中文,未來用到的幾乎都包含了;
- https://www.learn-js.org/:同一個網站的學 JavaScript 課程,也是網頁直接練習。
最近發現對於學習程式,youtube 也不錯,因為影片會持續推進,似乎學得更快,你也可以去找來看看。
先知道這些,就可以開始跟 AI 聯手實作,然後你就會在做的過程中學到很多,學到的不是你的,做過的才是你的,趕快動手吧!
附註
- 參見 Wikipedia,她是詩人拜倫的女兒 https://zh.wikipedia.org/wiki/%E6%84%9B%E9%81%94%C2%B7%E5%8B%92%E8%8A%99%E8%95%BE%E7%B5%B2 ↩︎