컴퓨터 프로그래밍 기본 원칙 by 바죠

컴퓨터 프로그래밍 기본 원칙

늘 테스트가 가능한 상황을 만든다. 다시 말해서, 명확한 정답이 있는 경우에 대해서 먼저 프로그래밍을 완성한다.

많은 경우, 원하는 프로그램과 알고리듬을 google.com 에서 찾을 수 있다. 어떻게 프로그램 하는지를 쉽게 검색할 수 있다. 생각하지도 못한 간단한 방법들이 있을 수 있다. 오류가 나올 때에도 마찬가지다. 오류를 복사해서 검색창에 넣어 주면 된다.  

소스 코드를 만드는 곳, 테스트 하는 곳을 분리한다. 테스트 하는 곳은 여러 군데가 있어야 한다.
단 한 번에 복잡한 코드를 만드려고 하면 절대 안된다. 여러 번의 단계를 거쳐서 만드려고 해야 한다. 

특정 조건이 만족하지 않을 경우, 즉시 프로그램이 종료되도록 한다. 이 문제의 원인을 찾아낸다. 문제를 해결한다.

특정한 이유를 하나 가지고 컴퓨터 프로그램을 수정을 완료한다. 변화를 즉시 체크한다. 간단하게  한 가지 문제점을 지정하고 그것만을 수정하고 변화를 확인한다.

다시 말해서, 프로그램을 점진적으로 수정하고 테스트한다. 소스코드 백업을 지속적으로 해주면 된다. 예를 들어, 완전한 소스코드 백업을 지원하는 git을 사용할 수 있으면 상당한 도움이 된다.

우선 최대한 간단하게 구현한다. 보다 일반적인 경우는 나중에 필요할 때, 그 때 추가적으로 추구한다. 처음 부터 너무 일반적인 코드를 만들려고 시도하지 않는다.

