01 intro

1. 소프트웨어

  • 소프트웨어 공학의 목표: 최소의 비용으로 고품질의 소프트웨어를 적시에 공급하는 것
  • 소프트웨어
    • 프로그램 + 프로그램의 개발, 운용, 보수에 필요한 정보 일체
    • 개념적이고 무형적 (생산물의 구조가 코드 안에 숨어 있음)
  • 소프트웨어의 특성
    • 비가시성\(_{Invisibility}\)
    • 복잡성\(_{Complexity}\)
    • 순응성\(_{Conformity}\)
    • 복제 가능\(_{Duplicability}\)

  • 시스템: 필요한 기능을 실현시키기 위하여 관련 요소를 어떤 법칙에 따라 조합한 집합체
  • 시스템의 성질
    • 서브시스템: 한 시스템의 요소들은 밀접하게 연관되어 있다.
    • 기능적 분할: 시스템은 규모가 작은 부속 시스템들로 나눌 수 있음
    • 시스템 경계: 시스템과 주변 환경을 구분할 수 있는 경계가 있음(입력과 출력이 만나는 곳)
    • 자동화 경계: 시스템이 자동화된 부분과 수동 작업 부분을 나누는 경계

2. 소프트웨어 공학의 필요성

화성성역의궤와 소프트웨어 공학

  • 화성성역의궤
    • 수원화성을 축성한 그 건설 과정 및 기타 제반사항들을 모두 글과 그림으로 기록하여 남긴 책
    • 당시 축성 과정에서 사용된 각종 공사법, 무기 대응방안, 기자재의 상세한 모습과 사용방법 등…
  • 수원화성을 수백여 년 전에 지어졌던 성을 100% 그대로의 모습으로 복원 가능한 이유는 화성성역의궤가 존재하기 때문

  • 최종 산출물: 실행 가능한 프로그램
    • 최종 산출물을 만들기 위해 처음부터 끝까지 사용된 기록물들을 소프트웨어 또는 문서라고 한다.

소프트웨어와 화성성역의궤 사이의 관계를 서술하시오

화성성역의궤는 수원 화성을 축성한 건설 과정 및 기타 제반사항들을 모두 글과 그림으로 기록하여 남긴 책으로, 화성성역의궤가 있었기에 지금의 수원 화성이 존재하는 것이다. 이처럼 소프트웨어를 설계할 때 과정을 기록해두지 않는다면 프로그램도 의미가 없다고 할 정도로 중요한 것이다. 또한, 과거에 작성한 화성성역의궤를 다시 이용한 것처럼 소프트웨어도 재사용이 가능하다.

  • 소프트웨어 공학은 소프트웨어에 있는 심각한 직접적인 손해 또는 간접적인 손해가 따를 수 있는 문제를 해결
  • 소프트웨어 제품은 고객의 문제를 해결하기 위해 구축, 비즈니스를 운영하기 위하여 사용
  • 소프트웨어가 제대로 작동하지 않으면 재정적 손실이 크고 사용자가 불편을 겪음

고비용

  • LOC\(_{Lines \ of \ Code}\): 소프트웨어의 규모를 측정하는 데 가장 널리 사용
  • MM\(_{Man-Month}\) : 소프트웨어 개발에 드는 비용
  • 생산성 : MM당 생산하는 프로그램의 LOC
    • 5만줄의 프로그램 – 4천만원 내지 1억 2천 정도의 비용
  • 소프트웨어 위기 현상

    • 하드웨어 발전 속도가 소프트웨어 발전 속도보다 월등히 빠르기 때문이다.

소프트웨어 위기 현상의 이유(소프트웨어의 특징)

개발 지연과 낮은 신뢰도

  • 계획에서 벗어난 컴퓨터 관련 개발 프로젝트
  • 예상대로 작동하지 않는 사례
  • 하드웨어와 다름
    • 설계, 개발 과정에 유입된 오류에 의한 것

유지보수와 재작업

  • 유지보수가 필요한 이유
    • 시스템에 남아 있는 오류가 있기 때문에
    • 소프트웨어는 업그레이드(성능 향상)가 흔하기 때문에 수정이 필요
  • 소프트웨어 개발의 문제점
    • 의도하는 바가 잘 드러나지 않음 → 요구를 파악하기 어려움
    • 개발을 진행하면서 요구가 변경되고 재작업이 필요

3. 소프트웨어 공학이란?

  • 소프트웨어 공학 : 소프트웨어의 개발과 운영, 유지보수, 소멸에 대한 체계적인 접근 방법
    • 체계적인 접근 : 소프트웨어 개발에 사용되는 방법이 일회성이 아닌 반복 사용이 가능함

      → 신뢰성이 보장되고 검증됨

  • 고강도의 소프트웨어는 사용자의 문제를 해결
    • 사용자의 요구를 만족시키기 위해 소프트웨어를 체계적으로 개발

