>  안녕하세요. 존경하는 김학규 개발자님. 저는 게임 개발자를 꿈꾸며 지난 10년을 살아온 대학교 2학년 생입니다. 지금 WinAPI로 network card게임 개발을 하려고 합니다.

먼저, WinAPI 라는 것은 Win32 를 말하는 것인가요? Winsock 을 말하는 것인가요?

>
>  제가 실전 코딩은 자신이 있지만. 큰 프로젝트를 설계하는 부분에는 매우 취약합니다. 이 부분을 집중적으로 공부하려고 하는데. 어떻게 하면 좋을까요?
>
>  1. 설계를 하는 방법

객체지향 이론에 따르면 소프트웨어 설계를 하는 방법은 3 가지 측면으로 접근할 수 있다고 합니다.

첫번째는 오브젝트 중심의 설계입니다. 시스템 상에 각각 행동을 하는 개체들이 무엇인가를 규명하고, 그 각각의 개체들이 어떤 속성과 어떤 행동을 하며, 그 개체들간에는 어떠한 연관관계가 있는지를 규명하는 것입니다.

두번째는 흐름 중심의 설계입니다. 시간의 순서에 따라 순차적으로 시스템 상에 어떤 일이 일어나고 어떤 경우에 어떻게 되는가를 중심으로 설계를 하는 것입니다. 플로우차트가 흐름 중심의 설계의 대표적인 예입니다.

세번째는 기능 중심의 설계입니다. 시스템 내에 어떤 기능적 요소가 있는지를 규명해서 각각에 대한 해결책을 만들어놓는 것입니다.

이 3 가지 설계접근방법은 상호보완적으로 구성되기 때문에 사물을 입체적으로 관찰하려면 위, 앞, 옆면에서 보아야 모양을 자세히 파악할 수 있는 것처럼 3 가지 측면에서 설계를 해볼 필요가 있습니다.

>  2. 좋은 설계란?

잘 설계된 프로그램이 갖추어야 할 미덕이라면 다음과 같은 사항을 들 수 있습니다.

첫째, 요구된 사항을 적절하고 충실하게 해결한다. (적절성)
예를 들면 속도가 충분히 빨라야 한다던가, 용도에 예정된 시스템에서 사용이 가능할 정도로 메모리가 충분해야 한다던가등의 애초 기대했던 목표를 충족해야 하며, 만들기로 했던 기능을 모두 포함하고 있어야 한다는 것입니다. 이것을 떠나서는 더 이상의 얘기는 의미가 없겠죠.

둘째, 앞으로의 바뀔 요구에 대비할 수 있는 구조여야 한다 (유연성)
처음에 요구했던 사항이외에도 얼마든지 더 많은 요구사항이 생기기 마련입니다. 업데이트를 해야 한다던가, 새로운 버전을 만들어야 한다던가 하는 요구는 늘 있습니다. 그렇기 위해서는 프로그램이 쉽게 고칠 수 있는 체제로 짜여져 있어야 합니다.
프로그램을 쉽게 고칠 수 있을려면 Simplicity, Generality, Clarity (단순성, 일반성, 명료성) 에 부합해야 합니다. 불필요한 군더더기가 없으면서, 일반적인 사항을 충분히 일반적인 개념으로 표현하고 다른 사람이 소스코드나 설계 문서를 읽었을때 쉽게 이해될 수 있는 프로그램이 좋은 프로그램입니다.
읽기 복잡한 프로그램은 절대 좋은 프로그램이 될 수 없습니다. 잘 짠 프로그램은 읽기 쉬운 프로그램입니다.
소프트웨어 공학의 기본 명제중 하나가, '코드는 한번 씌여지고 많이 읽힌다' 라는 점입니다.

잘 만들어진 프로그램은, 담당자가 바뀌어도 큰 문제를 일으키지 않고, 버그가 적으며, 업그레이드나 포팅이 용이하고, 고성능으로 확장이 용이합니다.

>  3. 설계의 단계

설계의 과정은 분석, 디자인, 구현, 테스트가 순환적으로 이루어지는 것이 보통입니다.

분석 -> 디자인 -> 코딩 -> 테스트 -> 재분석 -> 재디자인 -> 재코딩 -> 재테스트 -> 재재분석 -> ...

>  4. 설계를 배울수 있는 방법

설계를 눈에 보이는 도표로 시각화하는 것은 중요한 일입니다. 음악을 배우기 위해 악보 읽고 쓰는 법을 배우는 것이나 똑같습니다. 소프트웨어 설계도를 그리는 형식중 UML (Unified Modeling Language) 라는 산업표준이 소프트웨어 설계도를 그리는 표준으로 자리잡고 있습니다. UML 에 대한 개론서를 보는 것도 매우 중요한 기초학습입니다.

실제로 설계를 하는 방법중, 제일 확실한 방법은 기존의 유사한 시스템의 설계를 참고하는 것입니다.

소프트웨어 설계자들은 반복적으로 여러가지 시스템에 대한 설계를 거듭하면서 설계중에 공통적으로 나타나는 부분들을 간파하게 되었습니다. 그들은 이것을 '패턴' 이라고 이름붙이고, 이러한 패턴들이 다시 여러가지 프로젝트에서 적용될 수 있다는 것을 확인했습니다.

패턴을 응용하는 것은 현대 소프트웨어 설계에서 빠질 수 없는 매우 중요한 분야로 인식되고 있습니다. Design Pattern 이나 Pattern of Software Architecture 같은 책들은 패턴에 대해 잘 소개한 중요한 책들입니다.

>
>  중에 필요한 것을 가르쳐 주셨으면 합니다. 부탁드립니다. (--)(__)

imcgames 의 김학규입니다