Dawn과 wgpu. 두 개의 강력한 구현체가 코드 레벨에서 전진하는 동안, 또 다른 전쟁터에서는 총성 없는 전투가 매일같이 벌어지고 있었다. 그곳은 바로 W3C ‘GPU for the Web’ 커뮤니티 그룹의 공식 깃허브(GitHub) 저장소였다. 화려한 코드가 아닌, API 사양(Specification)을 정의하는 건조한 텍스트들이 이곳의 무기이자 전장이었다.
드미트리는 매일 아침, 코드를 작성하기 전에 이 저장소의 ‘이슈(Issue)’ 목록을 확인하는 것으로 하루를 시작했다. 그곳은 전 세계 개발자들의 질문과 제안, 그리고 격렬한 논쟁으로 가득 찬 포럼이었다.
Issue #137: 파이프라인 생성은 동기적(Synchronous)이어야 하는가, 비동기적(Asynchronous)이어야 하는가?
한 개발자가 올린 이 질문 하나에, 애플, 구글, 모질라, 마이크로소프트의 엔지니어들이 달라붙어 댓글로 갑론을박을 벌였다.
애플 측 엔지니어가 주장했다.
“Metal에서는 파이프라인 생성이 동기적입니다. 즉시 결과를 반환하죠. 웹에서도 이 방식을 따라야 개발자들이 예측 가능한 코드를 작성할 수 있습니다.”
그러자 모질라의 알렉스가 반박했다.
“파이프라인 생성은 드라이버 레벨에서 복잡한 컴파일과 최적화를 수반하는 무거운 작업이 될 수 있습니다. 만약 이 작업이 동기적으로 메인 스레드를 막아버린다면, 웹페이지 전체가 순간적으로 멈추는 현상이 발생할 겁니다. 모든 무거운 작업은 비동기적으로 처리되어야 합니다.”
드미트리도 이 논쟁에 뛰어들었다.
“알렉스의 의견에 동의합니다. 사용자 경험을 해치지 않으려면 비동기가 필수적입니다. 자바스크립트의 Promise를 사용해, 파이프라인 생성이 완료되면 결과를 알려주는 방식이 웹의 철학에 더 부합합니다.”
이 단순해 보이는 결정 하나가 API의 전체적인 사용 방식과 철학을 뒤흔들었다. 몇 날 며칠에 걸친 토론 끝에, 커뮤니티는 결국 ‘비동기’의 손을 들어주었다. createRenderPipelineAsync()
라는 함수 이름이 사양 문서에 새롭게 기록되었다.
또 다른 이슈가 올라왔다.
Issue #215: 텍스처 데이터 업로드를 위한 API가 너무 복잡합니다.
한 독립 개발자의 불만이었다. 그는 NXT가 제안한 데이터 업로드 방식이 너무 장황하고 어렵다고 지적했다.
이 지적에 드미트리는 부끄러움을 느꼈다. 그들은 성능과 효율성에만 집중한 나머지, 개발자의 편의성을 일부 놓치고 있었다. 그는 즉시 댓글을 달았다.
“좋은 지적입니다. 성능이 중요한 고급 사용자를 위한 저수준 API는 유지하되, 간단한 작업을 위한 고수준의 헬퍼(Helper) 함수를 추가하는 방안을 검토해 보겠습니다.”
이처럼 사양 문서는 살아있는 생물과 같았다. 구현체(Dawn, wgpu)에서 발견된 문제점이 사양을 바꾸기도 하고, 사양에 대한 논쟁이 구현체의 방향을 바꾸기도 했다. 이 둘은 서로를 비추는 거울이자, 함께 전진하는 톱니바퀴였다.
사양을 편집하는 권한을 가진 ‘편집자(Editor)’ 그룹의 일원이었던 드미트리에게는 매일 수십 개의 변경 요청(Pull Request)이 쏟아졌다. 그는 동료 편집자들과 함께 코드 한 줄 한 줄, 단어 하나하나를 꼼꼼히 검토했다.
"MUST"
, "SHOULD"
, "MAY"
이 세 단어의 쓰임새를 두고 벌이는 논쟁은 특히 치열했다. ‘MUST’는 반드시 지켜야 할 강제 규정, ‘SHOULD’는 강력한 권고, ‘MAY’는 선택적 허용을 의미했다. 단어 하나가 브라우저 구현의 자유도와 표준의 견고함을 결정했다.
예를 들어, ‘브라우저는 최소 16개의 텍스처 유닛을 지원해야 한다(MUST support at least 16 texture units)’와 같이 구체적인 하드웨어 요구 사항을 정의하는 것은 매우 민감한 문제였다. 너무 높은 기준은 구형 기기들을 배제시킬 수 있었고, 너무 낮은 기준은 API의 잠재력을 억제할 수 있었다.
이 보이지 않는 전쟁터에는 코드 천재들만 있는 것이 아니었다. 사양 문서의 문법과 구조를 다듬는 기술 저술가(Technical Writer), 다양한 시나리오를 제시하며 허점을 찾아내는 QA 엔지니어, 그리고 묵묵히 논의 과정을 지켜보며 의견을 보태는 수많은 커뮤니티의 개발자들. 그들 모두가 WebGPU라는 거대한 성을 짓는 벽돌을 한 장씩 쌓아 올리고 있었다.
드미트리는 고된 사양 편집 작업을 마친 뒤, 다시 C++ 코드가 가득한 Dawn 프로젝트로 돌아왔다. 그의 머릿속은 방금 전까지 논쟁했던 사양의 내용으로 가득했다. 그는 이제 그 약속들을 코드로 지켜야 했다. 그가 작성하는 코드 한 줄이, W3C에서 벌어진 수많은 논쟁의 결과물이자, 웹의 미래를 향한 구체적인 약속이었다.