코딩

 

1. 컴퓨터 프로그램을 만드는 행위
2. 교육 과목
3. 자동차튜닝 중 하나
4. 같이 보기


1. 컴퓨터 프로그램을 만드는 행위



하나 이상의 관련된 추상 알고리즘을 특정한 프로그래밍 언어를 이용해 구체적인 컴퓨터 프로그램으로 구현하는 기술을 말한다.
조금 더 쉽게 설명하자면, 코딩이란 프로그래밍 코드를 어딘가에 적는 것을 말한다. 어렵게 생각할 것 없다. 말 그대로 단지 프로그래밍 코드를 써 내면 그게 코딩이다. 예를 들면 메모장#s-2을 켜고 평범한 글을 쓸 수 도 있고, 프로그램 코드를 쓸 수도 있는데 후자를 하면 코딩이다.[1] 보통은 코딩을 할 때 컴퓨터를 이용하기에 키보드를 마구 두들겨가며 코딩을 하겠지만, 종이나 화이트보드 위에 손으로 직접 코드를 써 가면서 코딩을 할 수도 있다.[2]
구체적인 예를 들어 코딩의 과정을 이해해보자.
만약 우리가 게임을 만들고 싶다면 가장 처음에 해야할 게 뭘까? 어떤 게임을 만들지 정하는 것이다. 그 게임은 오버워치같은 게임이 될 수도 있고 리그 오브 레전드같은 게임이 될 수도 있고 클래시 오브 클랜이나 브롤 스타즈같은 게임이 될 수도 있다. 어떤 게임이든 좋다. 정했다면 그 상상속 게임의 내용을 어딘가에 적어두면 더 좋다. 생각만 하고 메모를 안하면 나중에 필요할때 까먹거나 헷갈릴 수도 있으니까. 어떤 게임을 만들게 될지 정했고 그것을 글로 '''꼼꼼하고 정확하게''' 써 냈다면[3] 그 글을 실제 게임으로 만들어 줄 수 있는 개발자에게 보내자. 돈도 좀 쥐어주자.
우리가 쓴 글을 꼼꼼히 읽은 개발자는 이런 생각을 할 거다.

아니 이게 대체 무슨 소리야?

만약 우리가 글을 '''정말로''' 꼼꼼하고 정확하게 썼다면 이런 생각을 할 거다.

이런 게임을 만들면 되겠군...

하지만 개발자가 이해한 게임이 우리가 원한 게임과 '''정말로''' 같으리란 보장은 없다.
개발자는 우리가 쓴 게임에 대한 글을 읽고 이 게임이 어떤 게임인지, 완성되었다면 어떤 모습일지 ''' 나름대로''' 파악한다. 그리고 자기가 이해한 대로 게임을 만든다. 게임을 만들기 위해서 개발자는 먼저 메모장 같은 걸 켜고 거기에 '''코드를 적고''' 저장한다. 만들어진 파일들은 당연히 평범한 텍스트 파일들이다. 여기까지가 코딩이다. 이렇게 저장된 파일들을 컴파일러라는 프로그램에 넣으면 알아서 컴퓨터 프로그램이나 스마트폰 어플 파일을 만들어준다.[4] 그리고 그렇게 만들어진 게임을 우리에게 보내주면 끝난다. 참 쉽죠?

사람들의 상상 속 프로그래밍 VS 현실

이제 코딩이 뭔지 이해했을 거라고 생각한다. 코딩은 단순히 코드를 적고 파일로 저장하는거다. 메모장을 써도 되고 워드한컴을 써도 된다. 그러기만 하면 그걸 알아서 프로그램으로 만들어주는 프로그램까지 있다.
단, 프로그래밍 언어를 조금 이상하게 사용했을 경우 프로그램이 만들어지지 않는다. 또는 만들어져도 쓰는 도중에 마음대로 꺼진다.[5] 또는 성능을 마구 잡아먹거나, 기능이 이상하게 돌아가거나, 해킹에 사용될 수 있는 약점이 만들어지기도 한다.[6] 이럴 때는 잘못된 부분을 고쳐주어야 한다.[7] 위의 유튜브 영상에서 갑자기 구글을 찾아보는 이유가 이것.

2. 교육 과목


