1 소프트웨어
1.1 소프트웨어의 특징
- 소프트웨어
- 프로그램 + 프로그램의 개발, 운용, 보수에 필요한 정보 일체
- 개념적이고 무형적 (생산물의 구조가 코드 안에 숨어 있음)
- 소프트웨어의 특징
- 복잡성(complexity)
- 순응성(conformity)
- 요구나 환경, 데이터의 변화에 따라 적절히 변형되는 특징
- 변경성(changeability)
- 쉽게 변경할 수 있고 개발 과정에서 자주 변경된다.
- 비가시성(invisibility)
- 구조가 코드 안에 숨어 있어 쉽게 드러나지 않는다.
소프트웨어의 유형

- 맞춤형 소프트웨어
- 한국은 si 산업이 많다. (발주가 들어오면 개발 해주는 산업) → 제약 상황이 다수
- 패키지형 소프트웨어
- 한국은 약한 면모가 있다.
- 시장의 다양한 요구에 의해 결정
- 특정 기관의 요구에 꼭 맞지 않을 수도 있다.
- 임베디드 소프트웨어
1.2 프로그래밍
- 프로그래밍 자체가 소프트웨어 엔지니어링은 아니다.
- 프로그래밍 : 혼자 코드를 작성하고 테스트하는 개인적인 작업
- 소프트웨어 개발 : 프로그래밍 + 요구사항 파악 + 테스팅 + 요지보수 + …
- 여러 사람이 모여서 일하는 협업하는 전체 작업을 포함한다.
소프트웨어와 시스템
- 시스템
- 필요한 기능을 실현시키기 위하여 관련 요소를 어떤 법칙에 따라 조합한 집합체

시스템의 요소
2 소프트웨어 개발 작업
2.1 기본 활동
- 개발에 필요한 기본 활동
- 명세화
- 잘못된 개발로 실패하는 것을 방지
- 구현
- 시스템의 명세를 주어진 여건에 맞게 설계하고 프로그래밍 언어로 변환
- 검증
- 구현된 소프트웨어가 고객의 의도와 일치하는지 확인
- 요지보수
- 사용 단계의 결함이나 요구 변화에 맞게 수정
2.2 개발 작업의 특징
- 인적요인
- 소프트웨어는 공장에서 대량 생산하는 것이 아님 → 사람의 지적활동이 직접 관련
- 2배의 인원을 투입한다고 개발 생산성이 2배가 되지 않는다!
- 소프트웨어의 질과 양 → 참여한 개인의 능력에 크게 좌우됨.
- 소프트웨어의 비가시성 → 생산성과 품질의 정의를 어렵게함.
- 다른 공학에 비하여 기술과 원리를 구축하기 어려움.

명세는 설계의 결과물로 이루어지는 것이고 이것을 이용해서 코딩함.
- 명세화의 어려움
- 재사용의 어려움
- 다루는 문제가 똑같지 않아 미리 재사용할 부품을 만들기가 어렵다.
- 예측의 어려움
- 물리 법칙을 따르는게 아니라, 여러 외부 요소의 영향을 받아 사전 견적이나 프로젝트의 규모를 예측하기가 쉽지 않다.
- 유지보수의 어려움
- 다른 사람이 개발한 소프트웨어를 유지보수하기 어렵다.
소프트웨어의 위기
SW 수요 급증 + 복잡성 증가에 비해 기존 방법(인력/방법/도구)이 충분하지 않아서 발생한 문제
하드웨어 생산 기술의 발전에 비하여 소프트웨어 기술 발전의 속도가 현저히 느리다!

3 소프트웨어 공학의 접근법
즉흥 개발의 문제점

즉흥적인 소프트웨어 개발
즉흥적인 소프트웨어 개발은 코딩과 수정이 반복된다.
- 개발 지연/예산 초과
- 낮은 품질
- 유지보수 곤란
- 재작업 증가
3.1 소프트웨어 공학 정의
- 대규모 소프트웨어를 다수가 개발하기 위하여 체계적으로 접근하고 원리를 적용하는 것
- SW의 개발·운영·유지보수·소멸에 대한 체계적 접근 방법
- 개발 방법이 일회성이 아니라 반복 사용 가능해야 함

3.2 소프트웨어 공학의 목표
“원리와 방법”을 적용해 좋은 품질을 최소 비용/계획 일정에 맞춰 개발
4 소프트웨어 공학의 주제
품질과 생산성, 비용이라는 목표를 달성하기 위하여 소프트웨어 공학은 크게 3가지 작업으로 나눌 수 있다.
- 단계적 프로세스
- 품질 보증 QA
- 프로젝트 관리
4.1 단계적 프로세스
요구분석~테스팅 등 정해진 절차를 따름 (코딩만 치중 X)

데브옵스라고도 한다.
단순히 깃허브만 쓰는 것이 아니라, 도커와 쿠버네티스도 사용할 수 있다.
4.2 품질 보증
산출물/문서/코드/테스트를 통해 품질 확인 및 검토

바람직한 소프트웨어가 가져야할 특징
평가기준은 사용하는 입장과 만드는 입장이 다르다.
- 사용자 + 개발자
품질이 높고 사용자 요구를 잘 만족시키며 결함이 포함되지 않은 소프트웨어.
생산 비용이 적고 개발 기간이 짧으며 보안이 잘되어야함.
- 개발자
하드웨어 자원의 효율성, 재사용성, 검사용이성, 요지보수 용이성
4.3 프로젝트 관리
계획/자원/리스크/수행 모니터링 + (시간·비용·범위/품질 제약)


소프트웨어 공학의 연구 결과
5 관련 분야
1) 연관 분야(요지)
- 두 축으로 연결됨:
- 컴퓨터공학의 원리/기술 관련 여러 원리
- 이를 적용해 특정 문제를 해결하려는 응용 도메인

2) 컴퓨터 과학 vs 소프트웨어 공학
- 컴퓨터 과학(이론/기능) + 고객(문제) → 소프트웨어공학으로 이어짐(현실 문제 해결 지향)

고객의 요구사항까지도 소프트웨어 공학의 범주이다.