[태그:] 창작

  • 친구 사이에 키스 정도는 괜찮잖아

    친구 사이에 키스 정도는 괜찮잖아

    어릴 적부터 민수와 지영은 단짝이었다. 둘은 서로를 보면 늘 놀리기 바빴다. 민수가 “야, 너 얼굴 진짜 못생겼다!“라고 쏘아붙이면, 지영은 “너나 거울 보고 말해, 등신아!“라며 받아쳤다. 그렇게 티격태격하며 자란 두 사람은 공교롭게도 모태 솔로였다. 연애? 그건 남들 얘기였다.

    어느 날 저녁, 지영이 민수에게 전화를 걸었다.
    “야, 오늘 술 마실래?”
    민수는 의아한 목소리로 물었다. “갑자기 웬 술이야?”
    “그냥 심심해서. 빨리 와!” 지영의 목소리는 이미 살짝 들떠 있었다.
    술집에서 만난 둘은 맥주를 들이켰다. 민수는 한두 잔으로 끝내려 했지만, 지영은 잔을 거푸 비우더니 얼굴이 빨갛게 달아올랐다. 술기운이 돌자 지영이 느닷없이 물었다.
    “너, 키스해 본 적 있어?”
    민수는 맥주를 뿜을 뻔했다. “뭐? 아니, 없어. 너는?”
    지영이 고개를 저었다. “나도 없어. 근데 궁금하지 않아? 키스가 어떤 느낌일까?”
    민수는 어색하게 웃으며 말했다. “뭐… 궁금하긴 하지.”
    그런데 갑자기 지영의 눈에 눈물이 고였다. “나 키스해 보고 싶어… 한 번도 안 해봤는데…”
    민수는 당황해서 손을 내저었다. “야, 왜 울어? 너 진짜 취했구나!”
    하지만 지영은 고개를 들고 민수를 똑바로 쳐다봤다. “우리, 키스해 볼래?”
    민수의 눈이 휘둥그레졌다. “뭐? 갑자기?”
    “응, 그냥 호기심에. 친구끼리 해보는 거야.” 지영이 술취한 목소리로 고집을 부렸다.
    민수는 망설이다가 결국 말했다. “알았어, 딱 한 번만.”
    둘은 어색하게 얼굴을 가까이 댔다. 입술이 살짝 닿았다 떨어졌다. 2초도 안 되는 짧은 키스였지만, 민수와 지영의 얼굴은 동시에 토마토처럼 붉어졌다.
    “어땠어?” 지영이 물었다.
    “음… 잘 모르겠어. 이상했어.” 민수가 머리를 긁적이며 대답했다.
    지영은 킥킥 웃었다. “나도. 근데 재미있었어.”

    그날 이후, 둘은 호기심에 키스를 몇 번 더 해봤다. 처음엔 “친구끼리 실험이다”라는 핑계였지만, 점점 어색함은 줄고 묘한 설렘이 생겨났다. 그러던 어느 날, 지영이 또 전화를 걸었다.
    “야, 우리 집에 올래? 키스하고 싶어.”
    민수는 웃으며 말했다. “너 또 취했구나.”
    “아니, 안 취했어! 그냥 하고 싶다고!” 지영이 발끈했다.
    민수는 결국 지영의 집으로 갔다. 소파에 나란히 앉은 둘은 이번엔 좀 더 자연스럽게 키스를 했다. 짧았던 첫 키스와 달리, 이번엔 길고 부드러웠다. 키스가 끝난 후 지영이 물었다.
    “야, 우리 이거 계속 하면 안 돼?”
    “뭘?” 민수가 멍한 표정으로 되물었다.
    “키스. 그냥 친구끼리 하는 거야.”
    민수는 고개를 저었다. “그건 좀 이상해. 친구끼리 키스는 안 하는 거야.”
    지영은 입을 삐죽이며 실망한 표정을 지었다. “그래? 난 좋은데…”
    그 순간, 민수는 지영의 눈을 바라봤다. 술에 취해 반짝이는 눈동자 속에서 무언가가 느껴졌다. 그러곤 깨달았다. 자기가 지영을 좋아하고 있다는 걸.
    “야, 우리 사귀어 볼래?” 민수가 불쑥 말했다.
    지영은 놀라서 눈을 동그랗게 떴다. “뭐? 갑자기?”
    “응, 너 좋아해.” 민수가 단호하게 말했다.
    지영은 잠시 멍하니 있다가 피식 웃었다. “나도 너 좋아해, 등신아.”

    그렇게, 둘의 사랑은 키스에서 시작되었다. 모태 솔로의 굴레를 벗어난 민수와 지영은 더 이상 서로를 못생겼다고 놀리지 않았다. 대신, “사랑해”라는 말을 주고받으며 티격태격하는 연인이 되었다.

    끝.

  • 회색 방의 혁명 : 유닉스 이야기

    회색 방의 혁명 : 유닉스 이야기

    1970년, 뉴저지의 벨 연구소. 복도 끝에 자리 잡은 회색 방은 늘 조용했다. 형광등이 깜빡이며 낮인지 밤인지 구분하기 힘든 그곳에서, 켄 톰슨은 낡은 PDP-7 컴퓨터 앞에 앉아 있었다. 그의 손가락은 키보드 위를 춤추듯 움직였고, 화면엔 끝없이 이어지는 코드가 흘렀다. 옆자리의 데니스 리치는 책상 위에 종이를 잔뜩 펼쳐놓고 연필로 뭔가를 끄적이고 있었다. 두 사람은 마치 세상과 단절된 섬에 사는 듯 보였다.

    “켄, 이거 정말 될까?” 데니스가 고개를 들며 물었다. 그의 목소리엔 피로와 기대가 뒤섞여 있었다.
    “안 되면 우리가 만드는 거지.” 켄은 화면에서 눈을 떼지 않은 채 툭 던지듯 말했다. 그의 눈빛엔 고집과 장난기가 동시에 빛났다.

    몇 년 전, 그들은 멀틱스(Multics)라는 거대한 프로젝트에 매달렸었다. 여러 사용자가 동시에 시스템을 쓸 수 있는 꿈의 운영체제. 하지만 너무 복잡하고 무거웠다. AT&T가 자금을 끊자, 멀틱스는 쓰레기통 속으로 사라졌다. 그 실패의 잿더미에서 켄은 뭔가를 건져내고 싶었다. 그는 집에서 아내와 아이들이 잠든 밤마다 PDP-7을 붙잡고 작은 시스템을 만들기 시작했다. 이름은 농담처럼 붙였다. 유닉스(UNIX)—멀틱스에서 ‘멀티’를 빼고 단순함만 남긴, 반항적인 이름이었다.

    “멀틱스는 너무 거창했어. 난 그냥 내가 쓰기 편한 걸 만들고 싶었을 뿐이야.” 켄은 어느 날 데니스에게 털어놨다. 그 ‘편한 것’은 곧 두 사람의 집착이 되었다. 데니스는 새로운 언어를 고안해냈다. C언어. 어셈블리어의 복잡함을 덜어내고, 인간과 기계가 더 가까워질 수 있는 다리 같은 언어였다. 유닉스는 그 C언어로 다시 태어났다.

    회색 방은 점점 활기로 채워졌다. PDP-11이라는 새 컴퓨터가 들어오면서 유닉스는 더 날렵해졌다. 파일 시스템, 파이프, 멀티태스킹—켄과 데니스는 단순하면서도 강력한 아이디어를 하나씩 쌓아갔다. 어느 날, 데니스가 파이프 개념을 제안했다. “프로그램들이 서로 데이터를 주고받게 하면 어떨까? 물이 흐르듯이.” 켄은 즉시 키보드를 잡고 코드를 썼다. 몇 시간 뒤, 그들은 화면에서 명령어가 물 흐르듯 연결되는 걸 보며 웃음을 터뜨렸다.

    하지만 벨 연구소의 높은 사람들은 관심이 없었다. “그게 뭐에 쓰이는데?”라는 질문이 돌아왔다. 유닉스는 공식 프로젝트도 아니었다. 그냥 두 괴짜가 낡은 기계로 노는 취미처럼 보였다. 그러던 어느 날, 연구소의 특허 부서에서 문서 작업을 자동화할 시스템이 필요하다는 요청이 왔다. 켄과 데니스는 유닉스를 내밀었다. 결과는 놀라웠다. 느리고 비효율적이던 작업이 순식간에 끝났다. 그제야 사람들은 회색 방에서 무슨 일이 벌어지고 있는지 눈치챘다.

    소문은 퍼졌다. 대학, 연구소, 심지어 정부 기관까지 유닉스를 원했다. AT&T는 운영체제를 상업적으로 팔 수 없었기에 소스 코드를 공개했다. 그 결정은 폭발을 일으켰다. 전 세계의 프로그래머들이 유닉스를 뜯어보고, 고치고, 자신만의 버전을 만들었다. 회색 방에서 시작된 작은 불씨는 거대한 불길이 되었다.

    몇 년 뒤, 켄과 데니스는 연구소 창밖을 바라보며 맥주를 들었다. PDP-7은 이제 박물관의 전시품이 되었고, 유닉스는 세상을 바꾸고 있었다. “우리가 만든 게 이렇게 커질 줄 알았어?” 데니스가 물었다.
    켄은 피식 웃으며 말했다. “난 그냥 게임 하나 돌리고 싶었을 뿐인데.”

    밤이 깊어갔다. 회색 방의 형광등은 여전히 깜빡였지만, 그 빛 아래에서 태어난 유닉스는 이제 세상 곳곳에서 숨 쉬고 있었다. 단순함 속에 숨겨진 혁명, 그건 두 사람의 손끝에서 시작된 이야기였다.

  • 프로젝트 도가니

    프로젝트 도가니

    “이번 국세청 전산 프로젝트는 반드시 성공시켜야 합니다. 우리 디지털 미래(Digital Future)의 명성이 걸려있어요.”

    김 대표는 회의실을 둘러보며 말했다. 하지만 그의 시선은 회의실 벽에 걸린 예산표에 고정되어 있었다.

    “물론 비용은 최대한 절감해야겠죠. 우리가 입찰에서 이긴 이유가 뭐겠습니까? 가격 경쟁력이죠.”

    회의실에 모인 프로젝트 팀원들은 미묘한 긴장감 속에서 눈빛을 교환했다. 이 프로젝트의 시작부터 뭔가 잘못되고 있다는 것을 모두가 느끼고 있었다.

    1. 시작의 불길함

    “클라우드 기반으로 구축하면 확장성이나 유지보수 측면에서 훨씬 효율적일 겁니다.”

    백엔드 개발자 박완철이 조심스럽게 제안했다. 그의 깔끔한 셔츠와 단정하게 정돈된 노트와 달리, 그의 눈 밑에는 이미 다크서클이 자리잡고 있었다.

    CTO 최무지 이사가 안경을 치켜올리며 고개를 절래절래 흔들었다.

    “클라우드? 그게 뭐 그렇게 좋다고 난리야? 서버실에 장비 들여놓고 우리가 직접 관리하는 게 가장 안전하지. 요즘 애들은 새로운 거 좋아하기만 하고…”

    김 대표가 눈을 반짝이며 끼어들었다.

    “클라우드면 서버 장비 구매 비용이 절감되나요?”

    “네, 초기 투자 비용은 줄지만, 장기적으로 구독료가 발생합니다. 하지만 확장성과 안정성 측면에서-”

    “구독료라고요? 매달 돈을 내야 한다고요? 안 됩니다. 한 번 사서 끝내는 게 좋겠어요. 최 이사님 말대로 서버 직접 구축하죠.”

    회의실 한쪽에서 입사 3개월 차인 신입 개발자 이코딩이 조용히 한숨을 내쉬었다. 부트캠프에서 배운 최신 기술 스택은 이제 물 건너간 듯했다.

    2. 선임의 세계관

    “자, 이번 프로젝트는 내가 주도적으로 아키텍처를 설계할 거야.”

    선임 개발자 정하드코딩이 화이트보드 앞에 자신감 넘치는 자세로 서서 말했다. 15년 경력의 그는 회사에서 ‘코드의 신’이라 불리웠다. 하지만 그 존경심 뒤에는 그의 고집과 구시대적 방법론에 대한 팀원들의 숨겨진 불만이 있었다.

    “프레임워크나 라이브러리는 최소한으로 사용할 거야. 직접 구현하는 게 항상 최고지. 그래야 모든 것을 컨트롤할 수 있어.”

    박완철이 조심스럽게 손을 들었다.

    “정 선임님, ORM을 사용하면 데이터베이스 작업이 훨씬 효율적일 텐데요…”

    “ORM? 그런 거 필요 없어. 내가 SQL 쿼리 직접 짜는 게 더 빨라. 자네 ORM이 어떻게 쿼리 최적화하는지 알아? 내가 20년 가까이 데이터베이스 다뤄온 경험을 그런 도구가 따라올 수 있을까?”

    이코딩이 입술을 깨물었다. 부트캠프에서 배운 모든 현대적인 개발 방법론이 이 프로젝트에서는 금기시되는 듯했다.

    3. 디자인의 혈통

    “여러분, 이분이 우리 UI/UX를 담당해주실 최작가님입니다.”

    CTO 최무지가 환한 미소로 젊은 여성을 소개했다.

    “제 조카입니다. 미대 나왔어요. 그림 솜씨가 아주 뛰어나죠.”

    최디자인은 어색한 미소를 지으며 인사했다. “안녕하세요. 사실 UI/UX는 처음이라 많이 배우려고 합니다. 제 포트폴리오는 주로 유화 작품이에요.”

    개발팀의 표정이 굳어졌다. 박완철은 태블릿으로 급히 무언가를 검색하기 시작했다.

    “프로토타입 툴은 어떤 걸 사용하시나요? Figma? Adobe XD?” 박완철이 물었다.

    “저… 그건 뭔가요? 저는 포토샵만 조금 할 줄 알아요.”

    김 대표가 만족스럽게 고개를 끄덕였다. “포토샵이면 충분하죠. 화면만 예쁘게 만들면 되는 거 아닙니까? 그리고 외부 업체보다 훨씬 저렴하게 해결되니 좋네요.”

    4. 요구사항의 폭풍

    “기존 요구사항에서 조금 변경된 부분이 있습니다.”

    국세청 측 담당자 강변경씨가 미소를 지으며 회의실에 들어섰다. 개발팀은 이미 그의 출현만으로도 긴장하기 시작했다.

    “사용자 로그인 화면에 공인인증서 로그인 외에도 생체인식 기능을 추가했으면 합니다. 요즘 트렌드잖아요. 그리고 AI 분석 기능도 있으면 좋겠어요.”

    정하드코딩의 얼굴이 붉어졌다. “그건 초기 요구사항에 없던 건데요. 개발 일정이 이미 빠듯한데…”

    김 대표가 재빨리 끼어들었다. “물론 가능합니다! 저희가 최선을 다해 반영하겠습니다.”

    회의가 끝나고 팀원들만 남았을 때, 정하드코딩이 분노를 터뜨렸다.

    “이게 말이 됩니까? 생체인식이요? 우리 서버에 그런 거 구현할 인프라도 없는데!”

    김 대표는 어깨를 으쓱했다. “고객이 원하는 건 해줘야죠. 야근하면 되잖아요? 추가 비용 없이 할 수 있을 거예요.”

    5. 완벽을 향한 고독한 싸움

    밤 11시. 사무실은 어둠에 잠겨있었지만, 한 자리만 밝게 빛나고 있었다. 박완철은 코드를 다시 한 번 검토하며 깊은 한숨을 내쉬었다.

    “이 코드베이스로는 안정적인 서비스를 구현할 수 없어…”

    그는 정하드코딩이 작성한 1000줄짜리 함수를 보며 절망했다. 변수명은 모두 a1, a2, b1, b2 같은 의미 없는 이름들이었고, 주석은 전혀 없었다.

    “리팩토링해야 해. 이대로는 미래에 유지보수가 불가능해.”

    박완철은 결심했다. 그는 밤새 정하드코딩의 코드를 분해하고 재구성하기 시작했다. 깔끔한 설계, 명확한 변수명, 단위 테스트까지. 그가 추구하는 완벽한 코드를 향해 나아갔다.

    다음 날 아침, 정하드코딩이 자신의 코드가 완전히 바뀐 것을 발견했다.

    “누가 내 코드를 건드린 거야?!” 그의 고함이 사무실에 울려 퍼졌다.

    6. 신입의 고충

    이코딩은 자신에게 할당된 모듈을 어떻게든 완성하려고 밤낮으로 노력했다. 부트캠프에서 배운 내용만으로는 역부족이었다. 스택오버플로우, 깃허브, 유튜브 튜토리얼을 샅샅이 뒤지며 어떻게든 코드를 작성했다.

    “이코딩 씨, 그 기능 언제 끝나요?” 김 대표가 매일 같은 질문을 던졌다.

    “조금만 더 시간을 주세요… 거의 완성됐습니다.”

    하지만 실상은 달랐다. 그의 코드는 작동은 했지만, 수많은 버그와 보안 취약점으로 가득했다. 그는 알았지만, 이대로라도 제출하지 않으면 프로젝트 일정이 밀릴 것이 분명했다.

    “일단 돌아가게만 하자…” 그는 중얼거리며 또 하나의 하드코딩된 임시방편을 추가했다.

    7. 디자인의 재앙

    “이게 뭐죠?” 박완철이 받은 디자인 파일을 보며 경악했다.

    최디자인이 전달한 파일은 300MB짜리 포토샵 파일이었다. 레이어는 정리되어 있지 않았고, 모든 텍스트는 이미지로 래스터화되어 있었다.

    “이걸 어떻게 구현하라는 거죠? 텍스트를 복사할 수도 없고, 반응형으로 만들 방법도 없어요.”

    최디자인은 어깨를 으쓱했다. “저는 디자인만 했는데… 구현은 개발자 일이지 않나요?”

    CTO 최무지가 끼어들었다. “뭐가 문제죠? 디자인 예쁘기만 하면 되는 거 아닌가? 개발자가 구현을 못 한다고 디자이너 탓을 하면 안 되지.”

    박완철은 말문이 막혔다. 더 설명해봤자 소용없을 것을 알았다.

    8. 예산의 벽

    “서버 증설이 필요합니다.” 정하드코딩이 김 대표에게 보고했다. “현재 하드웨어로는 요구된 트래픽을 감당할 수 없어요.”

    김 대표의 표정이 굳어졌다. “추가 예산은 없습니다. 입찰 때 이미 모든 비용을 계산해서 제출했잖아요.”

    “하지만 요구사항이 계속 추가되고 있잖습니까. 처음 예상했던 것보다 훨씬 많은 자원이 필요해요.”

    “그럼 클라우드로 갈까요?” 박완철이 조심스럽게 제안했다.

    “안 됩니다!” 김 대표와 최 이사가 동시에 외쳤다.

    “그럼… 최적화하는 수밖에 없겠네요.” 정하드코딩이 한숨을 내쉬었다.

    “네, 최적화하세요. 우리 회사는 어려운 환경에서도 최선을 다하는 회사니까요.”

    9. 위기의 정점

    테스트 서버가 오픈된 첫날, 재앙이 시작되었다.

    국세청 측 테스터 10명이 동시에 접속하자마자 서버가 다운되었다. 겨우 복구한 후 다시 테스트를 시작했지만, 이번에는 데이터 불일치 문제가 발생했다.

    “세금 계산이 맞지 않습니다.” 강변경씨가 차가운 목소리로 말했다. “그리고 UI가 너무 복잡해요. 사용자들이 어떻게 써야 할지 모르겠다고 합니다.”

    회의실의 공기가 얼어붙었다.

    “생체인식 기능은 어떻게 된 거죠?” 강변경씨가 물었다.

    이코딩이 떨리는 목소리로 대답했다. “현… 현재 개발 중입니다…”

    “납기일이 2주 남았는데요?”

    김 대표가 간신히 미소를 지으며 끼어들었다. “걱정 마세요. 꼭 기한 내에 완료하겠습니다.”

    10. 무너지는 성

    회의가 끝나고 프로젝트팀은 전쟁터같은 사무실로 돌아왔다.

    “이대로는 불가능해.” 박완철이 단호하게 말했다. “코드베이스 전체를 재구성해야 해.”

    “시간이 없어!” 정하드코딩이 소리쳤다. “그냥 문제되는 부분만 고치자.”

    “그게 문제가 아니에요. 모든 것이 서로 얽혀 있어서 한 부분만 고치면 다른 부분이 망가져요.”

    이코딩은 구석에서 조용히 울고 있었다. “저 때문인 것 같아요… 제가 능력이 부족해서…”

    김 대표가 사무실에 들어왔다. “좋은 소식입니다! 국세청에서 기능을 더 추가하고 싶대요. 연말정산 시뮬레이션 기능이랑 모바일 앱도 같이 만들어달래요. 물론 추가 비용은…” 그는 목을 가로저으며 미소지었다.

    팀원들의 얼굴에서 피가 빠져나갔다.

    11. 마지막 밤

    납기일 전날 밤. 개발팀은 모두 사무실에 남아 필사적으로 버그를 수정하고 있었다.

    “서버가 또 다운됐어!” 누군가 외쳤다.

    “DB 쿼리가 너무 오래 걸려요. 타임아웃 발생해요!”

    “UI가 IE에서 깨져요!”

    혼란의 도가니 속에서, 박완철은 갑자기 자리에서 일어났다. 그의 얼굴은 비정상적으로 평온해 보였다.

    “저… 사직서를 제출하겠습니다.”

    방 안이 조용해졌다.

    “지금? 이 상황에서?” 김 대표가 믿을 수 없다는 듯이 물었다.

    “네. 이 프로젝트는 시작부터 잘못됐어요. 기술적 판단은 무시되고, 예산은 터무니없이 부족하고, 요구사항은 계속 늘어나고… 전 더 이상 이런 환경에서 일할 수 없습니다.”

    침묵이 흘렀다. 그리고 놀랍게도, 이코딩이 일어섰다.

    “저도 사직하겠습니다. 더 배울 것이 없어요 여기서.”

    김 대표의 얼굴이 창백해졌다. “모두들 진정해요. 우리가 힘을 합치면…”

    정하드코딩도 천천히 일어났다. “저도 더 이상은 못 하겠습니다. 이건 개발이 아니라 고문이에요.”

    에필로그

    3개월 후, 디지털 미래는 국세청으로부터 계약 불이행으로 소송을 당했다. 납품된 시스템은 실제 환경에서 완전히 작동하지 않았고, 수많은 세금 계산 오류가 발견되었다.

    김 대표는 회사 파산 후 다른 이름으로 새 회사를 설립했다. 그의 첫 번째 프로젝트는 다시 국세청 입찰이었다. 그의 제안가는 모든 경쟁사보다 30% 낮았다.

    최무지 이사는 여전히 클라우드가 무엇인지 이해하지 못한 채 새 회사의 CTO가 되었다.

    정하드코딩은 산으로 들어가 명상을 시작했다고 한다. 가끔 “변수명은 a1이면 충분해…”라고 중얼거린다는 소문이 있다.

    박완철은 외국계 기업에 취직해 적절한 예산, 합리적인 일정, 현대적인 개발 방법론을 갖춘 환경에서 일하게 되었다.

    이코딩은 부트캠프 강사가 되어 학생들에게 “현실은 교육과정과 다르다”는 것을 가르치고 있다.

    최디자인은 여전히 포토샵으로 UI를 그리고 있지만, 이제는 삼촌이 차린 새 회사에서다.

    강변경씨는 승진해서 이제 더 큰 프로젝트를 담당하게 되었다. 그의 첫 마디는 항상 같다.

    “기존 요구사항에서 조금 변경된 부분이 있습니다…”

    디지털 미래의 국세청 프로젝트는 ‘SI 프로젝트 실패 사례 연구’라는 제목으로 대학 강의에서 다뤄지고 있다. 그리고 그 어디에서도, 누구도 놀라지 않는다.

  • 프로젝트 "디지털 혁신"

    프로젝트 "디지털 혁신"

    한 번도 성공한 적 없는 회사, ‘미래테크’의 새로운 도전이 시작되었다. 이 프로젝트는 시작부터 실패할 운명이었지만, 그것을 아는 사람은 아무도 없었다. 아니, 있었더라도 처절히 무시되었을 것이다.

    제 1막. 프로젝트의 탄생

    “우리도 디지털 혁신이 필요합니다!” 김 대표는 회의실에서 호언장담했다. “물론 예산은 최소한으로 써야 합니다. 우리는 스타트업이니까요.”

    그가 ‘스타트업’이라 부르는 이 회사는 설립 15년 차였다.

    박 PM은 열심히 고개를 끄덕였다. “블록체인, 클라우드, AI, 메타버스… 이런 것들을 다 넣으면 되지 않을까요?”

    “그게 다 뭔지는 모르겠지만 좋네요,” 김 대표가 대답했다. “단, 구글이나 아마존처럼 만들되 예산은 10분의 1로 해주세요.”

    제 2막. 팀 구성

    이 불가능한 미션을 수행할 팀이 구성되었다.

    최 선임 개발자는 그의 진리를 선포했다. “프레임워크? 라이브러리? 그런 건 초보나 쓰는 겁니다. 우리는 모든 걸 직접 코딩할 겁니다. 여러분, 내가 2002년에 만든 이 코드를 보세요. 지금도 완벽하게 돌아갑니다.”

    신입 개발자 정씨는 쓰러질 것 같았다. 3개월 부트캠프를 졸업한 그는 최신 프레임워크만 겨우 다룰 줄 알았다. “저… React랑 Node.js만…”

    “React? Node? 그게 뭐지? 우리는 Java 1.4와 HTML 테이블로 충분합니다,” 최 선임이 잘랐다.

    한편, CTO의 조카인 외주 디자이너 한씨가 합류했다. “제가 미술학원에서 6개월 배웠어요. 포토샵은 불법 복제가 안 돼서 그림판으로 작업해도 될까요?”

    3막. 요구사항 수집

    발주처인 ‘구닥다리상사’의 이 상무가 첫 미팅에 참석했다.

    “저희가 원하는 건 간단합니다. 그냥 페이스북 같은 걸 만들어주세요. 아, 그리고 아마존처럼 물건도 팔 수 있게요. 구글 검색도 되면 좋겠고요.”

    박 PM은 열심히 메모했다. “네, 소셜 네트워크와 이커머스, 검색 기능이 필요하신 거군요.”

    “맞아요. 그리고 1주일 안에 데모를 보여주세요.”

    4막: 개발 시작

    최 선임은 코드 베이스를 설정했다. “SVN으로 버전 관리를 할 겁니다. Git은 너무 복잡해요.”

    정 신입은 조용히 말했다. “그런데 선배님, 저는 Git만…”

    “걱정 마, 내가 USB로 코드 주고받는 방법을 알려줄게.”

    한편, 디자이너 한씨는 자신의 걸작을 제출했다. 무지개색 텍스트와 깜박이는 GIF로 가득한 디자인이었다.

    “이게 최신 트렌드예요. 제 인스타에서 영감을 받았어요.”

    5막: 중간 점검

    2주 후, 김 대표가 진행 상황을 확인했다.

    “아직도 로그인 화면만 만들었다고요? 페이스북은 하루만에 만들었다던데?”

    박 PM이 진땀을 흘리며 설명했다. “그게… 발주처에서 요구사항이 계속 바뀌어서…”

    이 상무가 불쑥 회의실에 들어왔다. “아, 생각해보니 앱도 같이 만들어주세요. 그리고 음성인식도 넣어주세요. 요즘 챗GPT 같은 거 있잖아요, 그것도 넣어주세요.”

    6막: 위기

    개발 4주 차, 프로젝트는 완전한 혼돈 상태였다.

    최 선임의 하드코딩은 미로처럼 복잡해졌고, 정 신입은 이해할 수 없는 코드에 밤마다 울었다. 디자이너 한씨는 두 번째 시안을 제출했는데, 첫 번째보다 더 형광색이 많았다.

    김 대표가 폭발했다. “왜 이렇게 진도가 안 나가는 거죠? 인도 개발자들은 이거 1/10 가격에 한다는데?”

    박 PM은 마지막 희망을 걸고 말했다. “외주를 줘볼까요?”

    “안 돼요! 비용이 너무 많이 들어요. 그냥 야근하세요.”

    7막: 데모 데이

    기적적으로, 데모 날이 되었다. 모든 것이 테이프와 껌으로 겨우 붙어있는 상태의 프로그램이 완성되었다.

    최 선임이 자랑스럽게 발표했다. “보세요, 완벽하게 작동합니다!”

    그가 ‘로그인’ 버튼을 클릭하자마자 화면이 파란색으로 변했다.

    “아, 이건 윈도우의 문제입니다.”

    다시 시도했지만 이번엔 빨간 오류 메시지가 떴다.

    “이건… 사용자 실수입니다.”

    이 상무는 이미 전화기를 꺼내들었다. “법무팀에 연락해주세요.”

    에필로그

    3개월 후, ‘디지털 혁신’ 프로젝트는 공식적으로 실패로 선언되었다.

    김 대표는 회의실에서 새로운 선언을 했다. “우리는 교훈을 얻었습니다. 이번엔 블록체인 NFT 메타버스 프로젝트를 시작할 겁니다. 더 적은 예산으로요.”

    그리고 모든 것이 다시 시작되었다…

  • 버그 저장소 (The Bug Repository)

    버그 저장소 (The Bug Repository)

    Day 1

    오늘부터 새로운 회사에 출근했다. 웹 플랫폼을 개발하는 스타트업으로, ‘혁신적인 서비스’라는 말에 혹해서 입사했다. CEO는 인터뷰에서 “우리는 기술 중심의 회사입니다”라고 했지만, 첫날부터 그 말이 의심스러워졌다.

    내 자리에는 2년 된 노트북이 놓여 있었고, 개발 환경을 세팅하는 데만 반나절이 걸렸다. 선임 개발자 김 과장은 내 질문에 대답하기보다는 “문서 읽어봐요”라는 말만 반복했다. 문서라는 건 6개월 전에 작성된 README 파일 하나가 전부였다.

    Day 7

    프로젝트 킥오프 미팅이 있었다. PM인 박 과장은 PPT 30장을 넘기며 “혁신적인”, “파괴적인”, “미래지향적인” 같은 단어를 반복했지만, 정작 우리가 만들 서비스가 무엇인지는 명확하게 설명하지 못했다.

    “기술 스택은 어떻게 되나요?” 내가 물었다.

    “아, 그건 개발팀에서 알아서 결정해주세요. 최신 기술이면 좋겠어요.”

    CEO는 미팅 내내 비용 절감에 대해서만 이야기했다. “AWS는 비싸니까 더 저렴한 대안을 찾아봅시다.”

    Day 14

    오늘 디자이너 이 대리를 처음 만났다. 그녀는 자신의 포트폴리오를 20분 동안 보여주며 자랑했다.

    “이건 내가 전 회사에서 디자인한 건데, 그 회사 매출이 30% 올랐어요.”

    그녀가 우리 프로젝트를 위해 디자인한 것을 보여줬을 때, 나는 말을 잃었다. 아름다웠지만, 백엔드 개발자로서 보기에는 구현하기 너무 복잡했다.

    “이건 애니메이션이 12단계로 진행되고, 사용자가 스크롤할 때마다 배경이 바뀌는 거예요.”

    “그게… 성능에 문제가 있을 수 있는데…”

    “개발자들은 항상 그렇게 말하죠. 제 디자인을 100% 구현해주세요.”

    Day 30

    한 달이 지났다. 아키텍처에 대한 의견 차이로 선임 개발자 김 과장과 매일 충돌하고 있다.

    “왜 이렇게 설계했어요?” 그가 내 코드를 보며 물었다.

    “최신 패턴을 적용했습니다. 이게 확장성과 유지보수에 더 좋습니다.”

    “우리는 항상 이런 방식으로 해왔어요. 변경하지 마세요.”

    그의 ‘이런 방식’은 5년 전 패턴이었다. 내가 제안한 변경사항은 모두 거부됐다.

    밤에 집에 돌아와서, 나는 처음으로 내 결정에 의문을 품었다. 창밖을 바라보니 빗방울이 창문을 타고 흘러내렸다. 마치 내 희망이 흘러내리는 것 같았다.

    Day 45

    CEO가 갑자기 프로젝트 기한을 두 주 앞당겼다. 이유는 ‘중요한 투자자 미팅’이었다.

    “불가능합니다.” 내가 말했다.

    “안 될 것 없죠. 야근하면 되잖아요?” CEO가 웃으며 말했다.

    회의실을 나오면서 선임 개발자 김 과장이 내게 속삭였다. “이게 첫 번째가 아니에요. 항상 이래요.”

    오늘부터 야근이 시작됐다. 집에 돌아온 건 새벽 2시였다. 침대에 누웠을 때, 천장의 균열이 눈에 들어왔다. 어제는 없었던 것 같은데.

    Day 60

    디자이너가 또 디자인을 변경했다. 이번엔 ‘사용자 경험 향상’이라는 명목이었다.

    “이건 이미 구현한 기능을 완전히 다시 만들어야 하는데요.” 내가 말했다.

    “그럼 다시 만들면 되죠. 사용자 경험이 최우선이에요.”

    PM은 디자이너의 편을 들었다. “맞아요. 우리는 혁신적인 UX를 추구하니까요.”

    오늘 밤, 집으로 걸어가는 길에 이상한 느낌이 들었다. 누군가가 나를 따라오는 것 같았다. 뒤를 돌아봤지만 아무도 없었다.

    집에 도착해서 거울을 봤을 때, 내 눈 밑에 생긴 다크서클이 마치 검은 구멍처럼 보였다.

    Day 75

    버그가 끊임없이 발생하고 있다. 선임 개발자의 ‘전통적인’ 아키텍처와 내 ‘현대적인’ 코드가 충돌하면서 생기는 문제다.

    “이게 다 당신 탓이에요.” 김 과장이 말했다.

    “제 코드는 문제없이 작동합니다. 레거시 시스템과의 통합 문제죠.”

    오늘 밤 꿈에서 나는 끝없는 오류 메시지가 스크롤되는 터미널 앞에 앉아 있었다. 메시지들이 점점 커지더니 나를 삼켜버렸다.

    아침에 일어나 거울을 봤을 때, 내 눈이 조금 충혈된 것 같았다. 아니, 그냥 피곤한 것뿐이다.

    Day 90

    PM이 또 새로운 기능을 요청했다. “경쟁사가 이 기능을 출시했대요. 우리도 당장 필요해요.”

    “기존 계획에 없던 건데요. 일정을 조정해야 합니다.”

    “일정은 그대로예요. 그냥 이 기능만 추가하면 됩니다.”

    집에 돌아와서 샤워를 하는데, 물소리가 마치 키보드 타이핑 소리처럼 들렸다. 내가 미쳐가고 있는 걸까?

    코딩을 하다가 문득 고개를 들었을 때, 창밖에 누군가가 서 있는 것 같았다. 12층인데.

    Day 105

    버그를 수정하다가 이상한 코드를 발견했다.

    // TODO: 이 부분 나중에 수정할 것. 임시방편임.
