TinyPilot: Month 11

Michael Lynch

TinyPilot:第 11 個月

原文由 Michael Lynch 發布,訂閱此部落格

一句話總結

該如何提高 TinyPilot 的利潤率?

重點回顧

  • 儘管月營收達到 3 萬美元,TinyPilot 幾乎只是勉強打平成本。
  • 我正在探索各種方式,讓大企業願意為 TinyPilot 付出更高的價格。
  • 我必須正視一個現實:管理人,本身就是一份正職工作。

目標評分

每個月月初,我都會公布當月想達成的目標。以下是這次的達成狀況:

將 TinyPilot 營收提升至 3.3 萬美元

  • 結果:將 TinyPilot 營收提升至 3.9 萬美元
  • 評分:A

在 IT 硬體領域最具影響力的部落格/YouTube 頻道之一 ServeTheHome 的一篇重磅評測刊出後,TinyPilot 的銷量大幅飆升。

將 TinyPilot 的營運完全遷移至新辦公室

  • 結果:TinyPilot 已完全在新辦公室運作
  • 評分:A

我們終於把 TinyPilot 的營運據點從我家搬到真正的辦公室。過程中有幾天壓力不小,例如一度不確定能不能在 Linux 上把列印功能搞定,但整體來說搬遷相當順利。進貨的零件直接寄到辦公室,員工在辦公室組裝、測試產品,出貨的訂單也從辦公室寄出。

針對 Refactoring English 的目錄收集回饋並進行迭代

  • 結果:我收集了回饋,但還不確定該如何整合
  • 評分:B

我從 Write Useful Books 社群以及我的電子報訂閱名單收集了回饋。在 202 位訂閱者中只有 6 個人回覆,比我預期的少了一些,但仍提供了很有幫助的回饋

大家似乎對「寫出更好的部落格文章」這類宏觀主題更感興趣,而對講解如何改善動詞用法的章節興趣較低。我想重新調整順序,把有趣的部分往前放,但又不太確定該怎麼做,因為後面的章節是建立在前面的基礎之上的。

令人興奮的成果自然比基礎功更吸引人。如果我寫一本關於打造電玩的書,大家會對「如何打造具備智慧 AI 的敵人」這類章節感興趣,而可能對「線性代數基礎」沒什麼興趣。這不代表我可以直接跳過基礎,但或許意味著我需要在教授基礎的同時,想辦法讓課程保持實用、易於應用。

TinyPilot 數據

指標2021 年 4 月2021 年 5 月變化
不重複訪客5,8807,283+1,403 (+24%)
總瀏覽數10,48313,267+2,784 (+27%)
銷售營收$28,880.65$38,767.77+$9,887.12 (+34%)
利潤$843.56$6,858.72+$6,015.16 (+713%)

TinyPilot 迎來了有史以來第二好的月份。在這樣的銷售規模下,一切仍能順暢運作,讓人很振奮。1 月份遇到類似的爆單潮時,我們曾被搞得人仰馬翻。幸好我們已經改善了訂單出貨流程,所以這次所有系統都正常運作。

我就只是個主管

2012 年到 2014 年間,我在一家名為 iSEC Partners 的公司擔任軟體安全顧問。我的主管 Peter 管理著整個紐約團隊。他常常自嘲說:「我就只是個主管——是管銷費用。」他會這麼說,是因為當所有員工都在做有生產力的工作時,他覺得自己只是公司官僚體系的一部分。

但 Peter 是個非常出色的主管,這點大家心知肚明。我想他之所以會開玩笑說自己的角色不重要,是因為管理工作讓他比較少時間參與公司裡更有趣的事,像是安全研究和工具開發。

現在我對 Peter 的感慨感同身受。我常常忙到一天結束時,覺得自己一整天就只是在寫電子郵件。但退一步想,我也能理解為什麼會有這樣的日子。現在有很多人一起在做 TinyPilot:

  • 三位遠端軟體開發者
  • 三位負責庫存、組裝與出貨的在地員工
  • 兩家在 3D 列印與電機工程方面與我密切合作的廠商

總共八個人,我每週至少會跟他們聯繫一次。除此之外,還有其他需要往來的對象與服務,像是辦公室房東、人資/薪資服務商、我們的知識庫,以及用來追蹤庫存的工具。而客服與銷售目前只有我一個人在處理。

