소프트웨어 공학 소개

소프트웨어 공학

소프트웨어 공학이란?

  • 소프트웨어의 개발, 운용, 유지보수 등의 생명주기전반을 체계적이고 서술적이며 정량적으로 다루는 학문

배경

  1. 증가하는 소프트웨어의 필요성: 모든 선진국의 경제는 소프트웨어에 의존하고 있으며, 소프트웨어로 제어되는 시스템이 늘어나고 있습니다. 개발국의 국내총생산(GNP)에서 소프트웨어 지출이 상당 부분을 차지합니다​​.
  2. 소프트웨어 비용: 소프트웨어는 개발보다 유지보수에 더 많은 비용이 들며, 장기간 사용되는 시스템의 경우 유지보수 비용이 개발 비용의 수배에 달할 수 있습니다. 소프트웨어 공학은 비용 효율적인 소프트웨어 개발에 중점을 둡니다​​.
  3. 시스템 복잡성 증가: 새로운 소프트웨어 공학 기술이 더 크고 복잡한 시스템을 구축할 수 있게 해주면서, 이러한 시스템은 더 빠르게 구축되어야 하며, 이전에는 불가능하다고 여겨졌던 새로운 기능을 필요로 합니다​​.
  4. 소프트웨어 공학 방법의 미사용: 컴퓨터 프로그램을 소프트웨어 공학 방법 없이 작성하는 것은 상대적으로 쉬울 수 있습니다. 많은 회사들이 제품과 서비스가 진화함에 따라 소프트웨어 개발에 점차적으로 관여하게 되었습니다. 이들은 일상적인 작업에서 소프트웨어 공학 방법을 사용하지 않으며, 이로 인해 소프트웨어가 종종 더 비싸고 신뢰성이 떨어질 수 있습니다​​.

소프트웨어 위기

  • 1968년 NATO 회의에서 처음으로 제안된 소프트웨어 공학 용어와 소프트웨어 위기의 주요 문제
  • 소프트웨어의 질 문제: 소프트웨어가 종종 예산과 시간을 초과하여 제어할 수 없게 되며, 이는 종종 소프트웨어의 품질이 낮다는 것을 의미합니다​​.
  • 새로운 방법론의 필요성: 소프트웨어는 체계적이고 엄격하며 측정 가능한 방식으로, 시간과 예산 내에, 그리고 사양에 맞게 구축될 필요가 있습니다. 이는 소프트웨어 공학 방법을 사용하여 소프트웨어 위기에 대응하는 데 중요합니다​​.

소프트웨어 공학에 자주 하는 질문

  1. 소프트웨어란 무엇인가?: 컴퓨터 프로그램과 관련 문서입니다. 소프트웨어 제품은 특정 고객을 위해 개발될 수도 있고 일반 시장을 대상으로 개발될 수도 있습니다
  2. 좋은 소프트웨어의 속성은 무엇인가?: 좋은 소프트웨어는 사용자에게 필요한 기능과 성능을 제공하며 유지보수가 가능하고 신뢰할 수 있으며 사용하기 쉬워야 합니다
  3. 소프트웨어 공학이란 무엇인가?: 소프트웨어 생산의 모든 측면에 관심을 가지는 공학 분야입니다
  4. 소프트웨어 공학의 기본 활동은 무엇인가?: 소프트웨어 사양, 소프트웨어 개발, 소프트웨어 검증 및 소프트웨어 진화입니다
  5. 소프트웨어 공학과 컴퓨터 과학의 차이는 무엇인가?: 컴퓨터 과학은 이론과 기본 원리에 초점을 맞춘 반면, 소프트웨어 공학은 유용한 소프트웨어를 개발하고 제공하는 실용적인 문제에 관심을 가집니다
  6. 소프트웨어 공학과 시스템 공학의 차이는 무엇인가?: 시스템 공학은 하드웨어, 소프트웨어 및 프로세스 공학을 포함한 컴퓨터 기반 시스템 개발의 모든 측면에 관심을 가집니다. 소프트웨어 공학은 이보다 더 일반적인 과정의 일부입니다
  7. 소프트웨어 공학이 직면한 주요 도전 과제는 무엇인가?: 다양성 증가, 납기 단축 요구, 신뢰할 수 있는 소프트웨어 개발입니다
  8. 소프트웨어 공학의 비용은 어떠한가?: 소프트웨어 비용의 약 60%는 개발 비용이고, 40%는 테스트 비용입니다. 맞춤 소프트웨어의 경우, 진화 비용이 개발 비용을 초과할 수 있습니다
  9. 최고의 소프트웨어 공학 기술과 방법은 무엇인가?: 모든 소프트웨어 프로젝트는 전문적으로 관리되고 개발되어야 하며, 시스템 유형에 따라 적합한 다른 기술이 적용됩니다
  10. 인터넷이 소프트웨어 공학에 어떤 변화를 가져왔는가?: 인터넷은 대규모, 고도로 분산된 서비스 기반 시스템의 개발을 촉진했으며, 모바일 장치용 “앱” 산업의 창출을 지원하여 소프트웨어의 경제적 측면을 변화시켰습니다

