一些希望當我學習如何 coding 時能夠有人告訴我的事情
還有我從教導他人中學到的事
※ 本文翻譯自 Medium 上 Cecily Carver 所寫的 "Things I Wish Someone Had Told Me When I Was Learning How to Code"。原文可以參考這裡 。
---
在你學習寫程式前,先想想你想要寫什麼樣的程式
知道如何寫程式就像是蓋東西一樣,而且當你對於目標有明確的認知時,你的學習之路會清楚許多。但假如你的目標只是 "學會怎麼寫程式" 而沒有對於你要寫的程式沒有個清楚的印象,或者是抱持著他們會改變你的生活的願景,那你會發現這個過程會相當的令人挫折。對於要承認當初學習資訊科學是為了想要證明我很聰明,而且希望能得到一個屬於聰明人的工作這點,我覺得有點害羞。另外,我也很喜歡思考數學及理論 (An Eternal Golden Braid [#1] 這本書在我的啟蒙期震憾了我),而寫程式相當適合結合這兩者。雖然這些東西並不足以長久滿足我,但在之後我找到了令外幾個我喜歡而且能跟科技連結的興趣,像是音樂,還有文學。
所以,你到底想要寫怎麼樣的程式?架網站?遊戲?iPhone Apps?一個能夠讓你賺錢的創業計畫?互動藝術?你想要讓你的老闆對你感到滿意,又或是你想要把某些乏味的工作自動化好讓你有更多的時間來看水獺的照片?或許你只是想要讓自己 "增值",在履歷表上再多幾行贅字,又或是讓自己滿足你的學業需要。這些都是很好的目標,只要你確定哪一個是你當初的目的,然後朝著目標學習。
寫程式沒有什麼神奇的
Coding 這回事,就跟其他的技能一樣。跟學習新語言差不多的是,程式語言同樣也有單字跟文法需要學習。跟數學一樣,對於不同種類的方法,有各種不同的方法來解決它們。像各種手工藝和藝術創作,人們歷經了夠久的時間,專精不同的工作,有了最好的技術和工具,然後才有足夠的自由來選擇,棄置,或再修改它們。這個人 (譯註:Joel Spolsky) (非常聰明的人! 他寫的其他東西讓我相當折服也讓我常有共鳴!!) 曾指出一個真的有想法的程式設計師跟其他在這領域中那些缺乏知識的人有個像發光的線般的明確分別,那個發光的線,據他表示,代表的是指標和遞迴的觀念 (好奇的人在這裡跟這裡有一些補充)。
我是在學校學到指標跟遞迴的,當我終於了解它們的時候,我的腦袋感到了一陣愉快的震顫 ーー 那種促使我想學習資訊科學的原動力。但是出了教室後,我在了解了新概念跟把事情做好時的那種感覺就隨次數減少。然後在我教其他人時的滿足感,同樣的,也一遍又一遍減少。我也曾看過有人在完成有趣又有酬勞的專案時是對有趣及有酬勞其中一樣其實是一無所知的。
在被程式嚇倒或是設想自己是不是足夠聰明間並沒有什麼交集。當然,你要作越複雜或越深奧的工作,你當然越需要越精湛的技術來完成。但這在幾乎其他任何領域也同樣適用。除非你真的想完全靠自己寫的 code 來吃飯,不然你其實沒什麼必要只是為了想寫你需要的程式執意去成為什麼複雜迴圈天才。
寫程式不會一次就成功
- 然後第二次跟第三次同樣也可能不會
當你一開始學寫程式時,一定會很快就會遇到這種鳥事:你覺得你把所有該做的事情都做好了,你有確認,再三的確認過了,但是,程式還是一樣,不會動。你完全對於從哪裡開始除錯毫無頭緒,而且錯誤訊息(假如你很幸運還有個錯誤訊息能參考的話)看起來就像是在嘲諷你 [#2]。在這個時候,你可能很快就會氣到想放棄,覺得你一輩子都找不到癥結何在。我第一次有著這種經驗是我在試著寫一個 C++ 的程式時,按下執行,然後就只得到個 "segmentation fault" 表示我錯了。但是對程式設計師們來說,這其實是每個人都會有的經驗,跟你所擁有的知識,實務經驗甚至是適不適合絕對無關。當你是個初學者時,你會碰到,當你是個富有經驗的人時,一樣會發生。其中最大的差別在於你對這有什麼反應。
我發現到在新手設計師和老練的設計師間最大的差別在於 "信仰" [#3]:相信 "事出必有因",有個邏輯性的失誤及能夠發現的理由:相信這些問題能修得好,相信有個方向能夠達成目標。從 "完全不會動" 到 "圓滿完成" 的道路或許不是那麼明顯,但是憑藉著耐性你通常就能找到。
旁邊一定會有人跟你說你 coding 的方式是錯的
"大括號不應該在同一行","大括號就應該在同一行";"用 tab 來縮排","tab 是萬惡的啦"。"你應該用預儲程序",但 "實際上你不應該用";"你應該為你的程式加上註解",但 "真正好的程式碼才不需要加註解"...對於一個單一的問題,幾乎大部分的問題都能用不同的方法來解決它們,而不是只有一個 "標準解答"。很多設計師會崇尚自己所偏好的方法並對它們用的駕輕就熟,不過那並不代表那就是真理。與人當面對質而且被人說自己是錯的,然後再想辦法證明說假如對方真的是正確的,這是我在早期的生涯中覺得壓力最大的事情之一。
假如你在一個團隊中跟其他人一起 coding,那有很大機會裡頭會有人會拿隨便一件事對你的所為大做文章。有時候他們會是正確的,而且對於了解你在哪裡作錯了而來花心思調查絕對是值得的。不過也有時候他們只是廢話,單純的要你遵照傳統或是遵守沒什麼意義的守則或是你最好照著寫作風格什麼的,那就算了吧。
換個角度想,假如你自認是個墨守成規的人 (文法狂人們,我就是在說你們),那你就來對地方了。
旁邊一定會有人跟你說你不是真正的 coder
"寫HTML才不是真正的coding","你不用 vi/vim 的話你就不是專業","真正的設計師都會寫C","真正的設計師才不用Windows","有些人天生就是學不來啦","你不應該來學coding","你才不是什麼程式設計師呢 (但是我是喔)"...所謂的 "coding" 對不同的人來說可以代表不同的東西,而且從以前跟從現在看也不太一樣。另外一件有趣的事情是,那些無論對於新手或老手都可以幫助他們作的更快更簡單的新工具,套件還有 framework 什麼的有絕大多數都會被掛上 "不是為真正的 coders 而製" 的標籤 (參見: Return of the Real Programmer)。
在這些事情後面潛藏的是一個假如所有人都會說他們是程式設計師,那這個頭銜就貶值了 的恐懼,但我覺得這種自認把關的心態是具有毀滅性的。
善用工具來以最簡單的方法來作你想要的東西。假如這代表你的遊戲是用 Stencyl 或是 GameMaker 來作的而不是從頭開始,那OK。假如你學程式是以HTML或是Excel巨集起手的,也沒關係。用你感覺最習慣的工具來作。
當你越來越習慣這些工具時,你自然就慢慢會發現原本這些工具的限制,或是想要去找個更好用的新玩意兒。不過在絕大多數的時間,不會有什麼人去計較你寫的程式碼甚至是你用什麼寫 ーー 而是計較你作出了什麼東西。
把 "覺得自己宅不宅" [#4] 這件事放在心上會慢慢毀掉你
再看一次上面,我曾經很擔心這回事,特別是在學校的時候,像是我從自己的服裝,台風,閱讀喜好,甚至是自己慣用的軟體及偏好設定而覺得自己"並不是真正的技客"(而且因為這樣會在科技社群裡得不到接納)。這是一件極為浪費心力的工作,而且當我決定把這些煩惱忘掉後,我的作業效率大增。你需要將這個放在心中:你的 coding 好不好跟你有沒有把自己融入一些技客的次文化 沒有關係 。當你越深入進而發現自己不會完全融入時,這更為重要。你應該要把證明自己的精力放在實際作些東西上。尤其當你是個好勝的技客,在團體中評估其他人的程度而每每都讓自己的眼球從眼窩掉出來時,你更需要把這件事放在心上。有時候你想的東西跟它所代表的東西並不相同。
黏著在寫程式上比找好方法更重要
我們從來不缺寫程式的 "正確方法" 或 "最佳方法" 這類的文章,而且還有更多潛藏的方法及觀點。像是你應該 "從書本中學習觀念",或是 "從完成互動學習中獲取經驗",或甚至是 "從別人寫好的程式中除錯來學習"。當然對於你要從這麼多的程式語言中挑一個作為你的第一步時,每個語言也有不同的主張。有個對於 "自學寫程式" 的課程或是作業坊這類事物常見的抱怨是你會在一開始學習時感到如沐春風,但很快的就會隨著學習曲線漸陡而踢到鐵板。你知道了怎麼在頁面上顯示些文字,但是卻還是不知道要從哪裡開始才能做出一個 "真正的",而且實用的專案。你會覺得你只是照表操課卻沒有真正了解,然後開始怪你所學的教材真的很爛。
當你到達了這個階段,那其實大部分的教學及線上資源對你來說已經沒什麼實用價值了,因為這些東西都是以假設你是個有經驗,而且已經駕輕就熟的設計師為前提。在你 "不知道我究竟不知道什麼" 的情形下,這個問題會更加嚴重,因為光是要找出接下來要學的是什麼本身就是個問題。
無論你用哪種學程式的教材或課程都不免會撞到這堵牆,而經過這個階段的唯一方法就是持之以恆。這代表你就繼續挖掘新東西,了解更多資料,搞懂怎麼運作,然後一片一片的慢慢拼湊出怎麼建置出你自己的專案。假如你有個明確的點子跟知道你是為了什麼而學程式的話,那你就有越多的機會在最後找到成功。
假如你持續把磚塊一塊一塊往上疊,縱使要花很多時間,但最後你終究會堆出一道牆。這也是我在稍早所提到的 "信仰" 之一。假如你相信只要持之以恆你就能知道 coding 究竟是怎麼一回事,那隨時間過去 ーー 你就真的能知道。
[#1] 中譯板書名為《哥德爾、埃舍爾、巴赫:集異璧之大成》。
[#2] 原文是寫 "as well say "fuck you."",不過直翻的話嘛實在...
[#3] 原文作 "faith",考慮到無礙流暢度所以直翻。
[#4] 原文作 "geek cred"。作為技客的名聲?
---
生平第二次 (還是第三次?) 翻譯整篇英文文章, 小試身手也希望對有同樣目標的人有所幫助.
寫的真好 我是初學者 很有同感
回覆刪除