7 minute read

SoftWare Engineering

소프트웨어 공학 개요

1. 소프트웨어 공학의 중요성

  • 모든 선진국의 경제는 소프트웨어에 의존하고 있다.
  • 점점 더 많은 시스템이 소프트웨어를 통해 제어되고 있다.
  • 소프트웨어 공학은 전문적인 소프트웨어 개발을 위한 이론, 방법, 도구를 연구하는 학문이다.
  • 소프트웨어에 대한 지출은 선진국의 GNP에서 상당한 비중을 차지한다.

2. 소프트웨어 비용

  • 소프트웨어 비용이 컴퓨터 시스템 전체 비용의 대부분을 차지한다.
    • 예를 들어, PC에서 소프트웨어 비용이 하드웨어 비용보다 높은 경우가 있다.
  • 소프트웨어 유지보수 비용이 개발 비용보다 더 많이 든다.
    • 장기간 사용되는 시스템에서는 유지보수 비용이 개발 비용의 몇 배가 될 수도 있다.
  • 소프트웨어 공학은 비용 효율적인 소프트웨어 개발을 목표로 한다.

3. 소프트웨어 프로젝트 실패 요인

  • 시스템의 복잡성 증가
    • 소프트웨어 공학 기술이 발전하면서 더욱 크고 복잡한 시스템을 개발할 수 있게 되었다.
    • 이에 따라 빠른 개발과 더 복잡한 요구 사항을 충족해야 하는 부담이 커진다.
    • 이전에는 불가능했던 기능들을 요구하는 경우가 많아지고 있다.
  • 소프트웨어 공학 방법론의 부재
    • 소프트웨어 공학적 기법 없이도 프로그램을 작성하는 것은 비교적 쉽다.
    • 많은 기업들이 본래 소프트웨어 개발업이 아니었으나, 제품과 서비스가 발전하면서 소프트웨어 개발을 하게 되었다.
    • 이 과정에서 체계적인 소프트웨어 공학 기법을 사용하지 않으면, 개발 비용이 높아지고 신뢰성이 낮은 소프트웨어가 만들어질 가능성이 크다.

소프트웨어 공학은 현대 경제와 시스템 운영의 핵심 요소이며, 소프트웨어 개발 및 유지 보수 비용이 매우 크다. 특히 시스템이 점점 더 복잡해지고 있으며, 체계적인 소프트웨어 공학 기법을 사용하지 않으면 비용 증가 및 신뢰성 저하 등의 문제가 발생할 수 있다. 따라서 소프트웨어 개발의 효율성과 품질을 높이기 위해 소프트웨어 공학적 접근이 필수적이다.

소프트웨어 공학의 기본 개념

  • 소프트웨어란? : 컴퓨터 프로그램과 관련 문서를 포함하는 개념이다. 특정 고객을 위한 소프트웨어나 일반 시장을 위한 소프트웨어가 있다.
  • 좋은 소프트웨어의 속성? : 기능성과 성능을 만족하며, 유지보수 가능하고 신뢰성 있으며 사용하기 쉬워야 한다.
  • 소프트웨어 공학이란? : 소프트웨어 개발의 모든 측면을 다루는 엔지니어링 분야
  • 소프트웨어 공학의 기본 활동은? : 소프트웨어 명세(요구사항 정의), 개발, 검증(테스트), 진화(업데이트 및 유지 보수)
  • 소프트웨어 공학과 컴퓨터 과학의 차이점은? : 컴퓨터 과학은 이론과 기초에 집중, 소프트웨어 공학은 실용적 개발과 제공에 중점을 둔다.
  • 소프트웨어 공학과 시스템 공학의 차이점? : 시스템 공학은 하드웨어, 소프트웨어, 프로세스를 포함한 전체 시스템 개발을 다루며, 소프트웨어 공학은 그 일부에 해당한다.

소프트웨어 공학의 주요 과제 및 비용

소프트웨어 공학의 핵심 과제

  • 다양한 플랫폼과 기술의 등장으로 인한 소프트웨어 다양성 증가
  • 빠른 소프트웨어 개발 요구
  • 신뢰할 수 있는 소프트웨어 개발

소프트웨어 비용

  • 개발 비용이 전체 소프트웨어 비용의 약 60%, 테스트 비용이 40% 차지
  • 맞춤형 소프트웨어의 경우 유지보수 비용이 개발 비용보다 더 많이 발생한다.

