- 개발자 도구는 컴퓨터가 실행할 논리뿐 아니라 다른 사람이 이해하고 사용할 정신 모델까지 설계해야 해서 더 어려움
- 빠른 온보딩은 부가 기능이 아니라 제품 자체에 가까우며, 설정·API 토큰·초기 실행 마찰을 줄여 몇 분 안에 노트북에서 써볼 수 있어야 함
- 사용자는 긴 핵심 개념 설명보다 작동하는 예제를 바꿔 보며 패턴을 익히고, 문제에 가까운 출발점이 많을수록 성공 가능성이 커짐
- 오류 메시지, 개념 수, 이름 짓기, 설정 방식, 기본값, 매직, 문법 설탕은 모두 사용자의 성공 경로를 바꾸므로 읽기 쉽고 커스터마이즈 가능한 설계가 필요함
- 좋은 개발자 경험은 기능을 단순히 줄이는 일이 아니라, 만들 수 있는 범위는 유지하면서 알아야 할 복잡성을 크게 낮추는 일임
인간을 위한 코드는 정신 모델까지 다룸
- 컴퓨터를 위한 코드는 큰 비즈니스 목표를 논리적 문장으로 쪼개 컴퓨터가 따를 수 있게 만드는 작업임
- 프레임워크, 라이브러리, API, SDK, DSL, 임베디드 DSL, 프로그래밍 언어처럼 사람이 직접 다루는 코드는 실행 가능성만으로 충분하지 않음
- 이런 코드는 컴퓨터에 지시하는 동시에, 사용자가 그 코드를 어떻게 읽고 이해할지도 함께 다뤄야 함
- 개발자 도구 설계에는 컴퓨터 과학뿐 아니라 사용자의 추론 방식을 고려하는 심리적 이해가 필요함
시작 경험이 곧 제품임
- 개발자 도구의 피드백은 대개 제품을 자주 쓰는 파워 유저에게서 많이 옴
- 시작 단계에서 막힌 사용자는 피드백을 남기지 않기 때문에 생존자 편향이 생김
- 소비자 제품이 온보딩 퍼널을 최적화하듯, 개발자 도구도 첫 실행까지의 과정을 제품의 핵심으로 봐야 함
- 빠른 온보딩을 위해서는 제품 구조 자체를 바꿀 가치가 있음
- 필수 설정 제거
- API 토큰 설정을 매우 쉽게 만들기
- 초기 마찰 줄이기
- 사용자가 몇 분 안에 자신의 노트북에서 제품을 써볼 수 있게 만들기
- 개발자 도구가 너무 많아진 환경에서는 사용자가 특정 LRU cache NPM 패키지의 차이를 깊게 이해할 에너지나 인내심을 갖기 어려움
예제는 핵심 개념보다 빠르게 가르침
- 사람은 엄격한 명령을 따르는 컴퓨터와 달리 패턴 매칭에 강함
- 많은 개발자 도구 문서는 핵심 데이터 모델, 관계, 원자적 개념, 설정, 실행 방법부터 설명하지만, 사람은 작동하는 사례를 바꾸고 결과를 보며 더 잘 배움
- 5,000단어짜리 “core concepts” 설명보다 여러 개의 예제가 더 유용할 수 있음
- 사용자는 예제를 보며 도구의 동작 방식을 익힘
- 해결하려는 문제가 있는 사람은 충분히 가까운 출발점을 찾을 수 있음
- 출발점이 많을수록 필요한 것에 가까운 예제를 만날 가능성이 커짐
사용자를 성공의 구덩이로 밀어 넣기
- 프로그래밍의 기본 상태는 어떤 종류의 오류를 계속 고치는 일에 가까움
- 사용자는 도구를 쓰는 시간 대부분을 “무엇이 동작하지 않는지” 파악하는 데 쓸 수 있음
- 개발자가 더 빨리 성공하면 도구를 좋아하지만, 오류에 계속 막히면 도구를 탓하게 됨
- 모든 오류는 사용자를 행복한 경로로 되돌릴 기회임
- 예외 메시지에 코드 스니펫 넣기
- 사용자가 이상한 일을 할 가능성이 있을 때 유용한 경고 출력하기
- 사용자가 성공하는 데 필요한 조치 제공하기
개념 과부하 줄이기
- 도구를 쓰기 전에 이해해야 하는 새로운 개념은 각각 마찰 지점이 됨
- 2~3개 개념은 받아들일 수 있어도, 8개 새 개념을 배우려는 사용자는 많지 않음
- Kubernetes는 시작할 때 모든 개념이 필요하지는 않지만, 새 개념이 많아질수록 부담이 커짐
- 강력하면서도 3~5개 개념만 가진 프레임워크에는 우아함이 있음
- React를 처음 쓸 때 한두 시간 뒤 개념적 언덕을 넘으면, 몇 개의 단순한 빌딩 블록으로 큰 구조를 만들 수 있다는 느낌을 줄 수 있음
- 목표는 단순히 개념 수를 줄이는 것이 아니라, 만들 수 있는 범위를 유지하면서 사용자가 알아야 할 개념을 줄이는 것임
- 훌륭한 도구는 복잡성을 90% 줄이면서 능력을 그대로 유지할 수 있음
- 복잡성을 90% 줄이고 능력을 10%만 줄이는 도구도 나쁘지 않음
개념적 오리 원칙
- 프레임워크 안에 값을 받아 새 값을 계산하는 요소가 있다면 “compute node”, “valuator”, “frobniscator” 같은 새 이름보다 function이라고 부르는 편이 나음
- 어떤 것이 오리처럼 걷고 오리처럼 꽥꽥거리면 오리일 가능성이 높다는 원칙을 개념 설계에도 적용할 수 있음
- 미묘한 차이가 있거나 값이 캐시되더라도 function에 충분히 가깝다면 function이라고 부를 수 있음
- 기존 용어를 쓰면 사용자가 이미 가진 정신 모델에 연결되어 설명해야 할 양이 크게 줄어듦
프로그래밍 가능하게 만들기
- 사용자는 코드베이스로 예상 밖의 일을 하며, 프레임워크 요소를 for-loop 안, 함수 안, 다른 구조 안에 넣을 수 있음
- 그래서 프레임워크의 거의 모든 것은 프로그래밍 가능해야 함
- 관련 설계 방향은 서로 연결되어 있음
- CLI를 거치지 않고 코드에서 직접 호출할 수 있게 하기
- 설정 파일을 줄이고 SDK나 API로 바꾸기
- 하나만 만들 수 있게 하지 말고 매개변수화해서 n개를 만들 수 있게 하기
- 이런 설계는 사용자가 새로운 사용 사례를 발견하게 만들 수 있음
- 프레임워크 위에서 “해킹”하려는 욕구를 활용하면 약간의 혼란이 생겨도 예상 밖의 발견으로 이어질 수 있음
매직, 기본값, 문법 설탕은 신중해야 함
- 클라우드에서 Jupyter notebook을 실행하는
run_notebook함수가 있고, 사용자가 어떤 컨테이너 이미지를 쓸지 지정해야 한다고 가정함 - 가능한 선택지는 여러 가지임
image=...인자를 항상 필수로 받기- 대부분의 데이터 과학 라이브러리가 설치된 기본 이미지를 두고 사용자가 오버라이드하게 하기
- 셀의 코드를 검사해 필요한 의존성에 따라 “매직” 방식으로 이미지 고르기
- 매직 방식에 더해 사용자가 특정 이미지를 선택할 수도 있게 하기
- 입력량을 줄이고 가장 넓은 사용 사례를 지원하려면 마지막 선택지가 좋아 보일 수 있음
- 하지만 첫 번째 선택지를 제외하면 문제가 남음
- 매직은 일부 상황에서 깨짐
- 기본값에 의존하는 코드를 읽는 사용자는 커스터마이즈 가능성을 알아차리지 못할 수 있음
- 기본값이 97% 이상 적용되고 매직이 99% 이상 맞는 수준이 아니라면 매우 신중해야 함
- 코딩은 골프가 아니며, 도구 제공자의 일이 사용자가 쓰는 코드 양을 최소화하는 것만은 아님
- Perl은 짧은 코드에 강하게 최적화했지만 프로그램이 특수문자 나열처럼 보일 수 있었고, Python은 코드가 50% 길어도 읽기 쉽고 이해하기 쉬웠음
- 사람들은 코드를 쓰는 것보다 10배 더 많이 읽기 때문에 읽기 쉬움이 중요함
- 문법 설탕도 같은 기준으로 봐야 함
- 흔한 사용 사례에 특수 문법을 넣고 싶을 수 있음
- 하지만 일관성을 흐리고 커스터마이즈 방법을 덜 명확하게 만들 수 있음
- 문법 설탕이 99% 이상 적용되지 않는다면 도입하지 않는 편이 나을 수 있음
처음 쓰는 사람을 위한 설계 원칙
- 인간을 위한 코드 작성에는 더 많은 설계 문제가 남아 있음
- 대부분은 불변이어야 하지만 전부는 아님
- 스캐폴딩, 즉 코드 생성을 피하기
- 피드백 루프를 매우 빠르게 만들기
- 사용자가 폐기 예정 기능에 쉽게 대응할 수 있게 하기
- 문서와 예제의 코드 스니펫에 자동화 테스트 쓰기
- 첫 사용자 경험을 설계하는 일은 팝송을 만드는 일과 비슷함
- 프로듀서는 노래를 천 번 듣더라도, 999번째 들을 때 처음 듣는 사람에게 어떻게 들릴지 상상해야 함
- 개발자 도구에서도 반복해서 만든 사람이 처음 쓰는 사용자의 경험을 상상하는 일은 매우 어려움