TinyPilot: 13개월 차
한 줄 요약
위임에 집중한 한 달.
하이라이트
- TinyPilot의 EU 유통 파트너가 8월 말 판매 시작을 향해 순조롭게 진행 중이다.
- 팀원들에게 업무를 위임하며 시간을 확보했다.
- 수개월째 발목을 잡던 두 가지 과제가 기적처럼 풀렸다.
목표 달성도
매달 초에 달성하고 싶은 목표를 정합니다. 이번 달 목표 대비 성과는 다음과 같습니다.
EU 파트너가 8월 말까지 판매를 시작할 수 있도록 준비하기
- 결과: 이달 말까지 판매를 시작할 궤도에 올랐다.
- 평가: A
잘 진행됐습니다. 다음 주면 유통 파트너가 TinyPilot Voyager 기기를 직접 조립하는 데 필요한 모든 부품과 설명서를 갖추게 될 것입니다. 이달 말 판매 시작을 향해 순조롭게 나아가고 있습니다.
TinyPilot 현지 직원이 모든 업무를 공유하고 교대로 수행할 수 있는 프로세스 정의하기
- 결과: 직원들이 교대로 업무를 처리할 수 있는 공유 할 일 목록을 만들었다.
- 평가: A
지금까지 TinyPilot에서는 한 번에 한 명만 재고 및 주문 처리 업무를 담당해 왔습니다. 두 명이 동등하게 책임을 나눌 수 있는 시스템을 만드는 일이 생각보다 어려웠지만, 이제 두 직원이 업무를 교대로 처리하고 일정을 조율할 수 있는 시스템이 작동하고 있습니다. 추가로 제가 메우고 있던 빈틈들도 문서화해 현지 직원이 처리할 수 있도록 했습니다.
TinyPilot 판매 사이트를 맡을 디자이너 찾기
- 결과: 새로운 개발자가 리디자인을 진행 중이다.
- 평가: A
수개월간의 탐색 끝에 마침내 TinyPilot 웹사이트를 맡을 웹 개발자를 찾았고, 현재 리디자인이 진행 중입니다.
TinyPilot Voyager용 PoE 어댑터를 만들 수 있는 전기·전자 설계 업체 찾기
- 결과: 기존 업체가 PoE 어댑터 제작에 필요한 부품을 확보했다.
- 평가: A+
또 하나의 운 좋은 돌파구였습니다. 글로벌 칩 부족 사태 때문에 기존 전기·전자 설계 업체가 수개월째 발이 묶였고, 저는 전자 부품 공급망에 더 강한 연결을 가진 더 큰 업체들에 연락을 돌리기 시작했습니다. 느리게 진행될 작업이었고, 아마 처음부터 다시 시작해야 했을 것입니다.
다행히 TinyPilot의 기존 전기·전자 설계 파트너가 6~12개월 치를 충당할 물량을 제가 예상했던 비용의 10%도 안 되는 가격으로 확보했습니다. 현재 PoE 어댑터용 PCB 설계를 진행 중이며, 4~6주 안에 프로토타입이 나올 것으로 예상합니다.
TinyPilot 통계
| 지표 | 2021년 6월 | 2021년 7월 | 변동 |
|---|---|---|---|
| 순 방문자 | 6,339 | 5,234 | -1,105 (-17%) |
| 총 페이지뷰 | 11,514 | 9,730 | -1,784 (-15%) |
| 판매 수익 | $29,446.46 | $23,954.64 | -$5,491.82 (-19%) |
| 엔터프라이즈 구독 | $48.00 | $48.00 | $0 (0%) |
| 총 수익 | $29,494.46 | $24,002.64 | -$5,491.82 (-19%) |
| 순이익 | -$9,452.32 | -$9,713.34 | N/A |
EU 유통망 구축과 주문 처리 프로세스의 현지 직원 이관에 집중하느라 판매 부진이 이어지고 있습니다. 두 달 연속 마케팅이나 광고 없이도 2만 4천 달러의 수익을 유지한 것은 다행이지만, 앞으로 몇 달간 판매와 마케팅 투자를 늘려야 합니다.
관리형 재고 서비스로 이전
TinyPilot 초기 몇 달부터 재고를 추적할 관리형 서비스를 찾아왔습니다. 저렴한 솔루션은 너무 단순해서 조립이나 제조가 필요 없는 제품에만 쓸 수 있었습니다. 반대로 고급 솔루션은 지나치게 복잡했고, 수천 개 제품과 여러 창고를 보유한 엔터프라이즈 고객을 위해 설계되어 있었습니다.
우연히 Craftybase를 알게 되었는데, 마침내 TinyPilot에 맞는 솔루션처럼 보였습니다. 어느 정도는 맞기도 하지만, 이전 과정은 순탄치 않았습니다.
Craftybase에는 잘 설계되어 우리 워크플로에 완벽히 맞는 부분도 있습니다. 가장 마음에 드는 기능은 제품을 구성하는 원자재를 정의하는 ‘레시피(recipes)’입니다. 예를 들어 TinyPilot Power Connector가 케이스 1개와 회로 기판 1개로 구성된다고 Craftybase에 알려줄 수 있습니다. Craftybase에서 Power Connector 10개를 ‘제작(build)’으로 기록하면, 재고에서 케이스 10개와 회로 기판 10개를 자동으로 차감합니다.