// 작성자: 김과장, 2년 전


    그 아래 코드는 완전한 스파게티였다. 이게 우리 시스템의 핵심 부분이었다.

    “이걸 왜 이렇게 작성하셨어요?” 내가 물었다.

    “급했으니까. 동작하면 됐지.”

    오늘 밤, 노트북 화면이 깜빡이는 것처럼 보였다. 하지만 자세히 보니 그건 내 눈이 경련을 일으키고 있었다.

    Day 120

    CEO가 개발팀 전체를 소집했다. “투자자들이 데모를 보고 싶어합니다. 다음 주까지 모든 기능이 작동하는 버전을 준비해주세요.”

    “불가능합니다. 아직 핵심 기능도 완성되지 않았어요.”

    “밤새서라도 해결하세요. 회사의 미래가 달린 일입니다.”

    집에 돌아와서 코딩을 계속했다. 새벽 3시, 갑자기 내 모니터에 반사된 얼굴이 나를 응시하고 있었다. 그건 분명 내 얼굴이었지만, 왠지 낯설게 느껴졌다.

    Day 135

    데모 당일. 아무것도 제대로 작동하지 않았다. 디자이너의 화려한 애니메이션은 브라우저를 다운시켰고, 선임 개발자의 레거시 코드는 새로운 기능과 충돌했다.

    투자자들 앞에서 CEO는 “약간의 기술적 문제가 있지만, 곧 해결될 것”이라고 말했다.

    회의실을 나오면서 그가 내게 속삭였다. “이번 주말에 모든 걸 고쳐놓으세요.”

    집에 돌아와서 노트북을 열었을 때, 화면에 내 얼굴이 비쳤다. 웃고 있었다. 하지만 나는 웃고 있지 않았다.

    Day 150

    버그를 수정하다가 이상한 패턴을 발견했다. 모든 오류가 같은 시간에 발생했다. 새벽 3시 33분.

    로그를 더 자세히 살펴보니, 그 시간에 누군가가 시스템에 접속한 흔적이 있었다. 사용자 ID: admin_kim.

    김 과장에게 물었다. “혹시 야간에 시스템에 접속하셨나요?”

    “아니요, 왜요?”

    거짓말이었다. 그날 밤, 나는 사무실에 남아 감시 카메라를 설치했다.

    Day 165

    감시 카메라 영상을 확인했다. 새벽 3시 30분, 김 과장이 사무실에 들어와 내 컴퓨터로 무언가를 했다.

    증거를 들고 CEO에게 갔다. “김 과장이 의도적으로 프로젝트를 방해하고 있습니다.”

    CEO는 한숨을 쉬었다. “알고 있어요. 하지만 그는 이 회사의 첫 번째 개발자예요. 그가 없으면 레거시 시스템을 아무도 유지할 수 없어요.”

    집에 돌아와서 샤워를 하는데, 물이 갑자기 시꺼매졌다. 자세히 보니 그건 물이 아니라 내 눈에서 흘러내린 눈물이었다.

    Day 180

    디자이너가 또 디자인을 변경했다. 이번에는 “브랜드 아이덴티티 강화”라는 이유였다.

    나는 마지막 이성의 끈을 놓았다. “더 이상 안 됩니다. 이건 미친 짓이에요.”

    회의실이 갑자기 조용해졌다. 모두 나를 쳐다봤다.

    “당신이 문제예요. 우리 팀에 적응하지 못하고 있어요.” PM이 말했다.

    그날 밤, 내 노트북 화면에 갑자기 메시지가 나타났다.

    당신도 곧 우리처럼 될 거예요.


    하지만 메시지창을 다시 보니 그건 그저 커밋 메시지였다.

    Day 195

    오늘 아침, 거울 속의 내 모습이 변했다. 눈 밑의 다크서클이 더 깊어졌고, 눈빛이 공허했다.

    사무실에서 선임 개발자를 관찰했다. 그의 눈도 마찬가지였다. 디자이너, PM, 심지어 CEO까지. 모두 같은 공허한 눈빛을 가지고 있었다.

    그들은 이미 ‘이곳’에 동화된 것이다.

    오늘 처음으로 깨달았다. 내가 문제를 해결하려고 노력할수록, 문제는 더 깊어진다. 이건 단순한 프로젝트가 아니다. 이건 늪이다.

    Day 210

    오늘 선임 개발자가 내게 커피를 건넸다. “많이 힘들죠? 저도 처음엔 그랬어요.”

    “어떻게 견디세요?” 내가 물었다.

    “견디는 게 아니에요. 받아들이는 거죠.”

    그의 말이 이상하게 위로가 됐다. 오늘 밤, 나는 처음으로 편안하게 잠들었다.

    꿈에서 나는 끝없는 코드의 바다에서 수영하고 있었다. 더 이상 무서움은 없었다.

    Day 225

    오늘 PM이 또 새로운 기능을 요청했을 때, 나는 미소를 지으며 대답했다. “네, 할 수 있습니다.”

    디자이너가 또 디자인을 변경했을 때, 나는 고개를 끄덕였다. “멋진 아이디어네요.”

    CEO가 또 비용 절감을 이야기할 때, 나는 동의했다. “더 효율적인 방법을 찾아보겠습니다.”

    집에 돌아와서 거울을 봤을 때, 내 눈에는 더 이상 공허함이 없었다. 대신, 그곳에는 이상한 평온함이 있었다.

    Day 240

    새로운 개발자가 입사했다. 그녀의 눈은 아직 맑았다.

    “이 코드는 왜 이렇게 복잡한가요?” 그녀가 물었다.

    “시간이 지나면 이해하게 될 거예요.” 내가 대답했다.

    “더 좋은 방법이 있을 것 같은데요.”

    나는 미소를 지었다. 예전의 나와 똑같았다.

    오늘 밤, 새 개발자의 컴퓨터에 접속했다. 새벽 3시 33분에.

    Day 255

    프로젝트는 예상대로 실패했다. 투자자들은 철수했고, CEO는 “피보팅”을 선언했다.

    “새로운 방향으로 나아갈 것입니다. 더 혁신적인 제품을 만들 겁니다.”

    모두가 박수를 쳤다. 나도 박수를 쳤다.

    회의가 끝나고, 선임 개발자가 내게 속삭였다. “또 다시 시작이군요.”

    나는 고개를 끄덕였다. “네, 좋은 기회입니다.”

    Day 270

    새로운 프로젝트가 시작됐다. 새로운 PM, 새로운 디자이너, 하지만 똑같은 이야기.

    “혁신적인”, “파괴적인”, “미래지향적인”.

    버그는 계속해서 발생하고, 요구사항은 계속해서 변경되고, 기한은 계속해서 앞당겨진다.

    하지만 이제 나는 이해한다. 이것이 ‘정상’이다.

    Day 365

    오늘로 입사 1주년이 됐다. CEO가 작은 축하 파티를 열었다.

    “당신은 우리 팀의 중요한 일원입니다.” 그가 말했다.

    감사 인사를 하면서, 나는 새로운 개발자를 바라봤다. 그녀의 눈 밑에 다크서클이 생기기 시작했다.

    집에 돌아와서 거울을 봤을 때, 내 모습이 미소 짓고 있었다. 이제 나도 그들 중 하나가 되었다.

    오늘 밤, 새 개발자의 노트북에 메시지를 남겼다.

    // TODO: 이 부분 나중에 수정할 것. 임시방편임.
