의사코드란 ?
- 의사코드란 프로그램 코드를 작성할 때 사용하기 위해, 프로그램의 진행 과정과 그 얼개를 단계별로 기록해 놓은 것
- 의사코드는 프로그램의 문제를 해결하기 위한 도구로, 또는 다른 사람들과 프로그램의 흐름에 대해 소통하기 위한 방법
의사코드는 구체적으로?
의사코드는 구체적으로 하기 질문에 대한 답변이 될 수 있다.
- 요구 사항을 코드로 간단히 표현하면 어떤 모습인가? 프로그램의 전반적 개요
- 요구 사항을 해결하기 위해 무엇이 필요할까? - 필요 조건
- 무엇을 먼저 구현해야하나? - 우선순위
- 어떤 방식이 더 효율적 인지 코드 작성이전에 어떻게 살펴볼까? - 사전 고민
- 동료가 나와 같은 생각을 하고 있는지 어떻게 알아볼 수 있을까? - 의사소통
의사코드를 작성하면 무엇이 좋은가?
# 구체성
- 상당 수 많은 연구 결과에서 복잡한 문제를 풀때 문자로 정리했을 때 더 쉽고 빠르게 풀 수 있다고 말한다.
- 프로그램을 구현하는 일 또한 복잡한 일이며 글로 정리해보는 것은 그 복잡함을 해소하는데 큰 도움을 준다.
- 문제가 구체적일때 그 이면에 가려진 것들이 선명해진다. 머리속으로 가늠했을 때 보지못했던 취약점들을 발견할 수 있다.
- 동료와 소통할 때 구체적인 매게체가 큰 도움이 된다.
- 의사코드 작성은 구체성을 내어준다.
# 코드 검토(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() {
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
참고 및 더 자세한 탐구를 위해