메뉴바로가기본문바로가기

동아사이언스

[개발자 아빠의 교육실험](11) 깔끔하게 코드 정리하기

통합검색

[개발자 아빠의 교육실험](11) 깔끔하게 코드 정리하기

2019.05.18 09:00

소프트웨어 개발자는 대개 게으르다. 적어도 컴퓨터 앞을 잘 떠나지 않는다는 면에서 그렇다. 책상 한편에 수북이 쌓인 음료수 캔이나 간식 포장지 따위는 개발자들이 모여있는 공간에서 쉽게 목격할 수 있는 광경이다. 움직이지 않는 만큼 만성적인 운동 부족에 시달린다. 개발자는 돼지나 멸치 중 하나라고 자조적인 말을 하는 이유다.

 

개발자 시절의 마크 저커버그. 2005년의 모습이다. 책상 위가 지저분한 것을 보면 저 시절 개발을 했던 것이 분명하다. 삐딱하게 앉은 자세마저 이 확신에 힘을 실어준다.
개발자 시절의 마크 저커버그. 2005년의 모습이다. 책상 위가 지저분한 것을 보면 저 시절 개발을 했던 것이 분명하다. 삐딱하게 앉은 자세마저 이 확신에 힘을 실어준다.

그뿐만이 아니다. 자판 두드리는 것마저 대단히 귀찮아한다. 한 타라도 적게 치기 위해 갖가지 매크로를 설정하고 각종 플러그인들을 찾아 헤맨다. 이쯤 되면 컴퓨터로 밥 벌어먹는 사람이 맞나라는 의문이 생길 지경이다.

 

그렇다고 무작정 게으르다고만 볼 수는 없다. 개발자들은 큰 의미 없는 반복 작업을 극도로 경계하는 습성을 가졌다. 코딩할 때 키보드와 마우스를 오가는 것조차 낭비라고 생각한다. 키보드만으로 모든 편집이 가능한 ‘VI 에디터’나 ‘Emacs’ 등을 이용하는 개발자가 흔한 이유다. 심지어 여기에 성이 차지 않으면 필요한 도구를 새로 만들어 버리기까지 한다. 어느 것이 본업인지 헷갈릴 정도다.

 

프로그램을 작성할 때도 마찬가지다. 같은 역할을 하는 코드가 여기 저기 흩어져 있는 것을 가만히 두고 보지 못한다. 어차피 여기에 필요한 것은 손가락 몇 번 더 움직이는 정도밖에 없는데도 말이다. 대신 중복된 코드를 묶어 한 개의 함수로 만들어 버린다. 공통으로 사용할 수 있는 코드를 만드는 것은 이것저것 생각할 것이 예상밖으로 많은데, 이런 정신적 노동의 수고로움을 마다하지 않는 것이다.

 

개발자들에게 신경증적 강박이 있어 이런 것은 결코 아니다. 머릿속에서 그려낼 수 있는 논리 흐름의 양은 아무래도 제한이 있을 수밖에 없다. 사람이기 때문이다. 텍스트 공간의 정적인 코드를 보며 시간 공간의 동적 실행 상태를 예측하려면 더욱 그러하다. 프로그램의 복잡도가 올라갈수록 증가하는 버그의 위험을 회피할 방법으로 구조적 프로그래밍 방법론이 제기된 이유다. 여기에 핵심을 차지하고 있는 것이 바로 함수다. 오름차순 정렬의 복잡한 논리 전개를 함수 호출 한 줄로 머릿속에서 간단히 소거해 버릴 수 있기 때문이다.

 

알고리즘 계의 최종 보스로 평가받는 에츠허르 데이크스트라. “GOTO 문의 해로움”(Go To Statement Considered Harmful)이란 다분히 논쟁적인 제목의 논문을 발표하며 구조적 프로그래밍 방법론을 주장했다.
알고리즘 계의 최종 보스로 평가받는 에츠허르 데이크스트라. “GOTO 문의 해로움”(Go To Statement Considered Harmful)이란 다분히 논쟁적인 제목의 논문을 발표하며 구조적 프로그래밍 방법론을 주장했다.

 

 

마침 판단문 교육을 진행하며 아이는 지나치게 복잡해진 코드를 어려워했다. 상황만 봐서는 함수를 가르치기 딱 좋은 때라 생각했다. 복잡한 코드가 순식간에 간단해지는 기적을 경험하는 것만으로 함수 사용의 필요성을 몸소 깨달을 수 있을 것이다. 이제 필요한 것은 9살 아이가 물 흘러가듯 개념을 이해할 수 있도록 실습 과제를 배치하는 것이다.

 

