每天寫程式

擺脫焦慮,開始寫扣:Side Project 起死回生的日常魔法

每天寫程式
Photo by Alexander Nrjwolf / Unsplash
原文: Write Code Every Day
作者: John Resig

去年秋天,我的 side projectKhan Academy 的正職工作之間產生了衝突:我發現自己無法在兼顧工作效率的情況下,讓 side project 有明顯的進展。

我處理 side project 的方式主要有幾個問題。我大多在週末,以及週間的晚上進行 side project,但這個策略對我來說成效不彰。我給自己很大的壓力,想要在週末完成盡可能多、品質也好的程式碼。如果沒能達成目標,我就會感到很沮喪。但週末不一定每次都有空,我也不是每個週末都想整天寫程式(少了放鬆和娛樂的時間)。

一週不碰程式碼其實是很長一段時間,很容易忘記自己做到哪個部分,或是之前在做什麼(即使有做筆記也一樣)。更別提如果錯過一個週末,就會變成兩個禮拜的空窗期。這種長時間的上下文切換,對 side project 來說往往是致命的(我的許多 side project 就是這樣胎死腹中的)。

受到 Jennifer Dewalt 去年完成的壯舉——180 天內建立 180 個網站自學程式設計——的啟發,我決定嘗試類似的策略:每天都寫 side project 的程式碼。

插圖由 Steven Resig 繪製

我為自己訂了幾條規則:

  1. 每天都要寫程式碼。我可以寫文件、部落格文章等等,但這些都必須建立在寫程式碼的前提之下。
  2. 程式碼必須是有用的。不能只是調整縮排、重新排版程式碼,也盡量避免重構。(這些事情可以做,但不能是當天唯一的產出。)
  3. 所有程式碼都必須在午夜前完成。
  4. 程式碼必須是開源的,並且要上傳到 GitHub。

有些規則是我自己隨意訂的。程式碼不一定得在午夜前完成,但我希望避免熬夜趕工,寫出品質低落的程式碼。程式碼也不一定要開源或上傳到 GitHub,但我這樣做是為了讓自己更謹慎地對待寫出來的程式碼(思考程式碼的重複使用性,並在開發的早期階段就決定要建立哪些模組)。

到目前為止,這個策略非常成功,我已經連續寫了將近 20 週的程式碼。我想把這個經驗寫下來,因為它徹底改變了我寫程式的方式,也對我的生活和心態產生了重大的影響。

改變習慣後,我觀察到一些有趣的現象:

最小可行程式碼: 我強迫自己每天至少要寫 30 分鐘的程式碼。(要寫出有意義的程式碼,其實很難在更短的時間內完成,尤其在回想起前一天的進度之後。)有些工作日我會寫比較久一點(通常不超過一個小時),週末則有時候可以寫一整天。

程式碼成為習慣: 值得一提的是,我並不特別在意 GitHub 上的貢獻圖表看起來如何。我認為這是這個實驗最重要的啟示:這是你為自己做的改變,而不是為了滿足別人的期望。這就像任何形式的節食或運動:如果你不重視自我提升,你就永遠不會成功。

克服焦慮: 在開始這個實驗之前,我經常會因為沒有完成「足夠多」的工作或沒有取得「足夠多」的進展而感到焦慮(這兩者都很難量化,因為我的 side project 沒有明確的 deadline)。我發現,「感覺有進展」和實際取得進展一樣重要。這真是讓我恍然大悟。自從我開始每天穩定地推進 side project 後,焦慮感就逐漸消失了。我對自己的工作量感到安心,不再有那種拼命趕工的壓力。

週末的改變: 過去,週末的工作對 side project 的進展至關重要(因為那通常是我唯一能專心寫 side project 程式碼的時間)。但現在情況不同了——而且這是件好事。過去,我對週末的工作抱有過高的期望,結果往往以失望收場。我很少能完成所有想做的事情,而且為了完成工作,我不得不放棄其他喜歡的週末活動(例如吃港式飲茶、逛博物館、去公園、和另一半相處等等)。我強烈認為,雖然 side project 很重要,但不應該因此犧牲生活。

背景處理: 每天寫 side project 程式碼,還有一個有趣的副作用,那就是你目前的任務會經常在你的腦海中盤旋。因此,當我去散步、洗澡,或從事任何其他不需要動腦的活動時,我都會思考等等要寫哪些程式碼,以及如何解決問題。這在我一週或兩週才寫一次程式碼的時候,是不會發生的。那時候,我的腦袋裡想的都是其他的事情,不然就是擔心 side project 沒有進展而感到焦慮。

上下文切換: 重新開始 side project 的時候,一定會需要一些時間來切換上下文。在做了一整個禮拜的其他工作後,要重新思考 side project 的內容非常困難。每天工作在這方面很有幫助,因為工作之間的時間間隔縮短了,也比較容易回想起之前的進度。

工作與生活的平衡: 這個改變最重要的面向之一,就是學習如何更好地平衡工作、生活和 side project。由於知道自己 每天都必須 處理 side project,我必須更有效率地安排時間。如果我晚上有約,而且會很晚才回家,那我會在開始 Khan Academy 的正職工作 之前 ,先處理 side project。此外,如果我還沒完成 side project 的工作,而且晚上有約,我會趕快回家完成(而不是乾脆放棄那一天的進度)。我發現自己花在嗜好(例如版畫)上的時間變少了,但這是一個我可以接受的取捨。

外界的認知: 這個新習慣還有一個額外的好處,那就是讓其他人知道我的新習慣。我的另一半知道我每天都必須完成 side project,因此有時候會配合我的時間安排活動。能夠說:「我們可以出去玩/看電影等等,但我等等得寫程式。」而且對方能夠理解並納入考量,這讓我感到安心許多。

程式碼產量: 我很難相信自己在過去幾個月寫了這麼多的程式碼。我建立了幾個新的網站、重寫了一些框架,並建立了大量的 Node.js 模組。我寫的程式碼多到有時候會忘記自己做了什麼——即使是幾個禮拜前的工作,也感覺像是很久以前的事了。我對自己的產出感到非常滿意。

我認為這個習慣的改變非常成功,我希望能夠盡可能地持續下去。同時,我也會盡力向所有想完成 side project 的人推薦這個策略。如果你覺得這個技巧有效或無效,歡迎與我分享你的經驗!我很想聽聽不同的故事!