본문 바로가기
IT 공부/공부하며 알게된 사실들

함수의 본질과 컴퓨팅 사고력

by exdus3156 2023. 10. 29.

1. 프로그램에서 함수의 중요성

  • 함수는 소프트웨어의 본질이자, 소프트웨어라는 건축을 받치는 벽돌이다.
  • 소프트웨어는 함수의 연속으로 구성되며, 함수가 다시 함수를 호출하는 구조, 즉 재귀적인 구조다.
  • 함수는 정보 처리의 최소 단위다. 소프트웨어의 궁극적인 본질은 무수히 많고 다양한 데이터를 입력받아 일관된 방식으로 계산하거나 처리하고 그 결과를 받아내는 것이다. 따라서 함수를 설계한다는 것 자체가 컴퓨터를 통해 문제를 해결하겠다는 것이다. 결국 프로그래머란 함수를 설계하는 사람이다.

 

2. 컴퓨팅 사고력과 일반 지능

  • 컴퓨팅 사고력에 관해 오해하지 말아야 할 것은, 컴퓨팅 사고력이 좋다고 해서 반드시 IQ가 높다고 볼 수는 없다는 것이다. 상관관계는 있을 지 모르겠다. 그러나 컴퓨팅 사고력은 순수한 지능적인 똑똑함을 측정하는 것이 아니다.
  • 컴퓨팅 사고력이란 컴퓨터를 기반으로 문제를 해결하는 능력을 말한다. 프로그래머는 인간의 관점이 아니라 컴퓨터의 관점에서 해석하고 해법을 제시한다. 인간이 작은 것에서 큰 것으로, 세부사항에서 일반론으로, 귀납적이고 감각적인 사고력을 갖추고 있다면, 컴퓨터는 완전히 그 반대다.
  • 처음 내가 프로그래밍을 배웠을 때는, 알고리즘 문제가 주어지면 일단 내 지능의 온갖 사고력을 총동원해서 답을 내기만 급급했다. 함수를 만들면서도 정작 귀납적으로 생각하고, 세부사항에서 시작하고, 일반 법칙을 찾으려고 해매고, 일단 데이터를 쑤셔 넣기만 급급했다. 알고리즘을 푸는 것에만 급급하여 함수 자체의 구성 원리에 대한 정밀한 통찰을 하지 못했던 것이다.

 

3. 프로그램에서의 함수의 본질

  • 함수란 겉으로만 보면 함수라는 박스 안에 알고리즘을 배치하는 행위로만 보인다. 그러나 함수는 그 이상의 오묘한 구조를 갖추고 있다. 단순히 제어흐름을 감싸고 이름 붙이는 것이 아니다.
  • 데이터를 받아 처리하고 결과를 뱉어내는 함수 구조가 재귀적이라는 말은 어디까지나 구조가 그렇다는 것이다. 구조는 재귀적이지만, 내용적으로는 완전히 계층적이다. (사실 계층적이어야 한다. 그렇게 되도록 노력해야 한다.)
  • 어떤 문제의 첫 진입점이 되는 함수는 해당 추상성의 레벨에서 제시된 문제를 해결한다. 세부사항에 일일이 집중하지 않는다. 프로그래머는 아주 간단한 제어 흐름을 사용해 되도록 간단하게 문제를 푼다. 이때 세부사항에 집중하지 않는다. 대략적인 하위 문제들로 분해한다. 이런 분해야 말로 프로그래머의 역량이다.
  • 그리고 하위 문제들은 다시 동일한 함수 구조를 사용하며 자신들에게 부여된 추상성의 레벨에서 문제를 해결한다. 이러한 구조가 반복된다. 

 

  • 제어 흐름은 위와 같이 상위 함수가 자신의 문제를 한 단계 정도 더 낮은 추상성 레벨의 문제들로 분해한다. 그리고 그 문제들은 다시 똑같이 한 단계 낮은 추상성 레벨에서 풀 수 있는 (즉, 더 세부사항을 처리하는) 하위 문제들로 분해해 제어흐름을 넘긴다.
    • 객체지향 설계도 가까이서 보면 객체 간 메소드 호출로 얽히고 섥혀 보이지만, 보다 더 큰 아키텍처 단위에서 보면 위와 같이 계층적인 디자인이 많다. (물론 객체지향의 궁극의 핵심이라 할 수 있는 의존성 줄이기 전략 때문에 위 이미지와 같이 제어흐름과 소스코드 의존성이 같이 따라가지는 않을 것이다.)
  • 요컨대, 컴퓨팅 사고력에서 흔히 말하는 "재귀적 사고", 혹은 "거꾸로 생각하기", "문제 분할하기"는 사실 그것이 지능적으로 똑똑한 방법이라서가 아니라 인간이 이해하면서도 컴퓨터가 해결할 수 있는 형태의 해법 구조이기 때문이다.
  • 컴퓨팅 사고력은 귀납이 아니라 연역이고, 세부사항이 아니라 추상과 일반이다.