앞선 글에서와 같이, 소프트웨어 프로세스는 기본적으로 4가지 단계로 구성된다. 소프트웨어의 기능과 제약조건을 명세하는 단계, 실제 소프트웨어의 구현 단계, 소프트웨어 검증 단계, 그리고 계속해서 변화하고 진화하는 발전 단계이다.
소프트웨어 프로세스를 설명할 때에는 이 뿐만 아니라, 다음 세가지도 묘사되어야 한다.
소프트웨어 프로세스를 하이레벨로, 추상화(단순화)하여 표현한 것을 'SW Process Model'이라고 한다. 대표적으로 소프트웨어 프로세스 모델에는 다음과 같이 3가지가 있다.
S->D->V->E 각 소프트웨어 개발 단계가 독립적으로 분리되어 있는 단계이다. Plan-driven Process에 적합한 모델이다.
소프트웨어 개발을 시작하기 전에 모든 프로세스의 activity를 계획한다.
이전 단계가 끝나기 전까지는 다음 단계는 실행되지 않는다.
소프트웨어 요구사항이 빠르게 변화하는 환경에는 맞지 않는 모델이다.
Embedded system, Critical System과 같은 특정 타입의 시스템에 적절하다.
-> Implement를 하면서 유닛 테스팅을 한다.
각 단계별로 철저하게 구분되어 구현하는 것이 아니라, S했다가 D를 하고, D를 했다가 다시 돌아와서 S를 하는 등 여러 기능들을 하나씩 쌓아가는 것이다.
Specification, Development, Validation의 세 단계는 분리되어 있지 않고 interleaving한다. 초기 구현을 하고, 유저로부터 피드백을 받고, 다시 여러 버전으로 소프트웨어가 진화하게 된다. 구현을 하다가 다시 명세 단계로 돌아갈 수 있다.
변화된 요구사항을 구현하는 비용이 폭포수 모델에 비해서 더 저렴하다.
개발 과정에서 유저와 고객의 피드백을 얻는 것이 더욱 쉽다.
사용 가능한 소프트웨어를 고객에게 초기에 사용하도록 하는 것이 가능하다.
그러나 프로세스가 잘 보이지 않는다는 단점이 있다. activity가 전체 system의 어느 단계에 있는지 불분명하다.
더불어 새로운 increments가 더해질수록 시스템 구조는 다운그레이드되는 경향이 있다. 일반적으로 변화는 코드를 더욱 더 더럽게 만들고, 결국 새로운 기능을 더하는 것은 더 어렵고 비용이 많이 들게 된다. 이를 해결하기 위해 주기적으로 소프트웨어를 리팩토링해야 한다.
상당한 양의 소프트웨어 개발 비용과 리스크를 줄이며, 더 빠르게 시스템을 deliver할 수 있다.
요구사항을 현실적인 이유로 타협하게 되어 실제 이용자들의 니즈를 충족시키지 못할 수도 있다. 더불어 시스템을 발전하는 데 일정 부분의 통제가 어려울 수 있다.
위 두 모델은 모두 코드를 처음부터 개발하는 모델이지만 Integration and Configuration 모델은 오픈 소스 코드를 활용하여 통합시키는 모델이다.
디테일하지는 않지만, 간략하게 가장 필수적인 요구사항들에 대해서 명세하는 단계
사용 가능한 코드를 서치하고, 올바른 기능을 제공하는 컴포넌트/시스템인지 평가하는 단계
서치를 토대로 찾은 이용가능한 코드를 토대로, 요구사항을 더욱 더 구체화하여 개선한 형태로 명세하는 과정이다.
바로 상용 가능한 시스템일 경우에 해당한다.
재사용 가능한 컴포넌트와 새롭게 개발한 컴포넌트를 통합시켜 새로운 시스템을 만듦
Specification, Development, Validation, Evolutiondml 4가지 프로세스 Activity는 각 모델에 따라서 다르게 구성된다.
Requirements Elicitation and Analysis:현존하는 시스템을 관찰함으로서 요구사항을 이끌어내고, 잠재 고객들과 이야기를 나누는 것
시스템이 그 명세서와 요구사항에 따르는지 확인하는 것
요구사항 명세부터 프로그램 개발까지의 각 단계를 모두 확인하는 것
컴포넌트/함수를 각각 모두 독립적으로 테스트하는 것이다.
Unit Testing은 함수 하나씩 그 함수의 기능을 테스트 하는것으로서 난이도는 낮지만, 오류가 나도 실제의 entry point에서 실행하면 절대 오류가 나지 않는 오류일 수도 있다(오류가 실제 오류가 아닐 수도 있다). 따라서 Unit Testing과 관련되어 False Positive를 줄이는 연구도 진행되고 있다.
컴포넌트들이 통합되어 있는 전체 시스템을 테스트하는 것이다.
System Testing은 각각의 함수를 통합해 main함수를 테스트하는 것으로서 프로그램 자체, 즉 전체 시스템을 테스트 하는 것이다. 즉 프로그램의 entry point부터 테스트하기 때문에 어렵다는 단점이 있다.
실제 사용자에 의해서 직접 사용하면서 테스트하는 것이다.
소프트웨어는 기본적으로 자주 바뀔수 있으며 유연하다. 더불어 하드웨어를 바꾸는 것보다는 소프트웨어를 바꾸는 것이 훨씬 더 저렴한 경우가 많다. 따라서 요즘은 개발과 유지보수를 같은 연장선상에서 보기도 한다.
재 작업 비용을 줄이는 두가지 방법
(1) Change Anticipation
가능성이 있는 변화에 대해서 프로토타입을 먼저 만들어보기
(2) Change Tolerance
시스템이 쉽게 변화할 수 있도록 코드 리팩토링 등 프로세스를 디자인 하기