구조적 프로그래밍
구조적 프로그래밍은 에츠허르 비버 데이크스트라에 의해 발견되었다. 데이크스트라는 프로그래밍의 많은 세부사항으로 인해 프로그램이 정상동삭을 실패하는 문제를 증명이라는 수학적 원리 적용하여 유클리드 계층구조를 통해 해결하고자 했다.
데이크스트라는 갑자기 이 연구를 진행하면서 goto 문장이 모듈을 더 작은 단위로 재귀적으로 분해하는 과정에 방해가 된다는 사실을 발견했다. 반면 이런 goto 문장을 사용하더라도 모듈 분해할 때 문제가 되지 않는 경우가 있었다. 이러한 goto 문의 '좋은' 사용 방식은 if/then/else 와 do/while과 같은 분기와 반복이라는 단순한 제어구조였다.
제어 구조
데이크스트라는 분기와 반복과 같은 제어구조는 순차 실행과 결합 했을때 특별해지는 것을 발견했다. 이러한 제어구조는 데이크스트라보다 2년전인 뵘과 야코피니에 의해 모든 프로그램을 순차, 분기, 반복이라는 세 가지 구조만으로 표현할 수 있다는 사실이 증명되었다. 이후 데이크스트라는 단순한 열거법을 이용해 순차구문이 올바름을 입증할 수 있다는 사실을 보여주었다.
분기 : 열거법을 재적용하는 방식으로 처리
반복: 귀납법을 사용해 증명.
데이크스트라는 CACM 편집자에게 편지를 썼고 편지의 제목은 "goto문의 해로움"이었다. 당시 프로그래밍 세계는 이 편지로 인해 논쟁이 불붙었었다. 그러나 곧 이 논쟁은 수그러들었는데 그 이유는 goto 문장은 뒤편으로 밀려났고, 마침내 거의 사라졌기 때문이다.
현재 우리 모두는 구조적 프로그래머이며, 여기에는 선택의 여지가 없다. 제어흐름을 제약 없이 직접 전환할 수 있는 선택권 자체를 언어에서 제공하지 않기 때문이다.
기능적 분해
구조적 프로그래밍을 통해 모듈을 증명 가능한 더 작은 단위로 재귀적으로 분해할 수 있게 되었고, 이는 결국 모듈을 기능적으로 분해할 수 있음을 뜻한다. 이제 거대한 문제 기술서를 받더라도 문제를 고수준의 기능들로 분해하고 다시 저수준의 함수들로 분해할 수 있다. 이를 토대로 구조적 분석이나 구조적 설계 같은 기법이 나타났고 많은 개선이 되었다.
프로그래머는 이 기법을 사용해 대규모 시스템을 모듈과 컴포넌트로 나눌 수 있고, 더 나아가 모듈과 컴포넌트는 입증할 수 있는 아주 작은 기능들로 세분화할 수 있다.
증명
데이크스트라의 유클리드 계층구조를 이용한 증명은 이루어지지 않았다. 그러나 또 다른 전략으로 과학정인 방법의 증명이 있다. 과학은 근본적으로 수학과 다른데, 과학 이론과 법칙은 그 올바름을 절대 증명할 수 없기 때문이다. 예를 들어 뉴턴의 운동 제2법칙인 F = ma는 옳다고 증명할 수 없다. 이 법칙을 시연할 수 있고, 소수점 이하 많은 자리의 정확도로 측정할 수는 있지만, 수학적으로 증명할 수는 없다. 언젠가 다른 실험을 통해 운동법칙이 잘못되었음을 밝혀질 가능성은 항상 열려 있다.
즉 과학적 방법은 반증은 가능하지만 증명은 불가능하다.
과학은 서술된 내용이 사실임을 증명하는 방식이 아니라 서술이 틀렸음을 증명하는 방식으로 동작한다.
테스트
데이크스트라는 "테스트는 버그가 있음을 보여줄 뿐, 버그가 없음을 보여줄 수는 없다"고 말한적이 있다. 즉 테스트를 통해 프로그램이 잘못되었음을 증명할 수는 있지만, 프로그램이 맞다고는 증명할 수 없다. 이를 통해 소프트웨어는 과학과 같다고 볼 수 있다. 최선을 다하더라도 올바르지 않음을 증명하는 데 실패함으로써 올바름을 보여주기 때문이다.
구조적 프로그래밍은 프로그래밍을 증명 가능한 세부 기능 집합으로 재귀적으로 분해할 것을 강요한다. 그리고 테스트를 통해 증명 가능한 세부 기능들이 거짓인지를 증명하려 시도한다. 테스트가 실패한다면, 이 기능들은 목표에 부합할 만큼은 충분히 참이라고 여기게 된다.
결론
- 구조적 프로그래밍의 가치는 반증 가능한 단위를 만들 수 있는 능력이다.
- 즉 소프트웨어는 과학과 같고 따라서 반증 가능성에 의해 주도된다.
- 소프트웨어 아키텍트는 모듈, 컴포넌트, 서비스가 쉽게 반증 가능하도록(테스트하기 쉽도록) 만들기 위해 분주히 노력해야한다.
'클린 아키텍처' 카테고리의 다른 글
[개발서적] 클린 아키텍처 06 - 함수형 프로그래밍 (0) | 2024.12.18 |
---|---|
[개발서적] 클린 아키텍처 05 - 객체 지향 프로그래밍 (Object-Orented) (1) | 2024.12.13 |
[개발서적] 클린 아키텍처 03 - 패러다임의 개요 (0) | 2024.12.12 |
[개발서적] 클린 아키텍처 02 - 두 가지 가치에 대한 이야기 (1) | 2024.12.12 |
[개발서적] 클린 아키텍처 01 - 설계와 아키텍처란? (0) | 2024.12.11 |