본문 바로가기
Software Engineering/소프트웨어 공학

소프트웨어 공학 소개

by 부뚜기 2023. 2. 25.
반응형

소프트웨어 공학 소개

소프트웨어는 원하는 기능을 제공하는 명령어를 포함하는 프로그램 또는 프로그램 집합이다. 그리고 공학은 특정한 목적에 도움이 되고 문제에 대한 비용 효율적인 해결책을 찾는 것을 설계하고 구축하는 과정이다.

소프트웨어 공학은 소프트웨어를 설계, 개발, 테스트, 유지보수하는 과정이다. 고품질, 신뢰할 수 있고 유지 관리 가능한 소프트웨어를 만드는 것을 목표로 하는 소프트웨어 개발에 대한 체계적이고 훈련된 접근 방식이다. 소프트웨어 공학은 요구사항 분석, 설계, 테스트 및 유지보수를 포함한 다양한 기술, 도구 및 방법론을 포함한다.

728x90

소프트웨어 공학의 몇 가지 주요 원칙

1. 모듈화(Modularity)

   - 소프트웨어를 개별적으로 개발하고 테스트할 수 있는 더 작고 재사용 가능한 구성요소로 분할

2. 추상화(Abstraction)

   - 구성 요소의 구현 세부 정보를 숨기고 필요한 기능만 소프트웨어의 다른 부분에 노출

3. 캡슐화(Encapsulation)

   - 개체의 데이터와 기능을 단일 단위로 정리하고, 외부 수정으로부터 개체의 내부 상태를 보호

4. 재사용성(Reusability)

   - 여러 프로젝트에서 사용할 수 있는 구성 요소를 생성하여 시간과 리소스를 절약

5. 유지관리(Maintenance)

   - 소프트웨어를 정기적으로 업데이트 및 개선해 버그 수정, 새로운 기능을 추가하며, 보안 취약성을 해결

6. 테스트(Testing)

   - 소프트웨어가 요구 사항을 충족하고 버그가 없는지 확인

7. 설계 패턴(Design Patterns)

   - 소프트웨어 설계에서 반복되는 문제를 해결하기 위한 템플릿을 제공하여 해결

8. 애자일 방법(Agile methodologies)

   - 고객 만족도, 신속한 제공 및 유연성에 초점을 맞춘 반복적이고 점진적인 개발 프로세스 사용

9. 지속적인 통합 및 배포(Continuous Integration & Deployment)

   - 코드 변경사항을 지속적으로 통합하고 운영 환경에 배포

 

소프트웨어 공학은 빠르게 발전하는 분야이며 소프트웨어 개발 프로세스를 개선하기 위해 새로운 도구와 기술이 지속적으로 개발되고 있다. 소프트웨어 개발자는 소프트웨어 엔지니어링의 원칙을 따르고 적절한 도구와 방법론을 사용하여 사용자의 요구를 충족하는 고품질, 신뢰성 및 유지 관리 가능한 소프트웨어를 만들 수 있다.

 

소프트웨어 엔지니어링은 주로 단일 프로그램이나 응용 프로그램보다는 소프트웨어 시스템을 기반으로 하는 대규모 프로젝트에 사용된다. 소프트웨어 엔지니어링의 주요 목표는 품질, 예산 및 시간 효율성을 개선하기 위한 소프트웨어 응용 프로그램을 개발하는 것이다. 소프트웨어 엔지니어링은 빌드해야 하는 소프트웨어가 예산에 맞게, 제때, 그리고 필요한 요구사항 내에서 일관성 있고 정확해야 한다는 것을 보장한다.

 

소프트웨어 엔지니어링의 4가지 주요 속성이 있다.

  •    효율성 (Efficiency)
  •    신뢰성 (Reliability)
  •    강건성 (Robustness) 
  •    유지보수성 (Maintainability)

