소프트웨어 공학
소프트웨어의 정의와 품질
rabbit-jun
2025. 3. 19. 22:31
소프트웨어 공학
품질 높은 소프트웨어를 경제적으로 개발하기 위해 계획을 세우고, 개발하며, 유지 및 관리하는 전 과정에서 공학적, 과학적, 수학적 원리를 적용하여 소프트웨어 개발 방법론, 도구, 기술을 연구하는 학문이다.
1. 소프트웨어 개발 생명 주기
- 계획(Planning) → 분석(Analysis) → 설계(Design) → 구현(Implementation) → 테스트(Testing) → 유지보수(Maintenance)
목표
- 개발 대상의 명확화
- 소프트웨어 개발을 위한 다양한 공학적 기법 탄생 → 개발 과정의 체계화 및 개발 수명주기 지원 → 사용자의 요구사항을 충족하는 품질 높은 소프트웨어 개발
소프트웨어 공학의 성질
- 엄격성(Rigidity): 개발자의 경험과 지식에 따라 품질이 크게 좌우됨
- 정형성(Formality): 개발은 일정한 시간과 비용 내에서 이루어져야 함
- 관심사의 분할(Separation of Concerns): 복잡한 문제를 단순화하기 위해 기능을 분리함
- 개발 과정의 분할: 요구사항 분석 → 설계 → 구현 → 테스트 → 배포
- 테스트 과정의 분할: 단위 테스트(Unit Test) → 통합 테스트(Integration Test) → 시스템 테스트(System Test)
- 모듈화(Modularity): 높은 응집력과 낮은 결합력을 유지하도록 설계함
- 추상화(Abstraction): 세부적인 사항을 감추고 주요 속성만 정의함
- 변경 예측(Change Prediction): 변경이 예상되는 부분을 독립된 모듈로 관리함
- 일반화(Generalization): 여러 환경에서 동작 가능하도록 개발함
- 점진성(Incrementality): 전체 시스템을 한 번에 개발하는 것이 아니라 단계적으로 구축함
- 명세화(Specification): 개발 과정과 산출물을 문서화하여 관리함
소프트웨어 품질
- 소프트웨어는 물리적으로 존재하지 않기 때문에 품질을 직접 확인하기 어려움
- 특정 제품의 품질을 절대적으로 평가할 수 없음
- 다양한 이해관계자(Stakeholder)에 따라 품질 평가 기준이 다름
- 개발자의 능력, 예산, 개발 기간(6~12개월 적당)에 따라 품질이 달라짐
- 스테이크홀더(Stakeholder)가 수용할 수 있는 수준이어야 함
소프트웨어 스테이크홀더
스테이크 홀더: 소프트웨어 개발이나 운영에 직간접적으로 영향을 주거나 받는 모든 사람이나 집단
1. 스테이크홀더별 관심사
스테이크홀더 | 관심사 |
---|---|
개발자(Developer) | 코드 품질, 유지보수성, 생산성 |
사용자(User) | 사용성(Usability), 신뢰성(Reliability), 성능(Performance) |
경영진(Executive) | 개발 비용, 일정, ROI(투자 대비 이익) |
법률 전문가 | 보안(Security), 규제 준수(Compliance) |
2. 소프트웨어 외적 품질 요소
- 정확성(Correctness): 명세서대로 동작하는지 판단
- P: 정확성을 측정할 프로그램
- B: 전체 요구사항 개수
- A: 테스트를 통해 오류가 발견된 개수
- $$Correctness(P) = 1- \frac{A}{B}$$
- 신뢰성(Reliability): 평균 고장 간격 MTBF(Mean Time Between Failure)
- 견고성(Robustness): 예상치 못한 환경에서도 정상 동작해야 함 (예: 항공기, 원자력 발전소)
- 성능(Performance): 실행 속도, 메모리 사용량, 효율성 평가
- 가용성(Availability): 정상적으로 사용 가능한 비율
- Usable Time: 정상적으로 작동한 시간
- Operation Time: 전체 운영 시간
- $$Availability = \frac{UsableTime}{OperationTime}$$
- 보안성(Security): 보안 취약점 개수, 사고 통계, 연산 손실액 등의 지표
3. 소프트웨어 내적 품질 요소
- 검증 가능성(Verifiability): 정형 검증(Formal Verification)과 테스트 활용
- 유지보수성(Maintainability):
- 수정 유지보수(Corrective Maintenance): 오류 수정
- 적응 유지보수(Adaptive Maintenance): 환경 변화 대응
- 완전 유지보수(Perfective Maintenance): 성능 개선 및 최적화
- 예방 유지보수(Preventive Maintenance): 오류 예방
- 재사용성(Reusability): 기존 소프트웨어를 재사용하는 정도
- LOC(S): 전체 코드 라인 수
- LOC(R): 재사용된 코드 라인 수
- $$reusability(P) = \frac{LOC(R)}{LOC(S)}$$
- 이식성(Portability): 다양한 플랫폼(운영체제, 하드웨어)에서 실행 가능 여부
- 생산성(Productivity): 단위 시간당 개발된 코드량, 프로젝트 진행 속도
- 상호 운용성(Interoperability): 서로 다른 시스템 간의 협업 가능성
- 발전 과정: M2M → IoT → IoE → Web 3.0
- 가시성(Visibility): 개발 단계별 상태 정보와 산출물을 체계적으로 관리
- 기타 품질 요소: 적응성(Adaptability), 무결성(Integrity), 회복성(Recoverability), 변경성(Changeability), 추적성(Traceability)
프로세스 품질
- 프로세스 모델 적합성
- 어떤 프로세스 모델을 적용할 것인가
- 개발 방법론 적합성
- 객체지향 방법, 구조적 방법론, 정보공학 방법론 등
- 도구 적합성
- 사용하는 지원 도구가 개발 환경에 적합한지
- 표준 준수성
- 적절한 표준을 선택했는지, 선택한 표준을 잘 준수하고 있는지
- 프로젝트 데이터 관리 수준
- 프로젝트 진행과 관련된 상세 데이터가 DB에 저장되어 현재 혹은 추후에 활용 가능 한지
반응형