소프트웨어 공학의 목표
사용자의 요구 사항을 충족시키는 품질 좋은 소프트웨어를 개발
- 개발 대상의 명확과
- 이 소프트웨어의 요구 사항은 무엇인지 등
- 개발 과정의 체계화
- 규모가 큰 소프트웨어는 여러명이 작업하기 때문에 체계화가 중요
- 개발 수명 주기 지원
- 프로세스의 개발 부터 폐기 까지의 과정 중 필요할 때 적절한 지원을 해주는 것
소프트웨어 공학의 원리
- 엄격성과 정형성
- 소프트웨어는 개발자의 지적(창의적, 공학적)행위의 산출물
- 소프트웨어 개발은 주어진 시간과 비용에서 명확하게 개발되어야 하는 엄격성
- 관심사의 분할
- 복잡한 문제를 단순한 여러 문제로 분할
- 소프트웨어 개발 과정의 분할: 요구 사항 분석 > 설계 > 구현 > 테스팅
- 소프트웨어 테스트 과정의 분할: 단위 테스트 > 통합 테스트 >시스템 테스트
- 모듈화 (프로그램을 여러 모듈로 만드는 것)
- 독립적인 기능을 갖는 프로그램의 조작
- 높은 응집력과 낮은 결합력을 갖는 소프트웨어 구조 설계
- 모듈은 하나의 목적을 위해 일해야 함
- 모듈 간의 결합력은 낮으면 좋음 (다른 모듈의 영향을 최소화)
- 이해도를 높이고(높은 응집력), 변경 영향을 최소화(낮은 결합력)하기 위한 공학적 원리
- 추상화
- 세부 사항은 감추고 대표적인 속성으로 대상물을 정의
- INPUT OUTPUT이 어떤지 만 알면 사용하기 편한 것
- Ex) 냉장고 새탁기
- 함수 정의, 매크로 함수, 객체, HAL(Hardware Abstraction Layer) 등
- 변경의 예측
- 소프트웨어 개발에서 변경은 불가피
- 이때 변경을 잘 관리하는 방법이 요구된다.
- 변경이 발생할 것으로 예상되는 부분을 모듈화 구조로 분리
- Tcp 헤더에서 Reserved같은 부분

- 일반화
- 다양한 플랫폼, 다양한 환경, 다양한 사용자가 사용할 수 있어야함
- Ex) Java
- 하드웨어 성능이나 사양에 의존적이지 않은 소프트웨어 개발 -> 앱
- 다양한 플랫폼, 다양한 환경, 다양한 사용자가 사용할 수 있어야함
- 점진성
- 단계적이며 순차적으로 소프트웨어를 개발하고자 하는 공학적 원리
- 작은 단위의 소프트웨어를 반복 개발하면서 전체 시스템을 완성
- 단계적인 개발과 배포를 통한 사용자 피드백의 수집과 반영
- 명세화
- 소프트웨어 개발 과정 및 대상물에 대한 정보를 체계적으로 기술하는 원리
- 팀 기반의 개발 활동을 지원하기 위한 정보의 공유 지원
- 지속적으로 진화하는 소프트웨어에 대한 이력서