공학을 목적으로 하는 프로그램 개발과정은 범용 소프트웨어를 개발하는 과정과 차이점이 존재한다. 그 차이점과 공학 프로그램을 다루는 데 있어 어떻게 접근하는지 알아본다. 컴퓨터 비전공자이면서 컴퓨터 모델링을 하는 공학도가 CPU의 작동원리나 통신 프로토콜의 작동원리 같은 것들을 중요하게 다룰 필요는 없다. 중요하게 다룰 부분은 컴퓨터 위에서 움직이는 정보와 계산들이 어떤 원리와 규칙으로 움직이는지 아는 것이 중요하고 또 효율적으로 활용하는 것이 중요하다.
이 홈페이지에 처음 들어왔다면 메뉴에 Start에서 필요한 조건들을 훑어 본 다음 학습을 시작하는 것이 좋을 것이다. 이 홈페이지는 직관적으로 수업을 목적으로 만들어 저 있기 때문에 미흡한 부분이 있을 수 있으니 이해해 주기 바란다. 잘못된 부분이나 다른 이견이 있으면 kiwon@null.net 으로 메일을 보내 주기 바란다.
컴퓨터, 공학 프로그래밍, R, RStudio, Linux, Wiki System,
컴퓨터공학 및 전산학과를 전공한 공대생을 제외하고 대부분 공대생은 컴퓨터와 프로그래밍 자체가 학문의 목적이 아니다. 그렇지만 컴퓨터 활용능력이 연구자의 역량에 상당한 부분을 차지한다. 하지만 불행히도 대부분의 연구자는 컴퓨터 활용에 있어 상용소프트웨어에 의존적이고, 단지 프로그램 운영(operation)만 할 뿐 활용(application)은 하지 못하고 있다.
대부분의 공학도들은 실험과 해석을 하기 위해 컴퓨터를 시뮬레이션 모델링을 사용한다. 이는 자신이 하고자 하는 연구를 정확하고 신속하게 처리하기 위함이다. 복잡한 해석과정도 프로그램에 의해 진행이 되며 연구자는 해석 결과를 토대로 연구 결과나 성과를 내게 된다. 그런데 문제는 연구자가 생각하는 아이디어를 컴퓨터 해석과정에 접목할 경우 사용하던 프로그램의 범위 안에서 손발이 묶이게 된다. 프로그램 개발자에게 문의할 수 있지만, 의사소통과 금전인 부분 그리고 시간적 문제 등등 여러 가지 문제에 맞닥뜨릴 것이다. 이것은 프로그램 사용자가 프로그램을 통제하지 못함에 있어 생기는 문제이다. 사용자에게 프로그램 제어권한이 있게 된다면 사용자는 프로그램에 더 깊은 이해를 동반하고 자신의 아이디어로 프로그램을 확장 시킬 수 있을 것이다. 이것은 우리가 사용하는 소프트웨어가 오픈소스 일 때 가능하다.
또한, 과학적인 연구방법을 위한 컴퓨터 학습이 필요하다. 대학원의 존재 목적은 연구이다. 연구 주제가 무엇이고 또 어떤 목적을 가졌는지에 상관없이 모든 연구는 과학적인 연구방법을 토대로 진행되어야 한다. 에릭 레이먼드 외 4명(2013)이 쓴 "오픈소스"라는 책에 다음과 같이 나와 있다.
다시 말해 과학적 논문이란 학문적 주장 혹은 가설을 적합한 절차와 형식에 맞추어 이론적으로 논증하거나 재현 가능한 실험결과/통계분석으로 입증하는 글을 말한다. 수학과 물리학 분야에서는 어떠한 이론이 후에 실험을 통해 입증되는 연구 형태를 접할 수 있다. 이렇게 가설과 이론이 증명이 될 수 있는 이유는 논문에 해당되는 주장이 재현 가능한 실험이기 때문이다. 하지만 현재 대부분의 컴퓨터 모델링을 이용한 논문은 재현가능이 힘들다. 왜냐하면 공학 논문에는 많은 결정변수와 복합적인 해석방법이 들어가는데 이를 다 명시할 수 가 없기 때문이다. 또한 이러한 모델링 연구에 사용된 도구들이 연구의 중요한 메커니즘을 담당했음에도 불구하고 연구자 및 그 논문을 접하는 독자도 위증을 확인 할 수 조차 없다. 다만 해당 소프트웨어 개발자들을 신뢰하고 그들이 옮음을 공리처럼 받아드려야 한다. 이는 과학적 방법의 전제조건인 검증, 수정 그리고 재생 가능성에 위배된다고 볼 수 있다.
이렇듯 과학적인 방법은 항상 재현 가능해야 하며, 그것이 옳은지 그른지 판단할 수 있어야 한다. 사회와 단체와 개인은 이런 과학적인 방법을 토대로 한 연구를 바탕으로 의사결정을 하기 때문에 모든 연구과정은 과학적이여야만 한다. 소프트웨어는 잘못 설계되었을 가능성을 항상 가지고 있다. 연구자는 본인이 한 연구과정이 재현 가능해야 하며 옳음을 증명할 수 있어야 한다. 과학은 수세기에 걸친 협업을 요구하는 과정이다. 순간적인 편의와 편익에 의해 과학적인 연구방법을 버려서는 안된다.
또한 활용적인 측면에서 컴퓨터와 프로그램에 대한 이해를 바탕으로한 연구자의 학습과 연구는 타의 추종을 불허할 것이다. 조금이나마 이 강좌를 통해 삽을 들고 땅을 팠던 연구자에게 굴착기 운전자격을 주도록 한다.
Matlab에 익숙한 우리 공학도들에게 다른 범용 프로그래밍 언어를 사용해서 개발하라고 하면, 굉장한 시간과 노력이 들 것이다. 왜냐하면, 범용 프로그래밍 언어는 모든 것을 하기 위해 만들어졌고, Matlab과 같은 과학/공학 프로그래밍 언어는 공학도들이 쓰기 편하게 만들어져 있기 때문이다. 본인이 느낀 두 부류에 같지만 다른 개발 방법을 간단히 정리해 보면 아래와 같다.
범용 프로그램 개발도 기본적인 산술 계산이나 선 그리기 같은 아주 단순한 프로그램을 목적으로 만들면 공학 프로그램 개발 접근 방법보다 더 간단할 것이다. 하지만 범용프로그램 개발은 일반적으로 생활에 활용을 위한 것이어서 복잡성이 크다. 비교적 공학 프로그램에 대한 접근 방법은 공학적인 계산과 절차를 나타내기만 하면 되기 때문에 간단할 수가 있다. 또한, 패키지 관리와 순간 개발 속도는 굉장히 빠르다.
범용 프로그램 개발을 하고 싶다면 Java나 Python을 추천한다. 공학 언어는 R이나 Octave를 추천한다. 모두 오픈소스이며 크로스 플랫폼이고 많은 커뮤니티를 확보하고 있다. 다시 말하지만, 범용 프로그래밍 언어는 모든 것을 할 수 있다.