정보선생님 수아

진학특집) 프로그램은 어떻게 만드는 것일까? 본문

Information

진학특집) 프로그램은 어떻게 만드는 것일까?

정보선생님 수아 :D 2017.09.21 01:39

  본 게시물에서는 많은 학생들이 진학에 영향을 미치는 많은 요소 중 '프로젝트'에 대해 알아보는 시간을 갖도록 합니다.

  적지 않은 수의 학생들은 욕구에 의해 또는 필요에 의해 프로젝트를 진행해야 하는 일이 제법 있습니다. 그들의 프로그래밍 실력은 그렇게 높지 않았으며, 그런 학생들이 만드는 결과물은 결국 거기서 거기였습니다. 그런 다수의 학생들 중 일부는 강사인 제가 보기에도 그럴듯한 프로그램을 완성해 내곤 하는데, 그런 학생들은 과연 프로그램을 만드는 것에 어떻게 접근 하고 또 문제에 직면하면 어떻게 풀어내는지 잘하는 학생들의 공통점과 더불어 저의 노하우를 추가하여 본 포스팅에서 말씀드리는 시간을 갖겠습니다.




1. 프로그래밍(Programming)이란?

  프로그래밍은 컴퓨터 프로그래밍(Computer Programming)이라고도 하며, 하나 이상의 알고리즘과 프로그래밍 언어를 이용해 구체적인 컴퓨터 프로그램으로 구현하는 기술을 말합니다. ( 위키백과 바로가기 ) 프로그래밍은 기법, 과학, 수학, 공학적 속성들을 가지고 있습니다.

  

  결국 프로그래밍을 쉽게 풀어 말한다면, 본인이 생각한 모습대로 설계되어, 원하는 모양으로 동작하는 '무언가'를 만들기 위해 컴퓨터 언어라는 것을 이용하는 것을 의미한다고 할 수 있습니다. 그렇다면 이런 과정에서 가장 중요한 것은 무엇이고, 어떻게 접근해야 하는 것일까요?



2. 제대로 된 것과 아닌 것의 차이

  프로그램도 결국 사람이 만드는 것이기 때문에 제작하는 사람의 역량에 따라 차이가 월등히 날 수 있습니다. 같은 계산기 프로그램을 만들어도 충실한 기능을 가진 것과 그렇지 않은 것의 차이는 확연히 드러나는 법입니다. 그 차이는 결국 누가 보게 될까요? 네. 사용자가 보게 됩니다. 막상 제작한 사람은 자신의 프로그램이 어느 정도의 퀄리티인지 잘 보지 못합니다. 자신의 시간을 투자해서 '나름' 열심히 만들어 낸 결과물이기에 마냥 사랑스러울 수 있다는 것이죠.


( 사진 출처 : 바로가기 )


  그렇다면 우리는 프로그램을 제작할 때 어떤 것을 주요하게 생각해야 하는 것인지, 어떻게 하면 같은 시간을 투자하고 내가 원하는 목표에 조금 더 가까이 할 수 있는 지에 대해 생각해볼 필요가 있습니다. 


  지금부터 아래로 스크롤을 내리기 전에 만약 자신이 프로그램을 만든다면 어떤 것에 주안점을 두고 만들지 잠시 생각해보도록 하겠습니다.



<광고 보고 넘어하겠습니다.>

<광고가 끝났습니다>


< 프로그래밍 관련 툰 >





( 만화 출처 : 바로가기 )




자, 모두 생각해보셨나요? 그럼 이제부터 프로그래밍을 해야 할 때 중요하게 생각해야 하는 포인트를 하나하나 짚고 넘어 가겠습니다.



3. 프로그래밍을 할 때 생각해야 할 것들

