의사코드

From Hidden Wiki
Jump to navigation Jump to search
* 상위 항목: 프로그래밍

pseudocode.[* 수도코드, 혹은 슈도코드라고 읽는다.]

개요

앨거리듬을 표현하는 방법 중 하나. 단어는 가짜의, 유사한을 의미하는 접두어 'pseudo-'와 코드를 의미하는 'code'에서 유래한다. 한자로는 의사(疑似)코드 라고 쓴다.

여러 가지 정의가 있지만, 보통은 자연어[* 프로그래밍에서 말하는 자연어란 프로그래밍 언어가 아닌 모든 언어, 쉽게 말하자면 일상 생활에서 평소 쓰는 모든 언어다.]를 이용해 만든 문장을 프로그래밍 언어의 형식으로 배치한 코드를 말한다. 대개 프로그래밍 언어라는 게 모두 영어가 기본이기 때문에 영어로 작성된 의사 코드는 얼핏 봐서는 실제 코드와 구분이 잘 안 된다.

당연히 의사 코드로 작성된 코드를 컴파일러나 빌더에 넣고 백날 돌려봐야 에러를 뱉어낼 뿐, 절대로 실행 되진 않는다. 애당초 의사 코드는 컴퓨터가 읽으라고 만드는 게 아니다. 그런 점에서 다른 프로그래밍 언어로 작성된 코드와 비교해서 매우 이질적인데, 기본적으로 프로그래밍 언어는 어떠한 식으로든 변환 과정을 거쳐서 컴퓨터가 읽을 수 있는 언어로 바뀔 수 있는 프로세스를 준비해 두고 있다. 하지만 의사코드는 그런 프로세스가 전혀 존재하지 않는다.

용도

결국 컴퓨터에서 작동하지도 않는 코드를 왜 짜는가? 하는 의문이 생길 수밖에 없는데, 기본적으로 의사코드는 프로그램 제작 과정의 준비 단계에서 사용되는 경우가 많다. 기본적인 프로그램 제작 단계를 고객 요구 사항→설계도 작성→프로그램 코드 작성→테스트→디버깅 이라고 하면, 여기에 의사코드를 넣은 상황은, 고객 요구 사항→설계도 작성→의사 코드 작성프로그램 코드 작성→테스트→디버깅 정도로 생각하면 된다.[* 단, 실제로는 의사 코드 작성은 설계 단계에 포함된다.]

논문, 서적 출판

전산학에서 새로운 알고리즘을 고안해서 논문이나 책으로 낸다고 했을 때, 그 알고리즘을 표현할 수단이 필요하다. 이때 그 알고리즘을 특정 언어 구현체로 싣는 것은 해당 언어의 표현력에 종속되게 되기 때문에 일반적인 표현을 위해서 의사코드를 사용한다.

알고리즘 구상 용도

아무리 유능한 프로그래머라고 해도 기본은 사람이기 때문에 머리 속의 생각은 자신이 태어난 나라의 언어에 묶일 수 밖에 없고, 그러한 이유로 알고리즘을 구상하는 단계에서부터 프로그래밍 언어로 생각을 하는 것은 몹시 힘들고 지치는 작업이 된다. 설령 별로 힘들지 않다고 말 할 수 있는 신급 프로그래머라고 하더라도 어느 쪽이 더 쉽냐? 고 물으면 자연어로 생각하는 게 쉽다. 하지만 그렇다고 마냥 한국어로 논문 쓰듯이 늘어놓으면 막상 프로그래밍할 때쯤 되서 그걸 다시 번역하는 과정이 귀찮아진다. 결국 의사 코드는 이런 두 개의 이질적인 언어 시스템인 자연어↔프로그래밍 언어 사이의 중계점으로서, 자연어로 서술된 알고리즘의 이론서 혹은 논문 등을 프로그래밍 코드로 전환하는 과정에서 매우 유용하게 사용될 수 있다.

회의 진행 자료 용도

다만 이 경우는 처음부터 회의 자료로 쓰려고 만들기보단, 다른 용도로 만든 것이 있을 때, "이왕 있는 거 회의할 때에도 쓴다." 정도의 성격이 강하다.

