본문 바로가기
공부/소프트웨어공학

[소프트웨어공학] 서론2 (소프트웨어 프로세스 모델과 소프트웨어 공학)

by 사당동호랭이 2023. 7. 15.

 소프트웨어 프로세스 모델이란 무엇인가?

 

 소프트웨어 프로세스 모델은 소프트웨어 프로세스를 간단히 서술한 것으로, 소프트웨어 프로세스의 한 가지 관점을 제시한 것이다. 프로세스 모델은 소프트웨어 제품, 소프트웨어 공학에 참여한 사람의 역할, 소프트웨어 프로세스의 일부 활동을 포함한다. 소프트웨어 프로세스 모델의 유형은 다음과 같다.

 

 1. 워크플로 모델 : 이것은 입력, 출력, 확실성(dependability) 과 함께 프로세스 내의 일련의 활동을 나타낸다. 이 모델의 활동은 사람의 행동을 의미한다.

 2. 데이터 흐름 혹은 액티비티 모델 : 이것은 활동의 집합으로서 프로세스를 나타내는데, 각각의 활동이 데이터 변환을 실행한다. 명세서와 같은 프로세스의 입력이 어떻게 설계와 같은 출력으로 변환되는지를 보여준다. 활동은 사람 혹은 컴퓨터에 의해서 실행되는 변환을 나타낼 수도 있다.

 3. 역할/행동 모델 : 소프트웨어 프로세스에 참여한 사람의 역할과 그 사람이 책임져야 할 활동을 나타낸다. 

 

 대부분의 소프트웨어 프로세스 모델은 소프트웨어 개발을 위한 세 가지 모델 혹은 패러다임 중의 하나를 기본으로 한다.

 

 1. 폭포수 모델 : 이것은 요구 분석, 소프트웨어 설계, 구현, 시험과 같이 분리된 프로세스 단계로서 위의 활동을 나타낸다. 한 단계가 완료되면 개발은 다음 단계로 넘어간다. (waterfall)

 2. 반복적인 개발 : 이 방법은 명세화, 개발, 검증 활동이 서로 겹친다. 초기 시스템은 매우 추상적인 명세로부터 빠르게 개발된다. 추후에 고객의 요구를 만족시키는 시스템을 생산하기 위해서 고객의 요구를 이용하여 다듬어져서 고객에게 인도될 수 있다. 혹은 좀 더 구조적인 방법을 이용하여 더욱 견고하고 유지보수가 용이한 시스템을 만들기 위해서 재구현될 수도 있다.

 3. 컴포넌트 기반 소프트웨어 공학(CBSE) :  이 기술은 시스템의 일부분이 이미 존재한다고 가정한다. 시스템 개발 프로세스를 처음부터 시작하기보다는 이러한 부품들은 통합하여 만든다. 

 

 소프트웨어 공학의 비용은 무엇인가?

 소프트웨어 프로세스에 있는 활동에 대한 비용의 분포는 개발될 소프트웨어 프로세스의 유형과 사용될 프로세스에 따라 다르기 때문에 이 질문에 대해 간단히 답을 할 수 없다. 예를 들어 실시간 소프트웨어는 웹 기반 시스템보다 광범위한 검증과 시험이 요구된다. 그러나 소프트웨어 개발에 따라 서로 다르게 적용되는 일반적인 방법은 그것에 적용되는 소프트웨어 프로세스 활동에 따라 서로 다른 비용 분포를 갖는다. 

 폭포수 모델에서는 명세화, 설계, 구현, 통합 비용이 따로 측정된다. 시스템 통합과 시험은 가장 비용이 많이 드는 개발 활동이라는 것을 알 수 있다. 정상적으로 개발 비용은 40% 정도이지만 중대한 시스템에서는 50%를 차지할 수도 있다.

 만약 소프트웨어가 반복적인 방법을 사용한다면 거기에는 명세화, 설계, 구현, 개발에 대한 명확한 구분이 없다. 명세화 비용은 개발 전에 고수준의 명세서가 만들어지기때문에 줄어들 수 있다. 명세화, 설계, 구현, 통합, 시험은 개발 활동 내에서 동시에 이루어진다. 그러나 일단 초기 구현이 완료되면 독립적인 시스템 시험 활동이 여전히 필요하다.

 컴포넌트 기반 소프트웨어 공학은 사용한 지 얼마 되지 않았기 때문에 개발 활동에 대한 비용을 정확히 판단할 수 없다. 그러나 개발 비용은 통합과 시험 비용에 비해 상대적으로 적다. 통합과 시험 비용은 컴포넌트가 명세사와 일치하는지 그리고 다른 컴포넌트와 함께 예상대로 잘 동작하는지를 보장해야 하기 때문에 증가한다. 

 개발 비용 외에 사용 시작 후에 소프트웨어를 변경하는 데 비용이 발생한다. 진화비용(evolution cost)는 시스템의 종류에 따라 급격히 변한다. 10년 이상 사용된 지휘 및 통제 시스템과 같은 수명이 긴 소프트웨어 시스템은 명세화, 개발에 비해 약 3,4 배 정도 비용이 더 들어간다. 그러나 작은 상용 시스템은 수명이 짧고 진화 비용도 줄어든다.

 이러한 비용 분포는 고객에 의해 명세화되고 계약자가 개발하는 맞춤 소프트웨어에도 적용된다. PC용 소프트웨어 제품은 비용이 다를 수 있다. 이러한 제품은 대개 혁신적인 개발 방법을 사용하여 개괄적인 명세서로부터 개발되므로 명세화 비용이 비교적 낮다. 그러나 그것은 상이한 범위의 구성 환경에서 이용되는 것을 염두에 두고 개발되므로 집중적으로 시험되어야 한다. 

 일반적인 소프트웨어 제품에 대한 진화 비용은 예측하기 힘들다 많은 경우에 제품에 대한 형식적인 개선은 거의 없다. 한번 제품에 대한 버전이 출시되면 다음 버전을 위한 활동이 시작되고 시장성을 고려하여 이미 사용자가 구매한 제품에 대한 수정본보다는 새로운 제품으로 내놓는 경우도 있다. 그러므로 진화 비용은 맞춤형 소프트웨어에서와 같이 분리되어 추정할 수 없기 때문에 단순히 다음 버전에 대한 개발 비용으로 산정한다. 

 

 소프트웨어 공학 방법이란 무엇인가?

 소프트웨어 공학 방법은 비용 효과를 고려하여 고품질의 소프트웨어 생산을 돕기 위해서 사용되는 구조적 방법이다. 구조적 분석과 JSD와 같은 방법은 1970년대에 처음 개발되었다. 이러한 방법은 시스템의 기본 기능을 찾기 위해서 시도되었으며, 기능지향 방법은 아직도 사용되고 있다. 1980년대와 1990년대에는 이러한 기능지향 방법이 부치와 럼바우가 제안한 객체 지향 방법에 의해 보완되었다. 이러한 다양한 방법은 UML(unified modeling language)로 통합되었다.

 이상적인 방법은 존재하지 않으며 방법마다 적용되는 분야가 다르다. 예를 들어, 객체 지향 방법은 엄격한 실시간 시스템에서는 적절하지 않지만 대화식 시스템에서는 적합하다. 

 모든 방법은 그림으로 표현될 수 있도록 시스템을 모델링할 수 있으며 시스템 설계나 분석에 사용된다. 방법은 여러 구성요소를 포함한다. 

 

