2016년 겨울 제37호
현장스케치

컴퓨터 소프트웨어로 주변 문제를 해결하는 방식을 배우고 싶다면

이광근(공과대학 컴퓨터공학부 교수)

새로운 【학문의 기초】 교양과목이 열린다. <컴퓨터과학적 사고와 실습(Computational Thinking & Practice)>이다. 2017년 가을학기부터 매년 개설된다. 전공불문 누구나 수강할 수 있다. 이 과목은 “컴퓨터과학이 여는 세계(Computational Civilization)”라는 교양과목(봄학기 개설)과 함께 짝을 이루며 진행될 것이다. 두 과목의 차이를 굳이 비유하자면 다음과 같을 것이다.

컴퓨터과학적 사고와 실습 글쓰기 사고와 실습
컴퓨터과학이 여는 세계 문학의 세계

<컴퓨터과학적 사고와 실습>은 전세계적으로 컴퓨터과학적 사고가 모든 학생들의 교양필수가 되고 있는 시점에서 마련한 과목이다. “4차 산업혁명”에서 선두에 설 인재를 키우고 싶은 서울대학교의 고민이 담긴 과목이다.

강의 목표와 내용은 다음과 같다. 강의 개설 제안서에 담은 내용을 여기 간추려본다.

 

  1. 강의 목표

다양한 전공의 학생들에게 컴퓨터 소프트웨어적인 문제해결 방식을 쉽게 익힐 수 있는 강의를 제공한다.

글로벌 선두를 차지하는 인재풀은 각 분야에서 컴퓨터 소프트웨어의 가능성을 독창적으로 연출할 수 있는 인재들이 될 것이기 때문이다. 각 분야의 인재들은 소프트웨어적인 사고가 가지고 올 다양하고 파급력 있는 기회를 적절히 활용할 수 있어야 한다. 컴퓨터 소프트웨어가 모든 분야의 성장을 이끄는 중요한 인프라이기 때문이다.

이 과목은 단순히 스킬을 전달하는 과목이 아니다. 컴퓨터라는 ‘마음의 도구’를 다루는 방법으로서, 소프트웨어를 어떻게 구상하고 상상할 수 있는지를 강의한다. 그리고 그러한 사고방식의 강점과 한계를 구체적으로 실습을 통해서 파악할 수 있도록 돕는다. 이를 통해서 학생들이 컴퓨터 소프트웨어를 각자의 전공에 맞게 상상할 수 있는 소양을 갖추도록 한다.

 

* 미래 선도와 예측: 다양한 전공의 학생들이 소프트웨어 제작과 이에 필요한 사고방식을 익히게 된다. 각자의 분야에서 미래에 가능한 응용을 창조하거나 상상하고 예측할 수 있는 능력을 갖추기 위해서다. 소프트웨어는 모든 분야의 중요한 도구가 되었고 그 분야를 새롭게 이끌 아이디어의 기반이 되고 있기 때문이다.

 

* 유효기간이 긴 지식: 다양한 전공의 학생들에게 소프트웨어 기술의 표면적인 응용뿐 아니라 그 아래를 흐르는 원리를 쉽게 이해시킨다. 지금까지의 정보기술의 성과는 미래에 비하면 미미한 시작이기 때문에, 유효기간이 긴 소프트웨어 지식을 다양한 전공의 학생들에게 전달해 줄 필요가 있다. 학생 각자의 전공 분야에서 오랫동안 유용한 밑거름이 되도록 한다.

 

* 가능성과 한계의 파악: 각 분야의 학생들이 소프트웨어의 가능성뿐 아니라 한계를 이해하게 한다. 소프트웨어적인 사고방식을 적용해서 해결할 수 있는 문제를 적절하게 선별할 수 있는 균형 잡힌 안목을 가질 필요가 있기 때문이다. 소프트웨어는 많은 문제를 해결하는 도구이지만 소프트웨어만으로 모든 문제를 해결할 수 있는 것은 아니다. 각 분야의 학생들에게 소프트웨어적인 사고방식을 비판적으로 적용하는 균형 잡힌 시각을 상기시킬 필요가 있다.

 

* 디지털 세상의 이해: 컴퓨터 소프트웨어적인 문제해결 사고방식을 통해서 각 분야의 학생들에게 우리를 둘러싼 디지털 세상을 바라보는 시각을 구체적으로 형성해 줄 필요가 있다. 마치 물리교육이 우리를 둘러싼 자연을 바라보는 시각을 형성해 주는 것과 같다.

 

이러한 강의를 통해서 다양한 전공의 학생들이 컴퓨터 소프트웨어가 확장시키는 사고방식의 강점과 한계를 구체적으로 이해할 수 있도록 돕는다. 앞으로 각 분야에서 두각을 나타낼 인재들은 컴퓨터 소프트웨어가 여는 많은 기회를 적절히 활용할 수 있는 인재들일 것이다. 소프트웨어가 모든 분야의 성장을 이끄는 중요한 한 인프라이고 지금까지의 소프트웨어 기술의 성과는 미래에 비하면 미미한 시작일 뿐이기 때문이다.

 

  1. 강의 내용