일반적인 제품

  • 소프트웨어를 구매하고 싶은 사람들에게 마케팅을 하고 판매를 함
  • 명세서는 소프트웨어 개발자에게 달려있음

맞춤형 제품

  • 특정 고객에게 그들의 요구에 맞는 요청을 받음
  • 고객의 명세서에 달려있음

좋은 소프트웨어의 필수 특징

  1. Acceptability: 소프트웨어는 설계된 사용자 유형에게 수용 가능해야 합니다. 이는 사용자에게 이해하기 쉽고, 사용하기 편리하며, 사용자가 사용하는 다른 시스템과 호환될 수 있어야 함을 의미합니다.
  2. Dependability and security: 소프트웨어 신뢰성은 신뢰성, 보안성 및 안전성을 포함한 다양한 특성을 포함합니다. 신뢰할 수 있는 소프트웨어는 시스템 실패시 물리적이나 경제적 피해를 입혀서는 안 됩니다. 소프트웨어는 악의적인 사용자가 시스템에 접근하거나 시스템을 손상시키지 못하도록 보안이 유지되어야 합니다.
  3. Efficiency: 소프트웨어는 메모리 및 프로세서 주기와 같은 시스템 리소스를 낭비하지 않아야 합니다. 따라서 효율성은 응답성, 처리 시간, 자원 활용 등을 포함합니다.
  4. Maintainability: 소프트웨어는 고객의 변화하는 요구 사항을 충족시킬 수 있도록 진화할 수 있게 작성되어야 합니다. 이는 소프트웨어 변경이 빠르게 변화하는 비즈니스 환경의 필연적인 요구사항이기 때문에 중요한 특성입니다.

소프트웨어 공학의 분야

  • 공학 분야: 적절한 이론과 방법을 사용하여 조직적 및 재정적 제약을 고려하여 문제를 해결합니다.
  • 소프트웨어 생산의 모든 측면: 개발의 기술적 과정뿐만 아니라 프로젝트 관리와 소프트웨어 생산을 지원하기 위한 도구, 방법 등의 개발도 포함됩니다.

소프트웨어 공학의 중요성

  • 소프트웨어 엔지니어링의 중요성은 현대 사회와 개인이 점점 더 고급 소프트웨어 시스템에 의존하게 됨에 따라 강조됩니다. 이는 신뢰할 수 있고 경제적인 방식으로 신속하게 시스템을 생산할 수 있는 능력이 필요함을 의미합니다.
  • 소프트웨어 엔지니어링 방법과 기술을 사용하는 것은 장기적으로 봤을 때 개인 프로젝트처럼 프로그램을 단순히 작성하는 것보다 일반적으로 더 경제적입니다. 대부분의 시스템 유형에서, 소프트웨어가 사용 중에 변경될 때 발생하는 비용이 전체 비용의 대부분을 차지하기 때문에, 소프트웨어 엔지니어링을 사용하는 것이 더 효율적입니다.

소프트웨어 공학 활동

  1. 명세화
  2. 개발
  3. 타당성 확인
  4. 진화

