5/18일 TOPCIT까지 2주간 달리기 시작
1) 소프트웨어 공학이란?
다기능화 및 대규모화 된 소프트웨어 개발을 위해서 요구사항 분석부터 유지보수까지의 과정에 발생하는 어려움을 해결하기 위한 체계적인 관리와 효율적 업무 수행을 지원해주는 기술
효과적인 소프트웨어 공학 기술 적용을 위해서는 체계적인 업무 방식 및 흐름의 정의와 이를 적용할 수 있는 프로세스(Process), 전문적 지식을 갖춘 조직 및 인력(People), 정의된 업무 방식과 조직 인력이 효율적으로 운영되기 위한 기반 인프라 기술(Technology)이 3가지 핵심 요소를 갖춰야 한다.
2) 소프트웨어 공학 배경
소프트웨어 공학의 변천사는 다음과 같다.
1950년대에 소프트웨어 개발 프로젝트를 위해 하드웨어 공학과 유사한 소프트웨어 공학 개념이 도입되기 시작함
1960년대에 소프트웨어 개발 프로젝트의 수요가 증가함에 따라 인력들의 경험과 능력, 그리고 수적인 부족이 원인이 되어 "소프트웨어 위기"가 발생하며 도입되기 시작하였다.
1970년대에도 소프트웨어 수요가 급증함에 따라 개발인력이 부족하게 되었고, 비전공자가 대거 투입됨에 따라 이러한 인력들은 선코딩 ㅡ 후수정의 접근 방식을 택하였고 그로 인한 부작용으로 많은 결함들이 생겨났고, 해결하기 위해 구조적 또는 정형적 기법들이 발생하였다. 분석, 설계, 구현을 순차적으로 진행하는 폭포수 모델을 개발하여 사용하기 시작했지만 일반 SW 개발자들이 사용하기엔 사용성이 떨어지며 비용도 많이 소요되고, 진척도가 떨어지는 단점들을 가지고 있었다.
1980년대에는 재사용성을 높여 효율적으로 SW 개발을 하기 위한 방법들을 연구하기 시작하였다.
1990년대에는 시장 경쟁에서 우위를 얻기 위해서 제품의 시장 출시 기간을 단축해야 했고 80년대와 마찬가지로 개발 생산성에 대한 연구가 활성화되었으며, 폭포수 모델에서 요구사항, 설계 및 구현을 동시에 진행할 수 있는 동시공학에 집중한 모델을 활용하였다.
2000년대에는 SW를 둘러싼 시장환경이 급속하게 변화함에 따라 대응하기 위해 애자일 방법론이 본격적으로 도입되었다.
3) 소프트웨어 공학의 4가지 중요요소
소프트웨어 공학의 정의는 "SW 개발, 운용, 유지보수 등 생명주기 전반을 체계적이고 서술적이며 정량적으로 다루는 학문" 이다.
소프트웨어 공학의 4가지 중요 요소는 아래와 같다.
- 방법
방법은 프로젝트 계획 수립과 추정, 시스템과 소프트웨어 분석, 자료구조, 알고리즘, 코딩, 테스팅, 유지관리와 같은 작업들로 구성
종종 특수한 언어 중심(예 : 객체 지향 방법) 또는 그래프 표기법을 도입
소프트웨어 품질에 대한 일련의 평가 기준을 도입 - 도구
어떤 일을 수행할 때 생산성 혹은 일관성을 목적으로 사용하는 방법들을 자동/반자동화 시켜놓은 것
소프트웨어 개발 생명주기상에서 수많은 도구가 존재한다(요구관리, 모델링, 형상관리, 변경관리)
도구들이 통합되어 하나의 도구가 생성한 정보를 다른 도구가 사용할 수 있을 때 개발을 지원하는 시스템으로 설정 - 절차
절차는 방법과 도구를 결합하여 그것들로 SW를 합리적이고 적시에 개발할 수 있도록 하는 것
절차는 적용된 방법들, 요구되는 결과물(문서, 보고서 등), 품질을 보증하고 변경을 조정하게 도와주는 제어들, 그리고 관리자들이 진행을 평가하게 해주는 마일스톤 등의 순서를 정의함 - 사람
소프트웨어 공학에서는 많은 것(수립, 개선, 유지 등)들이 사람과 조직에 의해서 움직이기 때문에 사람에 대한 의존성이 상대적으로 큼
다른 공학의 상황보다 훨씬 다양한 이슈들이 있어 소프트웨어 개발을 공학적 정리한다는 것은 불가능
4) 소프트웨어 개발 생명주기
정의
사용자 환경 및 문제점 이해해서 시작하여 운용 및 유지보수까지 모든 과정을 의미, [타당성 검토 > 개발 계획 > 요구사항 분석 > 설계 > 구현 > 테스트 > 운용 > 유지보수] 의 활동으로 구성된다.
목적
프로젝트 비용 산정과 개발 계획 수립, 기본 골격 구성
용어의 표준화
프로젝트 관리
선정
기업에서 프로젝트 개발 프로세스를 맞추는데 중요한 활동
시스템 개발의 리스크와 불확실성 및 이에 대한 이해를 바탕으로 수행
선택한 모델은 프로젝트에 존재하는 리스크/불확실성을 최소화시킬 수 있어야 함
폭포수 모델, 프로토타입 모델, 진화 모델, 점증적 모델 등이 생명주기 모델임
모델 종류
생명주기 모델이 프로젝트에 적용 가능한 모든 생명주기 모델을 설명하는 건 아니다. 단지 가장 많이 사용되는 생명주기 모델의 예시일 뿐이고, 프로젝트의 특성에 따라 생명주기 모델을 변경하여 사용할 수 있다.
V 모델
본 모델은 프로젝트 관리자와 개발자에게 프로젝트 수행 동안 어떤 활동이 수행해야 하는지 명확하게 보여주고 있으며 고객 입장에서도 이해시키에 용이하다
시스템 요구사항이 모두 식별되고 명확할 때 이상적인 생명주기 모델이다.
요구사항이 명확하지 않더라도 V 모델은 사용 가능하다. 그러나 프로젝트의 추정, 계획 및 이에 대한 확약은 요구사항을 분석하고 식별하는 단계에만 가능하다.
V모델을 적용한 상세 계획은 요구사항이 모두 명확할 때 최종적으로 완성된다. 요구사항이 명확하지 않은 경우, 프로젝트 초기 계획은 고객이 기대하는 요구사항이 모두 명확해지게 기술해야 한다.
표준 통신 프로토콜을 구현하는 프로젝트가 V모델을 적용할 수 있는 전형적인 프로젝트의 예이다.
V모델이 갖는 특성은 다음과 같다.
프로젝트에 적용, 관리하기 용이하다. 개발 활동의 시작/종료 조건 및 프로젝트를 효과적으로 관리할 수 있는 척도 등이 명확하게 정의될 수 있다. 프로젝트의 검증 및 확인을 강조하는 모델이다. 개발과 테스트가 어떤 연관 관계가 있는지 잘 설명하며, 전체 개발 주기동안 개발과 테스트 활동이 병행된다. 테스트 간에 결함이 발견된 경우 어디서 발생했는지를 알 수 있고, 개발 활동의 어느 단계를 재 수행되어야 하는지 알 수 있다. |
VP 모델 ( V model with Prototyping)
프로토타이핑은 시스템에 대한 이해 또는 리스크, 불확실성 요소와 같은 이슈를 해결하기 위해서 시스템 혹은 시스템의 일부분을 빠르게 개발하는 방법이다.
무엇이 필요하고 무엇이 개발되어야 하는지 공통적인 이해를 이끌어 낼 수 있다. 폭포수 모델 V모델 등의 개발 적용될 수 있으며, 독립적인 생명주기 모델로도 사용될 수 있다.
V 모델에 프로토타이핑 기법을 추가함으로써 프로젝트의 불확실성 요소나 리스크를 줄일 수 있다. 프로젝트의 불확실성 요소 혹은 리스크라는 것은 요구사항 단계에서 구현 가능성 여부, 설계 단계에서, 시스템 성능 검증 여부, 새로운 도구 도입 및 외주 개발 시스템의 위험 요소 등을 포함한다.
프로토 타이핑 기법은 다음 두가지 접근 방식으로 수행될 수 있다.
적용 가능한 해결책을 조사하고 적용해본다 이는 해결하려는 문제가 명확하지 않을 때 적용 가능한 접근 방법이다. 예시로 새로운 장치의 사용자 인터페이스를 구현하는 경우, 시스템 성능 향상을 위한 방안을 찾는 경우, 에러 혹은 결함 관리의 경우 등에 본 접근 방법을 사용할 수 있다. 일반적인 수행 절차는 다음과 같다, 1. 불확실성 요소를 정의한다 2. 해결책을 찾고, 이를 적용하기 위한 방법을 정의한다. 3. 해결책을 적용해본다 ( 반복 수행 가능 ) 4. 적용 결과를 통해 불확실성 요소의 원인을 찾는다 |
여러가지 선택 가능한 해결법을 열거하고, 정해진 기준에 따라 이를 평가한다. 이는 적용하려는 해결책에 리스크나 불확실성 요소가 존재하는 경우 적당한 접근 방법이다. 예시로 특정 기능에 대한 미들웨어를 선택해야 하는 경우, 여러 환경 요소에 대한 설계의 성능을 고려해야 하는 경우, 본 접근 방법을 사용할 수 있다. 일반적인 수행 절차는 다음과 같다, 1. 불확실성 요소를 정의한다 2. 선택 가능한 해결책을 열거하고, 선택 기준을 정의한다. 3. 선택 기준에 따라 해결책을 평가한다 4. 가장 적합한 해결책을 선택한다. |
점증적 모델
점증적 모델은 시스템 개발 시간을 줄일 필요가 있을 경우 유용한 모델로, 고객이 원하는 날짜까지 모든 기능을 가진 시스템의 구현이 매우 어렵지만, 그때까지 동작하는 시스템을 개발해야 하는 경우에 적합한 모델이다.
즉 핵심이 되는 부분을 먼저 개발해서 작동 가능하게 만든 뒤 나머지 기능을 구현하는 방식이다.
시스템은 기능 확장을 통해 개발된다. 각 단계의 시스템 버전은 몇 가지 제한된 기능에 한해서만 동작한다.
대부분의 요구사항이 정의되어 있지만, 시간이 지남에 따라 개선 여지가 있는 경우에 유용한 모델이다.
본 모델은 개발 초기의 외부 인터페이스(SW and HW)에 대한 리스크를 줄이는데 유용하게 적용될 수 있다.
각 기능 확장 개발 단계의 요구사항이 대체적으로 명확하기 때문에 V 모델 및 VP 모델 모두 적용가능하다.
진화모델
진화 모델 또한 점증적 모델과 같이 시스템 개발 시간을 줄일 필요가 있을 경우 유용한 모델이다. 하지만, 점증적 모델과는 달리 전체 시스템에 대한 개발 단계가 여러번 반복되며, 각 시스템은 모든 기능을 제공한다.
하나의 시스템이 개발되어 사용되면서 변경사항이 도출되고, 이걸 토대로 다음 시스템 개발에 반영한다.
변경사항은 기능에 대한 변경, 인터페이스 변경, 신뢰성, 성능향상 등 다양한 변경을 포함하며, 시스템 명세가 전체적으로 불분명한 경우에, 또 제품의 개선이 지속적으로 요구되는 경우에 적합한 모델이다.
실무에서는 보통 점증적 모델과 조합해서 사용하는 경우가 많다. 즉 새로운 시스템 버전에서는 기존 기능의 향상됨과 새로운 기능의 추가가 가능하다. 이러한 혼합 모델은 다음과 같은 특징을 갖는다.
시스템이 완전한 기능을 갖추고 있지 않을지라도, 시스템에 대한 초기 교육이 가능하다. 시스템에 대한 초기 교육을 받고 사용함으로써 시스템에 익숙해질 수 있고, 실무에 필요한 개선사항을 도출할 수 있다. 이를 통해 실무에 필요한 시스템 구축이 가능하다. 개발 기간의 단축으로 인한, 시스템의 조기사용으로 경쟁력이 강화될 수 있다. 시스템이 여러 번에 걸쳐 개발되기 때문에 시스템의 예상치 못한 문제 도출 및 조기 수정이 가능하다. 전문 분야별로 나누어 시스템을 개발 할 수 있다. 예를 들어, 텍스트 기반의 사용자 인터페이스에서 그래픽 기반의 사용자 인터페이스로 기능 향상을 시키는 프로젝트일 경우 사용자 인터페이스가 전문 분야인 개발팀이 맡아서 수행한다던가 처럼 |
'프로그래밍 > 개인공부저장용' 카테고리의 다른 글
[TOPCIT Essence] 02 소프트웨어 개발 방법론 (0) | 2024.05.03 |
---|---|
지금까지 써본 언어 중 가장 어지러운 언어 [Arm Assembly] (0) | 2024.04.21 |
KMP 완전히 이해해보기 - 1 (1) | 2022.09.21 |