- 소프트웨어란 무엇인가? 와 코딩과 프로그래밍의 차이를 설명
- 왜 코딩(프로그래밍) 이 어려운지 알아보고, 논리적으로 컴퓨터가 일하는 방식 이해
지난 시간에 이어 두 번째 시간으로, 이번 시간에는 소프트웨어가 무엇이고, 코딩과 프로그래밍의 차이점을 조금이라도 이해하고, 나를 포함한 처음 파이썬을 접하는 분들이 어떠한 포지션으로 접근할 것인지 미리 파악하고, 최종적으로 어디까지를 목표로 할 것인지를 어느 정도 고민하면 좋을 것 같아 이번 강좌를 준비한다.
저는 앞장에서도 이야기했듯이 새로운 분야에 대한 호기심과 몇몇 가지 개인적으로 필요한 소프트웨어를 개발하기 위해서 다른 개발 언어보다 접근하기 쉽고, 많은 정보와 워크프레임을 제공하는 파이썬을 선택한 것이다.
여러분들도 여러분들 나름대로의 이유로 시작하려고, 이 블로그를 찾았을 것이라 생각하지만, 많은 분들이 이미 개념을 가졌으리라 생각하지만, 그래도 몇몇 단어가 생소하거나, 어떤 차이가 있는지 구분이 필요한 분이 있을 것이다.
소프트웨어란 무엇인가?
소프트웨어라는 단어는 정말 많이 들어봤는데, 명확하게 정의하라면 잘 못하는 경우가 많을 정도로 너무나 우리 주위에 많이 있고, 우리는 하루에도 몇 번씩 소프트웨어를 사용한다.
소프트웨어는 쉽게, 컴퓨터 시스템에서 실행되는 프로그램과 그 프로그램에 사용되는 데이터, 그리고 프로그램과 시스템에 결합하는 인터페이스(API)를 포함하는 광범위한 개념이다. 즉, 특정한 목적으로 개발된 프로그램으로 컴퓨터에게 일을 시키는 목적을 띄고 있는 것이 소프트웨어라고 생각하면 될 것 같다.
우리는 소프트웨어의 시대에 살고 있다고 해도 과언이 아니다. 아침에 일어나서부터, 휴대폰을 통해 각종 뉴스, 영상 미디어 등 다양한 정보를 접하고, 학교나 사무실에서는 컴퓨터를 이용한 각종 문서작업등을 수행하고, 메신저나 SNS를 통해서 서로의 안부를 전하고 있다.
이렇게 컴퓨터나 스마트폰뿐만 아니라, 자동차, 생활가전, 금융, 농업, 산업시설등 거의 모든 분야에 다양한 프로그램이 사용되고 있고, 이러한 소프트웨어는 코딩(프로그래밍)을 통해 완성된, 결과물이라고 볼 수 있다.
코딩이란?
코딩은 기본적으로 컴퓨터가 이해할 수 있는 언어로 컴퓨터에게 일을 시키기 위한 과정을 뜻하는 말로, 컴퓨터가 알아보고 일을 할 수 있도록, 사람이 작성하는 명령어 코드를 작성하는 것이다.
쉽게 우리나라 사람이 외국사람과 대화를 할 때, 각국의 말로만 하면 서로 알아들을 수 없고, 잘하던 못하던 서로의 국가 언어를 사용해야 알아들을 수 있듯이, 컴퓨터도 마찬가지로 컴퓨터가 알 수 있도록 하기 위해서 Python, Java, C/C++ 등과 같은 프로그래밍 언어를 이용해서 인간의 언어로 되어있지만, 컴퓨터가 이해하고 수해할 수 있도록 해주는 일련의 명령입력 과정을 말한다.
프로그래밍 이란?
단순하게 생각하면 코딩과 프로그래밍은 같다고 볼 수 있지만, 프로그래밍은 코딩을 포함하는 더 광범위한 범위의 개념을 가지고 있다.
단순히 컴퓨터가 일을 할 수 있도록 코드를 작성하는 것이 코딩이라면, 프로그래밍은 프로그램(소프트웨어)을 설계하고, 문제를 해결하는 기능을 구현하기 위해 알고리즘을 설계하고, 작성한 코드가 효율적으로 동작하고, 유지/보수하기 쉽도록 설계하는 과정이 포함되어 있다는 의미이다.
또한, 컴퓨터가 사람이 작성한 코드를 이해하고, 그에 따라 일을 잘할 수 있도록 하기 위해서는 논리적인 사고와 문제 해결 능력이 코딩/프로그래밍에서는 필요한 사항이다.
프로그래밍의 과정은 우선, 해결해야 할 문제나 구현해야 할 기능을 명확하게 정의하고(문제 정의), 문제를 해결하기 위한 절차를 논리적으로 계획을 수립한 후(알고리즘 설계), 설계한 알고리즘을 토대로 프로그래밍 언어로 컴퓨터가 이해할 수 있는 형태로 코드를 작성(코딩)하고 또는 하는 도중에 작성한 코드가 올바르게 동작하는지 확인하고, 오류를 수정(데스트 및 디버깅)을 통해 완전한 하나의 소프트웨어를 빌드업한다.
마지막으로, 소프트웨어도 사람이 만드는 것이기 때문에 완벽하지 않기 ㄸ문에 운영 중에도 계속해서 올바르게 작성할 수 있도록 유지/보수가 필요하고, 계속적인 업데이트를 통해 조금 더 완벽한 프로그램으로 완성해 과정을 우리는 프로그래밍이라 할 수 있다.
코딩과 프로그램을 건축에 비유한다면, 프로그래밍은 건물 전체를 설계하고, 건축 과정 전체를 관리하는 것이라면, 코딩은 건축에 필요한 벽돌이나, 각종 자제나 인테리어 소품 등을 만든 부분이라고 볼 수 있다.
코딩이 어려운 이유?
일단, 기본적으로 영어를 사용해야 한다.
거의 모든 프로그래밍 언어가 기본적으로 영어 문법으로 되어 있으며, 대부분 유명한 개발자 커뮤니티도 영어권 커뮤니티가 많고, 새로운 기술등을 소개하는 것도 영문 사이트가 대부분이기 때문에, 가능하면 영어는 기본적으로 조금 할 수 있어야 하는 분야이다.
또한, 각각의 언어에서 사용하는 코딩 문법도 영어로 되어 있고, 문법의 흐름을 적절하게 공부해야 할 것도 적지 않고, 모든 코딩을 영문 타이핑 형태로 이루어지기 때문에, 영문 타이핑 연습도 많이 필요하고, 컴퓨터에 일을 시키기 위한 모든 과정을 하나하나 자세하고, 세세하게 사람이 직접 지시해야 하는 부분에서 많은 어려움을 느끼게 된다.
많은 분들이 어려하는 내용을 조금 세세하게 풀어보면 다음과 같다.
1. 새로운 사고방식을 요구하는 것이 코딩으로, 우리가 일상에서 사용하는 사고방식은 배제하고, 중요하고 프로세스적인 사고 즉, 논리적인 사고를 기반으로 어떤 문제를 구분하고, 그것을 처리하기 위해 노력하는 것을 계획하고 그것을 코드로 풀어야 하는 부분에서 많은 어려움을 느끼는데, 이것을 컴퓨터적인 사고에 대한 훈련이 어느 정도 필요하다.
어떤 문제를 풀어가는 과정을 컴퓨터적인 사고를 도입하고, 나름대로의 워크플로우를 작성하는 연습 해보면 도움이 될 것이다.
2. 앞에서도 언급했지만, 프로그래밍 언어의 문법을 공부해야 한다는 것에 상당한 부담을 가지고 있는 경우가 많은데, 이것은 우리가 나른 나라의 언어를 공부하는 것과 같이 기본 문법부터 흐름을 익히듯, 프로그래밍 언어도 기본적인 문법을 어느 정도는 알아야 하고, 각각의 흐름이나 규칙/규정을 이해하고 준수해야 하는데에서 어려움을 느낀다.
그것은 흐름만 이해하고, 많은 반복과 연습, 실제 작업을 통해, 익숙해지게끔 만드는 것이 만드는 것이 중요한 포인트이며, 중요한 몇몇 가지는 외워서 사용하지만, 대부분은 흐름만을 이해하고, 필요한 부분은 검색을 통해서 처리하는 경우가 많다.
3. 오류 처리 및 문제가 발생하면, 초보자들은 대부분은 가슴 철렁한 경우가 많이 있겠지만, 실제 코딩에서는 단순한 문자 오류나 구문 오류, 시스템 오류등 다양한 오류를 만나게 되는데, 많은 사람들이 오류를 낯설고 이해하기 어려워하는 경우가 많다.
이러한 오류는 당연하다고 받아들이고, 혼자 해결하려고 고민할 것 없이 나타나는 오류 메시지를 각종 커뮤니티에서 도움을 얻는 것도 하나의 방법이기 때문에, 적극적으로 오류를 해결하려고 노력하고, 오류에 겁먹을 필요 없이 과감하게 해보고 싶은 코딩하는 방향으로 진행하는 것을 추천한다. 어차피 지금은 오류가 발생해도 시간적으로는 조금 손해가 발생하겠지만, 금전적으로 물리적으로 손해 볼 것 없기 때문이다.ㅎ
4. 코딩에서는 종종 데이터 구조나 자료 구조와 같은 수학적인 개념이나, 컴퓨터 메모리 관리 개념, 인문학적 개념등 추상적인을 필요로 하는 부분이 많은데, 이러한 개념은 눈에 보이는 것도 보이지 않는 것도 있기 때문에 쉽게 이해하기 어려운 부분이 많이 있다.
결론적으로는 코딩이 어럽다고 느끼는 것이, 인간과 컴퓨터라는 기계에서 발생하는 괴리에서 발생하는 것으로, 두 눈 딱 감고 "내가 이기나, 네가 이기나 한번 붙어보자"라는 식의 용기와 절대 포기하지 않고 끝을 본다라는 것이 정말 필요한 부분이고, 작은 성취의 기쁨을 통해 더 큰 성과를 거두는 기쁨까지 누릴 수 있도록 하는 것이 중요한 것 같다.
컴퓨터가 일하는 방식
컴퓨터는 개떡같이 말해도, 찰떡같이 알아듣는 존재가 아니다.
적극적으로 스스로 생하지 않고, 오르지 시키는 것만 하는 기계이다.
그러므로, 일을 잘하는 컴퓨터 또는 소프트웨어를 만들고자 한다면, 컴퓨터가 일을 잘할 수 있도록 논리적이고 일목요연하게 잘 설명해줘야 한다.
예를 들어, 게시판을 개발해서 운영하고자 하는데, 사람들이 관심 있어하는 글을 게시판 상단으로 게시글을 올리는 기능을 부여하겠도 가정해 보자.
"인기가 급격하게 늘어나는 글을 선정하여 상단으로 이동한다."
위의 내용으로는 사람은 이해할 수 있지만, 컴퓨터는 이러한 내용을 이해하지 못하고, 이러한 내용으로는 코딩으로 할 수 없다.
여기서 "인기가 급격하게 늘어난다"라는 것에 대한 범위와 한계가 불확실하고, 부정확한 내용이기 때문에, 프로그래머라면 "인기가 늘어난다"라는 것에 대한 명확하고 정확한 판단 기준 또는 근거를 마련한 후, 코딩해야 한다.
그러면, 우리는 코딩할 때, 어떻게 논리적인 방식으로 판단의 근거를 마련해야 할까?
"최근 12시간 동안, 좋아요 수가 50개 이상 늘어난 글을 게시판 상단으로 이동하며, 실시간 또는 매시간마다 업데이트한다."
위와 같이 명확한 방식으로 정의하고, 코딩을 진행하면, 논리적 구조와 흐름을 파악하고 손쉽게 코딩할 수 있고, 컴퓨터도 명확한 기준을 토대로 일을 무리 없이 수행할 수 있다.
이와 같이 코딩을 위해서는 논리적 사고와 컴퓨터적인 흐름을 파악하고 이를 설계하는 능력이 필요한 분야이고, 복잡한 동작을 어떻게 구조적으로 잘 설명하고 구현할 수 있는지의 능력이 굉장히 중요한 분야이기도 한다.
코딩은 절대 만만한 작업도 아니며, 만만한 직업도 아니지만, 정상적으로 프로그래밍했다면, 컴퓨터 프로그램은 주어진 일을 엄청나게 빠른 속도로, 실수 없이(휴먼 에러는 있을 수 있음.ㅋ), 쉬는 시간 없이 맡은 일을 처리하게 된다.
사람은 먹여주고, 돈도 주고, 술도 사줘야 하고, 컨디션에 따라 배 째라 할 수 있지만, 컴퓨터는 전원만 끊김 없이 주면 프로그램은 항상 같은 결과를 보여주는 엄청 일 잘하는 기계가 된다.