소프트웨어 공학(Software Engineering)
소프트웨어 공학(Software Engineering)¶
소프트웨어 공학을 하나의 학문 분야로서 포괄적으로 다루는 안내서입니다. 개인의 프로그래밍 역량을 대규모의 신뢰할 수 있고 유지보수 가능한 소프트웨어 시스템 구축 능력으로 전환시켜 주는 프로세스, 방법론, 관리 기법, 전문 실무를 다룹니다. 이 토픽은 코드 작성과 소프트웨어 공학 사이의 간극을 연결합니다.
학습할 내용¶
이 토픽은 언어별 코드가 아닌 소프트웨어의 공학적 학문 분야에 초점을 맞춥니다:
- 기초: 소프트웨어 공학이 무엇인지, 그 역사, 그리고 왜 중요한지
- 프로세스 모델(Process Models): 폭포수(Waterfall), 애자일(Agile), 나선형(Spiral), 반복적 개발 방식
- 요구사항(Requirements): 소프트웨어가 무엇을 해야 하는지 수집, 명세, 관리하는 방법
- 설계 및 모델링(Design and Modeling): UML, 아키텍처적 사고, 설계 문서화
- 계획 및 추정(Planning and Estimation): 노력을 추정하고, 프로젝트를 계획하며, 위험을 관리하는 방법
- 품질(Quality): 테스트 전략, 검증(Verification), 확인(Validation), 품질 보증(Quality Assurance)
- 형상 및 릴리스 관리(Configuration and Release): 버전 관리, 변경 관리, CI/CD
- 프로젝트 관리(Project Management): 일정 수립, 팀, 커뮤니케이션, 이해관계자 관리
- 유지보수(Maintenance): 소프트웨어 진화, 레거시 시스템, 기술 부채(Technical Debt) 관리
- 프로세스 개선(Process Improvement): 역량 성숙도(Capability Maturity), 메트릭, 프로세스 평가
- 전문 실무(Professional Practice): 문서화, 윤리, 팀 역학, 커리어
참고: 이 토픽은 프로세스 수준 및 관리 수준의 실무를 다룹니다. 코드 수준의 실무(클린 코드, 디자인 패턴, 단위 수준의 테스트)는 Programming 토픽을 참조하세요. 분산 시스템 아키텍처 및 확장성에 대해서는 System_Design 토픽을 참조하세요.
레슨 목록¶
| # | 제목 | 설명 |
|---|---|---|
| 01 | 소프트웨어 공학이란 | 정의, 범위, 역사, 소프트웨어 특성, 전문 역할 |
| 02 | 소프트웨어 개발 생명주기 | 폭포수, V-모델, 나선형, 점진적, RAD, 프로토타이핑, 모델 선택 |
| 03 | 애자일 및 반복적 개발 | 애자일 선언문, Scrum, Kanban, XP, Lean, 스케일 애자일, 메트릭 |
| 04 | 요구사항 공학 | 도출, 기능적/비기능적 요구사항, 유스케이스, 사용자 스토리, 추적성 |
| 05 | 소프트웨어 모델링 및 UML | UML 다이어그램, 클래스, 시퀀스, 활동, 상태, 유스케이스 다이어그램 |
| 06 | 추정 및 계획 | 스토리 포인트, 플래닝 포커, COCOMO, 기능 점수, 일정 수립, 위험 |
| 07 | 소프트웨어 품질 보증 | 품질 모델, SQA 활동, 리뷰, 감사, 결함 메트릭 |
| 08 | 검증 및 확인 | V&V 전략, 테스트 수준, 테스트 계획, 정적/동적 분석 |
| 09 | 형상 관리 | 버전 관리 전략, 브랜칭, 변경 관리, 릴리스 관리 |
| 10 | 프로젝트 관리 | 일정 수립, WBS, 임계 경로, 위험 관리, 이해관계자 커뮤니케이션 |
| 11 | 소프트웨어 유지보수 및 진화 | 유지보수 유형, 레거시 시스템, 대규모 리팩토링, 기술 부채 |
| 12 | 프로세스 개선 | CMMI, ISO 15504, 메트릭, 회고, 지속적 개선 |
| 13 | DevOps 및 CI/CD | DevOps 문화, 파이프라인, 코드로서의 인프라(IaC), 모니터링, SRE |
| 14 | 기술 문서화 | 아키텍처 문서, ADR, API 문서, 런북, 코드로서의 문서 |
| 15 | 팀 역학 및 커뮤니케이션 | 팀 구조, 콘웨이 법칙(Conway's Law), 커뮤니케이션 패턴, 코드 리뷰 문화 |
| 16 | 윤리 및 전문성 | ACM/IEEE 강령, 지식 재산권, 개인 정보 보호, AI 윤리, 커리어 성장 |
선수 학습¶
- 기본 프로그래밍 지식: 최소 한 가지 언어로 코드를 작성해본 경험
- 버전 관리 도구 사용 경험: 기본적인 Git 사용 (참조: Git 토픽)
- 소프트웨어 프로젝트 경험: 개인 프로젝트라도 소프트웨어 프로젝트에 참여한 경험
깊은 전문 지식은 필요하지 않습니다. 이 토픽은 더 큰 팀으로 이동하려는 개발자나 소프트웨어 생산 분야의 학문적 배경을 이해하려는 분들에게 접근 가능합니다.
학습 경로¶
레슨은 네 가지 점진적 단계로 구성됩니다:
1단계 — 기초 (레슨 1~3) 소프트웨어 공학이 무엇인지, 개발 프로세스가 어떻게 구조화되는지, 애자일 방법론이 실제로 어떻게 작동하는지를 이해합니다. 이 레슨들은 이후 모든 내용의 개념적 토대를 제공합니다.
2단계 — 소프트웨어 구축 (레슨 4~8) 요구사항 수집, 시스템 모델링, 작업 계획 및 추정, 품질 보증, 소프트웨어가 목표를 충족하는지 엄격하게 검증하는 방법을 배웁니다.
3단계 — 소프트웨어 관리 (레슨 9~12) 형상 관리, 프로젝트 관리, 소프트웨어 진화, 프로세스 개선. 프로젝트가 커지고 팀이 확장될수록 중요해지는 기술들입니다.
4단계 — 현대적 실무 및 전문성 (레슨 13~16) DevOps, 문서화, 팀 역학, 윤리 — 성숙한 엔지니어링 조직과 전문 엔지니어를 정의하는 실무들입니다.
예제 코드¶
CI/CD 파이프라인, 프로젝트 계획 도구, 프로세스 자동화를 위한 예시 스크립트 및 설정 파일이 examples/Software_Engineering/에 있습니다.
관련 토픽¶
- Programming: 코드 수준의 실무 — 클린 코드, 디자인 패턴, TDD, 리팩토링, 아키텍처 패턴
- System_Design: 대규모 분산 시스템 설계, 확장성, 신뢰성, 관찰 가능성(Observability)
- Git: 버전 관리 메커니즘 및 워크플로우
- Docker: 컨테이너화 및 배포
- MLOps: ML 특화 개발 및 운영 실무
- Database_Theory: 데이터 관리, 트랜잭션, 데이터베이스 설계
라이선스: 콘텐츠는 CC BY-NC 4.0 라이선스 하에 제공됩니다