한미 대원제약 진천 WCS 프로젝트 회고

Review

긴급한 연락 한통

설날에 지인에게 연락 한통이 왔었습니다. 아쉽게도 설날 안부를 묻는 가벼운 이야기가 아니었습니다.

내용은 급하게 컨베이어 ECS 를 개발해야 한다는 내용이었습니다.

당시 저는 조금 더 일찍 시골에 다녀온 터라 집에서 여유롭게 휴식을 취하고 있었습니다. 갑작스러운 연락이었지만, 그 지인은 저에게 소중한 스승이자 선배였고 무엇보다 제가 도움이 될 수 있다면 함께하고싶었습니다.

그 연락 한 통을 계기로, 설날 연휴가 끝나기도 전에 새로운 프로젝트에 합류하게 되었습니다.

생각보다 심각한 현장 상황

현장에 도착하고 보니 생각했던 것보다 상황은 훨씬 좋지 않았습니다.

WCS 는 핵심 로직이 거의 구현되지 않은 빈 껍데기에 가까웠고, ECS 역시 테스트가 가능한 수준의 코드만 작성되어 있었습니다. 오픈까지 한달 남은 상태라 현장의 분위기가 무거울 수 밖에 없었습니다.

제가 담당한 컨베이어 ECS 는 사용하는 언어가 달랐을 뿐 이전부터 많이 경험해온 업무였습니다. 문제는 그보다 상위에 있는 WCS 였습니다.

센터의 재고 특성을 반영하지 못하는 데이터구조로 잡혀있었고 그 위에 구현된 로직도 없었습니다. 단순하게 남은 기능을 마저 개발하는 방향으로 오픈까지 정상적인 시스템을 만드는건 어려워 보였습니다.

WCS 는 다시 만들자

남은 기간을 생각하면 정말 리스크가 높고 위험한 판단이었습니다. 하지만 당시의 판단으로는 오히려 기존 결과물을 그대로 이어 개발하는 것이 더 큰 위험이라도 판단했습니다.

그래서 오픈까지 남은 한 달 동안 WCS를 처음부터 다시 만들어보기로 했습니다. 저는 Conveyor ECS 와 WCS 의 Routing 로직 파트를 담당하였습니다.

불 끄러온 수많은 개발자들

현장에서는 익숙한 얼굴들을 볼 수 있었습니다.

이전에 함께 프로젝트를 진행했었고 믿고 맡길 수 있는 개발자들이 하나 둘 투입되고 있었습니다. 말 그대로 불을 끄기 위해 사람들이 모이고 있었습니다.

브룩스의 법칙을 몰라서 그런것이 아닙니다.

늦어진 소프트웨어 프로젝트에 인력을 추가하면 오히려 프로젝트가 더 늦어질 수 있다.

새로운 개발자가 투입되면 업무를 설명하고 개발 환경과 구조를 이해시키는 데 시간이 필요합니다. 결국 당장 개발에 투입할 수 있는 시간이 줄어들고, 커뮤니케이션 비용까지 늘어나게 됩니다.

하지만 머리로는 알고 있더라도 어쩔 수 없는 상황이 존재합니다. 현실은 소프트웨어만으로 돌아가지 않기 때문입니다. 이미 정해진 오픈, 생산 일정, 타 시스템 연계, 하드웨어 일정 등 서로 얽혀있는 이해관계들이 있었습니다.

좋은 선택만 할 수 있는것은 아닙니다. 다른 선택을 하기 어려웠습니다.

외주 리스크 그리고 버스 팩터

참 아쉽게도 외주 개발에 대한 관리가 제대로 이루어지지 않았던 것 같습니다.

개발이 완료되었다고 전달받은 항목들을 하나씩 확인해보면 정작 코드가 존재하지 않는 경우가 있었습니다. 프로젝트를 진행하면서 이 정도로 큰 문제가 발생한 경우는 처음이었습니다.

엎친 데 덮친 격으로 제가 담당하게 된 프로그램의 이전 개발자는 출산휴가를 떠난 상황이었습니다. 완성되지 않은 프로그램에 담당 인력까지 갑자기 빠진 상황이었습니다. 분명 개발 스펙에는 Java 로 작성하도록 되어 있었지만, 실제 프로그램은 담당 개발자가 개인적으로 판단하여 Python 으로 개발되어 있었습니다.

물론 프로그램은 정상적으로 동작하기만 한다면 당장의 문제는 없을 수도 있습니다. 하지만 조직에서 바라보는 관점은 조금 다릅니다.

개발 언어 하나에도 나름의 이유가 있습니다. 팀이 익숙한 기술을 사용하고, 정해진 규칙과 표준을 따르는 것은 단순히 개발자의 취향을 제한하기 위한 것이 아닙니다. 담당자가 바뀌더라도 다른 사람이 코드를 이해하고 유지보수할 수 있도록 하기 위한 것이고 결국 조직이 시스템을 지속적으로 운영하기 위한 장치입니다.

현장과 어올리지 않는 기술 선택

문제를 하나씩 해결해 나가던 중, 바코드 스캐너를 처리하는 방식에서도 큰 문제가 발견되었습니다. 기존 프로그램은 브라우저를 통한 Keyboard Wedge 방식으로 바코드 스캐너의 입력을 처리하고 있었습니다. 일반적인 웹 환경에서는 충분히 사용할 수 있는 방식이지만 물류 현장엔 좋지 않은 방식입니다.

대표적으로 3가지의 크리티컬한 문제점이 있습니다.

  • 눈에 보일 정도로 느린 바코드 입력
  • 브라우저 포커싱에 의존하는 입력 방식
  • 사람이 읽을 수 없는 Control Character 를 정상적으로 처리 할 수 없음

이건 물류 자동화 분야에선 굉장히 크리티컬한 이슈들입니다. Web 어플리케이션을 고수하고자 한다면 Web Serial API 를 사용했어야 합니다.

결국은 끝냈다

한 달간 정말 많은 일이 있었습니다.

하루가 멀다 하고 문제가 생겼고, 해결하면 또 다른 문제가 나타났습니다. 때로는 이것을 한 달 안에 끝낼 수 있을까 싶기도 했습니다. 그럼에도 하나씩 해결하다 보니 어느 순간 시스템이 돌아가기 시작했습니다.

결국 오픈했습니다. 아쉬운건 사실이지만 당시 주어진 상황에서 최선을 다했었습니다. 때로는 잘못된 것을 빠르게 걷어내고 다시 시작하는 용기와 판단이 필요할지도 모르겠습니다.

그리고 무엇보다 혼자서는 할 수 없는 일이었습니다. 긴급하게 투입되어 함께 밤낮없이 문제를 해결해준 동료들이 있었기에 한 달이라는 짧은 시간 안에 프로젝트를 끝낼 수 있었습니다.