먼저 실습 과제의 내용은 그림 그리기로 구성했다. 변수와 판단을 진행하며 지나치게 개념적인 방향으로 치우쳤다는 반성에서 출발했다. 아이의 눈에서 지루함을 느꼈다. 잠시 쉬어가는 시간이 필요하다 생각했다. 아무래도 9살 아이에겐 즉각적이고 시각적인 반응으로 동작을 이해하는 게 더 어울릴 것이다. 더구나 엔트리의 함수 블록은 결과 값 반환 기능을 제공하지 않는다. “f(x)=ax+b”와 같은 수학 함수의 역할을 기대할 수 없다는 말이다. 오로지 함수 안에서 동작 제어 정도가 가능한데, 그렇다면 그림 그리기야말로 함수 교육에 제격이라 판단했다.

 

다음으로 코드 묶음으로서 함수의 의미가 단계적으로 전달될 수 있도록 구성했다. 동일하게 사각형을 그리지만 서로 다른 방식을 이용하여 구현하도록 했다. 처음에는 순차 수행이 이뤄지도록 하고, 다음에는 신호 보내기와 받기를 이용해 코드 묶음이 추출되는 점을 보여주며, 마지막으로 신호를 함수로 대체하는 것으로 단계를 엮었다.

 

코드 묶음이 함수로 변환되는 과정을 단계적으로 전달했다. 위 세 코드는 모두 동일하게 사각형을 그리는데, 신호와 함수를 이용해 코드 묶음이 추출될 수 있음을 보여주려 했다
코드 묶음이 함수로 변환되는 과정을 단계적으로 전달했다. 위 세 코드는 모두 동일하게 사각형을 그리는데, 신호와 함수를 이용해 코드 묶음이 추출될 수 있음을 보여주려 했다

교육 두 시간 동안 아이는 큰 어려움 없이 코드 묶음으로서 함수의 의미를 파악했다. 물론 각도 등에 대해서는 별도의 설명이 필요했다. 아직 학교에서 배우지 않은 것이기 때문이다. 0도에서 180도까지 각도를 바꿔가며 실행해 보라고 했다. 직관적으로 각도를 익힐 수 있을 것이라 판단했다. 이내 곧 아이는 별이 그려졌다며 신기해 했다.

 

아이가 우연하게 별 모양을 만들었다(왼쪽). 실습으로 만든 간단한 그림판으로 ‘김’을 그렸다(오른쪽)
아이가 우연하게 별 모양을 만들었다(왼쪽). 실습으로 만든 간단한 그림판으로 ‘김’을 그렸다(오른쪽)

자신이 만든 그림판으로 이것저것 그려보던 아이가 문득 물었다. 신호만 이용해도 되는데 굳이 함수를 사용하는 이유를 모르겠다는 것이다. 엔트리에서 함수의 내용을 보거나 고치려면 함수 블록을 더블클릭해야 하는데, 신호를 이용하는 게 더 편하다는 것이다. 신호 보내기로는 각도와 변 길이를 전달할 수 없지 않냐고 답했다. 아이는 지지 않고 답변의 꼬리를 물었다. 변수 만들고 거기로 전달하면 되는 것 아니냐며 투덜거렸다. 제법 날카로운 질문이나, 9살 아이에게 딱히 설명할 방법을 찾기 어려웠다. 높은 응집도와 낮은 결합도(High Cohesion, Low Coupling) 원칙이 적용된, 재사용성 높은 코드를 만들기위해 전역 변수의 사용은 억제되어야 한다고 9살 아이에게 말할 수는 없다. 보기 좋은 떡이 먹기도 좋다는 속담으로 얼버무릴 수밖에.

 

도움자료

1) 12~13일 차 교안을 공유합니다.

https://drive.google.com/drive/folders/1Jq8TgernewDdRkHsoJUCskZbhFNhl-fV

2) 아이와 만드는 코드도 공유합니다. 엔트리 메인화면의 공유하기에서 “chloe10”을 검색하세요.

 

※필자소개

김기산 기업에서 IT 디바이스 소프트웨어 개발자로 일하고 있다. 대학에서 전자공학을 전공하고 20년 가까이 리눅스 개발자로 지내다가 뜻밖의 계기로 육아휴직을 냈다. 지난해 한층 강화된 '아빠의 달' 제도의 수혜자로, 9살 아이와 스킨십을 늘리며 복지 확대의 긍정적인 면을 몸소 깨닫고 있다.

 

 

이 기사가 괜찮으셨나요? 메일로 더 많은 기사를 받아보세요!

댓글 0

7 + 1 = 새로고침
###
    과학기술과 관련된 분야에서 소개할 만한 재미있는 이야기, 고발 소재 등이 있으면 주저하지 마시고, 알려주세요. 제보하기

    관련 태그 뉴스