[부스트캠프 AI Tech 5기] 소프트웨어 엔지니어링

소프트웨어 엔지니어링
소프트웨어 엔지니어링이란?
- 소프트웨어를 개발하는 과정에서 체계적이고 효율적인 방법을 사용하여 소프트웨어의 품질과 유지 보수성을 보장하는 학문 분야
소프트웨어
- 컴퓨터 프로그램 + 관련 문서 + 데이터의 집합
- 대부분의 웹, 앱 서비스
프론트엔드
백 엔드
풀 스택
DevOps, 클라우드
소프트웨어 개발 라이프사이클

좋은 소프트웨어 설계
개념
모듈성
- 고유한 목적, 기능을 가지는 단위
- 레고 블록을 사용해 장난감을 만드는 것
- 블록 마다 고유한 용도가 존재
- 블록 하나가 깨지거나 변경해야 하는 경우, 나머지 부분에 영향을 주지 않고 쉽게 교체할 수 있음

응집도
- 시스템의 모듈 구성 요소가 목적을 달성하기 위해 관련되어 있는 정도
- 하나의 모듈 안에서 각각의 함수가 서로 연결되어 사용


- 객체 지향 사고가 필요
- 하나의 Class에 모든 기능을 구현하는 것이 아닌, 목적에 맞게 나누고 서로 교류하는 인터페이스
결합도

지향점
- 높은 응집도와 느슨한 결합도
- 모듈 내 교류는 크게, 모듈 끼린 덜 교류하는 소프트웨어를 지향
테스팅
- 손님에게 음식을 대접하기 전에, 음식을 맛보는 경험
- 유저에게 공개하기 전에, 내부에서 프로그램이 잘 작동하는지 확인하는 과정
- 요구 조건, 아키텍처 디자인 설계, 서버, 데이터 베이스 연결, 서버 부하 등을 확인할 수 있음
종류
- Unit Test : 개별 단위 테스트
- Integration Test : 다른 단위, 구성요소 동작 테스트
- End to End Test : 처음부터 끝까지 모두 테스트
- Performance Test : 성능, 부하 테스트
문서화
- 소프트웨어를 이용하기 위한 README, API 문서, 아키텍쳐 문서
소프트웨어 엔지니어링을 배워야 하는 이유
- 머신러닝 모델을 만드는 것도 소프트웨어 엔지니어링 중 하나
- 머신러닝 모델을 실제 유저에게 사용하게 한다면, 소프트웨어 엔지니어링을 하게 될 것
