Sequential or Temporal Coupling
Functional Programming에 관심이 많은 개발자들은 위 제목이 무엇을 뜻하는지 잘 알것이다. 내용을 다시 확인해 보자면 Functional Programming은 할당문(assignment statements) 사용하지 않고 프로그래밍 하는 것이라 할 수 있다. 따라서 Functional Programming은 변수를 사용하지 않고 프로그래밍하는 것이며 functional Programming에서 값(values)는 변하지 않는다라고 할 수 있다.
왜 이것이 바람직한지 아래의 코드를 한번 보자
...
// Block A
...
x = 1;
...
// Block A
시스템의 상태는 Block A를 실행할 때와 Block B를 실행할 때가 서로 다를 것이다. 이 말은 Block A가 반드시 Block B에 앞서 실행되어야 한다는 것을 의미한다. 만약 이 두 Block의 순서를 서로 바꿔 실행하면 시스템은 정상적으로 동작하지 않을 것이다.
이 상태를 sequential coupling 또는 temporal coupling이라고 한다. (실행 순서에서의 Coupling) 이런 현상들은 아주 많이 접하게 된다. Close보다 Open이 먼저 실행되어야 한다. delete보다 New가 먼저 실행되어야 한다. 또는 free보다 malloc이 먼저 실행되어야 한다.
개발자라면 오류가 발생하면 디버깅을 하기 위해 엄청 많은 시간을 투자하게 된다. 이때 앞에서 말한 것처럼 단순히 실행 순서를 변경함으로써 해결책을 찾아낸 경우도 많이 있을 것이다.
Java Programming으로 보자면 temporal coupling이 가장 높은 것은 아마도 Garbage Collection일 것이다. GC가 일을 잘만 해준다면 메모리 관리에 신경을 쓰지 않아도 되겠지만 현실은 그러지 못하다. 왜냐하면 우리가 GC에 의지하는 만큼 temporal coupling 잘 하지 못하기 때문이다.
멀티 쓰레드 환경에서 2개 이상의 쓰레드가 Processor를 선점하기 위해 경쟁하고 있을 때 temporal coupling을 유지하는 것은 고난이도의 작업이 된다. 이 과정이 99%잘 동작하다가 한 번이라도 이상한 순서로 실행되면 race condition 현상이 발생한다.
이와 같이 temporal coupling과 race condition이 발생하는 근본적 원인은 할당문(assignment)을 이용하는 변수(variable)를 사용하기 때문이다. 즉, 할당문을 사용하지 않으면 temporal coupling과 race condition이 있을 수 없게 된다. 프로그램 실행 중에 상태를 업데이트하지 않은다면 당연히 동시 업데이트(concurrent update)와 관련된 문제는 사라지게 된다.
function 내에서 시스템 상태가 변경되지 않는다면 function내에서는 ordering issue가 사라지게 된다.