컴퓨터 언어 해당 컴파일러 옵션을 총동원하여 최대한 많은 정보를 실행하면서 얻을 수 있도록 한다. 
( -CB -check all -warn interface -assume realloc_lhs
예상되는 결과와 직접 테스트한 결과를 항상 비교해야만 한다.
사용하지 않는 변수들을 쏙아 낼 필요가 있다. 이 때 아래의 컴파일러 옵션을 사용할 수 있다. 
ifort -c -CB -check all -warn unused

프로그램 중간에 원하는 결과를 내는지 테스트하는 부분을 넣어둔다. 테스트가 완료되면 그 부분을 쉽게 지나치게 만들어 둔다. 조건문을 활용한다. 간단하게 특정 부분을 지나치게할 수 있다. 가장 간단한 방법은 아래와 같이 만들어 버리는 것이다. 조건문을 사용하여 특별한 테스트를 진행할 수 있다. 테스트를 완전히 통과한다고 하더라도 그 부분을 소스코드에서 지울 필요는 없다. 나중에 다시 사용할 수 있게 그대로 둔다. 다만, 아래와 같이 조건문을 잡아서 처리하면 좋다.  
if(.false.)then
test.....
          endif
if(.true.)then
test.....
         endif
  
소스 코드 내부에 테스트 공간이 있어야 한다. 조건문으로 만들어 둘 수 있다. 계산 중간에 테스트를 하고 다음으로 진행할 수 있게 해야 하고 그 곳에서 멈출 수 있게 해야 한다. 선택적으로 멈추고 진행할 수 있게 프로그램을 만든다. 많은 파일들을 통하여 중간 단계를 점검을 한다. 많은 출력을 많은 파일들로 분리해서 적는다. 물론, 프로그램의 복잡도에 따라서 달라지겠지만, 5천라인-2만 라인 이상인 경우, 1년 정도 다양한 환경에서 지속적으로 프로그램을 지속적으로 테스트하더라도 그 프로그램의 완결성을 장담할 수 없다. 모듈화시켜는 작업을 한다. 모듈화 단위별로 테스트할 수 있게 만든다. 

계산 속도보다는 계산 정확도가 더 중요하다. 당연하다. 가능하다면 차후에 속도를 높이는 알고리듬을 도입한다. 

해야 할 일들의 단위가 한정되면 해당 되는 일들에 대한 모듈을 설계하고 작성한다. 모듈별로 분리해서 프로그램들을 만들 수 있으면 최고의 상황이다. 알고리듬을 더욱더 잘 이해 할수록 모듈별로 프로그램들이 더 잘 분리될 것이다. 모듈은 특정한 일을 전담하는 일반적인 변수들과 함수들의 집합체이다. 때에 따라서는 변수들만으로 구성될 수도 있다. 마찬가지로 함수들로만 구성될수도 있다. 일반으로 변수들과 그 변수들을 집중적으로 이용하는 함수들로 구성되기 마련이다. 

가능하면 공식 라이버러리들을 적극적으로 활용한다. 검정이 완료된 라이버러리를 활용하는 것은 프로그램 작성의 가속도를 얻게해준다. 그렇지 않으면 최종 목적물을 만드는데 시간이 너무 많이 소모된다. 검정된 프로그램의 정확한 활용방법을 익히고 사용한다. 에러가 발생할 수 있는 가능성을 없앤다. 프로그램을 만드는 것은 에러를 만들 수 있는 가능성을 열어 두는 것이다. 

많은 경우, 가장 효율적인 알고리듬 하나가 있을 뿐이다. 검정되지 않은 변종들은 대부분 효율적이지 못하다. 
잘 알려진 알고리듬들은 새로 만들지 말고, 최대한 이용하려고 한다. 물론, 정확한 사용방법을 익힌다. 이렇게 해야만 생산성을 높일 수 있다. 알고리듬의 혁신을 가져올 수 있는 것을 연구하지 않는 이상, 기존의 알고리듬을 활용해야만 한다. 
특수한 목적을 정의하고, 이를 효율적으로 구현할 수 있는 방법을 인터넷으로 찾아 본다.
예를 들어, 이러한 것을 포트란 90 언어로 어떻게 구현 하는지? 라고 직접적으로 인터넷에 물어본다. 많은 경우, 정답을 제공한다.

테스트가 어려운 경우도 있다. 너무 시간이 오래 걸리는 경우가 이에 해당한다. 이런 경우에는 많은 버그들이 있을 수 있다는 것을 인정해야 한다. 따라서, 시간이 오래 걸리는 부분을 시간이 적게 걸리는 부분으로 인위적으로 변화시켜서 전체 알고리듬을 쉽게 빠른 시간안에 테스트 해 볼 수도 있어야 한다. 

새로운 계산방법이 나오더라도 기존의 계산방법과 비교하는 것은 피할 수 없는 일이다. 따라서, 여러 가지 이유로 기존의 것을 먼저 활용해야만 한다. 기존의 것은 절대적으로 보존한다.  

a2ps 같은 프로그램으로 소스코드를 출력해서 본다. 서로 다른 양식으로 소스 코드를 관찰한다. 
git 사용법을 익혀서 소스코드 관리를 전문적으로 할 수 있으면 최고다. 소스 코드 출력과 컴파일러 옵션의 사용이야말로 디버깅의 지름길이다. 
a2ps --prologue=color -o action_multi.ps action_multi.f90
a2ps --medium=A4 --line-numbers=1 -o action_multi.ps action_multi.f90
ps2pdf -sPAPERSIZE=a4 action_multi.ps

incredible.egloos.com/4811847
http://incredible.egloos.com/4223942

잘못 계산된 숫자를 확인하는 과정이 필요하다. 조건문으로 테스트가 가능하도록 만들어 둔다.
http://incredible.egloos.com/7294225

핑백

덧글

댓글 입력 영역

최근 포토로그