코딩하는 농사 게임으로 들여다본 개발자의 머릿속
최근 게임을 좋아하는 개발자에게 Steam 게임 하나를 선물받았다. 게임의 이름은 농부는 대체되었다().
스타듀밸리처럼 농사를 짓는 게임인가 싶었는데, 농사를 짓긴 짓지만 인간이 아니라 드론이 한다. 그리고 그 드론을 움직이려면 Python으로 명령을 내려야 한다. 실제 Python 문법과 조금 다른 부분도 있지만, 게임 파일 자체가 .py 확장자를 사용할 만큼 상당히 직접적으로 코드를 다룬다.
그러다 보니 게임을 하다 보면 자연스럽게 Python 문법을 익히게 된다. 다행히 나는 천재교육 부트캠프에서 얕게나마 Python을 배운 적이 있어서 초반까지는 어렵지 않았다. 하지만 인간의 욕심은 끝이 없는 법. 밭 전체를 알아서 돌아다니고, 여러 작물을 조건에 맞게 심고, 수확하고 다시 심게 만들고 싶다는 욕망이 스물스물 피어나기 시작하면서부터 게임의 난이도는 기하급수적으로 올라간다.
오늘은 이 중독성 있는 게임을 하며 새삼 이해하게 된 Python 문법과 개발자적 사고에 대해 이야기해 보려 한다.
초반에는 4×4 크기의 작은 밭에서 풀을 수확하는 것으로 시작한다.
harvest()를 실행하면 현재 위치의 작물을 수확할 수 있고, 같은 행동을 반복하고 싶다면 while이나 for같은 반복문을 사용한다. 여기에 move() 함수를 쓰면 [North, South, West, East] 방향으로 드론을 한 칸씩 움직일 수 있다.
이미 커지고 빨라진 밭을 초기 버전으로 되돌려 보았다. 세팅에 필요한 코드를 제외하면 아래 코드가 이 게임의 근본이다.
예나 지금이나 for문을 이해하기가 어려웠다. 책에서 ‘정해진 횟수만큼 반복한다’는 설명을 읽으면 무슨 말인지는 알겠는데, 그래서 이걸 어디에 어떻게 써야 하는지는 잘 와닿지 않았다. 이 게임에서는 싫어도 알게 된다. for문이 없으면 농장이 안 돌아간다 ^^!
밭이 확장될수록 world_size도 점점 중요해진다. 밭 크기를 4, 8처럼 코드에 고정해 두면 농장이 커질 때마다 수정해야 한다. 현재 밭의 크기를 가져오도록 해두면 확장돼도 같은 코드를 계속 사용할 수 있다.
그리고 들여쓰기 하나를 잘못하면 그 결과를 눈앞에서 바로 볼 수 있다. move(East)와 move(North)가 어느 구문 안에 들어가느냐에 따라 드론의 이동 경로가 완전히 달라진다. 잘못 넣으면 드론이 엉뚱한 곳만 빙빙 돈다.
print("hello world!")보다는 어렵지만 확실하고, 무엇보다 드론이 돌아가는 모습을 보고 있으면 재미있다. 내가 쓴 코드가 곧바로 행동으로 나타나니까 그제야 반복문이 어떻게 움직이는지 감이 왔다.
추가로 필요한 항목들은 각각의 자원을 획득해 스킬 트리에서 해금할 수 있다. 속도, 수확량, 추가 함수, 새로운 작물, 미로 등등 무궁무진하다. 코드 쪽은 대부분 편의성을 높여주지만, 새로운 작물이 열릴 때마다 농사는 점점 헬게이트가 된다.
수확하면 다시 자라기를 반복했던 풀과 달리 나무는 서로 붙여 심으면 효율이 떨어지고, 호박은 일정한 크기의 정방형 영역을 정상적으로 유지해야 거대 호박으로 합쳐진다. 작물마다 고려해야 할 조건이 늘어나면서 모든 칸에서 똑같은 행동만 반복해서는 농장이 제대로 돌아가지 않는다.
물론 그런 걸 잘 해결할 수 있도록 개발 항목도 계속 열린다. 심지어 게임 내 문서를 통해 꽤 친절하게 설명해준다. 딕셔너리와 리스트도 어렴풋이 개념만 알고 있었는데, 실제로 필요해지는 순간에 사용해 보면서 뜻을 조금씩 이해하고 있다. 책에서 볼 때는 ‘그래서 이걸 어디다 쓰지?’ 싶었던 것들이 농장에서는 제법 절실하다.
하지만 슬프게도 비개발자인 나에게는 갈수록 게임이 너무 어렵다. 그럴 때 필요한 게 바로 GPT 선생님이다.
AI의 좋은 점 중 하나는 내가 아무리 물어봐도 화를 내지 않는다는 것이다. 실제로 이 게임을 소개해 준 개발자에게 코드 관련해 궁금한 점을 물어봤지만, 설명을 들어도 시원하게 해소되지 않았다. 이미 개발에 익숙한 사람이 설명하는 방식과 내가 막히는 지점이 생각보다 달랐다.
나는 AI에게 나를 초등학교 3학년이라고 생각하고 쉽게 가르쳐 달라는 말을 자주 한다. 실제로 초등학교 3학년 때 Visual C++을 배우다가 너무 어려워서 포기했는데, 이런 선생님이 있었다면 아마 그때부터 개발자의 꿈을 키워 나갔을지도 모른다.
친절한 AI 선생님은 내가 이해하지 못한 개념을 몇 번이고 다시 설명해 주고, 게임처럼 반복해서 연습할 수 있는 학습용 홈페이지도 여럿 만들어 주었다. 정답 코드만 받아서 붙여 넣기보다 왜 이렇게 움직이는지를 한 단계씩 물어보고 직접 수정하는 방식이 특히 도움이 됐다.
선생님의 가르침으로 농장도 제법 확장했다. 밭 두 군데에 6×6 크기로 호박을 심어 거대 호박을 만들고, 해바라기 10송이 이상을 재배하며 스피드 업에 사용할 파워를 확보한다. 당근과 나무는 격자로 심어 둘 다 효율적으로 수확할 수 있게 하고, 나머지 공간에는 풀과 선인장을 심었다.
각 작물의 특성이나 혼합 재배 같은 심화 요소까지 제대로 살리지는 못했다. 그래도 한 영역씩 코드를 직접 작성하고, 실패하면 드론의 움직임을 확인한 뒤 다시 고치는 방식으로 여기까지 만들었다. AI의 도움은 받았지만, 하나씩 손코딩으로 진행한 결과다. 선생님, 감사합니다!
여기서 한 가지 의문이 들 수도 있다.
‘AI한테 완전히 코딩을 맡기면 되지 않나?’
틀린 말은 아니다. 바이브 코딩으로 앱도 만드는 마당에 AI가 이 정도를 못할 리가 없다. AI는 자동화의 천재니까!
…라고 생각했지만 생각만큼 한 번에 잘되지는 않았다.
AI는 내가 보고 있는 게임 화면이나 현재 농장의 상태를 알아서 파악하지 못한다. 지금 밭이 몇 칸인지, 어느 영역에 호박을 심으려는지, 나무는 왜 떨어뜨려서 배치해야 하는지, 어떤 상태를 내가 ‘제대로 돌아간다’고 생각하는지 알려줘야 한다.
몇 번 실패하다 보면 요구사항도 점점 달라진다. 전체 밭의 크기를 먼저 구하고, 그중 두 개의 6×6 영역을 호박밭으로 사용한다. 호박밭을 제외한 공간에는 다른 작물을 일정한 규칙으로 배치하고, 밭의 크기가 확장돼도 그 비율과 규칙을 유지한다. 이런 식으로 내가 원하는 농장을 먼저 머릿속에서 그린 뒤 하나씩 설명했다.
이 과정에서 개발자들이 ‘로직을 짠다’는 게 무슨 뜻인지 조금씩 와닿기 시작했다. 예를 들어 수확이라는 행위도 코드로 옮기려면 잘게 나뉜다. 현재 위치에서 수확할 수 있는지 확인하고, 가능하다면 수확한다. 이후 동쪽으로 이동하는 행동을 밭의 너비만큼 반복한 뒤 북쪽으로 이동한다. 평소에는 하나의 행동으로 생각했던 것 안에 조건과 순서가 잔뜩 들어 있었다.
특히 놀랐던 건 Python 문법을 하나도 모르는 개발자 지인이 게임 내 문서만 보고 몇 시간 만에 나보다 훨씬 많은 부분을 자동화했다는 것이다. 처음 보는 언어인데 어떻게 저렇게 빨리 하지?
옆에서 보니 무엇을 반복해야 하는지, 어떤 조건에서 행동이 달라지는지, 큰 문제를 어느 단위에서 나눠야 하는지를 빠르게 캐치했다. 처음 보는 문법은 문서를 읽으며 익히면 됐고, 문제를 풀어나가는 방식 자체는 이미 익숙해 보였다. 마치 한 언어를 알고 있으면 비슷한 계통의 다른 언어를 배울 때 구조를 파악하기 쉬워지는 것처럼 느껴졌다. 완전히 같은 이야기는 아니겠지만, 내가 처음 접하는 문법 하나하나와 씨름하는 동안 개발자 지인은 이미 자신에게 익숙한 방식으로 문제를 풀고 있었다.
그때서야 개발자적 사고의 중요성을 이해할 수 있었다. 내가 이 게임에서 체감한 개발자적 사고는 원하는 결과를 작은 단위로 나누고, 필요한 조건과 순서를 찾아 실행할 수 있는 형태로 정리하는 능력에 가깝다. 앞으로는 이런 사고방식을 사용할 일이 더 많아질 것 같다. 예전에는 주로 개발자와 협업하기 위해 필요한 능력이라고 생각했지만, 이제는 AI에게 일을 맡길 때도 필요하다. 내가 무엇을 원하는지 정리하지 못하면 누구에게도 제대로 설명할 수 없다.
이 게임을 꾸준히 하다 보면 정말로 개발자처럼 사고할 수 있을지도 모른다는 생각이 든다. 요즘은 기획자, 개발자, 디자이너 사이의 경계가 이전보다 흐려지고 있다. 기획자가 개발 로직을 이해하고 디자인의 원리를 어느 정도 알고 있다면, 내가 만든 기획이 실제 결과물로 이어지는 과정을 훨씬 잘 이해할 수 있다.
한편으로는 AI에게 요청만 하는 것보다 손코딩을 하면서 글자 하나하나를 타이핑해야만 이해되는 부분도 있었다. AI가 코드를 대신 짜주더라도, 적어도 무슨 코드인지 읽을 수 있다면 문제가 생겼을 때 사고 방식부터 달라진다.
AI가 작성한 코드도 종종 내가 원했던 것과 다르게 움직인다. 요구사항을 다르게 이해하기도 하고, 굳이 복잡하게 구현하기도 한다. 하나를 수정했더니 멀쩡하던 다른 부분이 망가질 때도 있다. 그러면 다시 화면을 보고, 어디서 잘못됐는지 찾고, 코드를 읽고, 조건을 수정해 다시 요청한다.
검수하고, 검토하고, 검증하고. AI가 무엇을 만들어주든 그 결과가 맞는지 판단하는 능력은 여전히 사람에게 필요하다. 나도 아직 Python을 잘한다고 말할 수준은 한참 멀었지만, 적어도 이제는 드론이 이상한 곳으로 가면 코드를 들여다보며 ‘얘가 왜 이러지?’ 정도는 생각할 수 있게 됐다. 아이러니한 건 그걸 Python 강의가 아니라 농사짓는 드론에게 배우고 있다는 사실이다.
기획자는 대체하지 말아주세요. 농부만 대체해 주세요. 제발🙏
while True: # 아래 행동 무한 반복
for x in range(get_world_size()): # 밭의 가로 너비
for y in range(get_world_size()): # 밭의 세로 너비
if can_harvest(): # 수확할 수 있다면
harvest() # 수확 후
move(East) # 동쪽으로 이동
move(North) # 북쪽으로 이동