Home 프로그래밍을 공부하는 방법론
Post
Cancel

프로그래밍을 공부하는 방법론

최근 4차 산업혁명에 대한 ‘붐’ 이 불면서, 이곳 저곳에서 프로그래밍을 배워보려는데, 어떻게 시작해야되는지 물어보는 사람이 많아졌다.

회사에서도 타 부서 사람이 소프트웨어 공부는 어떻게 해야되냐는 등..

따라서 필자는 어떻게 소프트웨어를 공부했는지, 그 개인적인 방법에 대해 얘기해보고자 한다.


어떤 언어를 공부해야 하는가?

우리는 프로그래밍(코딩)을 ‘언어’ 라고 칭한다.

언어?

한국어, 영어, 독일어, 중국어, 일본어..

모두 언어이다.

이와 똑같이 C, C++, 파이썬, Java .. 이 모두를 우리는 프로그래밍 언어라고 부른다.

그럼 이 중 어떤걸 공부해야 하는가에 대한 답은 딱히 정해져있지 않다.

취업을 목적으로 본다면, 대한민국에서 가장 많은 개발 수요량은 Java이다. 웹, 모바일 등 갈 수 있는 곳이 많다. 다른 말로 해당 언어를 공부하는 개발자 지망생도 많다.

미래지향적인 측면에서 파이썬도 좋은 선택지이다. 최근 필자가 졸업한 학교도 그렇고, 코딩의 시작이 과거 C였던것에 비해, 요즘은 파이썬으로 첫 코딩을 시작하는 곳도 많아졌다. 아직까지 수요가 많진 않지만, 외국 사례로 봤을 때 파이썬 개발자에 대한 수요량은 점점 늘어날 것으로 예상된다.

과거부터 지금까지 코딩에 있어 기본이라 알고 있는 C언어도 있다. C, C++, MFC 등, 과거에 비해 점점 사장되어 가는 언어라고 하지만, 현업에선 아직까지도 C언어는 기본으로 꼽힌다. 개인적으로 느낀 바는 통칭 C언어 개발자는 타 언어에 비해 몸값이 높은 것 같기도..

취업과 소득 측면에서 바라보면 위와 같지만, 결국 필자가 느낀바는 아무 언어든 하나를 배우면 다른 하나는 비교적 쉽게 배울 수 있다는 것이다. C언어를 배우면 기본적으로 입출력을 배우고, 조건문을 배우며, 반복문을 배운다. JAVA라고 다를까?

사용되는 단어만 바뀔 뿐 기본적인 구조는 모두 동일한 것이다.


프로그래밍 언어를 공부하는 방법?

예를 들어 영어를 보자. 우리는 학교다닐 때 영어 수업을 하면, 기본적으로 단어를 외우고, 문법을 공부했으며, 독해력을 길렀다.

프로그래밍 언어도 마찬가지다. 딱히 단어랄 것은 없지만 기본적으로 코드를 보기 위해서 어느정도 문법은 알고 있어야한다. 어떤게 입출력문인지, 어느 부분이 반복문인지, 어디가 조건문인지, 이 정도만 알고 있다면 기본적인 코드를 보는 것(독해)은 문제가 되지 않는다. 독해를 하다 보면, 이제 스피킹을 하고, 작문을 공부하는데, 마찬가지로 코딩도 남이 짜논 코드를 보는 것을 독해라 하면, 자신만의 프로그램을 만드는 것은 작문이며, 스피킹이다.

하지만 우리가 문법만 안다고 긴 영문을 읽고 쓸 수 없는 것 처럼, 어느 정도의 단어도 필요한데, 이러한 단어를 필자는 함수 또는 변수라고 생각한다.

필수적인 함수들.. 예를 들어 printf 또는 변수(int, bool, char 등)는 알 수 있지만 처음 보는 함수(ex. SubClassGetDlgItem)나 변수들(HINSTANCE, LPARAM …)은 알 수 없다. 이건 어느 누구나 마찬가지다. 개발을 업으로 10년 이상 한 사람도 언제나 옆에 MSDN은 띄워두고 진행하니까..

영문을 읽다가 모르는 단어가 나오면 찾아보는 것 처럼, 코딩도 하다가 모르면 찾아보는 것이 필수적이다. 개발자들은 흔히 이런 것을 구글링이라 표현한다.

