의사코드 프로그래밍 프로세스(Pseudocode Programming Process)

 

전문가를 위한 의사코드

의사코드(pseudocode)라는 용어는 알고리즘이나 루틴, 클래스, 프로그램이 어떻게 작동할것인지를 기술하는 비형식적이고 자국어와 같은 표기법을 가르킨다.

의사코드를 효율적으로 사용하기 위한 지침들

  • 구체적으로 연산을 정확하게 기술하는 자국어와 같은 명령문을 사용한다
  • 대상으로 삼는 프로그래밍 언어의 문법적인 요소를 피한다.
  • 의사코드를 목적수준에서 작성한다.
  • 의사코드로부터 코드를 생성하는 것이 거의 자동으로 될수 있을 만큼 낮은 수준에서 의사코드를 작성한다. 코드를 쉽게 작성할수 있는 것처럼 보일때까지 좀더 다세하게 의사코드를 개선한다. 일단 의사코드가 작성되면, 의사코도 주위에 코드를 작성하고 의사코드를 프로그래밍 주석으로 변경한다.

    이런 원칙을 어기는 예제.

    ex. increment resource number by 1

      allocate a dlg struct using malloc

    if malloc() return NULL then return 1

    invokde OSrsrc_init to initialize a resource for the operating system

    *hRsrcPtr = resource number

    return 0

    이 예제가 말하는 것이 무엇일까? 어렵지만 말해보자면 *hRsrcPtr(C의 포인터)와 malloc(C 함수)와 같이 대상언너로 코드를 작성하기 위한 세부적인 사항들을 포함하고 있기때문에 잘못된 예이다. 이 의사코드 블록은 설계의 의미보다는 코드가 어떻게 작성될 것인지에 중점을 두고 있다.

    좋은 의사코드의 예.

    keep track of current number of resource in use

    If another resource is available

       allocate a dialog box structure

       if a dialog box structure could be allocated

               note that one more resource is in use

                initialize the resource

                 store the resource number at the location provided by caller

       endif

    endif

    return true if a new resource was created; else return false

    첫번째 보다 완전한 영어로 되어있어 좋고 대상언어의 문법적인 요소가 없어서 더욱 좋다.

  • 의사코드를 사용했을 때 기대할수 있는 이득.

    • 검토가 쉬워진다. 소스코드를 보지 않고 상세한 설계를 검토할수 있다
    • 반복적인 개선을 지원한다. 설계->의사코드, 의사코드->소스코드. 변환시킬때마다 개선할수 있는 여지가 있다
    • 변경을 쉽게 만든다.소스코드가 아니니까.초기에 오류를 잡을 가능성이 높다.
    • 의사코드는 주석을 작성하는 노력을 최소화한다. 전형적인 코드 작성 시나리오에서는 코드를 작성한 다음 주석을 추가한다.PPP에서는 의사코드 문이 주석문이 되기때문에 실제로 주석을 남겨놓는 것보다 주석을 제거하기 위해서 더 많은 작업을 한다.
    • 설계 문서화의 다른 형태보다도 유지 보수가 쉽다.

     

 

PPP를 사용한 구현 루틴.

루틴을 설계한다.

  • 사전에 필요한 조건들을 검사한다.
  • 루틴이 해결할 문제를 정의한다. - 루틴이 숨길 정보. 루틴에 대한 입력. 루틴으로부터의 출력. 루틴이 호출되기 전에 참이어야 하는 선행조건들, 루틴이 참임을 보장흔 후행조건들.
  • 루틴의 이름을 짓는다
  • 루틴을 어떻게 테스트할 것인지 결정한다
  • 표준 라이브러리에서 가능한 기능을 조사한다. - 라이브러리를 검색하는 습관은 중요하다. 품질과 시간. 생산성면에서 구현하고 하는 라이브러리가 이미 있을 경우 아주 뛰어나진다.
  • 오류처리에 대해서 생각한다
  • 효율성에 대해 생각한다.
  • 알고리즘과 데이터형을 조사한다
  • 의사코드를 작성한다. - 작성시에 일반적인 것에서 구체적인 것으로 작업을 진행한다. 각 루틴에서 가장 일반적인 요소를 무엇을 하는 루틴인지를 알리는 것이므로 무엇을 하는 루틴인지를 헤더에 주것다는 것에서 시작한다.
  • 데이터에 대해 생각한다.
  • 의사코드를 검사한다. - 작성한 의사코드가 설득력이 있는지 스스로가 검토해본다
  • 의사코드에서 몇가지 아이디어들을 시험해본후, 가장 좋은 방법을 유지한다.(iterative)

 

