프로젝트 도가니

“이번 국세청 전산 프로젝트는 반드시 성공시켜야 합니다. 우리 디지털 미래(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 프로젝트 실패 사례 연구’라는 제목으로 대학 강의에서 다뤄지고 있다. 그리고 그 어디에서도, 누구도 놀라지 않는다.

Comments

댓글 남기기