Lisp의 이점: Viaweb 초기 시절로부터의 교훈

2001년 4월 BBN Labs에서 진행된 강연에서, Paul Graham은 Shopify의 전신인 Viaweb의 기술적 토대를 상세히 설명했습니다. 당시 업계는 C와 C++가 주도하고 있었지만, Graham은 Lisp를 선택했습니다. 이 결정은 단순히 개인적인 선호 때문이 아니었습니다. 이는 소규모 팀이 뛰어난 개발 속도와 아키텍처의 유연성을 통해 대규모 경쟁사를 앞지를 수 있게 해준 전략적 기술 선택이었습니다.

서버의 자유

Lisp를 사용한 주요 동기 중 하나는 데스크톱에서 웹 기반 애플리케이션으로의 전환이었습니다. 데스크톱 시대에는 개발자들이 주로 운영 체제의 언어에 얽매여 있었습니다. 하지만 서버 측 소프트웨어의 경우, 개발자가 환경을 제어할 수 있습니다.

Graham은 이러한 자유가 경쟁력의 필수 요소라고 주장합니다. 반복 속도가 모든 것을 결정하는 시장에서, 단지 표준이라는 이유로 업계 표준(예: C++)을 고수하는 것은 오히려 약점이 될 수 있습니다. 더 표현력이 풍부하고 강력한 언어를 사용하는 소규모 스타트업은 기능을 더 빠르게, 그리고 더 적은 버그와 함께 출시함으로써 대기업의 "점심을 빼앗을" 수 있습니다.

점진적 개발의 힘

Lisp는 소프트웨어 생성의 특정 철학인 점진적 개발을 가능하게 합니다. 몇 주 동안 포괄적인 설계 문서를 작성하고 구현하는 대신, Lisp 프로그래머들은 종종 거의 아무것도 하지 않는 프로그램으로 시작하여, 매 단계마다 코드를 실행 가능한 상태로 유지하면서 점차적으로 기능을 추가합니다.

Graham은 Viaweb 에디터의 성장을 주요 사례로 설명합니다. Viaweb 에디터는 단 한 번의 전체 재작성 없이 120줄의 예제 프로그램에서 25,000줄의 시스템으로 성장했습니다. 이러한 접근 방식은 소프트웨어가 박스 제품으로 출시되는 대신 지속적으로 업데이트되는 웹의 "롤링 릴리스" 특성과 완벽하게 일치합니다.

신속한 디버깅과 대화형 Toplevel

대화형 toplevel (REPL)은 버그 해결에 엄청난 이점을 제공했습니다. 사용자의 데이터가 회사의 서버에 존재했기 때문에, Graham은 코드를 인터프리터에 로드하고 사용자의 계정에 로그인함으로써 실시간으로 버그를 재현할 수 있었습니다.

이는 놀라울 정도로 빠른 처리 속도로 이어졌습니다. 사용자가 고객 지원팀과 전화 통화 중일 때 버그를 수정하고 배포할 수 있었습니다. Graham이 언급했듯이, 이는 종종 약간의 "교묘한" 매력으로 처리되었습니다. 지원팀이 사용자에게 단순히 페이지를 새로고침하라고 말하면, 버그가 사라지게 됩니다.

아키텍처적 승리: Macros와 Rtml

Lisp의 매크로 시스템은 Viaweb가 Rtml이라는 도메인 특화 언어 (DSL)를 구축할 수 있게 해주었습니다. 이 임베디드 언어는 몇 가지 중요한 목적을 수행했습니다.

  1. HTML 생성: HTML은 재귀적이고 접두사 표기법을 사용하므로, Lisp 매크로와 자연스럽게 매핑되어 복잡한 페이지 생성을 관리 가능한 수준으로 만들었습니다.
  2. "업그레이드 경로": Rtml은 숙련된 사용자가 자신만의 템플릿을 작성할 수 있게 해주었습니다. 대부분의 사용자가 기본값을 사용했지만, Rtml은 파워 유저를 위한 "탈출 밸브" 역할을 했으며, 개발자들에게 어떤 기능이 표준 템플릿에 추가되어야 하는지에 대한 신호를 제공했습니다.
  3. 계층적 추상화: 페이지 생성 로직 (Rtml)을 하위 수준의 시스템 코드와 분리함으로써, 팀은 핵심 엔진의 안정성을 해치지 않으면서 UI에 고수준의 차이를를 만들 수 있었습니다.

키워드 파라미터의 교훈

Graham은 상당한 노력을 아끼게 해준 특정 기술적 세부 사항을 강조합니다. 바로 키워드 파라미터의 적극적인 사용입니다. Rtml 연산자가 키워드 파라미터를 받도록 설계함으로써, 기존 템플릿을 깨뜨리지 않고 연산자에 새로운 기능을 추가할 수 있었습니다. 이는 더 경직된 언어에서는 보기 드문 수준의 전방 호환성을 제공했습니다.

클로저를 이용한 상태 시뮬레이션

초기 웹 개발의 가장 어려운 문제 중 하나는 HTTP의 무상태성(statelessness)이었습니다. Viaweb은 렉시컬 클로저(lexical closures)를 사용하여 서브루틴과 같은 동작을 시립레이션했습니다.

Sources