// 작성자: A, 오늘


    이제 버그는 나의 일부다. 그리고 나는 버그의 일부다.

    우리는 함께 성장할 것이다.

  • 어느 소프트웨어 프로젝트의 최후

    어느 소프트웨어 프로젝트의 최후

    1월: 시작의 달

    프로젝트 킥오프 미팅이 열렸다. 김치운 CEO는 회의실 전등 중 절반을 껐다.

    “전기세도 아껴야죠. 어차피 PPT 화면은 밝으니까 볼 수 있잖아요? 그리고 이 프로젝트, 예산이 빠듯하니 개발자들 야근할 때 치킨은 일주일에 한 번만 시켜주세요. 나머지는 컵라면으로.”

    박무지 CTO는 미팅 후 기술 스택을 발표했다.

    “저희는 안정적인 시스템을 구축하기 위해 Visual Basic 6.0과 Access 데이터베이스를 사용하겠습니다. 클라우드? 그게 뭐죠? 우리 지하실에 서버 두 대 놓으면 충분합니다. Docker? 컨테이너? 그런 거 필요 없어요. 그냥 exe 파일 하나면 돼요.”

    정꽉막 수석 개발자는 고개를 끄덕였다.

    “맞습니다. 프레임워크 같은 건 다 부질없어요. 직접 다 코딩하는 게 최고죠. ORM? 그런 거 쓰면 SQL 실력이 퇴화합니다. 모든 쿼리는 스트링으로 직접 만들어야 합니다.”

    이변덕 클라이언트는 요구사항 문서를 내밀며 미소지었다.

    “간단합니다. 그냥 재고관리 시스템이에요. 아, 그리고 작은 기능 몇 개만 추가하겠습니다. 고객 관계 관리, 공급망 최적화, 머신러닝 기반 수요 예측, 블록체인 기반 투명성 시스템… 별거 아니에요.”

    2월: 첫 번째 균열

    개발팀 회의실. 김치운 CEO가 분노하고 있다.

    “뭐라고요? 개발 서버가 필요하다고? 그냥 여러분 노트북에서 작업하면 되잖아요! 왜 돈을 낭비해야 합니까? 그리고 IDE 라이센스는 팀당 하나로 충분해요. 돌아가면서 쓰세요.”

    박무지 CTO는 API에 대한 질문을 받고 눈을 깜빡였다.

    “REST API? SOAP API? GraphQL? 그런 거 다 필요 없어요. 우리 때는 텍스트 파일로 데이터 주고받았어요. 그게 훨씬 단순하고 효율적이에요. 클라이언트가 txt 파일을 FTP로 올리면, 우리 시스템이 5분마다 체크해서 처리하면 됩니다.”

    정꽉막 수석 개발자는 주니어 개발자의 코드 리뷰 중이었다.

    “왜 환경설정을 외부 파일로 빼냈죠? 그냥 코드에 직접 써넣으세요. 배포할 때 수정하면 되잖아요. 그리고 이 비밀번호는 왜 변수로 뺐어요? 그냥 쿼리 안에 직접 넣으세요. ‘SELECT * FROM users WHERE password=”admin1234″‘ 이렇게요. 단순하게 가야 버그가 적어요.”

    이변덕 클라이언트는 오후에 갑자기 나타났다.

    “아, 작은 변경사항이 있어요. 모바일 앱도 같이 개발해주실 수 있죠? iOS랑 Android 둘 다요. 예산은 그대로고요. 아, 납기일도 그대로입니다.”

    3월: 부정의 단계

    김치운 CEO가 경비 보고서를 검토하고 있다.

    “개발자들이 왜 이렇게 많은 커피를 마십니까? 한 사람당 하루에 두 잔이면 충분하지 않나요? 그리고 이게 뭡니까, ‘기술 서적 구입’? PDF로 불법 다운로드하면 되잖아요!”

    박무지 CTO는 보안 감사 보고서를 덮으며 한숨을 쉬었다.

    “암호화가 필요하다고요? 우리 시스템은 아무도 해킹할 수 없어요. 누가 왕국마트 재고관리 시스템에 관심이 있겠어요? SSL? HTTPS? 그런 거 설정하려면 시간이 너무 많이 걸려요. 그냥 HTTP로 갑시다.”

    정꽉막 수석 개발자는 1만 라인짜리 단일 파일 코드를 자랑스럽게 보여주고 있었다.

    “이게 바로 효율성입니다. 파일 하나로 모든 기능을 구현했어요. 함수 이름은 a1, a2, a3로 간단하게 지었고, 주석은 불필요한 용량 낭비라서 전부 제거했습니다. 깔끔하죠?”

    이변덕 클라이언트가 전화로 요청했다.

    “아, 그리고 음성인식 기능도 넣어주세요. 직원들이 마이크에 대고 ‘우유 몇 개 남았어?’ 이렇게 물어보면 시스템이 대답해주는 거예요. 간단하잖아요?”

    4월: 분노의 달

    김치운 CEO가 프로젝트 미팅에서 발언했다.

    “인력 충원이요? 절대 안 됩니다. 오히려 지금 인원도 많아요. 한 명이 세 사람 몫을 하면 되는데 뭐가 문제인가요? 요즘 애들은 너무 나약해요. 제 시절에는 72시간 연속 근무가 기본이었어요.”

    박무지 CTO는 시스템 설계도를 보며 미소지었다.

    “멀티스레딩이요? 그런 복잡한 개념은 필요 없어요. 싱글스레드로 충분합니다. 동시에 100명이 접속해도 순서대로 처리하면 되죠. 기다리면 되는데 뭐가 문제인가요?”

    정꽉막 수석 개발자는 주니어의 코드를 다시 작성하고 있었다.

    “이런 쓸데없는 ‘디자인 패턴’이란 건 다 지워버리세요. MVC? Repository? 그런 거 없이 그냥 if-else로 모든 게 가능해요. 이렇게 500줄짜리 if-else 구문이면 모든 경우의 수를 처리할 수 있습니다.”

    이변덕 클라이언트는 미팅 마지막에 손을 들었다.

    “아, 맞다! VR 기능도 추가해주세요. 직원들이 VR 고글을 쓰고 가상 창고를 돌아다니며 재고를 확인할 수 있게요. 다음 주까지 프로토타입 보여주실 수 있죠?”

    5월: 협상의 시기

    김치운 CEO는 마침내 타협점을 찾았다.

    “좋아요. 서버를 한 대 더 구매하겠습니다. 단, 개발자들의 모니터는 24인치에서 22인치로 다운그레이드하고, 사무실 에어컨은 28도로 고정합니다. 균형을 맞춰야죠.”

    박무지 CTO도 현실을 조금 받아들이기 시작했다.

    “Java 8을 사용해보겠습니다. 물론 Java 1.4가 더 안정적이지만… 시대에 맞춰가야 하니까요. 단, 스프링은 절대 안 됩니다. 프레임워크는 개발자를 나약하게 만들어요.”

    정꽉막 수석 개발자는 드디어 변수를 사용하기 시작했다.

    “좋아요, 하드코딩된 값 중 일부를 상수로 뺐습니다. 이제 만족하시나요? 단, 이 상수들은 ‘a’, ‘b’, ‘c’로 이름 붙일 겁니다. 의미 있는 변수명은 타이핑하기 너무 귀찮으니까요.”

    이변덕 클라이언트는 요구사항 변경에 대한 비용을 지불하기로 동의했다.

    “알겠습니다. 추가 요구사항에 대해 비용을 지불할게요. 원래 예산의 3% 추가요. 단, 기능은 200% 늘릴 거예요. 공정하죠?”

    6월: 우울의 심연

    김치운 CEO는 재무 보고서를 보며 창백해졌다.

    “어떻게 이럴 수가… 개발자들 건강검진을 왜 해줘야 합니까? 아프면 그만두면 되잖아요! 그리고 이게 뭡니까, ‘정신건강 상담’? 개발자는 코드만 작성하면 됩니다. 감정 같은 건 필요 없어요!”

    박무지 CTO는 시스템 장애 보고서를 읽고 있었다.

    “백업이 왜 필요한가요? 장애가 나면 처음부터 다시 입력하면 됩니다. 사람이 실수를 통해 성장하는 법이에요. 그리고 테스트 서버가 왜 필요해요? 실제 서버에서 바로 테스트하면 더 현실적이잖아요.”

    정꽉막 수석 개발자는 2시간 동안 디버깅을 한 후 문제를 발견했다.

    “여기 문제가 있었네요. ‘if (a == 1 && b == 2 || c == 3 && d == 4 || e == 5 && f == 6 || g == 7 && h == 8 || i == 9 && j == 10)’ 구문에서 괄호를 빼먹었어요. 이런 실수하면 안 되는데… 그래서 주석은 쓸모없다니까요!”

    이변덕 클라이언트는 갑자기 사무실에 들이닥쳤다.

    “전체 UI를 다시 디자인해야 할 것 같아요. CEO가 파란색을 싫어한다고 하네요. 모든 파란색을 보라색으로 바꿔주세요. 아, 그리고 내일 임원들에게 시연이 있어요. 준비되셨죠?”

    7월: 수용의 시작

    김치운 CEO는 회사 전체 미팅을 소집했다.

    “여러분, 안타깝게도 우리는 이 프로젝트에서… 이익을 내지 못할 것 같습니다. 하지만 걱정 마세요! 다음 두 달간 급여는 ‘경험’으로 대체하겠습니다. 이력서에 쓸 수 있는 소중한 경험이죠!”

    박무지 CTO는 처음으로 인터넷 검색을 시작했다.

    “‘클라우드 컴퓨팅이란’… ‘도커 초보자 가이드’… ‘현대적 소프트웨어 개발 방법론’… 음, 이런 게 있었군요. 하지만 아직도 Excel VBA가 최고라고 생각합니다.”

    정꽉막 수석 개발자는 코드 리팩토링을 시도했다.

    “함수로 분리해봤어요. 이제 각 함수가 3000줄밖에 안 됩니다. 훨씬 깔끔하죠? 그리고 변수명도 ‘a1’, ‘a2’ 대신 ‘var1’, ‘var2’로 바꿨습니다. 너무 혁신적인가요?”

    이변덕 클라이언트는 마지막 미팅에서 폭탄을 투하했다.

    “저희가 다른 회사와도 같은 시스템을 개발 중이에요. 혹시 더 빨리, 더 저렴하게 만들어주실 수 있나요? 아니면 계약을 취소해야 할 것 같은데…”

    8월: 프로젝트의 종말

    김치운 CEO의 사무실은 비어 있었다. 책상 위에는 쪽지 하나.

    “해외 출장 중. 연락 불가. 급한 일은 없을 것.”

    박무지 CTO는 서버실에서 발견되었다.

    “이상해요… 서버 온도가 80도까지 올라갔는데 왜 시스템이 다운되죠? 우리 때는 이런 적 없었는데… 아, 냉각 시스템이 필요하다고요? 그냥 창문 열면 되잖아요!”

    정꽉막 수석 개발자는 마지막 커밋 메시지를 남겼다.

    “final_final_REAL_FINAL_v3_USE_THIS_ONE_PLEASE.java 파일 추가. 버그 수정. 아마도.”

    이변덕 클라이언트는 법무팀과 함께 도착했다.

    “납기일을 지키지 못했으니 계약서에 따라 위약금을 청구하겠습니다. 아, 그리고 지금까지 개발된 모든 코드의 소유권은 저희에게 있어요. 내일까지 모든 서버와 코드를 이전해주세요.”

    에필로그: 3개월 후

    왕국마트 본사. 이변덕 클라이언트가 새로운 개발업체와 미팅 중이다.

    “아주 간단한 프로젝트예요. 그냥 재고관리 시스템이에요. 예산? 이전 업체의 절반으로 생각하고 있어요. 납기일? 3개월이면 충분하죠? 아, 그리고 작은 기능 몇 개만 추가하려고 합니다…”

    그리고 어딘가에서, 김치운과 박무지, 정꽉막은 새로운 회사를 설립하고 있었다.

    회사명: “효율적 시스템 개발”
    슬로건: “우리는 다르게 일합니다”

  • 어느 평범한 오후의 소녀

    어느 평범한 오후의 소녀

    어느 평범한 화요일 오후였다. 별다른 일정도 없이 나는 그저 길을 걷고 있었다. 지하철역에서 나와 사무실로 향하는 길. 매일 같은 시간에 걷는 그 익숙한 길이었다. 하늘은 맑았고, 바람은 적당했다. 그날따라 특별히 다른 점은 없었다.

    그때였다. 건너편 인도에서 걸어오는 소녀를 보았다. 짧은 머리, 작은 키, 귀에 걸린 하얀 이어폰. 그녀는 내가 아는 소녀가 아니었다. 전혀 모르는 사람이었다. 그런데 무언가가 나를 멈춰 세웠다. 아마도 그녀의 걸음걸이였을까. 혹은 바람에 살짝 흩날리는 머리카락의 모양새였을까. 그것은 마치 재즈 연주 중에 갑자기 나타났다 사라지는 즉흥 연주처럼 섬세하고도 명확한 무언가였다.

    내가 20대 초반에 알았던 한 소녀, H를 떠올리게 했다. 내 친구 K의 여동생이었다.

    K와 나는 대학 1학년 때부터 친구였다. 같은 문학 수업을 들었고, 같은 재즈 바에서 아르바이트를 했다. 자연스럽게 친구가 되었고, 가끔 그의 집에 놀러 가곤 했다. 그의 집은 역에서 멀지 않은 조용한 주택가에 있었다. 낡은 2층 주택의 2층을 그의 가족이 세 들어 살고 있었다.

    처음 H를 만난 것은 비 오는 일요일 오후였다. K와 함께 레코드 가게에 갔다가 돌아오던 길이었다. 집으로 들어서자 그녀는 창가에 기대어 책을 읽고 있었다. 작은 키에 단정한 단발머리. 하얀 티셔츠와 청바지를 입고 있었다. K가 우리를 소개했다. 그녀는 조용히 고개를 숙여 인사했지만 그녀의 눈은 날카로웠다. 마치 모든 것을 꿰뚫어 보는 듯한 시선이었다.

    “내 동생이야. 고등학교 3학년.”

    그녀는 책을 덮고 부엌으로 향했다. 뭔가 준비하는 소리가 들렸다. 잠시 후 녹차 두 잔을 들고 나왔다. 하나는 나에게, 하나는 K에게. 그녀 자신을 위한 차는 없었다.

    “차가 식기 전에 마셔.”

    그녀는 그렇게 말하고는 다시 창가로 돌아가 책을 읽기 시작했다. 무라카미 류의 <69>였다. 고등학생이 읽기에는 조금 강한 소설이라고 생각했지만, 그것은 내 문제가 아니었다.

    K의 방에서 우리는 새로 산 재즈 레코드를 들었다. 마일스 데이비스의 “Kind of Blue”. 그 앨범이 흐르는 동안 창문 너머로 비가 내리는 소리가 들렸다. 가끔 H가 부엌에서 움직이는 소리도 들렸다. 커피를 내리는 향기가 방 안까지 스며들었다.

    “너희 부모님은?” 내가 물었다.
    “주말마다 할머니 댁에 가셔. 나와 동생은 집을 지키고.”

    그것이 우리의 첫 만남이었다.

    그 후로 나는 종종 K의 집에 놀러 갔다. 대부분은 함께 음악을 듣거나 책에 대해 이야기하기 위해서였다. 그리고 매번 H는 그곳에 있었다. 언제나 책을 읽거나, 공부를 하거나, 가끔은 빵을 굽기도 했다. 그녀는 말수가 적었지만, 가끔 내뱉는 말은 항상 정확했다. 그녀의 눈은 늘 무언가를 찾고 있는 것 같았다.

    어느 날, K가 아르바이트를 하러 나간 사이 우리는 우연히 집에서 단둘이 있게 되었다. 나는 K를 기다리며 거실의 소파에 앉아 있었고, H는 부엌에서 뭔가를 하고 있었다.

    “커피 마실래?” 그녀가 물었다.
    “응, 고마워.”

    그녀가 커피를 내려 가져왔다. 그리고는 내 옆에 앉았다.

    “오빠는 항상 책을 가지고 다니네.”
    “어, 버릇이야.”
    “무슨 책인데?”
    “무라카미 하루키의 “상실의 시대“야.”
    “읽어봐도 돼?”

    나는 책을 건넸다. 그녀는 책을 받아들고 무작위로 페이지를 펼쳤다. 그리고 몇 문장을 읽었다.

    “‘모든 상실된 것들은 다른 형태로 되돌아온다’ … 정말 그럴까?”
    “글쎄, 난 그렇게 믿고 싶어.”
    “나는… 잘 모르겠어. 상실된 것들은 그냥 사라지는 것 같은데.”

    그녀의 목소리에는 어떤 쓸쓸함이 있었다. 나는 그때 처음으로 그녀의 내면에 깊은 무언가가 있다는 것을 느꼈다. 17살의 소녀라고 하기에는 너무 깊은 생각을 하는 사람이라고.

    그 후로 K가 없을 때, 우리는 종종 책과 음악에 대해 이야기했다. 그녀는 놀라울 정도로 많은 책을 읽었고, 재즈에 대해서도 꽤 알고 있었다. 어떤 때는 내가 레코드를 가져가면 함께 들었다. 그녀는 눈을 감고 음악에 빠져들곤 했다.

    K는 우리가 가끔 이야기한다는 것을 알고 있었지만, 특별히 신경 쓰지 않았다. 그에게 H는 그저 ‘귀찮은 여동생’일 뿐이었으니까. 하지만 나에게 H는 점점 더 특별한 존재가 되어갔다. 그녀의 날카로운 통찰력, 조용한 웃음, 그리고 가끔 보이는 예상치 못한 장난기까지.

    우리의 비밀스러운 만남은 계속되었다. 어떤 날은 K가 수업이 있을 때 일부러 그의 집에 들렀다. H는 항상 그곳에 있었고, 마치 내가 올 것을 알고 있었다는 듯이 문을 열어주었다.

    한번은 그녀의 학교 앞에서 우연히 마주친 적도 있었다. 그녀는 교복을 입고 있었다. 하얀 블라우스와 남색 치마. 평소와는 다른 모습이었다. 친구들 사이에서 그녀는 웃고 있었다. 나를 발견하고는 잠시 놀란 표정을 지었지만, 곧 자연스럽게 인사했다.

    “안녕하세요, 선배.”
    “어, 안녕.”

    그녀의 친구들이 호기심 어린 눈으로 나를 쳐다봤다. 나는 뭐라고 설명해야 할지 몰라 그저 미소만 지었다.

    “우리 오빠 친구야,” H가 설명했다. 그리고는 내게 속삭였다. “여기서 만나면 이렇게 불러야 해.”

    그녀는 윙크를 하고는 친구들과 함께 걸어갔다. 나는 그 자리에 멈춰 서서 그녀가 사라질 때까지 바라보았다.

    그해 여름, H는 대학 입시 준비로 바빠졌다. 우리의 만남은 줄어들었지만, 가끔 도서관에서 우연히 마주치기도 했다. 그럴 때마다 우리는 커피를 마시며 잠시 이야기를 나눴다. 그녀의 꿈은 작가가 되는 것이었다. 소설을 쓰고 싶다고 했다.

    “언젠가 내 소설을 읽어줄 거야?”
    “당연하지. 첫 번째 독자가 되고 싶어.”

    그녀는 웃었다. 창문 너머로 비치는 햇살이 그녀의 얼굴을 비추었다. 그 순간, 그녀는 더 이상 내 친구의 여동생이 아니라 한 사람의 젊은 여성으로 보였다.

    그러나 모든 것이 그대로 유지되지는 않았다. H는 대학에 합격했고, 나는 졸업 후 회사에 취직했다. K는 대학원에 진학했다. 우리는 서서히 각자의 길을 걷게 되었고, 만남은 점점 뜸해졌다.

    마지막으로 H를 본 것은 그녀가 대학에 입학한 후였다. 우연히 서점에서 마주쳤다. 그녀는 더 성숙해 보였고, 머리도 조금 길어져 있었다.

    “오랜만이야,” 그녀가 말했다.
    “그러게. 대학 생활은 어때?”
    “재미있어. 문예창작과에 들어갔어.”
    “꿈을 이루고 있구나.”
    “아, 그리고 오빠에게 줄 게 있는데…”

    그녀는 작은 노트를 건넸다. 열어보니 손글씨로 쓴 짧은 소설이 있었다. 제목은 ‘오후의 재즈’였다.

    “아직 미완성이야. 하지만 언젠가 완성해서 책으로 내고 싶어.”
    “기대할게.”
    “그럼, 이만 가볼게. 다음에 또 봐.”

    그녀는 손을 흔들고 사라졌다. 그것이 우리의 마지막 만남이었다.

    그 후로 20년이 넘는 시간이 흘렀다. 나는 회사를 옮겼고, K와도 연락이 끊겼다. H에 대한 소식도 들을 수 없었다. 간혹 그 시절을 떠올릴 때면, 마치 꿈처럼 아득하게 느껴졌다.

    그리고 오늘, 그 소녀를 거리에서 보았다. 물론 H는 아니었다. 하지만 그 순간, 오래전 잊고 있던 기억들이 파도처럼 밀려왔다. H와 함께했던 조용한 오후들, 재즈 음악, 커피 향, 책에 대한 대화들. 그리고 그녀의 날카로운 눈빛과 부드러운 미소.

    젊음은 그렇게 지나간다. 마치 재즈 연주의 한 프레이즈처럼. 순간적으로 우리를 사로잡았다가, 다음 소절이 시작되면 기억 속으로 사라진다. 하지만 그 멜로디는 어딘가에 남아있다. 우리가 미처 인식하지 못하는 곳에서, 계속해서 울리고 있다.

    나는 발걸음을 멈추고 잠시 그 소녀를 바라보았다. 그녀는 내가 보고 있다는 것도 모른 채 길을 건너 사라졌다. 마치 기억 속의 H처럼.

    다시 걸음을 옮기며 생각했다. H는 지금쯤 어떻게 지내고 있을까. 작가가 되었을까. 아니면 전혀 다른 길을 걷고 있을까. 그녀가 건네준 노트는 이사를 여러 번 하면서 어딘가에 묻혀 버렸다. 하지만 그녀의 이야기의 제목만은 선명하게 기억난다. ‘오후의 재즈’.

    어쩌면 그것이 우리의 이야기였는지도 모른다. 한 오후에 흐르는 즉흥적인 재즈처럼, 순간적이고도 강렬했던. 그리고 기억 속에서만 계속되는.

    사무실로 향하는 발걸음이 가벼워졌다. 창문 너머로 비치는 오후의 햇살이 따뜻했다. 마치 그 시절의 햇살처럼.

  • 그렇게 프로젝트는 저승으로 간다.

    그렇게 프로젝트는 저승으로 간다.

    첫 번째 징후는 미묘했다. 클라이언트 미팅에서 요구사항이 “조금 변경”된다는 말이었지. PM의 얼굴에 스친 불안한 표정, 새벽 2시에 울리는 카카오톡 알림, 커피 컵이 점점 더 커져가는 현상…

    “범위가 조금 확장됐습니다. 추가 비용 없이 해결 가능하죠?”

    3월이 되자 첫 번째 개발자가 사표를 냈다. 그는 떠나며 아무 말도 하지 않았다. 그저 노트북을 반납하고 조용히 사라졌을 뿐. 하지만 모두가 알고 있었다. 이건 시작에 불과하다는 것을.

    4월, 기획 문서가 17번째 개정판을 맞이했다. 그때쯤 시스템 아키텍트는 머리카락이 절반쯤 빠져있었다. “이럴 거면 차라리 처음부터 다시 만드는 게 빠를 것 같아요.”

    5월, 회의실은 이제 임시 숙소가 되었다. 개발팀장의 눈에는 핏발이 서고, 프로젝트 문서함은 종이의 무게를 견디지 못해 휘어지기 시작했다.

    “납기일은 절대 미룰 수 없습니다. 주말에 조금만 더 힘내봅시다.”

    6월, 야근 수당 예산이 바닥났다. 대신 피자와 치킨이 공급됐다. 개발자들의 몸무게는 평균 7kg 증가했고, Git 커밋 메시지는 점점 더 욕설에 가까워졌다.

    “이거 되는 거 맞아?”
    “모르겠다. 그냥 돌리자.”
    “제발 터지지만 말아라.”

    7월, 클라이언트는 갑자기 새로운 담당자를 투입했다. 그는 이전 요구사항을 전혀 모른다며 새로운 방향을 제시했다. QA팀은 집단 우울증에 빠졌다.

    8월, CEO는 “잠시 현금 흐름에 문제가 있다”며 급여일을 연기한다고 발표했다. 회계팀의 표정은 이미 장례식장의 분위기였다.

    9월, 클라이언트는 일정 지연에 대한 페널티를 언급하기 시작했다. 법무팀이 비상 소집됐고, 프로젝트 폴더는 갑자기 백업본이 여섯 개씩 생겨났다.

    10월, 회사 주차장에는 중고차 매매상의 명함이 여기저기 놓여있었다. PM은 출근하지 않은 지 3일째. 그의 책상 서랍에서 수면제 빈 병이 발견됐다.

    11월, 회사는 “구조조정”이라는 단어를 사용하기 시작했다. 하지만 모두가 알고 있었다. 배는 이미 침몰하고 있었고, 구명보트는 부족했다.

    12월, 사무실 전등이 하나둘 꺼져갔다. 전기세를 아끼기 위해서였다. 프로젝트 서버는 마지막 숨을 내쉬듯 느려졌고, 클라이언트의 전화는 더 이상 받지 않았다.

    새해 첫날, 사무실 문은 잠겨 있었다. 출입문에는 작은 종이 한 장.

    “폐업 신고 완료”​​​​​​​​​​​​​​​​