소프트웨어 공학이란?

소프트웨어의 정의

  • 프로그램: 프로그래밍한 원시 코드
  • 소프트웨어: 개발 과정에서 생성되는 프로그램(코드)를 비롯한 모든 산출물과 각 단계에서 만들어지는 문서와 메뉴얼 등을 모두 포함


소프트웨어의 특징

  • 제조가 아닌 개발
  • 소모가 아닌 품질 저하


소프트웨어 공학 (Software Engineering)

소프트웨어 공학은 전문적이고 비용-효율적인 이론, 방식, 도구를 모두 포함합니다.

  • 점점 더 많은 시스템들이 소프트웨어를 사용하는 추세이다.
  • 모든 선진국들은 소프트웨어 산업이 발달해 있습니다.
  • 소프트웨어 비용은 하드웨어(컴퓨터 시스템) 비용보다 더 많이 드는 경우가 많습니다.
  • 소프트웨어는 개발보다 유지보수에 더 많은 비용이 듭니다.
    사용 시작 단계부터 사용자의 요구가 계속 발생할 수 있고, 시스템 수명이 길고, 오류가 많을수록 더욱 커집니다.
    • 소프트웨어 개발 비용의 약 60%는 개발 비용, 40%는 테스트 비용, 맞춤형 소프트웨어의 경우 개선 비용이 개발 비용을 초과할 수도 있음

하나의 제품인 소프트웨어를 만들기 위해 계획 단계에서 유지보수 단계에 이르기까지 일어나는 일련의 과정
(계획, 분석, 설계, 구현, 테스트, 유지보수)을 소프트웨어 공학적 측면으로 소프트웨어 개발 생명주기라 합니다.


소프트웨어 공학은 시스템 사양의 초기 단계부터 시스템 사용 후 유지 관리에 이르기까지 소프트웨어 생산의 모든 측면을 다루는 엔지니어링 분야(engineering discipline)입니다.

  • 즉, 조직적, 재정적 제약을 고려하여 적절한 이론과 방법을 사용하여 문제를 해결하는 공학 분야
  • 개발의 기술적 프로세스 뿐만 아니라, 프로젝트 관리 및 소프트웨어 제작을 지원하는 도구, 방법 등의 개발을 모두 포함

컴퓨터 과학(CS)은 이론과 기본에 중점을 두지만,
소프트웨어 공학(SE)는 공학적 측면으로 유용한 소프트웨어를 개발하고 제공하는 데 필요한 실질적 측면을 다룹니다.


Type of Software products

  • Generic Software: 구매를 원하는 모든 고객에게 마케팅 및 판매되는 독립형 시스템
    • 대부분의 상업 및 pc 소프트웨어가 이에 해당합니다.
    • 개발자가 요구사항 명세를 소유.
    • 예: MS Project, CAD, 그래픽 툴, 치과용 예약 시스템 등.
  • Customized Software: 특정 고객이 자체 요구사항을 충족하도록 의뢰한 소프트웨어
    • 특정 고객(조직)의 요구사항에 맞게 개발, 의뢰받아 제작.
    • 고객이 요구사항 명세를 소유.
    • 예: 항공 관제 시스템, 교통 모니터링 시스템, 임베디드 제어 시스템 등.

[!NOTE]

은행 Teller가 사용하는 은행시스템Customized Software 에 해당합니다.


Essential Attributes of Good Software Products

소프트웨어 품질 목표

  • 좋은 소프트웨어는 요구 기능과 성능을 제공해야 하며, 유지보수성, 신뢰성, 효율성이 뛰어나며 사용하기 편리해야 합니다.
분류 속성/목표 설명
Essential Attributes Maintainability (유지보수성) 변화하는 요구사항과 환경에 대응할 수 있도록 쉽게 수정·확장 가능해야 함
  Dependability (신뢰성) 신뢰성, 보안성, 안전성을 포함하며 오류 발생 시 물리적·경제적 피해를 최소화해야 함
  Efficiency (효율성) CPU, 메모리, 네트워크 등 시스템 자원을 낭비하지 않고 최적화하여 활용
  Acceptability (수용성) 사용자 친화적이어야 하며, 이해·사용이 쉽고 다른 시스템과 호환 가능해야 함
W. E. Perry – 11 Quality Goals 정확성 (Correctness) 요구사항과 설계 명세를 정확히 만족하는 정도
  신뢰성 (Reliability) 오작동 없이 지속적으로 올바른 기능을 수행하는 능력
  효율성 (Efficiency) 자원을 낭비하지 않고 목표 성능을 달성하는 정도
  무결성 (Integrity) 접근 통제 및 보안을 통해 시스템 자산을 보호하는 능력
  사용성 (Usability) 사용자가 배우고 활용하기 쉽고 직관적인 정도
  유지보수성 (Maintainability) 결함 수정 및 기능 개선을 쉽게 수행할 수 있는 능력
  유연성 (Flexibility) 새로운 요구사항이나 환경 변화에 적응할 수 있는 정도
  시험성 (Testability) 소프트웨어가 검증 및 테스트되기 용이한 정도
  이식성 (Portability) 다양한 하드웨어/OS 환경에서 쉽게 이전·적용할 수 있는 능력
  재사용성 (Reusability) 구성 요소나 모듈을 다른 시스템에서 다시 활용할 수 있는 정도
  상호운용성 (Interoperability) 다른 시스템 및 소프트웨어와 원활하게 연동·호환할 수 있는 능력


