#softwareengineering # 소프트웨어 일반적인 사람들은 개발자라는 단어를 들었을 때 보통 소프트웨어 개발자를 떠올린다. 그런데 소프트웨어는 구체적으로 무엇일까? 소프트웨어에 대한 정의 중 하나를 살펴보자. > [!definition] > computer programs, procedures and possibly associated documentation and data pertaining to the operation of a computer system. (IEEE 828:2012) 이 정의에서는 세가지 요소가 중요하다. 컴퓨터 프로그램, 사용 및 운영을 위한 문서, 그리고 컴퓨터 시스템에 맞는 데이터다. ## 컴퓨터 프로그램 당연한 이야기지만, 소프트웨어가 소프트웨어이기 위해서는 사용자가 다루는 컴퓨터 프로그램이 반드시 필요하다. ## 사용 및 운영을 위한 문서 컴퓨터 프로그램 만큼이나 중요한 것이 바로 그 프로그램을 사용하고 운영하기 위한 문서다. 여기에는 프로그램을 사용하는 방법이나 유지 및 보수를 위한 운영 방법, 발생 가능한 오류와 그 대처법도 포함된다. 그 대처법이 담당자에게 이메일을 보내는 정도가 전부여도 말이다. ## 컴퓨터 시스템에 맞는 데이터 또하나 필수적인 요소는 프로그램이 사용할 데이터다. 예를 들어, Adobe PDF Reader 같은 프로그램은 PDF 포맷의 파일을 필요로 하고, 운영체제에 맞는 라이브러리도 필요하다. 이 외에도 글꼴, 그래픽, 데이터베이스 레코드 파일 등 실행되지 않기에 컴퓨터 프로그램이라고 할 수는 없으나 사용을 위해 반드시 필요한 데이터도 소프트웨어에 포함된다. **그렇다. 소프트웨어에는 실행되지 않는 녀석도 있다.** # 소프트웨어 공학 그렇다면 소프트웨어 공학이란 무엇일까? 소프트웨어는 앞서 설명했으니 이번에는 공학의 정의를 살펴보자. > [!definition] > Engineering is the systematic application of scientific knowledge in creating and building cost-effective solutions to practical problems in the service of mankind. (Software Engineering Institute, Carnegie Mellon University) 일반적인 공학은 비용 절감에 초점을 맞춘다. 과학적 지식을 효율적인 비용으로 문제를 해결하기 위해 체계적으로 응용하는 것이다. 이제 이것을 그대로 소프트웨어에 적용하면 소프트웨어 공학이 된다. 소프트웨어 공학의 정의는 아래와 같다. > [!definition] > Software engineering is that form of engineering that applies the principles of computer science and mathematics to achieving cost-effective solutions to software problems. (Software Engineering Institute, Carnegie Mellon University) 소프트웨어에 적용되는 과학은 컴퓨터과학이며 그 기반은 수학이기 때문에 수학도 같이 적용된다. 그리고 그 목적은 소프트웨어와 관련된 문제를 어떻게 하면 값싸게 해결할 수 있을지 궁리하는 것이다. 공학은 처음부터 끝까지 효율성이 가장 중요한 가치이며 소프트웨어 공학도 예외가 아니다. 그래서 **소프트웨어 공학이란, 컴퓨터과학과 수학의 지식을 체계적으로 적용해 소프트웨어와 관련된 문제를 효율적으로 해결하기 위한 학문이다.**