CH 01 Software Engineering Principle

Software
The Software Life Cycle
- Problem Analysis
- Requrements Elicitation (요구 조건 도출)
- Software Specification
- High-and-low-level Desing
- Implementation (구현)
- Testing and Verification
- Delivery
- Operation
- Maintanance (버그 수정 및 업데이트)
Software Engineering
- 컴퓨터 프로그램의 설계, 생산 및 유지 관리에 대한 규율화된 접근 방식
- 제시간, 자금 내 개발 필요
- 소프트웨어의 complexity를 잘 관리하는 tool 필요
- Hardware
- Software
- Ideaware (Knowledge)
- Algorithm: 주어진 문제를 해결하기 위해 밟아야 하는 절차
Goals of Quality Software
- Working (작동성)
- odification (modification에 드는 시간과 노력)
- Reuseability (재사용 가능성)
- On time / Within budget (시간과 예산)
Specification
Specification
- 소프트웨어가 어떻게 동작하는지가 아닌 무엇을 실행하는지 기술
- 프로그램에 대해 문서 형식으로 작성
Abstraction
- 만들고자 하는 것을 다 구현하는 것은 지나치게 복잡
- 추상화시켜 간단한 형태로 변형
- 간단한 형태: 사용자 입장에서 essential한 정보만 남는 것
- Information hiding (정보 은닉): 중요한 부분의 디테일만 보여지고 나머지 디테일은 감춰지는 것
Stepwise Refinement
- Top-down: 제일 큰 기능부터 쪼개 나가는 방식
- Functional Decomposition: 어떤 식으로 프로그램을 진행해 나갈 것인지 Process 관점 (Verb)
- Round-trup gestalt design: 무엇이 필요한지 객체지향 object 관점 (Noun)
- Bottom-up: 밑에서부터 필요한 기능 나열해 두고 결합해 나가는 방식
Testing
Verification & Validation
- Verification: 소프트웨어 개발 프로세스 관점에서 잘하고 있는가?
- Validation: 스펙대로 만들고 있는가?
Errors
- 오류가 하위 단계에서 발견될수록 수정 비용이 많이 발생
- 오류는 가급적 조기 발견
- Robustness: 오류가 있어도 파일이 작동하게 하는 것
- Precondition & Postcondition: Validation을 만족한 프로그램인지 수학적으로 증명하려는 시도