5 분 소요




전문적 소프트웨어 개발


소프트웨어 공학은 개별적 프로그래밍보다는 전문적 소프트웨어 개발 지원을 고려한 것이다. 소프트웨어 공학은 프로그램 명세, 설계와 진화를 지원하는 기법들을 포함하고 있으며, 이 모두는 일반적으로 개인 소프트웨어 개발과는 관련이 없다.



소프트웨어 제품의 유형


다른 사람들이나 엔지니어가 사용하거나 변경할 소프트웨어를 작성한다면, 대부분의 경우 프로그램 코드뿐 아니라 추가적인 정보가 필요하다. 소프트웨어 엔지니어는 소프트웨어 제품, 즉 고객에게 판매할 소프트웨어에 관심이 있다. 소프트웨어 제품에는 다음과 같은 두 가지 유형이 있다.

  1. 일반(generic) 제품
    특정 개발 조직이 생산한 독립형 시스템이며, 어떠한 고객이든 원하면 살 수 있도록 판매하는 제품이다.(데이터베이스, 문서 편집기)

  2. 맞춤식(customized, bespoke) 소프트웨어 제품
    특정 고객을 위해 해당 고객에게 맞추어 개발하는 시스템이다.(전자기기 제어 시스템, 항공 관제 시스템) 이 두가지 소프트웨어 유형의 중요한 차이는, 일반 제품은 그 소프트웨어를 개발하는 조직이 소프트웨어 명세를 관리한다는 점이다. 맞춤식 제품의 경우 소프트웨어를 구매하는 조직이 소프트웨어 명세를 개발하고 관리한다. 소프트웨어 개발자는 그 명세에 맞추어 일을 해야 한다.


좋은 소프트웨어의 필수적인 특성


수용성

  • 소프트웨어는 설계한 목적에 부합하는 사용자 유형이 수용할 수 있어야 한다. 즉 사용자가 이해할 수도 있고, 사용하기 쉬우며, 다른 시스템과 호환도 되어야 한다.

확실성과 보안성

  • 소프트웨어 확실성은 신뢰성, 보안성과 안전성을 포함하는 여러 특성을 내포한다. 확실성을 보장하는 소프트웨어는 시스템 장애가 발생해도 물리적이나 경제적인 피해를 야기해서는 안 된다. 또한 소프트웨어 보안을 통해 악의적인 사용자가 시스템에 접근하거나 피해를 주지 않도록 해야 한다.

효율성

  • 소프트웨어는 메모리와 프로세서 사이클과 같은 시스템 자원을 낭비해서 사용하면 안된다. 따라서 효율성은 응답성, 처리시간등을 포함한다.

유지보수성

  • 소프트웨어는 고객의 변화하는 요구를 충족시킬 수 있도록 진화하도록 만들어야 한다. 소프트웨어 변경은 변화하는 비즈니스 환경에서 필수적인 요구이기 때문에 매우 중요하다.




소프트웨어 공학

소프트웨어 공학은 시스템 명세화의 초기 단계부터 시스템 사용 시점 이후에 발생하는 시스템 유지보수에 이르기까지 소프트웨어 개발의 모든 관점을 다루는 공학적 학문 분야이다. 이 정의는 다음과 같은 중요한 두 가지 사항을 포함한다.

공학적 학문 분야

  • 엔지니어는 일을 처리한다. 엔지니어는 적절한 이론, 방법, 도구를 적용하되, 선택적으로 사용하며 활용할 수 있는 이론과 방법이 없는 경우에도 문제해결을 위해 항상 노력한다. 엔지니어는 또한 조직적, 재정적 제약에 맞추어 일해야 한다는 것을 알고 있기 때문에 이러한 제약 내에서 해결책을 찾는다.

소프트웨어 제품화와 관련한 모든 측면

  • 소프트웨어 공학은 단지 소프트웨어 개발의 기술적 프로세스뿐 아니라 소프트웨어 프로젝트 관리와 소프트웨어 개발을 지원하기 위한 도구, 방법, 이론의 개발과 같은 활등을 포함한다.