소프트웨어 개발 방법론

  • 모든 소프트웨어 프로젝트는 전문적으로 관리되고 개발되어야한다.
  • 프로젝트 성격에 따라 적절한 개발 방법을 선택해야 한다.
    • 게임 : 프로토타이핑 방식 활용
    • 안전이 중요한 시스템(항공, 의료 등) : 명확한 사양 정의 및 검증 필수

소프트웨어 제품의 유형

  • 일반 소프트웨어(Generic Products)
    • 특정 고객이 아닌 누구나 사용할 수 있는 소프트웨어
    • 개발자가 요구사항을 정의하고 변경을 결정한다.
    • 예: 그래픽 프로그램, 프로젝트 관리 도구, CAD 소프트웨어 등
  • 맞춤형 소프트웨어(Customized Products)
    • 특정 고객의 요구사항에 맞춰 개발됨
    • 고객기 요구사항을 정의하고 변경을 결정한다.
    • 예: 항공 관제 시스템, 트래픽 모니터링 소프트웨어 등

좋은 소프트웨어의 필수 속성

  • 유지보수성 : 변화하는 요구사항에 따라 쉽게 수정이 가능해야 한다.
  • 신뢰성 및 보안 : 시스템 오류 발생 시 물리적, 경제적 피해를 방지해야 하며, 악의적 공격에 안전해야 한다.
  • 효율성 : 메모리 및 CPU 사용을 최소화해야 한다.
  • 사용자 친화성 : 사용자가 쉽게 이해하고 사용할 수 있어야 하며, 기존 시스템과의 호환성이 좋아야한다.

소프트웨어 개발 프로세스

1. 소프트웨어 요구사항 정의(Software Specification)

  • 고객과 개발자가 요구사항을 정의하고 운영 제약을 결정

2. 소프트웨어 개발(Software Development)

  • 소프트웨어 설계 및 프로그래밍 진행

3. 소프트웨어 검증(Software Validation)

  • 소프트웨어가 고객 요구사항을 만족하는지 테스트

4. 소프트웨어 진화(Software Evolution)

  • 고객 및 시장 요구사항 변화에 맞춰 지속적으로 수정 및 개선

소프트웨어 개발에 영향을 미치는 요인

  • 이질성(Heterogeneity)
    • 다양한 플랫폼(PC, 모바일, 클라우드)에서 실행되어야 한다.
  • 비즈니스 및 사회 변화
    • 새로운 기술과 경제 변화에 따라 신속한 소프트웨어 업데이트가 필요하다.
  • 보안 및 신뢰성
    • 소프트웨어가 해킹이나 오류로 인해 피해를 주지 않아야 한다.
  • 규모(Scale)
    • 소규모 시스템부터 클라우드 기반의 글로벌 서비스까지 다양한 규모 지원이 필요하다.

소프트웨어 공학의 다양성

  • 모든 소프트웨어 시스템에 적용할 수 있는 단일 개발 테크닉은 없다.
  • 개발 방법은 프로젝트의 유형, 고객 요구사항, 개발 팀의 배경에 따라 달라진다.

소프트웨어 응용 분야별 개발 방식

  • 독립 실행형 애플리케이션 : PC에서 실행되며 네트워크 연결이 필요 없다.
  • 웹 기반 트랜젝션 시스템 : 원격 서버에서 실행되며 사용자와 상호작용 기능(예: 전자상거래)
  • 임베디드 시스템 : 하드웨어를 제어하는 소프트웨어(예: 자동차, 의료기기)
  • 배치 처리 시스템 : 대량의 데이터를 처리하는 시스템(예: 급여 관리 시스템)
  • 엔터테이먼트 시스템 : 게임 및 멀티미디어 애플리케이션
  • 모델링 및 시뮬레이션 시스템 : 과학 및 공학적 시뮬레이션 시스템
  • 데이터 수집 시스템 : 센서를 이용해 데이터를 수집하는 시스템
  • 복합 시스템(System of Systems) : 여러 개의 소프트웨어 시스템으로 구성된 대형 시스템

소프트웨어 공학의 핵심 원칙

  • 체계적인 개발 프로세스를 사용해야 한다.
  • 신뢰성과 성능이 중요한 요소이다.
  • 요구사항을 정확히 정의하고 관리해야 한다.
  • 가능하면 기존 소프트웨어를 재사용하는 것이 바람직하다.

웹 기반 소프트웨어 개발

웹이 소프트웨어 공학에 미친 영향

  • 웹은 애플리케이션 실행 플랫폼이 된다.
  • 웹 서비스와 클라우드 컴퓨팅 기술이 발전했다.

