크롬 113의 릴리스 트레인은 개발자(Dev) 채널이라는 두 번째 역에 순조롭게 정차해 있었다. 수십만 명의 개발자들이 새로운 버전을 사용하기 시작했지만, 크래시 리포트나 심각한 성능 저하 같은 대형 사고는 발생하지 않았다. Dawn 팀은 한숨 돌리며, 안정화 지표를 주시하고 있었다.
그 평온을 깨뜨린 것은 버그 리포트가 아닌, 한 유명 기술 블로거가 작성한 장문의 회고록이었다.
제목은 ‘WebGPU와 함께한 나의 첫 주말: 경이로움과 좌절 사이’.
드미트리는 팀 채팅방에 공유된 링크를 클릭했다. 글의 서두는 찬사로 가득했다.
“...WebGL로는 상상도 못 할 복잡한 씬이 부드럽게 렌더링되는 것을 보며, 나는 웹의 미래를 목격했다. WebGPU의 힘은 의심할 여지가 없다...”
하지만 스크롤을 내릴수록 글의 어조는 급격히 어두워졌다.
“...그러나 이 강력한 힘을 다루는 과정은 끔찍한 악몽과도 같았다. 나는 단지 텍스처 포맷 하나를 잘못 지정했을 뿐이었다. 내가 마주한 것은 브라우저 콘솔에 찍힌 단 한 줄의 메시지였다. [DOMException: Validation Error]
. 끝. 대체 무엇이 잘못되었는지에 대한 단서는 어디에도 없었다. 나는 수십 개의 옵션으로 이루어진 거대한 파이프라인 설정 객체를 한 줄 한 줄 뜯어보며, 3시간을 허비하고 나서야 겨우 원인을 찾을 수 있었다.”
블로거는 이 경험을 ‘칠흑 같은 어둠 속에서 스위치를 찾는 기분’이라고 표현했다.
글은 순식간에 개발자 커뮤니티로 퍼져나갔고, 수많은 공감의 댓글이 달렸다.
“나도 똑같은 경험을 했다. 에러 메시지가 전혀 도움이 되지 않는다.”
“WebGPU는 마치 전문가를 위한 비밀스러운 의식 같다. 초보자는 접근조차 어렵다.”
연구실의 분위기가 다시 가라앉았다.
벤이 억울하다는 듯이 말했다.
“하지만 우리는 사양에 명시된 대로 에러를 리포트했습니다. 유효성 검사에 실패하면 에러를 발생시킨다. 정확히 그대로 동작한 겁니다.”
그의 말은 기술적으로는 옳았다. 하지만 드미트리는 고개를 저었다. 그는 이 피드백이 단순한 불평이 아니라, 프로젝트의 성패를 가를 수 있는 근본적인 문제임을 직감했다.
“우리가 놓치고 있었던 거야.”
드미트리가 나지막이 말했다.
“우리는 API의 성능과 안정성에만 집중한 나머지, 이 API를 처음 만나는 ‘사람’의 입장을 잊고 있었다. 우리가 만든 건 기계가 아니라 개발자를 위한 도구다. 도구가 사용법을 알려주지 않는다면, 그건 좋은 도구가 아니지.”
출시는 코앞이었다. 지금 와서 API의 에러 처리 방식을 근본적으로 바꿀 수는 없었다. 기능 동결은 이미 한참 전에 끝났다. 그렇다면 방법은 없는 것인가?
바로 그때, 드미트리의 머릿속에 한 가지 아이디어가 떠올랐다.
“API 자체는 바꿀 수 없어. 하지만… 에러 메시지의 ‘내용’은 바꿀 수 있지.”
모두의 시선이 그에게로 쏠렸다.
“에러 메시지는 Dawn의 C++ 구현체에서 생성되는 문자열일 뿐이야. 우리가 지금부터 Dawn의 유효성 검사 로직을 수정해서, 훨씬 더 상세하고 친절한 메시지를 만들어내면 돼. 기능 동결에 위배되지 않으면서, 개발자 경험을 극적으로 개선할 수 있는 유일한 방법이다.”
그의 제안은 어둠 속의 한 줄기 빛과 같았다.
예를 들어, 이전에는 Validation Error
라고만 출력되던 것을,
Validation Error on createRenderPipeline: fragment.targets[0].format 'rgba8unorm-srgb' is not a renderable format. Did you mean 'rgba8unorm'?
와 같이, 어느 부분에서 어떤 값이 왜 잘못되었는지, 심지어 올바른 제안까지 담아주는 방식으로 바꾸는 것이다.
결정은 즉시 내려졌다.
팀은 다시 한번 비상 체제에 돌입했다. 이것은 보안 패치처럼 긴급한 작업은 아니었지만, 더 많은 사용자가 WebGPU를 접하게 될 베타 채널로 넘어가기 전까지 반드시 해결해야 할 숙제였다.
엔지니어들은 Dawn의 코드 수천 줄에 흩어져 있는 모든 return validationError()
구문을 찾아내기 시작했다. 그리고 각각의 에러 케이스에 맞춰, 마치 초보자에게 과외를 해주듯 상세하고 명확한 설명 문구를 추가하는 고된 작업을 시작했다.
그것은 화려한 기능 개발과는 거리가 먼, 지루하고 반복적인 노동이었다. 하지만 드미트리는 이 작업이 지금껏 그들이 해온 그 어떤 일보다 중요하다고 믿었다. 강력한 엔진을 만드는 것만큼이나, 그 엔진의 사용 설명서를 쓰는 것 또한 창조자의 중요한 책임이었기 때문이다.
며칠 후, 개선된 에러 메시지가 포함된 새로운 개발자 버전이 배포되었다.
얼마 지나지 않아, 회고록을 썼던 그 블로거가 자신의 글에 추신을 달았다.
“업데이트: 크롬 개발팀의 놀라운 피드백 속도. 이제 WebGPU는 무엇이 잘못되었는지 명확하게 알려준다. 이것이야말로 진정한 소통이다. 나는 다시 WebGPU와 사랑에 빠졌다.”
드미트리는 그 문장을 보며 조용히 미소 지었다. 그들은 코드와의 싸움에서 이긴 것이 아니었다. 그들은 개발자들의 목소리에 귀 기울이고, 그들의 마음을 얻는 데 성공한 것이다.