1984년 초등학교 컴퓨터 프로그래밍 수업
컴퓨터 프로그래밍을 통해서 일반적 문제해결 능력/논리력을 기르고자 하는 새로운 교육 과정. 기존에도 중고등학교 과정에 정보과학 과목은 있었지만 존재감이 없었는데 이를 흡수하여 별도의 필수 정규교과목 화 한 것. 2018년부터 의무교육에 해당하는 초중등학교의 정규 교육과정으로 도입된다. 하지만 직업적 프로그래머 양성을 목표로 C언어 등을 가르치는 전문계 특성화고등학교에서 배우고 대학수학능력시험직업탐구 영역의 하나인 프로그래밍 과목과는 다르다. 하지만, 중고등학생용 정보 교과서보면 '''불 대수'''가 나오고 C 언어를 가르치게 되어있다.
일반인이나 교육관계자들이 가장 크게 오해하는 것이 코딩교육이 미래의 소프트웨어 개발자를 확보하기 위한 교육이라는 잘못된 접근이다. 초등-고등학교에서 음악교과를 가르치는 것이 가수나 작곡가 등 음악인 양성을 위한 것이 아니고 단지 감성을 풍부하게 하는 교양으로 가르치듯이 모든 학생을 대상으로 가르치는 코딩교육도 사고력과 응용력을 풍부하게하는 두뇌의 체조에 불과하다. 이걸로 미래 전문인 양성에 도움이 된다고 할 수는 없다. 다만 일반인들에게 컴퓨터의 원리에 대한 기본적 이해를 늘리고 그중에서 재능이 있는 사람은 자신의 재능을 발견할 기회를 주는 정도에 불과하다.

