올해부터 중학교와 고등학교는 정보 과목을 신설하여 학생들에게 SW 교육을 시작했고, 초등학교의 경우 내년부터 실과 수업을 통해 학생들이 SW를 배우게 된다. 그래서인지 벌써 몇몇 지역을 중심으로 코딩 사교육 열풍이 후끈 달아오르고 있다. 일부 학생과 학부모 사이에서 SW 관련 경시대회 입상을 대학 입학의 수단으로 사용하려는 모습까지 보여 안타깝다. 이는 정부의 SW 조기 교육 취지와는 거리가 있어 보인다.

초중고 학생들과 부모님, 그리고 일선 선생님 중, 사교육 열풍에 대한 염려와 SW 조기교육의 효과에 대해 의문을 품는 분들이 많으실 것으로 생각한다. 이분들께 조금이나마 이해와 도움이 되길 바라는 마음에 나의 SW 조기 교육 경험담과 나만의 코딩 잘하는 10가지 방법을 준비했다.

그림 1

※ 출처 : 구글 이미지 검색

내가 처음 컴퓨터를 접한 건 초등학교 5학년 때였다. 지금의 초등학교 방과 후 수업과 비슷한 형태의 컴퓨터 특활수업에서였다. 학교 1층 공간에 마련된‘전산실습실’에는‘APPLEⅡe’컴퓨터가 10대 정도 나란히 놓여 있었다. 30여 년이 지난 지금, 첫 수업의 기억이 아직도 어렴풋이 난다. 본체와 모니터를 켜고 끄는 방법부터 5.25인치 플로피디스크를 넣고‘부팅’하는 방법까지 상세히 배웠다. 이후 며칠 만에 숫자를 더하고 평균을 계산하는 간단한 BASIC1 프로그램을 짰고 초록색 단색 모니터에 출력되는 결과를 보고 환호했다.

초등학교 때 컴퓨터와의 첫 만남은 불혹의 나이까지 컴퓨터와 관련된 일을 하게 했다. 지금 생각해보면 합계와 평균을 내는 단순한 프로그램에 왜 그리 열광했는지 잘 이해는 가지 않는다. 다만 처음 보는‘기계’에 명령을 내리고‘모니터’라는 장치에 결과를 보여주는 자체가 신기했던 것 같다. 코딩이 어느 정도 익숙해진 이후에는 내가 원하는 대로 코딩하고 결과를 모니터에 바로 보여주는 과정 자체가 재미있었던 것으로 기억한다.

그래서인지 대학에 진학할 때 고민 없이 전산학과2를 선택했다. 그 당시가 1995년이었으니 불과 23년 전이지만, 학과 교수님이“대학 와서 컴퓨터를 처음 써본 사람?”이라는 질문에 십여 명의 친구들이 수줍은 듯 손을 들었다. 전산학과임에도 불구하고 같은 과 친구 중 코딩을 해본 친구를 찾기 힘들 정도였다. 이런 현실에서 C언어가 전산학과 1학년 친구들의 발목을 잡았다.

어셈블리어의 어려움을 해소하면서 시스템의 낮은 수준(low level)까지 제어하기 위해 개발된 C언어는 솔직히 코딩을 처음 접하는 사람에게 만만한 프로그래밍 언어는 아니다. 특히, 문법 위주의 C언어 교재는 코딩에 대한 흥미를 빠르게 감소시켰다. 시간이 지날수록 코딩으로 무엇을 할 수 있을지에 대한 의문마저 생겼다. 지금의‘수포자(수학을 포기한 자)’가 있다면 그 당시 내 친구 중에는‘C포자(C언어를 포기한 자)’가 많았다. 그만큼 코딩과 친해지기는 쉽지 않았다.

그런데도 나는 난해한 C언어에 푹 빠지고 말았다. 내가 알고 있던 BASIC보다는 할 수 있는 것이 훨씬 많았고 내가 생각하는 대로 표현할 수 있어서였다. 또한, 인터프리터(interpreter, 해석기) 언어의‘답답함’3을 컴파일러(compiler) 방식의 C언어가 해소해줬다. 나 역시 C언어는 처음 접하기 때문에 어렵기는 마찬가지였지만 그래도 재미있었다. 아마 C포자 친구들과 단 하나의 차이점이라면 초등학교 때부터 코딩을 접하고 종종 코딩했던 것이 도움이 된 것 같다.