루틴의 코드를 작성한다.

  • 루틴의 선언부를 작성한다.
  • 의사코드를 고수준의 주석으로 변환한다.
  • 각각의 주석 아래에 코드를 채운다.
  • 코드가 더 나뉘어져야 하는지 검사한다. a. 만약 의사코드 한줄이 예상했던 것보다 많은 코드로 확장된다면 해당 코드를 별도의 루틴으로 나눌수 있다.

                                                          b. PPP를 귀납적으로 적용한다. 의사코드 한 줄 아래에 20줄이 넘는 코드를 작성하는 대신, 원래 있던 의사코드를 여러

                                                              줄의 의사코드로 분해하는 시간을 갖는다.

 

코드를 검사한다.

  • 루틴의 오류를 머릿속에서 검사한다.

    아마추어와 프로 프로그래머의 차이는 미신과 이해의차이점에서 온다. 미신은 코드에 대한 이해 대신 코드에 대한 느낌을 사용하는 것을 의미한다. 만약 컴파일러나 하드웨어가 오류를 만들었을 것이라고 자주 의심한다면, 여러분은 아직 미신의 영역에 있다. 한 조사에서 전체 오류 중에 5%정도가 ㅎ사드웨어나 컴파일러, OS의 오류라 한다. 이해의 영역에 있는 프로그래머는 언제나 자신이 작업한 내용을 가장 먼저 의심한다. 각 코드의 역할과 필요한 이유에 대해서 이해하도록 한다.

  • 루틴을 컴파일한다 - 루틴을 검사하고 나서 컴파일한다. 루틴을 좀 더 일찍 하면 문법오류를 더 빨리 찾을수 있다. 하지만 그렇게 하지 않는 이유는  새로운 코드를 컴파일할때 조급증이 생긴다. '컴파일을 한번 더 하면 제대로 동작해야해' '컴파일 한번 더' 같은 조급증은 오류를 유발할수 있는 변경을 만들고 길게 봤을때 더 많은 오류를 만들어낸다.- 좋은 컴파일에 대한 지침. 컴파일러의 경고수준은 가장 높게 설정./ 유효성검사기 사용/ 모든 오류메세지와 경고의 원인제거하고 컴파일러가 보여주는 메세지에 주의를 기울인다.
  • 코드를 디버거에서 한 단계씩 살펴본다.
  • 코드를 테스트한다.
  • 루틴에 있는 오류를 제거한다.

 

미해결된 부분을 정리한다.

  • 루틴의 인터페이스를 검사한다.
  • 일반적인 설계 품질을 검사한다.
  • 루틴의 변수를 검사한다
  • 루틴의 명령문과 논리적인 구조를 검사한다
  • 루틴의 배치를 검사한다
  • 루틴의 문서롸를 검사한다 - 주석으로 변환되는 의사코드가 여전히 정확한지 확인한다
  • 불필요한 주석을 제거한다

 

PPP의 대안

  • 테스트 우선 개발(test-first development) - 테스트케이스를 만들고 테스트코드를 작성하는 것.
  • 리팩토링 - 의미를 유지하는 일련의 변환 과정을 통해서 코드를 향상시키는 개발법
  • 계약에 의한 설계 - 각 루틴을 선행 조건과 후행조건을 갖는 것으로 간주하는 개발법.

 

요점정리 중

  • 훌륭한 의사코드를 작성하기 위해서는 이해가능한 언어를 사용하고, 단일 프로그래밍 언어에 특화된 기능을 피하고, 의도수준에서 작성해야 한다.
  • 의사코드 프로그래밍 프로세스는 상세 설계에 유용한 도구이며 코드 작성을 쉽게 만든다. 의사코드는 곧바로 주석으로 변환되며, 변환된 주석은 정확하고 유용하다.

이 글은 스프링노트에서 작성되었습니다.

by 무위자연 2008. 1. 19. 17:05