반응형
- 구조적 프로그래밍은 다익스트라에 의해 발견되었다.
증명
- 모든 프로그램은 단순하더라도 너무 많은 세부사항을 담고있다. 아주 작은 세부사항이라도 간과하면, 프로그램이 동작하는 것처럼 보이더라도 예상 외의 오류가 발생한다.
- 다익스트라는 증명이라는 수학적 원리를 적용해 이 문제를 해결하고자 했다.
- 프로그래머는 입증된 구조를 이용하고, 이 구조를 코드와 결합시켜 코드가 올바르다는 사실을 스스로 증명하게 되는 방식이었다.
- 다익스트라는 증명의 방식을 사용하기 위해서는 단순한 알고리즘에 대해 기본적인 증명을 작성할 수 있는 기법을 먼저 보여줘야 했다.
- 그러나 연구 과정에서, goto문이 모듈의 재귀적 분해를 방해한다는 사실을 발견했다. 모듈을 분해할 수 없다면, 합리적 증명의 필수 기법인 분할 정복을 사용할 수 없다.
- 반면, 분해를 방해하지 않는 좋은 goto문은 분기와 반복이라는 단순 제어 구조에 해당한다는 사실 또한 발견했다.
- 이러한 제어 구조를 순차 실행과 결합하면, 뵘과 야코피니가 발견한 프로그램을 만들 수 있는 제어 구조의 최소 집합인 '순차, 분기, 반복'과 동일하다. 여기서 구조적 프로그래밍이 탄생한다.
해로운 성명서
- 다익스트라 이후로 goto문은 계속해서 프로그래밍 뒤편으로 물러났다.
- 현재 우리는 모두 구조적 프로그래머이다. 제어흐름을 제약 없이 직접 전환할 수 있는 선택권 자체를 언어에서 제공하지 않기 때문이다.
기능적 분해
- 구조적 프로그래밍을 통한 모듈의 재귀적 분해는 모듈을 기능적으로 분해할 수 있음을 의미한다.
- 즉, 큰 요구사항을 고수준의 기능들로 분해하고, 이렇게 분해된 기능들을 다시 저수준의 함수들로 분해하는 과정을 재귀적으로 반복할 수 있다.
- 프로그래머는 이러한 기법을 통해 대규모 시스템을 모듈과 컴포넌트로, 모듈과 컴포넌트는 아주 작은 기능들로 세분화할 수 있다.
엄밀한 증명은 없었다
- 그러나 프로그래밍의 세계에서 '완벽한 증명'은 존재할 수 없었다.
- 그러나 우리는 수학적 방법이 아닌 과학적 방법에서 해답을 찾을 수 있었다.
과학이 구출하다
- 과학적 증명과 수학적 증명의 근본적 차이는 무엇을 증명하는가이다.
- 수학적 증명 : 서술한 내용이 사실임을 증명한다.
- 과학적 증명 : 서술한 내용이 사실이 아님을 증명한다.
- 그렇다고 우리가 과학적 증명을 모두 믿지 않는가? 아니다. 과학적 증명은, 반례를 찾고 싶어도 찾기 힘들면 이를 참이라고 받아들인다. 그럼에도, 세상 어딘가에는 이러한 증명에 반하는 사례가 있을 가능성을 늘 염두에 둔다. 프로그래밍의 무언가와 비슷하지 않은가?
테스트
- 다익스트라는 '테스트는 버그가 있음을 보여줄 뿐, 버그가 없음을 보여줄 수는 없다.' 라고 말했다. 과학적 증명과 일치하는 말이다.
- 우리는 테스트를 통해 우리가 여러 방향으로 고려하고 상정한 예외 사례들과 성공적인 사례들을 테스트한다. 이를 통해, '적어도 우리가 상정한 예외 상황' 내에서는 기능이 올바르게 작동함을 확인한다.
- 이러한 부정확함에 대한 증명은 입증 가능한 프로그램에만 적용할 수 있다. 프로그램의 순서가 제약 없이 바뀐다면 테스트를 아무리 수행해도 올바르다고 할 수 없다.
- 구조적 프로그래밍은 프로그램을 증명 가능한 세부 기능 집합으로 재귀적으로 분해할 것을 강요한다. 그러고 나서 테스트를 통해 증명 가능한 세부 기능들이 거짓인지를 증명하려고 시도한다.
결론
- 구조적 프로그래밍이 오늘날까지 가치 있는 이유는 프로그래밍에서 반증 가능한 단위를 만들어 낼 수 있는 능력 때문이다.
- 저수준의 함수부터 고수준의 모듈까지 모든 수준에서 소프트웨어는 반증 가능성에 의해 주도된다.
- 아키텍트는 모듈, 컴포넌트, 서비스가 쉽게 반증 가능하도록(테스트하기 쉽도록) 만들기 위해 노력해야 한다.
반응형
'Programming > Clean Architecture' 카테고리의 다른 글
6장. 함수형 프로그래밍 (1) | 2023.11.09 |
---|---|
5장. 객체지향 프로그래밍 (0) | 2023.10.26 |
3장. 패러다임 개요 (0) | 2023.10.17 |
2장. 두 가지 가치에 대한 이야기 (2) | 2023.10.11 |
1장. 설계와 아키텍처란? (0) | 2023.10.05 |
댓글