길다면 길고 짧다면 짧은 지금까지 내 경험을 바탕으로 기회가 되면 코딩‘잘하는’방법을 꼭 공유하고 싶다. 아래 코딩 잘하는 10가지 방법들은 전적으로 개인 의견이고 별다른 검증 과정도 없었다. 10가지 방법 중 일부는 공감을 받기 힘들 수도 있다. 하지만 코딩을 잘하고 싶은 사람이라면 가볍고 너그러운 마음으로 읽어주길 바란다.

1. 문법 공부는 최소로 하라!

내가 중학생이던 시절에는 영문법 공부가 영어 공부의 대부분이었다. 지금은 영어 공부 방법이 많이 달라지기는 했지만 프로그래밍 언어를 공부하는 대부분은 예전에 영어 공부하듯 코딩 공부를 시작한다. 즉, 지나치게 문법 위주의 코딩 공부를 하고 있다. 물론 프로그래밍 언어의 문법을 모르면 코딩을‘전혀’시작할 수 없다. 하지만 문법 공부에만 지나치게 시간을 쓰다 보면 코딩에 대한 흥미를 잃는 경우가 많다. 예시로 나와 있는 샘플 코드를 책에서 베껴 입력하고 실행하다 보면 따분하고 무엇을 할 수 있을지 막막해지는 것은 사실이다.

데이터 처리 방법, 입·출력 방법, 조건문과 반복문 사용 방법, 함수 사용 방법 등 핵심이 되는 문법 몇 개만 공부하고 당장 코딩을 시작하자. 문법이 틀리면 컴퓨터가 친절하게 알려준다. 예전에는‘문법 오류(Syntax Error)’4 메시지 하나만 달랑 보여주었지만, 요즘 프로그래밍 언어들은 무엇이 틀렸는지 세세히 알려준다. 인터넷에 오류 메시지를 검색하면 상세한 해결 방법도 찾을 수 있다. 이러한 시도가 흥미를 잃지 않고 코딩과 문법을 한 번에 공부할 수 있는 방법이라 생각한다. 해당 언어에 어느 정도 자신감이 생기고 세세한 문법이 필요하면 그때 공부해도 충분하다.

2. 목적을 갖고 코딩하라!

“Hello, world!”는 처음 코딩을 시작할 때 일반적으로 첫 번째로 나오는 샘플 코드를 말한다. 기원은 브라이언 커니핸(Brian Kernighan)과 데니스 리치(Dennis Ritchie)가 쓴『The C Programming Language』책이었다.“난 헬로 월드 정도만 알아.”는 해당 프로그래밍 언어의 아주 기초 수준만 알고 있다는 의미다. 또는“이제 해당 언어로 개발할 (마음의) 준비가 되었어.”정도로 이해하면 된다. 특별한 목적 없이 코딩 공부를 시작하면 헬로 월드 이후 무엇을 할지 막막하고 그러다 보면 코딩에 흥미를 잃게 된다.

이제 목적을 갖고 코딩을 해보자. 간단한 계산기 프로그램을 만드는 것도 좋다. 주기적으로 알람을 보내주는 앱을 만들어도 된다. 무엇이든 목적을 갖는 코딩을 하다 보면 사용하는 언어에 대해 자연스럽게 공부를 하고 모르는 부분은 의욕적으로 인터넷을 찾아 배우게 된다. 처음에는 사칙연산만 되는 계산기를 만들었다면 로그나 지수까지 계산하는 공학계산기를 만들어보자. 목적을 갖고 코딩하는 방법이 가장 빨리 코딩을 배우고 잘하는 방법이다.

3. 설계 없이 바로 코딩하라!

아마 이 방법에 동의하지 않는 사람들이 많을 것으로 생각한다. 소프트웨어 공학(Software Engineering, SE) 수업을 들어보더라도 요구사항 분석, 설계, 개발, 검증, 유지보수 등 개발 방법론이 중요하다고 역설한다. 물론 이러한 개발 방법론이 틀렸다는 것은‘절대’아니다. 그러나 우리가 지금 만 줄짜리 프로그램을 코딩하는 게 아니다. 아직 여러 사람이 협업하는 단계도 아니다. 토이(toy, 장난감) 프로그램 수준의 코딩을 배우는 단계이다. SE에서 말하는 개발 방법론을 따를 필요는 없다.