소프트웨어 엔지니어링(Software Engineering)은 소프트웨어 시스템의 설계, 개발, 운영 및 유지보수에 대한 체계적이고 정량화 가능한 접근 방식이다.

 

소프트웨어의 이중 역할 

1. 제품으로서

  • 하드웨어 네트워크를 통해 컴퓨팅 잠재력을 제공한다.
  • 이를 통해 하드웨어가 기대되는 기능을 제공할 수 있다.
  • 정보를 생성, 관리, 취득, 수정, 표시 또는 전송하기 때문에 정보 변환기 역할을 한다.

2. 기능을 제공하기 위한 수단으로써

  • 시스템 기능을 제공한다.(예: 급여 시스템)
  • 다른 소프트웨어를 제어한다.(예: 운영 체제)
  • 다른 소프트웨어를 구축하는 데 도움이 된다.(예: 소프트웨어 개발 도구)

 

소프트웨어 엔지니어링의 목표

1. 유지보수성(Maintainability) 
   - 소프트웨어가 변화하는 요구사항을 충족하도록 진화하는 것이 가능해야 한다.

2. 효율성(Efficiency) 
   - 소프트웨어는 메모리, 프로세서 사이클 등과 같은 컴퓨팅 장비를 비효율적으로 사용해서는 안 된다.

3. 정확성(Correctness)
   - SRS(Software Requirement Specification) 문서에 지정된 다양한 요구 사항이 올바르게 구현된 경우 소프
트웨어 제품이 정확히 구현된 것이다.

4. 재사용성(Reusability)
   - 소프트웨어 제품은 제품의 다양한 모듈을 쉽게 재사용하여 새로운 제품을 개발할 수 있다면 재사용 가능
성이 높다.

5. 테스트 가능성(Testability)
   - 소프트웨어는 시험 기준의 확립과 해당 기준에 대한 소프트웨어의 평가를 모두 용이하게 한다.

6. 신뢰성(Reliability)
   - 소프트웨어 품질의 속성으로. 임의의 기간 동안 프로그램이 원하는 기능을 수행할 것으로 예상이 가능해야 한다. 

7. 이식성(Portability)
   - 소프트웨어는 한 컴퓨터 시스템 또는 환경에서 다른 환경으로 이식이 용이 해한 한다.

8. 적응성(Adaptability)
   - 소프트웨어는 다양한 시스템 제약 조건을 허용하며 사용자는 소프트웨어를 변경하여 만족해야 한다.

9. 상호운용성

   - 2 이상의 개체가 어떤 기능을 수행할 때, 개체들이 함께 그 기능을 올바르게 수행되어야 한다.

 

프로그램 대 소프트웨어

1. 프로그램은 특정한 작업을 달성하기 위해 컴퓨터에 제공되는 명령어의 집합인 반면에 소프트웨어는 프로그램이 상업적인 비즈니스에 이용 가능하고 라이선스와 함께 적절하게 문서화되어있다.

   소프트웨어 = 프로그램 + 문서 + 라이선스.

2. 프로그램은 소프트웨어 개발과 관련된 단계 중 하나인 반면 소프트웨어 개발은 ​​일반적으로 프로젝트의 타당성 조사, 요구 사항 수집, 프로토타입 개발, 시스템 설계, 코딩 및 테스트를 포함하는 수명 주기(SDLC)를 따른다.

 

장점

소프트웨어 개발에 체계적이고 규율 있는 접근법을 사용하면 다음과 같은 몇 가지 장점이 있다.

 

1. 향상된 품질

   - 확립된 소프트웨어 엔지니어링 원칙과 기술을 따름으로써, 더 적은 버그와 더 높은 신뢰성으로 소프트웨어를 개발할 수 있다.

2. 생산성 향상

   - 최신 도구와 방법론을 사용하면 개발 프로세스를 간소화하여 개발자의 생산성을 높이고 프로젝트를 더 빨리 완료할 수 있다.