대한민국이 IT 강국이라 하지만, 프로그래밍에 있어 대부분의 정보는 영문으로 작성되어 있다. 따라서 가급적 네이버, 다음 등의 포털을 사용하는 것 보다 영문 사이트를 보다 다양하게 제공하는 구글을 통해 검색하는 것이 효과적이다.

특히, 모른다고 네이버 지식인에 물어보지말고.. 간단한건 구글링, 그래도 모르면 StackOverflow에 물어보길 추천한다.. 스택오버플로는 소프트웨어하는 사람들이 사용하는 가장 유명한 사이트 중 하나이다. 물론 영어로 물어봐야 알려준다.

이래서 영어를 잘하는 것은 코딩에 아주 큰 도움이 된다


구체적인 공부법

앞서 구글링에 대하여 서술한 것처럼, 소프트웨어를 함에 있어 절반은 구글링이라 생각한다.

세상 모든 문법을 알고 있는 개발자는 없을 것이며(있어도 극 소수겠지..) 일반적으로 본인이 사용하는 언어에서 본인이 자주 접하는 단어들을 가지고 써논 글이 프로그램이니까..


공부안은 C언어를 기준으로 적겠지만, 사실 다른 언어라고 다르지 않을 것이다.

본인이 집에 책이 있다면, 책 한권으로 시작해도 좋고, 요즘같이 인터넷이 발달한 상황에 C언어 문법이라는 기본 키워드로 구글링해보면 수백개의 글이 검색된다. 이 중 하나의 사이트 또는 커리큘럼을 잡고 자신이 공부해도 무관하다.

핵심은 대략적인 문법을 보는 것이다. if-else 문을 어떻게 쓰는지, 변수가 뭔지..

가장 난해하다고 알려진 문법, 포인터가 뭔지.

처음부터 깊게 이해할 필요가 없다. 포인터? 아~ 문법에 따르면 우리가 변수를 만들면 그게 메모리에 로드되는구나. 메모리에 그 데이터가 어디에 있는지 주소를 가리키는게 포인터네?

이 정도면 충분하다.

처음부터 문법을 마스터하겠다고 해봤자 언어의 문법은 겉핥기일 뿐, 좀 더 깊게 들어갈 경우 본인은 컴파일러, 커널 단까지 공부해야 할거니까.. 끝도 없다.


대략적인 문법을 공부했다면 인터넷 아무 곳에서나 구할 수 있는 오픈소스, 즉 남이 짜놓은 코드를 많이 보는걸 추천한다. 이걸 보면서 이해가 안되는 부분을 찾아보고, 그러면서 대략적으로만 알고 있던 문법이 코드상에서 어떻게 쓰이는지 볼 수도 있고, 모르는 것은 말했던 구글링을 해보며 알아갈 수 있다.

여담으로, 필자는 학부생 시절 CodeProject 라는 사이트를 이용했고, 해당 사이트와 더불어 아파치 톰캣 소스를 분석해본 적이 있다.(CodeProject는 개발자들이 애용하는 사이트 중 하나이다.)

최근 바이러스 이슈가 일부 발생하여 해당 사이트는 권장하지 않는다.

오픈 소스를 처음에는 그냥 보기만하면서 문법과 단어들이 어떻게 쓰이는지, 코드가 처음부터 끝까지 어떤 순서로 진행되는지 등을 파악하고, 그 다음부터 자신이 코드 상 일부 값들을 바꿔보거나 일부 함수들을 변경해보면서 결과가 동일하게 나오는지, 또는 결과가 다르게 나오면 그 이유는 무엇인지를 알아보는게 좋다. 쉽게말해 자신이 변경된 부분이 소스 어느 부분에 영향을 끼치는지 알아보라는 것이다.

이 과정에서 필요한 것이 디버깅이다. 개인적으로 코딩을 잘 하는 부류 중 하나는 디버깅을 잘 하는 사람이라 생각한다.


마지막으로 이러한 과정을 거치던 또는 자신이 어느정도 코딩에 대해 기본적인 개론은 알고 있다고 생각될 경우, 자신만을 위한 프로그램을 개발해 보길 추천한다.

현재 자신이 가장 필요한 것을 생각해보고, 그 것을 위한 프로그램을 개발하든 또는 자신이 자주 사용하는 프로그램 중 어떤 기능이 부족하다고 생각할 경우 그 기능을 추가한 프로그램을 만들어보자.

하다못해, 자신이 쓰고 있는 프로그램과 최대한 유사한 프로그램을 만들어보자.

