Post

소프트웨어 엔지니어링이란?

소프트웨어 엔지니어링이란?

모던 소프트웨어 엔지니어링 책을 기반으로 정리한 내용입니다.

1장) 소프트웨어 공학의 정의

소프트웨어 공학이란?

정의: 소프트웨어 공학이란 소프트웨어의 현실적인 문제를 풀기 위해 효율적이고 경제적인 해법을 찾아나서는 경험적이고 과학적인 접근 방식의 응용

즉, 소프트웨어 개발에서 단순히 ‘코딩 기술’을 말하는 게 아니라, 소프트웨어를 ‘공학(Engineering)’적으로 바라보아야 한다고 얘기합니다.

또한 소프트웨어 개발에서 공학적인 접근이 필요한 이유로 소프트웨어란 계속해서 배우고, 발견하는 과정이기 때문에 “학습의 전문가”가 되어야할 뿐 아니라 새로운 지식을 적용하는 방식으로 시스템의 “복잡도를 관리하는 전문가”가 되어야 하기에 공학적인 접근이 필수적이라는 것을 어필합니다.

소프트웨어 공학에서의 학습을 위한 철학

책에서는 학습의 전문가가 되기 위해 아래와 같이 5가지의 철학이 필요하다고 얘기합니다.

  • 반복
  • 피드백
  • 점진주의
  • 실험
  • 경험주의

책에서는 소프트웨어가 작은 요소들이 모여서, 서로 상호작용하면서, 예측하기 어려운 큰 시스템이 되는 과정에서 복잡성이 창조되는 것을 얘기합니다.

따라서 이러한 복잡성이 증가하는 소프트웨어 개발 방식에서 복잡성을 안정적으로 제어하기 위해 “탐색과 실험”을 잘 지원해주는 위 5가지 철학과 같은 도구와 방법론이 중요하다는 것을 책은 어필하고 있습니다.

또한 소프트웨어 개발은 모르는 게 많은 상태에서 시작하는 경우가 대부분이기 때문에 완벽한 계획보다 배우고 실험하면서 전진할 수 있는 체계가 필요한다고 얘기합니다. (책은 뒤에서 이를 워터폴 방식과, 에자일 방식 2가지 관점으로 비교하니 참고)

소프트웨어 공학에서의 복잡성을 다루기 위한 개념

소프트웨어 개발에서는 복잡한 시스템을 단번에 설계할 수 없습니다. 따라서 문제의 본질을 파악하고, 우리가 풀 수 있는 문제로 나누어 복잡성을 관리하는 전문가가 되기 위해서 아래와 같은 개념이 필요합니다.

  • 모듈성: 시스템을 기능별로 적절히 나눈다
  • 응집성: 각 모듈은 하나의 목적에 집중하도록 설계한다
  • 관심사 분리: 역할과 책임을 명확히 구분해 복잡도를 줄인다
  • 추상화: 불필요한 세부사항을 감추고 중요한 것만 드러낸다
  • 느슨한 결합: 모듈 간 연결을 최소화해 유연성을 높인다

소프트웨어 개발을 주도하기 위한 실용적인 도구

위 학습, 전문성 측면에서의 10가지 개념 뿐 아니라 복잡성이 늘어나는 소프트웨어를 진화적으로 안전하게 만들어가는 구조를 위해서는 실용적 개발 도구를 함께 사용해야 합니다.

따라서 다음과 같은 도구들을 활용할 수 있습니다.

  • 테스트 가능성
  • 배포 가능성
  • 속도
  • 변수 통제
  • 지속적인 배포

이러한 여러가지 기법, 개념, 도구를 활용하여 우리는 고품질 소프트웨어를 더 효율적으로 개발할 수 있다는 것을 여러 데이터가 뒷받침 한다고 합니다.

정리

소프트웨어에서 공학은 관료주의를 부르는 규제가 아닌 고품질 소프트웨어를 더 지속 가능하고 안정적으로 만들기 위한 우리의의 역량을 향상하는 토대다.

This post is licensed under CC BY 4.0 by the author.