바로 에디터를 열고 코딩을 시작하자. 머릿속에 떠오르는 기능부터 만들어보자. 이렇게 코딩을 하다 보면 흥미가 생기고 결과도 빨리 나온다. 만약 코드가 길어져 관리가 필요하다면 그때 가서 코드 리팩토링(refactoring, 재분해)5을 하면 코드를 아름답게(?) 정리할 수 있다. 나중에는 SE에서 말하는 개발 방법론이 필요하지만, 코딩에 흥미를 느끼고 잘하기 위해서는 빠르게 개발하고 결과를 확인하는 게 더 중요하다. 실제 애자일(Agile) 개발 방법론이 이러한 빠른 개발의 장점을 극대화하기 위해 등장했다.

4. 단순 반복 작업은 코딩으로 해결하라!

일하다 보면 단순 반복 작업을 할 때가 종종 있다. 이름이 제각각인 수백 개의 파일들을 일정한 규칙에 따라 이름을 바꾸는 작업이 이러한 일 중 하나다. 운영체제에 따라 파일명을 일괄 수정하기 위한 기능을 제공하기도 하고 그렇지 않아 고욕인 경우도 있다. 또 다른 단순 반복 작업 중 하나는 이곳저곳에서 수집된 데이터의 포맷을 같게 수정하는 작업이다. 매번 포맷이 다르기 때문에 이를 위한 적당한 툴을 찾기도 쉽지 않다. 이러한 작업은 시간도 많이 낭비되지만, 육체적인 피로 역시 무시하기 힘들다.

이제 단순 반복 작업은 과감하게 코딩으로 해결하자. 물론 우리의 목적은 코딩을 잘하는 것이지만 단순 반복 작업도 피할 수 있으니 일거양득이다. 사실 단순 반복 작업에 들어가는 시간과 코딩에 걸리는 시간이 서로 비슷하다면 어떤 방법을 쓸지 고민하게 된다. 하지만 이런 경우 무조건 코딩을 해보자. 코딩 실력도 늘지만, 생각보다 정신적 육체적 피로가 덜하다. 심지어 성취감까지 덤으로 얻게 된다. 나만의 유틸리티 프로그램(utility program)이 쌓여갈수록 코딩 실력이 느는 것을 느끼게 되고, 여러 프로그램을 모아 하나의 범용 유틸리티를 만드는 재미도 쏠쏠하다. 주변에 자신이 만든 코드를 공유하고 단순 반복 작업에 지쳐있는 이들의 감사 인사를 받아보자.

5. 매일 일기 쓰듯 코딩하라!

매일 일기를 쓰지 않으면 이 방법에 대해 공감하지 못할 수 있다. 그러나 매일 일기를 쓰는 사람은 점점 자신의 필력(筆力)이 느는 것을 느끼게 된다. 코딩도 마찬가지다. 매일 코딩을 하다 보면 코딩 실력이 점점 느는 것을 어느 순간 느끼게 된다. 특히 개발 환경이 복잡한 경우‘매일 코딩’으로 개발 툴과 친해지고 사용에 익숙해져서 결국 코딩에 자신감마저 생기게 된다.

“난 코딩 못해. 어떻게 하면 잘할 수 있을까?”라고 걱정하는 시간에 코딩을 해보자. 나는 농담 삼아 매일 Python으로 일기를 쓴다고 말하지만, 매일 코딩하는 것이 실력 향상에 도움이 되는 것은 농담이 아니다. 거창한 프로그램을 짤 필요도 없다. 코딩과 멀어지지 않을 정도면 충분하다. 10줄도 좋고 1줄도 좋다. 이미 다른 사람이 만든 프로그램을 똑같이 만들어보는 것도 좋다. 스도쿠(Sudoku)와 같은 퍼즐을 푸는 코드를 짜보는 것도 좋다. 다만 경시대회 문제와 같이 어려운 문제를 푸는 것은 그다지 큰 도움이 되지 않는다. 간단하면서도 재미있고 쉬운 코딩을 매일 해보자.

6. 자신의 코드를 남에게 자랑하라!

사실 내 코드를 남에게 보여주는 것만큼 부끄러운 일도 없다. 아마 글쓰기도 마찬가지다. 그러나 남들에게 자신의 코드를 보여줄수록 좋은 코드가 만들어지는 것은 사실이다. 사소한 실수부터 잘못된 논리(logic)까지 검토(code review, 코드리뷰)를 받을 수 있다. 다른 사람에게 검토를 받지 못하더라도 코드를 공개한다는 사실 하나만으로도 조금 더 자기 소스 코드에 신경쓰게 되고 이는 코딩 실력 향상으로 이어진다. 심지어 코드에 주석도 열심히 달기 시작한다.6

