← 블로그 목록

대규모 소프트웨어 개발은 코드 양보다 조정 비용과 구조 설계가 더 어렵다

큰 시스템이 어려운 이유는 코드 양 그 자체보다 모듈 사이의 관계 수와 사람 사이의 조정 비용, 그리고 보이지 않는 복잡성에 있다. 프레드 브룩스의 통찰처럼 인원을 더 넣는다고 일정이 줄지 않고, 문서와 경계가 없으면 시스템은 금세 개인 의존형이 된다. 대규모 개발의 진짜 실력이 기능 구현보다 운영 현실을 견디는 구조를 만드는 데서 드러난다는 점을 정리한다.

대규모 소프트웨어 개발은 코드 양보다 조정 비용과 구조 설계가 더 어렵다

대규모 소프트웨어 개발은 코드 양보다 조정 비용과 구조 설계가 더 어렵다

작은 프로그램을 잘 만드는 사람이라고 해서 곧바로 큰 시스템도 잘 다루는 것은 아니다. 대규모 개발에서 어려운 것은 코드가 많다는 사실 자체보다, 그 코드가 서로 얽히고 사람들 사이에서 설명되고 유지되어야 한다는 점이다. 프레드 브룩스가 오래전에 지적했듯 소프트웨어의 핵심 난제는 복잡성, 적합성, 변화 가능성, 보이지 않음에 있다.

그래서 큰 프로젝트가 흔들릴 때 원인을 개발자가 더 필요하다야근이 부족하다에서 찾으면 거의 항상 빗나간다. 규모가 커질수록 기능 구현 비용보다 설계, 조정, 전달, 의사결정 비용이 훨씬 빠르게 늘어나기 때문이다.

대규모 개발은 기능 수보다 관계 수가 문제다

작은 프로그램은 한 사람이 전체 구조를 머릿속에 넣고 다닐 수 있다. 하지만 서비스, 엔진, 툴, 데이터 파이프라인, 배포 환경, 운영 절차가 얽히면 이야기가 달라진다. 한 모듈의 변경이 다른 모듈의 성능, 테스트, 배포 일정, 운영 안정성에 동시에 영향을 준다.

이때 복잡성은 선형적으로 늘지 않는다. 코드 한 줄이 아니라 인터페이스와 의존성의 수가 문제를 만든다. 그래서 대규모 시스템에서는 기능 추가보다 경계 설계와 변경의 전파를 줄이는 구조가 먼저 중요해진다.

사람을 더 넣는다고 일정이 자동으로 줄지 않는다

브룩스의 가장 유명한 통찰 가운데 하나는 늦어진 소프트웨어 프로젝트에 사람을 더 넣으면 더 늦어진다는 말이다. 이 문장을 문자 그대로만 받아들이면 단순한 경구처럼 보이지만, 핵심은 훈련과 조정 비용이다. 새 인력을 투입하면 기존 인력이 온보딩, 리뷰, 맥락 공유에 시간을 써야 하고, 커뮤니케이션 경로도 늘어난다.

규모가 커질수록 팀 운영에서 중요한 것은 인원 수 그 자체보다 역할 구분과 의사결정 구조다. 누가 무엇을 책임지고, 어떤 문서와 인터페이스가 그 책임을 연결하는지가 없으면 사람 수는 곧 소음이 된다.

대규모 시스템은 문서와 경계가 없으면 금세 개인 의존형이 된다

작은 프로젝트는 구두 설명으로도 굴러간다. 하지만 큰 프로젝트는 그렇지 않다. 설계 의도, 데이터 계약, 운영 절차, 예외 처리 원칙을 남기지 않으면 시스템은 금방 이건 그 사람이 알아 상태가 된다. 그리고 그 사람이 빠지는 순간부터 유지보수 비용이 급격히 올라간다.

이 지점에서 중요한 것은 문서를 많이 쓰는 것이 아니라, 꼭 필요한 지식을 공유 가능한 형태로 남기는 일이다.

이 정도만 명확해도 대규모 개발의 위험은 크게 줄어든다.

게임 개발에서는 기술 문제와 운영 문제가 함께 커진다

게임 프로젝트는 특히 복잡하다. 런타임 코드만 있는 것이 아니라 툴, 에디터, 빌드, 콘텐츠 데이터, 클라이언트-서버 동기화, 라이브 운영이 함께 움직인다. 그래서 재미있는 기능을 만들었다상용 서비스로 유지된다 사이의 거리가 멀다.

프로토타입은 한 기능의 가능성을 확인하는 데 충분하지만, 상용 시스템은 장애 대응, 계측, 배포, 회귀 테스트, 운영 도구까지 필요하다. 규모가 커질수록 진짜 실력은 기능 구현보다 이 운영 현실을 견디는 구조를 만드는 데서 드러난다.

마치며

대규모 소프트웨어 개발을 어려워 보이게 만드는 것은 신비한 천재성이 아니다. 대부분은 복잡성을 다루는 구조, 사람 사이의 조정, 경계 설계, 문서화의 문제다. 작은 프로그램을 잘 만드는 능력은 분명 중요하지만, 큰 시스템을 만들려면 그 위에 공유 가능한 구조를 세우는 역량이 더 필요하다.

결국 큰 시스템을 잘 만든다는 말은 코드를 많이 쓴다는 뜻이 아니다. 많은 사람이 오래 다뤄도 무너지지 않는 구조를 만든다는 뜻에 더 가깝다.

참고 자료

← 목록으로
Related

함께 읽으면 좋은 글

게임 개발버그디자인
버그를 창의적으로 활용한다는 말은 모든 결함을 미화하자는 뜻이 아니다

버그가 기능이 됐다는 일화는 매력적이지만, 그렇다고 모든 결함을 낭만으로 덮을 수는 없다. Street Fighter II의 콤보 같은 격투게임 사례와 게임 버그 분류 연구를 빌려, 우연한 동작이 시스템으로 살아남기 위한 세 가지 조건과 대부분의 버그가 여전히 고쳐야 할 결함인 이유를 구분해 정리한다. 진짜 창의성은 버그를 방치하는 데가 아니라 우연을 의도된 규칙으로 바꾸는 데 있다.

게임 개발밸런스전투 설계
전투 밸런스는 처음 캐릭터보다 마지막 상태를 먼저 정할 때 더 선명해진다

성장형 게임에서 전투 밸런스를 처음 캐릭터의 체감부터 잡으면 끝 구간에서 조합이 폭발하기 쉽다. 라이엇 게임즈의 챔피언 밸런스 프레임워크 사례를 빌려, 최종 장비와 상위 숙련자 조합을 먼저 정의한 뒤 초반 성장 곡선을 그쪽 기준에서 역산하는 방식이 왜 구조를 덜 망가뜨리는지, 출발점이 아니라 도착점을 먼저 보는 설계가 어떤 질문을 던지는지 정리한다.

전문성학습게임 개발
전문가는 지도처럼 구조를 보고 초보자는 길목처럼 문제를 보는 경우가 많다

전문가와 초보자의 차이는 기억량보다 문제를 어떤 구조로 보느냐에서 더 자주 드러난다. 에릭슨의 의도적 연습과 드레이퍼스 형제의 숙련도 모델을 빌려, 게임 개발에서 숙련자가 코드 한 줄을 넘어 데이터 흐름과 디버깅 비용, 시스템 충돌까지 함께 떠올리는 방식을 살피고, 전문성이 결국 답을 외우는 일이 아니라 지도를 만드는 일에 가까운 이유를 정리한다.