因為開設了程式導師實驗計畫的緣故,收了不少學生,也收了不少報名信。在看過一些案例之後,深深覺得在開始學程式以前,有一件很重要的事情要先處理,那就是心態上的調整。
可能是因為以前受過的教育與學習上的挫折,或甚至是碰到不適合的老師與教材,有些學生對學習程式有種恐懼感。就算沒有恐懼感,在真正開始學程式以後又會碰到一大堆的問題,而且許多是心理上的問題,這些或多或少都會影響到學生。
而這篇原本是想放在我自己的教材裡面,在計畫開始之前給學生看,但想一想之後覺得直接寫出來放在 Medium 也可以。因為適用對象不只有參與計劃的學生們,我相信其他人應該也有這些困擾。
總之呢,這篇文希望能幫助大家在學程式以前做一些心態上的調整,往後學起程式時能夠拋下一些不必要的包袱。
數學不好怎麼辦?是不是程式也學不好?
這其實是一個滿常被討論的議題,數學跟學程式到底有沒有關聯?與其類似的還有一個問題:資料結構跟演算法到底重不重要?
我覺得在討論這個議題時,一個常見的錯誤就是把這個問題看得「太簡單」,想要用單一標準就來解決這個問題。但問題就在於當你指涉到「數學」這個詞的時候,背後其實涵蓋了幾個不同的概念。
數學指的是什麼?
是數學的計算能力嗎?我計算 28*72 算得慢的話,是否代表程式就學不好?
是數學的知識嗎?我不知道什麼是 log,不知道排列組合的 P 跟 C 是什麼,是否代表程式就學不好?
是數學背後的思考方式嗎?我沒辦法掌握學數學時背後的那套解題方法跟思維邏輯,是否代表程式就學不好?
而且同樣地,當我們說到「是否程式就學不好」時,那個「程式」指的又是什麼?
是指說判斷式、宣告變數、迴圈這些語法嗎?還是當我看到一個題目時我能不能解出來?又或者是指說我能不能寫出一個簡單的 CRUD 程式?
數學這一個詞背後代表的是不同的能力的總和,所以牽涉到的範圍很廣,有些與程式相關,有些與程式不相關。而程式這個詞背後也很廣,根據指涉到的對象不同,也會有不同的答案。
我認為學數學時的背後的那套思考方式是跟學程式時有關的,事實上,你在學程式時應該要學的也是背後那套思考方式,詳情可參考這篇文章:當我們在學程式時,要學的到底是什麼?
在學數學的時候,我(還有跟我一樣的很多人)其實沒有意識到我們真正該培養的是背後這個能力,例如說抽象化。我們把一個現實生活中的問題,例如說一個代數問題好了,轉化成數學上的符號,當我們利用數學解開以後,實際的問題也就解開了。
而在解題的時候也或多或少利用了一些技巧,例如說把問題縮小,當你解開子問題時,原本的問題也就解開了。或者是把問題轉化,由 A 轉化成 B,把包裝過的問題拆開,變成一個容易許多的相似問題。
這些能力都跟你在寫程式的時候是很類似的,只是你以前沒意識到你在學習這些東西而已(連我自己都沒有)。
這邊推薦一篇很不錯的文章:[心得]一個語言如果不改變你的思考方式,就不值得學?談程式語言的本質,裡面有提到了相似的概念,讓你從另一個角度來看學程式這件事。還有一篇跟演算法與資料結構相關的:想要專精程式必須學會什麼?,本文跟底下我的回覆都可以看看。
好,不小心拉得有點遠,但我覺得這些都能夠讓你重新再思考一次數學與程式的關聯,能夠把問題再定義地更明確一點。
回到原問題:數學不好,程式也學不好嗎?
這邊我想以兩個方向回答,第一個方向是刻板印象如何影響到學習。
通常會問這問題的人數學都不好,若是你又打從心底認同數學不好,程式一定也學不好的話,你在學程式時就已經有個心魔籠罩著。如果認為自己一定學不好,那學習的表現自然就會差。
這可不是我在唬爛,是有科學根據的,那就是刻板印象會影響到學習的表現。最常見的範例之一就是女生與數學的關係。推薦你們一定要去看看這篇文章:刻板印象威脅:優秀女生數學失準之謎,我直接引其中一小段:
提出人格特質理論的心理學家 Gordon Allport 認為,對一個人的評價,不論是真假,只要一而再、再而三地灌輸到此人腦中,就一定會對他的性格形成影響。兒童在四至六歲開始形成自我形象,會根據別人的評語評量自己,形成對自己的印象。
如果社會上對某個身分有刻板印象,這種印象會逐漸內化成其特質的一部分。假如小女孩自小就聽說「女性數學能力較差」這個刻板印象,即使她本來數學能力沒有問題,但她上數學堂時可能會因此而較自卑、遇到難題會自我懷疑、對數學的期望亦會調低,最終自己的數學表現一般就會印證刻板印象,形成惡性循環。
或許女生在生理上先天數學能力就較差,或許沒有。或許數學跟程式就是有著超級正相關,數學爛程式就學的爛,也或許沒有。
但真正的問題是,你都還沒開始學,想這麼多幹嘛?在你已經知道刻板印象會影響學習之後,最好的方法就是擺脫這些刻板印象去學習。
先學就對了,不要畫地自限。
如果你學得很不錯,那當然很好;如果你學不好,也不必硬是要找個「戰犯」把罪名套在它頭上:「對嘛,就是因為我數學不好,程式才學不好」,這樣子對學習也沒什麼幫助。
對我來說,學程式就是學程式,需要的數學知識你在小學跟國中的時候都學過了。如果你程式學不好,就多花點精力跟時間在程式上,不斷鍛鍊背後的那套思考邏輯。假如真的你花超多時間跟精力卻還是學不好程式,到時候我們再來探討原因,也許有可能真的跟數學能力或是其他東西有關。
但是你還沒學程式,而且還沒跟我學,談論這些都還太早。有時候學不好不是能力問題,是心理問題,如果打從心底就相信自己學不好,那怎麼會學得好?
我也沒有要你覺得「我一定能學會寫程式」,我只希望你先拋開那些既定印象跟各種「聽別人說」以及「我覺得」,先專注在學程式這件事情上。
沒有包袱、沒有預設立場,以這種心態開始去學程式,若是三個月後還是學不會,我們再來討論數學跟程式的關聯。
進度跟不上怎麼辦?是不是自己太弱?
「比較」一直一來都是個雙面刃。
當你意識到自己比同期的人進度快上許多,優越感油然而生,「哇靠我怎麼那麼強,根本天選之人,大概出生就是有這種寫程式的天份吧」;可是相反過來時,就會開始懷疑自我:「為什麼他可以這麼快完成這個作業?而我卻花了一個禮拜都寫不出來?應該是我太弱了吧,一定是因為我數學不好…(連結到上一題)」。
要對付這個問題,你要先認清事實。
事實就是學習的進度本來就是相對的,本來就是每個人都不一樣的。有人快也有人慢,這個再正常不過,只是你在這個群體裡面剛好是慢的那個。在 NBA 默默無名的球員,在 SBL 可能是隊上的王牌,因為強度跟環境不一樣,所以實力是比較出來的。
所以這也是為什麼我一直跟大家說:
跟著自己的進度走。
無論進度在前面還是後面,背後都有太多你看不見的東西。或許他五年前學過程式,還差點成了工程師;或許他每天都寫 code 到半夜兩點,甚至連白天的上班時間都在偷偷寫作業;或許他程式基礎很好,只是最近在忙其他事情所以進度落後,但說不準哪天急起直追,又回到領先的行列。
與其跟別人比較,有其他更有意義的事情可以做,例如說…好好看著自己,想想自己這陣子學了什麼,跟兩週前比起來進步了多少;或者是從其他人身上看見自己的不足並且加以彌補。
「比較」不是為了讓自己信心破滅用的,這對學習一點幫助都沒有。如果你真的很想比較,重要的是比較之後發現自己的缺點然後加以改正。無論進度比你快還是比你慢,都有可以從他們身上學到的東西,至少我是這麼想的。
最後附上一個來源已經不可考的詩:每個人都有自己的時區(翻譯來源)。
紐約時間比加州時間早三個小時,但加州時間並沒有變慢。
有人 22 歲就畢業了,但等了五年才找到一個好工作!
有人 25 歲就當上 CEO,卻在 50 歲去世。
也有人直到 50 歲才當上 CEO,然後活到 90 歲。
有人依舊單身,同時也有人結婚。
歐巴馬 55 歲就退休,川普 70 歲才開始當總統。
世上每個人本來就有自己的時區。
身邊有些人看似走在你前面,也有人看似走在你後面。
但其實每個人在自己的時區有自己的步程。
不用嫉妒或嘲笑他們。
他們都在自己的時區裡,你也是!
生命就是等待正確的行動時機。
所以,放輕鬆。
你沒有落後。
你沒有領先。
在命運為你安排的時區裡,一切都會準時。
好好地看著自己,讓自己每天都比昨天更進步一點,只要這樣就夠了。
想問問題卻不知道該怎麼問,怎麼辦?
很多初學者都會有兩個問題,第一個是不敢問問題,第二個是就算敢問,也不知道該怎麼問。
先來講第一個問題好了,為什麼不敢問問題呢?通常都是因為覺得這個問題很蠢、是個笨問題,所以沒有被提問的必要,或者是深怕這問題其實很簡單,自己就能夠找到答案,沒有必要麻煩別人。
先來講講我覺得什麼時候適合問問題,只要符合以下幾點條件我覺得就適合提問:
- 仔細閱讀過錯誤訊息,但還是不知道錯誤在哪
- 把錯誤訊息拿去 Google 之後還是不知道怎麼解
- 卡這個問題卡了好一陣子(這邊的標準是一兩天)
在我的教學計畫裡面,如果你滿足了這三點,無論你的問題是什麼,我都覺得很有提問的價值。因為你有努力過了,有嘗試著想要去解決問題。用盡各種手段之後還是沒辦法解決,這時候再提問就有很正當的理由,就不是大家口中說的那種伸手牌。
當然,我也有碰過還沒滿足這三點就來問我的學生,通常這時候我就會直接問說:「你把錯誤訊息用白話文解釋一遍給我聽」,並且一步步引導他們找到錯誤的地方。
或者是:「你有把這訊息拿去 Google 過嗎?你試了什麼解決方法」,雖然說我直接 Google 過後把解答丟給他可能是最省時間的方法,但是這並沒有解決任何問題。他下次碰到這問題時還是不會,因為解答是你幫他找的。
不過這其實也會碰到一個問題,那就是有時候學生花了一兩天解不開之後跑來找我,我卻花了一分鐘就把問題給點出來,並且讓他們發現解答。這時候很有可能會有這種反應:
我是不是又問了一個蠢問題,怎麼這麼簡單的問題要卡這麼久?下次還是多注意一點好了
首先,我看過的程式碼雖然沒有比你吃過的飯還多,但要用經驗來解決你們卡住的問題是綽綽有餘了。大部分在你們眼中看起來難解的問題,在我這邊都是小菜一碟,因為我經驗比你們豐富太多了。
所以當你在想「這麼簡單的問題」的時候,你其實搞錯對象了。對我來說當然是簡單的,你問課程內容相關的問題時都是簡單的,因為課程大綱是我訂的,我對自己教學的內容有一定的把握。可是對你來說,那不會是個簡單的問題,是個困難的問題,而且是個對你來說有價值的問題。
我上面所講的三個條件,說穿了就是你有付出一定的心力試圖解決這個問題,而我這邊也量化了「一定的」心力這件事。一旦滿足這三點以後,這問題對你來說就不是個「簡單的」問題了。
這時就是一個提問的好時機。若是讓自己再卡下去會拖到進度,而且該做的你都做了,你不應該期望哪天突然開竅理解問題,而是應該指望更實際一點的方法:問老師(或是問同學)。
不用擔心我是不是會覺得這是蠢問題,也不用擔心這問題是不是太簡單,這都不關你的事。你做好你的事:查資料之後試圖解決問題,解不開就來問我。而我也做好我的事,引導你找到問題的解答,若是你沒把本分做好,我會跟你說。
我這課程一向都很坦誠,有什麼都會誠實告訴你。我不希望你來猜我的心思,猜說這題是不是太簡單、猜說自己功課是不是有做足。我希望能夠以時間來衡量,當你卡在這問題上太久(一兩天),我覺得就是一個值得問的問題,請果斷來找我求助,我會幫助你判斷這件事,並且引導你找到解答。
當你克服了這個「怕自己問的問題是笨問題」的心理障礙以後,還有第二點,那就是儘管知道自己可以提問,卻不知道該怎麼問。
例如說跟程式碼相關的問題就比較好提問一點,因為你有 code 可以看,也有最後的錯誤訊息或是預期的輸出結果。但除此之外的問題都比較難一點,例如說今天要你做一個留言板你卻毫無頭緒,這個要拿什麼問題來問我?
針對這個點,我希望我們一樣用時間來當衡量標準。當你處於「我有問題,但我不知道問題是什麼,也不知道怎麼提問」的狀態兩天的時候,就來找我聊聊。
「不知道該怎麼提問」也算是問題的一種,所以一樣適用於上面那個標準。對我來說,我一直認為溝通是超級重要的事,有溝才有通。所以不是你自顧自地卡關,而是應該把現況跟我聊聊,就算不用真的問出什麼問題也好,至少讓我知道你現在的狀況是什麼,我們才會在同一頁上面。
除了電腦課的老師以外,我也希望學生們可以把我當作輔導室的老師,就算不是跟電腦相關的問題也可以來找我聊聊,我也都很願意傾聽。雖然能不能解決是另外一回事,但至少我們能夠同步,知道你現在是怎樣的狀況。
每日進度報告到底要寫什麼?
在我的教學計畫裡有個東西叫做每日進度報告,主要是想知道你的學習狀況如何,另一方面也可以當作是個人筆記來使用。
如果不知道要寫什麼,當作日記來寫就好。這邊我之前已經寫過一篇文來做總結,可參考:每一篇心得都有價值——為什麼初學者才更應該要寫心得筆記
沒有自信該怎麼辦?
原本其實是沒有這一題的,畢竟自信這問題真的是靠北難解,但我讀了一些學生的報名信以後突然有了靈感。
如果是以前的我,可能會想盡辦法告訴你說要提升自己的自信,要看自己擁有什麼,而不是自己沒有什麼。
但在這邊,我只想告訴你一件事:
我也跟你一樣。
我也跟你一樣,看到比自己更厲害的人,會覺得自己什麼也不會。我也跟你一樣,看到一些不錯的工作職缺,卻因為覺得自己程度還差得遠而退卻。我也跟你一樣,自信時高時低,但比例大約是 2:8,大多數時候是沒自信的。
你可能覺得我在業界打混了一段時間,寫了這麼多文章也教了一些學生,一定很厲害。你這樣看我,我也這樣看著我覺得厲害的人,在自信這點上我跟你是一樣的。我也會看著那些很厲害的強者,想著自己離他們到底有多遠。
我不會告訴你如何提升自信或是如何處理自信問題,因為我自己也不擅長。我自己在過去的幾年也卡在這問題中,最近有比較好一點,但可能一陣子過後又會卡回去。
我只是想讓你知道,我也跟你一樣。
結語
我知道。
我知道,儘管我講了這麼多,你可能還是會抱持著原有的印象繼續走下去。
你可能認同我說的,認同應該不帶任何既定印象先學程式,認同照著自己的進度走就好,認同不知道怎麼問問題的時候,先發聲求救就對了;也認同心得可以當作日記在寫。
你理性上是認同的,覺得我說的有幾分道理,可是感性上卻不是這樣。
你在學程式卡關時,還是會覺得是不是因為自己數學不好;看到其他同學進度超前許多時,還是會覺得自己是不是太弱;不知道該怎麼問問題時依舊選擇沈默不語,寫心得時依舊句句斟酌、字字推敲,深怕他人覺得你在亂寫。
這我都知道,因為這很正常。
但這沒有關係,至少你已經跨出了第一步。至少你現在理性上同意這些論述,只是感性還沒跟上,還是被原有的思維習慣給綁架了。
要改變這些是需要時間的,但只要你跨出了第一步,需要的也只是時間而已。每一天都比昨天更進步一點,比昨天再多走一點,雖然說不知道終點在哪裡,但至少我們在前進著。