마치 수학을 가르쳐서 수리적인 사고능력을 기르거나 체육/음악/미술 교과를 통해 신체를 단련하거나 예술적 교양을 기르는 것과 비슷한 취지의 교육이다. 초중고 수학교육이 사회에서 수학을 직접 활용하는게 목표가 아니고 체육/음악/미술 교육도 운동선수나 예술가 양성이 목적이 아니듯이 코딩 교육도 프로그래밍/코딩 기술 습득 자체나 프로그래머 양성이 교육의 목표가 아니다. 초중고 수학교육의 목적은 수학적 과학적 사고능력 배양이 목표다. 코딩을 배우는 것도 코딩을 직접 사회에서 활용할 기회가 있어서가 아니라 코딩을 통해 배울 수 있는 여러 가지 문제 해결 경험이 지능 발달과 문제에 대한 통찰력과 분석력 증진에 도움이 되는 거다. 다만, 교사가 '''코딩 수준을 컴교과 1학년 수준'''으로 생각하고 가르친다면 이야기가 달라지니, 기성세대인 교사와 학부모가 어떻게 코딩을 이해하냐가 관건이다.
그보다는 논리적이고 조직적인 사고방식, 복잡한 문제를 분석해서 이를 명확하게 이해하는 능력, 큰 문제를 간단한 여러 문제로 분할하여 추상화하는 능력, 문제를 순차적 기계적으로 이를 해결하는 능력, 수치와 판단을 기반해 문제를 해결하는 방법, 작은 부분을 조합해서 크고 복잡한 기능을 만드는 능력, 다른 사람과 소통하고 협력하여 큰 문제를 해결하는 능력 등등, 한마디로 말하면 "복잡함(Complexity)"과 순차적 조직적 문제해결 과정을 다루는 능력을 기르는 것을 목표로 한다.
어쩌면 어린이들의 레고 블록 놀이나 비슷하기도 하다. 따라서 어떤 구체적인 지식 자체를 배우는 걸 목표로 하는 것이 아니고 그 배우는 과정에서 수많은 '''실패'''를 경험하면서 점진적으로 목표인 문제해결을 향해 한걸음 씩 나아가며 탐구심, 도전 정신, 끈기, 명료한 사고, 틀을 벗어난 창의적 사고방식, 흥미유지, 타인과의 의사소통, 협동정신 등 다른 공부나 활동에 유리한 여러 기술들을 몸에 익히게 된다. 수학이나 과학실험도 그러한 능력을 기르는 데 좋은 도구이지만 수학보다 좋은 점은 비교적 난이도가 낮고 비용이 적게들고 쉽게 실험을 반복하여 손에 잡히는(tangible)한 결과를 얻을 수 있으므로 수학에 비해 사전지식이 덜 필요하고 학습자의 흥미를 유지하기가 좋다는 것이다. 수학은 한번 뒤쳐지기 시작하면 다음 과정이 이해가 되지않아 따라가기 어렵다. 따라서 요즘 수학을 포기하는 학생 수포자 문제의 한 대안이 될 수 있다.
현재 초등학생의 경우 일주일에 1시간 가량 가르칠 예정인데 이렇게 가르친다고 일부 코딩교육 정책 추진자들이 주장하듯이 미래의 빌게이츠나 저커버그 같은 IT 인재를 양성하는 교육인 건 결코 아니다. 일주일에 한시간씩 미술이니 체육 교육을 시킨다고 미래의 피카소나 리오넬 메시를 양성한다고 주장할 수는 없다. 코딩교육의 목표를 구체적 인물로 예를 들자면 맥가이버같은 호기심이 많고 임기응변, 응용력이 풍부한 인물일 것이다. 사실 단점도 없지는 않은데 과학은 발전 속도와 방향에 따라 어떻게 될 지 몰라서 코딩 의무화는 아무래도 국가가 선택권을 강제하는 면도 있다.[8]
무엇보다 도구를 만드는 인간, 공작인 (工作人 Home faber) 으로서의 본능을 어릴 때 일깨워서 미래의 이공계 인력자원을 확보하기 좋은 교육이다. 원래는 실과 과목이 그런 목적이 있었지만 초중고 학교현장에서 학생들에게 직접 목공 등 공작이나 제작 교육을 하기에는 예산이나 교사등 여건이 부족하여 거의 효과가 없었는데 코딩은 학생들에게 직접 실용적 "물건"을 자기 손으로 제작해보는 경험을 하게 함므로써 이런 공작인으로서의 재능과 즐거움을 조기에 발견하게 하여 미래의 공돌이나 덕후의 길로 가게 하는 것이다.
코딩 교육에서 널리 쓰이는 컴퓨터 프로그래밍 언어는 보통 아주 간단하고 쉽게 쓸 수 있으면서도 간단한 기본요소 들을 가지고 조합과 응용으로 복잡한 문제도 탐구적으로 시행착오를 통해 문제를 점차 점근적으로 해결하는 데 적합한 언어가 쓰인다. 과거에는 LOGO 언어라든지 BASIC 언어 등이 쓰였고 현대에는 스크래치, 파이썬, Scheme, MATLAB 언어등이 자주 쓰이는 편이다. 거대하고 복잡한 라이브러리 활용이나 그런 라이브러리를 제작하는 능력 등 성능과 대규모 프로젝트 개발에 중점을 두는 현대의 직업적 프로그래밍 언어와는 많이 다르다. 대체로 Java 나 C++ 등 컴파일 언어보다는 간단한 파이썬이나 자바스크립트 같은 데이터형 선언이 없고 빠르고 반복적인 개발에 적합한 인터프리터 언어가 더 많이 쓰인다.
다만, 앞서 말했다시피 기성세대에겐 '''코딩=프로그래밍'''이라는 인식이 잡혀있어서 이 부분을 해결해야한다. 또, 프로그래밍이나 코딩 해본 사람은 알겠지만 '''저게 어째서 되는 거지'''랑 '''이게 어째서 안되는 거지'''에 대한 절망은 '''전공자들도''' 엄청 심하게 느끼는 부담감이다.
그리고, 현실은 이러한 우려가 가장 심하게 나왔다. 이미 학원가에선 '''초등학생 4학년은 이제 초등학교 수준을 넘어서 가르침을 받는다'''라고 하며, 실제로 강남권 등에서는 '''컴공과 전공생도 어려워하는''' 대학전공 수준을 가르치고 있다. 또, 학생들이 실패를 자주 겪고 초등학생 수준 수학보다 더 복잡한 코딩 때문에 심각한 좌절을 겪고 있다.
하지만 이걸 문제로 볼 것인지에 대해서는 다르게 볼수 있다. 예를 들어 음악이나 스포츠 분야도 학교교육이 아닌 미래의 음악가나 프로스포츠 선수등 해당 직업인을 희망하는 초등학생이라면 그런 수준이 과하다고 볼수 없다. 초등학생 피아노 교육도 이미 체르니 30번 까지는 기본이다. 음악 대학교에서 그보다 훨씬 고급의 과목을 배운다. 단지 과거에는 컴퓨터 분야는 중고등학교에서 그런 교육을 받은 학생이 없어서 대학교에서 그런 과목을 기초로 가르치는 것이지 만약 대부분의 입학생이 초중고에서 피아노학원에서 배운 음대 입학생 처럼 컴퓨터 프로그래밍을 배운 학생이라면 그 교육 수준은 크게 올라갈 수 밖에 없다. 현재의 컴공 1-2학년 과목은 학문이라고 하기에 어려운 아주 기초적인 기능에 불과하고 이는 초중고에서도 시간만 들이면 충분히 습득할 수 있는 내용이다. 이미 재능있고 관심있는 학생들은 중고등학생정도면 혼자서도 웬만한 모바일 앱이나 캐주얼 게임 정도는 쉽게 만들고 있다. 앞으로는 컴공입학생 대부분이 적어도 입학전에 몇년 정도는 컴퓨터 프로그래밍을 경험해서 대학교 입학해서 처음 프로그래밍을 배운 4학년 학생들보다 더 프로그래밍에 능숙한 학생이 대부분이 될 것이다.
이런 코딩 조기교육은 다른 조기교육과 마찬가지로 좋은 점도 나쁜 점도 있다. 같은 초등학생도 수학이나 운동이나 음악 등에서 개인의 성취정도 차가 매우 큰 것처럼 코딩도 개인차가 매우 크다. 수학도 초등학교 3학년에 고교수학 정석 수준을 끝내고 나중에 수학올림픽에 나가는 학생도 있고 고등학교를 졸업하고도 분수셈도 어려워하는 학생도 있다. 11살에 바둑 프로에 입단을 하는 천재도 있고 평생 5급 바둑을 벗어나지 못하는 사람도 많다. 재능과 흥미가 있는 학생이면 초등학생이라도 책과 컴퓨터만 가지고도 남이 가르치지 않아도 자기 스스로 공부해서 간단한 게임 정도는 충분히 만들 수 있다. 이런 학생 들은 조기교육은 호랑이에게 날개를 달아 주는 격이지만 반면 재능이 없는 학생에게는 억지 조기교육은 수학과 마찬가지로 재미없고 지루해서 컴퓨터에 대한 공포심이나 반감만 갖게 할 따름이다. 또한 코딩은 '''실패'''가 잦을 수 밖에 없는데, 이 점은 '''학습된 무기력'''으로 이어지기 아주 좋은 과목이라서 자괴감만 들게 한다. 당장 앞에서도 말했듯이 '''전공자들'''도 코딩에 대해 좌절을 현재진행으로 맛보고있다. 이 문제에 관해선 버그 문서로.
이런 코딩교육의 목표는 꼭 컴퓨터나 프로그래밍 언어로만 할 수 있는 건 아니다. 코딩으로 땅콩 샌드위치 만들기처럼 크고 복잡한 문제를 작고 간단해서 모호함 없이 바로 실행할 수 있는 요소로 분해하고 순서대로 나열하고 조합하고 엄밀하게 기술하여 아빠로 하여금 땅콩샌드위치를 만들게 하는 과정을 가르치는 방법이야 말로 코딩교육이 가르치고자 하는 핵심요소를 담고 있다.[9] 아빠 대신 로봇 팔이 그런 역할을 하게하면 그게 바로 산업현장에서 쓰이는 로봇 프로그래밍이다.
실제로 레고가 이를 위해서 마인드스톰 외에 초보를 위한 단순 코딩 제품을 출시했다. 교육용 스마트 로봇을 코딩으로 움직여 조종하는 교육은 학생들의 흥미를 유지하고 코딩의 기초를 가르치는데 매우 좋은 방법이라 여러 기관에서 이를 시도하고 있다. 그리고 이런 로봇이나 레고 마인드 스톰 자체도 실제 기계 로봇이 아닌 컴퓨터 화면에서 움직일 수 있는 가상의 로봇이나 가상의 마인드 스톰 시뮬레이터가 있기 때문에 비싼 로봇을 학교에서 보유하지 않더라도 그런 로봇 프로그래밍을 교육하거나 연습할 수 있다. 이로써 로봇 코딩의 비용의 문제나 유지보수 문제를 해결 할 수 있다.
또 이런 코딩 교육의 일환으로 간단한 게임 제작을 가르치는 경우도 있다. 예를 들어 Pong이나 벽돌깨기 스페이스 인베이더 수준의 극히 간단한 게임은 아이들도 이미 잘알고 있으므로 그걸 구현해보는 것은 아이들에게도 흥미로운 경험이 되고 좌절하지 않고 흥미를 유지하기 쉽다. 또 보기엔 간단해 보이지만 좌표 처리 실시간 화면 표시 입력 처리 게임논리 등 게임제작의 이해에 필요한 뼈대는 모두 가지고 있어서 실질적 교육효과도 크다.
이런 코딩 교육에 대해 학교에서 주에 1시간 정도 연간 30여 시간 가르치는 정도 외에 따로 학원이나 개인교습 같은 과외가 필요한 가하는 것은 개인에 따라 차이가 크다. 예를 들어 음악이나 미술 체육 교육 에서는 음악 미술 체육 대학을 진학하고 이를 직업으로 삼으려면 현재는 중고등학교 때 그런 음악 미술 학원이나 과외는 거의 필수 적인 것으로 여겨지고 있다. 아마 코딩도 같은 길을 갈 확률이 높다. 즉 나중에 코딩을 직업으로 삼는 전문가 들은 대부분 어릴 때부터 코딩을 전문가 들로 부터 전문적으로 배운 사람들이 하게 될 것이고 해당 대학 등의 정규 과정을 거치지 않은 사람은 마치 음악/미술대학 출신이 아닌 음악가/미술가 처럼 경력에 상당히 불이익을 받을 가능성이 있다. 하지만 단지 아이의 교양을 늘리거나 체력을 키울 의도로 피아노 학원이나 태권도 학원에 보내는 정도라면 굳이 현단계에서 코딩을 배우는 데 학원을 보내야 하는 지는 아직은 시기상조라고 보인다. 아이가 코딩에 흥미를 보인다면 그냥 태권도 학원 보내는 정도로 가벼운 마음으로 보내는 정도가 적당할 것이다.
프로그래밍 직업인을 양성하는 것은 현재 학교에서 실시하는 코딩 교육은 턱도없이 부족한 맛보기 정도 밖에 되지 않으니 만약 프로그래밍이나 이와 유사한 기술 전문으로 하는 직업인으로서의 소양을 양성하려면 중학교 정도에서 진로를 정하고 최소한 학원이나 전문교습을 받거나 특별활동으로 컴퓨터 동아리 등을 통해 전문적인 프로그래밍을 익히는 것이 좋다. 프로그래밍도 수학이나 음악처럼 일찍 시작하는게 크게 유리한 기술중에 하나이다. 가끔 큰 해킹사고를 일으킨 범인을 잡고보니 중고등학생이었다는 보도가 나올만큼 이분야도 일찍부터 재능이 개화하는 과목이다. 그래서 영재학교나 과학고 같은 데서는 코딩은 일찍부터 가르치는게 타당하다. 프로 축구선수로 성공하려면 최소 중고등학교 때 학교 축구부 선수는 해야하는 거나 마찬가지다.
더나아가 미래에는 마치 스포츠나 음악 등의 분야에도 유소년 클럽이나 컨서버터리가 있듯이 직업적 프로그래밍도 재능이 있는 학생을 선발해서 일반 중고등 학교 공부와 병행해서 전문적인 교사 아래에서 체계적으로 실전적 프로그래밍 교육을 시키는 교육과정이 등장하게 될 것이다.

