Engineering/Engineering

[Engineering Basic] 소프트웨어 엔지니어링

iamzieun 2023. 4. 24. 22:41

1. 소프트웨어 엔지니어링이란?

  • 소프트웨어와 소프트웨어 엔지니어링
    • 소프트웨어: 컴퓨터 프로그램과 문서, 데이터의 집합. 하드웨어와 대조적인 개념.
    • 소프트웨어 엔지니어링: 소프트웨어를 개발하는 과정에서 체계적이고 효율적인 방법을 사용하여 소프트웨어의 품질과 유지 보수성을 보장하는 학문 분야
  • 소프트웨어의 분야
    • 프론트엔드, 백엔드, 풀스택, 머신러닝, AI, 데이터, 모바일 앱, 게임, DevOps, 클라우드, 보안 등
    • 각 분야마다 집중하는 문제에서 차이가 있음
  • 소프트웨어 개발 라이프사이클 (Software Development Lifecycle)
    1. planning 계획
    2. analysis 요구 조건 분석
    3. design 설계
    4. implementation 구현
    5. testing & integration 테스트
    6. maintenance 유지 보수

2. 좋은 소프트웨어 설계

모듈

  • 모듈이란?
    • 고유한 목적 및 기능을 가지는 단위
    • 여러 개의 함수 및 클래스가 모여 하나의 모듈을 이루고, 여러 개의 모듈이 모여 하나의 시스템을 구성함
    • 레고블록(모듈)을 사용하여 장난감(소프트웨어)을 만드는 것으로 생각할 수 있음
      • 블록마다 고유한 용도가 존재하며, 하나의 블록이 깨지거나 없어지는 등의 문제가 생겨도 장난감 전체에 큰 영향을 주지 않고 수리가 가능함
  • 모듈의 독립성을 판단하는 지표
    • 응집도 cohesion
      • 시스템의 모듈 구성 요소가 목적을 달성하기 위해 관련되어 있는 정도
      • 하나의 모듈 안에서 각각의 함수들이 서로 엮여서 동작하는데, 이 때 모듈 안의 함수들의 관련되어있는 정도


 

    • 결합도 coupling
      • 모듈 간 상호 의존성의 정도

⇒ 높은 응집도(모듈 내 교류)와 낮은 결합도(모듈 간 교류)를 가진 소프트웨어를 지향 !

테스팅

  • 테스팅이란?
    • 개발한 프로그램이 배포된 이후 장애가 발생하는 것을 예방할 목적으로, 프로그램이 생각한 대로 작동하고 문제가 없는지 확인하는 과정
    • 안정적인 소프트웨어를 위하여 기능이 추가될 때 오류 및 버그를 확인하는 과정
    • 코드와 더불어 전체적인 시스템에 대한 테스트 또한 진행할 수 있음

  • 테스팅의 종류
    • Unit Testing: 개별 단위(unit) 테스팅
    • Integration Testing: 모듈 간 통합 테스팅
    • System Testing: 전체 소프트웨어에 대한 테스팅
    • Acceptance Testing: 요구 조건 만족 여부에 대한 테스팅
  • 소프트웨어를 테스트하는 tool 및 코드는 많이 개발이 되었지만, 딥러닝 테스팅은 ‘데이터’를 함께 고려해야 한다는 어려움 때문에 비교적 개발이 더딘 편임

문서화

  • 소프트웨어를 이용하기 위한 README, API 문서, 아키텍처 문서
  • 좋은 소프트웨어의 필요 조건은 좋은 문서화 !

3. 소프트웨어 엔지니어링을 배워야 하는 이유

  • 머신러닝 시스템에서 머신러닝 코드가 차지하는 부분은 아주 작은 일부분일 뿐 !
  • 서비스에 AI 기술들을 적용하기 위해서는 서비스와 더불어 이를 만들어 내는 ‘소프트웨어 엔지니어링’을 이해해야 한다.
  • AI 기술을 서비스에 반영하는 과정에서는 소프트웨어 엔지니어링을 필요로 하므로, 프로젝트를 기획하고 실행할 때 머신러닝 모델 기술 뿐만 아니라 소프트웨어 엔지니어링 관점에서도 생각할 필요가 있다.