함수의 Abstraction Level

Pyro·2021년 9월 26일
1

클린코드책 p45 에서 "지정된 함수 이름 아래에서 추상화 수준이 하나인 단계만 수행한다면 그 함수는 한 가지 작업만 한다." 라는 문장이 나온다. (이미지에 노란색으로 줄이 쳐져 있다.)
영어 원문으로는 "one level of abstraction per function" 이라고 표현된다.

대체 이 추상화 수준(level of abstraction)이 뭐냐는 질문을 받았고,
이를 제대로 대답하기 위해 오늘 테크톡을 열었다.

1부에서는 abstraction 이 무엇인지를 설명했고,
2부에서는 level of abstraction 이 무엇인지를 설명했다.

1부: Function 은 추상적이다.

Function 은 abstraction of computation 이다.
즉 사용자가 진짜로 하고 싶은 요구사항의 추상화가 function 이고,
이 function 을 실제로 구현해서 컴퓨터한테 시킬 수 있도록 만든게 computation 이다.

Computation 을 구현하는 방법은 2가지가 있다.
알고리즘을 구현하거나, Circuit 을 구현하면 된다.

하버드 대학교의 컴공 1학년 교재 출처

Computation 의 정의

Function F:{0,1}n{0,1}mF: \{0,1\}^n \rightarrow \{0,1\}^m
Circuit CC computes FF if x{0,1}n,C(x)=F(x)\forall x \in \{0,1\}^n, C(x) = F(x)
Algorithm AA computes FF if x{0,1}n,A(x)=F(x)\forall x \in \{0,1\}^n, A(x) = F(x)

알고리즘이 "수행해야하는 동작들의 순서(sequence of steps)" 라면,
Circuit 은 빵판에다가 납땜해서 만드는 회로도라고 할 수 있다.
하지만 위의 정의를 보고 있다보면 알고리즘이나, Circuit 이나 그게 그거라는 것을 알 수 있다.
그렇기에 verilog 같은 언어로 virtual circuit 을 프로그래밍할 수 있는 것이다.

Computation 의 구현

간단한 덧셈함수 add 를 구현한다고 생각해보자.
다음과 같은 순서로 구현하게 될 것이다.

1. 함수 이름과 파라미터를 정한다.

int add(int a, int b) {
  // TODO: 더하기를 구현해야함
  return 0;
}

2. 실제로 구현한다.

int add(int a, int b) {
  return a + b;
}

말을 정리해보자.
우리는 add function 을 구현하려 한다.
add function 은 a 와 b 를 더한다는 요구사항의 추상화이다.
즉, add function 의 요구사항은 더하기 calculation 이다.

a 와 b 를 실제로 어떻게 더할지 컴퓨터에게 시킬 내용을 computation 이라고 한다.
computation 은 a + b 가 될 수도 있지만, a + b + 100 - 100 이 될 수도 있다.
실제 computation 이 무엇인지 상관없이, add function 은 정상적으로 작동한다.

일단 우리는 a + b computation 을 선택했다고 해보자.
a + b computation 은 + 라는 operator 로 구성되어 있다.
+ operator 는 더하기 operation 을 operate 해주는 존재이다.

우리는 더하기 operation 을 더이상 쪼갤 수 없는 동작이라고 착각하지만 실제로는 그렇지 않다.
a + b computation 을 실제로 구현하기 위해서는 알고리즘 혹은 Circuit 을 구현해야하는데,
Circuit 을 구현하면 다음과 같다.

computation 이 실제로 구현된 circuit 을 보고 있노라면,
정신이 아득해지면서 function 이 얼마나 추상적인 개념인지 느껴지게 된다.

2부: Level of Abstraction

1부 테크톡에서는 추상화된 add function 의 computation 을 정하고, 이를 실제 circuit 으로 구현하는 작업을 했다.
2부 테크톡에서는 반대로 여러 computation 들을 추상화해서 function 으로 만들어보는 작업을 했다.

이 과정을 직접 해보면서, 추상화를 한번만 해도 되는 computation 이 있는가 하면,
여러번에 걸쳐서 추상화 작업을 해야하는 computation 이 존재했다.
이렇게 추상화 작업을 해야하는 횟수를 level of abstraction 이라고 부른다.
몸으로 직접 겪어보면, 이게 대체 무슨 단위인건지 느껴진다.

"one level of abstraction per function" 이라는 원칙을 클린코드에서 강조하는 이유는,
level 이 여러개이면, 코드를 읽는 독자가 추상화 작업을 한번에서 끝나지 않고 여러번 해야하기 때문이다.
그리고 오늘 테크톡에 참여한 사람들은 느꼈을 텐데, 추상화 작업은 고도의 추리력과 집중력이 요구된다.
추상화 작업을 여러번 하려 하면 엄청나게 피곤하다.

인생을 피곤하게 살지 말자는 뜻에서 "지정된 함수 이름 아래에서 추상화 수준이 하나"일 수 있도록 제발 좀 노력하자는게 클린 코드에서 주장하는 바이다.

2부 테크톡에서 진행한 computation -> Function 으로 추상화 하는 예시들은 귀찮아서 설명을 생략하도록 하겠다.

만약 궁금하다면, 파이로가 진행하는 테크톡에 적극적으로 참여하면 들어볼 수 있다!

profile
dreams of chronic and sustained passion

0개의 댓글