다음 12가지 소프트웨어 사고틀 개념을 전달한다.

* 데이터 정리하기(data structure)

* 속내용 감추기(abstraction, 핵심 간추리기)

* 조립식으로 생각하기(composition)

* 계층쌓기로 생각하기(hierarchy)

* 끼리끼리 포장하기(module)

* 반복으로 생각하기(repetition)

* 재귀적으로 생각하기(induction & recursion)

* 순서로 생각하기(sequentiality & concurrency)

* 상태나 값으로 생각하기(state & value)

* 틀을 짜서 재사용하기(framework)

* 실행비용 생각하기(cost)

* 올바른지 확인하기(correctness)

 

  1. 강의 진행

위의 소프트웨어적 개념틀을 효과적으로 전달하고자 다음과 같이 진행한다.

각 전공에서 흔히 맞닥뜨리는 개념이나 현상을 소프트웨어적인 사고로 어떻게 재구성할 수 있는지를 보여준다. 이 방식으로 여러 개의 전공에서 만나는 예들을 다루면서 소프트웨어적 사고틀 개념을 모두 다루게 된다. 또, 학생들이 당장 흥미를 느낄 수 있는 로봇이나 컴퓨터 오락기구를 통해서 그 속에 숨어있는 소프트웨어적인 사고틀의 개념을 강의하기도 한다.

 

* 데이터 정리하기(data structure)

– 자료를 정리하는 지혜다. 정리한 모양새(구조)에 따라 일을 편하게 할 수 있게 된다. 하려는 일에 따라 가장 적절한 자료 정리의 모양새가 있다.

– 비유: 책방에 책이 아무렇게나 꽂혀있다면 책을 찾기 힘들다. 식당 줄이 일렬이 아니라면 혼돈이 온다.

 

* 속내용 감추기(abstraction, 핵심 간추리기)

– 복잡한 것을 다루는 지혜다. 외부에는 속구현을 알려주지 말라. 핵심만 공개하면 된다. 속구현이 어떻게 되었는지 몰라도 만든 것을 사용할 수 있도록 한다.

– 비유: 자동차 운전은 자동차 엔진이 어떻게 만들어졌는지, 브레이크가 어떻게 만들어졌는지 몰라도 사용할 수 있다.

 

* 조립식으로 생각하기(composition)

– 독립적인 부품들을 조립해서 전체를 만드는 지혜다. 전체가 부품들로 분해될 수 있고 부품들을 제 역할에 맞게 조립하면 원하는 전체가 된다. 전체 방법은 부분 방법들의 조립이다.

– 비유: 수능시험을 잘 보는 방법은 각 과목시험을 잘 보는 것이다. 자동차는 엔진, 바퀴, 섀시, 껍데기, 의자 등으로 조립된다. 대학은 단과대학들과 행정지원 조직으로 조립된다.

 

* 계층쌓기로 생각하기(hierarchy)

– 조립하는 과정을 여러 계층으로 쌓아가는 지혜다. 만든 것을 부품으로 활용해서 더 큰 것을 만들고, 이렇게 만든 것이 또 부품이 되어서 더 큰 것을 만든다. 1층에서 만들어서 2층으로 올리고, 2층에서는 다시 반복하면서 차곡차곡 올라간다. 맨 위층의 것이 우리가 원하는 것이다. 위층에서는 아래층의 속구현을 몰라도 쌓아 올라갈 수 있다.

– 비유: 신경, 뇌, 뼈, 근육, 소화기관, 피부가 사람을 만들고, 사람들이 마을을, 마을들이 나라를, 나라들이 문명을 만든다. 각 계층의 속내용을 감추며 위층으로 위층으로 더 복잡한 것을 만들어간다.

 

* 끼리끼리 포장하기(module)

– 비슷한 것끼리 모아서 포장해 놓고 정리해 놓는 지혜이다. 많이 모여있는 것들을 잘 정리하려면, 유사한 것을 한데 모으고 박스에 넣고 박스에 표시를 해둔다.

– 비유: 이삿짐 포장할 때 ‘거실’, ‘부엌’ 등으로 박스를 마련해 놓고 포장하고 이사하고 짐을 풀듯이.

 

* 반복으로 생각하기(repetition)

– 같은 작업을 반복하면서 일을 마치는 지혜다. 같은 일을 다른 데이터를 가지고 반복하면서 일을 끝마칠 수 있다. 아는 것만 알고 갔던 곳만 가면서 일을 끝마친다.

– 비유: 밥을 먹는 일은 수저와 젓가락으로 밥과 반찬을 입에 넣은 후 씹어 삼키는 작업의 반복이다.

 

* 귀납으로 생각하기(induction & recursion)

