TinyPilot: 13개월 차
원문은 Michael Lynch님이 에 게재했습니다. 이 블로그 구독하기
한 줄 요약
위임의 한 달이었다.
하이라이트
- TinyPilot의 EU 유통사가 8월 말까지 판매를 시작할 수 있도록 순조롭게 준비 중이다.
- 팀원들에게 업무를 위임해 시간을 확보했다.
- 몇 달 동안 발목을 잡던 두 가지 과제가 기적적으로 해결됐다.
목표 달성 평가
매달 초에 달성하고 싶은 목표를 정한다. 이번 달 목표 달성 결과는 다음과 같다:
8월 말까지 EU 파트너가 판매를 시작할 수 있도록 준비하기
- 결과: 월말까지 판매 시작을 순조롭게 준비 중이다.
- 등급: 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 유통망 구축과 TinyPilot 풀필먼트 업무의 현지 직원 이관에 집중하느라 판매 부진이 이어지고 있다. 마케팅이나 광고 없이 두 달 연속 2만 4천 달러의 수익을 유지하고 있다는 점은 다행이지만, 앞으로 몇 달간 영업 및 마케팅 투자를 늘려야 한다.
관리형 재고 서비스로 이전
TinyPilot 초기 몇 달부터 재고를 추적할 관리형 서비스를 찾아왔다. 저렴한 솔루션들은 너무 단순해서 조립이나 제조가 필요 없는 제품에만 쓸 수 있었다. 고급 솔루션들은 지나치게 복잡해 수천 개 제품과 여러 창고를 보유한 엔터프라이즈급 고객을 위해 설계되어 있었다.
우연히 Craftybase를 발견했는데, 마침내 TinyPilot에 맞는 솔루션처럼 보였다. 어느 정도는 그렇기도 하지만, 이전 과정은 순탄치 않았다.
Craftybase의 일부 기능은 잘 설계되어 우리 워크플로에 완벽하게 맞는다. 가장 마음에 드는 기능은 ‘레시피’인데, 제품을 구성하는 원자재를 정의할 수 있다. 예를 들어 TinyPilot Power Connector 하나가 케이스 하나와 회로 기판 하나로 이루어진다고 Craftybase에 알려줄 수 있다. Power Connector 10개를 ‘제작(build)’으로 기록하면, 재고에서 케이스 10개와 회로 기판 10개가 차감된다.

Craftybase의 ‘레시피’ 기능을 사용하면 각 제품을 구성하는 부품을 정의할 수 있다.
레시피에는 내가 직접 제조한 다른 항목도 포함될 수 있어, TinyPilot의 다단계 제조 과정에 잘 맞는다. 예를 들어 TinyPilot Voyager는 단계별로 제작한다. 보통 10대 이상의 Voyager 기기를 한 번에 만들고 테스트한 뒤, 각 기기를 필요한 케이블, 설명서, microSD 카드와 함께 상자에 포장한다. Craftybase를 사용하면 레시피에 원자재와 이전 단계에서 제작한 부품이 모두 포함될 수 있어 공정 여러 단계에 걸친 부품을 추적할 수 있다.
안타깝게도 Craftybase에서의 대부분의 워크플로는 꽤나 매끄럽지 않다. 가장 심각한 예가 입고 배송 관리다. Craftybase에서는 각 품목마다 ‘재고 부족 기준(low stock limit)’을 설정할 수 있는데, 이 수치를 기준으로 재고가 부족한 부품을 강조 표시한다.

Craftybase는 재고 수량이 설정한 부족 기준치 아래로 떨어지면 해당 자재를 강조 표시한다.
문제는 이미 추가 주문을 했는데도 해당 품목에 계속 경고 표시가 뜬다는 점이다. 이 경고가 입고 예정인 배송을 무시하기 때문이다. 위 예시에서는 HDMI 캡처 칩 주문이 월말에 도착할 예정이라고 Craftybase에 기록했지만, 더 이상 할 일이 없는데도 여전히 재고 부족으로 표시된다.
즉, TinyPilot 직원들이 어떤 품목을 재주문해야 할지 파악하려면, 경고 표시된 모든 품목을 하나씩 확인하며 입고 예정 물량을 고려했을 때 실제로 재고가 부족한지 따져봐야 한다.
처음에는 간단한 해결책이 있을 거라 생각했다. Craftybase의 ‘purchased’ 열이 입고 예정 물량을 나타내는 줄 알았다. 하지만 ‘purchased’는 실제로는 서비스 시작 이후 지금까지 구매한 총량을 의미하며, Craftybase가 이상할 정도로 눈에 띄게 표시하는 무의미한 수치였다.

Craftybase는 재고 수량이 설정한 부족 기준치 아래로 떨어지면 해당 자재를 강조 표시한다.
결국 재고 부족으로 표시된 각 품목마다 세부 정보로 들어가 현재 재고량을 확인하고, 입고 예정 주문량을 더한 뒤, 그 합계가 부족 기준치 아래인지 확인해야 한다. 재고 부족 여부를 확인하는 데 2초면 될 일이 Craftybase 때문에 여러 화면에 걸쳐 수치를 대조해야 하는 수 분짜리 번거롭고 복잡한 작업이 되어버렸다.


