文組背景三個月學程式語言C++心得
去年9月到12月,睽違多時終於習得一個新技能,那就是C++。

整理這篇心得,並不是想告訴大家如何寫程式(會寫跟懂寫、揮灑地寫又是另一個層次),而是想給毫無理工背景、卻想學程式的朋友們一個參考,也想藉此梳理那三個月所學,提醒自己還是要找專案來練習。
近幾年我看了不少關於文組學程式的文章,最令人啟發的,就是《文藝少女的矽谷進擊》的作者王文珮(她也是我追了好久的粉專工程師作家的轉行人生版主),還有過去帶的實習生Wendy成功轉職成後端工程師的經歷。我並沒有轉職的目標,但這兩年眼看ChatGPT興起,生成AI進展日新月新,更增加了我對寫程式的好奇。
去年7月,我跟同事亦甫合作的數位專題《魚與油之爭:主權、資源與海洋的南海衝突戰》正式上線,過程中讓我對網頁後台建構非常感興趣,就開始盤算要不要在先生任教的大學修一門網頁設計的程式課程(因有不錯的眷屬折扣)。
Whitworth秋季開設的程式課程是C++,網頁設計相關的JavaScript要等到Jan Term才有,但有點迫不及待的我,就覺得那就從C++開始吧。
去年9月也是當媽媽後的重要里程碑,因女兒正式進入美國的小學系統成為Kindergardener,七年的媽媽生涯,終於首度迎來兩個孩子週一到周五、八點半到三點都會在學校的「人生新篇章」,已許久沒學新技能的我,此時不上更待何時。

當時盤算了課程時間安排,CS171是每週一、三、五早上9點到9點50,我們家開車到學校只要10分鐘,送完小孩就可直接到校上課,下課後還不到十點,可接著安排工作。以下會分成幾個主題,來分享這三個月的學習心得。
線上或實體課程?
現在市面上的程式課程可說是琳瑯滿目,不論實體或線上都有好多選擇,而我自知初次接觸,實體課程在各方面都較適合當前狀態,便選了先生任教的Whitworth University資工系的基礎程式課程CS171。
CS171課程使用的編譯器是VS Code,參考課本是Daniel Y Liang的《Introduction to Programming with C Pearson》,課程涵蓋內容包括這八個主題:Variables、Divergence、Chart、Loops、Algorithms、Functions、Arrays、Classes。

除了每週三天各50分鐘的課程,每週都有一份作業,約一週半就會有一次評量,期中要參與資工系的Community Bulding Week,期末要和同學用完成一份Final Project。

每週花多少時間練習?
基於每週都有作業和每十天一次的評量,除了課程前兩週相對容易,隨著課程越來越難,每天應平均至少要練習30分鐘到一小時,但我仍有本業在身,因此很常是累積到作業截止前,才會在週末用至少3-5小時把作業完成,另外還要再針對評量題目練習,總結來說,每週大概要花至少5-7小時的時間。

這三個月練習過什麼project?
對內建文組思考模式的我,學習C++很需用案例來理解,例如學習Variables時,會用到int、double、char、string來告訴電腦你正在處理的對象是數字或文字。起初真的是無法進入狀況,直到某天,我發現家中微波爐時間顯示的bug:如果輸入90秒,竟不會進位成一分鐘30秒!當時我馬上就動起腦筋,若是用C++來處理,要如何設定?頓時課堂上Variables的概念馬上就鮮活起來。
(註:微波爐的時間設定系統通常不是用C++寫的,而是用更接近硬體、資源需求更小的語言如C語言和組合語言,但C++也可以解決,見下圖)

另外,在學習Class時,我也回想起小學非常喜歡的一款電玩:《三國志2》。仔細想想,當時這個透過鍵入數字選項的Dos系統電玩,若是用Class、Loop、Function就可以寫出非常基本的架構了。
(註:根據ChatGPT回答,90年代推出的《三國志II》,基於C++在80年代末才剛普及,且當時遊戲開發者很少會用C++來寫遊戲,尤其是在資源有限的DOS時代,主要應該是用C 或匯編語言撰寫。若有人知道更多資訊,歡迎補充,另外我也請ChatGPT用C++寫了一個《三國志II》簡單版,之後再來分享細節。)

