1. 소프트웨어
1.1. 소프트웨어의 정의
- 프로그램 + 모든 엔지니어링 산출물
- 프로그램의 개발, 운용, 보수에 필요한 관련 정보 일체
- 설계 문서, 자료구조, DB 구조, 테스트 결과 등
1.2. 소프트웨어의 4가지 특징
| 특징 | 설명 |
|---|
| 복잡성 (complexity) | 소프트웨어 내부 요소 간의 상호 작용이 매우 복잡 |
| 변경성 (changeability) | 개발 과정에서 잦은 변경이 발생 |
| 비가시성 (invisibility) | 개념적·무형적이기 때문에 쉽게 파악하기 힘들다 |
| 순응성 (conformity) | 외부 요구 또는 환경과 데이터 변화에 적절히 변형되는 특징 |
1.3. 소프트웨어의 3가지 유형
| 분류 | 특징 | 사용되는 카피 수 | 요구 하드웨어 성능 | 개발 인력 |
|---|
| 주문형 | 특정 고객·기업의 요구를 만족시키기 위해 제작 | 적음 | 낮음 | 많음 |
| 패키지 | 상업적으로 판매 (워드프로세서, 스프레드시트, POS, 회계 시스템 등) | 중간 | 높음 | 중간 |
| 임베디드 | 다른 시스템에 내장된 소프트웨어 | 많음 | 중간 | 적음 |
1.4. 프로그래머 vs. 소프트웨어 엔지니어
| 구별 요소 | 프로그래머 | 소프트웨어 엔지니어 |
|---|
| 개발의 관점 | 전체 중 하나의 컴포넌트 | 소프트웨어 개발 전체 작업 |
| 갖추어야 할 스킬 | 프로그래밍 언어, 알고리즘, 자료구조 | 프로그래밍 + 컴퓨터공학 지식 기반의 개발 전체 단계 작업 능력 |
| 일의 접근 방법 | 해보고 부딪혀 보기 | 엔지니어링 원리를 공부하고 최적의 방법으로 작업 |
| 작업 방법 | 독립적 | 다른 동료와 팀으로 협업 |
| 훈련 방법 | 프로그래밍 연습 | 프로그래밍을 기초한 소프트웨어 개발 프로젝트 |
2. 소프트웨어 개발 작업
2.1. 개발 기본 활동 4단계
| 단계 | 어려움 | 내용 |
|---|
| 1 | 명세화 (Specification) | SW 아이디어 → 요구 정의 |
| 2 | 구현 (Coding) | 명세를 기반으로 코드 작성 |
| 3 | 검증 (Verification) | 요구에 맞게 실행되는지 확인 |
| 4 | 유지보수 (Maintenance) | 배포 후 결함 수정·기능 개선 |
2.2. 개발 작업의 5가지 어려움
| 어려움 | 내용 |
|---|
| 명세화의 어려움 | 고객의 의도를 정확하게 설명하고 이해하기 쉽지 않다 |
| 예측의 어려움 | 프로젝트 규모를 예측하기 어렵다 |
| 재사용의 어려움 | 이전에 만든 컴포넌트를 다른 소프트웨어에 적용할 수 없다 |
| 유지보수의 어려움 | 유지보수 인력이 구조를 이해하고 변경하기 어렵다 |
| 고품질의 어려움 | 관련 요소 간의 실행 조합을 모두 테스트하기 어렵다 |
2.3. 소프트웨어 위기
- 소프트웨어 위기 (Software Crisis)
- 등장: 1968년 NATO 소프트웨어공학 학회에서 처음 등장
- 원인: 소프트웨어 수요 급증 + 복잡성 증가 → 기존 방법(같은 인력·방법·도구)이 부족
- 구조: 요구 증가 + 복잡도 증가 + 난이도 증가 → 소프트웨어 위기
3. 소프트웨어 공학의 접근 방법
3.1. 즉흥적 개발의 문제점
즉흥적 개발 흐름: 프로그래밍 → 만족할 때까지 수정 → 개선 아이디어 짜내기 (반복)
| 문제 | 설명 |
|---|
| 개발 지연·예산 초과 | 수정 반복으로 일정 지연 |
| 낮은 품질 | 소프트웨어 결함 발생 |
| 유지보수 곤란 | 발견되지 않은 결함으로 많은 수정 필요 |
| 재작업 | 잘못된 구조로 인해 기능 추가 시 이전 코드를 재작업 → 성능 저하 |
3.2. 소프트웨어 공학의 정의
- 소프트웨어의 개발·운영·유지보수·소멸에 대한 체계적인 접근 방법
- 개발 과정에 공학적인 원리를 적용하여 품질 좋은 소프트웨어를 개발
- 개발 방법이 일회성이 아닌 반복 사용 가능
공학적 접근: 사용자 요구 → 요구 분석 → 설계 → 구현 → 테스팅 → (품질 보증) → 소프트웨어
3.3. 소프트웨어 공학의 목표
- 여러 가지 원리와 방법을 적용하여 품질 좋은 소프트웨어를 최소 비용으로 계획된 일정에 맞추어 개발하는 것
- 핵심 키워드: 복잡도 낮춤, 비용 최소화, 개발 기간 단축, 대규모 프로젝트 관리, 고품질, 효율성
- 두 가지 목표: 품질 + 생산성
4. 소프트웨어 공학의 주제
소프트웨어 공학의 목표 달성을 위한 3가지 주제
4.1. 주제 1: 단계적 프로세스
코딩에만 치중하지 않고
**정해진 절차(요구 분석 → 설계 → 코딩 → 테스팅)**를 따라 작업
→ 정해진 시점에 품질과 생산성을 효율적으로 점검
| 단계 | 초점 | 주요 작업 | 결과물 |
|---|
| 분석 | 무엇을 만들 것인가 | 요구사항 결정, 유스케이스 분석 | 요구 분석 명세서 |
| 설계 | 어떻게 구축할 것인가 | 아키텍처 설계, 인터페이스·DB 설계, 상세 설계 | 설계 명세서 |
| 구현 | 코딩 및 단위 테스트 | 프로그래밍, 단위 테스팅 | 코드 |
| 테스팅 | 요구에 맞게 실행되는가 | 통합·시스템·인수 테스팅 | 테스트 결과 보고서 |
4.2. 주제 2: 품질 보증
개발 소프트웨어가 요구와 품질 수준을 만족시키는지 검토·확인·테스팅
| 활동 | 설명 |
|---|
| 검토 | 각 단계의 작업이 제시된 절차와 방법에 맞게 진행되었는지 체크 |
| 확인 | 개발 완료된 결과물이 품질 수준에 맞게 생산되었는지 검사 |
| 테스팅 | 구현된 소프트웨어를 실행하여 예상된 결과를 보이는지 확인 |
4.3. 주제 3: 프로젝트 관리
프로젝트의 **제약 조건(시간·비용·범위·품질)**을 파악하고 적절히 관리
| 관리 활동 | 설명 |
|---|
| 프로젝트 계획 | 개발 전, 범위 결정·타당성 검토를 통해 일정·방법 등을 계획 |
| 자원 관리 | 개발에 사용될 자원을 산정하고 할당·관리 |
| 리스크 관리 | 위험 요소를 예측하고 식별·분석하여 대비책 수립 |
| 프로젝트 수행·모니터링 | 프로젝트 작업이 계획에 맞게 진행되는지 확인 |
프로젝트 관리 삼각형: 시간 ↔ 비용 ↔ 범위(품질)
4.4. 소프트웨어 공학의 연구 결과
| 주제 | 의미 | 사례 |
|---|
| 1. 방법 (method) | 소프트웨어 제작에 사용하는 기법·절차 | 구조적·객체지향 분석·설계 방법 |
| 2. 모델링 | 개발할 시스템에 대한 개념적 모형 | 추상적·프로세스·정적·동적 모델링 |
| 3. 도구 (tool) | 자동화된 시스템 | 설계·프로그래밍·테스트 도구 |
| 4. 프로세스 | 도구와 기법을 사용하여 작업하는 순서 | Unified Process, eXtreme Programming |
| 5. 패러다임 | 접근 방법·스타일 | 절차 지향, 객체지향 |
5. 소프트웨어 공학의 발전
| 연대 | 키워드 | 주요 기법/방법론 |
|---|
| 1960s | 소프트웨어 위기 | 프로그래밍 위주, 개인적 기술 중심 |
| 1970s | 소규모 프로그램 | 구조적 방법론, 정보 공학, 폭포수 모델 |
| 1980s | 대규모 프로그램 | 객체지향 방법론 |
| 1990s | 분산 시스템 | 인터넷, 분산 시스템, UML |
| 2000s | 애자일 방법 | 애자일 방법론, eXtreme Programming, SCRUM |
| 2010s | 클라우드 시스템 | 클라우드 기반 기술, DevOps |
cf. DevOps