Arcan 프로젝트의 지난 10년과 그보다 더 긴 개발 여정을 돌아보며, 주요 단계와 응용 프로그램, 그리고 앞으로의 방향을 정리한 기록.
… 그리고 23년간의 지루한 야크 털 깎기.
10년 전, Arcan 프로젝트에 관한 다소 빈약한 내 게시물이 퍼지기 시작했다. 그 글은 내가 바로 거기서 멈출까 고민할 만큼 충분한 관심을 받았다. 나는 관심 자체를 그다지 좋아하지 않는다. 내가 했던 다른 오픈 소스 작업 대부분은 익명으로 했거나 일회용 핸들을 사용했고, 지금도 예전의 못된 짓이 남긴 흔적과 종종 마주친다.
이 일을 기념하며 애도하기 위해, 내가 완전히 억눌러 버리기 전에 그 역사의 일부를 적어 두는 것이 적절해 보인다. 이번에는 자금 조달 이야기, 그 안에 숨어 있던 상업 프로젝트들, 스타트업 직전까지 갔던 일들, 혹은 그 갱단이 VC에게 거의 넘어갈 뻔했던 그 한 번의 사건은 빼겠다.
심지어 10년 전에도 이 프로젝트는 이미 여러 해 동안 공개된 채 존재하고 있었고, DIY 아케이드 캐비닛용 ‘프런트엔드’로 위장하고 있었다. 하지만 그 얘기는 조금 뒤에 다시 하겠다.
실제 이야기는 2003년 무렵부터 시작된다. 그 시점에 나는 컴퓨팅 여정의 프로그래밍 ‘언어’ 부분에는 거의 ‘끝난’ 상태였다. 내가 생각할 수 있는 가장 지루한 주제 하나를 꼽으라면 바로 그것이다. 즐거움은 악보가 아니라 음악에 있다. 무엇을 작곡할지 생각하던 중, 나는 고약하고 불치의 ‘오실로스코프 선망’에 사로잡혔다.
멋진 전자공학 꼬마들은 여기저기에 프로브를 대고 회로 일부가 실제로 동작하는 모습을 볼 수 있었지만, 우리 컴퓨팅 쪽 사람들은 여전히 원시인식 ‘print’ 로깅이나, 전기톱을 들고 하는 수술 같은 심볼릭 디버거에 묶여 있었다. 나는 정보의 직조물이 회전하며 돌아가는 동안, 컴퓨팅 기계를 듣고, 느끼고, 보고 싶었다.
그런 일이 정말 가능하다면, 샘플링하고 표현하는 것이 실제로 의도한 바와 일치하도록 시각, 청각, 촉각을 상당히 정밀하게 제어해야 한다. 그러려면 기술 역사상 최악의 회사들 몇몇과 씨름해야 한다. 하지만 어디선가는 자기 공간을 깎아내기 시작해야 하니, 나는 오래된 von Clausewitz의 먼지를 털어내고 계획을 그렸다.
무엇보다도, 나는 분명 적절한 기술이 부족했다. 어떻게든 그것들을 익혀야 했다. 모르는 것을 모른다는 말도 있고, 아이디어는 널려 있다. 어디서 왜 결함이 생기는지 보려면 직접 만들어야 한다. 답은 프롬프트가 아니라 굳은살 속에 있다.
계획은 이 동굴 탐험을 기록할 일기 프로젝트를 세우고 그것을 세 단계로 나누는 것이었다. 각 전환점마다 계속 갈 가치가 있는지, 아니면 손실을 줄이고 덜 무책임한 다른 일을 해야 하는지 평가한다.
각 단계에는 보다 현실감 있는 프로젝트로서 나 자신의 어떤 필요를 채워 주는 실제 응용 프로그램 몇 개가 있어야 했다. 길을 잃고 번아웃되는 것을 막기 위한 일종의 이정표이자, 매몰 비용의 오류에 맞서 “좋아, 이건 멍청했지만 적어도 티셔츠는 얻었네”라고 말할 수 있는 방어 장치였다.
일기라는 것은 사랑을 얻고 생명을 잃는 것 같은 경험의 다른 부분도 적어 두는 것을 뜻했다. 결과적으로 후자가 훨씬 더 많았다. 릴리스 게시물이 올라올 때마다 누군가가 죽었다는 뜻이고, 그 안에는 하나 이상의 헌사가 숨어 있다.
세 단계는 ‘Fun and Games’(Arkanoid), ‘Challenge the Established Order’(Arcane), 그리고 ‘Asylum’(Arkham)이다. 이것들을 한데 합치면 Arcan이 된다.
기술 부족 문제를 해결하고, 동시에 ‘철들기’라는 일을 조금 더 미루기 위해, 나는 현자의 조언을 구했다. 운 나쁘게도, 지역의 거물급 CS 교수와 만날 기회를 얻었다. 그는 수학에 이루지 못한 사랑을 품고 시스템 사고에 대한 감각이 있는, 수염 난 명망가였다.
몇 차례 주고받은 끝에 우리는 내가 박사 과정 전체를 목표로 삼는 것이 가장 낫다는 데 동의했다. 적어도 나 자신에게는 아닐 수도 있었지만 말이다. 그는 마침 그 일을 위한 자금을 준비 중이었다. 물론 디버깅 같은 것은 아니었다. 세상에, 그런 건 손톱 밑에 흙이 낀 사람들의 일이지 칠판의 일이 아니다. 하지만 조금만 눈을 가늘게 뜨고 보면 디버깅은 사실상 보안이고, 그건 자금을 받기가 훨씬 쉽다.
모니터링과 감시는 보안이라는 하나의 동전의 양면이며, 전력망은 SCADA(Supervisory Control and Data Acquisition)라는 약어의 일부로서 모니터링을 아주 좋아한다. 이는 기본적으로 기업 IT 보안이지만 항상 시대에 15~20년 뒤처져 있었다.
Smart Micro _Grids_는 모든 연구의 유행이 될 예정이었고, 분명히 손상되었을 공급망에서 온 수상한 출처의 COTS(Common, Off The Shelf) 부품으로 구축될 예정이었다. 또 이는 전체를 뒤집어엎는 일도 의미했고, 그 모든 것을 모니터링하는 일은 어차피 내가 찾고 있던 것과 훨씬 더 가까웠다. 좋다, 그걸 연구 목표로 하자.
이 곁가지 이야기에는 더 할 말이 많지만, 그 기억을 다시 꺼내기 위해 필요한 혈중 알코올 농도를 내가 감당할 수도 없고 시간도 없으니, 좀 더 장난기 있는 이야기로 넘어가자.
이 단계의 목적은 필요한 기반 작업을 세우는 것이었다. 미디어 처리 파이프라인, 입력 장치, 권한 분리, 그리고 이 모든 것을 한데 묶는 스크립팅 API 말이다. 그렇다면 모든 항목을 만족시키고 설계를 이끌어 줄 재미있는 목표 응용 프로그램은 무엇일까? 비정통적인 에뮬레이터 프런트엔드였다.
나는 아케이드 머신과, 그 자연 서식지라 할 수 있는 옛날의 오락실에 꽂혀 있었다. 지금도 그렇다. 다만 지금은 쉽게 보존하거나 재현할 수 없는 더 부드러운 측면으로 관심이 옮겨갔다. 현재 진행 중인 사이드 프로젝트 중 하나는 모션 시뮬레이션 리그인데, 몇 군데만 더 용접하면 내 지하실의 안락함 속에서 Metal Hawk의 영광을 다시 맛볼 수 있다.
그 당시 내 관심은 에뮬레이션과 에뮬레이터 개발의 세세한 기술적 부분에 있었다. 눈앞에 있는 물리적 사물에서 작동하는 소프트웨어 복제본으로 가는 전 과정을 살펴보면, 그 자체가 컴퓨팅에 대한 집중 속성 강의다. 어떻게 연결되어 있는지 이해하기 위해 회로도를 리버스 엔지니어링하고, 코드와 데이터가 숨어 있는 ROM을 덤프하고, 오래되고 부정확한 고대 CPU와 DSP 명세를 뒤지다가 영리한 개발자들이 이용했던 사소한 버그들까지 발견하고 재현해야 한다. 그다음에는 첫 번째 결함투성이 프로세서 구현을 작성하고 디버깅하고, 맞춤형 복제 방지 체계를 깨고, 이국적인 암호화를 다루는 식이다. 진짜 생명의 징후를 보기까지도 아주 긴 여정이다. 편한 신발을 신어라.
아케이드 에뮬레이션의 황금 표준인 MAME는 거대한 예술 작품이자 오픈 소스 문화유산이다. 진지하게 컴퓨팅과 그 유산에 관심 있는 사람이라면 그 코드는 필독서가 되어야 한다. 나는 그것을 Linux 커널처럼 진부하고 따분한 것보다 훨씬 더 높이 평가한다.
다만 실제로 그것을 사용하는 방식에는 꽤 많은 부분이 상상에 맡겨져 있었고, 초기 사용자 공동체는 이를 위해 그래픽 런처, 즉 프런트엔드를 작성하며 보완해 왔다.
예전에 나는 직접 아케이드 캐비닛을 하나 만든 적이 있다. 쓰레기통을 뒤져 주워 온 잡동사니로 말이다. 그것도 16m 2짜리 널찍한 아파트에서. 그 과정에서 나는 납땜 인두를 밟았고, 손가락 전부를 핫글루로 붙여 버렸고, CRT의 애노드에 감전되었으며, MDF 먼지 속에서 너무 많이 잠들어 걱정거리가 될 정도였다.
내 맞춤형 아케이드 머신의 ‘프런트엔드’ 부분은 게임 목록과 커서 정도에 불과했다. 항목을 선택하면 게임별 설정이 적용된 에뮬레이터가 실행되고, 그게 끝이었다. 그래서 나는 온갖 기능을 다 갖춘 새 것을 쓰기 시작했다. 비디오 미리보기, 관련 아트와 역사 설명, 음향 효과와 배경 음악, 필터, 비디오 녹화와 스트리밍, 세이브 상태 관리, 입력 매핑 등등. 기본적으로 오늘날 Steam이 하는 일과 비슷하지만, ‘구매와 다운로드’ 부분은 제외했다. 아마 그 부분이 돈을 버는 방법인 모양이다. 뭐 어쩌겠나.
비정통적인 부분은, 에뮬레이터를 그냥 실행해서 제멋대로 하게 두는 대신 프런트엔드 스크립트가 입력을 라우팅하고 합성 효과를 제어해야 한다는 점이었다. 그러니까, 말하자면 (복선이다) 디스플레이 서버처럼 말이다. 결국 Gridle에서는 3D 모델로 만든 해당 캐비닛 자체의 모니터 부분에서 게임이 실행되었고, 네트워크 원격 제어, 화면 키보드, 동적 LED 제어, CRT 및 벡터 디스플레이 시뮬레이션 등까지 갖추게 되었다.
이제는 그것이 실제로 동작하는 녹화나 데모는 남아 있지 않지만, 코드는 아직 남아 있고(으웩), 여기 캐비닛에서 동작하는 사진이 있다.
캐비닛에서 동작하는 모습은 첫 공개 발표의 이 슬라이드에도 잠깐 나온다.