3. 유지보수성 향상

   - 소프트웨어 엔지니어링 기법을 준수하여 설계 및 개발된 소프트웨어는 시간이 지남에 따라 유지보수 및 업데이트하기가 더 쉽다.

4. 비용 절감

   - 소프트웨어 엔지니어링은 개발 프로세스 초기에 잠재적인 문제를 식별하고 해결함으로써 버그를 수정하고 나중에 새로운 기능을 추가하는 비용을 줄이는 데 도움이 될 수 있다.

5. 고객 만족도 향상

   - 소프트웨어 엔지니어링은 고객을 개발 프로세스에 참여시키고 고객의 요구를 충족시키는 소프트웨어를 개발함으로써 고객 만족도를 높이는 데 도움이 될 수 있다.

6. 팀 협업 개선

   - 소프트웨어 엔지니어링은 Agile 방법론과 지속적인 통합을 사용하여 개발 팀 간의 협업을 개선할 수 있다.

7. 확장성 향상

   - 소프트웨어 엔지니어링은 확장성을 염두에 두고 소프트웨어를 설계함으로써 소프트웨어가 증가하는 사용자와 트랜잭션을 처리할 수 있도록 보장할 수 있다.

8. 보안 강화

   - 소프트웨어 엔지니어링은 소프트웨어 개발 수명 주기(SDLC)를 따르고 보안 테스트를 수행함으로써 보안 침해를 방지하고 중요한 데이터를 보호하는 데 도움이 될 수 있다.

 

단점

소프트웨어 공학은 많은 이점을 제공하지만, 고려해야 할 몇 가지 잠재적인 단점도 있다.

 

1. 높은 초기 비용

   - 소프트웨어 개발에 대한 체계적이고 규율 있는 접근 방식을 구현하는 것은 자원 집약적일 수 있으며 도구와 교육에 상당한 투자가 필요하다.

2. 제한된 유연성

   - 확립된 소프트웨어 엔지니어링 원칙과 방법론을 따르는 것은 유연하지 않을 수 있으며 변화하는 요구사항에 신속하게 적응하는 능력을 제한할 수 있다.

3. 관료주의

   - 소프트웨어 공학은 많은 프로세스와 서류 작업으로 관료적인 환경을 만들 수 있으며, 이는 개발 과정을 지연시킬 수 있다.

4. 복잡성

   - 도구와 방법론의 수가 증가함에 따라 소프트웨어 엔지니어링은 복잡하고 적용하기 어려울 수 있다.

5. 제한된 창의성

   - 구조와 프로세스에 대해 집중하는 것은 개발자들 사이의 창의성과 혁신을 제한할 수 있다.

6. 높은 학습 곡선(learning curve)

   - 개발 과정이 복잡할 수 있고, 많은 학습과 훈련이 필요해 신규 개발자에게 어려움이 될 수 있다.

7. 높은 도구 의존도 

   - 소프트웨어 엔지니어링은 도구에 크게 의존하며, 도구가 제대로 구성되지 않았거나 소프트웨어와 호환되지 않을 경우 문제가 발생할 수 있다.

8. 높은 유지보수

   - 소프트웨어 엔지니어링 프로세스는 소프트웨어가 효율적으로 실행되도록 정기적인 유지보수가 필요하며, 이는 비용과 시간이 많이 소요될 수 있다.

 

요약하면, 소프트웨어 공학은 비용이 많이 들고 시간이 많이 소요될 수 있으며, 유연성과 창의성을 제한할 수 있다. 그러나 향상된 품질, 향상된 생산성 및 더 나은 유지보수성의 이점은 비용과 복잡성을 능가할 수 있다. 소프트웨어 엔지니어링 사용의 장단점을 따져보고 특정 소프트웨어 프로젝트에 적합한 접근 방식인지 판단하는 것이 중요하다.

반응형

'Software Engineering > 소프트웨어 공학' 카테고리의 다른 글

소프트웨어 분류  (0) 2023.02.25

댓글