– 데이터가 귀납적으로 만들어지는 종류들이 있다. 리스트는 리스트로 만든다. 트리는 트리로 만든다. A종류의 데이터를 생각하자. A 데이터를 만드는 기초적인 부품이 있고, 다음부터는 그렇게 만든 A 데이터로 새로운 A 데이터를 만든다.

– 비유: 나뭇가지를 보자. 왼쪽, 오른쪽 나뭇가지들로 나뭇가지가 만들어져 있다. 양파를 보자. 양파를 한 꺼풀 벗기면 다시 양파다. 양파로 양파를 만든 것이다.

 

* 순서로 생각하기(sequentiality & concurrency)

– 일의 순서를 생각하는 지혜다. 일을 쪼개고, 쪼개진 일의 순서를 생각한다. 대부분의 일에는 순서가 있다. 어떤 일을 마쳤을 때에만 그 다음 일을 할 수 있다. 이전 일의 결과가 다음 일에 꼭 필요하기 때문이다. 일의 순서가 굳이 없다면 동시에 진행해도 된다. 쪼개진 일들의 순서가 필요 없는 경우가 있다. 이전 일의 결과가 다음 일에 필요한 것이 아니라면 순서 없이 동시에 진행해도 된다.

– 비유: 비빔국수를 요리하는데 순서대로 할 일이 있고 동시에 해도 되는 일이 있다. 물을 끓인 후 국수를 넣고 삶아야 한다. 한편, 밀가루 반죽과 소스를 만드는 일은 동시에 진행해도 된다.

 

* 상태나 값으로 생각하기(state & value)

– 변하는 상태를 생각하거나 변함없는 값을 생각하며 일하는 지혜다. 물건에 변화를 일으키면서 일할 수도 있고, 값을 만들고 만든 값으로 새로운 값을 계산하는 과정으로 일할 수도 있다.

– 비유: 장바구니라는 물건은 장을 본 물건들로 채워지며 상태가 변한다. 그러면서 장보기를 마친다. 변하지 않는 값으로 생각하는 예로, 각 부서가 업무 지침을 만드는 과정을 보자. 옆 부서에서 만든 지침을 가져다가 우리 부서에 맞는 지침을 만들지만 옆 부서의 지침을 바꾸지는 않는다.

 

* 틀을 짜서 재사용하기(framework)

– 자주 쓰는 것을 재사용하기 쉽게 준비해 놓는 지혜다. 지금 만든 것을 지금의 경우에만 쓰게 하지 말고, 지금의 상황과는 떨어진 일반적인 경우로 확장해서 준비해놓는다. 재사용할 때마다 사용되는 상황이 다를 것이다. 다른 점을 반영해서 경우마다 조금씩 다른 일을 할 수 있도록 준비해 놓는다.

– 비유: 떡살을 생각하자. 매번 같은 모양의 떡을 만들지만 넣는 재료에 따라 다른 떡을 찍어줄 것이다. 또는, 공교육 시스템 같은 것이다. 유아교육, 초등교육, 중고등교육의 틀이 있다. 각 교육과정에 새로운 비중의 과목과 내용이 채워지면서 새로운 시대에 맞는 교육내용을 실현한다.

 

* 실행비용 생각하기(cost)

– 컴퓨터가 소프트웨어를 실행하면서 시간과 메모리를 얼마나 쓸지 어림잡는 지혜다. 만든 소프트웨어가 실행되면 얼마나 시간과 메모리를 소모할까. 입력의 크기에 따라 비용이 어떻게 될지를 생각하면서 더 나은 방법을 찾는 길잡이다.

– 비유: 1부터 100까지 그녀가 마음속에 가지고 있는 숫자를 알아맞히는 방법을 생각하자. 1부터 차례로 물어가는 방법도 있고, 매번 그 포위망을 반으로 좁혀가는 방법도 있다.

 

* 올바른지 확인하기(correctness)

– 우리가 생각한 바를 틀림없이 소프트웨어로 표현했는지 확인하는 지혜다. 컴퓨터는 소프트웨어 그대로를 맹목적으로 실행할 뿐이다. 우리가 짠 소프트웨어에 실수가 있다면 컴퓨터는 그 실수를 고스란히 드러낸다.

– 비유: 로켓(소프트웨어)을 잘못 만들면 자연(컴퓨터)이 실행시키는 그 로켓은 상승 중에 폭발하는 것과 같은 이치다.

서울대학교 기초교양교육 웹진 <열린지성>
08826 서울시 관악구 관악로 1 서울대학교 기초교육원 61동 | Tel. 02-880-5690 | Fax. 02-882-5673 | Email liberaleduweb@snu.ac.kr
발행인 : 이재영 | 편집위원장 : 허원기 | 편집위원 : 최윤영, 강혜정, 김지현, 이유선 | 편집담당 : 양진철

© 2015, 서울대학교 기초교육원