Craftybase의 ‘레시피’ 기능을 이용하면 각 제품을 구성하는 부품을 정의할 수 있습니다.
레시피에는 제가 직접 제조한 다른 품목도 포함할 수 있어 TinyPilot의 다단계 제조 과정에 잘 맞습니다. 예를 들어 TinyPilot Voyager는 단계별로 제작합니다. 보통 Voyager 기기 10대 이상을 한 번에 조립해 테스트한 뒤, 각 기기를 필요한 케이블과 설명서, microSD 카드와 함께 박스에 포장합니다. 레시피에 원자재와 이전 단계에서 만든 부품 모두를 넣을 수 있어, Craftybase로 공정 단계별 부품을 추적할 수 있습니다.
안타깝게도 Craftybase에서의 대부분 워크플로는 꽤 울퉁불퉁합니다. 가장 심각한 예가 입고 예정 물량 관리입니다. Craftybase에서는 각 품목마다 ‘재고 부족 기준(low stock limit)’을 설정할 수 있으며, 이 수치를 기준으로 재고가 부족한 부품을 하이라이트해 줍니다.

재고 수량이 재고 부족 기준치 아래로 떨어지면 Craftybase가 해당 자재를 하이라이트합니다.
문제는 추가 주문을 했는데도 해당 경고를 계속 표시한다는 점입니다. 이 플래그가 입고 예정 물량을 무시하기 때문입니다. 위 예시에서는 HDMI 캡처 칩 주문이 월말에 도착 예정이라고 Craftybase에 기록했습니다. 제가 더 할 일이 없는데도 Craftybase는 여전히 해당 품목을 재고 부족으로 표시합니다.
그래서 TinyPilot 직원이 재주문할 품목을 파악하려면, 플래그가 표시된 모든 품목을 하나씩 열어 입고 예정 물량을 감안했을 때 실제로 재고가 부족한지 확인해야 합니다.
처음에는 간단한 우회 방법이 있을 거라 생각했습니다. Craftybase의 ‘purchased’ 열이 입고 예정 물량을 뜻하는 줄 알았습니다. 알고 보니 ‘purchased’는 처음부터 지금까지 구매한 총 수량을 의미하는, 사실상 무의미한 지표인데 Craftybase가 이상할 정도로 눈에 띄게 배치해 둔 것이었습니다.