- 목표에 대한 이해

  당연히 많은 학생들이 생각하기에 '목표'가 있어야 계획을 할 수 있으니 그렇다 치지만 '이해'라는 부분에서 조금 의아한 부분이 있을 것이라 생각합니다. 많은 학생들이 프로젝트를 진행할 때 '당연히 목표를 생각했으면 그에 대한 이해도 다 한 것 아닌가?'라고 생각합니다. 하지만 그것은 실제와 다르며, 나아가 프로그래밍이라는 분야에서는 그런 오해가 조금 더 많이 발생하곤 합니다. 생각하는 방법과 프로그램의 구동 성격이 서로 다르기 때문입니다. 


  예를 들어 우리가 거실에 있는 테이블 위에 있는 사과를 먹겠다 라는 동작을 생각해 보도록 하겠습니다. 일반적으로 우리는 '거실에 우선 가서 테이블에 있는 사과를 집어 먹는다.'라는 동작을 생각하면 충분하다고 생각하기 쉽습니다. 그렇다면 같은 주제로 프로그래밍은 어떻게 해야 제대로 된 동작을 하게 될까요?

  우선 자신이 어디에 위치해 있는지 알아야 합니다. 경로를 파악해야 하기 때문입니다. 가는 길에 문이 닫혀 있다던가, 혹은 장애물이 길을 막고 있는지 모두 판단해야 합니다. 만약 가는 길에 문이 닫혀 있을 경우가 발생할 우려가 있다면 조건문(If문) 등을 이용해 조건을 만들어 주어야 합니다. '만약 문이 닫혀 있다면 열고 지나가라' 라는 식으로 말입니다. 아울러 목표한 장소에 도착해서도 사과가 있는지에 대한 여부, 앉아서 먹을 것인지 서서 먹을 것인지에 대한 여부 등 모든 예외 처리를 동반하여야 프로그램은 온전히 작동되어질 수 있습니다. 그렇기 때문에 프로그래밍은 우리가 생각했던 것보다 조금 더 세밀한 이해도가 필요한 것입니다.



- 사용 대상에 대한 이해

  우리는 프로그램을 기획할 때 많이 사용하는 단어가 있습니다. '모두' 그리고 '아무나'라는 단어입니다. 학생 저마다 생각하기에 첫 프로그램을 만들기 앞서 기대감은 하늘을 찌르곤 합니다. '내가 만든 프로그램을 많은 사람이 썼으면 좋겠어', '엄청 유명해지면 좋겠어'라는 식의 상상을 하곤 합니다. 그리고 그러한 기대감으로 만들어진 기획은 결국 그 누구도 만족하지 못하는 어중간한 프로그램이 되곤 했습니다. 



  사용 대상에 대한 이해라 함은 결국 프로그램이 향해야 하는 목표에 좀 더 집중 할 수 있게 해줌과 동시에 상대적으로 적은 자원으로 최적의 효율을 보여주는 방법이라 할 수 있습니다. 자바와 같은 언어를 서너달 배운 뒤에 할 수 있는 테크닉은 생각보다 적은 것이 사실입니다. 물론 그 기간을 더 늘린다고 해도 그만큼 실력이 향상되는 것은 아닙니다. 그렇기에, 자신의 프로그램-프로젝트-가 성공적으로 마무리 되기 위해서는 결국 자신이 가진 자원을 가장 효율적으로 사용해야 함을 강조하고 싶습니다.


  예를 들어 A라는 프로그램을 제작할 때 해당 프로그램을 사용하는 대상이 초, 중, 고등학생까지 다양하고 나아가 일반인도 사용할 수 있게끔 기획을 해서 제작한다면 그런 프로그램은 과연 우리 학생들이 제작할 수 있을까요? 그리고 설령 제작에 성공했다 한들 프로그램의 신뢰성이나 자신이 원하던 결과에 근접해 있을까요? 아닐 것 입니다. 하지만 같은 속성의 프로그램을 자신이 속한 중학생 혹은 고등학생으로 한정하고 제작한다면 이전보다 더욱 신뢰도 높은 프로그램이 제작될 것 입니다. 주변에 피드백을 해주거나 의견을 교류할 인원이 많기 때문입니다. 결국 제한된 자원, 시간, 실력으로 만들 수 있는 것은 무엇에 집중을 얼마나 하느냐에 따른 것이라 할 수 있습니다.



- 주먹구구식 개발 vs 계획적인 계발

  프로그램을 개발할 때 사용하는 방법은 개발하는 사람의 성격 만큼이나 다양합니다. 어떤 사람은 문제가 발생하면 그때 그때 업데이트 해가면서 하는 개발 방법을 사용하며, 또 어떤 사람은 전체적인 밑그림을 그리면서 완성도 있게 개발하는 사람들이 있습니다. 그렇다면 우리 학생들이 상대적으로 짧은 기간 동안 개발을 한다면 어떤 방법이 학생들에게 맞는 것일까요?