소프트웨어에 영향을 미치는 여러 일반적인 문제들

  1. Heterogeneity: 소프트웨어 시스템은 점점 더 다양한 유형의 컴퓨터 및 모바일 기기를 포함하는 네트워크에서 분산 시스템으로 운영될 필요가 있습니다. 이로 인해 소프트웨어는 다양한 기술과 환경을 아우를 수 있어야 합니다.
  2. Business and social change: 비즈니스와 사회는 신흥 경제가 발전하고 새로운 기술이 사용 가능해짐에 따라 매우 빠르게 변화하고 있습니다. 이러한 변화에 대응하기 위해 기업과 조직은 기존 소프트웨어를 변경하고 새로운 소프트웨어를 신속하게 개발할 수 있어야 합니다.
  3. Security and trust: 소프트웨어가 우리 생활의 모든 측면과 밀접하게 연결되어 있기 때문에, 소프트웨어를 신뢰할 수 있어야 합니다. 이는 소프트웨어 보안이 매우 중요해지는 이유입니다.
  4. Scale: 소프트웨어는 매우 작은 포터블이나 착용 가능한 기기의 내장 시스템부터 글로벌 커뮤니티에 서비스를 제공하는 인터넷 규모의 클라우드 기반 시스템에 이르기까지 매우 다양한 규모로 개발되어야 합니다. 이러한 규모의 다양성은 소프트웨어 개발에 많은 도전을 제기합니다.

소프트웨어 공학의 다양성

  • 다양한 소프트웨어 종류가 있기 때문에, 하나로 아우르는 소프트웨어 기법이 있는게 아님.
  • 소프트웨어 공학 방법론 혹은 도구는 애플리케이션의 종류, 소비자의 요구사항, 개발 팀의 배경에 따라 달라진다.

애플리케이션 유형

  1. Stand-alone applications: 이들은 로컬 컴퓨터에서 실행되는 애플리케이션 시스템으로, 네트워크에 연결되어 있지 않아도 모든 필요한 기능을 수행할 수 있습니다.
  2. Interactive transaction-based applications: 이들 애플리케이션은 원격 컴퓨터에서 실행되며, 사용자들이 자신의 PC나 터미널에서 이들을 접근할 수 있습니다. 예를 들어, 전자 상거래 애플리케이션과 같은 웹 애플리케이션들이 이에 해당합니다.
  3. Embedded control systems: 이들은 하드웨어 장치를 제어하고 관리하는 소프트웨어 제어 시스템입니다. 이러한 유형의 시스템은 숫자적으로 다른 어떤 유형의 시스템보다 많을 수 있습니다.
  4. Batch processing systems: 이들은 대량의 데이터를 한 번에 처리하기 위해 설계된 비즈니스 시스템입니다. 대량의 개별 입력을 처리하여 해당 출력을 생성합니다.
  5. Entertainment systems: 주로 개인 사용을 목적으로 하며 사용자를 즐겁게 하기 위해 설계된 시스템입니다.
  6. Systems for modelling and simulation: 이들은 과학자와 엔지니어에 의해 물리적 과정이나 상황을 모델링하기 위해 개발된 시스템입니다.
  7. Data collection and analysis systems: 이들은 환경으로부터 센서를 통해 데이터를 수집하고 다른 시스템으로 해당 데이터를 전송하여 처리하는 시스템입니다.
  8. Systems of systems: 이들은 다른 여러 소프트웨어 시스템들로 구성된 시스템입니다.

소프트웨어 공학 기본 원칙

  1. 관리된 개발 프로세스 사용: 모든 시스템은 이해하고 관리할 수 있는 개발 프로세스를 사용하여 개발되어야 합니다. 다양한 유형의 소프트웨어에는 다양한 프로세스가 사용될 수 있습니다.
  2. 신뢰성과 성능의 중요성: 모든 유형의 시스템에 있어 신뢰성과 성능은 중요합니다.
  3. 소프트웨어 사양과 요구사항의 이해 및 관리: 소프트웨어가 무엇을 해야 하는지에 대한 이해와 관리는 중요합니다.
  4. 기존 소프트웨어의 재사용: 가능한 경우, 새로운 소프트웨어를 작성하는 대신 이미 개발된 소프트웨어를 재사용해야 합니다.

