프로그래밍의 핵심

손정우·2021년 3월 22일
1

본 내용은 글쓴이의 경험을 기반으로 작성된 글이며 엄밀한 검증을 거치지 않았습니다.

프로그래밍을 본격적으로 공부하다 보면 정말 많은 개념을 만나게 된다.
절차지향에서 객체지향, 함수형 프로그래밍에 이르는 패러다임, Di나 커맨드 패턴과 같은 디자인 패턴, 분야별로 다양한 용어와 특징 등등 이런 수많은 개념이 넘쳐난다.

이러한 개념들은 서로 상충되거나 상호보완적인 관계를 가지거나 역사적으로 발전되어 온 형태를 띌 수도 있다. 이러한 복잡한 관계는 우리가 공부하는데 있어서 그게 그거같고 뭐가 좋고 뭐가 나쁜지 바로 깨닫기 힘들다.

그럼에도 이들에 대한 기준은 명확하다. 그래서 나는 이를 핵심이라 부르며 정리하고자 한다.

핵심 3가지

  • 알고리즘
  • 추상화
  • 도메인 지식

알고리즘

알고리즘은 모두가 알듯이 문제를 해결하기 위한 논리적 절차다.
프로그래밍에서는 효율적인 알고리즘이 주된 목표이다.

정렬 알고리즘으로 예를 들면 직관적이지만 느린 선택 정렬이나 버블 정렬 등에서 보편적으로 효율적인 퀵 정렬이나 병합 정렬 등이 나오고 이후 가능한 많은 영역에서 높은 효율을 내기위해 상황별로 여러 정렬 알고리즘을 혼합하는 방식으로 변화한다.

추상화

추상화란 어떠한 것의 핵심적인 특징에 이름을 붙이는 것을 말한다.
프로그래밍에서는 적절한 추상화를 통해 더 읽기 편하고 수정, 확장에 용이한 코드를 작성하는 것이 목표다.

우리는 보통 이를 객체지향을 공부하며서 접하게 되는데 사실 이는 프로그래밍 전반에 깔려있다.

과거 기계어에서 비교적 읽을 수 있는 어셈블리어로 1:1 매칭을 시키고
어셈블리어에서 자주 보이는 코드 형식을 if, for, while과 같은 이름을 붙여 통해 더 논리적인 부분에 집중할 수 있게 만들었다.
이후에는 함수, 객체 등으로 확장되어가며 각각의 이름이 붙여졌다.

객체지향은 데이터와 그 데이터의 동작을 하나의 주체로 바라보며 그 특징을 살려 이름을 붙였으며 함수형 프로그래밍은 데이터와 데이터 사이의 관계를 주된 주체로 바라보며 그러한 함수에 이름을 붙이며 풍부한 표현이 가능하게 만들었다.

객체지향에서 객체들간 공통적인 특징은 인터페이스로 추상화되어 이름이 붙여진다.

DI와 같은 의존성을 낮추기 위한 패턴들은 다른 주체들과의 관계에서 복잡도나 제약사항을 해소함으로서 어떠한 주체에 대한 특징을 명확하게 하기 위함이다.

결국 추상화는 대상에 대한 특징을 명확하게 살려서 재활용성을 높이고 코드를 더 간결하고 읽기 편하게 만드는 것이 주된 방향성이다.

도메인 지식

도메인 지식은 추상화 작업이 굳어진 채 하나의 지식으로 다루어지는 경우다.

HTML로 예를 들면 특정한 모양으로 렌더링될 것들에 태그라는 형식으로 이름을 붙이고 조합하여 사용한다. 하지만 웹이 보편화되고 고도화되면서 이러한 추상화보다는 태그들의 조합과 그 쓰임이 더 중요해졌다.

그래서 나는 이러한 부분을 추상화와는 다소 차이를 주고자 했으며 이렇게 도메인 지식으로 따로 빼놨다.

도메인 지식으로는 프로그래밍 영역 뿐만 아니라 문제를 해결해야하는 산업, 분야의 지식을 말하기도 한다.

프로그래밍 공부에 적용

이러한 것들을 명확하게 표현하고 나면, 공부에도 이를 의도적으로 의식하며 더 높은 공부 효율을 가질 수 있을 것이라 생각한다.

한 라이브러리에 대해서 공부한다면 이 것이 기존의 어떤 문제를 해결하며 그것을 해결하기 위해 어떠한 알고리즘, 추상화 방법을 사용했는지 공부하는 것이다.

이러한 점에 유의하면 자연스럽게 해당 기술의 배경과 원리, 좋은 사용법을 익힐 수 있다.

개인적인 성과

이를 명확하게 표현하기 전에는 난 프로그래밍에 있어서 편협적인 생각을 가지고 있었다.
저수준이 가장 핵심이고 모든 것의 원리이며 고수준의 것들보다 더 우수하다고 여겼다. 그 결과 C, C++을 큰 이유없이 좋아했으며 GC 등을 통해 메모리 관리를 하는 것이 옳지 못한다고 판단했다. Python과 같은 typeless한 언어는 비록 친구들끼리의 장난이지만 근본이 없는 언어라 칭하기도 했다.

하지만 이렇게 핵심들을 명확하게 정리하자 더 편하고 좋은 코드를 작성하기위해 GC나 typeless한 언어들에 대해서 열린마음을 가질 수 있었다.

또한 흑마법이라고도 불리는 Binary 코드 조작 등을 통해 얻는 언어를 지원하는 기능을 넘는 것들, 예를 들어 Spring Data JPA의 Query Method에 대해서도 이 또한 추상화의 일종으로 몇가지 유의점, 라이브러리에 의존성이 높아지거나 다른 Binary 코드 조작 등과는 충돌이 있을 수 있는 점을 충분히 숙지한 상태에서 사용하는 것에 대해서 비교적 관대적일 수 있었다.

0개의 댓글