웹 소프트웨어 개발 특징

  • 소프트웨어 재사용이 중요하다(기존 컴포넌트 활용)
  • 점진적 개발 및 애자일(Agile) 개발 방식이 선호된다.
  • 서비스 지향 아키텍쳐(SOA) 기반으로 개발 가능하다.
  • 고급 UI 기술(AJAX, HTML5 등) 사용하여 풍부한 인터페이스를 제공한다.

소프트웨어 공학은 소프트웨어 개발의 모든 측면을 다루는 엔지니어링 분야로, 체계적인 개발 프로세스를 통해 신뢰성 있는 소프트웨어를 경제적으로 개발하는 것이 목표이다. 소프트웨어 개발에는 비용과 유지보수가 큰 비중을 차지하며, 다양한 개발 방법이 프로젝트에 따라 다르게 적용된다. 또한, 웹과 클라우드 기술의 발전으로 웹 기반 소프트웨어 개발이 중요해지고 있으며, 기존 소프트웨어 재사용과 Agile 개발 방식이 핵심 트렌드로 자리 잡고 있다.

소프트웨어 공학 윤리(Software Engineering Ethics)

소프트웨어 공학은 단순한 기술적 능력 적용을 넘어 더 넓은 책임간을 요구하는 분야이다. 소프트웨어 엔지니어는 정직하고 윤리적으로 행동해야 하며, 단순히 법을 지키는 것을 넘어 도덕적으로 올바른 원칙을 따라야 한다.

소프트웨어 엔지니어의 윤리적 책임

  • 기밀 유지(Confidentiality) : 엔지니어는 고용주나 고객의 정보를 기밀로 유지해야 하며, 공식적인 기밀 유지 계약 여부와 관계없이 이를 존중해야 한다.
  • 역량(Competence) : 엔지니어는 자신의 기술 수준을 과장해서 표현해서는 안 되며, 본인의 역량을 넘어서는 작업을 수락하지 않아야 한다.
  • 지식 재산권 보호(Intellectual Property Rights) : 엔지니어는 특허, 저작권 등 지식 재산권과 관련된 법을 숙지하고 이를 준수해야 한다. 고용주나 고객의 지식 재산이 무단으로 사용되지 않도록 보호할 책임이 있다.
  • 컴퓨터 오용 방지(Computer Misuse) : 소프트웨어 엔지니어는 기술적 역량을 악용해서는 안된다. 사소한 사례로는 근무 중 개인적인 게임 플레이, 심각한 사례로는 바이러스 배포, 해킹 등 악의적인 행위

소프트웨어 엔지니어는 단순히 기술을 활용하는 것을 넘어 윤리적 책임을 다해야 한다. 고객과 기업의 정보를 보호하고, 자신의 역량을 과장하지 않으며, 지식 재산권을 존중하고, 컴퓨터 오용을 방지하는 것이 핵심 윤리 원칙이다.

Case studies

소프트웨어 공학 윤리적 딜레마 및 사례 연구 정리

1. 윤리적 딜레마(Ethical Dilemmas) : 소프트웨어 엔지니어는 윤리적 딜레마에 직면할 수 있으며, 이러한 상황에서 도덕적으로 올바른 결정을 내려야 한다.

  • 경영진의 정책에 대한 원칙적 반대 : 회사의 고위 경영진이 내린 정책이 윤리적으로 문제가 있을 경우, 이를 따를 것인지 거부할 것인지 고민하게 됨.
  • 안전이 중요한 시스템을 완전히 테스트하지 않고 출시 : 고용주가 제품을 서둘러 출시하려 하며, 완전한 테스트 없이 안전이 중요한 시스템을 배포하려는 경우, 이는 사용자에게 심각한 위험을 초래할 수 있다.
  • 군사 무기 또는 핵 시스템 개발 참여 : 군사용 무기 시스템이나 핵 관련 시스템 개발에 참여하는 것에 대한 도덕적 고민, 국가 및 세계 안전 문제와 관련된 윤리적 갈등이 발생할 수 있다.