여러 명이서 작업하는 팀 시스템의 경우 팀을 체계적으로 관리하는 곳에서는 팀 관리에 특화된 멤버들이 투입되는 경우가 많다. 이들은 팀원의 작업 분배, 리스크 관리 등에 탁월한 능력을 가지지만, 이런 사람들은 프로그래밍 코드를 이해하기 위한 지식은 그다지 높지 않거나 혹은 자신의 전문 언어가 다른 언어인 경우가 많기 때문에 실제 코드를 보여주면서 회의를 하면 회의 진행에 문제가 생길 수 있다. [* 다만 대개의 경우 이건 개발자와 관리자의 차이를 인식하고 있는 외국에서나 그렇고 한국은 그렇지 않을 가능성이 높다. 한국의 IT 문화에서는 몇십년째 코드밖에 모르고 살던 코덕 개발자가 팀 관리 방법을 배우지도 않고 그대로 팀 관리자로 넘어가는 승진 시스템을 고집하는 경우가 많으므로 팀 관리자가 기본적인 코드를 이해 못하는 경우는 그다지 없다. ... 대신 부하들의 마음을 이해하지 못한다는게 치명적인 문제지만...] 그렇기 때문에 그들을 앞에 두고 회의를 할 때엔 [* 주로 리뷰라고 부르는데, 작업한 결과를 다른 윗사람들 앞에 보이고 문제 없다는 확인을 받는 과정이 있는 회사들이 종종 있다.] 높은 확율로 의사코드로 된 내용을 첨부하는 것이 유익하다.

업무 지시 용도

-- 양산형 개발자가 저글링처럼 샘솟아 나오는 한국은 그럴 일이 별로 없지만,-- 몇몇 경우에 실제 프로젝트에서 시간이 부족하거나 일손이 부족하기 때문에 알바생을 고용하는 경우가 있는데, 알바생이 아무리 실력 있다고 주장한들 전문적인 교육도 안받은 알바생을 신용하는 것은 무리가 있다. 이러한 작업 방식은 결국 버그나 보안 취약점을 발생시킬 리스크를 안고 있는데, [* 절대로 알바생의 실력 문제가 아니다. 검증되지 않은 사람을 썼다는 사실 자체가 리스크일 뿐이다.] 이러한 리스크를 줄이기 위해서는 이들에게 지시할 때는 보다 구체적으로 딱 더도 덜도 말고 이렇게만 해!라는 식으로 지시를 명확하게 할 필요가 있는데, 이때 그들에게 작업 내용을 전달하는 용도로 의사 코드를 사용하는 경우가 많다. [* 심지어 어떤 경우엔 대기업이 하청기업에 지시 할 때에도 이런 식으로 하는 경우도 있다.]

주석 용도

만약 당신이 프로그래머고 회사에서 팀 단위 프로젝트를 했을 때, 프로그램 코드에 주석을 달기를 게을리 하면 훗날 자신의 업무 내용을 유지 보수 해야 할 때 뇌에 쥐가 나는 것을 경험 할 것이고, 만약 그렇지 않다 하더라도 다른 팀 멤버 --특히 사장이나 인사권자에게 당신을 해고 할 것을 건의 할 수 있는 당신의 직속 상관-- 에게 좋은 평판을 받지 못할 것이다. 하지만 진심으로 바쁜 상황에서 주석은 없어도 동작은 한다.는 점 때문에, 종종 뒤로 미뤄지고, 미루고 미루다 보면 어느새 머리속에서 지워진다. 요컨데 주석이란건, 만들기는 무지 귀찮고 잘 만들어봐야 월급 오르는데 보탬이 되는 것도 아닌데, 안 만들면 진짜 X된다는 거다.

그런데, 만약 이미 만들어진 의사 코드가 있다면 이를 간단하게 해결 할 수 있다. 프로그래밍 하기 전에 코드 작성 에디터에 의사코드를 집어넣고 죄다 주석처리 하는 것이다. 그 이후에 의사코드 사이사이에 실제 코드를 넣으면 따로 주석을 달 필요가 거의 없다.

