소프트웨어 공학의 핵심은 소프트웨어와 시스템입니다. 이 두 개념을 통해 우리는 컴퓨터 세계의 복잡한 구조와 기능을 이해할 수 있습니다. 이 글에서는 소프트웨어와 시스템의 기본적인 개념을 자세히 살펴보겠습니다.
소프트웨어(Software)
소프트웨어의 정의
소프트웨어는 프로그램 및 그 개발, 운영, 유지 보수에 필요한 모든 관련 정보를 의미합니다. 이는 프로그램과 그와 연결된 모든 데이터를 포함한 개념으로 볼 수 있습니다. 프로그램 자체는 주로 프로그래밍 언어에 의해 구성된 코드로 표현되며, 고정된 형태를 가집니다. 그와 달리, 소프트웨어는 프로그램의 실행에 관한 동적인 측면까지 포함하게 됩니다. 소프트웨어가 프로그램 외의 문서와 정보를 포함하는 이유는, 그것들이 모두 소프트웨어 제작 과정의 일부로 생겨났기 때문입니다. 따라서, 프로그램은 고정된 코드로 표현되는 반면, 소프트웨어는 프로그램이 컴퓨터 상에서 작동하는 동적인 부분까지를 포괄합니다.
소프트웨어의 특성
투명성(Invisibility)
소프트웨어는 종종 종이나 자기 디스크 같은 물리적 매체에 저장되기도 하지만, 본질적으로는 무형적입니다. 건물이나 자동차와 같은 물리적인 대상은 그 형태를 직접 보고 구조를 이해할 수 있지만, 소프트웨어는 그 구조가 코드 내부에 숨겨져 있어 쉽게 파악하기 어렵습니다. 이를 '소프트웨어의 눈에 띄지 않는 특성'이라고 부를 수 있습니다.
복잡성(Complexity)
소프트웨어는 그 특성상 복잡성을 가지고 있습니다. 이 복잡성은 개발 과정뿐만 아니라, 전산화를 목표로 하는 업무 자체의 복잡성 및 소프트웨어 시스템 자체에서도 찾아볼 수 있습니다.
적응성(conformity)
또한 소프트웨어는 수학이나 물리학처럼 규칙적이고 정형화된 구조를 갖지 않기 때문에, 요구사항이나 환경이 바뀔 때마다 그에 맞게 유연하게 변경될 수 있습니다.
복제가능 및 영구성
소프트웨어는 저렴한 비용으로 쉽게 복제할 수 있는 장점이 있습니다. 또한, 언제든지 테스트하고 수정하는 것이 가능합니다. 하드웨어나 다른 제품들은 시간이 지나면서 물리적 마모로 인해 사용이 어려워질 수 있지만, 소프트웨어는 그렇게 마모되지 않습니다.
소프트웨어의 분류
소프트웨어는 그 기능에 따라 여러 가지로 분류될 수 있습니다. 주로 응용 소프트웨어와 시스템 소프트웨어로 나눠집니다.
응용 소프트웨어는 은행 업무나 주식 거래와 같은 대규모 데이터 처리나, 공장의 생산 라인을 제어하는 등 특정한 목적에 맞게 개발된 소프트웨어를 의미합니다.
컴퓨터 하드웨어의 운영을 위한 운영체제, 네트워크 관리, 데이터베이스 관리 시스템 등은 시스템 소프트웨어로 분류됩니다. 이것들은 사용자가 컴퓨터를 효과적으로 사용할 수 있도록 하드웨어를 관리하고, 성능을 최적화하는 데 도움을 줍니다.
소프트웨어는 개발 방식에 따라 프로토타이핑, 연구용 제품, 패키지 소프트웨어 등으로 분류됩니다. 프로토타이핑은 소프트웨어의 실현 가능성을 확인하고 사용자의 요구를 파악하기 위해 제작된 초기 버전을 의미합니다. 연구용 제품은 상업적으로 출시되기 전 연구 과정에서 만들어진 소프트웨어입니다. 패키지 소프트웨어는 많은 사용자를 대상으로 상업적으로 제작된 소프트웨어를 의미하며, 특정한 요구사항에 맞게 개발된 소프트웨어는 주문 제작 소프트웨어로 부릅니다.
소프트웨어는 실행되는 하드웨어 환경에 따라 대형(mainframe), 병렬 처리(parallel processing), 개인용, 그리고 워크스테이션 소프트웨어로 구분될 수 있습니다. 또한 운영 체제 환경에 따라 단일 사용자, 다중 사용자, 윈도우, 그리고 네트워크 환경 소프트웨어로 분류할 수 있습니다.
소프트웨어를 구분하는 가장 일반적인 방법은 사용 목적 또는 적용 분야입니다. 예컨대, 통신용, 프로그래밍 언어, 사용자 인터페이스, 문서 작성, 데이터베이스, 거래 처리, 분산 처리, 인공 지능, 멀티미디어, 그리고 소프트웨어 개발 도구 등, 소프트웨어의 활용 분야에 따라서 다양하게 구분될 수 있습니다.
소프트웨어의 품질
소프트웨어의 기능도 중요하지만, 그 품질은 더욱 중요합니다. 생산 라인, 항공기 및 중요한 데이터를 처리하는 정보 시스템과 같이 소프트웨어로 제어되는 경우에는, 해당 소프트웨어에 대한 신뢰성이 매우 중요하게 됩니다. 심지어 사용자의 작은 오류나 예기치 않은 사항이 발생해도 원래의 기능을 유지하며, 고장에 대한 허용(fault-tolerance)과 정보의 보안성을 유지해야 하고, 환경 변화 시에도 쉽게 수정할 수 있어야 합니다.
소프트웨어 품질을 결정하는 주요 요소는 그 안에 포함된 오류입니다. 상품으로 판매되는 소프트웨어를 평가할 때, 그 품질은 굉장히 중요한 평가 기준이 됩니다.
시스템(System)
시스템의 정의
소프트웨어는 독립적으로만 존재하는 것이 아닙니다. 그것은 컴퓨터를 기반으로 한 다양한 시스템과 깊은 연결을 가지고 있습니다.
예시로, 은행 업무 자동화에 쓰이는 소프트웨어는 현금 자동 인출기, 중앙 컴퓨터와 같은 하드웨어, 거래 계좌에 대한 원장 정보가 저장된 데이터베이스, 다양한 서류, 은행 업무 절차, 그리고 실제로 고객과 거래하는 은행원 등과 같은 여러 서브시스템과 연동되어 작동합니다.
이런 서브시스템 각각이 다른 서브시스템의 작용에 영향을 받으면서 상호 반응하고, 그러한 상호작용을 통해 하나의 통합된 큰 시스템을 구성하게 됩니다. 따라서 소프트웨어를 개발하는 과정에서는 이런 시스템 내의 다양한 요소들을 정확히 이해하고 그 사이의 관계를 설정하는 작업이 필요합니다.
한편, 소프트웨어 역시 상호작용하는 서브시스템들로 구성된 하나의 시스템입니다. 따라서 소프트웨어는 '시스템'이라는 관점에서 접근하고 관찰하는 것이 필요합니다.
시스템의 특성
시스템의 특성을 세 가지로 요약한다면, 첫째, 서브시스템들이 시너지(synergy) 효과를 가져온다는 것, 둘째, 매우 역동적인 환경 변화에 잘 적응한다는 점, 그리고 셋째, 시스템의 설계는 최적의 해답이 아닌 절충안이라는 것입니다.
전체 시스템의 기능과 성능이 잘 발휘되기 위해서는 시스템을 구성하는 서브시스템들이 올바르게 작동해야 합니다. 예를 들어, 운송 시스템을 생각해본다면, 차량이나 다른 교통수단, 도로 네트워크, 신호 제어 시스템 등의 서브시스템들이 원활하게 작동하여 사람이나 물건을 옮기는 것이 그 결과로 나타나는 시너지 효과를 낼 수 있습니다.
시스템은 역동적으로 발전하고 변화합니다. 기술 변화, 환경 변화, 기능적 요구사항의 변화 등으로 인해 시스템은 빠르게 적응하고 변화해야 합니다. 시스템이 이러한 변화에 잘 적응할 수 있어야 하며, 크고 복잡한 시스템일수록 이런 변화에 대응하기 위한 유지보수가 필요하게 됩니다.
시스템의 설계는 종종 상충되는 요구사항과 이해 관계 간의 절충을 필요로 합니다. 모든 요구를 완벽하게 만족시키는 최적의 시스템을 설계하는 것은 매우 어려운 일입니다.
마치며
결론적으로, 소프트웨어와 시스템은 그들만의 복잡성과 특징을 지니며, 이들 사이의 상호작용은 깊고 다양합니다. 모든 것이 서로 연결되어 있어, 한 부분의 변화가 전체 시스템에 영향을 미칠 수 있습니다. 이러한 복잡한 상호작용 속에서도, 소프트웨어와 시스템의 품질과 안정성은 결코 타협될 수 없는 부분입니다.
현대 사회에서 소프트웨어와 시스템은 기술의 중심을 차지하며 우리 일상의 큰 부분을 이루고 있습니다. 잘못 구현된 소프트웨어나 불안정한 시스템은 심각한 위험을 초래할 수 있기에 안전하고 효율적인 개발을 위한 공학적 접근 방식이 필요한데, 이것이 바로 소프트웨어 공학의 주요 목표입니다.
'컴퓨터공학' 카테고리의 다른 글
소프트웨어 공학 : 테스트 (0) | 2023.10.23 |
---|---|
소프트웨어 프로세스 모형 2 - 현대적인 소프트웨어 프로세스 모형 (0) | 2023.10.22 |
소프트웨어 프로세스 모형 1 - 전통적인 소프트웨어 프로세스 모형 (0) | 2023.10.22 |
컴퓨터의 역사 (History of Computer) - 계산기부터 인공지능까지 (1) | 2023.10.21 |
알고리즘: 버블 정렬 (Bubble Sort) (0) | 2023.10.17 |