프로그램 설계
프로그램 설계(Programming Design)는 소프트웨어 공학의 개발 과정 중 하나로, 시스템의 각 모듈 안에서 일어나는 일들과 모듈 안에서의 자료구조에 관하여 설계하는 단계이다. 각 모듈 안에 사용될 알고리즘을 고안하는데 이는 소프트웨어 개발에서 설계 도면과 같은 역할을 한다. 이런 프로그램 설계는 시스템 구조설계와 분리하여 별도의 단계로 추진하기도 하지만 때로는 병행 진행하기도 한다. 프로그램 설계는 효율적이고 유지보수가 가능한 소프트웨어 시스템을 만들기 위해 필수적인 활동이며 요구사항 분석을 바탕으로 시스템의 목표를 이루기 위한 적절한 아키텍처와 구조를 결정하는 것으로서 잘 설계된 소프트웨어 시스템은 확장성, 유지보수성, 재사용성 등을 갖추어 복잡한 프로젝트의 성공을 보장하는 데 도움을 준다. 이에 프로그램 설계는 크게 두 가지 측면에서 이루어진다.
- 구조적 설계: 시스템을 하위 모듈로 분할하고 각 모듈 간의 인터페이스와 관계를 정의한다. 모듈은 기능적으로 관련된 작업을 수행하는 코드 블록으로 소프트웨어 시스템을 조직화하는 데 사용되며 시스템 전체적인 레이아웃을 계획하고 모듈 간의 데이터 및 제어 흐름을 결정하는 역할이다.
- 상세 설계: 구조적 설계 완료 후, 각 모듈의 내부 동작 및 구현 세부 사항을 정의하는 단계로 모듈 내부의 변수, 함수, 알고리즘 등을 설계하며 코드의 실제 구현 방식을 결정한다. 이는 실제 프로그래밍 단계에 진입하기 전에 개발자들이 따라야 할 로드맵을 제공한다.
구조적 설계에 이어 상세설계 단계는 모듈을 하나씩 다룬다. 각 모듈을 구현하기 위한 알고리즘을 선택하고 기술하는 것이다. 시스템 구조설계가 잘 이루어진 상태라면 각 모듈 안의 설계는 어렵지 않다. 각 모듈의 역할이 분명하고 모듈 사이의 결합도가 낮게 구성되기 기 때문이다. 설계의 원리들을 따 잘 설계하였다면 모듈을 어떻게 구현할 것인가를 결정하는 일은 알고리즘 선택으로 국한된다.
알고리즘 선택
알고리즘 선택의 3가지 원칙은 다음과 같다.
- 정확성: 알고리즘은 기본적으로 정확해야 한다. 기술된 알고리즘은 제공된 자료를 정확하게 처리하여야 하며 정의된 기능 또한 정확하게 수행하여야 한다. 이런 상황에서 모듈이 수행하여야 할 기능이 새로운 것이 아니라면 기존의 프로그램이나 알고리즘 모음집 등의 자료를 참고하는 것도 좋은 방법이다. 프로그램을 처음부터 새로 구현하는 것보다 증명된 알고리즘을 사용하거나 이미 수행된 프로그램을 사용하면 개발비용과 시간을 절약할 수 있다.
- 효율성: 알고리즘의 수행에 필요한 컴퓨터 자원의 양을 말한다. 이는 기억장치의 소요량과 수행시간이다. 특히 수행시간은 알고리즘과 밀접한 관계가 있다. 알고리즘의 기본 동작 수는 알고리즘에 따라 선형적일 수도 있고 비선형적일 수도 있다. 같은 문제에 대해서 접근법이 다르다면 그 결과는 천차만별이다. 즉 효율성을 높이면 처리 속도는 매우 크게 개선되며 모듈 안에서의 효율성과 전체 시스템의 효율성을 같이 고려하여 알고리즘을 구현해야 한다.
- 적합성: 알고리즘은 목표 시스템의 하드웨어와 소프트웨어에 맞아야 한다. 이는 시스템의 특성, 목표, 제약조건 등을 충분히 감안하여 그 방향성에 맞춰 알고리즘을 구사하여야 한다. 설계단계의 모든 것이 고려되어야 하며 필요시 보다 맞는 알고리즘으로 대체할 수 있는 계획을 가지고 있어야 한다.
알고리즘 표현
설계단계에서 사용되는 모든 표현법은 매우 중요하다. 이는 의도하는 바를 정확하게 나타낼 수 있고 의사소통을 원활하게 해준다. 모듈 안 알고리즘을 기술하는 방법도 여러 가지가 있다.
- 나씨-슈나이더만도표(Nassi-Shneiderman Diagram): 제어 구조를 시각적으로 표현하는 것으로 제어 흐름을 명확하게 표현하여 프로그램의 논리를 이해하고 분석하는데 순차, 선택, 반복과 같은 기본적인 제어 구조를 사용하여 알고리즘을 표현
- 자연어: 일반적인 언어를 사용하여 알고리즘을 설명하는 것으로 비기술적인 사람들도 쉽게 이해할 수 있으나 그 모호성이나 해석 차이로 인해 정확한 이해를 보장하지 않을 수 있음
- 순서도(Flowchart): 도형과 화살표를 사용하여 알고리즘의 흐름을 시각적으로 나타내는 것으로 시작과 종료 점, 결정, 처리, 입출력 등의 기호로 표현하여 알고리즘의 논리 구조를 표현
- 의사 코드(Pseudo code): 일반 언어와 프로그래밍 언어의 중간 형태로 인간이 이해하기 쉬운 형태의 코드이며 실제 프로그래밍 언어가 아니므로 특정 구문이나 규칙에 얽매이지 않고 알고리즘의 논리적 흐름을 설명 가능
- 프로그래밍 언어: 알고리즘을 실제 프로그래밍 언어로 구현하여 나타내는 방법으로 컴퓨터가 직접 실행할 수 있도록 하며 알고리즘의 구현 세부 사항을 정확히 표현 가능
- 통합 모델링 언어(UML: Unified Modeling Language): 주로 소프트웨어 설계와 모델링에 사용되며 다이어그램을 사용하여 시스템의 구조와 동작을 표현하고 클래스 다이어그램, 시퀀스 다이어그램, 상태 다이어그램 등을 활용
- 스토리보드: 주로 사용자 인터페이스 설계에서 활용되며 그림과 텍스트를 사용하여 사용자와 시스템 간의 상호작용 흐름을 시각적으로 표현
사용자 인터페이스 설계
사용자 인터페이스 설계(User Interface Design)는 소프트웨어 공학에서 사용자와 소프트웨어 시스템 간의 상호작용을 디자인하는 과정으로 사용자가 시스템과 소통하는 방식을 결정하고 설계한다. 사용자 인터페이스는 시스템의 기능을 사용자가 이해하고 조작할 수 있도록 돕는 중요한 요소이며 사용자 만족을 전제로 한다. 이에 사용자 인터페이스에 대한 평가 요소가 중요하며 특히 배우기 쉬워야 하고 반응속도가 좋고 사용 중 오류의 빈도가 낮아야 하며 사용자를 만족시키고 사용법을 계속 유지해야 하는 점이 강조된다. 이를 모두 만족시키는 것이 이상적이기는 하나 중요한 사항을 선택적으로 충족시키는 경우도 많다. 이에 사용자 요구사항에 대한 우선순위를 고려하여 높은 우선순위부터 사용자 만족을 충족시키는 형태로 개발해야 한다. 이에 사용자 인터페이스 설계는 다음과 같은 목표를 갖는다.
- 사용자 친화성: 인터페이스는 사용자가 직관적으로 이해하고 사용할 수 있도록 설계되어야 하며 사용자가 복잡한 기능을 쉽게 찾고 사용할 수 있도록 지원
- 효율성: 인터페이스는 사용자가 작업을 빠르게 수행하고 목표를 달성해야 하며 불필요한 클릭이나 탐색을 최소화하여 작업의 효율성 보장
- 일관성: 인터페이스 요소들은 일관된 디자인과 동작을 가져야 하며 사용자가 유사한 기능을 다양한 부분에서 일관되게 경험할 수 있도록 작업
- 피드백과 가시성: 사용자의 작업에 대한 적절한 피드백과 시각적인 표시를 제공하여 사용자가 자신의 작업을 추적하고 이해할 수 있도록 작업
- 유연성: 다양한 사용자 요구와 환경을 고려하여 다양한 장치와 환경에서 작동할 수 있는 인터페이스 고려
좋은 사용자 인터페이스 설계는 소프트웨어 제품의 성공과 사용자 만족도에 큰 영향을 미치며 사용자들의 요구와 행동을 고려하여 개발되어야 하는데 보통은 다음과 같은 단계로 진행된다.
- 요구사항 분석
- 사용자의 요구사항과 기대를 이해하고 문서화
- 사용자 그룹을 식별하고, 사용자의 특성, 선호도, 작업 환경 등 파악
- 시스템의 목적과 기능, 사용자의 목표 정의
- 설계 및 기획
- 사용자 경험(UX)을 중심으로 설계
- 인터페이스의 레이아웃, 구조, 흐름 계획
- 기능적 요구사항을 각각의 화면 또는 모듈 매핑
- 정보 구조를 설계하고, 사용자가 쉽게 찾아서 사용할 수 있도록 계획
- 프로토타이핑
- 초기 디자인 아이디어를 실제로 시뮬레이션하는 프로토타입 개발
- 프로토타입을 사용하여 사용자의 피드백을 수집하고, 문제점이나 개선 사항 확인
- 프로토타입을 통해 디자인과 기능을 검증하며, 수정과 보완 진행
- 디자인
- 프로토타입을 기반으로 시각적인 디자인 수행
- 색상, 아이콘, 글꼴 등을 선택하여 사용자가 시각적으로 쉽게 인터페이스를 이해할 수 있도록 가이드
- 일관성 있는 디자인 가이드라인을 따르면서 사용자가 헷갈리지 않도록 지침제시
- 개발
- 디자인된 인터페이스를 실제 코드 구현
사용자 인터페이스 요소들을 프로그래밍 언어와 기술을 사용하여 구현
- 디자인된 인터페이스를 실제 코드 구현
- 테스트
- 인터페이스의 기능, 사용성, 성능 테스트
- 버그, 오작동, 일관성 문제 등을 식별하고 수정
- 다양한 시나리오와 테스트 케이스를 사용하여 인터페이스 검증
- 사용자 피드백 수집
- 완성된 인터페이스를 실제 사용자들에게 제공하고 피드백 수집
- 사용자의 의견을 수렴하여 인터페이스를 개선 보완
- 배포 및 유지보수
- 최종적으로 개발된 사용자 인터페이스 배포
- 사용자들의 피드백을 기반으로 지속해서 개선과 보완 작업 수행