소프트웨어 복잡성

소프트웨어 공학의 고전인 The Mythical Man-Month를 보면 소프트웨어 복잡성을 크게 2가지로 구분하고 있습니다. 요구사항 자체가 복잡하기 때문에 소프트웨어가 복잡해지는 본질적 복잡성(essential complexity)과 여러 이유로 우리 스스로가 초래한 돌발적 복잡성(accidental complexity)가 있습니다.

일례로, 미션, 아레나, 레이드 등 여러 게임 모드와 캐릭터 수집, 진화, 아이템 수집, 제작 등 포함된 RPG 게임은 간단한 퍼즐 게임보다 요구사항 자체가 절대적으로 많기 때문에 본질적으로 더 복잡하다고 표현합니다. 이러한 본질적 복잡성은 그 자체로 줄일 수가 없는 것이 특징이기도 하죠.

반대로 돌발적 복잡성은 레거시 코드, 플랫폼 버그, 툴의 사용성 등 다양한 원인으로 발생합니다. 예를 들어, 과거 피처폰으로 게임은 지금보다 요구사항 자체가 훨씬 간단한 게임이었지만 피처폰의 개발 환경 자체가 지금의 스마트폰과 비교할 수 없는 수준으로 불편했기 때문에 돌발적 복잡성이 높았습니다.

현재 많은 게임 개발사가 사용하고 있는 Unity3D는 이런 돌발적 복잡성을 상당히 줄여주는 툴입니다. C#이라는 언어도 C/C++과 비교해서 추상화 수준이 높고, 메모리 관리 등 저수준 최적화 작업에 신경을 쓸 필요가 없게 만들어 주기 때문에 돌발적 복잡성을 줄여준다고 볼 수 있습니다.

하지만 이러한 기대가 처참하게 깨지는 경우도 여전히 존재합니다. 일례로, Unity 엔진은 지금 기준으로 보면 상당히 구버전 Mono 엔진을 사용하고 있고 iOS AOT 컴파일러에 버그가 있어서 Linq 쿼리 중 일부가 iOS에서만 크래시나는 문제가 있습니다.

Unity의 iOS 빌드 이슈를 이해하고 이에 맞춰 문제가 되는 코드의 사용을 피하는 것이 팁인데, 이런 지식 자체는 만들고자 하는 게임의 본질적인 복잡성과는 아무런 관련이 없는 돌발적 복잡성의 대표적인 예라고 할 수 있습니다.

임베디드 시스템이 데스크톱 환경에 비해 불우한 개발 환경인 이유는 각종 디바이스 버그로  발생하는 이슈들에 대응해야 하기 때문입니다. 스마트폰 시대의 모바일 게임 개발은 과거와 비교할 수 없는 수준으로 발전했지만, 여전히 은총알은 요원해 보입니다.

Advertisements