TinyPilot: Month 40

Michael Lynch

TinyPilot:第 40 個月

一句話總結

燒錄 microSD 出乎意料的困難

亮點

  • TinyPilot 創下有史以來營收第二高的月份。
  • TinyPilot 幾乎已完成將生產轉移至第三方廠商。
  • 我可能已經踏入機械鍵盤的「黑暗面」。

目標成績

每個月月初,我都會訂下想完成的目標。以下是本月目標的達成情況:

盡快將生產轉移至委外製造廠

  • 成果:第一批生產出現小問題,但應該很快就能完成轉移。
  • 成績:B

我們收到了委外製造廠生產的第一批量產裝置,並將在 11 月出貨給客戶。

我原本希望這一批能完美無缺,讓我們得以宣告轉移完成。可惜,組裝過程中出現了一個小錯誤,我們必須在辦公室內修正,因此目前還無法達到從製造商到倉庫再到客戶的順暢流程。

減少 TinyPilot 軟體發布流程中的手動作業

  • 成果:我們省去了一項原本綁定由我執行的手動發布工作。
  • 成績:A

我一直在尋找自動化與簡化 TinyPilot 軟體發布流程的方法。我特別希望讓自己從 TinyPilot 日常工作流程的關鍵路徑中抽身。10 月,我們透過自動化 TinyPilot 網站在新版 TinyPilot Pro 釋出時的更新方式,在這兩方面都取得了進展。

過去,我在釋出新版本後,還得手動更新網站,讓它指向新的下載網址。現在,網站已與我們的更新服務同步,會自動偵測新版本。

制定更完善的 TinyPilot Pro 授權管控計畫

  • 成果:我們尚未在計畫上有任何進展。
  • 成績:F

10 月開發團隊的可用時間比我預期的少,因此我們最終未能就授權管控擬定計畫。

TinyPilot 數據統計

指標2023 年 9 月2023 年 10 月變動
獨立訪客6,2008,700+2,500 (+40%)
銷售營收$83,380.02$98,896.81+$15,516.79 (+19%)
企業訂閱$290.70$290.700
權利金$2,056.30$2,609.84+$553.54 (+27%)
總營收$85,727.02$101,797.35+$16,070.33 (+19%)
利潤$8,644.82$69,280.58+$60,635.76 (+701%)

這是 TinyPilot 史上營收第二高的月份,而我完全不知道原因。我們的數據分析沒有顯示任何特別之處,我也不知道有任何新的評測或提及。我們在2022 年 10 月也出現了強勁的銷售,因此可能只是季節性因素。

我原本預期數字會稍微下滑,因為我一直專注於生產轉移,沒有投入行銷。很高興看到我們能靠著動能維持下去,不過在 2023 年最後幾個月,我也開始加大對成長的投入。

與新製造商合力把 microSD 弄對

消失的磁碟

TinyPilot 裝置的資料儲存在稱為 microSD 的微型磁碟上。在製造商預定寄出 TinyPilot 裝置首批樣品的幾天前,他們注意到我寄給他們的參考機內有 microSD,便問我是否需要 microSD?

TinyPilot microSD 磁碟

原來製造商在物料清單(BOM)中從未列入 microSD,而我也完全沒發現少了它。

幸好,購買與燒錄 microSD 是快速且單純的過程。我們已有一家供應商會製作印有 TinyPilot 標誌的 microSD。我們讓製造商與該供應商對接,並向製造商說明如何將 TinyPilot 的軟體燒錄到 microSD 上。

我與製造商一致認為,為了 microSD 而延後首批樣品並不值得。我們決定讓他們先出貨不含 microSD 的裝置,microSD 則在一、兩週後再補寄。

結果首批樣品出現了太多問題,讓我完全忘了 microSD 的事,而製造商也從未寄來。

確認 microSD 燒錄正確

到了 10 月中,製造商表示他們已修正我在首批樣品中提出的所有問題。他們即將寄來一小批量產批次,應該已完全就緒、可直接出貨給客戶。