https://speakerdeck.com/letoram/arcan?slide=13
여기서 한 가지 디테일은 World of Warcraft: Mists of Pandaria 로그인 화면 스크린샷에 있다. 대략 2012년쯤의 일이다. 이것은 실제로 WINE을 프로세스 인젝션 해킹과 함께 실행한 것이지만, Arcan:Gridle 내부에서 CRT 효과를 추가해 합성한 것이다. 이것도 또 다른 사이드퀘스트였는데, ‘Warden’ 안티치트 시스템을 건드리지 않고 게임 로직 버그를 자동으로 찾아내기 위해 오직 주입된 마우스/키보드 이벤트와 컴퓨터 비전만으로 봇을 코딩하던 일이었다.
그건 또 다른 날의 이야기다. Gridle은 제 역할을 다했다. 실제 API의 약 90%가 자리 잡았고, IPC 시스템은 의도한 대로 동작했으며, 에뮬레이터를 중간에 끼워 넣는 것은 tool-assisted speedruns 덕분에 지연 시간에 관한 훌륭한 테스트 세트를 제공해 주었다. 이제 한 단계 더 높여야 할 때였다.
Gridle의 프런트엔드 부분은 내 게임 습관과 홈시어터 PC의 영화 및 음악 컬렉션에는 잘 맞았지만, 데스크톱 컴퓨터들은 여전히 Xorg 위의 Window Maker를 돌리고 있었으니 다음 차례는 그것이었다.
내 두 번째 컴퓨터는 Amiga 500이었고, 나는 이상한 모양의 아이콘과 눈을 찌르는 색 구성표를 갖춘 초기 버전의 ‘Workbench’ 윈도잉 시스템에 대한 향수를 조금 가지고 있었다. 그걸 재현하면서도 실제 일상 업무에 필요한 모든 요소를 끌어들일 수 있을까?
이에 대해서는 할 말이 그리 많지 않다. 데모 영상이 아직 살아 있기 때문이다.
결국 NetSurf를 통한 네이티브 웹 브라우저가 있었고, 비디오 및 녹화 도구는 태그된 창을 VNC를 통해 상호작용 가능하게 공유할 수 있었으며, 1세대 Raspberry Pi의 독점 스택 위에서 네이티브로 실행되었다. 또한 OSX, Windows, BSD 전반에 걸쳐 이식성을 유지했고, Android ~4.3 사용자 공간의 상당 부분을 대체한 비공개 포크도 있었으며, 몇몇 Sony-Ericsson 기기에서도 동작했다.
그것은 집에서도, 직장에서도 내 일상 환경이 되었다. 이제 프로젝트가 다음 단계로 넘어갈 시간이었다.
‘fun and games’ 단계는 편리하지만 짧은 복고 컴퓨팅 로맨스였다. 편리한 이유는 깊이 생각하지 않고도 이런저런 일을 해볼 수 있기 때문이다. 하지만 낭만이 덜한 형태, 즉 실제로 머리를 조금 써야 하는 형태는 유산을 _이해_하여 그저 천천히 역사를 반복하는 꼴이 되지 않으면서 무언가를 개선해 보는 것이다.
실제 작업은 하지 않은 채 노인네들을 놀리기만 하며 요령을 부릴 수도 있다. Dr. Lecter의 말처럼 “보긴 했지만 보지 못했다”는 식이다. 문제는 결국 그것이 되돌아와 뒤를 계속 물어뜯는다는 점이다. 진짜 일은 어떤 것이 무엇을 했는지를 베끼는 것이 아니라, 왜 그런 방식으로 작동했는지를 이해하는 데 있다.
나는 또 다른 리버서의 항해를 위해 돛을 올리고 전투에 뛰어들었다. 수백만 줄에 이르는 Xorg, Chromium, Xterm 코드, 디스어셈블리, 관련 명세서, 메일링 리스트의 불꽃 싸움을 샅샅이 뒤진 끝에, 나는 상처 입은 채 돌아왔다. 어쩌면 조금 더 현명해졌을지도 모르지만, 그 점은 의심스럽다.
목표 선택은 의도적이었다. 익숙하지 않은 사람에게는 이것들이 달라 보인다. 하지만 그렇지 않다. 그것들은 동일한 ‘기능 원형’과 SCADA급 시스템의 사례들이다.
이 문제에 대해서는 예전 글들에서 이미 충분히 많이 썼다. 몇 개만 추려 보자면 다음과 같다.
Sunsetting Cursed Terminal Emulation
Arcan vs Xorg: Feature Parity and Beyond
Arcan as Operating System Design 그리고 Arcan Explained – A browser for different webs.
이 단계의 실제 응용 프로그램들은 훨씬 더 다양하고, 다소 눈에 띄지 않는 방식으로 서로 맞물려 있다. 그러니 그것들을 조금 나눠서 보자.
Workbench는 환영받을 시간을 넘겨 버렸다. 타일링 중심으로 돌아가는 동료의 작업 흐름을 슬쩍 들여다보며 잠깐 “이게 더 낫네”라는 순간이 있었지만, 동시에 거친 부분도 적지 않았다. 그리고 나는 다른 무언가를 원했다. 마침 나는 그에 맞는 사포 장비를 갖추고 있었다.
한 걸음 물러서서 상황을 생각해 보았다. 모든 윈도 매니저는 결국 버튼 누르기 같은 이벤트 트리거를 받아, 예쁜 픽셀 상자들을 온갖 기묘한 방식으로 다시 쌓고 재구성하는 일에 불과하다. 윈도잉 시스템이 제공하는 구성 요소가 그것이 얼마나 어려운지를 좌우한다.
나는 보통 ‘모든 것은 XYZ다’ 같은 수사에 심한 알레르기가 있다. 특히 ‘파일’이라는 말에는 더 그렇다. 파이프와 필터 설계는 처음 보기엔 매력적으로 단순하지만, 파이프라인 단계 수가 늘어날수록 급격히 악화된다. 그런데 여기서는 실제로 그 비유가 통하는 경우였다. 일반적인 윈도 관리 방식을 흉내 내는 데 그리 많은 연산을 엮을 필요가 없기 때문이다.
그래서 그것이 Durden 응용 프로그램의 구성 요소가 되었다. 이것은 파일 시스템인데, 파일은 global/config/visual/font/size=14 같은 값 타입이거나 target/window/clipboard/paste 같은 동작이다. 모든 입력 동작, 장식 버튼 등은 전부 경로에 바인딩된다. 이것을 탐색하고 바인딩하는 사용자용 인터페이스도 있지만, 소켓을 통해 접근하거나 마운트할 수도 있다. 대부분의 전통적인 방식은 bash 스크립트에서 socat으로 연결하는 것만으로도 구현하기에 충분하다.
아래의 오래된 클립은 현재 약 700개의 서로 다른 경로 중 하나인, slice-region to new window를 UI 내 메뉴로 탐색하고 활성화하는 모습을 보여 준다. 작업 공간은 타일 모드로 실행 중이며, 미디어 창은 비율을 유지한 채 타일 할당에 맞추어 크기가 조정되도록 설정되어 있다.
Senseye 프로젝트는 예전에 내가 실제로 만들고 싶었던 것의 첫 번째 반복판이다. 공개적으로 마지막 생명의 흔적을 보인 것은 Digging for Pixels와 Senseye 0.3에서였다. 거기에는 센서, 번역기, _표현 방식_이 있었다.
각각의 개별 _센서_는 파일, 프로세스 메모리, 네트워크 스트림 같은 데이터 소스를 샘플링한다. 여기에 탐색, 샘플 창 크기 제어, 전처리 필터 등의 기본 제어 기능이 따라온다.
_번역기_는 특정 크기와 패킹을 가진 샘플 버퍼를 받아 이미지 디코딩이나 머신 코드 디스어셈블리 같은 더 고수준의 버전으로 바꾼다. 이것들은 신뢰할 수 없는 데이터를 다루는 파서이기 때문에 엄격하게 샌드박싱되며, 충돌이 발생하면 더 조사해야 할 파서 취약점의 신호로 간주된다.
_표현 방식_은 시각화 및 통계 도구로, 히스토그램 매핑, 색 패턴, 2D 바이그램, 힐베르트 곡선, 3D 점군, 참조 패턴과의 델타 비교 등을 포함한다.
개발 과정에서의 테스트 대상은 예를 들어, 동일한 웹사이트에 맞춰 조정된 Chrome 프로세스를 호스팅하는 가상 머신들에 무작위로 주입된 프로세스 기생체, 즉 디스크 없는 악성코드 같은 것이었다. 그런 다음 위 도구들만 사용해 오염된 것들을 찾아내는 것이 과제였다.
배포된 버전은 AWB의 조각들을 덕트 테이프로 이어붙인 사용자 인터페이스를 갖고 있었다. 조금 개선된 버전은 동일한 센서와 번역기를 가지고 있었지만 Durden 내부의 플러그인(‘도구’)으로 통합되었다. 어느 쪽도 잘 맞지 않았다.
이 프로젝트는 내가 아주 싫어하는 조직들의 관심을 끌었고, 그래서 안타깝지만 물러나서 오프라인으로 계속하는 것이 최선이었다. 앞으로도 그렇게 둘 것이다.
더 나은 윈도잉과 제어 체계를 찾기 전에, 다음 응용 프로그램으로 잠깐 우회했다.
이건 복잡한 문제였지만, 기술적인 이유 때문은 아니었다. 가상현실(VR)이 다시 한 번 이른바 ‘다음 위대한 것’이 되기 위한 순환에 들어가기 시작했다. 이번에도 성공할 가능성은 크지 않았지만, 적어도 물을 시험해 보기 위해 팔과 다리를 내줄 정도로 비싼 하드웨어를 사지 않아도 된다는 뜻이었다. 또한 디스플레이 서버 관점에서 VR은 부하 분산(서비스 거부 완화)과 지연 시간(“motion to photon”)을 검증하기에 좋은 장이다. 여기서의 실수는 실제로 느껴질 수 있고 심지어 신체적 해를 끼칠 수 있다.
내가 다루고 싶었던 것은 두 가지였다.
첫 번째는 다시 Senseye와 관련된 것으로, 상당히 의심스러운 성격의 일이었다. 어쩌면 나는 아직도 정확히 짚을 수 없는 방식으로 내 인지를 손상시켰을지도 모른다. 짧게 말하면, 그것은 기본적으로 거대한 수백 GiB 규모의 미지의 데이터 스트림을 점군 위에 투사해 시야를 과부하시키고, 거기서 패턴이 나타나는지 보는 일이었다. 세상에, 정말 나타났다.
나는 VR 헤드셋을 쓴 채 침대에 누워 몇 시간이고 밝은 색 점들이 휙휙 지나가는 것을 바라보았다. 점들은 금세 군집이 되었고, 군집은 유형이 되었고, 유형은 계층과 위치가 되었다. 헤드셋을 벗은 뒤에는 경계 감지에 어려움을 겪었다. 출입구가 단단한 물체처럼 느껴졌고, 다른 형태들은 단순히 서로 융합되어 보였다. 몇 분 지나자 가라앉았지만, 훨씬 더 오래 가는 강한 불안감을 남겼다.
두 번째는 여러 상태의 ‘기억 궁전’이었다. 우리의 컴퓨터는 시간이 지나며 모아 두는 삶의 작은 스냅샷들을 실제로 정리하는 데 여전히 형편없다. 그런 컬렉션을 제시하고 탐색하는 일에는 더더욱 형편없다. 반면 다른 사람들의 컬렉션을 모으고 걸러 죄의 흔적을 찾는 데는 훨씬 능하다.
VR은 이런 유물들을 더 크고 훨씬 더 친밀한 그림을 그리는 방식으로 함께 엮을 수 있는 수단을 제공할 수 있었다. 자연스러운 구획, 방과 공간들 말이다. 처음에는 나이가 들어 가는 수많은 고통을 견디기 위한 기억 회상의 수단으로, 나중에는 미래 세대가 보고 당신이 어떤 사람이었는지 더 강하게 느낄 수 있도록 남겨 둘 무언가로서, 즉 기억의 장소, 가상 공동묘지로서 말이다.
이처럼 친밀한 것은 엄격히 당신의 소유 아래, 자물쇠와 열쇠로 지켜져야 한다. 그 목적을 위해 나는 Safespaces를 구상했다. 문제는 Facebook Meta가 방 안의 공기를 모조리 빨아들였고, 온갖 기회주의적 얼간이들을 끌고 왔다는 데 있었다.
그래서 나는 Release Post를 가능한 한 건조하고 차분하게 구성했고, 내가 떠올릴 수 있는 가장 멍청한 것만 보여 주었다. 바로 “우주 공간에서의 타일링 윈도 관리”였다.
여담이지만, 이전에 말한 아케이드 캐비닛들은 데모 클립 맨 끝에서 잠깐 보이고, 그렇게 욕을 먹었던 배경 음악 선택인 _‘Den Indre Kilde’_에는 ‘그리 안전하지 않은’ 부분을 강조하기 위한 어둡고 우울한 이야기가 있다.
그 게시물은 여전히 지나치게 큰 반향을 불러왔고, 온갖 종류의 학대를 가져왔다. 믿기 어렵겠지만, 내가 ‘woke’하다는 이유로 아파트 바깥에서 찍은 “네가 어디 사는지 안다” 종류의 사진까지 받았다.
나는 또다시 오프라인으로 계속하기로 했다. 앞으로도 그렇게 둘 것이다.
그럼 다시 ‘더 나은 윈도잉과 제어 체계’로 돌아가자. 다음 응용 프로그램은 내가 찾고 있던 답이기를 바라며, 아직도 더 많은 시간을 들여 다듬고 싶은 것이다. 그것이 바로 ‘Pipeworld’다.
배경 이야기는 이렇다. 반쯤 정기적인 점심 모임에서 사랑스러운 괴짜들의 잡다한 무리와 함께 있던 중, 누군가 “결국 모든 컴퓨팅은 Excel로 퇴화한다”는 농담을 던졌다. 내 녹슨 톱니바퀴가 돌기 시작했다. 그렇다면 처음부터 거기서 시작하면 어떨까? 우리는 어디에 도달하게 될까?
각 셀은 실행 결과로 변형되는 명령줄이다. 함수 평가를 프로세스 실행으로 확장하고 이득을 보자고? 물론 동기화라는 악마와 관련된 문제들이 있겠지만, 그건 미래의 내가 걱정할 일이다.
선행 사례를 빠르게 훑어본 결과 Hishahm의 박사학위 논문인 “Dataflow Semantics for End-User Programmable Applications”과 관련 프로젝트 “Userland”에 닿았다. 나는 그것을 몇 시간 정도 가지고 놀아 본 뒤, 개념 자체는 충분히 실현 가능하지만 셀 관리가 금세 시각적으로 혼잡해지고 처리 자체도 확장성이 좋지 않다는 결론을 내렸다.
무한 캔버스를 오랫동안 좋아해 온 사람으로서, 비균일한 확대 가능한 사용자 인터페이스(ZUI)를 층층이 쌓는 방식이라면 충분히 해볼 만해 보였다. 몇 주 뒤 대부분의 것이 자리를 잡았다. 그것은 내 센서와 번역기에 큰 개선이었다. 나는 그것을 후순위로 돌려놓고, 체크리스트에 남아 있던 마지막 두 개의 큰 항목, 더 나은 네트워킹 프로토콜과 터미널 에뮬레이터라는 중간 상인을 제거하는 일로 넘어갔다.
터미널 에뮬레이터의 고통스러운 지점을 다시 반복하느라 시간을 낭비하진 않겠다. Sunsetting Cursed Terminal Emulation 기사에서 이미 그 끔찍한 고생을 충분히 다뤘다.
그 긴 작업 사슬의 주된 결과는 마침내 다음을 갖게 되었다는 점이다.
이것들은 다른 어떤 것보다도 훨씬 더 강력하고, 빠르며, 효율적인 명령줄 인터페이스와 텍스트 기반 사용자 인터페이스를 만들기 위해 필요한 부분이었다. 웃음도 안 나올 정도로 말이다. 그리고 악용 가능한 인밴드 시그널링 해킹도 없다.
최종 보스는 실제로 그것을 활용할 셸이었다. 겸손한 명령 프롬프트를 얼핏 보는 것보다 이 일은 훨씬 더 복잡하다. 이제 기본 데이터 처리는 비동기적이고 이벤트 주도적이다.
완전히 사소한 예를 담은 클립으로 설명하자면 이렇다.
여기 왼쪽에는 Cat9 셸이 있고, 오른쪽에는 터미널 에뮬레이터가 있다. 둘 다 find /usr를 실행한다. 실제 명령 실행 자체는 양쪽 모두 동일하다. Cat9에서는 그것이 자기만의 구획을 얻는 것을 볼 수 있다. 이것은 오래 걸리고 출력이 많은 프로세스이므로 진행 중인 데이터 수집에 대한 요약 보기로 자동 전환되고, 완료되면 확장된다.
그렇게 하면 원격 실행 시 소중한 네트워크 대역폭을 차지하고, 로컬 그래픽 스택에서 많은 처리와 재렌더링을 유발할 쓸모없는 갱신을 줄일 수 있다. 터미널 쪽이 먼저 시작했음에도 결국 꼴찌로 끝난다.
나는 요약 보기를 켜고 끌 수 있고, 같은 세션 안에서 다른 일을 계속할 수 있으며, 수집된 데이터가 아직 쌓이고 프롬프트가 멀쩡히 살아 있는 동안에도 내용 트리거, 필터, 검색, 복사 입력/출력 등을 붙여 그 데이터와 상호작용할 수 있다. 접근성 기능이 활성화되어 있었다면, 내 스크린 리더는 핵심만 읽어 주고 73MiB의 텍스트를 읽어내려다가 지옥 끝까지 역압을 받는 일도 없었을 것이다.
이것은 지난 몇 년간 자동화를 흡수하고 작업 흐름을 만드는 데 있어 나의 현재 기준선이었다. 하지만 안타깝게도 Durden과 마찬가지로 현재 상태와 공개된 것 사이의 거리는 절망적일 만큼 멀다.
나는 여기서 엄청나게 많은 것을 생략하고 있다. 보수적으로 잡아도 이 단계 하나만으로 30,000인시가 넘는 작업이었다. 적어도 언급할 가치가 있는 것들로는 접근성, 충돌 복원력, IPC 시스템, 그리고 네트워킹 프로토콜 작업이 있다.
이 전체 단계에 대한 고수준 결론은 최근 게시물 Arcan Explained: A Browser for Different Webs에 요약되어 있다.
이제 우리는 지금까지의 이야기를 거의 따라잡았다. 다음 단계 전환의 시간이며, 그 일부는 Arcan-A12: Weaving a New Web 게시물에서 이미 복선으로 드러났다.
이제 오늘에 이르렀고, 처음에 언급했던 자기 평가의 부분으로 돌아왔다. 아직도 내게 그럴 힘이 남아 있는가? 예이기도 하고 아니오이기도 하다. 지적으로 게으른 신경망의 남용은 컴퓨터 비전에 대한 내 흥미를 죽였다. 크립토 형제들은 암호공학에 대한 내 흥미를 빼앗아 갔다. 이제는 이 슬롭 기수들이 일반 컴퓨팅에 대한 내 흥미마저 앗아 간다. 그들은 모든 것을 Silicon Valley 그을음의 두껍고 기름진 잔여물로 덮어 버리고, 자유롭고 오픈 소스였던 집단 예술 프로젝트를 흐릿한 난장판으로 문질러 놓는다. 이것은 나와 나 같은 이들에게 적응과 다른 경로 선택을 강요할 것이다.
당신이 자유롭게 공유했고 선의로 만든 노력이 씹히고, 되새김질되고, 반복해서 당신 입안에 다시 뱉어지는 모습을 보는 것은 낙담스러울 만큼 나쁜 뒷맛을 남긴다. 거기에 모욕을 더하듯, 이제는 토큰으로 돈까지 내라고 한다. 그런 와중에도 귀가 멀 정도로 시끄러운 막대기 찾는 무리들이 자기네 슬롭 기계가 일을 얼마나 잘하는지 귀에 대고 짖어댄다. 그것은 엄청나게 무례하고, 무례함은 내게 형언할 수 없을 만큼 추하다.
한때 존재했던 것을 기록하고 보존할 수 있는 시간의 창은 아직 남아 있지만, 잡음 바닥이 천장에 닿고 있다. 권력을 쥔 자들이 개인용 컴퓨팅을 연령 검증되고, 신원이 증명된 짧은 형식 콘텐츠의 지옥으로 다섯 손가락 죽음의 주먹질을 가하려 들수록, 감당 가능한 부품은 점점 더 희귀해질 것이다.
나는 여전히 그림자 속으로 다시 물러나기 전에, 내 절뚝거리는 썰매개를 결승선 너머로 끌고 갈 생각이다. 내 친구들을 위해, 내 형제들을 위해. 마지막 단계에는 세 개의 응용 프로그램을 계획했지만, 그것은 하나 반으로 줄어들 것이다. 아쉽다. 나머지 것들도 꽤 멋졌는데. 0.8과 0.9를 위해 시도해 보고 싶었던 최적화와 강화 기법들의 묶음도 단축될 것이다. 다행히 NLnet (A12-Endpoints)가 빠진 부분의 상당량을 후원하기로 흔쾌히 동의해 주었으니, 이 모든 것에는 아직 약간의 동기가 남아 있다.
하지만 계속 앞으로 나아가자. 여기까지 읽어 줘서 고맙다. 다음번 ‘A Farewell to Hubs’에서 보자. 거기서는 post-Github-post-Discord 세계에서 이 프로젝트가 어떻게 유지되고 관리될지 다룰 것이다.