디버깅 지옥에서 나를 구출하기 위한 의사코드

P-iknow·2019년 6월 3일
0

의사코드란 ?

  • 의사코드란 프로그램 코드를 작성할 때 사용하기 위해, 프로그램의 진행 과정과 그 얼개를 단계별로 기록해 놓은 것
  • 의사코드는 프로그램의 문제를 해결하기 위한 도구로, 또는 다른 사람들과 프로그램의 흐름에 대해 소통하기 위한 방법

의사코드는 구체적으로?

의사코드는 구체적으로 하기 질문에 대한 답변이 될 수 있다.

  • 요구 사항을 코드로 간단히 표현하면 어떤 모습인가? 프로그램의 전반적 개요
  • 요구 사항을 해결하기 위해 무엇이 필요할까? - 필요 조건
  • 무엇을 먼저 구현해야하나? - 우선순위
  • 어떤 방식이 더 효율적 인지 코드 작성이전에 어떻게 살펴볼까? - 사전 고민
  • 동료가 나와 같은 생각을 하고 있는지 어떻게 알아볼 수 있을까? - 의사소통

의사코드를 작성하면 무엇이 좋은가?

# 구체성

  • 상당 수 많은 연구 결과에서 복잡한 문제를 풀때 문자로 정리했을 때 더 쉽고 빠르게 풀 수 있다고 말한다.
  • 프로그램을 구현하는 일 또한 복잡한 일이며 글로 정리해보는 것은 그 복잡함을 해소하는데 큰 도움을 준다.
  • 문제가 구체적일때 그 이면에 가려진 것들이 선명해진다. 머리속으로 가늠했을 때 보지못했던 취약점들을 발견할 수 있다.
  • 동료와 소통할 때 구체적인 매게체가 큰 도움이 된다.
  • 의사코드 작성은 구체성을 내어준다.

# 코드 검토(Code Review)가 쉬움

  • 의사코드가 있으면 실행없이 미리 설계를 검토할 수 있다.
  • 추후 진행하게될 좀 세부적 단계의 프로그램을 쉽게 검토할 수 있어 작성할 프로그램의 검토 시간을 줄일 수 있다.
  • 상위 설계 단계에서 의사코드를 수정하고 해당 내용을 소스코드에 반영한다. 이렇게 하면 각 단계 별로 목표가 명확하다. 문제가 복잡할 수록 각 단계의 작고 구체적인 목표가 도움이 된다.
  • 코드작성 이전에 큰 얼개를 그려보면 실제 코드 작성시에 마주하게 되는 개인의 인지오류, 복잡성을 방어할 수 있다.
  • 코드 수정이 의사코드 작성 이전보다 용이하다.
    일부 의사코드 몇 줄을 수정하는 것이 한 페이지 전체의 코드를 수정하는 것보다 더 쉽다.
  • 성공적인 프로젝트를 만들기 위해서는 최소한의 노력으로 고칠 수 있는 단계(least-value stage)에서 오류를 바로 잡는 것이 매우 중요하다. 나중에 코드입력, 테스트, 디버그 수정 단계에서 작업하는 것보다 의사코드 설계 단계에서 미리 오류를 수정을 하는 것이 훨씬 경제적이다.

# 리펙토링 및 디버깅 시간 단축

  • 위에서 언급한 구체성과 문제의 전반적 얼개를 살핀 덕에 추후에 벌어질 일들을 조금이나마 통제할 수 있다.

  • 코드를 작성하다 보면 애초에 자신의 방향이 애초에 잘못되었다는 사실을 꾀나 나중에 알게 된다.

  • 그것을 인지하게 된 순간 우리 인간은 매몰비용에 빠져서 자신의 코드를 갈아엎기 보다는 어떻게든 유지하려는 습성을 보이고 결국 유지하며 어떻게든 코드를 밀고 나간다.

  • 그렇게 밀고나간 코드는 계속해서 여러 문제들에 부딪히고 결국 더 문제를 견딜 수 없는 지경이 왔을 때 비로소 자신의 코드를 갈아 엎는다. (눈물이 난다)

  • 의사코드는 문제가 복잡할 수록 더 큰 힘을 발휘한다. 아래는 의사코드 사용시 리소스에 대해 표현하는 그래프이다.

의사코드를 효과적으로 작성하는 방법?

# 일관성 및 간결함

  • 의사코드와 코드 모두 같은 스타일로 일관성있게 작성하는 것이 원칙인데 이렇게 해야 나 혹은 동류가 파악하기 쉽다.
  • 구체적으로는 같은 연산 기호를 사용하며, 순서가 논리가 글로써 읽힐 수 있어야 하며, 이해를 해치지 않을 정도에서 간결함이 필요하다.

# No Deep, Detail

  • 우리 지금 코드를 직접짜는거 아니다. 개요와 얼개를 이해하는데 불필요한 자세한 내용은 생략해도 무방하다. 그것이 아주 중요해서 의사코드에 포함시켜야 할 경우에는 그때 포함시켜라.
  • 너무 정확할 필요 없다. 콤마 위치나 변수명을 대문자로 할지 소문자로 할지, 값이 정수인지 실수인지 고민하지마라. 그런것을 고민하지 않기 위해 일반적인 구조를 익히고 학습하자.

# 어쨌거나 읽히는 코드

  • if/else 조건문, 반복문(loop)인 while은 영어문장이다. 여기에 적절한 변수명과 함수명을 사용하면 의사코드는 문장처럼 읽힌다. 특정 동작(함수), 목적어(변수), 문장의 흐름(if/else, while) 을 가진 문장말이다.
  • 하기는 의사코드에서 많이 사용되는 단어라고 한다.
    • 입력(Input): READ, OBTAIN, GET
    • 출력(Output): PRINT, DISPLAY, SHOW
    • 계산(Compute): COMPUTE, CALCULATE, DETERMINE
    • 초기화(Initialize): SET, INIT
    • 요소를 추가(Add one): INCREMENT, BUMP
    • 선형적으로 증가할 때(linear progression): SEQUENCE
    • 반복: WHILE, FOR
    • 조건문: IF-THEN-ELSE
    • 마지막에 조건문이 있는 반복문: REPEAT-UNTIL
    • IF-THEN-ELSE 대신 조건 분기처리: CASE
    • 부울 : TRUE / FALSE
    • 그외 : REPEAT - UNTIL RETURN BEGIN / EXCEPTION / END

의사코드를 실제 작성

TODO 어플을 구현하는 의사코드를 작성해보자. 간략하게 사용자 입력을 받는 부분이다.

  • GET User Input(command, data(optional)...)
  • IF User Input Command
    • == show -> show(tododata)
    • == add -> add(Inputdata) ->
    • == delete -> delete(input data )

아래 의사코드를 실제 자바스크립트 코드로 구현해보았다.

const readline = require('readline')

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
})

function UserInputControl() {
  // get command from user
  rl.question("Please input Command", (input) => {
		if(input.command === show) todo.show();
    if(input.command === add) todo.add(input.data)
    if(input.command === delete) todo.delete(input.data)
  })
}

UserInputControl

참고 및 더 자세한 탐구를 위해

profile
매일 성장 하는 사람

0개의 댓글