소프트웨어 공학이 중요한 두 가지 이유


  1. 개인과 사회가 발전된 소프트웨어 시스템에 점점 더 많이 의존한다. 경제적이면서도 빠르게 안정적이고 신뢰할 수 있는 소프트웨어 시스템을 제품화해야 할 필요가 있다.

  2. 장기적으로는 전문적 소프트웨어 시스템 개발을 위해 개인 프로그래밍 프로젝트처럼 그냥 프로그램을 작성하는 것보다 소프트웨어 공학적 방법과 기법을 사용하는 것이 대부분 더 적은 비용이 든다. 소프트웨어 프로세스는 소프트웨어 제품을 만드는 데 필요한 일련의 활동들이다.




소프트웨어 프로세스

1. 소프트웨어 명세화(specification)

  • 고객과 엔지니어가 만들게 될 소프트웨어 및 동작 시 제약사항을 정의한다.

2. 소프트웨어 개발(development)

  • 소프트웨어를 설계하고 프로그래밍하는 것이다.

3. 소프트웨어 검증(validation)

  • 소프트웨어가 고객이 요구하는 것임을 보장하도록 확인한다.

4. 소프트웨어 진화(evolution)

  • 변화하는 고객과 시장의 요구를 반영해 소프트웨어를 수정한다.


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

  1. 이질성(heterogeneity)
    • 소프트웨어는 범용 목적의 컴퓨터상에서 뿐 아니라, 모바일이나 태블릿 제품에서 실행되기도 한다. 따라서 이질성을 극복할 수 있도록 충분히 유연하면서도 신뢰할 수 있는 소프트웨어를 구축하는 기법을 개발해야 한다.

  2. 비즈니스와 사회적 변화
    • 비즈니스와 사회는 빠르게 변화하고 있다. 고객에게 가치를 전달하는 소프트웨어를 더 빨리 개발하기 위해 소프트웨어 공학 기법을 개선할 필요가 있다.

  3. 보안과 신뢰
    • 우리는 소프트웨어를 신뢰할 수 있어야 한다. 웹을 통해 접근하는 시스템의 경우 더 신뢰성을 요구한다. 악의적인 사용자가 소프트웨어를 공격할 수 없도록 하고, 정보 보안이 유지되도록 해야 한다.

  4. 규묘(size)
    • 휴대가 가능한 작은 임베비드 시스템이나 웨어러블 기기로부터 인터넷 규모나 클라우드 기반 시스템에 이르기까지 다양한 규모의 소프트웨어를 개발해야 한다.


소프트웨어 공학의 다양성

애플리케이션의 유형

  1. 독립형 애플리케이션 : 네트워크 연결이 불필요한 경우도 있다.

  2. 대화형 트랜잭션 기반 애플리케이션 : 원격 컴퓨터상에서 실행하는 애플리케이션

  3. 임베디드 제어 시스템 : 하드웨어 기기를 제어하고 관리하는 소프트웨어 제어 시스템

  4. 일괄처리 시스템 : 대규모로 데이터를 처리하도록 설계한 비즈니스 시스템

  5. 오락 시스템 : 사용자가 즐기기 위해 개인적으로 사용하는 시스템

  6. 모델링 및 모의실험 시스템 : 물리적 진행이나 상황을 모델링하기 위해 개발한 시스템

  7. 데이터 수집 및 분석 시스템 : 데이터를 수집하여 다른 시스템으로 전달

  8. 복합시스템(SoS : systems of systems) : 기업 및 다양한 대규모 조직에서 사용하며 여러 다른 소프트웨어 시스템으로 구성되어 있다.

소프트웨어 공학의 기본 사항

대화식 웹 기반 시스템이나 앱에는 재사용 컴포넌트를 조합한 시스템을 가지고 반복적으로 개발하고 인도하는 것이 가장 좋은 접근법이다. 하지만 이 접근법은 각각의 시스템을 독립적으로 개발할 수 있도록 미리 시스템 상호 작용에 대해 상세히 작성해야 하는 복합시스템에는 적합하지 않다.