我們仍會對首批產品進行額外的品質檢測,確保符合我們自製時的標準。驗證項目之一是檢查製造商是否正確燒錄了 microSD。

直到該批次預定抵達的兩天前,我才想到——我該如何檢查製造商是否正確燒錄了 microSD?我想要確保磁碟上的每一個位元組都正確無誤。

驗證 microSD 並非易事,因此我請 TinyPilot 的支援工程團隊快速撰寫一個 shell 腳本,將製造商提供的 microSD 與我們的「黃金」磁碟映像檔進行比對,並回報任何差異。他們及時在測試前完成了腳本。

首批到貨時,我載入一片 microSD,執行我們的完整性檢查腳本,結果顯示完全相符。太好了!

我們進行了功能測試,一切運作正常。我非常開心。這表示製造商這一批完全做對了,我們可以宣告轉移至第三方製造商的工作大功告成。

就在我準備關閉最後一台測試中的 TinyPilot 時,我注意到一件事。影片設定並非 TinyPilot 出廠的預設值,看起來像是有人在我之前使用過這台裝置。

我關閉正在測試的裝置,重新執行 microSD 檢查腳本。這次腳本理應會回報變動,因為我在測試期間更改了許多設定。然而,腳本卻回報我的 microSD 與黃金映像檔完全相符。

糟了。

雖然腳本在支援工程師的電腦上運作正常,但在我的測試環境中卻總是回傳偽陽性結果。

進一步檢查 microSD 後可以確定,製造商誤解了我們的指示。我們希望他們用一片測試用的 microSD 進行品管,並在包裝出貨給客戶前換成全新燒錄的 microSD,但製造商並未執行更換,因此出貨給客戶的機器內仍是已使用過的 microSD。

幸好,這個錯誤在我們辦公室相對容易修正。我們的在地團隊打開每一盒裝置,將 microSD 重新燒錄回乾淨狀態,重新包裝後再送往倉庫。

長期而言,我們當然不希望在辦公室重新燒錄每一片 microSD。向製造商回報問題後,他們表示確實誤解了指示,並已修改流程,確保每一片送達客戶手中的 microSD 都是全新燒錄映像檔的版本。我們會再次驗證下一批次,但我對這個問題即將結束抱持樂觀。

我本來可以如何避免 microSD 的問題?

microSD 的問題是先前多個錯誤累積的結果:

  • 我沒注意到製造商的物料清單中少了 microSD。
  • 製造商從未寄來 microSD 樣品,而我也忘了追蹤。
  • 直到流程後期我才想到要如何驗證 microSD。
  • 我低估了 microSD 檢查腳本應有的嚴謹程度。

當我審閱物料清單時,只是憑記憶核對,覺得該有的都在,卻沒發現少了 microSD。下次再進行物料清單確認流程時,我會將現有產品拆解,盤點所有零件,再逐一核對是否與製造商的物料清單相符。

這已經是我們第二次遇到製造商承諾跳票的問題,而我仍沒有很好的解法。整體而言,他們大多能掌握任務,但約有 10% 的事項若我沒有追蹤就會被遺忘。我一直在主動提出我還在等待的事項,但這使得像 microSD 或說明書這類看似不重要的零件,很容易在縫隙中被忽略——直到它們阻礙出貨才顯得重要。

我在 microSD 檢查腳本上的投入也不足。當時覺得這只是一次性的腳本,不必像面對客戶的程式碼那樣投注時間與用心。但遇到偽陽性後,我才意識到該腳本在品管流程中的重要性,以及出錯可能帶來的高昂代價。因此,我們正依循建立生產級程式碼的標準流程來重寫該腳本。

我還不確定該如何從頭到尾驗證製造商的流程。過去由我們自行生產時,我們在 Notion 上有一套操作說明,整個團隊都照著做。但我們無法與製造商共用 Notion 工作區,因為他們的作業員並非人人都懂英文。因此,我們提供英文說明,製造商再翻譯成越南文,作業員則閱讀越南文版本。我無法驗證越南文流程是否與英文流程一致。