구성요소 설명
시스템 모델 기술 개발될 시스템 모델에 대한 설명과 그 모델을 정의하기 위해서 사용되는 기법 객체 모델, 데이트 흐름 모델, 상태 기계 모델 등
규칙 시스템 모델에 적용되는 제약 시스템 모델 내에 있는 각 개체는 유일한 이름을 가져야 한다
권고 이 방법에서 사용될 수 있는 좋은 설계 지침. 이러한 권고를 토해 잘 정의된 시스템 모델을 유도 할 수 있다 객체는 7개 이상의 서브객체를 갖지 말아야 한다
프로세스 지침 시스템 모델을 개발하기 위해 따라야 하는 활동들에 대한 기술과 이러한 활동들의 구성 객체 속성은 객체와 관련된 연산을 정의하기 전에 문서화되어야 한다

 

 CASE란 무엇인가?

 CASE는 Computer-Aided Software Engineering 이란 말의 약자이다. 요구 분석, 시스템 모델링, 디버깅, 시험과 같은 소프트웨어 프로세스를 지원하기 위해서 사용되는 여러 종류의 프로그램을 의미한다. 모든 방법은 그 방법에서 쓰이는 표기법에 대한 편집기, 규칙에 따라 모델링되었는지를 검사하는 분석 모듈, 시스템의 문서를 생성해 주는 보고서 생성기와 같은 CASE 기술을 갖고 있다. CASE 도구는 또한 시스템 모델로부터 소스 코드를 자동으로 생성하는 코드 생성기와 소프트웨어 엔지니어를 위한 프로세스 안내 기능을 포함하기도 한다.

 

 좋은 소프트웨어의 특징은 무엇인가?

 

 소프트웨어가 제공하는 서비스와 마찬가지로 소프트웨어 제품은 소프트웨어의 질을 반영하는 여러 가지 특징이 있다. 그러한 특징은 소프트웨어가 하는 일과 직접적인 연관은 없다. 하지만 소스 프로그램의 조직과 구조, 관련된 문서와 실행하는 동안의 행위를 반영한다. 이러한 특징의 예를 들면 사용자의 질의에 대한 응답 시간, 프로그램 코드에 대한 이해 정도 등이다.

 소프트웨어 시스템으로부터 기대되는 여러 가지 특징은 응용에 따라 다르다. 그러므로 은행 시스템은 보안이 완벽해야 하며, 게임은 반응성, 전화 교환 시스템은 확실성이 있어야 한다. 이러한 특성은 잘 설계된 소프트웨어 시스템의 필수적인 특성이다.