작성 방법

의사코드에는 정해진 방식 같은게 아예 없다. 의사코드는 어디까지나 자연스럽게 자신의 생각을 실제 코드에 가깝게 표현 할 수 있다는 점이 장점이기 때문에, 형식이나 틀을 정하기 시작하면 그 장점이 줄어든다. 타인의 작성법을 무작정 따라하기 보단, 여러번 작성 해 가면서 스타일을 확립 해 나가는 것이 더 중요하다.

이 페이지가 처음 작성 될 당시에 있던 예제 코드는 영어로 된 의사코드가 있었는데, 사실 그렇게 어렵게 생각 할 필요가 없다. 위에서도 설명했지만 의사코드는 프로그래밍 언어처럼 보이는 형식에 사람이 보기 편하면 장땡이다. 내가 만든 의사 코드로 기본적인 프로그래밍 지식이 있는 다른 사람이 실제 코드를 만들 수 있다면 더이상 더할것도 뺄 것도 없는 훌륭한 의사 코드다.

특히 한국인이라면 처음에는 자기가 짜려고 하는 언어의 형식에다가 영어 단어 대신 한글을 넣는다는 느낌으로 몇번 만들어 보면 쉽게 감을 잡을 수 있다. 다만, 이것도 지나치면 자기 외엔 아무도 알아먹을 수 없는 괴문서가 태어날 확률이 높다. 괴문서가 되는 이유는 여러가지 있지만, 주로 나오는 문제는 내가 아는 걸, 남도 안다고 할 수는 없다는 점을 잊기 때문에 그런 문제가 발생한다.

만약 학교에 다니고 있다면, 스터디 클럽을 만들고, A학생이 만든 의사코드로 B라는 학생이 실제 코드를 만들 수 있는지 확인 해 보는 방식을 사용하는 스터디 그룹을 결성하면 좋다. 의사 코드를 만드는 담당은 꾸준히 로테이션으로 바꾸면 된다. 스터디 그룹 멤버가 3명 이상이면 UML을 만드는 담당도 정해서 로테이션 돌리면 더 좋다.

혼자서 일하는게 아니라 팀이나 회사 소속으로 일한다면, 팀 프로젝트나 회사에서 이전에 누군가 작성한 의사코드를 참고 하거나, 만약 그런 것이 없다면 옆자리 동료에게 자신이 만든 의사 코드를 보여주면서 꾸준히 피드백을 받다 보면 자연스럽게 나만의 의사 코드 작성 스타일이 성립한다. --특히 자신이 신입이나 평사원 프로그래머 라면, 윗사람에게 자신이 만든 것을 보여주고 피드백 받는 것을 게을리 하지 말자, 그것이 무엇이든 간에.--

의사코드 작성 과정 예제

요구 정의

{{{#!syntax java "a * b = 값" 의 형식으로 구구단을 2단부터 9단까지 출력한다. }}}

의사코드

{{{#!syntax java 공개 클래스 Foo 시작 메인 함수 시작 (문자열) 반복문a 시작 (2에서 9까지) 반복문b 시작 (1에서 9까지) 화면 출력 : a * b = 값 (개행) 반복문b 종료 반복문a 종료 메인 함수 종료 공개 클래스 Foo 종료 }}}

완성된 코드

{{{#!syntax java public class Foo { public static void main(String[] args) { for(int a = 2; a < 10; a ++) { for (int b = 1; b < 10; b++) { System.out.println(a +" * " + b + " = " + a*b); } } } } }}}

의사코드를 주석으로 활용한 경우

{{{#!syntax java //공개 클래스 Foo 시작 public class Foo { //메인 함수 시작 (문자열) public static void main(String[] args) { //반복문a 시작 (2에서 9까지) for(int a = 2; a < 10; a ++) { //반복문b 시작 (1에서 9까지) for (int b = 1; b < 10; b++) { //화면 출력 : a * b = 값 (개행) System.out.println(a +" * " + b + " = " + a*b); }//반복문b 종료 }//반복문a 종료 }//메인 함수 종료 }//공개 클래스 Foo 종료 }}}