개발/개발지식

[개발잡담] 디아블로4와 함께 알아보는 스파게티 코드

핸디(Handy) 2023. 7. 27. 02:36

스파게티를 먹는 디아블로

들어가며

최근에 디아블로 4 레딧을 보다가 상당히 어이없는 글을 발견했습니다.

오픈월드 게임인 디아블로 4에서 유저끼리 만나는 순간 과부하가 걸린다는 것인데요.

이게 대체 무슨 말도 안되는 소리인가 싶으면서도 블라자드(디아블로4 개발사)의  유명한 스파게티 코드에 대해 살펴보러 가보겠습니다.

스파게티 코드란?

여기서 스파게티 코드를 설명하기엔 짧으니 위키백과 링크로 대체하겠습니다.

 

스파게티 코드 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 스파게티 면발 스파게티 코드(spaghetti code)는 컴퓨터 프로그램의 소스 코드가 복잡하게 얽힌 모습을 스파게티의 면발에 비유한 표현이다. 스파게티 코드는 정상

ko.wikipedia.org

디아블로 4 스파게티 코드

게임을 하다보면 게임이 느려지는 순간을 간혹 경험하게 됩니다.

예를 들어 포탈을 타고 이동하거나, 새로운 몬스터가 등장한다는 순간에요.

근데 디아블로4에서는 이런 순간이 아주 많았습니다.

그런 와중에 어처구니 없으면서 재밌는 트윗을 발견했는데요

Q) 왜 우리는 stash tab(인벤토리 라고 생각하시면 됨)을 하나만 가질 수 있는 거야?
A) 음.. 메모리 오버헤드가 발생해서 그래. 네가 다른 유저를 만다는 순간 다른 유저의 모든 아이템창 정보를 가져오고 있거든

..... 네.. 그렇습니다. 개발비가 수백억 ~ 수천억에 이를 것으로 생각되는 글로벌 대작게임인데도 스파게티코드로 인해 인벤토리 확장에 어려움을 겪고 있는 것이었습니다.

인벤토리 스파게티는 역사다

디아블로의, 정확히 말하면 블리자드의 여러 게임에서는 종종 인벤토리에 관한 불만이 나왔었습니다.

멀리는 월드오브워크래프트(이하 와우)에서도 공식 답변으로 인벤토리 코드가 복잡해서 되어있어 건드릴 수 없다는 답변도 유명합니다.

또 최근 그래픽이나 성능업을 한 뒤에 재 출시한 디아 2 레저렉션에서도 인벤토리를 건드릴 수가 없었으며, 수십 년에 이은 유저들의 인벤토리 확장 요구에도 변경하지 않고 그대로 출시하는 일이 있었습니다.

그렇다면 대체 뭐가 문제여서 가방을 확장하는 단순한 기능에 이렇게 고통을 받고 있는 것일까요?

인벤토리 코드 복붙

저는 아마도 가장 큰 문제는 바로 이 부분이라고 생각합니다.

맨 처음에 만든 인벤토리 코드가 코어기능으로 들어가게 되었고 이후 나오는 게임에도 모조리 적용된 것이 아닐까 생각합니다.

디아블로 2,3,4  인벤토리의 기능, 크기, 위치등 대부분의 것들이 유사했습니다.

달라진 것이 있다면 약간의 UI와 들어가는 아이템의 종류만 변했을 뿐이죠.

왼쪽부터 2,3,4의 인벤토리

가뜩이나 출시일정이 미뤄져서 욕먹고 전작인 디아블로 이모탈로 엄청난 조롱을 먹은 상황에서 같은 기능을 또 개발한다?

아마도 다시 개발해야 한다고 말하는 개발자(A) 있었으면 다른 개발자(B)는 바로 아래의 문구를 말했을 겁니다.

Don't reinvent the wheel

바퀴를 다시 발명하지 마라. 아주 유명한 프로그래밍 격언입니다.

다른 개발자(B)가 다시 말합니다.

"인벤토리 기능이 있는데 왜 또 개발해? 핵심 로직은 이미 잘 설계해 놨으니 UI와 세부기능만 변경하자"라고요.

그래서 말하는 개발자(A)도 냉큼 다음 기능을 개발하려고 다른 코드를 살펴봅니다.

이것이 바로 일반적인 흐름입니다.

근데 이때를 정말 조심해야 합니다.

Reinvent  | 혁신하다.

바퀴를 재발명할 필요는 없습니다. 다만 혁신은 필요합니다.

디아블로의 개발자들은 인벤토리라는 바퀴가 이미 구현되어 있어서 재발명하지 않았습니다.

그리고 혁신하지 않았죠. 그게 바로 스파게티 코드가 만들어지는 원인 중에 하나라고 저는 생각합니다.

고르디우스의 매듭

물론 이미 개발을 끝낸 프로젝트의 코드를 변경하는 것은 생각보다 쉬운 일이 아닌 것을 우린 모두 알고 있습니다.

당장 저만 해도 일 년 전에 인수인계받은 코드를 수정하고 있는데요.

기존 코드를 읽고 수정하는 데 걸리는 시간이나, 새롭게 구현하는 시간이나 비슷하지 않을까 하는 생각으로 고통받고 있습니다.

고르디우스의 매듭

알렉산더 대왕과 관련된 고사인데 문제 고민하다가 그냥 단칼이 끊어버렸다 라는 얘기입니다.

 

고르디우스의 매듭 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

이 고사를 보면 딱 우리가 직면하는 상황입니다.

물론 고르디우스의 매듭을 풀면 왕이 되고, 우리의 고민을 풀면 빠른퇴근 + 행복코딩이라는 차이점이 있긴합니다.

그래도 이미 복잡해져서 건드릴수 없는 문제(스파게티 코드)를 하나씩 풀어가는 것보다 깔끔하게 자르고 새로 만드는게 때론 더 빠르고 현명한 길일지도 모릅니다.

최단거리는 항상 최소시간을 보장해주지 않습니다.

그 사이에 어떤 변수와 돌발상황이 있을지 알수 없죠.

남이 만들어놓은 최단거리보다는 내가 만들어가는 길이 최소시간을 가져다 줄 수있습니다.
(일반적으론 내가 만든 길이 10배정도 더걸림)

인벤토리라는 바퀴

우리가 일반적으로 부리는 바퀴에는 여러 가지 세부부품이 있습니다.

일반적으로 축, 허브. 베어링, 스프링, 쇼버, 타이어 등으로 이루어져 있죠.

인벤토리라는 바퀴 또한 다양한 것들로 이루어져 있습니다.

담아야 할 아이템정보, 호출하는 타이밍, UI 등으로 말이죠.

디아블로 개발자들은 환경이 변했지만 (오픈월드, 더욱 다양한 아이템, 고해상도 리소스),

바퀴의 구성요소들을 제때 바꾸지 못해서 완성단계까지 와서 기초단계인 바퀴부터 재설계해야 하는 상황이 놓이게 되었습니다.

참 안타깝고 또 이해는 가면서, 게임을 하는 입장에서는 이썌끼들이..? 하는 상황입니다.

모쪼록 잘 개발하길..

마치며

블리자드 형님들아.. 큰 형님이신 마소 형님들한테 헬프콜 요청해라.

아니면 코파일럿의 도움이라도 받아...

끝.