她不知道的事
女兒不知道什麼是 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 — 打開聲音來賓,選一首歌,傳給他。
有時候一首歌,比一千句話更有力量。