컴퓨터 과학의 모든 문제는 다른 수준의 간접 계층으로 해결할 수 있다 - David J. Wheeler
... 그러나 그러면 또 다른 문제가 생기는 것이 일반적이다. - Butler W. Lampson
개발자는 추상과 구조에 대한 이야기를 많이 할수 밖에 없다. 우리는 이미 수많은 추상화 계층 속에서 프로그램을 만들고 있으며 그 안에서도 생산성, 가독성 등 여러 이유로 추상화하고 구조를 만들어 나간다. 이러한 추상과 구조는 개발자의 사고에 큰 영향을 미친다.
추상화와 구조화는 많은 문제를 일으키기도 하지만 개발자의 강력한 무기가 될 수도 있다. 이 글에서는 추상과 구조가 무엇인지 알아보고 개발자가 이를 어떻게 활용할 수 있는지 알아볼 것이다.
개발자가 하는 일
개발자가 하는 일을 한 마디로 정의하자면, "프로그램을 만드는 것"이다. 프로그램은 원하는 결과를 이루기 위해 수행되는 일의 계획1이라는 뜻을 가지고 있다. 원하는 결과를 이룬다는 것에는 문제를 해결한다라는 숨은 뜻이 있다. 따라서 개발자는 프로그램을 만들어 세상의 다양한 문제를 해결하는 자랑스러운 직업이라 할 수 있다.
그런데 우리는 왜 문제를 해결할까? 개발자가 문제를 해결하는 것은 비즈니스를 위함이다. 여기서 말하는 비즈니스란 꼭 돈을 벌기 위한 것만을 의미하는 것은 아니다. 비즈니스는 사람들이 편리하게 살 수 있도록 하는 것이며, 사회적 가치를 창출하는 것이다. 그래서 개발 업무는 비즈니스에서 다루는 방법론과 유사한 경우가 많다. 그런 관점에서 바라보았을 때 문제 해결 프로세스는 다음과 같이 이루어진다.

이런 프로세스는 범위와 기간의 차이가 있을 뿐 소프트웨어 공학에서 다루는 폭포 수, 스파이럴, 애자일 등 어떤 방법론을 사용하더라도 크게 다르지 않다. 그리고 역량과 책임의 정도나 역할에 따라 차이는 있을 수 있지만 개발자는 이 프로세스 전체에 관여할 수 있고 관여하기를 권장한다.
결국 개발자는 코드 구현만 하는 사람이 아니라 문제 해결자라고 봐야한다. 그래서 개발자는 기술을 익히는 것도 중요하지만 문제를 해결하는 사고 방식을 익히는 것도 중요하다.
시니어 개발자는 풍부한 경험과 직관을 통해 문제를 능숙하게 해결할 수 있다. 그러나 경험과 직관에 의존하면 분명한 한계가 존재한다. 경험해보지 못한 문제를 발견하거나 그 경험 자체가 잘못됐을 수 있다. 따라서 어떠한 문제를 발견하더라도 유연하게 해결할 수 있는 방법론을 익히는 것이 중요하다. 그리고 이를 통해 경험과 지식 범위를 벗어나더라도 다양한 도메인, 환경에 빠르게 적응할 수 있다. 이러한 방법론이 바로 이 글의 주제인 추상적, 구조적 사고다.
추상적 사고
개발자는 프로그램을 만들기 위해 고려해야 할 것이 매우 많다. 요구사항 수집 같은 것을 빼고 보더라도 좋은 코드를 작성하기 위해 필요한 지식이 한 두 가지가 아니다.

그렇지만 이 개발자의 지식과 관련된 모든 것은 추상적이고 구조적인 생각과 연관이 있다. 대체 추상적, 구조적 사고가 뭐길래 이렇게까지 말하는 걸까? 먼저 추상적 사고에 대해 알아보자.