소프트웨어 공학

소프트웨어의 정의와 품질

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에 저장되어 현재 혹은 추후에 활용 가능 한지
반응형