3. 자동차튜닝 중 하나


자동차의 튜닝 중 하나로서, 자동차 안에서 비활성화된 기능들을 살려내는 것을 의미한다.
자동차 브랜드들은 하나의 자동차를 만들어서 전세계로 수출하게 되는데, 각 국가별로 규정이나 규제, 또는 국가별 필요에 따라 특정 기능을 살리거나 비활성화시켜야 할 경우가 많다.
그러다보니 자동차 업체들은 자신들이 차를 판매하는 국가와 관련되어 있는 대부분의 기능들을 미리 컴퓨터에 입력시켜 놓은 후, 각 국가별 필요에 맞춰서 기능들을 비활성화시킨 후 자동차를 판매하게 된다. 코딩은 이런 식으로 비활성화된 기능들을 다시 살려내 사용할 수 있도록 활성화시키는 튜닝을 의미한다.
따로 부품을 살 필요 없이 컴퓨터와 OBD2 케이블과 프로그램만 있으면 상대적으로 쉽게 할 수 있는 튜닝 중 하나이며 옵션을 추가하거나 특정 옵션이 있는 트림을 구매하는 돈에 비해 저렴하다 보니 만족도가 높은 편이다.
예를 들면 BMW의 잠금시 사이드미러 접힘 시간을 줄인다던가[10] BMW M 로고를 계기판이나 아이드라이브에 시동시 띄우거나 변수를 바꿔 편의기능으로 활성화한다
또한 더욱 더 어려운방법으로는 차량 첫 출고때부터 해당기능의 주요 부품이 장착되어있거나 없어도 간단 설치로 호환이 된다면 해당 스위치나 부품을 구매하여 장착후 다른차량의 기능인증서(FSC)를 추출해 임의적으로 삽입하여 넣기도 한다 그런식으로 하는것을 “VO코딩” 또는 “레트로핏(Retrofit)” 이라한다
이베이 등지에서 1만원 ~ 2만원사이에 FSC 인증서을 구매해 Apple CarPlay 를 활성화 하거나 Android Auto 를 활성화 하거나[11]
다른차에서 추출한 인증서를 임의로 삽입하여 인식하게 하는 방식이 있다[12] 또한 제조사에서도 제조사 수리용 프로그램을 실행하면 강제 활성된 기능을 자동 해제하긴 하지만 이베이에서 1~3만원 사이에 리얼 인증서를 구해 넣는다면 그마저도 해제되지 않는다
자동차 코딩이 활성화된 차량 브랜드로는 주로 BMW가 널리 알려져 있으나, 아우디토요타와 같은 다른 회사들의 차량에서도 어느 정도 코딩이 가능한 것으로 알려져 있다.

