본문 바로가기

Clean Architecture

[클린아키텍쳐] 구조적 프로그래밍이란 무엇인가

반응형

구조적 프로그래밍

  • 프로그래머라는 직업조차 없던 시절, 진공관 시대
  • 데이크스트라(다익스트라)가 처음 인식한 문제
    → "프로그래밍은 어렵고, 프로그래머는 프로그래밍을 잘 하지 못한다."
  • 단순한 프로그램도 복잡한 세부사항을 담고 있고, 하나라도 간과하면 예상 외 방식으로 실패
  • 증명이라는 수학적 원리를 이용해 해결해보자!
    → 프로그래머가 입증된 구조를 이용하고, 이 구조를 코드와 결합시키며 코드가 올바르다는 사실을 스스로 증명하게 되는 방식


단순제어구조로써 증명

  • 1950 ~ 1960 년대에는 포트란이라는 언어를 사용했는데, 현재의 명령문과는 다르게,
    STOP문, GOTO문, PAUSE문, CONTINUE문, CALL문, DO문 등을 사용했다.
  • 이 중 GOTO문은 프로그램의 제어흐름을 제약 없이, 개발자가 직접 제어하는 문장이었는데,
  • 데이크스트라는 이러한 ==GOTO문이 모듈을 더 작은 단위로 재귀적으로 분해하는 과정에 방해가 되는 경우가 있다==는 사실을 발견하였다.
  • 모듈을 분해할 수 없게 되면 분할 정복 접근법으로 증명할 수도 없다.

  • 그는 단순한 알고리즘에 대한 증명을 작성할 수 있는 기법을 연구하면서,
    goto 문장 대신 분기(if/then/else)와 반복(do/while)의 단순한 제어 구조만을 사용함으로써
    재귀적으로 증명 가능한 모듈로 세분화할 수 있다는 사실을 발견했다.

순차 구문

  • 이러한 제어 구조는 데이크스트라보다 2년 앞서 뵙과 야스코피니가 발견했는데,
    모든 프로그램을 순차 sequence, 분기 selection, 반복 iteration이라는 세 가지 구조만으로 표현할 수 있다는 사실이 증명되었다.
  • 즉, 모듈을 증명 가능하게 하는 바로 그 제어 구조가 모든 프로그램을 만들 수 있는 제어 구조의 최소 집합과 동일
    → ==구조적 프로그래밍의 탄생==

증명 방법

  • 순차 구문: 단순한 열거법을 이용해 입력부터 출력까지 수학적으로 추적
  • 분기 selection: 분기를 통한 각 경로를 열거한 후 순차 구문과 같이 추적
  • 반복 iteration: 1의 경우가 올바름을 증명하고, N의 경우가 올바르다고 가정한 후 N+1의 경우도 증명하는 귀납법 사용

해로운 성명서

  • 다익스트라가 쓴 goto문의 해로움이라는 글로 인해 프로그래밍 세계는 불이 붙었다
  • 지금처럼 온라인으로 비난할수는 없었지만 반대하는 사람들은 많은 학술지 출판사의 편집자에게 편지를 보냈지만...
  • 결국은 다익스트라가 이겼다. goto문은 컴퓨터 언어의 진화에 따라 밀려났다.
  • 현재의 우리 모두는 모두 구조적 프로그래머이고, 언어에서 제어 흐름을 제약 없이 직접 전환할 수 있는 선택권을 주지 않기 때문에 여기에는 선택의 여지가 없다.
  • 비슷한 것(break 등)이 있긴 하지만 제약이 존재한다.

기능적 분해

  • 구조적 프로그래밍을 통해 모듈을 증명 가능한 더 작은 단위로 재귀적으로 분해할 수 있게 되었고, 이는 모듈을 기능적으로 분해할 수 있음을 의미
  • 이러한 기법을 사용하면 대규모 시스템도 모듈과 컴포넌트, 더 나아가 입증할 수 있는 작은 기능들로 세분화할 수 있다.

엄밀한 증명?

  • 다이크스트라가 원했던 증명은 수학에서 사용되는 유클리드 계층구조(엄밀한 증명)이지만,
    현재 소프트웨어를 개발하는 프로그래머가 고품질의 소프트웨어를 생산하기위해 채택한 증명 전략은 과학적 방법(Scientific method)이다.
유클리드 계층구조: 공리, 정리, 따름정리, 보조정리로 구성되는 정리의 계층 구조

과학적 증명?

  • 과학적 증명은 반증은 가능하지만 증명이 불가능한 것이다.
    서술된 내용이 사실임을 증명하는 방식이 아닌, 서술이 틀렸음을 증명하는 방식으로 동작한다.
  • ==즉, 증명 가능한 서술이 거짓임을 입증하는 원리==이다.
  • 이는 테스트 코드 작성과도 연관되는 사실이다.

과학적 증명과 테스트

*"테스트는 버그가 있음을 보여줄 뿐, 버그가 없음을 보여줄 순 없다"* - 데이크스트라

  • 수학적인 구조로 접근했던 다이크스트라에게 테스트는 프로그램이 잘못되었음을 증명해줄 순 있지만, 프로그램이 맞다고는 증명할 수 없었다.
  • 하지만, 소프트웨어는 과학과 같다.
  • 테스트는 증명 가능한 세부 기능들이 거짓인지를 증명하는 시도이다.
  • 거짓임을 증명하려는 테스트가 실패한다면, 기능들은 목표에 부합할 만큼 충분히 참이라고 말할 수 있다.

정리

  • 구조적 프로그래밍이 가치 있는 이유는 프로그래밍에서 반증 가능한 단위를 만들 수 있기 때문.
  • 따라서 소프트웨어 아키텍트는 모듈, 컴포넌트를 쉽게 테스트할 수 있도록 만들어야 한다.

[클린 아키텍처] 4. 구조적 프로그래밍
[Clean Architecture 정리] 4장. 구조적 프로그래밍 - 테리의 일상
[Clean Architecture] 4. 구조적 프로그래밍 - 다여닙니다 - 티스토리

반응형