
차분한 소프트웨어: 깜빡이는 토글을 없애고, 채팅에게 지금 어떤 모드인지 말하게 하기
GeekBye의 자잘한 두 릴리스, 대표 기능은 없습니다 — 그저 더 이상 깜빡이지 않게 된 설정 토글, 그리고 회의 모드로 답했는지 코딩 모드로 답했는지 드디어 알려주는 채팅 어시스턴트뿐입니다. 이것이 "차분한 소프트웨어"에 실제로 드는 비용입니다, 디테일 하나씩.
모든 릴리스가 무용담은 아닙니다. 어떤 릴리스는 그저 조용히 잘못돼 있던 작고 거의 눈에 안 띄는 것들의 목록입니다 — 아무것도 뻗게 만들지는 않지만 앱을 살짝 못 믿을 것 같고, 살짝 덜컹거리고, 살짝 내 것 같지 않게 느끼게 하는 그런 것들 말입니다. GeekBye v2.0.3과 v2.0.5가 바로 그런 릴리스였습니다. 새 기능은 없습니다. 그저 차분함뿐입니다.
"차분한 소프트웨어"는 분위기처럼 들립니다. 실제로는 구체적인 결정들의 더미입니다. 그중 세 가지를 소개합니다.
마음을 정하지 못한 토글
설정 토글이 하나 있었습니다 — 오디오 복구를 제어하는 그 토글인데, 클릭하면 깜빡였습니다. 켜려고 누르면 아주 잠깐 켜짐 을 보여주다가, 다시 꺼짐 으로 되돌아가고, 그러고 나서야 자리를 잡았습니다. 아주 작은 시각적 떨림이지만 눈이 그걸 잡아채고, 이 앱은 자기가 뭘 하는지 확신이 없구나 하고 읽힙니다.
원인은 낙관적 업데이트(optimistic update) 라 불리는 전형적인 UI 경쟁 상태입니다. 토글을 클릭하면 앱에는 두 가지 선택지가 있습니다. 설정이 실제로 저장될 때까지 기다렸다가 스위치를 갱신하거나(정확하지만 굼떠 보임), 스위치를 즉시 뒤집고 저장은 백그라운드에서 하거나(즉각적으로 느껴짐)입니다. GeekBye는 두 번째를 택했습니다 — 즉시 뒤집기 — 그런데 동시에 저장된 값이 돌아오면 그 값을 다시 읽었습니다. 그래서 순서는 이랬습니다. 클릭하면 스위치가 낙관적으로 켜지고, 한 박자 뒤에 실제 저장값이 도착하고, 한 프레임 동안 둘이 어긋나면서 스위치가 눈에 띄게 튀었습니다.
해결책은 낙관적 값과 확정된 값이 깔끔하게 일치하게 만드는 것입니다 — 스위치는 당신이 고른 상태에 확정적으로 머무르고, 저장이 확인될 때 스스로를 다시 의심하지 않습니다. 그와 함께 v2.0.3은 화려하지 않은 문구 손질도 했습니다. 오디오 복구 설명은 옆 항목들과 줄을 맞추기 위해 다듬었고, 설정 문구는 사람 말투로 바꿨습니다. 이 중 어느 것도 기능은 아닙니다. 이 모든 것이 공학적으로 짜맞춘 느낌의 설정 패널과 정성껏 다듬은 느낌의 설정 패널을 가르는 차이입니다.
떠나려 하지 않던 투어
신규 사용자 투어는 딱 한 번만 유용합니다. 문제는 바로 그 한 번뿐이라는 점입니다. 이미 본 뒤에도 닫을 수 없는 온보딩 오버레이는 이 앱은 당신을 아직 초보로 여긴다 는 신호를 보내는 잡동사니가 됩니다. v2.0.3은 그 양쪽 끝을 다 고쳤습니다 — 이제 제품 투어를 숨길 수 있고, 정말로 다시 보고 싶다면 투어 다시 보기 버튼이 있습니다. 도움이 될 때 보여주고, 도움이 안 될 때 물러나며, 사용자가 자기 뜻대로 불러낼 수 있게 하는 것입니다. 사용자가 더 이상 초보가 아니라는 사실을 존중하는 것, 그 자체가 하나의 작은 차분함입니다.
어떻게 생각하는지 말하지 않던 어시스턴트
이게 진짜로 중요했던 부분이고, 우리가 쫓고 있던 더 깊은 문제와 연결됩니다.
GeekBye의 어시스턴트는 맥락에 따라 다르게 답합니다. 회의 중에 "이거 어떻게 생각해?"라고 물으면 대화적이고 회의를 이해하는 답이 나와야 합니다. 코딩 세션에서 같은 말을 하면 기술적인 답이 나와야 합니다. 그래서 백엔드는 질문을 알맞은 틀에 통과시키는데 — 그걸 회의 모드 또는 코딩 모드 라고 부릅니다 — 이 틀이 실제로 당신이 받는 답을 바꿉니다.
문제는 이랬습니다. 앱은 어느 모드가 답했는지 절대 알려주지 않았습니다. 그래서 어시스턴트가 대화적인 질문에 코딩 색이 짙은 답을 주거나, 코드 질문에 잡담하듯 답하면, 마치 AI가 그냥 틀린 것처럼 보였습니다. 틀린 게 아니었습니다. 다른 모드에 있었을 뿐이고, 당신은 그걸 볼 방법이 없었습니다. 숨겨진 상태가 올바른 동작을 고장난 것처럼 보이게 만들고 있었습니다. (모드 로직 자체는 훨씬 큰 작업입니다 — 코딩 세션 도중 코딩이 아닌 질문에 어떻게 답할지 결정하는 오케스트레이터 말입니다 — 하지만 그것이 내린 결정을 볼 수 없다면 그 모든 게 당신에게는 아무 소용이 없습니다.)
v2.0.5는 채팅에 읽기 전용 모드 칩 을 추가했습니다. 어시스턴트가 회의 모드로 답했는지 코딩 모드로 답했는지 보여주는 작은 라벨입니다. 읽기 전용이라는 게 핵심 그 자체입니다 — 당신이 설정하는 조작 장치가 아니라, 시스템이 이미 내린 결정을 들여다보는 창 입니다. 답이 왜 어긋나 보이는지 짐작하는 일을 멈추고, 그 답이 어떤 틀에서 나왔는지 직접 볼 수 있습니다.
칩을 정직하게 만드는 디테일
여기 전해줄 만한 엔지니어링 선택이 있습니다. 이건 대충 갖다 붙인 표시기와 믿을 만한 표시기를 가르는 종류의 결정이기 때문입니다.
모드 정보는 스트리밍 응답의 일부로 백엔드에서 옵니다 — 서버 전송 이벤트 스트림에 담긴 작은 mode 프레임입니다. 그런데 이 기능보다 앞선 구버전 클라이언트는 mode 프레임이 뭔지 모릅니다. 잘 봐줘야 무시하고, 최악의 경우 뭔가 깨진 걸 렌더링합니다. 그래서 클라이언트는 자기 능력을 알립니다. 나는 모드 칩을 표시할 줄 안다 는 요청 헤더를 보내고, 백엔드는 그 헤더를 보낸 클라이언트에게만 mode 프레임을 내보냅니다. 구버전 클라이언트는 처리할 수 없는 신호를 절대 받지 않고, 신버전 클라이언트는 자기가 요청한 프레임을 정확히 받습니다.
헤더 하나짜리 핸드셰이크입니다. 그리고 이것이 "기능을 추가했다"와 "아직 업데이트하지 않은 누구도 망가뜨리지 않으면서 기능을 추가했다"를 가르는 차이입니다. 같은 리뷰 과정에서 나머지 동작도 조였습니다. 칩은 초기화될 때와 대화 맥락이 바뀔 때 스스로 지워지고(오래된 모드 라벨은 그 자체로 작은 거짓말입니다), 원래 있어야 할 채팅 화면에서만 표시됩니다.
"기능 없는" 두 릴리스가 우리에게 가르쳐 준 것
- 떨림은 신뢰의 신호다. 깜빡이는 토글, 튀는 스위치, 한 프레임 오래 머무는 라벨 — 크래시라는 의미에서의 버그는 하나도 아니지만, 하나하나가 이 앱은 완전히 통제되고 있지 않다 고 속삭입니다. 차분함이란 그 속삭임이 없는 상태이고, 당신은 그것을 경쟁 상태 하나씩 고쳐가며 얻어냅니다.
- 숨겨진 모드는 올바른 동작을 버그처럼 보이게 한다. 어시스턴트는 옳은 일을 하고도 비난받고 있었습니다. 오로지 사용자가 그 틀을 볼 수 없었기 때문입니다. 시스템이 출력을 바꾸는 보이지 않는 결정을 내린다면, 그 결정을 보여주세요 — 읽기 전용 칩이 곧 해결책 전체인 경우가 많습니다.
- 새 기능은 그것을 쓸 수 없는 클라이언트에게는 보이지 않아야 한다. 능력 헤더 핸드셰이크 덕분에 모드 신호는 그것을 렌더링할 수 있는 클라이언트에게만 닿습니다. 하위 호환성은 나중에 갖다 붙이는 버전 체크가 아닙니다 — 클라이언트가 자기가 이해하는 것을 말하고, 서버가 그 답을 존중하는 것입니다.
이런 릴리스는 아무도 체인지로그 헤드라인으로 쓰지 않지만, GeekBye v2가 지금의 느낌을 갖게 된 큰 이유입니다. 이 차분함이 세워진 토대가 된 릴리스는 버전 2를 만드는 데 실제로 무엇이 드는가(v2.0.0)를 보세요. 그와 함께 진행된 안정성 작업은 우리 앱이 스스로를 DDoS한 날(v2.0.1)과 AI 회의록이 회의 도중 녹음을 멈추는 이유(v2.0.9)를 참고하세요.