재고 수량이 재고 부족 기준치 아래로 떨어지면 Craftybase가 해당 자재를 하이라이트합니다.
실제 우회 방법은 재고 부족으로 표시된 각 품목의 상세 화면에 들어가 현재 재고 수량을 확인하고, 입고 예정 물량을 더한 뒤 그 합계가 재고 부족 기준치 아래인지 따져보는 것입니다. 재고 부족 확인은 2초면 끝날 작업이어야 하는데, Craftybase 때문에 몇 분이 걸리는 번거롭고 복잡한 과정이 되어 버렸습니다.


Craftybase에서 특정 품목이 재고 부족인지 확인하려면 여러 화면에 흩어진 숫자를 대조해야 합니다.
위임을 통한 시간 확보
TinyPilot을 운영하는 대부분의 기간 동안 시간 부족에 시달렸습니다. 사업에는 움직이는 부분이 많고, 그 모든 부분을 잇는 다리는 저 혼자였습니다.
6월에는 교육과 도구에 조금 투자하면 위임할 수 있는 업무 목록을 정리했습니다. 기쁘게도 그 목록의 절반을 성공적으로 위임하거나 없앴고, 그 외에도 몇 가지를 더 넘길 수 있었습니다.
스프레드시트 업무에서 손 떼기
TinyPilot의 이전 재고 관리 솔루션은 제가 직접 만들어 관리하던 스프레드시트였습니다. TinyPilot의 워크플로를 잘 지원하긴 했지만 유연성이 떨어졌습니다. 신제품을 추가하거나 부품을 변경할 때마다 임시방편으로 만든 수식을 고치느라 몇 시간씩 씨름해야 했습니다.

TinyPilot 운영 첫 해에는 복잡한 수식이 들어간 일련의 스프레드시트로 모든 재고를 관리했습니다.
Craftybase가 아무리 답답해도, 덕분에 재고 관리 프로세스의 핵심 경로에서 제가 빠질 수 있게 됐습니다. Craftybase는 스프레드시트보다 훨씬 세분화되고 유연하게 재고를 추적합니다. 다만 우회 방법이 우울할 정도로 많이 필요하다는 단점이 있습니다.
현지 직원을 위한 공유 할 일 목록 만들기
여전히 무의식적으로 일일이 챙기고 있던 업무 중 하나가 업무 배정이었습니다. TinyPilot 현지 직원들은 매주 3일, 하루 몇 시간씩 사무실에 출근합니다. 주문 처리나 입고 물량 처리처럼 매일 하는 업무는 근무 중에 처리하도록 지시하면 간단합니다.
일주일이나 한 달에 한 번 하는 업무는 두 직원에게 나누기가 더 어렵습니다. 사무실을 연 첫 몇 달 동안 주간·월간 업무는 “필요할 때 한다”, “Michael에게 부탁할 때까지 기다린다”, “Michael이 그냥 한다”가 뒤섞인 채 어수선하게 운영됐습니다.
직원 중 한 명이 우리가 지식 베이스로 쓰는 Notion에 대해 더 배우고 싶어 했습니다. 마침 Notion으로 해볼 만한 프로젝트 같아 주간·월간 업무를 관리할 공유 할 일 목록을 만들어 달라고 부탁했습니다.