2. 사례 연구(Case Studies) 소프트웨어 공학이 실제로 어떻게 적용되는지를 보여주는 대표적인 사례들

  • 개인용 인슐린 펌프(A Personal Insulin Pump) : 당뇨 환자가 혈당을 조절할 수 있도록 돕는 임베디드 시스템
    • 윤리적 문제
      • 시스템 오류 시 환자의 건강에 치명적 영향을 미칠 가능성이 있다.
      • 테스트 부족 또는 소프트웨어 결함으로 인해 사용자 안전이 위협받을 수 있다.
  • 정신 건강 환자 관리 시스템(Mental Health Case Management System - Mentcare) : 정신 건강 치료를 받는 환자의 기록을 관리하는 시스템
    • 윤리적 문제
      • 환자 개인정보 보호 문제가 핵심
      • 데이터 유출 또는 오류로 인한 오진이 발생할 경우, 환자에게 심각한 피해를 줄 수 있다.
  • 야생지대 기상 관측소(Wilderness Weather Station) : 외딴 지역에서 기상 데이터를 수집하는 시스템
    • 윤리적 문제
      • 기상 데이터가 부정확하거나 조작될 경우, 연구 또는 정책 결정에 영향을 미칠 수 있다.
      • 데이터 수집 과정에서 환경 보호 문제도 고려해야 한다.
  • iLearn: 디지털 학습 환경(A Digital Learning Environment - iLearn) : 학교에서 학습을 지원하는 온라인 교육 시스템
    • 윤리적 문제
      • 학생 개인정보 보호 및 데이터 보안이 중요하다.
      • 기술 접근성이 낮은 학생들이 불이익을 받을 가능성이 있다.

인슐린 펌프 제어 시스템 정리

  • 인슐린 펌프 제어 시스템 개요
    • 혈당 센서에서 데이터를 수집하여 필요한 인슐린 양을 계산한다.
    • 혈당 변화율을 분석하여 인슐린 주입량을 결정한다.
    • 마이크로펌프를 제어하여 정확한 인슐린 용량을 전달한다.
    • 안전이 중요한 시스템(Safety-Critical System)
      • 저혈당 : 뇌 기능 장애, 혼수 상태, 사망 위험
      • 고혈당 : 장기적으로 시력 손상, 신장 질환 등 건강 문제 유발
  • 인슐린 펌프의 활동 모델(Activity Model)

Alt text

  • 필요 고수준 요구사항(Essential High-Level Requirments)
    • 인슐린 공급 가능성 보장 : 언제든지 인슐린을 공급할 수 있어야 함
    • 신뢰성 및 정확성 확보 : 정확한 양의 인슐린을 제공하여 혈당을 조절해야 함
    • 안정적인 시스템 설계 및 구현 : 시스템이 항상 위 요구사항을 충족하도록 설계되어야 하며, 하드웨어 및 소프트웨어의 오류 방지가 필수적이다.

소프트웨어 엔지니어는 윤리적 딜레마에 직면할 수 있으며, 신중한 판단이 필요하다. 또한, 다양한 실제 사례 연구를 통해 소프트웨어가 의료, 교육, 환경 등 중요한 분야에서 사용됨을 알 수 있으며, 개발 과정에서 개인정보 보호, 데이터 정확성, 사용자 안전을 고려하는 것이 필수적이다.

소프트웨어 공학 핵심 요점 정리

소프트웨어 공학의 개념

소프트웨어 공학은 소프트웨어 생산의 모든 측면을 다루는 공학 분야이다.

좋은 소프트웨어의 필수 속성

  • 유지보수성(Maintainability) : 소프트웨어가 변경 요구에 쉽게 적응할 수 있어야한다.
  • 신뢰성 및 보안(Dependability & Security) : 오류 없이 안정적으로 작동해야 하며, 보안이 강해야 한다.
  • 효율성(Efficiency) : 불필요한 리소스 사용을 최소화하고 성능이 우수해야 한다.
  • 사용자 수용 가능성(Acceptability) : 사용자가 쉽게 이해하고 사용할 수 있어야 한다.

소프트웨어 개발의 주요 활동

1. 명세(Specification) : 요구사항을 정의하고 시스템의 동작을 문서화

2. 개발(Development) : 소프트웨어 설계 및 프로그래밍

3. 검증(Validation) : 소프트웨어가 요구사항을 충족하는지 테스트

4. 진화(Evolutionn) : 고객 및 시장 요구에 따라 지속적인 개선 및 업데이트

소프트웨어 공학의 보편적 원칙

  • 소프트웨어 공학의 핵심 개념은 모든 유형의 시스템 개발에 적용이 가능하다.
  • 다양한 시스템에 맞는 적절한 소픝트웨어 공학 도구 및 기법이 필요하다.

소프트웨어 엔지니어의 책임

  • 소프트웨어 엔지니어는 기술적인 문제뿐만 아니라 사회적 책임도 고려해야 한다.
  • 전문적인 윤리 규범을 준수해야 하며, 엔지니어링 직업 윤리, 사회적 책임을 수행해야 한다.
  • 전문 기관(Professional Societies)에서 행동 강령을 제공하며, 이는 소프트웨어 엔지니어의 행동 기준을 규정한다.