프로그램 아키텍쳐/소프트웨어공학

소프트웨어의 정의

본클라쓰 2011. 11. 8. 09:22

소프트웨어(Software)란 협의로는 '프로그램 자체'를 의미하고, 광의로는 '프로그램과 프로그램의 개발, 운용, 보수에 필요한 정보 일체'를 뜻합니다.

 

소프트웨어의 특징은 다음과 같습니다.

 

1) 비가시성(Invisibility): 소프트웨어 구조는 출력 결과를 봐도 구 구조를 파악할 수 없고, 프로그래밍 언어로 작성된 내부 코드와 입

    출력 양식에 의존한다.

2) 복잡성(Complexity): 소프트웨어는 어떤 이론과 규칙에 의해서 개발되는 정형적인 구조가 없으며 개발 과정이 다양하고 응용 되는

    상황이 복잡하다.

3) 변경 가능성(Changeability): 사용자의 요구나 오류 발생 또는 상황의 변화에 따라 적절하게 수정 또는 변경시킬 수 있다. 

4) 복제성(Duplicability): 적은 비용으로 또는 무료로 무수히 많이 복제할 수 있다. 

 

 

프로그램은 형식 언어로 표현된 지적 노동의 결과물이며, 소프트웨어는 프로그램의 동적인 실체를 말합니다. 이러한 소프트웨어는 논리적인 요소로 구성되어 있어 실행 전까지는 결과물을 확인할 수 없고, 유지보수가 어렵습니다. 소프트웨어 시스템은 독립적으로 존재하는 것이 아니라 컴퓨터를 기반으로 여러 시스템이 유기적인 관계를 맺고 있어 시너지 효과를 가지고 있으며, 상충되는 요구와 이해 관계의 절충안입니다. "소프트웨어는 닳아 없어지는 것이 아니라 소용없어 못 쓰게 되는 것이다."

 

 

 

소프트웨어 분류

 

1) 기능에 따라: 응용 소프트웨어, 시스템 소프트웨어

2) 개발 과정에 따라: 프로토타입(시제품), 패키지(상품화된 소프트웨어), 주문형 소프트웨어

 

기능에 따라 응용 소프트웨어, 시스템 소프트웨어로 구분할 수 있는데, 좀 더 세부적으로는 제어 시스템, 정보 시스템 등으로 구분할 수 있습니다. 제어 시스템은 사건을 감지하여 처리하고 자동적으로 보고하는 시스템으로 일반적인 제어 기기의 상태를 보고하고 센서의 감지 등을 처리합니다. 제어 시스템의 예는 교통제어, 고정제어, 수치제어, 의료 시스템 등을 들 수 있습니다. 정보 시스템은 항공권 예약 시스템, 뱅킹 시스템처럼 자료의 분류, 저장, 검색에 초점을 맞춘 시스템입니다. 데이터베이스를 대화식으로 접근하여 조직의 문제를 해결하기 위한 시스템입니다.

 

개발과정에 따라 분류하면 프로토타입, 패키지, 주문형 소프트웨어로 구분할 수 있습니다. 프로토타입은 프로그램이 완성되기 전에 사용자의 요구사항을 면밀히 파악하기 위해 표본으로 만들어 사용자들에게 제시하는 예비적 결과물입니다. 패키지는 다수의 사용자들에게 보급할 목적으로 개발하여 상품화한 소프트웨어이고, 주문형 소프트웨어는 사용자가 특정 용도를 사용하기 위해 주문하여 개발된 소프트웨어를 말합니다.

 

 

 

소프트웨어의 위기(Crisis)

 

소프트웨어의 위기는 컴퓨터의 발달 과정에서 소프트웨어의 개발 속도가 하드웨어의 개발 속도를 따라가지 못해, 사용자들의 요구사항을 감당할 수 없는 문제가 발생함을 의미합니다. 요구와 공급의 능력 차이로 발생하는데, 소프트웨어 공정은 비용 초과, 기간 지연, 성능 저하, 신뢰성 저하, 유지보수 불가능, 엄청난 유지보수 비용 등의 기본적인 문제점들을 가지고 있습니다.

 

일반적으로 소프트웨어를 개발할 때는 개발 예산이 초과되고, 일정이 지연되는 경우가 많습니다. 원인은 개발 일정과 비용 예측이 부정확하고, 과거 프로젝트에 대한 경험이 잘 축적되지 않을 뿐 아니라, 과거 데이터가 현재에 잘 적용되지 않는 경우가 많기 때문입니다.

 

또한, 프로그래머 개인 역량에 따라 소프트웨어 개발 성패가 좌우됩니다. "잘 키운 슈퍼 프로그래머 하나가 열 안 부럽다." 말처럼 프로그래머의 개인의 능력과 경험이 중요하며, 작업의 정략 분석이 어렵습니다. 또한, 소프트웨어의 품질을 평가하기가 어렵습니다. 쳬계적인 시험이 없으면 운영 중에 많은 오류가 발생합니다. 다른 공산품과 같이 불량품 관리, 품질 보증에 대한 확실한 정량적 개념이 없기 때문입니다.

 

 

 

소프트웨어의 유지 보수

 

유지보수는 소프트웨어 시스템이 사용자들이 원하는 곳에 인수되고 설치된 후에 일어나는 모든 변경 과정입니다. 유지보수는 오류를 수정하는 수정형 유지보수, 오류가 없더라도 소프트웨어와 관련된 환경적 변화에 적응하도록 소프트웨어를 재종하는 적응형 유지보수, 소프트웨어의 성능을 향상시키기 위해 소프트웨어를 개선하는 완전형 유지봇, 앞으로 발생할 수 있는 변경 가능성을 수용하거나 개발 과정에서 생각 못했던 기능을 추가하기 위해 소프트웨어의 여러 조건들을 수용할 수 있도록 소프트웨어의 구조를 개선하는 등 미리 대비하는 예방형 유지보수가 있습니다.

 

소프트웨어 유지보수는 에러가 발생되 수정하는 유지보수는 지양되어야 합니다. 프로그램을 작성하기 전에 충분한 시간을 프로그램 검토에 투자해 오류가 없는 코드를 작성하는 것이 좋습니다.

 

"컴퓨터가 이해할 수 있는 코드는 누구나 다 짤 수 있다. 하지만 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다."