같이 일하는 동료에게 검토를 받아보자. 사실 바쁜 일상에서 내 코드를 남에게 정성껏 봐달라고 부탁하는 일은 쉽지 않다. 이 경우 Github와 같은 공개 커뮤니티에 코드를 올려보자. 전 세계 개발자들로부터 리뷰를 받을 수 있다. 가끔은 누군가 내 코드를 가져다(clon) 사용하는 경험도 하게 된다. SNS의 친구 수가 늘어날수록 기분 좋아지듯 Github의 친구(follower) 수가 늘어가는 뿌듯함을 즐겨보자. 만약 개발하다 모르는 부분이 있으면 stack overflow7에 올려 도움을 받을 수 있다. 이렇게 자신의 코드를 공개하고 다듬다 보면 어느덧 코딩의 고수가 되고 커뮤니티에서 슬슬 명성을 쌓아갈 수 있게 된다.

7. 애(愛)언어를 하나 가져라!

차를 직접 사서 운전에 어느 정도 익숙해지면, 세단이든 SUV든 12인승 승합차든 쉽게 적응하고 운전할 수 있다. 마찬가지로 코딩도 JAVA든 C든 하나의 언어에 익숙해지면 다른 언어의 습득이 빨라진다. 물론 절차적 언어를 공부하다 객체지향 언어를 공부하게 되면 이들 언어가 추구하는 목표가 달라 어느 정도 개념 공부가 필요하지만, 처음 코딩을 배우는 것보다는 빠르게 배울 수 있다.

난 BASIC으로 코딩 공부를 시작했지만, 대학 시절 가장 많은 시간 동안 C를 사용했다. 그 시절 객체지향언어로 C++을 선택할지 갓 세상에 태어난 JAVA를 선택할지 고민했다. 결국 단순하고 직관적인 JAVA를 선택했고 나의‘애(愛)언어’가 되었다. 이후 C#이나 Swift를 공부할 때 큰 어려움을 느끼지 못했다. C든 JAVA든 Python이든 일단 한 가지 언어에 자신감이 생길 때까지 공부해보자. 이후 다른 언어를 공부하면 무척 쉽게 배우게 된다.

8. 안 되는 건 빨리 포기하라!

프로그래밍 언어별로 하기 쉬운 일과 하기 어려운 일이 있다. C나 Perl로 GUI 구현은 가능하지만 큰 노력이 필요하다. 반면, JAVA나 Swift는 쉽게 GUI 기반의 앱을 만들 수 있게 한다. Bash 스크립트는 Linux 환경에서 간단한 프로그램을 짤 때는 유용하지만 어느 순간 한계를 느끼게 한다. 반면 Python을 사용하는 경우 간단한 유틸리티부터 무궁무진한 라이브러리의 도움으로 상용 수준의 프로그램을 만드는 데까지 별다른 어려움을 느끼지 못한다.

애(愛)언어를 하나 갖는 건 중요하지만 하나의 언어를 모든 상황에 사용하려 하지 마라. 지금 해결하려는 문제와 개발·운영 환경을 고려하여 가장 적합한 언어를 선택하는 것이 중요하다. 하나의 기능이 수백, 수천의 라인으로 구현되는 언어가 있는가 하면 단 몇 줄로 같은 기능을 구현할 수 있는 언어도 있다. 어떤 언어가 상황에 적합한지 틈틈이 공부하는 것도 코딩을 잘할 수 있는 비결이다. 하나의 언어에 얽매여 잘 안 되는 것을 억지로 하려 하지 말자.

9. 다른 사람의 코드를 보라!

다른 사람의 글을 많이 읽어야 좋은 글을 쓸 수 있다는 말이 있다. 마치 바둑의 고수가 되기 위해서는 엄청난 양의 기보8를 보는 것과 비슷하다. 코딩도 마찬가지다. 좋은 코드를 많이 접해야 자신의 코드도 좋아지고 코딩 실력도 향상된다. 아직 배워야 할 것이 많은 우리는 남의 코드를 최대한 많이 접하고 보고 따라 해야 한다. 물론 어느 정도 실력이 쌓여도 남의 코드 보기를 게을리 해서는 안 된다. 이제는 협업 없이 혼자 코딩하는 시대는 지났다. 예를 들어, 인공지능 기술은 소프트웨어가 공개됨에 따라 빠른 속도로 발전하고 있다. 공개된 소스 코드를 받아 사용하고 기여(contribute)하기 위해서는 남의 코드를 잘 읽고 쓰는 데 익숙해야 한다.

