brunch

You can make anything
by writing

C.S.Lewis

by 마르코 May 09. 2016

우리는 지금까지 개발을 잘못 배웠다

변수 이야기 하자는게 아니다

아래는 <Imagine + Engineer> 시리즈 목차이자 첫 글




"개발은 배우기 어렵다." 

나는 개인적으로 반은 맞고, 반은 틀렸다고 생각한다. 


개인적으로 나는 프로그래밍이라는 것이 외국어보다는 훨씬 배우기 쉽다고 생각한다. 외국어는 대화가 시작되면 나의 능력을 총동원하여 즉각적으로 '문장'을 만들어내야 하지만, 프로그래밍은 모르면 언제든지 책을 통해서든 구글 검색을 통해서든 찾아볼 수 있다. 다양한 규칙이 존재하지만, 언어와 달리 사람이 창조해냈기 때문에 프로그래밍 언어들은 규칙이 명확하다. 외국어를 배울 때처럼 수많은 예외가 존재하지 않는다.


그런데 실제로 처음 배울 때 개발이 주는 압박감과 어려움은 외국어 공부의 어려움을 훨씬 상회한다. 왜일까?


1.

나는 우선 그 원인을 질문과 대답이 없는 주입식 설명이라고 생각한다. 혹시 유명하다는 프로그래밍 책을 들여다본 적이 있는가? 보통 프로그래밍 언어를 배운다면, 연산자, 변수, 함수, 클래스, 자료구조 등의 순서로 '공부'하게 된다. 그런데 변수가 무엇인지 알고, 어떻게 쓰는지도 아는데 도대체 왜 쓰는지 모른다. 내가 처음 배운 프로그래밍 언어는 자바였는데, 보통 객체지향이라는 개념을 배우기 시작하면서 많은 학생들이 눈물을 흘린다. 왜냐면 이유를 모르고 배우는 통에 도대체 이걸 왜 쓰는지 알 수가 없기 때문이다. 책에는 객체지향의 특징이 '다형성, 캡슐화, 상속, 재사용'라고 말한다. 저 단어 중에서 유일하게 단어만 보고 고개가 끄덕여지는 것은 '재사용'이라는 단어인데, 나머지는 프로그래밍을 해본 적이 없다면 아예 단어가 이해가 되지 않고 '재사용'도 어떻게 재사용하겠다는 건지 알 수가 없다.


원래는 아래와 같이 배웠어야 했다. 편의상 프로그래밍 언어는 파이썬으로 쓰겠다.


학생이 1명이 있다. 성은 홍이고, 이름은 길동이다. 나이는 15살이고, 직업은 학생이다. 아래와 같이 변수로만 쓸 수 있다.

last_name = '홍'
first_name = '길동'
age = 15
job = '학생'


그렇다면 이번에는 학생이 3명 있다면 어떻게 표현할 수 있을까? 각각 변수 이름에 번호만 붙이면 그나마 쉽게 구분할 수 있을 거다.

last_name1 = '홍'
first_name1 = '길동'
age1 = 15
job1 = '학생'
last_name2 = '홍'
first_name2 = '길동'
age2 = 15
job2 = '학생'
last_name3 = '홍'
first_name3 = '길동'
age3 = 15
job4 = '학생'


그런데 이게 100명이 된다면? 우리는 모든 변수를 따로 만들어야 한다. 이건 꽤 귀찮은 일이니까, 조금 간단하게 줄였으면 좋겠다. 이게 클래스다.

class Student:
    def __init__(self, last_name, first_name, age, job):
        self.last_name = last_name
        self.first_name = first_name
        self.age = age
        self.job = job
student1 = Student('홍', '길동', 15, '학생')
student2 = Student('홍', '길동', 15, '학생')
student3 = Student('홍', '길동', 15, '학생')


