전공서적을 보면서 예전 학부 때의 기억을 떠올리며 웹상에 정리를 해보려 합니다.
서론
지구상의 모든 나라는 복잡한 컴퓨터 시스템에 의지하여 살아가고 있다. 국가의 기반구조와 시설은 컴퓨터 기반 시스템에 의존하며 대부분의 전자 제품은 컴퓨터와 제어 소프트웨어를 포함한다. 산업 생산과 분배는 회계 시스템처럼 완전히 전산화되어있다. 그러므로 비용대비 효과가 좋은 소프트웨어를 생산하고 유지하는 것은 국가 경제 및 세계 경제에 중요한 필수 요건이다.
소프트웨어 공학은 고품질의 소프트웨어를 개발하기 위해서 비용효율을 높이기 위한 공학 학문이다. 소프트웨어는 추상적이고 만질 수 없는 물건이다. 재료에 의해 제약을 받지 않으며 물리적 법칙이나 혹은 제조 공정에 영향을 받지 않는다. 어떤 면에서는 이러한 것이 소프트웨어의 잠재력에 대한 물리적 제약을 주지 않기 때문에 소프트웨어 공학을 단순화시킬 수도 있다. 그러나 이러한 자연적인 제약이 없다는 것은 소프트웨어가 그만큼 더 복잡해지고 이해하기 어려울 수도 있다는 것을 의미한다.
소프트공학(software engineering)의 개념은 '소프트웨어 위기'를 논의하기 위한 1968년의 학술 회의에서 처음으로 제안되었다. 이 소프트웨어 위기는 집적 회로를 이용한 새로운 컴퓨터 하드웨어의 도입으로부터 기인했다. 그러한 컴퓨터의 능력은 그 이전까지는 실현불가능한 컴퓨터 응용을 가능하도록 하였다. 그렇게 만들어진 소프트웨어는 과거의 소프트웨어 시스템보다 더 복잡하고 10배 이상 더 커졌다.
이러한 시스템을 만드는 데 비정형적인 소프트웨어 개발은 별로 도움이 되지 않는다는 것을 알게 되었다. 주요 프로젝트는 때로는 몇 년씩 늦어졌다. 소프트웨어 가격은 예상한 것보다 더 비쌌으며 신뢰할 수가 없었고 유지보수와 성능향상을 이룰 수가 없어 소프트웨어 개발은 위기에 빠졌다. 하드웨어 가격은 떨어지는 반면에, 소프트웨어 비용은 가파르게 올라갔다. 대형 소프트웨어 시스템이 갖고 있는 본연의 복잡성을 제어하기 위해서 새로운 기술과 방법이 필요하게 되었다.
이러한 기술은 소프트웨어 공학의 일부가 되었으며 지금도 널리 쓰이고 있다. 그러나 소프트웨어 생산 능력이 증가함에 따라 소프트웨어 시스템의 복잡도도 증가하게 되었다. 컴퓨터와 통신 시스템 그리고 복잡한 그래픽 사용자 인터페이스의 통합으로 인해 생긴 새로운 기술을 소프트웨어 엔지니어에게 요구하였다. 많은 회사가 아직도 소프트웨어 공학 기술을 효과적으로 적용하지 못하고 있기 때문에 너무 많은 프로젝트들이 아직도 신뢰할 수 없고, 지연되며, 비용이 예상보다 초과된 소프트웨어를 생산 하고 있다.
소프트웨어 공학은 1968년 이래로 많은 발전을 이루어 왔으며, 소프트웨어 공학의 개발은 소프트웨어를 눈에 띄게 향상시켰다. 우리는 소프트웨어 개발에 필요한 활동에 대하여 더 많이 이해하게 되었으며 소프트웨어 명세, 설계, 구현에 대한 효과적인 방법을 개발하였다. 새로운 표기법과 도구가 대형 소프트웨어를 생산하는 데 필요한 노력을 줄여주었다.
소프트웨어 공학에 '이상적인' 방법이 없다는 것을 우리는 알고 있다. 다양한 시스템과 조직이 있다는 것은 소프트웨어 개발에 다양한 방법이 필요하다는 것을 의미한다. 그러나 프로세스와 시스템 구성에 대한 기본적인 표기법은 모든 기술의 기초가 되며 소프트웨어 공학의 기본이다.
소프트웨어 엔지니어는 그들의 업적에 대해 긍지를 갖는다. 복잡한 소프트웨어가 없었다면 우주를 탐험할 수도 없었을 것이며, 인터넷과 현대 통신도 없었을 것이고, 모든 형태의 여행은 위험하고 비용이 많이 들 것이다. 소프트웨어 공학은 다양한 분야에 크게 기여를 해 왔으며 이 학문이 발전함에 따라 21세기에는 더 많은 공헌을 할 것이라고 확신한다.
소프트웨어 공학에 대해 자주 물어보는 질문
소프트웨어란 무엇인가??
많은 사람들은 컴퓨터 프로그램을 소프트웨어와 같은 것이라고 생각한다. 그러나 좀 더 넣음 의미의 정의를 정의를 하자면 소프트웨어는 단순한 프로그램일 뿐만 아니라 프로그램이 올바르게 작동하도록 하는 데 필요한 그와 관련된 모든 문서 및 설치 데이터를 의미한다. 소프트웨어 시스템은 여러 개의 프로그램과 그 프로그램을 설치하는 데 필요한 설치 파일, 시스템의 구조를 기술한 시스템 문서, 시스템 사용방법과 사용자가 제품의 최근 정보를 내려받지 위한 웹 사이트를 기술하는 사용자 문서를 포함한다.
소프트웨어 엔지니어는 소프트웨어 제품을 개발하는 데 관심이 있다. 소프트웨어 제품에는 두 가지 유형이 있다.
1. 일반적인 제품 : 어떤 개발 조직에 의해서 생산된 독립형의 제품으로서 그것을 사고 싶어하는 어떤 고객에게든지 판매할 수 있다. 이러한 유형의 제품은 데이터베이스, 문서 편집기, 프로젝트 관리 도구, 그래픽 패키지 등과 같은 PC용 소프트웨어를 포함한다.
2. 맞춤형 제품 : 특정한 고객을 위한 시스템으로서 소프트웨어 개발자는 특정 고객에 대한 소프트웨어를 개발한다. 이러한 유형의 소프트웨어는 전자 장치에 대한 제어 시스템이나 특정 비즈니스 프로세르를 지원하기 위한 시스템, 항공 관제 시스템을 포함한다.
이 두 가지 소프트웨어의 중요한 차이점은, 일반적인 제품은 그 소프트웨어를 개발하는 조직이 소프트웨어 명세화를 제어하지만, 고객용 제품은 그 소프트웨어를 구입하는 조직에 의해서 소프트웨어의 명세서가 개발되고 제어된다. 소프트웨어 개발자는 그 명세서에 따라서 일을 해야 한다.
그러나 이러한 제품의 차이에 대한 장벽이 허물어져 가고 있다. 더 많은 소프트웨어 회사가 일반적인 시스템으로 시작해서 특정 고객에 적합한 것으로 맞추어 가고 있다. SAP 시스템과 같은 전사적 자원 관리(ERP : Enterprise Resource Planning) 시스템이 이러한 기법의 가장 좋은 예이다. 복잡한 대규모 시스템을 비즈니스 규칙과 프로세스, 필요한 보고서에 관한 정보를 통합하여 한 회사에 적용하는 것이다
소프트웨어 공학이란 무엇인가?
소프트웨어 공학은 시스템 명세화의 초기 단계부터 시작하여 시스템을 사용하기 시작한 후부터 시스템을 유지보수하기까지 소프트웨어 생산의 모든 관점을 다루는 공학적인 학문이다. 이 정의에는 다음과 같은 중요한 두 가지 사항이 포함된다.
1. 공학적 원리 : 엔지니어는 일이 되도록 한다. 그들은 적당하다고 생각되는 이론, 방법, 도구 등을 적용한다. 그러나 이것들을 선택적으로 적용하고 문제에 적합한 방법과 이론이 없을지라도 문제에 대한 해결을 찾으려고 노력한다. 엔지니어는 조직상의 제약 조건과 재정적인 측면의 제약 조건에 따라서 일해야 한다는 것을 인식하고 있기 때문에 이러한 제약 조건 내에게 해결책을 찾는다.
2. 소프트웨어 생산의 모든 측면 : 소프트웨어 공학은 단지 소프트웨어 개발의 기술적 프로세스뿐만 아니라 소프트웨어 프로젝트 관리와 같은 활동 그리고 소프트웨어 생산 지원에 필요한 도구, 방법, 이론의 개발과 같은 활동을 포함한다.
일반적으로 소프트웨어 엔지니어는 자신의 작업에 체계적이고 조직적인 방법을 채택하는데, 대개 이것은 고품질의 소프트웨어를 생산하는 가장 효율적인 방법이다. 그러나 공학은 주어진 환경 내에서 가장 적절하고 더욱 독창적인 비형식적 개발 방법이 어떤 환경에 효과적인지를 찾아내는 것이 전부이다. 비정형적인 개발은 소프트웨어와 그래픽 설계 기술의 혼합을 요구하는 웹 기반 시스템의 개발에 대해 특히 적합하다.
소프트웨어 공학과 컴퓨터 과학의 차이점은 무엇인가?
기본적으로 컴퓨터 과학은 컴퓨터와 소프트웨어 시스템이 갖고 있는 이론과 방법을 다루지만, 소프트웨어 공학은 소프트웨어를 생산하는 실제적인 문제를 다룬다. 물리학이 전자 공학자에게 기본적인 것처럼, 컴퓨터 과학의 지식은 소프트웨어 엔지니어에게도 기본이다.
이상적으로는 소프트웨어 공학의 모든 것이 컴퓨터 과학의 이론에 의해 토대가 마련되어야 하지만 실제로는 그렇지 않다. 소프트웨어 엔지니어는 소프트웨어를 개발하는데 임시방편을 자주 사용한다. 컴퓨터 과학의 정연한 이론이 소프트웨어 제품에 필요한 복잡하고 실제적인 문제에 늘 적용될 수는 없는 것이다.
소프트웨어 공학과 시스템 공학의 차이점은 무엇인가?
시스템 공학은 소프트웨어가 중요한 역할을 하는 복잡한 시스템의 개발과 진화의 모든 관점을 다룬다. 그러므로 시스템 공학은 소프트웨어 공학과 마찬가지로 하드웨어 개발, 정책, 프로세스 설계, 시스템 설치 등을 다룬다. 시스템 엔지니어는 시스템을 분석하고 전체 구조를 정의하며 최종 시스템을 만들기 위해서 서로 다른 부분을 통합하는 것을 포함한다. 그것은 하드웨어, 소프트웨어 등의 시스템 컴포넌트 공학과는 거리가 있다.
시스템 공학은 소프트웨어 공학보다 더 오래된 학문이다. 비행기와 하학 공장 설비와 같은 복잡한 산업 시스템은 백 년 전부터 만들어 왔다. 그러나 시스템에서 소프트웨어의 비율이 증가함에 따라 유스케이스 모델링, 형상 관리와 같은 소프트웨어 공학 기술이 시스템 공학 프로세스에서도 사용되고 있다.
소프트웨어 프로세스란 무엇인가?
소프트웨어 프로세스는 소프트웨어 제품을 생산하는 활동 및 그와 관련된 결과의 집합이다. 모든 소프트웨어 프로세스에는 공통적인 네 가지 기본적인 프로세스 활동이 포함된다.
1. 소프트웨어 명세화(specification) 는 고객과 엔지니어가 생산될 소프트웨어를 정의하고 운영 시의 제약을 정의한다.
2. 소프트웨어 개발(development) 은 소프트웨어를 설계하고 프로그램하는 단계이다.
3. 소프트웨어 검증(validation) 은 소프트웨어가 고객이 요구하는 것인지를 보장하도록 점검한다.
4. 소프트웨어 진화(evolution) 는 고객과 시장의 요구에 맞게 소프트웨어를 변경하는 것이다.
상이한 시스템 유형마다 서로 다른 개발 프로세스가 필요하다. 예를 들어 비행기에서의 실시간 소프트웨어는 개발이 시작되기 전에 요구사항이 완전히 정해져야 하는 반면에, 전자상거래 시스템에서는 명세서와 프로그램이 한꺼번에 개발된다. 결과적으로 이런 일반적인 활동은 소프트웨어의 종류에 따라 다른 방법으로 구성될 수 있다. 하지만 부적절한 소프트웨어 프로세스의 사용은 개발될 소프트우에ㅓ 제품의 유용성이나 품질을 떨어뜨릴 수 있고 개발 비용을 증가시킬 수 있다.
'공부 > 소프트웨어공학' 카테고리의 다른 글
[소프트웨어공학] 사회-기술적 시스템3 (시스템 통합에서 폐기까지) (0) | 2023.07.20 |
---|---|
[소프트웨어공학] 사회-기술적 시스템2 (시스템공학) (0) | 2023.07.19 |
[소프트웨어공학] 사회-기술적 시스템1 (창발성) (0) | 2023.07.18 |
[소프트웨어공학] 서론3 (소프트웨어 엔지니어의 책임) (0) | 2023.07.16 |
[소프트웨어공학] 서론2 (소프트웨어 프로세스 모델과 소프트웨어 공학) (0) | 2023.07.15 |