이제는 Github에서 다른 사람들의 코드를 쉽게 찾아볼 수 있는 환경이 됐다. 지금 당장 Linux 커널 코드를 보라는 말은 아니다. 팔로워(follower)가 많은 개발자의 소스 코드를 몇 개 선택해서 틈틈이 보는 것이 더 중요하다. 특히, 관심 있는 분야의 소스 코드면 더 좋다. Github에 올라온 코드들은 이전 버전과 비교해서 볼 수 있고 어떤 이유로 수정되었는지도 확인할 수 있다. 이러한 내력을 알고 소스 코드를 볼 때 좀 더 많은 것을 배우게 된다. 앞으로 기업에서 다양한 프로젝트에 참여해서 여러 상황에 유연하게 대처하기 위해서는 이러한 능력이 중요하다는 것을 마음에 새겨놓자.

10. 좀 더 큰(?) 코딩을 할 때는 플랫폼을 적극적으로 활용하라!

안드로이드, iOS, SPRING과 같은 플랫폼을 이용하면 복잡하고 어려운 기능을 쉽게 구현할 수 있다. 예를 들어, 안드로이드 플랫폼을 이용하면 단 몇십 줄로 자신의 지도상 위치를 정확히 얻어낼 수 있다. 이를 이용해서 위치 기반 서비스 앱을 손쉽게 만들 수 있다. 만약 스마트폰에 운영체제 하나만 달랑 올라가 있다면 위치 기반 서비스 앱을 만들 수 있는 사람이 얼마나 될까? 아마 지금보다 위치 기반 서비스 앱의 수는 현저히 적을 거라 장담한다.

이제는 플랫폼을 적극적으로 이용할 줄 알아야 한다. 하나부터 열까지 모두 만들어서 사용하는 시대는 오래전에 지나갔다. 코딩 실력을 나타내는 잣대 중 하나가 플랫폼을 얼마나 잘 다루느냐이다. 그만큼 플랫폼 활용 능력이 중요하다. 플랫폼과 친해지기 위해서는 많은 시간이 필요하다. 그러나 일단 친해지면 할 수 있는 것은 훨씬 많아진다. 아이작 뉴턴이 “거인의 어깨에 올라서서 더 넓은 세상을 바라보라”라고 말했듯, 나는“거인의 코드를 이용해서 더 크고 가치 있는 프로그램을 만들어라”라고 말하고 싶다.

맺음말

내가 방과 후 수업으로 접한 코딩의 기회가 이제는 정규 과목을 통해 모든 학생에게 주어졌다. 이러한 수업이 SW에 흥미를 갖게 하고 미래의 마크 저커버그(Mark Zuckerberg)9와 같은 코더(coder)를 길러내길 기대한다. 이제 막 SW를 배우기 시작한 이들에게 나의 코딩 잘하는 10가지 방법이 조금이나마 도움이 되길 바란다.

  • 1 Beginner’s All-purpose Symbolic Instruction Code의 약자로 그 당시 코딩 교육은 대부분 BASIC부터 시작했다.
  • 2 지금은 학과 이름이 컴퓨터공학과로 변경됐다.
  • 3 답답함은 그 당시 개인적인 의견일 뿐이고 지금은 인터프리터 언어와 컴파일러 언어 각각에 장단점이 있다는 것을 밝혀둔다.
  • 4 영어를 모르던 어린 시절에는‘신택 세라’를 나쁜 것 정도로만 이해했지 정확히 어떤 의미인지도 확실히는 몰랐다.
  • 5 결과의 변경 없이 코드의 구조를 재조정하는 행위를 말하며 개발 통합 환경(IDE)에서 대부분 지원한다
  • 6 주석 달기가 얼마나 귀찮고 힘든 일인지 코딩을 해본 사람은 안다.
  • 7 https://stackoverflow.com/
  • 8 두어진 바둑의 수순을 기록한 것이지만 일반적으로 바둑 고수들의 기록을 말함
  • 9 페이스북 설립자이자 현 CEO.

월간SW중심사회 2018년 12월호 SW교육