* 주먹구구식 개발의 장점과 단점

  주먹구구식 개발이라 함은 아주 작은 프로그램부터 시작해 필요한 기능을 하나하나 추가해 나가는 개발 방법입니다. 이 개발 방법은 현업에서는 그다지 추천하는 방법은 아닙니다. 후에 추가되는 기능과 현재의 기능에 대해 별도의 검증을 하거나 할 수 없기 때문에 프로그램의 신뢰도를 높일 수 없고, 나아가 개발했던 기능을 아예 백지화 시킬 우려도 있기 때문입니다. 나아가 추가해야 할 기능이 자신이 구현할 수 없는 정도의 난이도가 되면서 프로그램 자체가 망쳐지는 경우도 있습니다.


  그럼에도 주먹구구식 개발은 처음 개발하는 거의 모든 학생들이 사용하는 방법이기도 합니다. 왜냐하면 처음 개발하는 학생의 경우 자신이 무엇을 만들지 잘 모르기도 하고, 생각하는 범위가 작기 때문에 처음 기획을 하는 단계에서 완벽하다고 생각하고 시작을 했으나 후에 필요한 기능이 점점 더 생기면서 기능을 추가해야 하는 일이 생기기 때문입니다. (누구나 처음에는 계획적인 개발을 표방해 만들기 시작했으나 진행하면서 주먹구구식으로 바뀌는 경우가 대다수입니다.) 그럼에도 불구하고 주먹구구식 방법이 생각보다 처음 개발하는 학생들에게 좋은 이유는 아주 작은 기능이라 할지라도 무언가 자신이 만들어 냈다는 만족감에 그 다음 단계에 도전할 힘을 얻기 때문입니다. 물론 학생 본인의 성실함만 있다면 이 방법도 충분히 좋은 방법으로 사용될 수 있습니다.

  주먹구구식 개발은 1인 개발자 등 소규모의 개발팀에서도 충분히 사용할만큼 좋은 개발 방법이기도 합니다.(나중에 머리가 빵 터질 우려가 있어서 기피하는 것 뿐....)


* 계획적인 개발의 장점과 단점

  계획적인 개발이라 함은 자신이 만들고자 하는 프로그램의 밑그림을 그리고 생각한 모든 기능에 대해 프로그램 기획을 하는 것을 말합니다. 이 개발 방법은 자신이 목표로 하는 것을 분명하게 해주고, 필요한 기술을 사전에 조사함으로써 개발 중간에 자신의 실력으로 못 만들게 되는 불상사를 초기에 없앨 수 있다는 장점이 있습니다. 하지만 계획을 하는 단계에서 지나치게 크게 기획을 한다던가 반대로 자신의 실력을 믿지 못하고 지나치게 작은 프로그램을 기획하는 바람에 프로그램 답지 못한 프로그램이 만들어지곤 합니다. 


  계획적인 개발의 단점을 막기 위해서는 기획 단계에 시간을 충분히 할애하여 주제에 대해 충분한 조사를 하도록 하고, 자신이 추가하고자 하는 기능을 단계적으로 구성하여, 각 단계를 Step by Step 방법으로 단계를 지키며 개발하는 방법을 사용하는 것이 매우 중요합니다. 그렇게 만들게 된다면 개발 기간의 끝에서 만약 모든 기능을 추가할 수 없었다 하더라도 추후에 업데이트를 통해 나머지 기능을 추가할 수 있게 됩니다. 주먹구구식 개발과 다른 점이라면 자신이 추가하고자 하는 기능에 대한 밑 그림이 다른 기능과 밀접한 연관을 갖고 추가될 수 있다는 점이 다른 점입니다.



  프로그램의 개발은 생각보다 복잡하고 어려운 작업입니다. 저는 늘 학생들이 프로그램을 개발하고자 할 때 사전에 충분한 조사를 하고 프로그램 개발에 임하라고 하고 있습니다. 그 이유는 자신이 만들고자 하는 것에 대해 충분한 이해를 하지 않고 개발에 돌입하게 된 대부분의 학생들이 중간에 만들기를 포기하는 경우가 많기 때문입니다. (만들다보니 자신의 역량이 부족한 느낌을 강하게 받는다고 합니다.) 하지만 프로그램은 프로그램일 뿐 두려워하거나 무서워할 필요가 없습니다. 목표에 도달하는 방법은 다양함으로 자신이 원하는 방법을 찾는다면 결국은 이룩해 낼 수 있습니다. 



