6월 선거 뒤에도 회계 업무와 홈페이지 개발은 계속됐다. 선거 때 설정한 검색 성과를 확인하고, 새 클라이언트의 견적 계산기와 리플렛을 만들며 이전 작업을 다시 활용한 경험을 다룬다.
PROLOGUE · 모래알과 바윗덩어리
3페이지짜리 영업 퍼널과 선거 프로젝트 묶음 — 당신에게 프로젝트의 크기는 무엇을 바꾸는가?
모래알이든 바윗덩어리든, 가라앉기는 마찬가지다. 그러므로 만들어야 하는 것이 3페이지의 영업용 퍼널 페이지든, 하나의 iOS 앱이든, 제9회 전국동시지방선거 때 착수된 선거용 웹 프로젝트들의 묶음이든 — 프로젝트의 분량은 나에게 그리 중요하지 않다. 중요한 것은 단 하나. 그것이 겨눈 곳으로 정확하게 가라앉는가다.
무게는 속도를 사주지 않는다. 피사의 사탑, 그 오래된 이야기 그대로다. 무게가 바꾸는 것은 떨어지는 빠르기가 아니라, 빗나갔을 때 바닥에 남는 자국의 크기뿐이다. 그래서 나는 프로젝트를 무게로 분류하지 않는다. 착지의 정확도로 분류한다.
№ 01 · 선거 후 26일간의 회계 업무
개표가 끝난 다음 날 아침, 당신의 저장소에는 무엇이 남아 있었나?
당선 감사 오버레이가 남아 있었다. 개표 전날 밤에 미리 만들어뒀다가 6월 4일 아침에 켰다. 사흘 뒤 선거사무소 주소를 지운 뒤로 26일 동안 새 커밋이 없었다.
그동안에도 나는 선거법상 회계책임자로 일했다. 선관위에 회계보고서를 제출하고, 부르면 출두해야 했다. 호출도 생각보다 잦았다. 그 기간 앞뒤의 커밋은 후보에서 당선인으로, 당선인에서 의원으로 바뀌는 신분을 페이지에 반영하는 작은 수정이었다. 페이지와 데이터베이스의 기능도 새 업무에 필요한 요구사항에 맞춰 늘어났다.
3호에서 다룬 선거가 끝난 뒤, 당선인은 7월 1일 취임했다. 미팅에서 세 가지 요청을 받았다. 홈페이지의 기능을 키워야 한다. 주민 민원을 한곳에서 확인할 시스템이 필요하다. 의정활동을 대외적으로 깔끔하게 보여주도록 홈페이지를 바꿔야 한다. 상세 발주서나 요구사항 정의서는 없었고, 그 세 문장으로 개발을 다시 시작했다.
№ 02 · 세 문장, 세 개의 채널
문장 세 개가 어떻게 3채널 시스템이 되나?
8일 걸렸다. 돌아가는 코드까지 하루, 채널 전부가 실가동하기까지 8일. 먼지가 가라앉고 보니 이렇게 되어 있었다 — 의원의 Gmail 안에서 5분마다 도는 수집 스크립트, 문자·RCS·MMS를 알림 레일에서 낚아채 서버로 보내는 안드로이드 앱, 그리고 그 전부가 내려앉는 인증된 관리자 백오피스.
지은 것보다 짓지 않은 것이 더 중요했다. 공개 민원 폼 — 접수 API까지 이미 만들어놓고, 지웠다. 주민에게 새 행동을 가르치는 대신 이미 쓰는 채널을 시스템이 흡수하게 했고, 동의 화면 없는 개인정보 수집이라는 법의 구멍도 그 길에 함께 닫혔다.
대가도 있었다. RCS는 표준 SMS API로 잡히지 않아 설계를 알림 리스너 쪽으로 틀었는데, 그 권한 조합은 정확히 스미싱 앱의 것이다. 완성된 앱이 의원 본인의 갤럭시에서 "악성 앱 의심"으로 차단됐다. 버그가 아니었다. 보안 모델이 설계대로 작동한 것이다. 결론은 실용적인 축소 — 이 앱은 평생 단 한 대의 폰에서만 산다. 그렇다면 스토어도 서명 키도 필요 없다. adb 설치 한 번이면 충분하다.
데이터베이스는 트라우마와 싸워서 골랐다. 선거 기간에 나는 같은 캠프의 서비스 하나가 무료 티어의 벽에 부딪혀 죽어가는 것을 봤다. 그 기억으로 결정하는 대신, 그 죽음의 원인 아홉 가지를 표로 만들어 하나씩 대입했다 — 우리 워크로드는 그 벽 근처에도 가지 않는다. 트라우마는 진짜였다. 다만 워크로드를 가리는 트라우마였다.
№ 03 · 선거 후 확인한 검색 성과
선거 주간에는 보이지 않던 숫자들 — 언제 돌아왔나?
선거가 끝나고서야 돌아왔다. 신생 도메인이 구글과 네이버 검색 1페이지에 올랐고, 네이버가 사이트링크를 붙였고, 검색은 최대 식별 유입 채널이 됐다 — 선거 주간 식별 유입의 88%. 그리고 7월의 실측에서 4개 AI 엔진 전부가 의원의 현직 신분을 정확히 답했고, 그중 3개는 공식 사이트를 근거로 직접 인용했다.
검색 설정은 투표 전에 했고, 성과는 투표 뒤에 확인했다. 개표 결과를 뜻하는 returns처럼, 이 작업의 성과도 뒤늦게 확인하고 있다.
№ 04 · 계산기, 그리고 그 밑에 있던 것
새 클라이언트가 요구한 것은 정확히 무엇이었고, 당신은 무엇을 더 얹었나?
클라이언트 — 롯데렌터카의 장기렌트 영업 매니저 — 가 원한 것은 웹페이지 하나였다. 차의 가격을 계산해주는 견적 계산기 UI가 있는 페이지. 요구사항은 그게 전부였다.
나는 거기에 숨을 얹었다. 숨을 쉬듯 부풀었다 가라앉는 버튼, 표면을 스치는 반짝임, 스크램블링되며 제자리를 찾으면 형광펜이 그어지는 가격 숫자. 견적이라는 건조한 행위에 감촉을 입히는 일이다. 요구사항서에는 없다. 하지만 없다는 이유로 빼면, 그 페이지는 경쟁사 것과 구분되지 않는다.
그리고 요구사항의 표면에 드러나지 않는 사실이 하나 있었다. 경쟁사가 이미 웹페이지를 띄워놓고 있었다는 것. 그래서 나는 "웹페이지를 만들어 달라"는 요구에서 한 걸음 더 나아가 이렇게 전달했다. "만들고 올린다고 끝나는 것이 아니다. 지금은 사람들이 Gemini와 Claude에게 내일 마실 음료수 종류와 신혼부부용 차 스펙을 묻는 시대다. SEO·GEO·AEO를 고려해야 한다. 나는 선거 기간에 만든 후보의 웹페이지에 SEO·GEO·AEO 처리를 심었고, 당신과 만나기 전에 Google, Gemini 앱, Claude 앱, 네이버에서 후보의 현직 의원 신분과 공약, 그리고 공식 웹페이지가 정확히 뜨는 것을 확인했다. 진행할 것을 권장한다."
한 호 전이었다면 이것은 영업 멘트였을 것이다. 지금은 아니다. 숫자를 심어본 사람이 직접 걷어본 뒤에 하는 권고다. 클라이언트는 진행을 승인했다 — 선거가 이 프로젝트에 보낸 첫 번째 return이었다.
№ 05 · 열 줄, 그리고 두 사이트
새 의뢰가 왔다. 이번에는 지시문 대신 무엇이 오갔나?
선거 때 나는 10줄이 안 되는 지시문을 받았고, 뉴욕의 오카시오-코르테스 후보가 유권자에게 어떻게 시각적 충격을 줬는지 보려고 Tandem 에이전시의 자료와 아카이빙된 캠페인 페이지를 뒤졌다. 받은 것은 열 줄. 나머지는 내가 찾아 나섰다.
이번에는 반대로 흘렀다. 지시문을 기다리는 대신 내가 레퍼런스 두 개를 골라 테이블에 올렸다 — 하나는 페라리 닷컴, 하나는 테슬라 닷컴. 결말부터 말하면, 테슬라 닷컴에서 본 도안 하나가 이 프로젝트에 인용됐다. 선거 때는 남의 캠페인 아카이브에서 원칙을 증류해 왔고, 이번에는 그 증류된 안목이 먼저 움직였다. 손버릇은 같다 — 표면이 아니라 원칙을 옮긴다. 달라진 것은, 그 손버릇이 이제 지시문보다 먼저 도착한다는 것이다.
№ 06 · 종이 리플렛을 화면에 배치한 방법
예고 없이 질문이 떨어졌다 — 종이 리플렛이 화면에서 살 수 있는가. 무엇을, 얼마나 빨리 결정했나?
난데없이 들어온 질문이었다. 업체의 종이 리플렛을 디지털 공간에 맞게 시각화할 수 있느냐. 빠른 결정을 요하는 상황이라 다소 간단하게 처리했고, 아직 수정의 여지가 많이 남아 있다는 것도 안다. 그래도 결정의 뼈대는 분명했다.
첫째, 애플 커버플로우 스타일의 캐로셀을 고려했다. 둘째, 리플렛이 가진 두 개의 한계 — 종이 매체라는 것, 세로 규격이라는 것 — 를 화면마다 다르게 돌파했다. 모바일에서는 캐로셀로 한 면씩. 데스크탑에서는 모든 면이 좌우로 한꺼번에 펼쳐지되, 중앙에 선 면만 또렷하게 남는다.
사진작가였는지 화가였는지, 누군가 그런 말을 했다 — 점과 선과 밝기, 세상 만물이 주목을 유발하는 프레임이 될 수 있다고. 그 말을 그대로 받았다. 흐려진 이웃 면들은 버려지는 것이 아니다. 또렷한 중앙 면을 지나칠 수 없게 만드는 액자로 일한다. 종이에서는 접힌 면이 읽는 순서를 강요하지만, 화면에서는 펼쳐진 면 전부가 서로의 액자가 된다.
№ 07 · "내가 그쪽으로 가겠다"
클라이언트가 조용해졌다. 표류하는 프로젝트 앞에서 개발자는 무엇을 할 수 있나?
이 클라이언트는 생각보다 연락이 잘 닿지 않았다. 피드백이 멈추면 개발자는 편하다 — 그리고 프로젝트는 죽는다. 그래서 이렇게 말했다. "이대로 피드백 없이 프로젝트가 표류하면, 나는 몸은 편하지만 프로젝트는 엎어진다. 여유시간이 언제인가? 내가 그쪽으로 가겠다. 나는 태블릿으로 명령만 내리면 개발과 배포가 가능하도록 이미 인프라를 꾸려 놓았다. 오늘 모든 피드백을 받고 프로젝트를 마무리해 주겠다."
허세가 아니었다. 몇 달 전에 원격 체계를 꾸려뒀다 — 태블릿이 명령을 내리면 개발과 배포가 그냥 돌아가는 구성. 그 문장을 말할 수 있게 해준 것이 그것이다. 그날 클라이언트 앞에 앉아 피드백을 오는 족족 반영했고, 프로젝트는 1차로 닫혔고, 잔금이 들어왔고, 검색과 AI 검색 설정까지 끝났다. 필요보다 먼저 지어둔 것은, 이렇게 돌아온다.
№ 08 · 무엇이 다른가
한 개발자가 당신이 디자인하고 기획하고 제안하는 방식을 물으러 왔다. 그 대화 뒤, 이번 호에 무엇을 분명히 남겨야 한다고 생각했나?
얼마 전 한 대형 기술기업의 현직 개발자에게 갑자기 메시지가 왔다. iOS 개발자들이 모인 대화방에서 내가 활동하는 모습을 보았고, 내가 하는 일이 신기해 보였으며, 사람 자체가 궁금해 한 번 만나 이야기를 듣고 싶다고 했다. 우리는 만났다. 상대는 내가 디자인을 어떻게 하는지, 프로젝트를 어떻게 기획하는지, 제안을 어떻게 만들고 건네는지를 인터뷰하듯 물었다. 코드를 계기로 만난 자리였지만 대화는 코드보다 그 앞에서 이루어지는 판단에 오래 머물렀다.
그 자리를 겪고 나니 이번 호에서 한 가지는 더 분명히 해둘 필요가 있다고 생각했다. 『The Election』에서 이미 적었다. 여의도와 영등포의 수많은 정치 에이전시와 인쇄업체들은 어느 한 정당의 외곽조직처럼 움직이지 않는다. 모든 당에서 의뢰를 받고, 맡은 결과물을 만든다. 그들에게 정당은 소속이 아니라 클라이언트다.
내가 비즈니스를 대할 때 롤모델로 삼는 여러 인물 가운데 하나는 아드난 카쇼기다. 냉전기 그는 록히드와 노스럽을 비롯한 서방 방산업체와 사우디 정부 사이의 거래를 중개했다. 훗날에는 미국 무기가 이스라엘을 거쳐 이란으로 향한 이란-콘트라 무기 거래에도 중개자로 등장했다.
그렇다면 묻겠다. 개발자가 자신의 기획과 디자인과 코드를 클라이언트에게 파는 것은 무엇이 다른가?
EPILOGUE · 계속 돌아오는 것들
영어에서는 개표 결과를 returns라 부른다. 그 밖에 또 무엇이 돌아왔나?
영어에서 개표된 표를 returns라 부른다 — 표가 돌아온다는 뜻이다. 그러나 이 개발자의 장부에서 돌아온 것은 표만이 아니었다. 선거가 비운 자리에서 시스템은 별관을 증축했고, 투표 전에 심어둔 숫자는 투표 후에 돌아왔고, 캠페인이 열어둔 문으로 새 클라이언트가 걸어 들어왔고, 몇 달 먼저 지어둔 인프라는 단 하루의 오후에 제값을 했다.
이 매거진의 3호는 이겼다라는 단어로 닫혔다. 이번 호는, 엄밀히 말해 닫히지 않는다 — 그것이 이 호의 요지다. 저장소를 깨운 세 문장 가운데 셋째 — 의정활동을 대외적으로 깔끔하게 보여주는 창으로서의 홈페이지 — 는 아직 책상 위에 열려 있다. 선거는 하룻밤에 끝난다. Returns는 그렇지 않다. 지금도 들어오는 중이고, 이 일의 정직한 잣대는 개발자가 첫머리에 말한 그대로다. 떨어진 것의 무게가 아니라, 어디에 내려앉았는가.
인터뷰 읽기: sass.studio.