5년간 풀지 못했던 문제를 AI가 30분 만에
선배가 남긴 숙제
2021년, 첫 직장에 들어갔을 때 팀에서는 Linux용 오피스 프로그램을 만들고 있었다. MS PowerPoint와 호환되는 제품이었고, PowerPoint의 기능들을 하나씩 구현해나가는 작업이었다.
그중에 경로형 gradient(그라데이션)가 있었다. PowerPoint에서 도형에 그라데이션을 적용할 때 선택할 수 있는 방식 중 하나로, 도형의 외곽선에서 안쪽으로 색이 자연스럽게 번져드는 효과다. 단순한 선형 그라데이션과 다르게, 도형의 형태를 따라 gradient가 흐른다.
선배가 먼저 이 기능을 붙잡고 있었다. 몇 달을 씨름했지만 끝내 완성하지 못하고 다른 팀으로 이동했다. 그 뒤로 해당 제품이 Electron 기반으로 전환되면서, 그 미완성 기능이 나에게 넘어왔다.
첫 번째 시도: Centroid Tessellation
생각해볼 수 있는 가장 직관적인 방법은 도형을 삼각형으로 잘게 분할하는 것이었다. 도형의 무게 중심(centroid)을 잡고, 외곽 꼭짓점들과 연결해 삼각형들로 나누는 방식이다. 각 삼각형에 linear gradient를 적용하면, 멀리서 보면 자연스러운 path gradient처럼 보이지 않을까.
코드를 짰다. 단순한 사각형에서는 그럴듯하게 보였다.
문제는 곡선이 포함된 도형이었다. 원이나 둥근 모서리처럼 곡선이 들어가면, 삼각형의 경계가 눈에 보이기 시작했다. 자연스러워 보이려면 삼각형을 훨씬 더 잘게 쪼개야 했다. 분할 수를 늘릴수록 seam은 줄었지만, 연산량이 폭발적으로 늘었다. 실시간 렌더링에서 쓸 수 있는 방식이 아니었다.
그냥 한계였다. tessellation의 구조적인 문제였고, 더 정교하게 만들어봤자 근본이 달라지지 않았다.
두 번째 시도: GLSL Shader
Electron 기반으로 전환된 덕분에 Chromium의 렌더링 파이프라인을 쓸 수 있었다. 파이프라인을 뜯어보다가 아이디어가 떠올랐다. shader를 끼워 넣으면 되지 않을까. 픽셀 단위로 색을 계산하면 tessellation의 seam 문제를 피할 수 있을 것 같았다.
GLSL로 shader를 만들었다. 그런데 결과는 첫 번째 시도보다 나빴다.
이유는 명확했다. 그래픽스 이론 없이 만든 코드였다. 각 픽셀에서 gradient 값을 어떻게 계산해야 하는지, 그 수학적 기반이 없었다. 올바른 도구를 손에 쥐었지만, 그것을 어떻게 써야 하는지 몰랐다. 게다가 Chromium이 쓰는 GLSL 버전의 제약도 있었다. 그 버전으로는 내가 원하는 방식의 구현 자체가 불가능했다.
여기서 멈췄다. 다시 접근하려면 그래픽스를 제대로 공부해야 했고, 그럴 시간과 여유가 없었다. 기능은 미구현인 채로 쌓아뒀다.
2026년: Claude와 30분
5년이 흘렀다. 어느 날 혹시나 하는 마음으로 Claude에게 물었다. WebGL로 path gradient를 구현할 수 있는지.
Claude가 코드를 내놨다. 실행해봤더니 됐다.
핵심은 SDF(Signed Distance Field) 였다. 각 픽셀에서 도형의 외곽선까지 최단 거리를 계산하고, 그 거리값을 gradient에 매핑하는 방식이다. 픽셀 하나하나가 "나는 경계에서 얼마나 멀리 있는가"를 알고, 그 거리에 따라 색이 결정된다. tessellation처럼 도형을 잘게 쪼갤 필요가 없다. seam이 생길 여지 자체가 없다.
두 번째 시도에서 내가 붙잡고 있던 방향이 틀리지는 않았다. shader로 픽셀 단위 계산을 하겠다는 아이디어는 맞았다. 다만 SDF라는 알고리즘을 몰랐고, 그걸 어떻게 코드로 구현하는지도 몰랐다. 그 간극을 Claude가 채웠다.
WebGL과 Chromium의 GLSL 환경이 완전히 같지는 않지만, shader의 원리는 동일하다. 이제 어떻게 돌아가는지를 이해했으니, Chromium 환경에 맞게 포팅하는 건 다른 문제다.
신기함과 허탈함
솔직히 말하면, 결과를 보고 복잡한 감정이 들었다.
몇 년을 가끔씩 꺼냈다가 다시 쌓아두기를 반복했던 문제였다. 그게 한 자리에서 30분 만에 해결됐다. 기쁜 것도 맞지만, 그것만은 아니었다.
그 30분이 내가 몇 년 동안 하지 못했던 것을 한 게 아니다. 나는 그 시간 동안 맥락을 설명하고, 나온 코드를 실행하고, 결과를 확인했을 뿐이다. 실제로 SDF 알고리즘을 떠올리고 shader로 구현한 건 Claude였다. 그 사실이 신기하면서도 묘하게 허탈했다.
동시에 다른 생각도 든다. 내가 해결하지 못했던 또 어떤 문제들을 이제는 해결할 수 있을까?
5년 전에 포기했던 것들, 이론이 없어서 손을 못 댔던 것들, 방향은 맞았지만 구현을 몰랐던 것들. 그런 문제들이 이제 다른 방식으로 열릴 수 있다면, 그건 무서운 일이기도 하고 흥미로운 일이기도 하다.
개발자로서 AI를 어떻게 바라봐야 하는지는 아직 잘 모르겠다. 다만 5년짜리 숙제가 30분 만에 풀렸다는 사실은, 뭔가 달라졌다는 신호임은 분명하다.