소프트웨어
- 프로그램과 관련된 모든 사항(관련 문서, 라이브러리, 사이트, 환경설정 데이터)
- 전문적으로 개발된 소프트웨어는 많은 요소들로 구성(다수의 프로그램, 환경설정, 시스템 문서 등)
소프트웨어 제품 유형
일반 제품
- 특정 개발 조직이 생산한 독립적 시스템
- 누구든 구매 가능
- 개발 조직이 소프트웨어 명세를 관리
- 데이터베이스, 문서 편집기, 그래픽 패키지, 회계 시스템 등
맞춤식 소프트웨어
- 특정 고객의 요구에 맞춰 개발
- 소프트웨어 계약자는 고객만을 위해서 설계하고 구현
- 구매자가 소프트웨어 명세를 개발하고 관리
- 항공관제 시스템, 전자기기 제어 시스템
이러한 제품유형의 차이는 점점 희미해지고 있음
소프트웨어 필수 특성
- 수용성(Acceptability) → 설계한 목적에 부합하는 사용자 유형이 수용할 수 있어야 함
- 확실성(Dependability)과 보안성(Security)
→ 시스템 장애가 발생해도 물리적, 경제적 피해가 발생해선 안됨
→ 악의적 사용자가 시스템에 접근하거나 피해 주는 것을 방지해야 함 - 효율성(Efficiency) → 시스템 자원을 낭비하면 안 됨
- 유지보수성(Maintainability) → 고객 요구 변화를 충족시켜야 함
소프트웨어 공학이란?
- 소프트웨어 생산의 모든 관점
- 기술적 프로세스 외 사항들도 포함
→ 프로젝트 관리, 개발 지원을 위한 도구 방법 이론 개발 활동 포함
- 기술적 프로세스 외 사항들도 포함
- 공학적 학문 분야
- 주어진 일정과 예산 내에서 필요한 품질의 결과물을 얻어야 함
→ 적절한 이론, 방법, 도구 그리고 조직적 재정적 제약에 맞추어 해결책을 찾아야 함
- 주어진 일정과 예산 내에서 필요한 품질의 결과물을 얻어야 함
소프트웨어 공학이 중요한 이유?
- 소프트웨어 시스템 의존도 상승
→ 안정적으로 신뢰도 높은 소프트웨어 시스템을 경제적이고 빠른 방법으로 생산하는 방법 필요 - 소프트웨어 변경하는데 필요한 비용이 매우 큼
→ 장기적으로 공학적 기법으로 소프트웨어 시스템을 개발하는 방법이 더 비용 소모가 적음
소프트웨어 프로세스
→ 소프트웨어 제품을 만드는데 필요한 체계적 접근법(소프트웨어 공학에서 사용)
- 소프트웨어 명세화(Specification) → 소프트웨어 동작시 제약사항을 정의(고객과 엔지니어)
- 소프트웨어 개발(Development) → 소프트웨어 설계 및 프로그래밍
- 소프트웨어 검증(Validation) → 개발한 소프트웨어가 요구에 맞는 것인지 확인
- 소프트웨어 진화(Evolution) → 변화하는 요구를 반영하여 소프트웨어 수정(고객 및 시장)
소프트웨어 공학과 다른 분야의 차이점
컴퓨터 과학과의 차이
- 컴퓨터 과학 : 소프트웨어 시스템의 이론과 기본의 집중 → 상대적으로 작은 프로그램의 경우
- 소프트웨어 공학 : 실무적인 측면에 집중 → 유용한 소프트웨어 개발하고 인도
시스템 공학과의 차이
- 시스템 공학 : 컴퓨터 기반 시스템 개발의 모든 관점을 다룸
- 소프트웨어 공학 : 일반적인 프로세스의 일부에 속함
소프트웨어에 영향을 미치는 네 가지 문제
1. 이질성(Heterogeneity)
- 점점 더 다양한 유형의 컴퓨터와 모바일 장치로 구성되고,
네트워크 전반에 걸쳐 분산 시스템으로 동작하는 소프트웨어 시스템이 필요 - 이질성 극복을 위해 유연하면서도 신뢰성이 높은 소프트웨어 구축하는 기법이 필요
2. 비즈니스와 사회적 변화
- 신흥 경제 발전과 새로운 기술 등장으로 인한 사회의 빠른 변화
→ 기존 소프트웨어 변경하고 새로운 소프트웨어를 빠르게 개발하는 것이 필요
3. 보안과 신뢰
- 소프트웨어를 신뢰할 수 있어야 함
→ 소프트웨어가 우리 삶의 모든 부분과 밀접하게 관련되어 있기 때문
4. 규모
- 다양한 규모의 소프트웨어 개발 필요
→ 휴대 가능한 임베디드 시스템, 웨어러블 기기, 인터넷 규모 클라우드 기반 시스템 등
소프트웨어 공학의 다양성
- 모든 시스템에 맞는 소프트웨어 기법은 없음
- 소프트웨어 개발 조직과 프로세스 참여 사람들에 의해 특정 방법, 도구, 기법이 바뀜
- 주로 애플리케이션의 유형에 따라 어떤 공학 기법과 기술을 적용할지 결정
애플리케이션 유형
독립형 애플리케이션
- 개인 컴퓨터, 모바일 기기에서 동작하는 애플리케이션 시스템(앱)
- 필요한 기능을 모두 가지고 있고, 네트워크 연결 필요 없음
대화형 트랜잭션 기반 애플리케이션
- 원격 컴퓨터 상에서 실행하여 사용자의 PC나 터미널을 통해 연결
- 전자 상거래 어플, 전자우편
임베디드 제어 시스템
- 하드웨어 기기 제어 및 관리
- 시스템 유형 중 가장 높은 비중 차지
일괄처리 시스템
- 대규모 데이터 처리하도록 설계한 비즈니스 시스템
- 많은 수의 개별 입력을 가공하여 각각에 해당하는 출력을 만듦
오락 시스템
- 사용자가 즐기기 위해 사용하는 개인 시스템
- 게임용 콘솔 하드웨어 상에서 실행
모델링 및 모의실험 시스템
- 물리적 진행 및 상황을 모델링하기 위해 과학자와 엔지니어가 개발한 시스템
- 계산 집약을 위해 고성능의 병렬시스템을 필요
데이터 수집 및 분석 시스템
- 환경 데이터 수집하여 다른 시스템에 전달
- 엔진의 내부나 멀리 떨어지거나 외진 장소 등 까다로운 환경에 설치
복합 시스템(SOS : Systems of Systems)
- 기업 및 및 다양한 대규모 조직에서 사용
- 여러 개의 서로 다른 소프트웨어 시스템으로 구성
- 사용 환경에 맞추어 제작
소프트웨어 공학의 기본사항
- 시스템은 관리 및 이해 가능한 개발 프로세스를 따라야 함
→ 소프트웨어 유형애 맞는 개발 프로세스 사용 - 신뢰성과 성능은 모든 유형의 시스템 중요
- 소프트웨어 사양과 요구사항을 이해/관리가 중요
- 기존의 활용 가능한 자원은 최대한 재활용 → 재활용이 새로 개발하는 것보다 우선시
인터넷 소프트웨어 공학
- 초창기 : 웹은 정보 저장소에 접근하기 위한 수단
- 웹 브라우저를 통해 웹 기반 시스템에 접근 가능해지며 발전
→ 서비스를 제공할 수 있는 큰 규모의 신규 시스템을 제품으로 개발 가능하게 됨 - 소프트웨어를 웹 서버를 통해 배포 가능하게 됨 → 소프트웨어 변경이나 업그레이드 비용이 많이 감소
웹 기반 시스템 소프트웨어 공학
→ 소프트웨어 공학에 대한 기본적인 개념 적용 가능
SaaS(Software as a Service)
- 클라우드 상에서 원격 실행되는 앱을 통해 컴퓨터 서비스를 제공
- 사용자는 사용량만큼 돈 지불
비즈니스 소프트웨어 구성 방식에 많은 변화 발생
- 기존 : 하나의 컴퓨터나 클러스터 상에서 실행되는 획일화된 단일 프로그램
- 최근 : 고도로 분산된 구조, 개발 시 컴포넌트와 프로그램을 대규모로 재사용
소프트웨어 재사용
- 웹 기반 시스템 구축에 있어서 가장 많이 사용되는 기법
- 기존에 존재하는 소프트웨어 컴포넌트와 시스템을 어떻게 조합할지 고민하는 방향으로 시스템 구축
기민하고(Agile) 점증적인 개발
- 모든 요구 사항을 미리 명세하는 것은 비현실적 → 점증적으로 개발하고 인도해야 함
서비스 지향 시스템
- 독립적인 웹 서비스를 구축할 경우 서비스 지향 소프트웨어 공학을 사용하여 구현 가능
다채로운 인터페이스
- AJAX나 HTML5 같은 인터페이스 개발 기술이 등장