그럼에도 모든 유형의 소프트웨어 시스템에 적용가능한 소프트웨어 공학의 기본 사항이 있다.

  1. 관리되고 이해되는 개발 프로세스를 따라 소프트웨어를 개발해야 한다.
  • 소프트웨어를 개발하는 조직은 개발 프로세스를 계획하고 무엇을 만들 것인지와 언제 완성할 것인지에 대해 명확히 알고 있어야 한다.

  1. 모든 유형의 시스템에서 확실성과 성능은 중요하다.
    • 소프트웨어는 장애없이 의도한대로 동작해야 하며, 필요할 때 사용 가능해야 한다. 동작 중에는 안전해야 하며, 외부의 공격으로부터 가능한 보안이 보장되어야 한다.

  2. 소프트웨어 명세 및 요구사항을 이해하고 관리하는 것은 중요하다
    • 시스템의 다양한 고객과 사용자가 시스템으로부터 무엇을 바라는지를 파악해야 하고, 그러한 기대 사항을 관리함으로써 유용한 시스템을 예산과 일정 안에서 잘 공급할 수 있어야 한다.

  3. 기존의 자원을 효과적으로 활용해야 한다.
    • 다시 말해 적절한 경우에는 새롭게 소프트웨어를 만들지 않고 이미 개발되어 있는 소프트웨어를 재사용해야 한다.


인터넷 소프트웨어 공학

웹은 이제 애플리케이션을 실행하기 위한 플랫폼이며 조직은 점점 더 로컬 시스템이 아닌 웹 기반 시스템을 개발하고 있다. 점점 더 많은 소프트웨어가 로컬 서버 대신 원격 “클라우드”상에서 실행되고 인터넷을 통해 접근할 수 있다. 컴퓨팅 클라우드는 응용 프로그램이 ‘클라우드’에서 원격으로 실행되는 컴퓨터 서비스 제공에 대한 접근 방식이다.

소프트웨어 재사용

  • 웹 기반 시스템을 구축할 때는 주로 소프트웨어 재사용 접근법을 사용하게 되었다. 이러한 시스템을 개발할 때는 주로 프래임워크에서 번들 형태로 함께 제공되는 기존의 소프트웨어 컴포넌트와 시스템을 어떻게 조합할 수 있을지를 생각해야 한다.

점진적이고 민첩한(agile) 개발

  • 웹 기반 시스템에 대한 모든 요구사항을 미리 명세하기는 비현실적이라는 것이 일반적 통설이다. 웹 기반 시스템은 항상 점증적으로 개발하고 인도해야 한다.

서비스 지향 시스템

  • 소프트웨어 컴포넌트가 독립적인 웹 서비스인 서비스 지향 소프트웨어 공학을 사용하여 소프트웨어를 구현할 수 있다. 소프트웨어 공학에 대한 이 접근법을 추후에 다룬다.

풍부한 인터페이스

  • AJAX와 HTML5와 같은 인터페이스 개발 기법이 등장해 웹 브라우저에서도 다채로운 인터페이스를 만들 수 있게 되었다.


소프트웨어 공학 윤리

다른 공학 분야와 마찬가지로, 소프트웨어 공학은 엔지니어의 자유를 제한하는 사회적, 법적 틀 안에서 수행된다. 단지 기술적 능력을 사용하는 것보다 훨씬 많은 책임이 있음을 알아야 한다.

  1. 비밀유지
    • 엔지니어는 공식적인 비밀 유지에 관한 협약을 맺지 않았더라도 고용주나 고객의 비밀을 유지해야 한다.

  2. 능력
    • 엔지니어는 자기의 능력 수준을 왜곡해서는 안된다. 즉, 자신의 능력 밖의 일을 알면서도 맏아서는 안된다.

  3. 지적 재산권
    • 엔지니어는 특히나 저작권과 같은 지적 재산 사용을 관장하는 법규를 잘 알고 있어야 한다.

  4. 컴퓨터 남용
    • 컴퓨터 남용을 목적으로 자기의 기술적 능력을 사용해서는 안된다.

키포인트

image

댓글남기기