要求提供品管流程的影片很有幫助。影片以不受語言限制的方式,呈現製造商如何執行品管。但要取得從頭到尾完整流程的影片並不容易。品管流程影片並未清楚顯示用於測試的 microSD 最終仍留在成品中,而我也不確定該如何預防這種情況。

製造商曾邀請我前往越南參觀工廠。我因為今年已經出差到不想再出門而婉拒了,但回頭看,或許那樣就能避免一些昂貴的錯誤。我本來也可以把這個機會提供給在地團隊的成員。

建立客戶成功流程

今年年初,在地 TinyPilot 團隊的工作約有 20% 是客服、80% 是組裝與出貨。隨著我們將製造與出貨轉移至外部廠商,今年這個比例已大幅改變。到了 2024 年初,組裝與出貨應該會降至在地團隊工作的 0%。

問題在於,客服目前仍占在地團隊每週工時的不到 50%,那麼多出來的時間該如何運用?

團隊從年初就一直在討論這個問題。最自然的轉型,似乎是從被動回應支援請求,轉為主動聯繫既有客戶。有些公司稱這個角色為「客戶成功」。

令人難為情的現實是,我很少主動聯繫客戶。這是那種重要但不緊急的事項,我總是忽略。但如果我能教會在地同仁來做,就不再受限於我個人的時間。

我們正在試行一套新的客戶成功流程,步驟如下:

  1. 客服團隊研究在 TinyPilot 上花費較多的客戶(尤其是重複購買者)。
  2. 客服團隊寄送由真人撰寫的電子郵件,提及客戶公司與訂單的具體細節(以免看起來像自動化郵件),並邀請對方通話,討論功能需求或痛點。
  3. 我們與客戶會面,了解他們如何使用 TinyPilot。
  4. 我們將客戶的回饋整合到功能開發藍圖中。

當我以客戶身分收到其他企業的主動聯繫時,通常都能感受到明顯的利己動機。他們會說類似「我們想幫您更了解我們的產品」之類的話,但其實只是想讓我買更多東西。

我希望 TinyPilot 的客戶聯繫能讓人感到是合作關係,而非寄生或貪婪。我認為這將有助於我們將開發藍圖調整為客戶真正想要的功能,並幫助我們發現原本不會察覺的 TinyPilot 新機會。

業餘專案

再見 Ansible,哈囉 Nix

過去幾年我一直使用 Ansible 來管理開發環境,但它有許多讓人困擾的痛點。我在過去幾個月一直嘗試用 Nix 取代 Ansible,現在總算完成了。

我以前就看過Nix Home Manager,但當時不明白它的用處。它管理我家目錄下的檔案?NixOS 不是已經管理整個系統了嗎?

我當時忽略的關鍵在於:

  • Home Manager 在任何 Linux 或 Mac 系統上都能運作,不限於 NixOS。
  • 由於 Home Manager 針對文字檔案進行最佳化,它在管理文字檔案時的介面比 NixOS 更好。

現在,我不再用 Ansible 管理開發系統,而是全部改用 Home Manager 與專案專屬的 Nix flakes。我已經超過一個月沒有執行 Ansible playbook 了。

一個明顯的改變是,我更常使用與定義 bash 別名。我過去新增 bash 別名的流程是:在 Ansible playbook 中加入別名,然後在每台想套用的系統上重新執行 playbook。但在系統上執行 Ansible playbook 速度慢又容易因外部因素失敗,結果常是半數系統有新別名、半數沒有。過程摩擦太大,讓我很少有動力新增別名並將其融入日常習慣。

有了 Nix,現在由 Home Manager 統一管理我所有的 bash 別名。如果我想新增 shell 別名,只要編輯 ~/.config/home-manager/home.nix,然後執行 home-manger switch 來套用變更(其實我已將它縮短為一個 bash 別名:hs)。整個過程不到一分鐘,而且不像 Ansible 那樣會因外部因素而失敗。