考慮到這些,我花大部分時間只是在回電子郵件,似乎也就合理了。我需要調整策略,更徹底地擁抱管理工作。

別去做團隊成員也能做的事

我現在做過最蠢的事情之一,就是去接那些團隊裡其他人明明也能勝任的任務。上個月我才提到我每天只有一小時能寫程式。仔細想想,我根本連那一小時都不該拿去寫程式,因為我的隊友也能寫程式,而我卻在只有我能做的任務上落後了。

把「只有 Michael 能做」的事交出去

有幾項任務理論上別人也能做,但實際上卻不行,因為目前只有我擁有必要的權限或知識。

這些任務大多是橫跨不同領域或職能的,例如管理只有在地員工會用到的工具。以下是我應該委派出去的事項(依與我脫鉤的難易度由易到難排序):

  • 管理串接 Shopify 與庫存試算表的膠水程式碼。
  • 管理用於建置 TinyPilot 量產映像檔的腳本。
  • 管理庫存試算表中的公式。
  • 回覆客服問題。
  • 對 TinyPilot 的版本進行最終 QA 測試。

月收 3 萬美元怎麼還不賺錢?

前陣子我跟女友抱怨,說 TinyPilot 成長遇到的許多問題很可能都有簡單的解法,只不過我因為沒有接觸到跟我經營類似事業的人,所以不知道。她問我想找誰請教,並指出我其實只要想好人選,直接寫信給對方就好。

第一個浮現在我腦海的人是 Mike Perham,Sidekiq 的創辦人。Mike 在 Indie Hackers 上的訪談是我最喜歡的訪談之一。我還在 Google 擔任員工時就聽過,而他的事業一直以來在我心中都是獨立軟體事業的理想典範。他靠著撰寫開源軟體,每月賺進約 8 萬美元。最棒的是,客戶是在自己的機器上運行 Sidekiq,所以幾乎不可能出現需要他立刻處理的緊急狀況。

我跟 Mike 並不認識,所以我寫了一封自我介紹的信,問他對 TinyPilot 有沒有什麼建議。他隔天就回信,提供了好幾個慷慨的建議。其中最讓我印象深刻的,是他對我財務狀況的反應:

把利潤拉起來。5% 的利潤率不是一門健康的生意。要嘛壓低成本,要嘛稍微調整一下價格,不然就找個接近純利潤的純軟體加值服務。

這番話如當頭棒喝。我知道自己的利潤很低,但月收 3 萬美元還是讓我覺得處境應該不錯。但用 5% 利潤率的角度來看,情況就完全不同了。

根據 Mike 的建議,我更仔細地檢視了支出。我還沒完成 5 月的記帳,所以這裡以 4 月為例。

TinyPilot 各項支出的圓餅圖

依類別區分的 TinyPilot 支出

類別總計
原物料$15,637.68
軟體外包$9,331.79
在地出貨人員$1,460.12
郵資$1,262.53
電機工程顧問$901.25
辦公室租金$550.00
廣告$370.00
律師$270.00
辦公設備$233.72
平面設計$169.00
貼紙$163.63
雲端服務$176.33
雜項$161.21

原物料成本並不讓人意外。實體產品的利潤率通常約在 50% 到 60%,所以 3 萬美元的銷售額對應到 1.5 萬美元的成本,符合我的預期。這部分幾乎沒有壓縮空間,因為我購買的材料沒有更便宜的替代品。有些像是線材這類小東西,我為了品質會多付一點錢,但那在一台售價 300 美元的產品上,差異不過 1 到 2 美元。真正昂貴的零件是那些沒有更便宜替代方案的東西,例如 Raspberry Pi 或 HDMI 擷取晶片。

第二大的支出是軟體開發,這看起來或許有點奇怪,畢竟我自己就能寫程式。問題在於,要寫好程式需要不被打斷的專注時間,而 TinyPilot 有太多非軟體的瑣事,讓我無法擁有那樣的時間。2020 年底,TinyPilot 的軟體開發幾乎陷入停擺,就是因為我是唯一的開發者,卻忙於處理推出新產品所帶來的各種後勤事務。

我可以聘請更便宜的開發者,但那很快就會演變成災難。我合作的開發者都特別優秀。他們維持了程式碼的高品質,讓軟體得以持續維護、保持低錯誤率。

