Computers/SW Engineering

day 0. 소프트웨어공학 개요

emzei 2016. 3. 15. 17:53
시험을 위해 필요한 개념을 위주로 정리해볼까해요.
평소에 쓰던 용어랑 조금 헷갈릴 수도 있을 것 같지만, 이 포스팅 내에서 쓰는 용어는 오직 이 과목을 위한  것으로 생각하고...(세뇌)

  • 소프트웨어(software)
    • 하드웨어를 동작시켜 사용자가 작업을 편리하게 수행하도록 하는 프로그램 및 자료구조
    • 프로그램의 개발, 운용 및 유지보수에 관련된 문서와 정보도 포함됨
    • 소프트웨어 특징
      • 상품성
      • 견고성 : 일부 수정이 소프트웨어 전체에 영향
      • 복잡성 : 개발과정이 복잡. 비표준화. 이해와 관리 어려움
      • 순응성
      • 비가시성
      • 비마모성 : 사용에 의해 마모되지 않음  (cf. 오랜기간 사용 시 노후, 품질저하)
      • 비제조성 : 논리적 절차에 의한 개발
      • 비과학성

    • 소프트웨어 분류
      • by 기능 - 시스템 소프트웨어, 응용 소프트웨어
      • by 사용분야 - 프로그래밍용, 문서작성용, 통신용, 분산처리용, 멀티미디어용, 소프트웨어 개발용, 인공지능용 등
      • by 개발과정의 성격 - 프로토타입(견본), 프로젝트(연구과정에서 생산, 상품화X), 패키지(상품형)
      • by 정보 처리 방법 - 일괄처리 소프트웨어, 온라인 소프트웨어, 실시간 소프트웨어 등


  • 시스템
    • 공통 목적/목표 달성을 위해 여러 상호 요소가 유기적으로 결합된 것
    • 소프트웨어는 컴퓨터를 기반으로 하는 여러 시스템과 관련을 맺어 상호 동작
  • 시스템 구성 요소
    • 입력 (Input)
    • 처리 (Process)
    • 출력 (Output)
    • 제어 (Control)
    • 피드백 (Feedback)


  • 소프트웨어 위기 (Software Crisis)
    • 여러 원인에 의해 소프트웨어 개발 속도가 하드웨어 개발 속도를 따라가지 못해, 사용자들의 요구사항을 처리할 수 없는 문제 발생 (NATO 협정 (1964)에서 처음 등장한 용어)

    • 위기의 원인
      • 소프트웨어의 특징에 대한 이해 부족
      • 소프트웨어의 관리 부재
      • 프로그래밍에만 치중
    • 위기의 결과
      • 개발 인력 부족으로 인한 인건비 상승
      • 성능 및 신뢰성(일관된 결과를 위해 오류없이 수행) 부족
      • 개발기간의 지연 및 개발 비용 증가
      • 어려운 유지보수 및 해당 비용 증가
      • 소프트웨어의 생산성 저하
      • 소프트웨어의 품질 저하

  • 소프트웨어 공학(Software Engineering, SE)
    • 소프트웨어 위기를 극복하기 위한 방안으로 연구된 학문
    • 여러 방법론, 도구, 관리 기법들을 통해 소프트웨어의 품질 및 생산성 향상이 목표
    • 가장 경제적인 방법으로 양질의 소프트웨어 제품을 생산하는 것
    • 안정적, 효율적으로 작동하는 소프트웨어 생성 및 유지보수 활동을 체계적, 경제적으로 수행하기위해 계층화 기술 사용

    • 소프트웨어 공학 정의
      • 소프트웨어 개발, 운용, 유지보수, 폐기 처분에 대한 체계적 접근 방안 [IEEE 소프트웨어 공학 표준 용어 사전]
      • 지정된 비용과 기간 내에 소프트웨어를 체계적으로 생산하고 유지보수하는 데 관련된 기술적, 관리적 원리 [Fairly]
      • 과학적인 지식을 소프트웨어 설계와 제작에 응용하는 것이며, 이를 개발운용, 유지보수하는 데 필요한 문서 작성 과정 [Boehm]

    • 계층화 기술
      • 관리자가 소프트웨어 개발과정을 제어, 기술진이 고품질의 소프트웨어 구축할 수 있도록 하는 기술
      • 도구 (Tool)
        • 방법과 절차를 자동/반자동으로 처리하는 기능 제공
        • 예) CASE(Computer-Aided Software Engineering)
      • 방법 (Method)
        • 소프트웨어 구축을 위한 기술적 방법 제공
      • 절차 (Process)
        • 개발에 사용되는 개발방법과 도구가 사용되는 순서

    • 소프트웨어 공학의 기본 원칙
      • 현대적인 프로그래밍 기술을 계속 적용해야
      • 개발된 소프트웨어의 품질이 유지되도록 지속적 검증해야
      • 소프트웨어 개발 관련 사항 및 결과에 대한 명확한 기록을 유지해야

    • 소프트웨어 공학의 발전
      • 1960년대
        • 소프트웨어 위기 인식, SE 시작, 구조적 프로그래밍 시도
      • 1970년대
        • 구조적 분석/설계 개념 도입, 소프트웨어 생명 주기와 개발 도구 등장
        • 소프트웨어 상품화
      • 1980년대 ~ 80년대 중반
        • 다양한 분석/설계 방법론 등장 및 발전
        • 시험, 유지보수, 프로젝트 관리 등의 기술 발전
        • 하드웨어 가격 하락, 다양한 소프트웨어 공급
      • 1980 중반~ 현재 
        • 객체지향 기술 사용
        • 기술 진보 (4GL, 소프트웨어 재사용성, CASE, 형상관리)

    • 소프트웨어의 품질과 생산성
      • 품질(Quality)
        • 주어진 요구사항을 만족시키는 능력을 갖추고 있는 소프트웨어의 측정 가능한 기능 및 특성
        • 좋은 품질의 소프트웨어 특징
          • 사용자의 요구대로 동작
          • 하드웨어 자원을 효율적으로 이용
          • 일정 시간 내 주어진 조건 하에서 원하는 기능 실행
          • 애매모호함 없이 처리 절차에 맞게 수행되어 정확하게 결과 산출
          • 소프트웨어의 개발, 유지보수 등이 초기 예상 비용 이내에서 수행
          • 적당한 사용자 인터페이스 제공하여 사용하기 편리
          • 유지보수 용이
          • 잠재적 에러의 최소화
          • 소프트웨어의 사용법, 구조 설명, 성능, 기능 등이 이해하기 쉬움    

      • 생산성(Productivity)
        • 투입된 비용, 노력 등에 대한 생산량
        • 생산성에 영향을 미치는 요소
          • 개발자의 능력
          • 원활한 의사 전달
          • 프로젝트의 복잡도와 성격
          • 기술 수준
          • 관리 기술

  • 소프트웨어 생명 주기 (Software life cycle)
    • (= 소프트웨어 수명 주기)
    • 소프트웨어를 개발하기 위해 정의하고 운용, 유지보수 등의 과정을 각 단계별로 나눈 것
    • 소프트웨어 개발 단계와 각 단계별 주요 활동, 활동의 결과에 대한 산출물로 표현

    • 소프트웨어 생명 주기의 역할
      • 프로젝트 비용 산정과 개발 계획을 수립할 수 있는 기본 골격
      • 프로젝트 진행 방향을 명확하게 파악
      • 용어 및 기술의 표준화
      • 프로젝트 관리 용이
      • 여러 소프트웨어 간에 상호 일관성 유지

    • 일반적인 소프트웨어 생명 주기
      • 정의 단계
        • 'What'(무엇)을 처리하는 소프트웨어를 개발할 것인가
        • 관리자와 사용자가 가장 많이 참여하는 단계
        • 세부 단계
          • 타당성 검토 단계 : 실현 가능성 조사
          • 개발 계획 단계 : 개발에 사용될 자원과 비용 측정
          • 요구사항 분석 단계
      • 개발 단계
        • 'How'(어떻게) 에 초점을 두고 실제 소프트웨어 개발하는 단계
        • 세부 단계
          • 설계 단계 : 소프트웨어 구조, 알고리즘, 자료구조 작성. 에러가 가장 많이 발생하는 단계
          • 구현 단계 : 설계 단계에 작성된 문서를 기초하여 코딩
          • 테스트 단계 : 구현된 소프트웨어에 내재되어 있는 오류를 찾아주는 단계
      • 유지보수 단계
        • 소프트웨어를 직접 운용하며, 변경(Change)에 초점을 두고 여러 환경 변화에 따라 소프트웨어를 적응 및 유지시키는 단계
        • 생명 주기 중 시간과 비용이 가장 많이 소요

  • 소프트웨어 생명 주기 모형
    • (=소프트웨어 프로세스 모형, 소프트웨어 공학 패러다임)

    • 폭포수 모형 (Waterfall Model)
      • 특징
        • "폭포에서 떨어진 물은 거슬러 올라갈 수 없음"
        • 소프트웨어 개발 단계마다 확실히 매듭짓고 그 결과를 철저하게 검토하여 승인과정을 거친 후 다음단계로 진행. 이전 단계로 넘어갈 수 없음.
        • 가장 오래되고 폭넓게 사용된 전통적인 생명 주기 모형 (고전적 생명주기 모형)
        • 선형 순차적 모형 (개발 과정의 앞 단계가 끝나야만 다음 단계로 넘어갈 수 있음)
        • 매뉴얼 작성 필요
        • 두 개 이상의 과정이 병행 수행 불가
      • 개발 순서
        • 타당성 검토
        • 계획
        • 요구분석
        • 설계
        • 구현
        • 시험
        • 유지보수
      • 장점
        • 모형의 적용 경험과 성공 사례가 많음
        • 단계별 정의가 분명, 전체 공조 이해 용이
        • 단계별 산출물 정확, 개발 공정의 기준점 제시 용이
      • 단점
        • 개발 과정 중에 발생하는 새로운 요구나 경험을 반영하기 어려움 --> 처음부터 사용자들이 모든 요구사항을 명확하게 제시해야 함
        • 단계별로 오류 없이 다음 단계로 진행하기가 어려움
        • 개발된 프로그램을 업무에 운용할 때 검출되지 않은 오류가 있을 수 있음

    • 프로토타입 모형 (Prototype Model, 원형 모형)
      • 특징
        • 사용자의 요구사항을 정확하게 파악하기 위해 실제 개발될 소프트웨어에 대한 견본품을 만들어 최종물을 예측하는 모형
        • 프로토타입은 추후 구현 단계에서 사용될 골격 코드가 됨
        • 개발이 완료된 시점에서 오류가 발견되는 폭포수 모형의 단점을 보완
        • 프로토타입은 요구 분석 단계에서 사용. 평가가 끝나고 개발이 승인되면 다른 모형을 이용하여 본격적인 개발
        • 생명주기에서 유지보수가 없어지고, 개발 단계 안에서 유지보수
      • 개발 순서 (폭포수)
        • 타당성 검토
        • 계획
        • 요구분석 (프로토타입 모형)
          • 요구 수집
          • 빠른 설계
          • 프로토타입 구축
          • 고객평가
          • 프로토타입 조정
          • 구현
        • 설계
        • 구현
        • 시험
        • 유지보수 
      • 장점
        • 요구사항 충실히 반영, 요구사항 변경 용이
        • 최종 결과물이 만들어지기 전에 의뢰자가 최종 결과물의 일부 또는 모형 볼 수 있음
        • 의뢰자나 개발자 모두에게 공동의 참조 모델 제공
      • 단점
        • 미리 제작된 소프트웨어를 사용할 경우, 실제 소프트웨어와의 차이가 발생할 수 있어 사용자에게 혼란을 야기할 수 있음
        • 단기간에 제작해야하기때문에 비효율적인 언어나 알고리즘을 사용할 수 있음

    • 나선형 모델 (Spiral Model, 점진적 모형)
      • 특징
        • Boehm 제안
        • 폭포수 장점 + 프로토 장점 + 위험 분석 기능 추가
        • 나선 따라 돌듯, 여러번의 소프트웨어 개발 과정을 거쳐 점진적으로 프로토 타입을 지속적으로 발전시켜 완벽한 최종 소프트웨어를 개발하는 것
        • 개발하면서 발생할 수 있는 위험을 관리하고 최소화하는 것이 목적
      • 개발 순서
        • 계획 및 정의
        • 위험 분석
        • 공학적 개발
        • 고객 평가
      • 장단점
        • 가장 현실적인 모형, 대규모 프로젝트 및 큰 시스템에 적합
        • 개발과정이 반복되므로, 누락되거나 추가된 요구사항을 첨가할 수 있음. 
        • 정밀함. 유지보수과정 필요 없음
        • 위험 분석 단계에서 기술과 관리의 위험 요소들을 하나씩 제거해 나감으로써 환성도 높은 소프트웨어를 만들 수 있음
        • 위험성 평가에 크게 의존하기 때문에 이를 발견하지 않으면 문제 발생
        • 비교적 최신 기법이라 널리 사용되지 않음

    • 4GT 모형 (4th Generation Techniques, 4세대 기법)
      • 특징
        • 개발자가 쉽게 접근하고 사용할 수 있는 4세대 언어 이용
          • cf. 4세대 언어 : CASE를 비롯한 여러 자동화 도구들
        • 개발자가 조사한 요구사항 명세서로부터 원시 코드를 자동으로 생성할 수 있게 해주는 모형
        • 설계 단계를 축소하고, 요구 분석 단계에서 구현 단계로 전환할 수 있는 비절차적 모형
      • 개발 순서
        • 요구사항 수집
        • 설계 전략
        • 4세대 언어를 이용한 구현
        • 제품화
      • 장단점
        • 설계 단계 단축
        • 4세대 언어 사용하여 원시 코드 자동 생성
        • 종소형 소프트웨어 개발에 사용하면 개발 시간이 감소되지만, 대규모 소프트웨어 개발에서는 자동화로 인해 단축된 시간보다 분석, 설계 단계 등에서 더 많은 시간 필요