많은 프로그래밍 강의가 클래스를 쓰면 코드가 줄어든다고 가르친다. 그런데 처음 프로그래밍을 배우는 학생에게는 절대로 코드가 줄어들지 않는다. 클래스를 작성한 만큼 코드가 늘어나는 셈이다. 하지만 클래스가 중요해지는 시점은 많은 수의 학생(데이터)을 관리할 때이다. 만약에 100명의 학생을 관리한다면 위에서 각각의 변수를 따로 지정해줄 때(400줄의 코드)보다, 클래스를 만들면 코드가 약 1/4(100줄의 코드 + 클래스 작성 6줄)로 줄어든다. 도대체 프로그래밍을 가르칠 때 이 간단한 사실을 왜 이야기해주지 않는 것일까?


2. 

또 하나의 문제는 어려운 번역 단어를 사용한다는데 있다. 나는 '현학'적인 단어를 사용하는 것은 전달 능력을 현저히 떨어트린다고 믿는다. 그런데 프로그래밍은 심지어 영어를 모태로 시작하다 보니, 처음에 번역을 할 때 단어를 잘못 선택한 엄청난 단어들이 많다.


위에서 이야기 한 변수는 무엇을 번역한 용어인가? 영어로는 Variable이다. Variable의 동사형인 vary는 기본적으로 다양하다는 의미로 Variable은 '다양할 수 있는', 즉 '변할 수 있는'이라는 뜻이다. 


number = 1
number = 2
print(number) # 2


위의 예시처럼 처음에 number라는 변수에 1을 집어넣고, 이후에 2를 다시 집어넣어도 된다는 뜻이다. 그러면 number라는 변수의 값이 2로 바뀐다. 


그런데 이 Variable이라는 단어가 '변수'라는 이름에 갇히는 순간 그 생명력을 잃는다. 살면서 '변수'라는 단어를 들은 적이 언제인가? "그 일에는 변수가 너무 많군."이라는 문장 말고는 잘 기억이 나지 않는다. 혹은 까마득한 옛날 학교 수학 시간에 배운 것이 기억난다면 축하한다. 거의 저 의미와 유사하다.


또 한 가지 예를 들어보면 앞서 설명했던 Class는 '객체지향'언어의 특징이라고 말한다. 영어로는 Object oriented programming (OOP)라고 쓴다. Object-Oriented라는 말을 그대로 직역해서 ('Object > 객체', 'Oriented > 지향') 쓰는 것이다. 안타깝지만 이 번역은 실패했다고 생각한다. 한국에서 '객체'라는 단어는 거의 죽은 단어에 가깝다. 누가 일상 대화에서 '객체'라는 말을 쓰나? '객체'라는 말이 낯서니 '객체'를 '지향'한다는 말은 당연히 귀에 들어올 리가 없다. 용어가 이해가 안 되니 결국 다 외워버리는 수밖에 없다.


Object는 우리가 자주 쓰는 말로는 물건이나 대상에 가깝다. 

last_name1 = '홍'
first_name1 = '길동'
age1 = 15
job1 = '학생'


이렇게 분리해서 생각하지 말고, 결국엔 한 학생의 성질을 의미하는 것이니 묶어서 생각하자는 것이 OOP다.

student1 = Student('홍', '길동', 15, '학생')


차라리 '물건화 시켜 생각하는 프로그래밍'이나 아예 풀어서 '한 사물의 특징을 묶어서 표현하는 프로그래밍 기법'라고 알려줬다면 그렇게 골치 아프지 않았을 텐데라는 생각이 든다.


원래부터 어려운 건 없다. 한 반에 10명이 수업을 듣는데, 10명이 모두 고개를 좌우로 흔든다면 분명히 잘못 가르치고 있다고 생각하는 것이 옳다. 누군가 나에게 스스로 충분히 이해하고 소화시켜서 자기의 말로 알아듣기 쉽게 설명해줬더라면 너무나 좋았을 텐데라는 아쉬움이 든다.  

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari