[뻘글] swc, 오픈소스

수면 패턴이 이상해져서 다시 맞추려고 어제 밤을 샜는데, 그래서 집중력이 벌써 바닥나버렸다. 그래서 뻘글이나 쓰려고한다.


swc를 만들 때 라이프타임과 arena를 고의적으로 배제했다. 라이프타임과 아레나를 썼으면 당연히 지금보다 훨씬 빨랐을 것이다. 근데 중요한 건 그게 아니다.

내가 swc 프로젝트를 시작할 때 얘기다. 사실 수업을 너무 대충 들어서 지금도 컴공 지식이 모자라긴하지만, 그땐 수험생이었고 진짜 아는 게 아무것도 없었다. 아는 것도 없고 실력도 없었다보니 ECMAScript 파서가 있으면 좋겠다고 생각했다. 근데 생각만 했다. 이 기간이 꽤 길다. 바벨 파서를 보고 직접 구현하기로 마음먹은 건 정말 없고 내가 안하면 아무도 안 할 종류의 프로젝트 같았기 때문이다. 그때 러스트로 자바스크립트 파서를 구현하려다 중단된 프로젝트는 몇개 있었다.

근데 그중에 쓸 수 있는 건 하나도 없었다. 개발이 중간에 중단되서가 아니고, AST 같은 걸 외부에서 사용할 수 있는 형태로 제공하지 않았기 때문이다. 그래서 swc를 만들 때 최대한 외부에서 가져다 쓸 수 있게 하는 데에 집중했다. swc는 AST를 전부 노출한다. 당연히 유지 관리가 귀찮아지고, breaking change도 많아지게 된다. 근데 난 잠재적인 라이브러리 사용자를 위해 그 정도의 귀찮음은 감수할 용의가 있었다. 그게 오픈소스의 핵심이라고 생각했기 때문이다.

AST 정의에도 그게 녹아있다. 라이프타임? arena? 성능에 좋은 건 당연히 안다. 이런 걸 썼다면 성능은 당연히 지금보다 한참 빨랐을 것이다. 아마 파서 레벨 트릭으로 AST 비지터 비용을 아예 없앤 esbuild보다 한참 빨랐으리라 생각한다. 근데 난 많은 사람이 swc를 쓰기를 바랬고, 복잡한 라이프타임이나 arena는 재사용성에 있어서 너무 큰 장애물이라고 생각한다. 물론 js 엔진을 만드는 사람이 쓰길 원한다면 별의 별 최적화를 다 해야하니까 swc의 파서를 그대로 쓰기는 힘들었을 수도 있지만, 일반적인 사용례는 아니다.

난 그래서 swc를 만들 때 모듈화에 집중했다. 그리고 커스터마이징해서 사용할 가능성이 있는 모든 기능을 모듈로 분리했다. 솔직히 귀찮은 일이었다. 그리고 결과는 상당히 만족스럽다.

swc 설계에 대한 게 더 생각이 안 나는 관계로 이 얘기는 여기까지만 하고 오픈소스에 대한 생각이나 적어보려한다.


어릴 때엔 오픈소스에 일종의 환상같은 게 있었다. 사람들이 막 적극적으로 참여하고 그럴 줄 알았다고 해야되나?

무슨 느낌인지 알 것이다. 지금은 오픈소스에 대한 시각이 많이 바뀌었다. 회의적인 쪽으로 말이다.

내가 타입스크립트 타입 체커를 오픈소스로 공개하게 될지 아닐지는 확실히 알 수 없지만, 난 이제 내가 들인 노력에 대한 정당한 대가를 받는 게 오픈소스 정신보다 더 중요하다고 생각한다. swc 프로젝트를 시작할 땐 당연히 그런 생각을 안 했다. 그리고 그 덕분에 지금 좋은 대우를 받으며 swc에 시간을 쓰는 입장이 되었고, 내가 들인 노력에 대한 보상을 받고있다. 근데 솔직히 들인 시간에 비하면 별 거 아니라고 생각한다. 들인 시간이 너무 크기 때문이다. 그리고 그 시간을 swc에 안 썼다면 난 다른 걸 만들어서 그걸로 보상을 받았을 것이다.


swc 얘기는 뭔가 질리니까 이제 그만하고 고성능 타입스크립트 타입 체커와 오픈소스, 그리고 관련 비즈니스에 대한 생각이나 끄적여볼 생각이다. 최근에 swc 코어 팀 멤버도 생기고 기여하는 사람도 많아져서 오픈소스의 긍정적인 면을 살짝 봤다. 그리고 내가 일하는 Vercel 은 next.js라는 오픈소스 프로젝트를 유지/관리하고 있고, 그것 덕분에 Vercel은 이제 공식적으로 유니콘 기업이 됐다.

오픈소스화를 해도 돈을 벌 수 있다는 증거지만, 그럼에도 난 아직 회의적이다. Vercel은 오픈소스는 오픈소스로 제공하고 거기서 나온 인지도를 서비스 판매로 연결해서 수익을 올린다. 이 모델도 괜찮아보이긴 하는데, 여기엔 몇가지 문제가 있다.

  • 서비스 만들어야 한다

나도 만들고 싶은 서비스가 있는데, 솔직히 그 서비스 작업하는 것보다 타입체커 작업하는 게 훨씬 재밌다.

타입체커 라이센스를 판매하면 재밌는 작업만 하면서도 보상은 더 클 수 있다.

이런 느낌?

  • 그 정도로 거대한 프로젝트는 시간이 엄청나게 들어간다

이건 swc를 유지/관리하면서 느낀 것이다. 일단 보상이고 뭐고 시간이 너무 많이 들어간다. 절대값이 너무 크다는 말이다.

보상에 대해 얘기하자면, 지금이야 보상이 있지만, 내가 swc 관련 작업을 한 대부분의 시간엔 어떠한 보상도 없었다. 그리고 보상이 없기 때문에 다른 사람한테 작업을 넘길 수 없었고, 거의 다 내가 해야했다.

만약 라이센스를 판매한다면, 그 수익으로 개발자를 고용할 수 있을 것이다. 그러면 프로젝트를 훨씬 더 잘 관리할 수 있을 것이다.


내 입장에서 변수는 Vercel이다. 오픈소스화했을 때 개발 인력을 붙여주고, next.js 처럼 관리해줄 수 있기 때문이다. 그리고 타입 체커를 오픈소스화한다면 모든 웹개발자가 혜택을 볼 것이다. Vercel 입장에선 next.js와 비슷한 효과를 내는 것이다.

Vercel이라면 이것도 어떻게 잘 해주지 않을까

오픈소스화할 생각 없냐고 물어보는 사람이 꾸준히 있는데, 그런 걸 들을 때마다 내가 하는 생각이다. 솔직히 내가 Vercel에 더 일찍 합류했다면 이미 오픈소스화 했을 것 같기는 한데, 아직은 잘 모르겠다.


의식의 흐름에 따라서 글을 쓰다보니 이것저것 얘기했는데, 그냥 편하게 쓴 뻘글이니까 다듬지 않고 그냥 마무리하겠다.