problem_solving

0. I don't have a mouth but...

점심뭐먹지 2026. 3. 9. 02:05

0. Intro

'I don't have a mouth and I must scream' 이라는 단편이 있다.

1967년에 나온 SF 단편이고 휴고상을 받았다, 또한, 이를 기반으로 1995년에 출시된 비디오 게임이다.

 

게임디자인 쪽에서는 I have no words & I must design이라는 그렉 코스티켄(Grag Costikyan)의 페이퍼에 영감을 준 작품이다. 게임기획 일을 하며 열심히 읽었던 아티클이었다. 한국에서는 말 없는 게임디자인으로 번역되었었다.

(관심이 있으신 분은 이쪽으로. 영어 주의)

 

가장 주요한 요지는, '도대체 무엇이 '게임'을 게임답게 만드는가?'였다.

당시 게임 산업은 기술적인 화려함에 꽤 치중하고 있었고, 코스티켄은 이 글을 통해 "그래픽이 아무리 좋아도 게임의 '구조(Structure)'가 부실하면 그것은 실패한 디자인이다"라는 이야기를 했었다.

 

1. 보통 사람은 필요하면 뭐든 하게 된다.

요즈음 학과 외로 따로 수업을 별개로 듣고 있다.

물론 영어로만 강의한다. 파이썬을 처음부터 어느정도 쓰게 될 때까지로 가르친다.

 

'왜 무의미하게 또 다시 기본 수업으로 돌아가지?' 라는 이야기를 할 수도 있다.

for loop이던 if든 while이든, 어차피 다 아는 내용이잖아?

 

물론 맞다. 파이썬 도장도 한번 완주해봤지만, 설명이 좀 부족하더라.

나는 귀찮은 사람이다.

수학을 '그냥 약속이니까 외워라.' 라고 하는 것에 질리는 사람이다. 왜 그런지 이해를 해야 넘어간다.

 

나는 이전에 CS50이라는 하버드 공개 강의를 들은 적이 있었고, 그건 꽤 도움이 되었다.

(국내에서는 네이버 커넥트 재단에서 들을 수 있다. 이진법을 전구로 직관적으로 표현했던게 꽤 인상적이었다.)

 

3.  감자가 없으면 주문이 발동 안한다고!

오래 전, 그러니까  'Heroes of storm' pv가 2013년 11월 8일 블리즈컨(BlizzCon) 행사에서 공개되었던 것을 기억한다.

당시에 나는 MOBA 게임을 개발하는 팀에 있었고, lua를 다루었지만 논리가 아니라 spell로 이해하고 있었다.

요즈음 화제가 되었던 글을 인용하자면, 

 

감자가 없으면 주문이 발동 안한다고!

 

나중에 다른 언어를 더 뜯어보며 '아 for가 어떻구나' 하는 걸 이해했고, 그건 밍기적만큼이나 꽤나 작은 한 기적이 되었다. 수학을 모르는 사람이 논리를 이해하기 시작했던 시점이니까.

코스티켄의 말처럼, '구조'와의 상호작용이었다.

 

2. 그래서 지금 추가로 수강하고 있는 이 강의는

 

스탠포드에서 라이브 강의 신청을 받고 있다.

가족중 선생님이 있는데, 어느 날 대학원생이 중학교 영어부터 다시 시작하더라는 이야기를 들었다.

교수님 모시고 학회 가야 하는데 자기가 영어를 너무 몰라서 기본부터 다시 배워야겠다고. 그래서 다시 기본으로 내려온 게 중학교 영어였다고.
나중에 회사에서 일하면서 더 잘 와닿았다.

모르는 건 부끄러운 게 아니다. 모르는 걸 아는 척하는 게 더 부끄러운 거지.

 

한국에서는 'a는 b다, 외워,' 라는 느낌으로 외우라는 느낌이 꽤나 많았다.

 

이 수업에서는 캐렐(Karel)이라는 로봇이 등장한다.

1970년대에 개발된 교육용 로봇이다. 앞으로 움직이고, 비퍼를 놓고, 비퍼를 지우고, 왼쪽으로 90도 트는 기능밖에 없는 로봇이다. 코딩 문제로 '이 로봇이 어떻게 나아가야 할까요?' 라는 목표를 제시하고, 거기에 맞는 코드를 짜게 한다.

(나중에는 함수가 추가로 더 제공된다.)

 

기초적인 기능들을 가르치는 강의이지만, 이걸 토대로 효율화를 하는 연습을 하고 있다.

문제에 따라 이 캐렐이 해야하는 일들은 더더욱 복잡해진다.

반복되는 함수를 어떻게 줄일지, 어떻게 최적화 할지, 그런 로직을 짜려면 어떻게 해야 할지, 등을 기초 수업에서부터 혼자 목표로 놓고 하고 있다.

 

from karel.stanfordkarel import *

def main():
    # 첫 번째 위치
    move()
    pick10times()
    
    # 두 번째 위치
    move()
    move()
    pick10times()
    
    # 세 번째 위치
    move()
    move()
    pick10times()
    move()

def pick10times():
    for i in range(10):
        pick_beeper()

# don't edit these next two lines
# they tell python to run your main function
if __name__ == '__main__':
    main()

 

만들었던 코드의 예시.

기초적이라 '에이, 고작 이런 거잖아?'라고 할 수 있다.

저 작은 로봇을 이리 저리 움직이며 목적을 달성하는 것으로 & 그중에서 효율적으로 달성하는 것으로

알고리즘 연습은 그래도 되고 있다고 생각한다.

 

알고리즘의 목적은 '효율적으로 목표를 해결하는 것'이라 이해하고 있다. 알고리즘 강의를 들으면 또 달라지겠지만

일단은 이산수학도 들으며 이해를 하는 목적으로, 이 강의를 나름대로 신청해서 나름대로의 골을 설정해서 듣고 있다.

 

코딩테스트를 푸는 게 나에게는 꽤 어려운 일이고,

이걸 해결하려면

 

1. 언어를 이해하기

2. 지문을 이해하기

3. 지문을 이해하고, 해당 언어를 활용해서

4. 문제를 해결하기.

 

라는 과정이 필요하다.

언어는 JS든 자바든 어느 정도 조금은 이해하고 있지만 문제 해결 능력이 부족한 느낌이라 기초부터 다시 쌓아가고 있다.

이번 학기부터 수학 수업을 매 학기마다 꾸준히 넣으려는 이유이기도 하다.

 

이 수업에서는 문제 해결도 가르치지만, 가령 이런 걸 가르치기도 한다.

A good function should do "one conceptual Thing"

 

이건 SOLID 원칙의 '단일 책임의 원칙'이 아닌가.

 

3. Outro

.파이썬 수업이랑도 겹치는 면이 있지만, 사실 단연코 학과 파이썬 강의가 진도는 더 빠른 느낌이다. (...)

 

지금 듣는 sefl-learning 수업은 크게 둘로 나뉘어져있다.

강의: 스탠포드 교수진이 파이썬의 기초를 설명하며, 프로그래밍의 논리적 뼈대를 구축한다.
코드: 수업 내용을 기반으로 캐렐의 문제 해결을 위한 코드를 짠다.


아마 라이브 수업이라면 또 다를 수도 있겠다.

일단 선발이 되어야 저 라이브 수업에 들어가서 무언가 할 거 같긴 한데, self-learning 코스가 따로 있다.

그래서 나는 그 self-learning 수업을 꽤 열심히 듣고 있다.