我曾與較便宜的開發者(約每小時 30 美元)合作過,他們要嘛根本搞不定工作,要嘛就是用粗糙的作法硬做,導致後續出現錯誤與維護上的麻煩。如果我用低價開發者來組建這個專案,程式碼庫不出幾個月就會變成難以維護的惡夢。

除此之外,我沒有其他能有效削減的支出。第三大的支出是在地出貨人員,但就算砍掉 50% 的成本,整體支出也只會減少 2.4%,所以不值得去動一個已經運作良好的系統。

要遵循 Mike Perham 建議的另一個方法,就是提高營收。

從大客戶身上獲取價值

今年稍早,我和一家大型企業的 IT 主管聊過。他非常喜歡 TinyPilot,想在公司內大力推廣,用它來取代舊有的、每台要價 2,000 美元的企業級設備。結果還真的成功了!該公司在其中一個部門部署了 40 台 TinyPilot,還計畫要再增加。

猜猜 TinyPilot 從這次部署中賺了多少?零。

他們沒有向我購買硬體,而是自己動手組裝裝置。而由於軟體採用了寬鬆的開源授權,他們完全可以免費在公司內使用,不必付給我任何費用。

這在開源領域是極為常見的問題。寬鬆的授權有助於讓更多人發現你的產品、並鼓勵他們使用,但同時也讓大企業得以白白利用你的成果,卻什麼也不回饋。

我也為此請教了 Mike Perham。以下是他的回覆:

聽起來你的授權讓大客戶把你吃得死死的。這是你的程式碼,對吧?改掉你的授權吧,例如只允許業餘愛好者以個人、單一實例的方式使用。MIT 或 BSD 授權很適合用來分享程式碼,但要用來做生意就不太適合了。

某種程度上算是我的程式碼。我合作的特約開發者都有簽約,約定他們貢獻的程式碼智慧財產權歸我所有,但我也接受過少數志工開發者的貢獻。據我的理解,那些無償貢獻程式碼的開發者,技術上是與我共同擁有 TinyPilot 程式碼的著作權。

我當初將 TinyPilot 以 MIT 授權釋出,是因為它能給我彈性。我認為我可以自己把程式碼「分支出來」改用不同授權,然後聲明它同時也使用了 MIT 授權的程式碼,但我不太確定實際上該如何運作。

我思考了幾個能從大型企業客戶身上獲取更多價值的方法,整理如下:

為 TinyPilot 提供企業版功能

有一項只有大客戶會提出、其他人都不會要求的功能,那就是對 TinyPilot 的程式化存取。例如:「我想監控遠端畫面,偵測目標裝置何時當機,然後自動發出警報。」

我打算與大客戶洽談推出具備此類功能的 TinyPilot 企業版,並收取高額費用。我想像每台裝置每月 50 美元這樣的價格,對家庭使用者來說簡直荒謬,但對財富 500 大企業而言,如果能省去他們自行開發好幾週的時間,這點錢根本不算什麼。

提供 SaaS 加值服務

如果與裝置處於同一個區域網路內,TinyPilot 很好用,但如果客戶想透過網際網路遠端存取 TinyPilot,目前就得依賴第三方解決方案。我已經向幾位客戶提過「TinyPilot 雲端入口網站」的構想:一個安全的網頁介面,讓他們無論身在何處都能透過網際網路遠端存取自己的 TinyPilot 裝置。

這會是一個不錯的軟體即服務訂閱機會,可以在 TinyPilot 硬體產品之外,提供一個利潤率更高的互補產品。

不過,我還是想避免自己去維運一個需要隨時待命的服務。我正在探索與能夠負責服務營運層面的廠商合作的可能性。

諮詢專精開源授權的律師

關於開源授權,我還有很多不了解的地方,所以我應該去找一位律師,弄清楚我有哪些選項。理想的授權模式是讓個人使用者能以可負擔的價格在家中試用,然後在企業環境中使用時再採用更昂貴的商業授權,類似 Sidekiq 的作法

舊有專案

以下是一些我仍在維護、但已非開發重心的專案的簡要更新:

Is It Keto

