跳到主要內容
← 設計日記 聲音來賓
EP.09 · 設計日記

寫程式給女兒的這段日子

她不知道的事

女兒不知道什麼是 git commit。

她不知道爸爸為了一個播放按鈕的動畫調了兩個晚上。不知道「溜了溜了」那句文案是從 12 個候選裡選出來的。不知道音訊代理 endpoint 是因為一個叫 CORS 的安全機制才存在的。

她不知道有一天晚上,爸爸發現 KKBOX API 不提供音訊 URL,整個人呆坐在螢幕前十分鐘。也不知道找到 iTunes Search API 的時候,爸爸一個人在書房裡笑了出來。

她知道的是:

「爸,那個猜歌遊戲今天可以玩嗎?」

這就夠了。


Side project 的真正產出

工程師做 side project 的理由通常是這些:學新技術、練作品集、試試看能不能變成產品。

這些我都想過。Astro 6 是我第一次用,Cloudflare D1 也是。做完之後我的確對 edge computing 有了更深的理解,content collections 的設計讓我對靜態內容管理有了新的想法。

但如果你問我這個 project 最大的產出是什麼,我會說:

是跟女兒一起做事的時間。

不是「陪」她。是「一起做」。

陪小孩是坐在旁邊看她玩。一起做是她參與了設計的一部分 — 她幫忙想文案、她測試遊戲、她選歌單、她提出「換我出題」的需求讓我做了歌手挑戰。

她不是 user,她是 co-designer。

只是她不知道這個詞。


「爸爸你這個壞掉了」

女兒是這個世界上最誠實的 QA。

「爸,按這個沒反應。」— button 的 click handler 沒綁到。

「爸,這個字跑出去了。」— overflow 沒處理。

「爸,怎麼轉圈圈轉好久。」— API timeout 沒設好。

「爸,猜對了但沒有那個灑紙片的。」— confetti 的 z-index 被覆蓋了。

她不會寫 bug report,但她的每一句話都精準地描述了問題。而且她不會顧慮你的面子。成年人在測試的時候可能會說「嗯…這邊好像有一點小問題?」小孩會直接說「壞掉了」。

乾脆。有效率。

我現在有一個新的開發流程:寫完 → 自己測 → 讓女兒測。如果女兒在三十秒內說「壞掉了」,那就是真的壞了。如果她玩了五分鐘沒抱怨,那就是可以上線了。

比任何自動化測試都精準。


深夜的 commit message

做這個專案的大部分時間是晚上十點之後。

女兒睡了,太太在追劇,我坐在書房裡,戴上耳機,打開 VS Code。

那是一段很安靜的時光。螢幕上是 code,耳機裡是女兒白天在遊戲裡猜的那首歌。我一邊修 bug 一邊聽,突然覺得:「這首歌確實不錯。」

有一天晚上我在寫年代歌單,要決定 90 年代放哪些歌手。我打了「張學友」三個字,然後 YouTube 自動播放了〈吻別〉。

前奏一響我就回到了國中。那時候放學回家,書包一丟就打開收音機,聽到這首歌不知道第幾遍了。張學友的聲音從幾十年前穿越過來,在深夜的書房裡迴盪。

我想:有一天女兒長大了,她的「90 年代經典」就是現在的 BLACKPINK 和 NewJeans。到時候她也會在某個深夜,聽到年輕時的歌,然後想起跟爸爸一起猜歌的那些晚上。

然後我寫了一個 commit message:

ux: 年代猜歌加入 90 年代歌單

這行字不會出現在任何使用者面前。但它記錄了一個爸爸在深夜的書房裡,一邊聽老歌一邊寫 code 的瞬間。

Git log 是工程師的日記。只是大部分人不這樣讀它。


專案名稱的秘密

kkbox-sound-guest

到現在我還是沒改這個名字。

有朋友問我:「你都不用 KKBOX 了,為什麼不改名?」

因為這個名字記錄了一段歷程。

kkbox 是起點 — 我從哪裡來。在那間公司學到的東西、交到的朋友、吃過的烤山豬,都濃縮在這三個字母裡。

sound 是核心 — 聲音。這個專案從頭到尾都關於一件事:讓人聽見彼此的聲音。

guest 是願景 — 來賓。每首歌都是一位來賓,帶著某個人的故事來到你耳邊。可能是爸爸的青春、媽媽的畢業舞會、女兒在學校聽到的新歌。每一位來賓都值得被聽見。

改名很容易。mv kkbox-sound-guest music-guess-game,一秒鐘的事。

但有些東西不需要最佳化。它可以帶著過去的痕跡,繼續走向未來。


給工程師爸媽的話

如果你也是工程師,也有小孩,我有幾個小建議:

把你的技能變成跟孩子的共同語言。 你會寫程式,你的小孩對程式沒興趣 — 這很正常。但你可以用程式做出他有興趣的東西。猜歌遊戲、畫圖工具、故事產生器、任何他喜歡的東西。技術只是手段,連結才是目的。

讓他參與設計。 不是問他「你覺得這個按鈕放哪裡好」(他不在乎),而是問他「猜錯的時候你想看到什麼」。讓他的想法真的變成產品的一部分。他會因此產生ownership — 「這是我跟爸爸一起做的」。

不要追求完美。 你的 side project 不需要 100% test coverage、不需要 CI/CD pipeline、不需要完美的 responsive design。它需要在週六下午女兒拉著你說「爸我們來玩」的時候能跑起來。夠了。

選零成本架構。 不是因為你付不起錢,而是因為付費的 side project 遲早會變成一個你內疚著「我在付錢但沒在用」的東西。零成本意味著零壓力。它可以安靜地等你。

記得存檔。 不只是 git commit。把過程中有趣的對話、女兒的反應、你自己的心情,用任何方式記下來。五年之後,code 不重要了,這些才重要。


尾聲

今天早上,我照慣例在泡咖啡。女兒照慣例在吃早餐。

她拿起我的手機,打開聲音來賓,按下每日挑戰。

聽了兩秒鐘。

「啊!我知道!」

選了答案。綠色圓點。confetti 飄下來。

「爸!第一回合就猜對!🔥 連勝 23 天了!」

我端著咖啡走過去看。

「厲害啊。」

「輪你了,快猜!」

我坐下來,點了播放。

兩秒鐘的音樂從手機喇叭裡流出來。

某個歌手的某首歌。可能很老,可能很新。可能是我的青春,可能是她的日常。

不管是什麼歌,在這個早晨,我們一起聽見了它。


「聲音來賓」設計日記到這裡告一段落。感謝每一位讀到最後的人。

如果你也有想跟家人分享的歌,不用寫 code — 打開聲音來賓,選一首歌,傳給他。

有時候一首歌,比一千句話更有力量。