4. 개발 중 문제 발생에 대해 어떻게 대처해야 할까?

  


  프로그램을 만들면서 제일 많이 부딪히는 문제 중 하나는 코딩을 하면서 문제를 해결하지 못하는 경우입니다. 이런 경우는 일반 개발자들도 많이 겪는 문제이기도 한 범용적 문제입니다. 학원에서 코딩의 문법과 알고리즘 조금을 배운 학생의 경우 어떠한 알고리즘 적 해결 방법이 떠오르지 않는 경우 또는 자신이 생각했던 방법이 통하지 않는 경우 적지 않은 인원이 해당 문제의 해결을 포기하고 맙니다. 이유는 자신의 역량 밖이라는 생각과 더불어 암기만 해도 충분했던 다른 과목과의 괴리감 때문입니다. 그렇다면 우리 학생들은 프로그램을 개발하면서 무조건 이러한 문제에 직면하게 될 것이 분명한데, 학생들은 이러한 문제를 스스로 해결할 수 있을까요?


  정답은 네, 할 수 있습니다. 학생들에게 습관처럼 하는 말이 있습니다. '서울에서 부산으로 가는 방법은 한가지가 아니다' 라는 말입니다. 누구는 KTX를 타고 가거나 비행기를 이용할 수도 있으며, 자가용을 이용하거나 오토바이를 이용할 수도 있습니다. 가령 돈 한푼 없는 사람이라면 두 다리로 걷는 방법도 존재는 할 수 있습니다. 

  코딩도 마찬가지입니다. 어떠한 기능을 개발할 때 만들 수 있는 방법은 개발자가 열명이라면 열가지 방법이 있을 수 있습니다. 물론 저마다의 방법마다 성능의 문제는 있을 수 있지만 결국을 만들 수 있다는 것이 중요합니다. 학생들이 만들어낸 프로그램을 상용으로 만든 프로그램과 비교하는 사람은 없을 것 입니다. 그렇기 때문에 같은 기능이지만 속도나 성능이 부족하다고 자신이 만든 프로그램이 잘못된 프로그램은 절대 아닙니다. 

  더불어 요즘은 구글 등 검색 엔진이 잘 마련되어 있으므로 자신이 어렵거나 만들지 못한 기능이 있다면 구글 검색을 통해 만드는 방법을 습득할 수 있습니다. 구글은 한국어보다는 영어로 검색하는 방법이 더 좋으므로 (영어 공부를 열심히 합시다) 검색창에 'how to make 궁금한 것' 식으로 검색한다면 대부분의 경우 알고리즘이나 혹은 프로그램 자체가 나올 수 도 있습니다. 

  프로그래밍은 생각하는 학문입니다. 수학이나 과학처럼 공식은 있지만, 사회나 국어처럼 정해진 것은 없습니다. 그렇기 때문에 많이 생각해야 합니다. 한 가지 문제를 해결할 때 시간이 너무 오래 걸린다고 자책할 필요는 없습니다. 목표를 해결하는 방법을 스스로 생각하고자 하는 태도가 더 중요하기 때문입니다. 



5. 마치며,

  프로그램 개발은 자신의 상상을 현실로 만들어내는 기술입니다. 그렇기 때문에 주어진 공식을 이용해서 자신의 생각을 풀어낼 줄 알아야 합니다. 자신의 생각을 펼쳐내는 방법은 시가 될 수도 있고, 소설이 될 수도 있습니다. 프로그래밍을 하는 우리 학생들은 그 도구가 코딩일 뿐입니다. 저는 어릴적 소설가가 되는 것이 꿈이었습니다. 내 생각을 글로써 표현하고 머릿속으로 구현하며, 독자들로 하여금 제가 만든 세상에 초대하는 것이 아름다워 보였기 때문입니다. 프로그래머 겸 강사가 된 지금도 그 행위에 대해서는 크게 변하지 않았다고 생각합니다. 생각을 표현하는 도구가 조금 변했을 뿐 내가 생각하고 내가 만들어낸 프로그램으로 하여금 누군가 조금 더 편리해질 수 있는 것이 아름다울 수 있다 생각하기 때문입니다. 

  코딩은 마음을 현실화하는 가장 첨단화 된 도구라고 생각합니다.


  읽어주셔서 감사합니다.



카카오톡 검색창에서 '정보선생님 수아'를 추가해 주세요 :D



0 Comments
댓글쓰기 폼