指標2021 年 4 月2021 年 5 月變化
不重複訪客56,09449,085-7,009 (-12%)
總瀏覽數123,723108,862-14,861 (-12%)
網域評分(Ahrefs)11.011.00
AdSense 營收$560.20$466.84-$93.36 (-17%)
Amazon 聯盟行銷營收$116.78$138.99+$22.21 (+19%)
總營收$676.98$605.83-$71.15 (-11%)

Is It Keto 仍在背景持續運作,但這個月我難得花了一點時間處理它。許多 Amazon 聯盟行銷連結已經過期,指向已經不存在的商品,所以我花了幾個小時把它們修好。

隔了好幾個月再打開程式碼,實在很誘人會想一頭鑽進去把網站東修西改。但我得克制自己,因為把專注力盡量放在 TinyPilot 上對我更有幫助。

Hit the Front Page of Hacker News

指標2021 年 4 月2021 年 5 月變化
不重複訪客114191+77 (+68%)
Gumroad 營收$341.61$417.85+$76.24 (+22%)
Blogging for Devs 營收$109.20$0.00-$109.20 (-100%)
總營收$450.81$417.85-$32.96 (-7%)

這門課程每月仍有幾筆銷售,但我沒有花太多時間去推廣它。

其中一個亮點是 Dan Willoughby 實踐了課程中的觀念,撰寫了一篇文章並登上了 Hacker News 第二名。而且他不是靠什麼「成長駭客」手段來操縱系統。他只是花時間寫了一篇高品質的文章,就獲得了應有的迴響。看到這個成果,感覺真的很棒。

Zestful

指標2021 年 4 月2021 年 5 月變化
不重複訪客892659-233 (-26%)
總瀏覽數2,1321,784-348 (-16%)
RapidAPI 營收$40.82$32.85-$7.97 (-20%)
總營收$40.82$32.85-$7.97 (-20%)

儘管 Zestful 仍處於維護模式,上週末我還是發布了一個官方 Python 套件。這是我一直覺得這個專案應該要有的東西,但因為我不知道如何發布 PyPI 套件,所以一直拖著沒做。今年 3 月在把玩 Restic 時終於學會了怎麼發布,所以就順勢運用這個知識,為 Zestful 做了一個套件。

現在,使用者可以在幾分鐘內就開始使用 Zestful。像這樣安裝套件:

pip install zestful-parse-ingredient

接著,匯入 parse_ingredient 模組,並傳入一個食材字串:

import json
import parse_ingredient

ingredient = parse_ingredient.parse('2 1/2 tablespoons finely chopped parsley')
print(json.dumps(ingredient.as_dict()))

然後你會看到像這樣的 JSON 輸出:

{
  "quantity": 2.5,
  "unit": "tablespoon",
  "product": "parsley",
  "productSizeModifier": null,
  "preparationNotes": "finely chopped",
  "usdaInfo": {
      "category": "Vegetables and Vegetable Products",
      "description": "Parsley, fresh",
      "fdcId": "170416",
      "matchMethod": "exact"
  },
  "confidence": 0.9858154,
}

總結

完成了哪些事?

  • 將 TinyPilot 的營運從我家搬到真正的辦公室
  • 與庫存管理人員合作,將所有流程文件化到 Notion 上。
    • Notion 確實有些小毛病和陷阱,但相較於我們先前用來記錄內部流程的 Google Docs,已經是一大進步。
  • 成功將職責從 TinyPilot 原先的庫存管理員(我女友)交接給新的在地員工。
    • 我女友的研究所課程下週就要復課,所以她將沒有時間再處理 TinyPilot 的事務。

經驗教訓

  • 關於新員工訓練,「用寫的,別用講的。」
    • 我們幾乎完全透過書面指示,而非即時口頭說明,來培訓第一位在地員工。
    • 大家都很滿意上手過程如此輕鬆,也讓職責交接給新員工的過程十分順利。
    • 第二位在地員工在 5 月中旬到職,而我們預期他的上手會更輕鬆,因為所有流程都已經文件化了。
  • 管理同樣需要時間。
    • 如果我想把管理做好,就必須放手,不再去做那些團隊成員也能做的事。
  • TinyPilot 需要更高的利潤率。
    • 提高營收會比削減支出來得容易。

下個月的目標

  • 發布新版本的 TinyPilot。
  • 創造 3.5 萬美元的 TinyPilot 營收。
  • 打造內建乙太網路供電(Power over Ethernet)的 TinyPilot Voyager 2 原型機。

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

留言