소프트웨어 공학이란?
소프트웨어 공학이란? 전기전자 기술자 협회의 소프트웨어 공학 표준에 의하면 소프트웨어 공학이란 소프트웨어의 개발과 운영, 유지보수, 소멸에 대한 체계적인 접근 방법이라고 정의 되어있습니다.
소프트웨어 개발을 위한 체계적인 접근이라는 말은 소프트웨어 개발에 사용되는 방법이 일회성이 아니라 반복 사용이 가능하다는 것을 의미합니다. 방법론을 다른 사람이 사용하더라도 유사한 소프트웨어를 만들 수 있다 라는 뜻이 있습니다. 따라서 소프트웨어 엔지니어링의 목표는 소프트웨어 개발 작업이 결과를 예측할 수 없는 어림짐작이 아니라 과학이나 공학에 더 가깝게 하려는 노력입니다.
앞서 말했던 바와 같이 어려운 소프트웨어는 사용자의 문제를 해결해 줍니다. 그러므로 문제는 사용자의 요구사항을 만족시키기 위하여 소프트웨어를 점진적으로 개발하는 것이라 할 수 있습니다. 소프트웨어 공학이 다루는 근본적인 문제는 소프트웨어를 점진적으로 개발하여 사용자를 만족시키는 것이지만 문제 해결을 위한 접근 방식의 선택에 대한 영향을 주는 요소들이 있습니다. 간단하게 말하면, 프로젝트의 규모, 품질과 생산성, 일관성과 재현성, 변경에 용이, 소프트웨어 공학의 접근 방법, 단계적 개발 프로세스, 품질 보증, 프로젝트 관리가 있습니다.
소프트웨어의 유형
소프트웨어는 여러 가지 유형이 있습니다. 중요한 차이점은 주문형 소프트웨어와 패키지형 소프트웨어, 임베디드 소프트웨어에서 찾아볼 수 있습니다.
주문형 소프트웨어
주문형 소프트웨어의 특징은 특정 고객의 수요를 만족하게 하기 위한 소프트웨어입니다. 따라서 다른 사용자나 기관에는 쓸모가 없거나 잘 맞지 않을 수 도 있습니다. 주문형 소프트웨어는 대체로 사용할 기관 안에서 개발하는 경우가 많으며 외부에 발주하여 개발을 맡기기도 합니다. 계약에 의하여 개발된 주문형 소프트웨어는 사용자가 한정되어 있으며 개발의 성패는 사용자의 필요에 의하여 절대적으로 좌우됩니다.
주문형 소프트웨어를 예를 들면, 웹 사이트, 대기업의 재정을 관리하는 시스템을 들 수 있습니다.
패키지 소프트웨어
패키지 소프트웨어는 공개된 시장에서 판매하기 위한 것이며, 범용 컴퓨터에서 실행되어 기능을 수행합니다. 소프트웨어에 대한 요구는 전적으로 시장의 요구사항에 의하여 결정되며, 비즈니스 분야에서는 주문형 소프트웨어보다는 패키지형 소프트웨어를 사용하는 경우가 많습니다. 그 이유는 훨씬 저렴하고 신뢰도가 높기 때문입니다. 큰 단점은 특정 기관의 요구사항에 꼭 맞지 않을 수 있다는 점입니다.
범용 소프트웨어
범용 소프트웨어는 판매하기 위해 진열된 판매대에서 뽑혀 나감으로써 상용 기성품 소프트웨어라고 부르기도 합니다. 범용 소프트웨어의 제작자는 대량으로 판매되기를 원하지만 성패는 시장의 힘에 의하여 좌우됩니다.
임베디드 시스템
임베디드 시스템은 대량의 소비자와 상품을 추구해 나가므로 소프트웨어 복제의 수량이 엄청 많다. 반면 범용 소프트웨어는 PC와 같은 범용 컴퓨터에서 실행되므로 임베디드 소프트웨어보다는 복제가 적습니다. 주문형 복제 숫자는 가장 적지만 시스템이 다양하고 개발에 종사하는 인력들이 많습니다.
이외에도 범용 소프트웨어를 구입하여 커스텀화 하여 사용하는 방법도 있습니다. 비용이 적게 든다는 장점이 있지만 범용 소프트웨어의 새 버전이 출시되면 계속 커스텀화 작업을 반복해서 사용해야 하는 위험이 있습니다.
소프트웨어는 동작되는 하드웨어 환경에 따라 병렬처리, PC 또는 워크스테이션, 모바일 소프트웨어로 분류되기도 하며, 운영체제 환경에 따라 다일 사용자, 다수 사용자, 위도 및 인터넷 환경 소프트웨어로 구분됩니다.
소프트웨어의 구분하는 가장 기본적인 방법으로는 소프트웨어가 사용되는 분야입니다. 예를 들면, 행정, 금융, 의료, 국방, 항공, 운송, 자동차, 교육 등에서 소프트웨어가 사용되는 분야에 따라 구분됩니다.
소프트웨어는 기능도 중요하지만 품질 또한 매우 중요합니다. 소프트웨어에 의하여 제어되는 생산라인이나 항공기, 그리고 중요한 데이터를 처리하는 정보 시스템인 경우에는 소프트웨어 제품에 대한 신뢰도가 높아야 합니다. 작은 사용자의 오류나 이상 현상이 발생하더라도 원래의 기능을 수행할 수 있는 고장 허용성과 정보의 기밀을 유지해야 하며, 제품 환경이 바뀌었을 때도 수정이 용이해야 합니다.
소프트웨어의 품질이 주된 결정 요인은 소프트웨어에 포함된 오류이며 상품으로 서의 소프트웨어를 평가할 때 품질은 매우 중요한 평가 요소입니다.
소프트웨어와 시스템
시스템의 정의를 국어사전에 찾아보면 '필요한 기능을 실현시키기 위하여 관련 요소를 어떤 법칙에 따라 조합한 집합체’ 라고 되어있습니다. 소프트웨어도 독립적으로 존재하는 것이 아니라 컴퓨터를 기반으로 하는 여러 시스템과 관계를 맺고 있습니다. 예를 들면, 은행 업무 전산화에 사용되는 소프트웨어는 현금 자동 인출기, 중앙 컴퓨터 등의 하드웨어와 고객의 거래 계좌에 대한 원장이 보관된 데이터 베이스, 전표 등의 서류, 은행 업무가 진행되는 절차, 실제 수납을 받는 은행원 등 여러 서브 시스템과 유기적으로 상호 작용하고 있다. 각 서브시스템은 다른 서브 시스템으로부터의 자극에 대한 영향을 받고 형성된 것이다. 결국 소프트웨어를 개발하는 일은 이러한 시스템 안에 속하는 여러 요소를 파악하고 그들의 관계를 설정하는 작업이 포함되어 있습니다.
하편 소프트웨어 그 자체도 상호 동작하는 서브시스템들로 구성된 하나의 시스템입니다. 따라서 소프트웨어는 시스템이라는 관점에서의 접근은 관찰이 필요합니다.
다음은 네 가지의 중요한 성질을 가지고 있는 시스템을 알아봅시다.
서브시스템 : 시스템은 관련 깊은 서브시스템들로 구성되어 있습니다. 교통 시스템은 신호기, 신호체계, 도로망 등 여러 가지 요소가 있고 이들 요소들은 원활한 교통 소통과 제어를 위하여 아주 밀접한 관계로 이루어져 있습니다.
기능적 분할 : 시스템은 규모가 작은 부속 시스템 (서브 시스템이라 함)들로 나눌 수 있습니다.
시스템 경계 : 시스템은 어떤 것이건 시스템과 주변 환경을 구분할 수 있는 경계가 있습니다. 이곳이 입력과 출력이 만나는 곳 입니다.
자동화 경계 : 시스템이 자동화된 부분과 수동 작업 분을 나누는 경계입니다.
결국 소프트웨어 엔지니어는 개발하려는 소프트웨어에 대하여 시스템 적으로 생각해야 하며 다음과 같은 사항들을 파악할 수 있어야 합니다.
- 대상을 시스템으로 파악할 수 있어야 합니다.
- 서브시스템을 찾아낼 수 있어야 합니다.
- 시스템의 특성과 기능을 찾아낼 수 있어야 합니다.
- 시스템의 경계가 어디인지를 찾아낼 수 있어야 합니다.
- 시스템에 대한 입력과 출력을 찾아낼 수 있어야 합니다.
- 서브시스템 사이의 관계를 찾아낼 수 있어야 합니다.
예를 들게 되면, 공항의 수화물 처리 시스템을 생각해 봅시다. 수화물 처리 시스템은 승객의 화물을 공항 한 곳에서 다른 곳으로 운반하는 목적을 가지고 있습니다. 수화물 처리 시스템은 목적지를 스캔하고 운반하는 컨버터 벨트와 같은 기계를 포함하고 있습니다. 또한 수화물을 체크인 하고 하드웨어를 제어하는 소프트웨어도 있습니다. 수화물 처리 요원은 하드웨어와 소프트웨어를 둘 다 조작을 합니다.
수화물 처리 시스템은 공항이라는 환경 안에 존재하여 항공 정보 시스템과 같은 환경에 있는 다른 시스템을 연동 시킵니다.
참고자료 출처 : 새로쓴 소프트웨어 공학 (저자 : 최은만)