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