Typical Activities in Software Engineering

  • 소프트웨어 명세(Software Specification)
    • 고객과 엔지니어는 제작할 소프트웨어와 운영상의 제약 조건을 정의합니다
    • Requirements Engineering
  • 소프트웨어 개발(Software Development)
    • 소프트웨어가 설계되고 프로그래밍 됩니다
    • 아키텍처 설계, 상세 설계 및 구현
    • CTIP(지속적 테스트 및 통합 플랫폼)
  • 소프트웨어 검증(Software Validation)
    • 소프트웨어가 고객의 요구 사항을 충족하는 지 확인하기 위해 검사 실시
    • Software Verification & Validation, 테스트
  • 소프트웨어 진화(Software Evolution)
    • 변화하는 시장 흐름 및 고객의 요구 사항을 반영하도록 수정
    • 소프트웨어 유지보수


Software Project Failures

소프트웨어 프로젝트를 진행하면서 실패하는 상황이 발생할 수 있습니다.
대표적으로 아래 두 가지 경우가 있습니다.

  • 시스템 복잡도 증가
    • 갈수록 더 크고 복잡한 시스템이 요구될 수 있습니다.
    • 시스템은 더 빠르게 구축되고 제공되어야 합니다.
  • 소프트웨어 공학론을 미사용 (적용하지 않음)
    • 새로운 소프트웨어 공학론은 더 크고 복잡한 시스템을 구축하는데 도움이 됩니다.
      그러나 많은 기업들은 소프트웨어 공학론을 적용하지 않는 경우가 많습니다.


소프트웨어 공학의 다양성 (Diversity)

다양성 증가에 대처하고, 시간 단축 요구에 대응하고 신뢰할 수 있는 소프트웨어를 개발하는 것은 소프트웨어 공학이 직면한 주요 과제입니다.

  • No silver bullet for software engineering
    • 1986년 튜링상 수상자 프레드 브룩스가 쓴 소프트웨어 엔지니어링에 관해 널리 논의된 논문입니다.
      브룩스는 “기술이든 관리 기법이든 한쪽으로만 이루어진 개발은 없으며 그 자체로 10년 안에 생산성, 신뢰성, 단순성 면에서 크기 정도의 개선만을 약속한다.“고 논한다.
    • 즉, 소프트웨어 시스템은 매우 다양한 유형이 있으며, 이 모든 유형에 적용될 수 있는 보편적인 기술은 없습니다.
  • 소프트웨어 공학론과 도구는 개발 중인 애플리케이션 타입, 고객의 요구사항, 개발팀의 배경에 따라 달라집니다.
    즉, 어떤 방법이 더 뛰어나다고 단정지을 수 없습니다.


소프트웨어 애플리케이션의 유형

Type Features
Stand-alone PC와 같은 로컬 환경에서 실행되는 애플리케이션
네트워크 연결이 필요 없을수도 있음
Interactive transaction-based 원격 컴퓨터에서 실행되고 사용자가 원격으로 액세스할 수 있는 애플리케이션
예시: 전자상거래 시스템, 웹 기반
Embedded control Systems 임베디드 하드웨어 장치를 제어하고 관리
Batch processing systems 대량의 개별 입력을 처리하여 해당 출력을 대량으로 생성하도록 설계된 비즈니스 시스템
Entertainment systems 주로 개인용으로 사용되며 사용자의 엔터테인먼트를 위한 시스템
Systems for modelling and simulation 과학자나 엔지니어가 개발하며 물리적 과정이나 상황을 모델링하기 위해 개발
여러 개의 분리된, 상호작용하는 객체들로 구성 (= M&S)
Data collection systems 센서와 같은 장치로 주변 환경의 데이터를 수집하고
해당 데이터를 다른 시스템으로 전송하여 처리하는 시스템
Systems of systems 시스템의 시스템
여러 다른 소프트웨어 시스템들로 구성됨 (≈ CPS)


소프트웨어 공학의 기초 (Fundamentals)

모든 유형의 소프트웨어 시스템에 적용되는 기본 원칙은 개발 기법과 관계없이 공통적으로 적용할 수 있습니다.

  • 시스템은 관리되고 이해되는 개발 프로세스를 사용하여 개발되어야 합니다. 물론 소프트웨어 유형에 따라 다른 프로세스가 사용됩니다.
    • SLDC (Software Development Life-Cycle), Development process, Agile, Dev-Ops
  • 모든 유형의 시스템에서 신뢰성(dependability)과 성능(Performance)은 매우 중요합니다.
  • 소프트웨어 사양과 요구 사항을 이해하고 관리하는 것은 중요합니다. (Requirements Engineering)
  • 필요한 경우 새로운 소프트웨어를 작성하는 대신 기존 소프트웨어를 재사용해야 합니다.
    • 오픈 소스 소프트웨어를 활용할 수도 있습니다.

시스템 공학은 하드웨어, 소프트웨어, 프로세스 공학을 포함한 컴퓨터 기반 시스템 개발의 모든 과정을 다루며,
소프트웨어 공학은 이러한 일반적인 과정의 일부입니다.


웹 기반 소프트웨어 엔지니어링

웹은 다양한 애플리케이션을 실행하는 플랫폼입니다. 웹 서비스를 통해 웹 애플리케이션 기능에 액세스 가능하고
클라우드 컴퓨팅을 통해 애플리케이션을 클라우드에서 원격으로 실행할 수 있습니다.

  • 복잡한 분산 시스템
  • 소프트웨어 엔지니어링의 기본 원칙은 웹 기반 시스템에서도 동일한 방식으로 적용됩니다.
    • 소프트웨어 재사용
    • Incremental 및 애자일 개발
    • 서비스 지향 시스템
    • 풍부한 인터페이스 (HTML5, AJAX 등)

웹은 소프트웨어 서비스의 가용성과 고도로 분산된 서비스 기반 시스템 개발 가능성을 가져왔으며,
웹 기반 시스템 개발은 프로그래밍 언어와 소프트웨어 재사용의 발전을 가져왔습니다.