데이크스트라의 이야기..
수학은 증명 가능한 서술이 참임을 입증하는 원리
과학은 증명 가능한 서술이 거짓임을 입증하는 원리
테스트
데이스크라 : 테스트는 버그가 있음을 보여줄 뿐 버그가 없음을 보여줄 수는 없다.
테스트에 충분한 노력을 들였다면, 테스트가 보장할 수 있는것은
프로그램이 목표에 부합할 만큼은 충분히 참이라고 여길 수 있게 해주는 것이 전부다.
소프트웨어 개발은 수학적인 구조를 다루는 듯 보이더라도, 수학적인 시도가 아니라는 점이다.
오히려 소프트웨어는 과학과 같다.
최선을 다하더라도 올바르지 않음을 증명하는데 실패함으로써 올바름을 보여주기 때문이다.
이러한 부정확함에 대한 증명은 입증 가능한 프로그램에만 적용할 수 있다.
예를 들어 제약없는 goto문을 사용하는 등의 이유로 입증이 불가능한 프로그램은
아무리 테스트를 많이 수행하더라도 절대로 올바르다고 볼 수 없다.
구조적 프로그래밍은 프로그램을 증명가능한 세부 기능 집합으로 재귀적으로 분해할 것을 강요한다.
그리고 나서 테스트를 통해 증명가능한 세부기능들이 거짓인지를 증명하려고 시도한다.
거짓임을 증명하려는 테스트가 실패한다면,
이 기능들은 목표에 부합할 만큼은 충분히 참이라고 여기게 된다.
결론
구조적 프로그래밍이 오늘날 까지 가치 있는 이유는 프로그래밍에서 반증 가능한 단위를 만들어 낼 수 있는 능력 떄문이다.
뿐만 아니라 아키텍처 관점에서는 기능적 분해를 최고의 실천법 중 하나로 여기는 이유이기도 하다.
소프트웨어 아키텍트는 모듈, 컴포넌트, 서비스가 쉽게 반증 가능하도록(테스트 하기 쉽도록) 만들기 위해 노력해야 한다.
이를 위해 구조적 프로그래밍과 유사한 제한적인 규칙들을 받아들여 활용해야 한다.