관리 메뉴

김종권의 iOS 앱 개발 알아가기

[Clean Architecture] 4. 구조적 프로그래밍 (structured programming), 테스트 코드가 중요한 이유 본문

Clean Architecture/Clean Architecture 기초

[Clean Architecture] 4. 구조적 프로그래밍 (structured programming), 테스트 코드가 중요한 이유

jake-kim 2021. 3. 6. 03:03

절차 지향 프로그래밍 (Procedural programming)

  • 주로 goto 문장이 주를 이루는 프로그래밍
  • 현재의 프로그래밍은 모두 `구조적 프로그래밍`
  • 자바의 경우 break, goto문이 있지만 이 제어흐름을 아무 제약 없이 직접 전환될 수 있던 과거의 포트란과 코볼같은 언어와는 달리 goto문을 함수 안으로 한정시키는게 대부분

구조적 프로그래밍 (structured programming)

  • 구조적 프로그래밍의 탄생: 수학적으로 접근 (순차 구문-열거법, 분기-열거법, 반복-귀납법)
  • 기능적 분해: 구조적 프로그래밍을 통해 모듈을 증명 가능한 떠 작은 단위로 재귀적으로 분해가 가능 -> 기능적으로 분해 가능하다는 의미
  • 문제 접근방법: 큰 문제 -> 고수즌의 기능들로 분해 -> 이들 각 기능은 저수준의 함수들로 분해 -> 끝없이 반복 가능 -> 분해된 기능들은 구조적 프로그래밍의 제한된 제어 구조를 이용하여 표현 가능

프로그래밍은 증명되지 않은채 존재

  • 프로그램 관점에서 `유클리드 계층구조(순차구문, 분기, 반복)`를 각 증명하려 했지만, 결론은 증명되지 않음
  • 무엇인가 입증할 때 사용하는 전략에 `유클리드 방식`도 있지만, `과학적 방법`을 이용
  • 과학적 방법: 반증은 가능하지만 증명은 불가능한 것
    - `F=ma가 옳다고 증명할 수는 없지만 이들 법칙을 시연할 수 있고 소수점 이하 많은 자리의 정확도를 측정할 수 있지만 `수학적으로 증명할 수 없음`
  • 과학적 방법의 증명 접근 방법: 내용이 사실임을 증명하는게 아닌 틀렸음을 증명하는 방식
  • 수학은 증명 가능한 서술이 참임을 입증하는 원리인 반면, 과학은 증명 가능한 서술이 거짓임을 입증하는 원리 (=프로그래밍 접근방법)

테스트

  • 프로그래밍은 수학적 접근이 아닌 과학적 접근
  • 테스트는 버그가 있음을 보여줄 뿐, 버그가 없음을 보여줄 순 없음
  • 프로그램이 잘못되었음을 테스트를 통해 증명할 수 있지만, 프로그램이 맞다고 증명할 수 없음
  • 프로그래밍의 핵심은 테스트 (TDD가 중요한 이유)

구조적 프로그래밍이 지금까지 가치 있는 이유

  • 프로그래밍에서 반증 가능한 단위를 만들어 낼 수 있는 능력이 있기 때문
  • 아무런 제약 없는 goto 문장은 지원하지 않기 때문
  • 가장 작은 기능에서부터 가장 큰 컴포넌트에 이르기까지 모든 수준에서 software는 과학과 같음 -> 반증 가능성에 의해 주도
  • software architecture는 모듈, 컴포넌트, 서비스가 쉽게 반증 가능하도록 (=테스트하기 쉽도록) 만들기 노력해야함
Comments