我曾嘗試全面轉向 NixOS,但因為我慣用的 Debian 開發環境與 NixOS 之間差異太大,一直遇到困難。使用 Home Manager 是在全面投入 Nix 與保留熟悉的 Debian 工作流程之間,一個不錯的折衷。

我現在成了奇怪的機械鍵盤愛好者

在萊克斯·弗里德曼(Lex Fridman)對 Python 創始人吉多·范羅蘇姆(Guido van Rossum)的訪談中,萊克斯·弗里德曼有一段長篇離題,盛讚他有多愛自己的 Kinesis Advantage 2 鍵盤。

Kinesis 是機械鍵盤的知名廠商。其鍵盤的特色在於按鍵位於凹陷的鍵井中,且鍵盤左右兩半相隔數英吋。

萊克斯·弗里德曼非常喜愛他的 Kinesis Advantage 2 機械鍵盤。

萊克斯·弗里德曼非常喜愛他的 Kinesis 鍵盤,甚至在搭飛機時也會隨身攜帶,寧願扛著一塊巨大的鍵盤,也不願使用筆電內建的按鍵。

我從 14 歲起就一直使用某款 Microsoft 人體工學鍵盤。我喜歡它,但不像萊克斯·弗里德曼談起 Kinesis 那樣熱愛,因此過去幾個月我開始對機械鍵盤感到好奇。

Microsoft Natural Ergonomic Keyboard 4000,我直到最近仍在使用的主力鍵盤

我只認識幾個使用機械鍵盤的人,但過去從未理解其吸引力。他們想鑽研某個嗜好也無妨,但我覺得自己從鍵盤上能獲得的最大樂趣相當有限,何必費心?

後來,我開始好奇並閱讀更多關於高階鍵盤的資訊。我清醒時的大部分時間都在鍵盤前,或許我應該投資優化這方面的體驗。

在研究了 Kinesis、Ergodox 和 ZSA 等幾個選項後,我最終選擇了Kinesis Advantage 360

我剛換成Kinesis Advantage 360 鍵盤。

使用這把鍵盤的第一天真的很掙扎。我的打字速度只剩平常的 5%。由於有許多文書作業要處理,我隔天早上便暫時擱置了它。

第二天稍微輕鬆一些,但仍具挑戰性。我堅持下去,現在打英文文章時的速度已經比以前快,但寫程式時反而變慢。我還不習慣這把鍵盤上 [{= 等字元的位置。即使已重新對應按鍵以便操作,仍在努力建立肌肉記憶。

我看過其他人的評論,說他們習慣 Kinesis 後再切回一般鍵盤也毫無問題,但我的經驗並非如此。當我換回 Surface Pro 6 上擁擠的筆電鍵盤時,會打出大量錯字。或許最終我會重新適應兩者。

雖然有 60 天的退貨期限,但到目前為止,我相當確定會繼續使用 Kinesis。

總結

完成了什麼?

  • 我們出貨了由委外製造廠生產的首批 TinyPilot Voyager 2a 裝置。
  • 我們省去了 TinyPilot 發布流程中的手動作業。
  • 我換成了機械鍵盤。

經驗教訓

  • 更積極地追蹤製造商的承諾。
    • 這是我之前就犯過、卻未正確處理的錯誤。
    • microSD 事件重演了同樣的模式:製造商承諾要做某件事,我以為他們會處理,我們雙方都忘了,最後導致後續問題。
    • 我需要開始記錄他們的承諾,並每週檢視進度,以防他們遺忘。
  • 逐項核對物料清單。
    • 當製造商數月前寄來物料清單時,我只是憑印象確認預期會看到的項目,卻遺漏了 microSD 消失的事實。
    • 未來再進行物料清單確認時,我會將現有產品拆解、盤點所有零件,再逐一驗證是否與製造商的物料清單相符。

下個月的目標

  • 盡快將生產轉移至委外製造廠。
  • 進行五次客戶訪談。
  • 清空 TinyPilot 辦公室內所有舊庫存與備用零件。

原文由 Michael Lynch 發布

本文章由 muse-spark-1.2-contributor 進行翻譯