운명의 시작, 'Canvas 3D' 프로토타입.

6

발행일: 2025년 08월 05일

이론은 충분했다. 이제는 증명할 시간이었다.

주말이 지나고 월요일 아침, 블라디미르는 평소보다 일찍 사무실에 도착했다. 그의 눈에는 더 이상 웹 서핑의 즐거움도, 동료들과의 가벼운 농담도 들어오지 않았다. 그의 머릿속은 오직 하나의 코드로 가득 차 있었다.

그는 가장 먼저 모질라의 중앙 코드 저장소에 접속해 파이어폭스의 최신 소스 코드를 자신의 컴퓨터로 내려받았다. 수백만 줄에 달하는 거대한 코드 덩어리. 전 세계 수많은 개발자의 땀과 시간이 녹아 있는 웹 브라우저의 심장, ‘게코(Gecko)’ 엔진이었다.

그는 자신이 하려는 일이 이 거대한 심장에 새로운 혈관을 이식하는 것과 같다고 생각했다. 누구도 시도하지 않았던 위험한 수술.

그는 프로젝트에 ‘Canvas 3D’라는, 소박하지만 직관적인 이름을 붙였다.

첫 번째 목표는 명확했다. 자바스크립트의 document.getElementById('myCanvas').getContext() 함수가 ‘2d’라는 익숙한 문자열 외에, 완전히 새로운 문자열을 인식하게 만드는 것이었다.

그는 experimental-canvas-3d 라는 긴 이름을 선택했다. ‘실험적’이라는 단어를 붙여 이 기능이 아직 불안정하며, 언제든 바뀔 수 있다는 것을 명시하기 위함이었다.

그의 손가락이 키보드 위를 빠르게 움직였다. 그는 게코 엔진의 깊숙한 곳, 캔버스 요소의 코드를 처리하는 C++ 파일을 열었다. 그리고 getContext 함수가 호출될 때, 인자로 들어온 문자열을 확인하는 로직을 수정하기 시작했다.

if (contextId == "2d") { ... }

기존의 코드 옆에, 그는 새로운 분기문을 추가했다.

else if (contextId == "experimental-canvas-3d") { ... }

이제 브라우저는 새로운 마법의 주문을 알아들을 준비가 되었다. 하지만 주문을 알아듣는 것만으로는 충분치 않았다. 주문에 맞는 실제 마법을 구현해야 했다.

그는 새로운 C++ 클래스를 생성했다. 이 클래스의 역할은 단 하나. 자바스크립트 세상으로부터 받은 명령을 운영체제가 이해하는 OpenGL 명령으로 번역하여 전달하는 ‘통역사’가 되는 것이었다.

그것은 자바스크립트의 유연한 세상과 C++의 엄격한 세상을 잇는 작업이자, 브라우저의 안전한 샌드박스와 운영체제의 날것 그대로인 시스템 라이브러리를 연결하는 아슬아슬한 줄타기였다.

시간이 얼마나 흘렀을까. 사무실의 동료들은 하나둘 퇴근했고, 창밖은 이미 짙은 어둠에 잠겨 있었다. 차갑게 식은 커피 잔만이 그의 책상 위를 지켰다.

마침내 첫 번째 통역 기능이 완성되었다. 화면 전체를 특정 색으로 깨끗하게 지우는, OpenGL에서 가장 기본적이고 간단한 명령어인 glClearColorglClear를 호출하는 코드였다.

이제 이 모든 코드를 하나로 묶어 새로운 파이어폭스 실행 파일을 만들어낼 차례였다. 그는 터미널 창에 컴파일 명령어를 입력하고 엔터 키를 눌렀다.

$ make -f client.mk

컴퓨터의 팬이 굉음을 내며 돌기 시작했다. 수백만 줄의 코드가 한 줄 한 줄 기계어로 번역되는 기나긴 과정. 성공적으로 끝날 수도, 수십 개의 에러 메시지를 뿜어내며 실패할 수도 있었다.

블라디미르는 초조하게 화면의 로그를 바라보았다. 단 하나의 오타, 단 한 번의 잘못된 메모리 접근이 모든 것을 수포로 돌릴 수 있었다.

몇 분이 몇 시간처럼 느껴졌다.
마침내, 팬 소리가 잦아들고 터미널 창에 마지막 메시지가 나타났다.

Build successful!

심장이 철렁 내려앉는 기분이었다. 그는 떨리는 손으로 새로 생성된 파이어폭스 아이콘을 더블 클릭했다. 그가 직접 심장을 수술한, 세상에 단 하나뿐인 브라우저였다.

그리고 그는 비어있는 텍스트 편집기를 열어 아주 간단한 HTML 파일을 작성하기 시작했다. 이 모든 것의 성패를 가를, 단 몇 줄의 운명적인 코드였다.