제품특성 설명
유지보수성 소프트웨어는 고객의 변경 요구를 수용할 수 있는 방식으로 작성되어야 한다. 비즈니스 환경의 변화로 인해 소프트웨어는 끊임없이 변하기 때문에 중요한 속성이다.
확실성 소프트웨어 확실성은 신뢰성, 보안성, 안전성을 포함하는 포괄적인 특성이다. 신뢰할 수 있는 소프트웨어는 시스템 고장 시 물리적 혹은 경제적 손실을 입히지 않는다. => 가용성
효율성 소프트웨어는 메모리, 프로세서와 같은 시스템 자원을 낭비하지 않아야 한다. 그러므로 효율성은 응답 시간, 처리 시간, 메모리 활용 등을 포함한다
사용성 소프트웨어는 그것이 설계된 대상인 사용자가 사용할 수 있어야 한다. 이것은 적절한 사용자 인터페이스와 적절한 문서를 갖고 있어야 한다는 것을 의미한다.

 

 소프트웨어 공학이 직면한 주요 도전은 무엇인가?

 21세기의 소프트웨어 공학은 다음과 같은 세 가지 도전에 직면하고 있다.

 

 1. 이질성에 대한 도전 : 시스템은 여러 종류의 시스템을 지원하는 다수의 이기종 컴퓨터를 포함하는 네트워크상에서 작동하는 분산 시스템에서 운영되고 있다. 다른 프로그래밍 언어로 쓰여진 오래된 레거시 시스템에 새로운 시스템을 통합해야 하는 경우도 생긴다. 이질성에 대한 도전은 이절성을 극복하여 신뢰할 수 있는 소프트웨어를 만들 수 있는 기술을 개발하는 도전이다.

 2. 인도 시간에 대한 도전 : 전통적인 소프트웨어 공학 기술은 많은 시간을 소비한다. 소프트웨어 공학 기술이 사용하는 시간은 주로 소프트웨어 품질을 얻기 위해서 필요한 시간이다. 그러나 현대의 비즈니스는 매우 빠르게 변하고 책임을 요구하기 때문에 그것을 지원하는 소프트웨어도 같은 속도로 변해야 한다. 인도 시간에 대한 도전은 시스템의 품질을 유지하면서 크고 복잡한 시스템에 대한 인도 시간을 줄이기 위한 도전이다.

 3. 믿음에 대한 도전 : 소프트웨어는 우리의 모든 실생활과 밀접한 관계가 있기 때문에 우리가 소프트웨어를 믿을 수 있어야 한다는 것은 당연하다. 웹 서비스를 통해 시스템을 사용하는 경우에 더욱 그렇다. 믿음에 대한 도전은 사용자가 신뢰할 수 있는 소프트웨어를 보여줄 수 있는 기술을 개발하는 것이다.

 

 물론 위의 세 가지 사항은 서로 독립적인 것이 아니다. 예를 들어 웹 서비스 인터페이스를 제공하기 위해서 레거시 시스템을 빨리 변경해야 하는 경우도 있다. 이러한 도전을 해결하기 위해서 기존의 소프트웨어 공학 방법에 혁신적인 방법을 사용하고 결합하여 새로운 도구와 기술을 개발해야 한다.