소프트웨어 공학 윤리

정의와 중요성

  • 소프트웨어 엔지니어링은 단순한 기술적 기술을 적용하는 것 이상의 폭넓은 책임을 포함합니다.
  • 소프트웨어 엔지니어는 전문가로서 존중받기 위해 정직하고 윤리적으로 책임감 있는 방식으로 행동해야 합니다.
  • 윤리적 행동은 법을 준수하는 것을 넘어서, 도덕적으로 올바른 일련의 원칙을 따르는 것을 의미합니다​​.

전문적인 책임

  • 기밀성 (Confidentiality):
    • 엔지니어는 공식적인 기밀유지 계약이 체결되었는지 여부에 관계없이 고용주나 클라이언트의 기밀을 유지해야 합니다​​.
  • 능력 (Competence):
    • 엔지니어는 자신의 능력 수준을 과장해서는 안 되며, 자신의 능력 밖의 작업을 의도적으로 수락해서는 안 됩니다​​.
  • 지적 재산권 (Intellectual Property Rights):
    • 엔지니어는 특허, 저작권 등 지적 재산을 사용하는 데 관련된 현지 법률을 인식해야 하며, 고용주 및 클라이언트의 지적 재산이 보호되도록 주의를 기울여야 합니다​​.
  • 컴퓨터 남용 (Computer Misuse):
    • 소프트웨어 엔지니어는 기술적 능력을 남용하여 다른 사람의 컴퓨터를 부정 사용해서는 안 됩니다. 컴퓨터 남용의 예로는 고용주의 기계에서 게임을 하는 것과 같은 비교적 사소한 행위에서부터 바이러스의 확산과 같은 매우 심각한 행위까지 다양합니다​​.

ACM/IEEE Code of Ethics

  1. 공공 (PUBLIC) – 소프트웨어 엔지니어는 공공의 이익과 일관되게 행동해야 합니다.
  2. 고객 및 고용주 (CLIENT AND EMPLOYER) – 소프트웨어 엔지니어는 고객과 고용주의 최선의 이익을 공공의 이익과 일치시켜 행동해야 합니다.
  3. 제품 (PRODUCT) – 소프트웨어 엔지니어는 제품과 관련된 변경 사항이 최고의 전문적 기준을 충족하도록 보장해야 합니다.
  4. 판단 (JUDGMENT) – 소프트웨어 엔지니어는 전문적 판단에 있어 독립성과 무결성을 유지해야 합니다.
  5. 관리 (MANAGEMENT) – 소프트웨어 엔지니어링 관리자는 윤리적 접근을 채택하고 촉진해야 합니다.
  6. 전문직 (PROFESSION) – 소프트웨어 엔지니어는 전문직의 무결성과 명성을 공공의 이익과 일치하게 증진해야 합니다.
  7. 동료 (COLLEAGUES) – 소프트웨어 엔지니어는 동료에게 공정하고 지원적이어야 합니다.
  8. 자기개발 (SELF) – 소프트웨어 엔지니어는 전문직 실천에 대한 평생 학습에 참여하고 윤리적 접근을 촉진해야 합니다​​.

윤리적 딜레마

  1. 고위 경영진의 정책에 원칙적으로 동의하지 않는 경우:
    • 예를 들어, 회사가 사용자의 사생활을 침해할 수 있는 기능을 개발하도록 요구할 때.
  2. 고용주가 윤리적으로 행동하지 않고 안전 관련 시스템을 테스트 없이 출시하는 경우:
    • 안전 관련 문제가 해결되지 않은 채로 제품이 시장에 출시될 때의 문제점과 관련이 있습니다.
  3. 군사 무기 시스템이나 핵 시스템 개발에 참여하는 경우:
    • 이러한 프로젝트에 참여함으로써 발생할 수 있는 도덕적, 윤리적 책임감의 충돌에 대한 고민입니다​​.

Leave a Comment