소프트웨어 (Software)
소프트웨어는 컴퓨터를 작동시키는 프로그램으로 하드웨어의 동작을 제어하는 명령어들로 구성되어 있다.
소프트웨어 특징
소프트웨어가 가지는 특징은 다음과 같다.
복잡성(Complexity)
: 소프트웨어가 자동화하려는 대상은 수많은 내부 요소들로 이루어져 있어 복잡하다.순응성(Conformity)
: 환경이나 데이터의 변화에 따라 적절하게 변형된다.변경성(Changeability)
: 소프트웨어는 문자로 구성된 프로그램으로 쉽게 변경 가능하며 개발 과정 중 자주 변화된다.비가시성(Invisibility)
: 소프트웨어는 가시적인 매체에 저장되지만 그 자체는 무형이며 구조가 코드 안에 있기에 쉽게 드러나지 않는다.
소프트웨어 종류
소프트웨어는 크게 세 가지 유형으로 분류된다.
주문형 소프트웨어
: 특정 고객이나 기업의 요구를 만족시키기 위하여 제작된 소프트웨어패키지형 소프트웨어
: 패키지화하여 상업적으로 판매하는 소프트웨어임베디드 소프트웨어
: 다른 시스템에 내장된 소프트웨어
소프트웨어 개발 작업 (Software Development)
소프트웨어 개발 시스템
소프트웨어는 독립적으로 존재하지 않고 컴퓨터를 기반으로 하는 여러 시스템과 관계를 맺는다. 따라서 소프트웨어 개발은 시스템 안에 속하는 여러 요소를 파악하고 관계를 설정하는 작업이 포함된다. 시스템은 다음의 성질을 가진다.
- 서브 시스템: 시스템은 밀접히 관련된 서브 시스템들로 구성된다.
- 기능적 분할: 시스템은 규모가 작은 부속 서브 시스템들로 분할 가능하다.
- 시스템 경계: 시스템과 주변 환경을 구분할 수 있는 경계가 있다. 이 경계가 입력과 출력이 맞닿는 곳이다.
- 자동화 경계: 시스템은 자동화된 부분과 수동 작업 부분을 나누는 경계이다.
소프트웨어 개발의 기본 활동
소프트웨어를 만들고 실사용 단계까지 가기 위해서는 여러 사람들의 지적 활동이 필요하다. 이를 통해 다양한 결과물이 만들어지는데 이때, 네 가지의 기본 활동이 필요하다.
명세화(Specification)
: 소프트웨어 제품을 생산하기 전, 요구 사항을 엄격하게 정리하여 부정확하게 개발하여 제품 개발이 실패하는 것을 방지한다.구현(Coding)
: 시스템의 명세를 주어진 여건에 맞게 설계하여 프로그래밍 언어로 변환하는 것이다. 주어진 설계에 대해 최선의 방법으로 구현하는 것이다.검증(Verification)
: 구현된 소프트웨어가 고객의 의도와 일치하는지 확인하는 작업이다.유지보수(Maintenance)
: 개발된 이후로도 사용 단계에 결함이 있다면 수정하고, 고객의 요구 변화에 맞게 소프트웨어를 수정한다.
소프트웨어 개발 작업의 특징
소프트웨어 개발은 공장에서 대량 생산하는 방식으로 이루어지지 않기에 하드웨어 제조와 관련하여 오랜 기간 축척된 생산 기술이 소프트웨어 개발에 그대로 적용되지 않는다.
예를 들어, 2배의 인원을 투입한다고 소프트웨어 개발 생산성이 2배로 늘지 않고, 2배의 시간을 준다고 해서 결과가 배로 향상되지도 않는다. 소프트웨어의 질과 양은 개발에 참여한 개인의 능력에도 크게 좌우된다.
WARNING!
즉, 인적 요인과 비가시성은 소프트웨어 개발에 대한 공학적 접근을 어렵게 만든다.
소프트웨어 개발에 있어 간단한 문제에 대해서는 충분한 해결책이 제시되었으나, 여전히 소프트웨어 개발에는 다음과 같은 어려움들이 존재한다.
- 명세화의 어려움: 소프트웨어 개발은 보고 사용하기 전까지 필요한 것을 명확히 정의하기 어렵다.
- 재사용의 어려움: 소프트웨어는 다루는 문제가 똑같지 않기에 미리 재사용할 부품을 만들기 어렵다.
- 예측의 어려움: 소프트웨어는 여러 외부 요소(법규, 하드웨어, 성능, 업무 절차)의 영향을 받기에 사전 견적이나 프로젝트의 규모를 예측하기 어렵다.
- 유지보수의 어려움: 다른 사람이 개발한 소프트웨어는 쉽게 이해하는 것이 어렵고, 이해해서 고쳐도 다른 부분에 오작동을 일으키기 쉽다.
- 고품질의 어려움: 한 줄의 코드를 수정하더라도 테스트할 내용이 많아지고, 모든 실행 조합을 다 테스트하는 것은 불가능하다.
비효율적인 소프트웨어 개발
소프트웨어를 개발할 때 설계, 테스팅, 문서화 등을 생략하고 코딩에만 집중하는 것은 비효율적인 소프트웨어 개발이다. 계획이나 절차 없는 소프트웨어를 개발 방식은 코딩과 수정 작업의 연속이다. 그때그때마다 즉흥적으로 프로그래밍하고 사용자가 원하는 것과 다르면 수정하는 방식을 반복하여 소프트웨어를 완성시키는 것이다.
이러한 소프트웨어 개발 방식은 다음의 문제를 일으킨다.
- 개발 지연과 예산 초과: 요구가 명확하게 파악되지 않고 프로그램의 골격이 확정되지 않아 계속 수정을 반복하게 된다.
- 낮은 품질: 소프트웨어의 결함은 개발 과정에 포함되는 인간의 실수 때문인데, 사람의 실수를 관리하는 것은 매우 어려운 일이다.
- 유지보수의 곤란함: 소프트웨어는 배포 이후에도 많은 수정이 필요한데, 시스템을 구성하는 각 요소를 잘 구조화하지 않고 관리하지 않으면 간단한 수정도 어려워진다.
- 재작업: 구조화되지 않고 마구잡이로 개발하고 수정한 프로그램은 재작업 가능성이 높아진다.
소프트웨어 공학 (Software Engineering)
결국, 비효율적인 소프트웨어 개발을 지양하고 “체계적으로 접근하고 원리를 적용하여 소프트웨어를 개발하기 위하여” 소프트웨어 개발을 공학적으로 접근하려는 개념이 도입되었다.
소프트웨어 공학의 목표
소프트웨어 개발에 공학적 접근 방법을 적용하는 궁극적인 목표는 다음과 같다.
- 복잡도 저하: 대규모 소프트웨어는 복잡하고 개발하기 어렵기에 큰 문제를 소규모의 작은 문제로 나누어 해결한다.
- 비용 최소화: 소프트웨어 개발은 많은 인력이 필요하고 비용이 많이 드는 작업이다. 이때, 필요하지 않는 일과 중복되는 일을 최소화한다.
- 개발 기간 단축: 계획 없이 하는 일은 시간을 낭비하는데, 개발 작업을 잘 계획하고 설계하여 개발 기간을 단축시킨다.
- 대규모 프로젝트 관리: 큰 프로젝트는 단기간에 구축하기 어렵기에 공학적 접근을 통하여 관리를 진행한다.
- 고품질 소프트웨어: 결함을 모두 해결하기 위해 테스트와 유지보수 작업 방법을 동원하여 프로젝트를 진행한다.
- 효율성: 소프트웨어 내에서 표준화 작업을 수행하여 작업의 효율을 높인다.
결국, 소프트웨어 공학의 목표를 한 줄로 정의하면 다음과 같다.
NOTE!
소프트웨어 공학: 여러 원리와 방법을 적용하여 품질 좋은 소프트웨어를 최소의 비용으로 계획된 일정에 맞춰 개발하는 것이다.
소프트웨어 공학의 주제
궁극적인 목표인 “품질”, “생산성”, “비용”을 고려하여 개발하기 위해 소프트웨어 공학은 다음의 세 가지 작업으로 나눌 수 있다.
단계적 프로세스
: 소프트웨어에 대한 개념을 파악하고 소프트웨어를 구현할 때까지 정해진 순서의 작업을 수행한다. 비지니스 요구를 파악하고 타당성을 검토하며 시스템이 제공해야 할 요구와 성능을 명세화한다. 설계하고 구현하고 테스트하여 목표 환경에 설치하는 단계적 절차를 밟는다.품질 보증
: 개발 작업이 적절히 수행되었는지 확인한다. 개발 작업 결과물이 요구에 일치하는지, 품질 수준에 맞는지 검사한다.프로젝트 관리
: 개발과 품질 보증 작업을 관리하고 감독한다. 소프트웨어 시스템이 정해진 일정과 예산 내에 진행되도록 확인하고 관리한다.
이 세 가지의 작업을 통해 품질과 생산성, 비용을 고려한 소프트웨어 개발을 이루어낼 수 있다.