4. 같이 보기



[1] 보통은 코딩을 위한 전용 프로그램인 IDE를 사용하는데 그 이유는 단지 메모장보다 더 편리하기 때문이다.[2] 이런 것을 손코딩이라고 부른다. 개발자로 취업을 하기 위해 면접을 본다면 손코딩을 하게 될지도 모른다.[3] 이것을 요구사항(requirements)이라고 부른다.[4] 이 과정을 컴파일(compile)이라고 한다. 단순한 텍스트 파일을 프로그램으로 바꾸어 주는 과정이다.[5] 이것들을 에러(error) 또는 오류라고 부른다. 전자는 에러 중에서도 특별히 컴파일 에러(compile error)라고 부르고, 후자는 런타임 에러(runtime error)라고 부른다. 컴파일 중에 에러가 발생하는지, 실행 중에 에러가 발생하는지에 따라 달라진다.[6] 이것을 버그(bug)라고 부른다.[7] 이 과정을 디버깅(debugging)이라고 부른다.[8] 하지만 수학이 그렇듯이 컴퓨터과학의 지식 대부분은 개념이나 논리에 가까운 것이기 때문에 시대가 지난다고 해서 크게 바뀌지는 않는다. 단 윈도우용 프로그램, 안드로이드나 iOS용 앱 등 특정한 플랫폼에서 돌아가는 앱이나 프로그램을 만드는 법은 매우 자주 바뀌는 편이다. 따라서 코딩을 배울 때 썼던 방법을 나중에 그대로 써먹지는 않을거다. 그러나 컴퓨터 과학의 개념들이나 문제 해결 방법들은 수학처럼 죽을 때까지 써먹을 수 있다.[9] 실제 코딩마냥 이 비유에서도 자식(입력값)에 따라 아빠(출력값)가 실수를 자주 범한다.[10] 기존은 3초이상 눌러줘야지 실행된다[11] 그마저도 제공되는 툴로 클릭 몇번 하면 활성화 된다[12] 주로 차선이탈방지 나 전방충돌경고등 고급기능을 많이 활성화 한다