구조적 프로그래밍
증명
다이크스트라는 수학적 원리의 증명을 프로그래밍에 적용했다.
프로그래머는 입증된 구조를 이용하고 이를 코드와 결합해 코드가 올바르다는 사실을 스스로 증명하는 방식으로 동작할 수 있다고 믿었다.
그는 단순한 알고리즘에 대한 증명을 작성할 수 있는 기법을 연구하면서, goto 문장 대신 분기(if/then/else)와 반복(do/while)의 단순한 제어구조만을 사용함으로써 재귀적으로 증명가능한 모듈로 세분화할 수 있다는 사실을 발견했다.
이러한 발견은 구조적 프로그래밍의 기반이 되었고, 구조적 프로그래밍으로 인해 거대한 문제 기술서도 고수준의 기능으로, 다시 저수준의 함수들도 분해가 가능해졌다.
따라서 프로그래머는 구조적 프로그래밍을 통해 대규모 시스템을 모듈과 컴포넌트로, 더 나아가 입증할 수 있는 작은 기능들로 세분화할 수 있게 되었다.
엄밀한 증명?
다이크스트라가 원했던 증명은 수학에서 사용되는 유클리드 계층구조(엄밀한 증명)이지만, 현재 소프트웨어를 개발하는 프로그래머가 고품질의 소프트웨어를 생산하기위해 채택한 증명 전략은 과학적 방법(Scientific method)이다.
과학적 증명?
과학적 증명은 반증은 가능하지만 증명이 불가능한 것이다.
서술된 내용이 사실임을 증명하는 방식이 아닌, 서술이 틀렸음을 증명하는 방식으로 동작한다.
즉, 증명 가능한 서술이 거짓임을 입증하는 원리이다.
이는 테스트 코드 작성과도 연관되는 사실이다.
과학적 증명과 테스트
"테스트는 버그가 있음을 보여줄 뿐, 버그가 없음을 보여줄 순 없다" - 데잌스트라
수학적인 구조로 접근했던 다이크스트라에게 테스트는 프로그램이 잘못되었음을 증명해줄 순 있지만, 프로그램이 맞다고는 증명할 수 없었다.
하지만, 소프트웨어는 과학과 같다.
테스트는 증명 가능한 세부 기능들이 거짓인지를 증명하는 시도이다.
거짓임을 증명하려는 테스트가 실패한다면, 기능들은 목표에 부합할 만큼 충분히 참이라고 말할 수 있다.
정리
- 구조적 프로그래밍은 프로그램을 증명 가능한 세부 기능 집합으로 재귀적으로 분해할 것을 강요한다.
- 구조적 프로그래밍의 가치는 프로그래밍에서 반증 가능한 단위로 만들어 낼 수 있는 능력이다.
- 모든 수준에서 소프트웨어는 과학과 같고, 반증 가능성에 의해 주도된다.
서적 : http://www.yes24.com/Product/Goods/77283734
'Architecture' 카테고리의 다른 글
[Clean Architecture 정리] 6장. 함수형 프로그래밍 (0) | 2022.07.17 |
---|---|
[Clean Architecture 정리] 5장. 객체 지향 프로그래밍 (0) | 2022.07.17 |
[Clean Architecture 정리] 3장. 패러다임 개요 (0) | 2022.07.10 |
[Clean Architecture 정리] 2장. 두 가지 가치에 대한 이야기 (0) | 2022.07.10 |
[Clean Architecture 정리] 1장. 설계와 아키텍처란? (0) | 2022.07.09 |
댓글