4장 구조적 프로그래밍

증명

모든 프로그램은 많은 세부사항을 담고 있어서 작은 세부사항도 간과하면 예외가 발생해 실패한다. 다익스트라는 증명(proof) 이라는 수학적 원리를 적용해 문제를 해결했다. 프로그래머는 입증된 구조를 이용하고 이 구조를 코드와 결합해 코드가 올바르다는 사실을 스스로 증명하는 방식이다.

다익스트라는 연구를 하던 중 goto문이 재귀적으로 분해하는 과정에 방해가 되는 경우가 있다는걸 발견했다. 반면 goto문은 if/then/elsedo/while 과 같이 분기와 반복이라는 단순한 제어구조에선 문제가 되지 않았다. 즉, 단순한 제어 구조만 사용한다면 증명이 가능했다. 이렇게 구조적 프로그래밍이 탄생했다.

해로운 성명서

다익스트라의 연구로 goto 문은 점점 사라졌다. 언어에서 제어 흐름을 전환하는 goto를 제공하지 않기 때문에 우리는 모두 구조적 프로그램을 작성한다.

기능적 분해

구조적 프로그래밍을 통해 모듈은 증명 가능한 더 작은 단위로 분해할 수 있게 되었다. 거대한 문제를 받더라도 고수준의 기능들로 분해하고, 고수준의 기능은 다시 저수준의 함수로 분해할 수 있다.

이를 토대로 구조적 분석이나 구조적 설계와 같은 기법이 인기를 끌었다. 이 기법을 사용해 프로그래머는 대규모 시스템을 모듈과 컴포넌트로 나누고, 모듈과 컴포넌트는 작은 기능들로 세분화할 수 있다.

엄밀한 증명은 없었다

끝내 증명은 이루어지지 않았따. 하지만 과학적 방법(scientific method)이 있었다.

과학이 구출하다

과학은 수학과 달리 이론과 법칙의 올바름을 증명할 수 없다. 과학은 서술이 틀렸음을 반증하는 방식으로 동작한다.

테스트

테스트는 버그가 있음을 보여줄 뿐 버그가 없음을 보여줄 수는 없다. - 다익스트라

소프트웨어 개발은 수학이 아니라 과학과 같다. 최선을 다하더라도 올바르지 않음을 증명하는데 실패함으로써 올바름을 보여주기 때문이다.

구조적 프로그래밍은 프로그램을 증명 가능한 세부 기능 집합으로 재귀적으로 분해하고, 테스트를 통해 세부 기능들이 거짓인지를 증명한다. 거짓임을 증명하는 테스트가 실패했다면 이 기능들은 충분히 참이라고 여기게 된다.

결론

구조적 프로그래밍이 오늘날까지 가치 있는 이유는 프로그래밍에서 반증 가능한 단위를 만들어내기 때문이다. 아키텍처 관점에서는 기능적 분해를 최고의 실천법 중 하나로 여긴다.

소프트웨어는 과학과 같고 반증 가능성에 의해 주도된다. 소프트웨어 아키텍트는 모듈, 컴포넌트, 서비스가 반증 가능하도록(테스트하기 쉽도록) 노력해야 한다.

이를 위해 구조적 프로그래밍과 유사한 규칙들을 받아들이고 활용해야 한다.

Last updated