所以專案真的是最快能讓你理解程式語言應用的途徑,在課程中我有做過像是簡易計算機、剪刀石頭布遊戲、估算月份星期的計算工具等,而我個人最喜歡的專案,是用Class來替編輯設定整理作者相關資料的功能,例如姓名、發表文章、發表時間等,雖然只是非常基本的程式結構,但用C++來連結我個人的工作內容,覺得特別有成就感。

Community Bulding Week也是一個非常特別的經驗,尤其要混入整個資工系大學生中,和團隊共同完成一個給小學生的「拼字遊戲」。因為是全系混搭,程式部分都是由大三大四厲害的學生負責,技術部分貢獻為零的我,好在有育兒經驗和團隊溝通經驗派上用場,讓我順利度過第一個團體專案。

而佔了整學期20%的Final Project,我與同學做了一個類似《紐約時報》的遊戲Wordle。值得一提的是,Final Project是一個能測試你在一系列課程下,是否融會貫通的證明,從畫flowchart到應用每個技巧和功能,坦白說,期末專題對我而言非常吃力,所以真的非常感謝那位同組超級給力的同學,最終讓我完成這堂課。

有沒有想放棄的時刻?
基本上,除了前兩週蜜月期對於學會用C++打出「Hello World」和做簡易運算沾沾自喜後,每一週都想過要放棄(為何當初不選擇當旁聽生就好?!),從九月底就開始倒數還有多少時間學期結束。不過當持續在編譯器打出一行一行的code,過程中也體會到寫程式真的是一種肌肉記憶,在某些時刻真的會「突然領悟」,而就是那個「Aha!」推動著我直到課程最後一天。
當文組碰上理工
我的工程師哥哥,過去給我文章的評論就是「話太多!」我和工程師先生也很常討論文科與理工的差異和「溝通不良」的笑話。對理工人而言,「輸入」後就是「輸出」,無需華麗辭藻也沒有模凌兩可,黑白相當分明。還記得在第三週評量日時,我一時想不到正確程式寫法,竟異想天開在編譯器上自己創作,結束後還沾沾自喜,覺得沒有全對教授應該也會給我點同情分數,殊不知電腦閱卷,「輸入」後沒有「輸出」就是零分,誰跟你同情分數,而這還只是其中一個「文組碰上理工」的例子。
不過雖然有不少「文化衝擊」,但我覺得可以實地理解理工人的養成,對我而言很像一場「田野調查」。例如在教學上,教授會假設在場理工人本該懂的概念和知識,因此在解釋上就不會從頭講起,而在團體專案討論上,我也會有意識避免「開放性問題」,而是從細節和執行層面和對方溝通。過程中又因時常求救於先生,才知道原來先生寫程式時有自己習慣的代碼,意外獲知另一半的「理工宅度」。
可以用ChapGPT嗎?
教授在第一堂課就明確表示,如果作業或考試有被抓到用ChapGPT就掰掰了。不過複習code時,我覺得ChapGPT是一個非常好用的工具,尤其能把一系列的code層層說明,真的幫了我很大的忙。不過還是要特別注意的是,對新手而言,ChapGPT可當作解讀程式的參考,但不要依賴成性,速成般地囫圇吞棗,真的不如紮實讀教科書,一個字一個字打才編譯器才會刻入肌肉記憶中。
重新感受大學校園
這次回到大學校園學習,第一個讓我驚訝的,是美國大學生的課業強度真的不容小覷,不管是每週都有課堂作業、定期評量,還有兩個團體專案,而這還只是一堂課程的份量,因此常看到八點到班的資工系學生已在喝能量飲。
第二個讓我驚訝的,是美國教授在教學型大學的工作強度。由於重點的是教學而非研究,因此教授花在學生的時間真的非常多,除了備課、教課外,教授課後的office hour都是被學生包圍,研究只能自己再找時間安排。而這次近身觀察先生工作環境(修課教室和先生科系同棟),也更了解為何先生下班回家後都相當疲憊,增進了夫妻間的理解(任何事都改用輸入和輸出來解釋?!),算是這次修課的一個意外收穫吧!
而混進大學生中上課,也會特別觀察一下美國理工大學生的型態,一開始我以為現在大學生都是低頭滑手機,但其實學生們這方面相當克制,另外我以為現今男女性別和科系選擇已沒有太大關聯,但我竟然是這班C++課堂唯一一位女性代表。

最後,三個月的課程順利完成,拿到了83分B的成績,算是給了自己一個交代,這裡也歡迎也是程式新手來分享心得,更希望能有有趣的專案彼此交流。

留言
張貼留言