TinyPilot 현지 직원들은 Notion의 공유 할 일 목록에서 처리할 업무를 관리합니다.
지난 3주 동안 이 할 일 목록을 성공적으로 사용해 왔습니다. 가장 큰 단점은 Notion에서 반복 작업을 생성할 마땅한 방법을 찾지 못했다는 점입니다. 우회 방법은 몇 달마다 목록을 수동으로 다시 채우는 것이며, 번거롭긴 해도 분기당 한 시간 정도면 됩니다.
원자재 재주문을 현지 직원이 맡도록 교육하기
TinyPilot 운영 기간 대부분 동안 여자친구가 재고 부족 시 원자재 재주문을 포함한 재고 관리를 맡았습니다. 6월에 그녀가 대학원으로 돌아가면서 대부분의 업무를 새 직원에게 인계했지만, 자재 재주문은 다시 제 몫이 됐습니다.
재고 재주문은 겉보기보다 외주를 주기 까다로운 업무입니다. 단순히 방법을 설명하는 것을 넘어, 협력사 사이트 로그인 정보를 안전하게 공유하는 방법, 실수를 줄이기 위해 한도가 설정된 새 체크카드 번호를 발급하는 일 등을 고민해야 합니다. 누군가에게 재고 관리를 맡기는 일은 신뢰를 쌓는 시간도 필요합니다. 새로 온 직원에게 신용카드를 건네며 “이제부터 매달 1만 달러 지출을 책임져 달라”고 말하고 싶지는 않습니다.
7월에는 마침내 팀원 전체를 위한 Bitwarden 계정을 만들어 로그인 정보를 안전하게 공유할 수 있게 했습니다. 그리고 각 협력사에서 주문하는 방법에 대한 설명서도 작성했습니다.

TinyPilot의 원자재 재주문을 위한 내부 문서
재고 수준을 유지하는 일은 얼핏 별일 아닌 것처럼 느껴지지만, 보급품 재주문 과정에는 자잘한 일이 너무 많아 다른 사람이 맡아줄 때마다 큰 안도감을 느낍니다.
개발자 간 풀 리퀘스트 상호 리뷰 허용하기
2월부터 두 명의 프리랜서 개발자가 TinyPilot 작업을 함께했고, 지난달 세 번째 개발자가 합류했습니다. 시간이 부족해 코딩은 거의 중단했지만, 모든 변경 사항의 코드 리뷰는 여전히 제가 맡고 있었습니다.
몇 달 전 저를 코드 리뷰 과정에서 빼보려 했지만 정착하지 못했습니다. 저는 풀타임으로 일하지만 다른 개발자들은 파트타임이며 근무 시간이 거의 겹치지 않습니다. 서로 의존하는 변경 사항이 연속으로 이어지면 리뷰 간 지연이 진행을 멈춰 세울 수 있습니다.
월간 개발 회의에서 그런 식으로 연속된 변경은 일부에 불과하다는 걸 깨달았습니다. 대부분의 변경은 리뷰를 하루 이틀 기다려도 큰 문제가 되지 않습니다. 그래서 이제 개발자들이 서로의 코드를 리뷰하고 있습니다.
여전히 스스로를 인디 개발자라고 여기는 입장에서는 직접 리뷰하지 않은 코드를 책임진다는 게 두렵게 느껴집니다. 하지만 팀원들을 신뢰하고, 이 방식이 회사 전체에는 더 낫다고 생각합니다.
이미지 빌드 프로세스 외부화하기
TinyPilot의 새 릴리스를 배포할 때마다 최신 버전이 미리 설치된 microSD 이미지를 만듭니다. microSD 이미지를 빌드하는 과정에 Raspberry Pi가 필요해서, 그동안은 사무실 구석에 있는 여분의 Pi와 SSD로 작업해 왔습니다.

최근까지 TinyPilot의 공식 빌드 서버였던 장비
TinyPilot 개발자들이 코드를 충분히 관리할 수 있음에도, 제 집에 격리된 단일 서버에 대한 공유 접근을 조율하기가 너무 어려웠습니다. 결국 빌드 코드는 계속 저 혼자 유지보수하게 됐습니다.
때로는 절박하게 해결책을 찾아 수개월 동안 구글 검색을 하면서도 검색어를 잘못 쓰고 있었던 경우도 있습니다. 저는 늘 Pi 클라우드 호스팅을 원했고, “pi cloud hosting”이나 “pi cloud server”로 수시로 검색했지만 내 Pi를 클라우드 서버로 쓰는 방법 같은 쓸모없는 결과만 나왔습니다. 마침내 “pi dedicated server”로 검색해 볼 생각이 떠올랐고, 그 결과 초 단위로 빌려 쓸 수 있는 클라우드 기반 Raspberry Pi 서버를 제공하는 업체인 Mythic Beasts를 찾게 됐습니다.

