1.1 소프트웨어
정의
- 컴퓨터 프로그램과 관련 데이터의 묶음
- 데이터 입력 -> 출력 제공에 사용되는 명령어들의 집합
- Software is the collection of computer programs, procedure rules and associated documentation and data. - IEEE
분류
- 시스템 소프트웨어: 컴퓨터 운영 목적, 응용 SW 실행시키는 플랫폼 제공
- 응용 소프트웨어: 사용자가 실제 업무에 사용하는 프로그램
- 일반(generic) 소프트웨어: 요구사항이 일반적/안정적, 상용 소프트웨어
- 맞춤형(customized) 소프트웨어: 특정 산업의 고유 업무 프로세스를 위해 작성된 것 aka 주문형(bespoke) 소프트웨어
성질
- 무형의 인공물, 추상적, 마모 되지 X
- 개발 비용 대부분이 노동력
- 버그 수정 용이
- 설계 변경 요구 -> 유지보수 필요
- 시간에 따른 고장률 그래프

- 1-1은 하드웨어 고장률, 1-2는 소프트웨어 고장률.
소프트웨어 위기 현상
- 정의: 요구사항이 다양해지면서 해결할 문제는 복잡해졌는데 SW 기술 진보가 더딘 것
- 소프트웨어 위기 현상 종류
- 개발 일정 지연, 초과 비용, 제품 신뢰도 결여, 명세 불일치, 품질 저하, 유지보수 어려움 등
- 주요 원인
- 전문 인력 부족, 경영층 인식 부족, 방법론 및 지원 도구 문제, SW 개발 생산성 저하, SW 자체의 복잡성 증가 등
소프트웨어 공학
- 소프웨어 위기 현상을 부각하고 문제 해결 방식과 고품질 소프트웨어 생산 및 유지보수를 연구하는 학문 분야
- 신뢰성 있고 요구기능을 효율적으로 수행하는 소프트웨어를 경제적으로 생산하기 위해 건전한 공학적 원리와 방법을 만들고 사용하는 것이다. - 프리츠 바우어(Fritz Bauer)
- 공학 기술의 적용
- 소프트웨어 생산 과정의 관리
소프트웨어 공학 환경 - 계층화된 기술

각 계층은 그 아래 계층에 기초하고, 아래 계층에 비해 변경 가능성이 높다.
- 원리: 소프트웨어 프로세스와 제품의 바람직한 측면을 기술하는 일반적, 추상적 설명
- 방법과 기술: 개발 구현시 따라야 하는 가이드라인 또는 구조화된 접근 방법
- 방법론: 문제 해결에 사용할 방법과 기술을 지정
- 도구: 기술과 방법, 방법론 적용을 지원하고, 도구를 사용하는 걸 자동화라고 한다.
좋은 소프트웨어의 기준
- 신뢰도 reliability - 오랜 시간 작동, 치명적 오류 X, 오류 후 복구됨
- 정확성 correctness - 요구사항과 얼마나 일치하는가
- 성능 performance - 지정된 시간안에 처리 가능한 작업량
- 사용성 usability - 편리하고 융통성 높은가
- 상호운영성 interoperability - 다른 시스템과 공존하고 협력하는 능력
- 유지보수성 maintainability - 기능의 추가, 개선, 수정, 오류 수정이 쉬운가
- 이식성 portability - 다른 환경에서 쉽게 동작하는가
- 검사성 verifiability - SW 속성 검사가 쉬운가
- 추적성 traceability - 요구사항, 설계, 소스코드 간 관계 정의, 기록, 유지 방법이 있는가