품질과 생산성

  • 엔지니어링 작업에서는 비용, 일정, 품질과 같은 변수가 중요
  • 생산성과 품질은 trade-off 관계이다.
    • 생산성 \(\uparrow\), 품질 \(\downarrow\)
    • 생산성 \(\downarrow\), 품질 \(\uparrow\)
  • 비용
    • Man-Month로 측정
  • 일정
    • 짧은 time-to-market
  • 품질을 나타내는 속성
    • 기능성\(_{functionality}\)
    • 신뢰성\(_{reliability}\)
    • 사용 용이성\(_{usability}\)
    • 효율성\(_{efficiency}\)
    • 유지 보수성\(_{maintainability}\)
    • 이식성\(_{portability}\)

소프트웨어 공학의 접근 방법

  • 프로젝트를 수행하는 동안 얻은 품질과 생산성은 여러 가지 요인에 좌우됨
  • 품질을 좌우하는 세가지 : 인력, 프로세스, 기술
    • 프로젝트 삼각 균형

  • 소프트웨어를 개발하는 프로세스를 소프트웨어와 분리
  • 소프트웨어 공학은 소프트웨어 제작 과정에 집중
    • 알고리즘, 운영 체제, 데이터베이스 등은 소프트웨어 제품 자체에 초점
  • 소프트웨어 엔지니어링 작업의 종류
    • 소프트웨어 개발 프로세스 – 시스템에 대한 비전과 개념을 목표로 하는 컴퓨터 환경에 실행되는 소프트웨어로 바꾸는 작업
    • 품질 보증 – SQA(Software Quality Assurance) 개발 작업이 적절히 수행되었는지 확인
    • 프로젝트 관리 – 개발과 품질 보증 작업을 관리하고 감독

단계적 개발 프로세스

  • 단계적 개발 프로세스를 따르는 이유
    • 소프트웨어의 문제를 나눠 여러 개발 단계에서 다른 관점을 다루기 때문
    • 개발하는 동안 정해진 시점에 품질과 진행을 체크할 수 있음

  • 요구분석 : 소프트웨어 시스템이 풀어야 할 문제를 이해하기 위한 작업
    • 문제를 분석 : 문제와 그 배경을 잘 이해하고 개발할 시스템의 요구 찾기
    • 요구를 정리 : 요구명세서\(_{requirement \ specification}\)
      • 시스템의 기능 이외에도 설계에 영향을 주는 모든 요인을 문서에 기술
  • 설계
    • 요구를 어떻게 만족시킬 것인지
    • 기본(구조) + 상세
  • 코딩
    • 시스템 설계를 프로그래밍 언어로 변환
    • 코딩 작업 중에는 읽기 쉽고 이해하기 쉬운 프로그램이 되어야함 → 변경하기 쉬워져야 하기 때문
    • 단순함과 명확성을 추구
  • 테스팅: 소프트웨어의 결함을 찾아냄
    • 소프트웨어 개발 단계에서 사용되는 중요한 품질 제어 수단
    • 프로그램에 포함된 요구, 설계, 코딩 오류를 밝힘
    • 단위 테스팅\(_{unit \ testing}\): 모듈이나 컴포넌트를 개별적으로 시험
    • 통함 테스팅\(_{integration \ testing}\): 모듈 사이의 연결을 시험
  • 일반적인 개발 단계는 아래 4 단계를 거친다고 보면 된다.
    1. 분석 - 요구 명세서
    2. 설계 - 설계 명세서
    3. 구현 - 새 시스템, 유지 보수 계획
    4. 테스팅 - 테스팅 결과 보고서

품질 보증

  • 품질 보증 : 개발되고 있는 소프트웨어가 요구와 품질 수준을 만족시킬 것이라는 것을 보장하는 작업
  • 검토\(_{verification}\)
    • 개발 작업이 프로젝트를 위해 선택된 프로세스와 방법에 맞게 수행되었는지 체크
    • 요구된 소프트웨어 결과물이 품질 수준에 맞게 생산되었는지 검사
  • 확인\(_{validation}\): 개발 프로세스에 의하여 생성된 결과물의 정확성을 체크
    • 정적 확인\(_{static \ validation}\): 소프트웨어를 실행시키지 않고 결과물의 정확성을 체크
    • 동적 확인\(_{dynamic \ validation}\): 소프트웨어를 실행시켜 잘 작동하는지 확인 테스팅
  • 동적 확인 작업, 테스트 결과가 예상되는 결과와 일치하는지 체크

댓글남기기