어느정도 C언어를 개발해본 사람들은 알겠지만, 독자들이 사용하는 기능들 중 당연하다고 생각되는 것들이 소스 상으로 얼마나 많은 구현이 필요한지.. 직접 경험해본 사람은 이해할 것이다..

필자를 예로 들면, 해외 직구를 처음해보고 그 기대감에 유니패스를 일과 중 10분마다 새로고침하는 나를 보며, 특정 사이트를 크롤링해 관세 또는 배송이 변경될 경우 자동으로 윈도우 알림을 띄워주는 것도 개발해보고,

로스트아크를 하면서 많은 숙제 사이트 중 내가 원하는 기능들만을 포함하는 나를 위한 프로그램도 개발했다.

또는 회사에서 특정 데이터를 취합하는 과정에 그 반복된 노가다가 너무 귀찮아서 자동으로 해주는 프로그램을 만든 적도 있다.

이 모든건 결과적으로 편의성을 위함이 아닐까?

일반적인 사람들은 편의를 위해 특정 기능이 포함된 프로그램을 사용하겠지만, 개발자가 가지는 장점은 그 기능을 나에게 최적화하여 사용할 수 있다는 것이라 생각한다.

본인에게 느껴지는 사소한 불편함을 수용하는 것보다 그것을 개선하기 위한 방법을 생각해보자.

필자는 그것이 프로그램 개발 능력을 향상시킴에 있어 가장 좋은 방법이라 생각한다. 결국 자신을 위한 프로그램도 작문이고, 그 것을 위해 수 많은 구글링을 해야할 것이고,

개발을 끝내놓고 몇 달 지나 수정을 좀 하고 싶은데, 자신이 짜놓고도 알아볼 수 없는 코드를 보며, 아 다음에는 다르게 짜야겠구나 하는 교훈도 얻게 될 것이다.


좋은 코드란?

코딩을 잘 한다 라는 것은 사람마다 생각하기 나름일 것이다.

필자가 생각하는 좋은 코딩이란 2가지이다.

첫째로 보기 좋은 코드이다. 보기 좋은 코드는 남이 봤을 때 이해하기 쉬워서 좋은 것이다. 이게 왜 중요하냐 생각해본다면, 현업에서 코딩을 하다보면 커다란 프로그램을 만들기 위해 각 사람들이 부분 부분 담당을 하여 개발하는 경우가 많다. 모듈 개발이라고 한다..

모듈을 개발하는데 자신만 알아보게 코딩하면 해당 코드는 가독성도 떨어지고, 타 코드들과 결합시 문제가 생겨도 해당 부분에 대한 버그 수정이 어렵다. 그리고 결과적으로 자신이 그 프로젝트를 끝까지 책임지지 않는 이상 해당 모듈에 대한 유지보수도 시간적 비용이 많이 들어간다.

개발은 결코 혼자 하는 작품이 아니라는 점에서 봤을 때 구조적으로 좋은 코드를 짜는 것은 큰 장점이라 생각한다.

그래서 꼭 디자인 패턴을 공부해 보길 강력하게 권장한다.


두번째로 중요한 점은, 필자가 개발을 꿈꾸는 사람들에게 가장 많이 해주는 말인데, 빠른 코드이다.

개발과 수학이 상관이 있냐고 물어보면, 어느정도 있다고 말한다.

예를 들어 1부터 100까지 더하는 프로그램을 보자.

일반적으로 for문을 통해 1부터 100까지 더하도록 구현할 것인데, 학교다닐 때 가우스 공식을 배운 사람이라면 n(n+1)/2 를 통해 계산할 것이다.

게임을 하다 렉이 걸리는 것, 게임을 하다 맵을 이동하는데 로딩 시간이 오래 걸리는 것, 동일한 그래픽의 게임처럼 보이는데 어떤 게임은 저사양에서도 잘 돌아가고, 어떤 게임은 고사양을 사용해도 렉이 걸리면 우리는 전자의 게임이 최적화가 잘 되었다고 말한다.

최적화가 잘 된 게임은 바로 위의 사례처럼 보다 효율적인 처리들이 이루어진 게임이라 할 수 있다.

개발을 하는 것은 누구나 할 수 있지만, 좋은 코드를 짜는 것은 항상 생각하고 자신이 만든 코드에서 보다 나은 개선점을 생각하는 자세를 가질 때 배양되는 능력일 것이다.

This post is licensed under CC BY 4.0 by the author.

쓰레드를 사용한 동기화 경험 (with. DLL)

DLL에서 데이터를 전달하는 방법 (Notify)