27년 동안, 모든 코드를 한 줄 한 줄 손으로 썼다. 지금은 AI가 코드를 쓴다. 그리고 나는 그 코드와 결과를 의심하고 판단한다.
필기엔진 하나를 10년 동안 만들었고,
그 엔진으로 만든 앱은 애플 앱스토어 올해의 아이패드 앱이 되었다.
서버를 만들지 못한다는 게 아쉬워 개발서적 13권을 들고 두 달간 잠적했고,
돌아올 때는 서버부터 모바일까지 혼자 만들 수 있는 풀스택 개발자가 되어 있었다.
회사에서는 사용자용·관리자용 모바일 앱 네 개를 혼자 맡았고,
지금은 AI와 함께 그 모든 일을 더 빠르게 한다.
생성은 맡긴다.
하지만 무엇을 만들지, 결과가 맞는지, 무엇을 믿어야 하는지는
여전히 내가 결정한다.
왼쪽 — 획 하나를 어떻게 그릴 것인가, 생각을 그대로 옮긴 밑그림.
오른쪽 — 거기에 필요한 각을 구하려 직접 유도한 삼각함수.
덧셈정리가 기억나지 않아 그 자리에서 다시 유도했고, sin으로 풀리지 않자 tan으로 우회한 흔적도 남아 있다.
필요한 공식을 라이브러리에서 찾기보다, 왜 그렇게 되는지부터 다시 손으로 풀던 시절이었다.
1983 · 시작
아버지가 조립해 준 애플 II
아버지는 전파사를 하셨다.
청계천에 부품을 사러 갈 때면 종종 나를 데리고 다니셨고,
그곳을 다니며 산 부품으로 애플 II를 만들어 주셨다.
지금 생각해보면 이미 완성된 기판과 파워서플라이 정도를 조립해주신 것이었겠지만,
어린 눈에는 트랜지스터 하나하나를 납땜해 컴퓨터를 통째로 만들어 주신 줄 알았다.
기성 앰프의 저음이 마음에 들지 않는다며 직접 진공관 앰프를 만들어 쓰셨던 분이기에.
마음에 드는 물건이 없으면 직접 만든다.
아마 그 태도를 가장 먼저 배운 곳이 아버지의 작업대였을 것이다.
저항의 색띠(흑갈적주…)를 외우고, 납땜을 배우고, 라디오 키트를 수십 개 조립했다.
컴퓨터도, 전자기기도
내게는 사서 쓰는 물건이기 전에 뜯어보고 만들어보는 물건이었다.
청계천 부품으로 아버지가 조립해 준 애플 II.기성품이 마음에 안 들면 직접 — 아버지의 진공관 앰프.
이미지(실물 아닌 예시): Marcin Wichary · Nenad Stojkovic, Wikimedia Commons, CC BY 2.0
그 컴퓨터로 친구들과 함께 게임만 하다가
아버지가 동네 컴퓨터학원을 등록해 주셔서 프로그래밍을 배우기 시작했다.
그 시절 처음 배우는 언어는 BASIC.
영어 단어조차 제대로 모르던, 국민학교 4학년이었다. IF ELSE, FOR NEXT도 흥미로웠지만, 가장 마음에 들었던 명령어는 ON GOTO.
입력값에 따라 프로그램의 흐름이 달라진다는 게 재미있었다.
몇 달 뒤 처음 만든 프로그램은 과목을 고르면 문제를 내주는 퀴즈 프로그램이었다.
12 + 25 = ? 낙동강 주변 평야 이름은?
지금 보면 별것 아니지만, 친구들과 아버지에게 보여줄 때는 꽤 뿌듯했다.
1999~2004 · 미리온시스템
화면을 녹화하고, 칠판을 네트워크에 띄우다
군대를 마치고 복학을 기다리던 때, 비트컴퓨터라는 학원에 들어갔다.
시험을 치러야 들어갈 수 있어 ‘컴퓨터사관학교’라 불리던 곳이었다.
거기서 만난 사람들과 넷이서 회사를 차렸다.
그게 첫 직장이었다.
화면을 녹화하고 편집하는 교육용 저작도구 WinCAM을 만들었다.
개발팀장을 맡았고, 제품 코드의 절반 이상을 직접 작성했다.
원격강의용 화상칠판 WinBoard에는 손글씨 알고리즘을 만들어 넣었다.
이때 처음으로 화면 위의 펜 움직임을 코드로 다루기 시작했다.
WinCAM — 화면 녹화·편집 저작툴. 온/오프라인 교육시장에서 쓰였다.WinBoard — 원격강의 화상칠판. 필기 알고리즘을 처음 넣어본 곳.
회사가 CES에 참가했을 때였다.
전시장을 걷다가 컴팩 iPAQ 앞에서 발이 멈췄다.
손바닥만 한 기계에 펜으로 글씨를 쓰고 있었다.
은색 알루미늄 바디의 매끈한 디자인에 푹 빠져
한국에 출시되자마자 확장팩까지 포함해 풀세트로 샀다.
가격은 150만 원. 당시에는 꽤 큰돈이었다.
그런데 막상 사용해보니 기본 앱들이 하나같이 아쉬웠다.
특히 필기 메모의 필기감이 마음에 들지 않았다.
이 좋은 기계에서 왜 글씨가 이렇게밖에 안 써질까.
아버지가 앰프를 만들 때 했을 법한 생각이 자연스럽게 떠올랐다.
내가 만들어도 이것보다는 잘 만들겠다.
컴팩 iPAQ — CES에서 반해, 풀세트 150만 원에 산 그 기계.포켓PC의 기본 필기메모 — 이 필기감이 아쉬워서, 모든 게 시작됐다.
이미지(실물 아님): iPAQ — Andreas Steinhoff, Wikimedia Commons (Attribution) · 메모앱 화면 — 인터넷 예시
그날부터 퇴근 후의 밤이 바빠졌다.
삼각함수와 arctan으로 펜의 방향과 굵기를 계산하고,
곡선을 한 줄씩 그리며 C++ 필기엔진을 처음부터 만들었다.
펜 끝의 움직임이라는 물리 현상을 실시간 수학으로 옮기는 일이었다.
이 엔진은 이후 10년 동안 나를 따라 회사를 옮겨 다녔고,
나중에는 엔진이 나를 회사로 데려가기도 했다.
10년 동안 이어진 필기엔진
R&D 01
R&D 02
R&D 03
R&D 04
R&D 05
R&D 06
곡선 하나를 자연스럽게 그리기 위해 수식을 풀고, 두 원과 픽셀로 그린 밑그림을 코드로 옮겼다. 결과만 보면 작은 선 하나지만, 그 뒤에는 수많은 실패와 계산과 구현이
쌓여 있었다.
필기엔진만 만든 것은 아니었다.
내가 쓰려고 일기장과 영어 학습 플레이어, 일정관리 프로그램을 만들었다. iPaqGuru.com이라는 아이팩 커뮤니티도 직접 운영하며 프로그램을 배포했다.
사용자들은 게시판에 버그를 남겼고,
스킨은 누구든 만들어 붙일 수 있도록 열어두었다.
GDiary포켓PC용 일기장 · 2001컴팩 아이팩 경진대회 우수상.GPlayer어학용 플레이어MP3와 스크립트를 자동으로 맞춰준다. 내 영어공부를 위해 만들었다.InfoBox통합 PIMS주소록·일정·할일을 하나로. 정리하고 분류하는 성향이 그대로 들어간 프로그램이었다.
2004~2006 · 스마트윈드
개인적으로 만들던 프로그램이 회사의 제품이 되다
이직한 회사의 주력 제품은,
공교롭게도 내가 퇴근 후 만들던 것들과 비슷했다.
그래서 내가 만들던 모든 것을 내어주었다.
통합 일정관리 프로그램 InfoBox,
필기엔진을 탑재한 SmartMemo,
어학 플레이어 Moti-Player.
컨트롤과 UI를 다시 설계했고,
제품은 삼성 PDA를 비롯한 여러 업체의 기기에 번들로 공급됐다.
정작 원작자인 내게 별도 보상이 있었던 것은 아니다.
당시에는 조금 억울했다. ㅎㅎ
대신 중요한 사실을 배웠다. 내가 만든 것은 내가 소유할 수 있어야 한다.
InfoBox — 포켓PC 통합 PIMS(주소록·할일·일정). 모든 인터페이스를 직접 제작.
SmartMemo필기 메모자체 필기엔진. 삼성 PDA 등 번들.InfoBox일정·할일커스텀 컨트롤 일체 자체 제작.Moti-Player어학 플레이어내 개인작 GPlayer의 회사 제품판.
2006~2008 · 텔미정보통신
SNS 메신저와 UI 라이브러리
SNS 기반 메신저 클릭질을 개발했다.
친구지도, 채팅, 쪽지 같은 기능이 있었고,
스마트폰이 본격적으로 등장하기 전부터
위치와 관계를 결합한 소셜 기능을 다뤘다.
클라이언트의 대부분을 직접 만들었고,
버튼과 리스트 같은 기본 컨트롤부터
회사 공통 Win32 UI 라이브러리까지 구현했다.
제품 하나를 만드는 것을 넘어,
다른 개발자들이 제품을 만들 때 사용할 기반을 만들기 시작한 시기였다.
클릭질 — SNS 기반 메신저(2006). ‘친구지도’ 같은 소셜 개념을, 스마트폰 이전에.
2008~2011 · 민트패스 → 아이리버
필기엔진이 실제 단말기가 되다
텔미정보통신에 다니던 어느 날, 영문 메일 한 통을 받았다.
포키패드를 사용해봤다는 회사였다.
필기 전용 단말기를 개발하고 있는데, 내 엔진을 사용하고 싶다고 했다.
메일을 보낸 사람은 나를 외국 개발자로 알고 있었던 모양이다. “저 한국인인데요~”
그렇게 답장을 보냈다.
필기엔진은 매년 라이선스 비용을 받고 제공했다.
스마트윈드에서 배운 대로, 이번에는 내 이름으로 소유한 기술이었다.
약 1년 뒤에는 아예 회사에 합류해 직접 제품을 만들었다.
그 단말기가 민트패드다.
회사가 문을 닫은 뒤에는 나를 영입했던 부장님을 따라 아이리버로 옮겨,
UI 라이브러리와 전자사전용 메모 앱을 개발했다.
민트패드 — 자체 필기엔진을 품은 필기 전용 단말기. 그 영문 메일이 여기까지 이어졌다.
메모 — 시작 화면
사용자들의 실사용 필기 (2008)
펜 팔레트 — 연필·형광펜·컬러
2011 · 포키소프트
10년을 기다린 엔진이 아이패드를 만나다
2001년에 만든 필기엔진은 사라지지 않았다. 자신에게 맞는 하드웨어를 기다리고 있었을 뿐이다.
아이패드가 발표되었을 때 바로 알았다.
이거다.
몇 달 동안 엔진을 옮기고 제품을 만들어 UPAD를 출시했다.
출시 몇 달 만에 월 매출 2천만 원을 기록했고, 2011년 애플 앱스토어 ‘올해의 아이패드 앱’ 1위에 선정됐다.
다니던 아이리버를 나와 포키소프트를 설립했고,
이후 수년간 업데이트를 하면서 누적 다운로드는 수백만 건에 이르렀다.
앱스토어 생산성 유료 차트 1위 — UPAD 3. 아래로 GoodNotes, Notability.
필기 노트 — 손글씨·지도·색
플래너 — 캘린더 위 자유 필기
폴더·파일 관리 (UPAD 3)
드로잉 · 가져오기
수식 노트 — 손으로 푸는 공학 수학
UPAD — 노트·플래너·드로잉·파일 관리까지, 10년 C++ 필기엔진의 결정체
현실의 행동을 화면 안으로 옮기다
UPAD의 기능을 설계할 때는 모양보다 행동을 먼저 관찰했다.
종이에 직선을 그을 때 사람은
한 손으로 자를 누르고 다른 손으로 선을 긋는다.
UPAD에서도 같은 방식으로 만들었다.
왼손가락으로 자 버튼을 누른 채 펜을 움직이면 직선이 그어지고,
손가락을 떼면 다시 자유 필기로 돌아간다.
자의 모양을 화면에 그려 넣은 것이 아니라,
자를 사용하는 사람의 두 손을 멀티터치로 옮긴 것이다.
왼손은 자 버튼을 누르고, 오른손은 펜으로 긋는다 — 실제 사용 장면.화면 왼쪽에 떠 있는 자·격자 버튼 — 누르는 동안만 도구가 된다.
이 방식은 이후 제품을 설계할 때도 계속 이어졌다.
기능을 먼저 생각하기보다,
사람이 현실에서 무엇을 하고 있는지를 먼저 본다.
2018 · 포키소프트
개발서적 13권을 들고 두 달간 사라지다
오랫동안 마음에 걸리는 한계가 있었다.
클라이언트 프로그램은 원하는 대로 얼마든지 만들 수 있었지만,
서버까지 포함한 서비스를 혼자 완성할 수는 없었다.
결국 개발서적 13권을 들고 치앙마이로 떠났다.
두 달 동안 연락을 끊고 가장 저렴한 방에 머물렀다.
잠자는 시간을 제외하면 대부분 책을 읽고 코드를 작성했다.
13권을, 두 번씩.
아이스박스 위에 올린 모니터 — 나를 다시 만든 두 달의 책상.
못 읽는 메뉴판에서 QR 주문 서비스를 떠올리다
어느 저녁 동네 식당에 들어갔다.
칠판에는 태국어 메뉴만 적혀 있었고, 사진은 한 장도 없었다.
무슨 음식인지 모른 채 손가락으로 아무거나 가리켰다.
나온 국수는 맛이 없었다.
몇 젓가락 먹다 말고 생각했다. 왜 사진 메뉴를 만들지 않았을까.
칠판에 태국어뿐인 메뉴 — 여기서 뭘 고를 수 있을까.대충 가리켜 시킨 국수. 몇 젓가락 뜨다 말았다.
곧 이유가 떠올랐다.
메뉴가 바뀔 때마다 다시 인쇄하고
사진을 교체하는 일이 번거롭기 때문이다.
그날부터 식당을 다니며 메뉴판을 사진으로 모았다.
어디에서나 비슷한 문제가 보였다.
모은 메뉴판 ①
모은 메뉴판 ②
모은 메뉴판 ③
해법도 자연스럽게 그려졌다. 테이블마다 QR 코드를 붙인다. 손님이 스캔하면 사진 메뉴가 열리고, 주문하면 점주 앱으로 전달된다. 새 메뉴는 사진 한 장으로 등록한다.
마침 손에는 새로 배운 풀스택 기술이 있었다.
Sketch로 화면을 디자인하고,
React Native로 고객용 앱과 점주용 앱을 만들고,
GraphQL과 Node로 서버를 구축했다.
실기기 데모까지 돌렸다.
실제로 이런 서비스가 보편화된 건 그로부터 몇 년 후였다.
QR 메뉴 주문 서비스 — 실기기 데모(2018)
두 달 뒤 한국으로 돌아올 때는,
웹·서버·iOS·안드로이드를 연결해
제품 하나를 완성할 수 있는 풀스택 개발자가 되어 있었다.
책만 읽고 돌아온 것이 아니라,
실제로 동작하는 서비스를 하나 만든 뒤였다.
몇 년 전부터 다니던 골프 동호회가 있었다.
스크린골프와 필드 모임, 회식이 이어지는 지역 소모임이었지만,
당시에는 이런 모임에 적합한 앱이 마땅하지 않았다.
밴드는 규모가 너무 컸고,
소모임 앱은 게시판과 채팅방 정도만 제공했다.
모임 일정과 정원, 회비를 관리하고
참가자가 생기면 자동으로 그룹채팅이 열리는 앱을 구상했다.
8개월 동안 기획, 디자인, 서버, iOS, 안드로이드를 만들어 클러비를 출시했다.
지역·태그 클럽 찾기
모임 · D-day · 회비 · 정원
피드 · 자유게시판
참가하면 자동 그룹채팅
소프트웨어는 제대로 동작했다.
하지만 서비스는 실패했다.
마케팅을 몰랐고,
누구에게 어떤 이유로 팔아야 하는지도 충분히 정하지 않았다.
1년 동안 서버비만 내다가 서비스를 종료했다.
그때 분명히 배웠다. 소프트웨어는 혼자 만들 수 있지만, 시장까지 혼자 만들기는 어렵다.
그래도 그 8개월이 사라진 것은 아니었다.
클러비를 만들며 정리해둔 재사용 코드 덕분에,
다음 직장인 지바이크에서는
모바일 앱을 4개월도 되지 않아 완성할 수 있었다.
제품은 사라졌지만, 코드는 다음 제품에서 계속 일했다.
2019 · 지바이크
회사에서도 네 개의 앱을 혼자 만들다
공유 스쿠터 서비스 지쿠터의
사용자 앱과 관리자 앱을 개발했다.
iOS와 안드로이드를 합쳐 네 개의 앱이었다.
서버팀은 1~2명에서 10명으로 늘어났지만,
모바일 개발은 3~4년 동안 나 혼자 담당했다.
대표가 업계 모임에서 모바일 개발자가 한 명이라고 말하면,
상대는 잘못 들은 줄 알았다고 한다.
지쿠터 · 사용자
관리자 · 배치
관리자 · 일괄
문구와 화면 수정 요청이 잦아서,
화면을 데이터로 정의하고
서버의 응답에 따라 구성하는 프레임워크 NEO도 만들었다.
당시에는 이런 구조에 이름이 있다는 것을 몰랐다.
나중에야 SDUI, Server-Driven UI라는 개념이 이미 존재하고
여러 대형 서비스가 사용하고 있다는 것을 알게 됐다.
메인 앱은 세 번에 걸쳐 갈아엎었고,
마지막 버전은 NEO 위에 다시 지었다.
화면이 곧 스크립트라서, 국가마다, 언어마다,
다른 모양과 색, 다른 레이아웃과 내용을 구현할 수 있었다.
3세대 메인 앱 — 홈
지도에서 찾고, QR로 빌린다
탑승 · 반납 — 다크 모드
화면 밖의 세계를 움직이기 시작하다
입사할 때 다섯 명이던 본사 인원은 7년 사이 100명 가까이 늘었고,
수거와 배치를 맡는 캠프 인원까지 더하면 300명이 넘는다.
연간 매출 1천억 원에 가까운, 국내 최대 공유 스쿠터 기업이 됐다.
그런데 스쿠터를 어디에 놓고 언제 거둘지는
여전히 현장의 감과 경험에 기대고 있었고,
수요를 잘 읽는 캠프와 그렇지 못한 캠프의 차이가 데이터에 보였다.
그래서 그동안 쌓인 탑승 데이터에
날씨와 기온, 요일, 일출·일몰 시간, 미세먼지, 지역 축제 일정 같은
외부 요인을 더해 학습시킨 배치추천 모델을 만들기 시작했다.
그것이 GROUND Sherpa다.
GROUND Sherpa — 권역별 ‘배치 필요 / 수거 필요’를 추천하는 fleet 운영 ML. 예상 개선치까지 산출.
2025 · monolog
3년 동안 묵혀둔 아이디어를 LLM으로 완성하다
아이디어는 예고 없이 떠오른다.
노트 앱을 열고 제목을 뭐라고 붙일지 고민하는 사이,
정작 적으려던 생각이 사라지곤 했다.
그래서 제목도 형식도 없이, 나에게 채팅을 보내듯 적는 기록 앱을 구상했다.
그게 monolog다.
바라는 것은 둘이었다.
적어둔 말이 알아서 일정과 알림이 될 것.
기록이 10년 넘게 쌓여도, 언제든 쉽게 찾을 수 있을 것.
하지만 ‘이번 주 토요일’, ‘내일 저녁 7시’처럼
상대적인 시간을 이해하고 기록을 자동으로 분류하는 일은
문자열 파싱만으로 해결하기 어려웠다.
그래서 기획서까지 써 두고도,
아이디어를 그대로 묵혀두었다.
ChatGPT가 등장한 뒤 내가 가장 먼저 시험한 것은 ‘이번 주 토요일’과 ‘내일 저녁 7시’를 제대로 이해할 수 있는가였다.
여러 언어에서도 가능하다는 것을 확인한 날부터, 다시 만들기 시작했다.
제목 없이, 나에게 채팅하듯
‘내일 저녁 7시’가 일정이 된다
메모가 할 일과 알림이 된다
‘여행’ 한 단어로 과거를 찾는다
내가 그린 이 서비스의 완성형은 모든 흐름이 연결되어 있어야 했다.
언제 어디서나 적고, 어디서든 꺼내 볼 수 있을 것.
출근길에 떠오른 생각은 폰에 적고,
회사에서는 PC와 웹으로 이어 보고,
웹 서핑 중에는 크롬 확장으로 끌어다 저장하고,
공용 PC에서는 QR 코드로 로그인해 확인한다.
서버, 모바일, 웹, 크롬 확장 — 그래서 모두 만들었고 끊김없이 연동된다.
모바일 — 혼잣말처럼 기록데스크탑 — 한 기록, 모든 기기웹 + QR 로그인크롬 확장 — 웹에서 바로
다국어에도 욕심을 냈다.
나에게 채팅하듯 기록을 모으는 사람은 전 세계에 있을 테니,
기왕 LLM을 쓰는 김에 최대한 열어두기로 했다. 40여 개 언어를 번역해 적용했다.
그 언어들이 쓰이는 나라를 세면, 130여 개국이 넘는다.
번역만 한 것이 아니다. 41개 언어의 스토어 스크린샷도 모두 따로 제작했다.
← 마우스를 좌우로 움직여 보세요 (모바일: 손가락으로 쓸기) →
기술이 준비되지 않았을 때는 기다리고,
가능해지는 순간에는 제품으로 옮긴다.
UPAD가 아이패드를 기다렸듯, monolog는 LLM을 기다린 셈이다.
나는 기능을 하나씩 쌓으며 제품의 형태를 찾는 편이 아니다.
먼저 사용 장면을 생각한다.
사람이 어디에서 무엇을 누르고, 그다음 어떤 일이 일어나야 하는지
머릿속에서 여러 번 작동시켜 본다. 흐름이 선명해지면 그때 코드를 작성한다.
아이패드를 처음 본 뒤 몇 달 만에 UPAD를 만들 수 있었던 것도,
기술보다 먼저 완성된 사용 장면이 머릿속에 있었기 때문이다.
현상에서 원리를 거꾸로 추론한다
일상에서도 비슷하다.
식당에서 간짜장의 이름이 어디서 왔는지 생각하고,
자동차 번호판의 글자가 어떤 규칙으로 정해졌는지 추론한다.
표면에 보이는 현상에서 규칙을 찾고,
가설을 세운 뒤 반례를 대입한다. 간짜장·LA갈비·자동차 번호판 — 실제 추론 장면 보기
데이터를 다룰 때도 같은 방식으로 생각한다.
이 피처가 실제 원인을 설명하는가.
아니면 결과를 원인처럼 보이게 만드는가.
이 숫자는 정말 좋은 성능인가.
혹시 데이터가 미래를 미리 보고 있는 것은 아닌가.
연구 방법을 따로 배운 뒤 생긴 습관이라기보다,
오랫동안 세상을 바라보던 방식이 데이터에서도 그대로 작동한 것이다.
숫자를 보기 전에 대략적인 크기를 잡는다
어릴 때부터 계산하기 전에,
답이 대략 어느 정도여야 하는지를 먼저 생각하는 버릇이 있었다.
IQ 테스트에서 가장 자신있던 문제도
수열의 다음 숫자나 도형의 다음 배치를 맞히는 문제였다.
지금도 데이터를 보면 먼저 범위를 떠올린다.
MAE 1.03, 상관계수 0.956, 수익률 400%.
계산상 가능하더라도
예상 범위를 지나치게 벗어나면 일단 의심한다. 그 감각이 여러 번 오류를 찾아냈다.
지금 · 배차추천 ML (GROUND Sherpa)
데이터가 물리 세계에 개입할 때 필요한 검증
스쿠터를 어디에 배치하고 언제 수거할지
추천하는 머신러닝 시스템이다.
최근에 코드 작성은 AI에 맡긴다.
대신 어떤 데이터를 사용할지, 어떤 피처가 현실을 설명하는지,
결과를 어디까지 믿을지는 직접 판단한다.
MAE가 갑자기 1.03까지 낮아졌을 때는
좋은 결과라고 받아들이기보다 미래 정보 누수를 의심했다.
상관계수 0.956이 나왔을 때도 마찬가지였다.
데이터를 나누어 살펴보니 예측력이 아니라,
현장 작업이 늦게 반영되면서 생긴 착시에 가까웠다.
실험 결과가 계속 이상하게 나왔을 때
AI는 모델의 한계나 데이터의 불규칙성을 원인으로 제시했다.
하지만 데이터 생성 과정부터 다시 확인했고, shift(24)가 24시간 전이 아니라
24개 레코드 전을 가리키고 있다는 버그를 찾았다.
현실의 데이터는 깔끔하지 않다.
교재나 경진대회의 정제된 샘플 데이터가 아니다.
희소하고, 늦게 도착하고, 사람의 작업과 운영 상황이 뒤섞여 있다.
그래서 모델의 정확도만 높이는 것으로는 충분하지 않았다.
KPI도 예측 정확도에서 ‘스쿠터 한 대가 하루 동안 만드는 트립 수’로 바꾸었다.
모델의 목적은 정답을 잘 맞히는 것이 아니라,
실제 배치를 통해 운영 가치를 만드는 것이기 때문이다.
추천 하나에 트럭이 움직이고,
스쿠터 수백 대의 위치가 달라진다.
데이터가 물리 세계에 개입할 때 필요한 검증을,
실제 프로덕션 환경에서 하고 있다.
권역(res9 셀)별 배치·수거 추천 + 예상 개선치. ‘예측 잘하기’가 아니라 ‘배치로 가치 만들기’로 KPI 자체를 다시 정의했다.
코로나 이후, 누구나 주식으로 돈을 벌던 시절이었다.
10년 된 연금저축의 수익률이 얼마 되지 않는 것을 확인하고,
해지한 돈을 아내와 반씩 나누어 각자 투자를 시작했다.
아내는 바로 삼성전자 같은 대형 우량주를 샀다.
나는 PER, PBR, 이동평균선, 장대양봉 같은 기초 용어도 모르면서 시작하는게 싫어서
큰돈을 들여 영상 강의를 듣고, 도서관에서 주식책을 빌려 용어부터 배웠다.
그러다 꽂힌 책이 “세력주/급등주 따라잡기”.
기업 가치나 재무제표 같은 투자 원칙은 뒤로한 채
차트와 보조지표만 보며 잡주에 투자했고,
오랫동안 손실도 보았다.
그 경험은 나중에 자동매매 엔진이 학습하는 57개 피처의 의미가 됐다.
보조지표를 단순히 가져다 쓰지 않고,
보조지표의 이동평균과 변화량을 다시 구성했다.
매매하면서 한 가지를 체감했다.
차트의 지표는 단순한 숫자가 아니라, 수많은 매매자의 심리가 압축된 흔적이라는 것이다.
그 잠재 패턴을 머신러닝이 찾아낼 수 있다고 생각했다.
첫 백테스트에서 연간 수익률이 400%를 넘었을 때도
좋아하기보다 먼저 코드를 확인했다.
결과적으로 미래의 값을 보고 매수하는 인덱스 버그가 있었다.
좋은 결과였지만, 폐기했다.
이후 모델을 여러 차례 다시 만들었고,
정보 누수 가능성을 전수 조사했다.
그 과정에서 알파의 82%가 사라졌다.
그래도 남은 결과를 선택했다.
높은 숫자보다, 실제로 재현 가능한 숫자가 중요하기 때문이다.
자동매매를 만들며 얻은 것은 매매 기술만이 아니었다.
손실을 통해 체득한 도메인 지식,
수치를 보기 전에 이상함을 감지하는 감각,
성과가 좋을수록 더 강하게 의심하는 습관이었다.
고등학교 2학년 때,
친구의 형이 다니던 학과를 알게 됐다.
학과 소개에는 이런 내용이 있었다.
“프로그래밍을 배우고, 기계공학을 바탕으로 공장자동화와 로봇 시스템을 설계하고 구현한다.”
그 문장에 반해버렸다.
선생님은 서울대를 권했지만,
나는 인하대학교 자동화공학과를 선택해 수석으로 입학했다.
그리고 오랫동안, 그 문장을 잊고 지냈다.
요즘은 피지컬 AI 회사들의 소개와 채용 공고를 읽는다.
프로그래밍, 기계공학, 자동화, 로봇.
열일곱살의 나를 설레게 했던 문장들이,
30여 년 만에 다시 눈앞에 있다.
이론은 나보다 잘 아는 사람이 많다.
지금의 내가 가져갈 수 있는 것은
직접 만들어보고, 실패하고, 손실을 보고,
그 과정에서 생긴 의심을 시스템으로 바꾸어온 경험이다.
내가 하려는 일은
연구된 모델이 현실의 데이터와 운영 속에서 실제로 작동하게 만드는 것이다.
예측이 행동이 되고,
행동의 결과가 다시 데이터로 돌아오는 회로.
그 회로를 스쿠터와 주식에서 이미 만들어 보았다.
Windows CE에서 iOS로,
클라이언트 개발자에서 풀스택 개발자로.
이미 두 번의 큰 전환을 건넜다. 지금, 세 번째 전환을 준비하고 있다.
증거
27년간 검증 가능한 기록
2011애플 앱스토어 ‘올해의 아이패드 앱’ 1위 — UPAD
2006HP 애플리케이션 공모전 수상 — 포키패드
2003제1회 네스팟 스윙 포켓PC 컨테스트 수상 — InfoBox
2001제1회 컴팩 아이팩 포켓PC 경진대회 우수상 — GDiary
혼자 만든 앱들은 App Store에서만 373만 건 다운로드됐다.
UPAD Lite 한 개의 다운로드만 215만 건이고, 유료 앱인 UPAD for iCloud도 56만 카피가 팔렸다.
2001년부터 10여 년 동안 새로운 제품을 만들 때마다 외부의 평가를 받았고,
그 기록은 지금도 확인할 수 있다.
App Store Connect 판매 대시보드 — 2010.3 ~ 2026.7 누적 3.73M. UPAD Lite 2.15M, iColoringBook Lite 837K, UPAD for iCloud 562K…
단편적인 사실에서 그럴듯한 인과를 즉석에서 구성하고,
검증해 진실에 다가간다.
식당에서든 데이터 앞에서든, 작동하는 엔진은 같다.
① LA갈비 — 지어낸 이야기 (미검증)
가족 식사 자리에서 누가 물었다. “근데 왜 LA갈비지?”
손에 쥔 단서는 셋 — LA, 갈비, 뼈를 가로질러 썬 모양. 그 자리에서 이야기를 지어냈다. “전쟁 후 LA 한인타운에 정착한 이민자들이, 미국인이 안 먹고 버리던 갈비를 싸게 사들였는데,
갈비를 손질해 본 적 없는 정육점 직원이 전기톱으로 뼈에 직교로 썰어줘서 그 모양이 됐고,
구워 먹으며 퍼져 LA갈비가 됐다.”
이번엔 간짜장이었다. 간이 세지도 않은데 왜 간짜장일까. 즉석에서 추론이 굴러갔다. 일반 짜장은 대용량으로 끓이며 전분물로 농도를 맞추지만,
간짜장은 재료를 그 자리에서 볶아 나온 수분만으로 만든다.
물을 넣지 않는 짜장 — 마를 건(乾), 건짜장. 그 중국 발음이 ‘간짜장’으로 들렸을 것이다.
“이것도 뻥이야~” 하고 인터넷을 찾아봤더니, 이번엔 진짜였다.
구성요소의 논리로 쌓아 올린 추론은, 생각보다 자주 맞는다.
③ 자동차 번호판 — 아들과 함께, 그리고 정련
아들이 물었다. “번호판은 왜 한글을 다 안 쓰고 자릿수를 늘려?”
좋은 질문이었다. “처음부터 같이 추론해보자.” 우리가 세운 가설 — 카메라와 사람 눈으로 식별해야 하니, 먼지가 묻으면 다른 글자로 보일 글자를 뺐을 것이다.
아들이 되물었다. “ㅇ과 ㅎ도 둘 다 쓰이는데?” 가설을 깎았다. “ㄱ이 ㅋ으로 보이는 건 작은 획 하나 차이지만,
ㅇ과 ㅎ은 동그라미의 위치와 크기가 통째로 다르다.”
진짜 불변식은 글자 수가 아니라, 열화됐을 때 서로 헷갈릴 가능성(confusability)의 최소화였다.
나중에 찾아본 정설 — 받침 없는 글자만 써서 인식률을 높였고,
1996년에 “발음이 힘들고 혼란의 여지가 있는 글자”를 뺐다. 우리 가설과 겹쳤다.
결국 같은 엔진이다. 가설을 세우고(LA갈비), 검증하고(간짜장), 반례에 정련한다(번호판). 데이터·모델 앞에서 이 엔진은
“성능이 너무 좋으면 leak이다”가 된다 — 그럴듯한 거짓을 가장 잘 짓는 사람이, 가장 엄격한 검증가가 된다.
공부만 하던 어느 저녁, 밥을 먹으러 동네 식당에 들어갔다.
메뉴는 칠판에 적힌 태국어 꼬부랑 글씨뿐, 단 한 글자도 읽을 수 없었다.
관광지가 아니니 영어 메뉴도 사진도 없다.
뭘 파는 집인지도 모른 채, 손가락으로 아무거나 가리켰다.
칠판에 태국어뿐인 메뉴판. 여기서 뭘 고를 수 있을까.그렇게 나온 국수 — 몇 젓가락 뜨다 말았다.
나온 국수는 시쿰하고 맛이 없었다. 몇 젓가락 뜨다 내려놓고, 젓가락을 든 채 멍하니 생각했다. 아니, 왜 사진 메뉴가 없는 거야. 사진만 있어도 시킬 수 있을 텐데.
답은 금방 나왔다 — 인쇄와 갱신이 번거로워서다. 신메뉴 하나 넣을 때마다 다시 찍어야 하니까.
진짜 그런지 확인하고 싶어서, 그날부터 식당에 갈 때마다 메뉴판을 사진으로 모았다.
어딜 가나 같은 문제였다.
영어가 몇 단어 있으면 그나마 짐작이라도 할 수 있었지만.
모은 메뉴판 ①모은 메뉴판 ②모은 메뉴판 ③
해법은 머릿속에 이미 그려져 있었다. “테이블마다 QR만 붙인다.
스캔하면 사진 메뉴가 뜨고, 주문하면 점주 앱이 확인·결제한다. 신메뉴 등록도 사진 한 장.”
마침 손에는 막 배운 풀스택이 있었다. 그래서 그냥, 만들었다.
Sketch로 디자인을 그리고, React Native로 고객앱과 점주 관리앱을,
React·GraphQL·Apollo·Node로 백엔드를 세웠다.
고객 메뉴 디자인주문 폼점주 관리앱
실기기 (React Native)GraphQL 백엔드
실기기 데모까지 만들었다.
QRCodeMenu — 스캔 → 사진 메뉴 → 주문. 실기기 데모(2018).
백종원 선생님을 찾아가고도 싶었다.
그 당시 방영하던 “백종원의 푸드트럭”에 적용하면 딱 맞을 서비스 같았다.
실제로 찾아가지는 못했지만, 이런 서비스가 우리나라에서 보편화된 건 그로부터 몇 년이 지난 뒤의 일이다.
abduction + scratch-your-own-itch + 풀스택, 한 이야기에. 못 읽는 메뉴(현상)에서 “사진 메뉴가
없는 이유”(원리)를 캐고, 좌절한 나 자신을 위해, 막 배운 풀스택으로 직접 — 내 모든 기질이 한 장면에 담겼다.
좋은 숫자일수록 의심한다.
코드는 AI가 쓰고,
데이터를 피처로 빚는 직관과 검증은 사람이 한다.
“너무 좋은 결과는 의심하라”
AI가 흥분했다. “하차 피처가 압도적입니다. MAE가 1.03까지 내려갑니다.”
나는 베이스라인 1.70이 갑자기 무너진 게 눈에 걸렸다. “너무 낮아지는데. 기준과 목표가 제대로 설정된 거 맞아?”
코드를 다시 뒤졌다. net_flow = trip − arrival —
타겟이 피처에 섞여 있었고, 미래 정보가 새고 있었다. 고치고 나니 1.27. 그게 정상값이었다.
상관 0.956이 “의심스럽게 높다” → 예언가가 아니라 nowcaster
모델 예측과 실측의 상관이 0.956 — 현장 작업자(0.77)보다 훨씬 높았다.
기뻐할 일 같지만, 곧장 누수 감사에 들어갔다.
분해해 보니 ‘멍청한 30일 평균’만으로도 0.988이 나왔다. 모델의 고유 예측력은 0.14~0.18뿐.
모델이 ‘먼저 아는’ 이유는 빨라서가 아니라, 작업자가 8주 늦어서였다.
거창한 예언가 행세를, 정직한 nowcaster로 격하시켰다.
shift(24) — 상식 한 줄로 잡은 버그
며칠간 모든 실험이 이상하게, 그것도 일관되게 안 풀렸다.
AI는 매번 ‘모델의 한계’라는 그럴듯한 해석을 내놨다. 나는 상식에서 멈췄다. “날씨·시간 피처면 패턴이 더 모여야지, 왜 흩어져? 데이터 만드는 스크립트가 틀린 거 아냐?”
10분짜리 코드리뷰로 끝났다. shift(24)는 ‘24시간 전’이 아니라 ‘24개 레코드 전’을 보고 있었다 —
희소한 데이터라 실제로는 9일 전 값, 오류율 79%.
모델이 중요하다고 꼽은 피처 Top4 중 3개가 이 버그였다.
모델은 노이즈를 외우고 있었던 것이다. 며칠치 모델을 전량 폐기했다.
KPI 자체를 갈아엎다 + 한계효용
AI가 ‘MAPE 16% 개선’을 ‘운영효율 16%’처럼 포장했을 때는, 목표 자체를 갈아엎었다.
수요예측 정확도가 아니라 스쿠터 대당 하루 트립(TPD)의 최대화 —
예측이 아니라 가치가 목적이니까.
‘평균 매력도 상위 k곳’ 배치가 강남역 몰빵을 불렀을 때는 엔진을 다시 설계했다. 한 대를 놓고, 그다음 한 대를 어디 둘지 다시 계산하라 — 한계효용의 문법으로.
TPD 예측 · 권역 대시보드배치/수거 추천 + 예상 개선
AI에 대체되는 게 아니라, AI를 실행자로 부린다. 직관(가설)과 검증(채점)이라는 인간 핵심을 쥐고, 코딩은 AI에 위임
— 27년 검증 본능이 ‘남의 돈이 걸린 프로덕션’에서 그대로 작동한다. 그리고 이 검증은 리더보드가 아니라 물리 세계 — 트럭, 작업자, 거리의 스쿠터 — 에 닿아 있다.
도서관에서 빌린 책 서너 권으로 용어부터 익혔고, 유료 강의도 들었다.
그러고도 차트와 지표만 보며 잡주로 오래 잃었다. 그런데 그 수업료가 사라지지 않았다. 지금 매매엔진이 학습하는 57개 피처의 의미를 아는 건, 전부 잃어본 자리이기 때문이다.
MACD·RSI·볼린저·MFI를 다루는 건 기본이고, 보조지표의 이동평균까지 직접 고안한다.
지표를 소비하지 않고, 짓는다.
“모든 지표는 매매자의 심리다” — 표현학습을 스스로 도출
처음엔 회의적이었다. 끝난 차트로 미래를 어떻게 안다는 건가. 그러다 생각이 뒤집혔다. 모든 지표엔 매매자들의 손절과 익절, 본전 탈출의 심리가 응축돼 있고,
눈에 안 보이는 그 잠재 패턴을 ML이 뽑아낸다. “마치 딥러닝처럼. 피처가 몇십 개라도 결국 그 방식이지.”
표현학습(latent feature)이라는 개념을, 강의가 아니라 내 매매로 직관한 셈이다.
좋은 숫자를 스스로 사형하다
프로젝트 첫날, 백테스트가 연간 수익률 400%를 찍었다. 환호 대신 코드를 뜯었다.
신호와 시뮬레이션의 인덱스가 252봉쯤 어긋나, 미래를 보고 매수하고 있었다. 즉시 거짓 판정.
종가베팅 전략이 leak 검증을 통과한 뒤에도 미시구조까지 파고들었고, 이기는 종목의 73%가 상한가에 잠겨 살 수 없는 종목이라는 걸 적발했다.
전수 leak 감사로 알파의 82%가 사라졌다. 그래도, 진실을 택했다.
라이브 대시보드
보유·수익
종목 AI 추론
매매 신호
차트·지표
숫자를 보기 전에, 크기부터 잡는다. 결과가 나오기 전에 ‘대략 얼마여야 하는지’를 먼저 어림하고, 자기 결과를 끝까지
의심하는 검증 — 데이터 앞에서 쓰는 이 근육을, 손실이 길렀다.
훗날 알게 된 이름으로, 이것은 Signed Distance Field 렌더링이다.
Valve가 논문으로 발표한 게 2007년 — 이 코드는 그보다 몇 년 앞서,
GPU가 아니라 200MHz CPU 위에서 돌고 있었다.
백미 — 픽셀당 덧셈 한 번
거리 계산엔 곱셈과 나눗셈과 제곱근이 든다. 픽셀마다 하면 200MHz가 못 버틴다.
그래서 쥐어짰다. 한 행 안에서 x가 1씩 갈 때 직선까지의 거리는 늘 같은 양만큼 변한다 —
그 변화량을 미리 유도해 두면:
if (fxDistForLine == 0)
{ // 행의 첫 픽셀만 점-직선 거리 공식으로 계산하고
fxDistForLine = (((fxCY * (fxBlockX - ptStart.x))
+ (fxCX * fxBlockStartGap)) / fxDistCXCY);
}
else
{ // 그다음부터는 — 픽셀당 덧셈 한 번
fxDistForLine += fxDistGapForX;
}
제곱근도 곱셈도 루프 밖으로 쫓겨났다. Bresenham이 정수 직선에서 쓴 증분의 사고를,
거리장 위에 옮겨 얹은 것이다.
스캔라인의 시작·끝 위치도 같은 증분으로 굴러간다 —
픽셀 하나의 비용이 공짜에 가까워질 때까지.
펜촉 형상 연구기울기에서 시작하는 유도원과 접선, 보조선
형광펜이 얼룩지지 않는 이유
반투명 획엔 조용히 어려운 문제가 하나 있다.
획은 짧은 마디들의 연속이라 마디끼리 겹치는데, 겹친 자리가 두 번 칠해지면 형광펜에 얼룩이 진다.
답은 픽셀마다 ‘지금까지 칠해진 최대 농도’를 기억하는 마스크 버퍼 —
그리고 이미 칠해진 픽셀의 농도를 올릴 때의 보정식이다.
if (bPercent > bMaskBlock) // 이미 칠한 농도보다 진할 때만
{
int bMaskGap = (bPercent - bMaskBlock);
*(pBufferBlock) = (blue - bufferBlue) * bMaskGap / _bMaskBlock + bufferBlue;
...
*pMaskBlock = bPercent; // 커버리지 갱신 — 얼룩은 여기서 죽는다
}
이 보정식은 알파 합성 대수를 거꾸로 풀어야 나온다. 논문에는 없는 문제다 —
필기 앱을 실제로 출시해서, 형광펜으로 얼룩을 만들어 본 사람만 아는 문제니까.
정직한 좌표
거리 기반 안티알리아싱은 학계에 있었다 — Gupta-Sproull, 1981.
나도 알고는 있었다. 컴퓨터그래픽스 수업에서 배웠으니까.
그 원리를 어느 정도 알고 시작했다. 다만 어디까지가 배운 것이고 어디서부터가 내 생각인지,
20년이 지난 지금은 나도 가려낼 수 없다.
분명한 것은 수업과 논문이 원리까지였다는 것,
그리고 200MHz 위에서 지연 없이 돌게 만드는 일과
형광펜의 얼룩 같은 제품의 문제는 거기 없었다는 것이다.
그 엔진이 포키패드가 되고, 10년 뒤 UPAD가 됐다.
그리고 이것이, 그 모든 수식이 화면에 도착한 모습이다.
2008년 포키패드 매뉴얼에 직접 그려 넣은 소개 컷 —
확대경 안에 픽셀 단위로 옅어지는 가장자리가 보인다. ‘보다 빠르고’는 픽셀당 덧셈 한 번이, ‘부드러운’은 거리로 정한 알파가,
글자 밑의 노란 형광펜은 마스크 버퍼가 만든 것이다.
확대해도 깨지지 않는 데는 이유가 하나 더 있다. 이 엔진은 화면에 찍힌 픽셀을 저장하지 않는다.
획을 점과 폭의 데이터 — 벡터로 들고 있다가,
배율이 바뀔 때마다 방금 그 수식으로 처음부터 다시 그린다.
매뉴얼의 세 컷이 그 증명이다 — 같은 획을 아무리 당겨도, 가장자리는 계속 매끄럽다.
그때 나는 이 엔진이 세상에서 가장 빠르다고 생각했다. 입 밖에 낸 적은 없지만.
원본 배율확대 — 픽셀이 아니라 획이 커진다더 확대 — 가장자리는 여전히 매끄럽다
2008 매뉴얼 “벡터 드로우 방식으로 미려한 확대/축소” — “확대/축소 시 픽셀이 깨지지 않고 부드럽게 표현됩니다.”
필기를 그림이 아니라 데이터로 다룬 것 — 같은 생각이 훗날 monolog까지 이어진다.
제목 없는 채팅 한 줄 뒤에서 벌어진 일 —
시간을 품은 UID, 손바닥 위의 페이지네이션,
그리고 40여 개 언어와 1,600장의 스크린샷.
시간을 품은 UID
monolog는 로컬 퍼스트다. 네트워크가 없어도 기록은 즉시 저장되고,
연결이 돌아오면 서버와 맞춰진다. 이 구조가 성립하려면 첫 단추가 하나 있다 —
오프라인의 기기들이 서버에 묻지 않고 각자 ID를 만들어도,
나중에 합쳤을 때 충돌하지 않고 시간순이 유지되어야 한다는 것.
그래서 메시지의 UID에 처음부터 시간 정보를 넣어 설계했다. ID를 정렬하면 그게 곧 타임라인이 되도록.
서버가 하던 일을, 손바닥 위에 다시 짓다
로컬 퍼스트를 끝까지 밀면 청구서가 온다.
서버의 Postgres가 하던 검색과 페이지네이션을, 이제 손안의 메모리에서 직접 해야 한다.
메시지를 노드로 들고, 로드된 구간과 안 된 구간의 경계를 표시하고 —
끊어진 자리를 잇는 장치에는 Splitter라는 이름을 붙였다 —
10년 전 날짜로 점프했다가 다시 현재로 돌아오는 이동을 감당해야 한다.
‘다음 페이지가 있는가’라는 단순해 보이는 질문조차 까다로웠다.
로컬 캐시는 “내가 더 갖고 있다”만 알 뿐, “서버에 더 있는지”는 모른다. 그래서 원칙을 세웠다. 그 답의 권한은 서버에만 있다. 로컬은 ‘있다’고 올릴 수만 있고, ‘없다’고 내릴 수는 없다.
메모리에 얼마를 남기고 얼마를 버릴지도 전부 직접 정했다.
// 한 번에 100개를 부르고, 화면 주변에 500개까지 들고, 3,000개까지 캐시한다
DEFAULT_LOADING_MESSAGE_COUNT = 100;
MAX_LOADED_MESSAGE_COUNT = 500;
MAX_MESSAGE_CACHE_COUNT = 3000;
그렇게 커서와 경계 노드, 캐시 정책, 정합성 규칙을 하나씩 쌓고 나서야 알았다. 이 구조, 실제 데이터베이스 엔진이 안에서 하는 일과 같다.
AI 셋이 서로의 번역을 검증하다
40개 언어는 한 번 번역해서 끝나는 일이 아니었다. 파이프라인을 고정했다 —
Gemini가 초벌을 하고, GPT가 리뷰하고, Gemini가 수정하고, Claude가 최종 중재한다.
세 AI의 교차검증을 돌리자 기존 번역 287개 키 가운데 274개가 고쳐졌다. 95.5%다.
이탈리아어 자리에 영어가 들어가거나 키릴 문자 언어에 라틴 문자가 섞이는 실패는
자동으로 감지되게 만들었고, 공지 240건은 자소 단위로 직접 검수했다 —
여섯 개 언어에서만 마크업 앞 관사를 제거하고, 번체 중국어의 您은 你로 바꿔 톤을 데웠다.
그 홈페이지들은 지금도 전부 열려 있다 — 언어를 누르면 그 언어의 monolog 홈페이지가 열린다.
1,600장의 스크린샷
40개 언어가 실제 화면에서 제대로 보이는지는 번역 파일만으로 알 수 없다.
그래서 앱을 언어별로 자동 구동해 언어당 40장씩,
1,600장의 스크린샷을 찍는 도구를 만들었다.
그 화면들을 한 장 한 장 — 번역이 맞는지, 레이아웃이 깨지지 않는지,
오타가 없는지 — LLM과 함께 검수했다.
스토어에 올릴 스크린샷과 설명은 따로 제작해,
Apple과 Google 양쪽 스토어에 단일 커맨드로 올리는 업로드 도구까지 만들었다 —
실수로 일부만 올려 기존 세트를 날리는 사고까지 도구가 막아준다.
40개 언어 × 언어당 40장 — 자동 구동으로 캡처한 1,600장의 검증 스크린샷.
이 모든 수고의 방향은 하나다 — 사용자에게 수고를 시키지 않는 것. 제목을 짓게 하지 않고, 태그를 달게 하지 않고, 시간
계산을 시키지 않고, 어느 나라 말로 쓰든 제 언어로 맞아준다. 그리고 검색에는 상한이 없다 — 관련이 있으면, 10년 전 기록도 전부 보여준다.