Craftybase에서 특정 품목의 재고 부족 여부를 확인하려면 여러 화면의 수치를 서로 대조해야 한다.
위임을 통한 시간 확보
TinyPilot을 운영하며 대부분의 기간 동안 시간 부족에 시달렸다. 비즈니스에는 챙겨야 할 일이 많고, 그 모든 일을 잇는 가교는 나 혼자였다.
6월에는 교육과 도구에 조금 투자하면 위임할 수 있는 업무 목록을 정리했다. 그 목록의 절반과 그 밖에 몇 가지를 성공적으로 위임하거나 없앨 수 있어 기쁘다.
스프레드시트 업무에서 손 떼기
TinyPilot의 이전 재고 관리 솔루션은 내가 직접 관리하던 자체 제작 스프레드시트였다. TinyPilot의 워크플로에는 잘 맞았지만 유연성이 떨어졌다. 새 제품을 추가하거나 부품을 변경할 때마다 허술한 스프레드시트 수식을 고치는 데 몇 시간을 쏟아야 했다.

TinyPilot 첫해에는 복잡한 수식이 들어간 스프레드시트로 모든 재고를 관리했다.
Craftybase가 아무리 답답해도, 덕분에 재고 관리 프로세스의 핵심 경로에서 내가 빠질 수 있게 됐다. Craftybase는 스프레드시트보다 더 세분화되고 유연하게 재고를 추적하지만, 안타까울 정도로 많은 편법을 필요로 한다.
현지 직원을 위한 공유 할 일 목록 만들기
내가 무의식적으로 여전히 세세하게 관리하던 업무 중 하나가 업무 배분이었다. TinyPilot의 현지 직원들은 각각 주 3일, 하루 몇 시간씩 사무실에 나온다. 주문 처리나 입고 처리처럼 매일 하는 일은 근무 중에 처리하도록 안내하기 쉽다.
일주일이나 한 달에 한 번 있는 업무는 두 직원에게 나누기가 더 어렵다. 현지 사무실을 운영한 첫 몇 달 동안 주간·월간 업무는 ‘필요할 때 하기’, ‘Michael이 도움 요청할 때까지 기다리기’, ‘Michael이 그냥 하기’가 뒤섞인 채 체계 없이 운영됐다.
TinyPilot 직원 중 한 명이 우리가 지식 베이스로 쓰는 Notion에 대해 더 배우고 싶어 했다. 좋은 Notion 프로젝트가 될 것 같아 주간·월간 업무를 관리할 공유 할 일 목록을 만들어 달라고 부탁했다.

TinyPilot 현지 직원들은 Notion의 공유 할 일 목록으로 남은 업무를 추적한다.
지난 3주간 할 일 목록을 성공적으로 사용해 왔다. 가장 큰 단점은 Notion에서 반복 작업을 생성할 좋은 방법을 찾지 못했다는 점이다. 그래서 몇 달에 한 번씩 목록을 수동으로 다시 채우는 편법을 쓰고 있다. 번거롭지만 분기당 한 시간 정도면 되는 작업이다.
원자재 재주문을 현지 직원에게 교육하기
TinyPilot 운영 기간 대부분은 내 여자친구가 재고 관리를 맡았고, 재고가 부족할 때 원자재를 재주문하는 일도 담당했다. 그녀가 6월에 대학원으로 돌아가면서 대부분의 업무를 새 직원에게 넘겼지만, 자재 재주문은 다시 내 몫이 됐다.
재고 재주문은 겉보기보다 외주를 주기 까다로운 일이다. 방법을 설명하는 것만이 아니라, 공급업체 웹사이트 로그인 정보를 안전하게 공유하는 방법, 실수를 줄이기 위해 지출 한도가 설정된 새 직불카드 번호를 제공하는 방법 등 신경 쓸 일이 많다. 재고 관리를 맡기는 데는 신뢰를 쌓는 시간도 필요하다. 이제 막 온 신입 직원에게 신용카드를 건네며 “이제부터 월 1만 달러 지출을 책임져 달라”고 할 수는 없는 노릇이다.
7월에는 마침내 팀원 모두를 위한 Bitwarden 계정을 만들어 자격 증명을 안전하게 공유할 수 있게 했다. 또 여러 공급업체에서 주문하는 방법을 문서로 정리했다.

TinyPilot의 원자재 재주문용 내부 문서
재고 수준을 유지하는 일은 언뜻 일이 별로 없어 보이지만, 물품을 재주문하는 과정에는 자잘한 일이 너무 많아 다른 사람이 맡아줄 때마다 큰 안도감을 느낀다.
개발자들이 서로의 pull request를 리뷰하도록 하기
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 이미지를 생성할 수 있다. 더 중요한 점은, 과정에서 버그를 발견하거나 새로운 단계가 추가되더라도 TinyPilot 개발자들이 직접 수정할 수 있어 더 이상 Michael만 할 수 있는 일이 아니게 됐다는 것이다.
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의 사용자 인터페이스와 제약이 아무리 답답해도, 복잡한 스프레드시트에서 수식을 붙잡고 있는 것보다는 낫다.
다음 달 목표
- EU 유통사가 첫 판매를 달성하도록 돕기.
- Voyager 2 디자인을 확정하기.
- Refactoring English 샘플 챕터 공개하기.
글을 무작위로 읽기
댓글
로그인하고 댓글 남기기