본문 바로가기
개발 TIP/참고자료_소개

담당 지도교수님의 프로그래밍, 알고리즘 코딩에 대한 조언

by izen8 2013. 9. 27.
반응형

퍼온글 : 출처는 잊었네요. 문제되면 삭제하겠습니다.


저는 지금 조선공학과 석사과정 2년차에 재학중입니다. 주 전공이 조선공학이라고 하지만, 정작 연구실은 Modeling & Simulation을 주로 연구하기 때문에 M&S 선박관련 프로그램 해석과, 그런 프로그램을 직접 코딩하는 관련연구를 주로 하고 있죠. 덕분에 C와 C++을 구분도 못하던 학부4학년때부터 지금까지 죽어라 Curve관련 알고리즘과, Visualization해줄 수 있는 그래픽 라이브러리를 이용해 거의 하루도 빠지지 않고 비주얼 스투디오를 더블클릭하는 것 같습니다. 컹~~


얼마전 연구실에 들어온 학부생이 저희 담당교수님께 E-mail을 보냈나 봅니다. 이래저래 프로그래밍 입문에 부하가 많이 걸렸는지, 교수님께 직접 "코딩을 잘 하는 방밥"에 대해 여쭈어본 것 같습니다. 저희 교수님께서는 연구실원 모두에게 아래의 내용의 E-mail을 보내셨네요.


땡떙이가 질문한 내용에 대한 답을 다 같이 나눠보고자 한다. 컴퓨터언어로 코딩 할 때 유용한 방법을 물어서 거기에 대한 답을 내 나름대로 정리해 보았다. 


코딩에 대한 정해진 룰은 없고, 있기도 어렵다. 모든 사람은 자기가 가지고 있는 특별한 방법을 따르기 때문에 정형화하는 것은 어렵다고 본다. 

다만 먼저 한 사람들의 방법을 보며, 받아들일 것은 수용하고 의문이 가는 것은 수정하며 자기만의 방법을 개발하는 것도 좋은 방법이라고 본다. 우리 실험실의 경우 아무래도 내가 경험이 제일 많을 테니 내가 하는 방법을 듣고 각자 나름대로 수정하여 받아들이는 것도 좋겠다. 


- 코딩은 언어를 나열하는 방법일 뿐이다. 프로그래밍의 기본은 먼저 주어진 문제를 이해하는 것이다. 


- 주어진 문제를 (완벽하게) 이해한다. 문제에 따라서는 처음부터 완벽하게 이해하는 것이 불가능한 경우도 있다. 이때는 필연적으로 반복적인 수정과 코딩이 불가피하다. 


- 문제를 풀기 위한 해법을 마련한다. 문제가 간단한 경우 즉흥적으로 풀 수 있겠으나 대부분 문제가 생각을 요하고, 처음에는 쉽게 보여도 접근할수록 어렵거나 덧붙여야 할 부가적인 문제들이 파생하기 때문에 체계적인 정리가 필요하다. 알고리즘을 마련하는 작업이라고 볼 수 있다. 


- 정리된 해법을 flowchart 혹은 유사한 형태로 기술한다. 처음에는 다 이해했더라도 시간이 흐르면 잊기 쉽고, 또 프로그램 도중에라도 수정을 할 경우가 많기 때문에 ‘수정을 위한 밑그림’을 준비하는 것이 유용하다. 


- 다음이 코딩이다. 광의의 코딩이란 위에 기술한 모든 행위를 포함하겠지만, 협의 개념으로 보면, 정리된 flowchart를 컴퓨터가 이해하는 언어로 번역하는 것이라고 볼 수 있다. 당연히, flowchart가 자세할 경우 단순한 1대1 번역이 될 것이지만, 아닐 경우에는 고민을 많이 해야 할 것이다. 어디서 많은 고민을 할 것인가를 결정하는 것 역시 개인의 몫이다. 


- 코딩을 하는 도중 많은 어려움을 겪는다. 언어에 익숙하지 못하여 혹은 마련된 알고리즘이 잘 못 되어서 코딩이 순조롭지 않을 수 있다. 전자는 반복적인 작업에 의한 경험이 해결해 줄 것이며 후자는 기초작업으로 돌아가 착실히 하는 방법을 택하여야 한다. 아무리 복잡한 컴퓨터언어라도 ( C와 같은 언어 혹은 OpenGL과 같은 그래픽라이브러리 등) 프로젝트 1-2개를 수행하면, 통상 3개월 정도로 본다, 개념이 잡힌다. 이 것 역시 개인차가 있으니 정형화하지는 마라. 


-l C++와 같은 객체지향형을 이용할 경우, 무조건 코딩에 들어가는 것보다는 알고리즘과 flowchart를 보다 꼼꼼히 챙기는 것이 더 효과적이다. 사용될 중요 변수와 상수 등은 미리 생각해두는 것이 좋다. 새내기들에게 조언을 하자면 변수 명을 줄 때, 본인 외에 누구나 알아볼 수 있는 이름을 사용하도록 하여라. 이름이 다소 길더라도 프로그래밍과 디버깅 측면에서 무척 효율적이다. 선박의 선수부 종류에 대한 변수 명을 줄 경우, s / st 등과 같이 의미 없는 것은 피하고, 이왕이면 stem 혹은 더 자세히 stem_type 과 같이 누가 봐도 무슨 뜻인지 알 수 있도록 하는 배려가 필요하다. 이 배려는 궁극적으로 프로그래머 자신을 위한 것이 된다. 


- 혹자는 주어진 문제를 본 후, 일단 코딩을 마치고 사용되었던 알고리즘을 정리하기도 한다. 가장 바람직한 방법은 미리 flowchart를 마련한 후 코딩을 하고, 완성된 코드를 바탕으로 알고리즘을 정리하는 것이겠으나, 시간상 쫓기고 마음이 급하다 보면 현실적으로 잘 되지 않는다. 하지만 너희들은 아직 배우는 학생들이니 되도록 정석을 따르기 바란다. 



이 외에도 많은 조언과 방법들이 있으나 오늘 하루에 다 적기는 힘들구나. 차후 또 얘기하도록 하마.



협의의 코딩에 대한 설명이 인상깊군요. 코딩이란 정리된 플로차트를 컴퓨터가 이해할만한 언어로 변역해주는 것이지, 그 이상도 이하도 아니라는 것. 언어에도 문법이 있듯이 프로그래밍에도 그에 합당한 문법이 있는것, 그 문법에 대한 이해는 책을보거나, 강좌를 들으며 달달 외운다고 되는게 아니라 실전에서 언어처럼 자연스레 익혀야 된다는것. 잊고 있었던 프로그래밍의 원리를 잠시나마 되돌아볼 수 있는 시간이었습니다.


위의 인용한 Comments의 신빙성을 약간이나마 보태 보자면, 저희 교수님은 교수로 임용되기 이전에 유명한 CAD/CAM 프로그램인 Unigraphics (NX4)의 많은 기능중 Nurbs관련 알고리즘 구현코딩 및 함수구현에 직접 참여하셨었다고 합니다. 존경스럽습니다. 전 언제쯤 그런 재미난 작업들을 해볼 수 있을지..


감히, 제 인생의 반짝이는 목표를 교수님께 맞춰온지 어언 2년.. 잠시 잊었던 처음의 기본적인 마인드를 다시 가지고, 오늘 하루도 즐거운?? 프로그래밍을 시작해야 겠습니다.



반응형

댓글