Mythic Beasts는 베어메탈 Raspberry Pi 서버 호스팅을 제공합니다.
Mythic Beasts는 Pi 서버를 동적으로 띄울 수 있는 괜찮은 API를 제공하지만, 개발자 인건비에 비하면 서버 비용이 워낙 저렴해서 영리한 서버 할당 로직을 자동화하는 것보다 개발자마다 24시간 365일 가동되는 개인 서버를 하나씩 주는 편이 더 저렴했습니다.
서버 문제가 해결되자 이미지 빌드 코드를 정리해 팀과 공유했습니다. 이제 어떤 TinyPilot 개발자든 자신의 서버에 최신 빌드 코드를 프로비저닝해 TinyPilot microSD 이미지를 생성할 수 있습니다. 더 중요한 점은, 과정에서 버그를 발견하거나 새로운 단계가 추가될 때 Michael만 할 수 있는 일이 아니라 TinyPilot 개발자들이 직접 수정할 수 있게 됐다는 것입니다.
EU 유통 시작
지난 한 달간 가장 큰 프로젝트는 새로운 EU 유통 파트너와 본격적으로 일을 시작하는 것이었습니다. 현재도 유럽 고객에게 판매하고 있지만 해외 배송은 느리고 비싸며 배송 시 예상치 못한 관세가 부과되기도 합니다. EU 유통 파트너는 독일에서 TinyPilot을 제조·배송하게 되며, 이를 통해 EU 소비자의 구매 경험이 개선될 것입니다.
파트너십을 맺는 과정에서 가장 큰 과제 중 하나는 확약과 유연성 사이의 균형을 맞추는 일이었습니다. 그동안 TinyPilot의 미래를 몇 달 이상 예측하기 어려웠기 때문에 저는 가능한 한 유연성을 유지하려 했습니다. 당연히 유통 파트너는 저에게 어느 정도의 장기적인 확약을 요구합니다. TinyPilot 기기를 판매하기 시작하려면 많은 노력과 자본 투자가 필요하기 때문에, 더 좋은 조건을 제시하는 다른 유통사가 나타났을 때 제가 발을 빼버리는 상황을 원하지 않습니다.
또 다른 쟁점은 로열티였습니다. 인센티브를 일치시키는 가장 좋은 방법은 수익을 비율로 나누는 것이라는 데 합의했습니다. 그렇게 하면 유통 파트너는 저에게 지급하는 고정 금액에 얽매이지 않고 다양한 가격을 시도해 볼 수 있습니다. 그리고 더 높은 가격에 판매할 수 있게 되면 저도 함께 그 혜택을 누릴 수 있습니다.
수익을 나누는 방식의 어려움은 정확히 어떻게 계산하느냐에 대한 까다로운 질문들을 낳는다는 점입니다. 유통 파트너가 마케팅 차원에서 기기를 무료로 나눠주면 그 수량에 대해서도 로열티를 지급해야 할까요? 개당 수익에 인건비가 포함될까요? 제품 개선에 함께 투자하면 수익 계산에 어떤 영향을 미칠까요?
우리는 이런 질문들을 하나씩 풀어가며 잠재적 갈등 요소를 미리 예측하려 노력해 왔습니다. 현재 계약은 약 95% 완성된 상태이며, 늦어도 몇 주, 빠르면 며칠 안에 마무리될 것으로 보입니다.
기존 프로젝트
아직 유지보수하고 있지만 현재 주력 개발 대상은 아닌 프로젝트들에 대한 간단한 업데이트입니다.
Is It Keto
| 지표 | 2021년 6월 | 2021년 7월 | 변동 |
|---|---|---|---|
| 순 방문자 | 49,839 | 39,568 | -10,271 (-21%) |
| 총 페이지뷰 | 122,700 | 96,494 | -26,206 (-21%) |
| 도메인 등급(Ahrefs) | 13.0 | 13.0 | 0 |
| AdSense 수익 | $536.85 | $438.07 | -$98.78 (-18%) |
| Amazon 제휴 수익 | $134.59 | $59.65 | -$74.94 (-56%) |
| 총 수익 | $671.44 | $497.72 | -$173.72 (-26%) |
지난달에는 1월의 연간 급증 이후에도 Is It Keto의 방문자 수가 잘 유지되고 있다고 자축했습니다. 재수 없게도 말을 꺼낸 탓인지 이번 달 방문자 수는 전월 대비 20% 넘게 떨어지며 올해 가장 큰 하락 폭을 기록했습니다.
안타깝게도 이 부진은 제가 더 높은 등급의 디스플레이 광고 파트너와 제휴를 신청한 시점과 겹쳤습니다. Google AdSense보다 MediaVine이 퍼블리셔에게 훨씬 더 많이 지급하니 갈아타라는 권유를 들었습니다. MediaVine은 월 10만 페이지뷰라는 최소 요건이 있는데, 신청 당시에는 충족했지만 지금은 그보다 약간 아래입니다. 어떻게 될지 지켜봐야겠습니다.
Hit the Front Page of Hacker News
| 지표 | 2021년 6월 | 2021년 7월 | 변동 |
|---|---|---|---|
| 순 방문자 | 248 | 109 | -139 (-56%) |
| Gumroad 수익 | $123.52 | $218.09 | +$94.57 (+77%) |
| Blogging for Devs 수익 | $0.00 | $27.30 | +$27.30 (+inf%) |
| 총 수익 | $123.52 | $245.39 | +$121.87 (+99%) |
강좌와 관련해서는 새로운 소식이 없습니다. 매달 몇 분이 구매하고 만족하는 것 같지만 따로 홍보하지는 않았습니다. Martin Schleiss가 최근 블로그 글에서 호의적으로 언급해 주었습니다. 이번 달에는 몇몇 기술 팟캐스트에 게스트로 출연 제안을 해볼 계획이라, 이를 통해 새로운 수강생이 유입될 수도 있을 것 같습니다.
Zestful
| 지표 | 2021년 6월 | 2021년 7월 | 변동 |
|---|---|---|---|
| 순 방문자 | 594 | 547 | -47 (-8%) |
| 총 페이지뷰 | 1,470 | 1,300 | -170 (-12%) |
| 총 수익 | $40.20 | $620.67 | +$580.47 (+1444%) |
이번 달 Zestful 사용량이 크게 뛰었지만, 거의 확실히 부정 사용이라고 생각합니다. joe-84ad853 같은 사용자명을 가진 여러 계정이 며칠 사이에 가입했습니다. 이번 달 수익 대부분이 그중 한 계정에서 나왔습니다. 지금까지 Zestful 고객 중 대량 할인을 문의하지 않고 API 요청에 100달러 넘게 지출한 사람은 한 명도 없었습니다. 이 사용자는 연락을 해오지 않았으니 매우 의심스럽습니다. RapidAPI에서는 8월 30일에 정산금을 받을 수 있다고 하지만, 실제로 받게 된다면 오히려 놀랄 것 같습니다.
마무리
무엇을 해냈나?
- TinyPilot 신규 릴리스 배포
- TinyPilot 웹사이트를 맡을 개발자 확보
- TinyPilot PoE HAT 및 랙 마운트 개발 재개
- 관리형 재고 서비스로 이전
얻은 교훈
- CEO에게 의존하는 워크플로보다는 불완전한 워크플로가 낫다.
- Craftybase의 UI와 제약이 아무리 답답해도, 복잡한 스프레드시트의 수식을 붙잡고 있는 것보다는 낫습니다.
다음 달 목표
- EU 유통 파트너의 첫 판매 달성 지원하기.
- Voyager 2 설계 확정하기.
- Refactoring English 샘플 챕터 공개하기.
글을 무작위로 읽기