김대용
Algorithm

알고리즘과 자료구조를 왜 배워야할까?

--------------------

알고리즘과 자료구조가 정말정말 중요하다고 얘기하는걸 다들 한번쯤은 들어봤을 거다. 나도 듣기만 했지, 정작 왜 중요한지 생각하고 정리해본적이 없었다. 왜 중요한지 여러 사람들의 의견을 모아봤다.

내가 생각하기엔

먼저 본인이 현재 생각하는 이유에 대해서 정리해보자.

왜 여러분은 알고리즘과 자료구조가 중요하다고 생각하는가?

나는 아래와 같이 생각한다.

  • 알고리즘은 곧 컴퓨터적 사고에 익숙해짐을 의미하기 떄문에 (컴퓨터처럼 생각해야 코드를 잘 작성할 수 있다.)
  • 알고리즘과 자료구조에 익숙해야 빠르게 상황에 맞는 효율적인 코드를 작성할 수 있기 때문에
  • 알고리즘은 곧 자료구조를 기반해 더 효율적으로 만들어지기 때문에

다른 사람이 생각하기엔

Introduction to Algorithms, CLRS

전 세계적으로 1백만권 이상이 팔린 전설의 알고리즘 책은 아래와 같이 말한다.

물론 컴퓨터는 빠를 수 있지만 무한히 빠르지는 않다. 그리고 메모리는 저렴할 수는 있지만 공짜는 아니다. 따라서 컴퓨팅 시간은 한정된 자원이며 메모리 공간도 마찬가지다. 이러한 자원을 현명하게 사용해야 하며, 시간이나 공간 측면에서 효율적인 알고리즘이 도움이 될 것이다.

알고리즘 지식과 기술에 대한 탄탄한 기반을 갖추는 것은 진정한 숙련된 프로그래머와 초보자를 구분하는 특징 중 하나다. 최신 컴퓨팅 기술을 사용하면 알고리즘에 대해 잘 몰라도 일부 작업을 수행 할 수 있지만 알고리즘에 대한 좋은 배경 지식이 있으면 훨씬 더 많은 작업을 수행할 수 있다.

Introduction to Algorithms, Thomas H. Cormen · Charles E. Leiserson · Rivest · Stein

그리고 자료구조에 대해선 이렇게 말한다.

모든 용도에 적합한 단일 자료구조는 없으므로 여러 자료구조의 장점과 한계를 파악하는 것이 중요하다.

Introduction to Algorithms, Thomas H. Cormen · Charles E. Leiserson · Rivest · Stein

Algorithms, Robert Sedgewick · Kevin Wayne

미국 프린스턴대 교수가 집필한 교과서이다. 여기서 무료로 내용을 학습할 수 있다. 무료 Coursera 강의도 제공된다.

알고리즘을 배워야 하는 가장 큰 이유는 엄청난 비용을 절감할 수 있고, 다른 방법으로는 불가능했을 작업을 수행할 수 있기 때문이다. 대규모 시스템에서 잘 설계된 알고리즘을 사용하여 속도를 단숨에 수백만 배 빠르게 만드는건 드물지 않다. 반면, 속도를 올리기 위해 새로운 컴퓨터에 투자하는건 겨우 10, 100배의 잠재력에 불과하다.

신중한 알고리즘 설계는 분야에 상관없이 거대한 문제를 해결하는 과정에서 매우 효과적이다.

Algorithms, Robert Sedgewick · Kevin Wayne

알고리즘과 자료구조의 관계에 대해 아래와 같이 설명한다. 자료구조의 중요성을 매우 높게 평가한다.

대부분의 주요 알고리즘은 계산에 관련된 데이터를 조직화하는 작업을 포함한다. 이러한 조직화는 자료구조로 이어지며, 자료구조는 컴퓨터 과학의 핵심 연구 대상이기도 하다.

알고리즘과 자료구조는 서로 밀접한 관련이 있다. 이 책에서는 자료구조가 알고리즘의 부산물 또는 최종 결과물로 존재한다는 관점을 취하며, 따라서 알고리즘을 이해하기 위해서는 반드시 자료구조를 공부해야 한다.

간단한 알고리즘은 복잡한 자료구조를 낳을 수 있고, 반대로 복잡한 알고리즘은 간단한 자료구조를 사용할 수 있다.

Algorithms, Robert Sedgewick · Kevin Wayne

칸아카데미

칸아카데미에서는 아래와 같이 말한다.

좋은 알고리즘을 찾고 언제 써야 할지 알아야 흥미롭고 중요한 프로그램을 만들 수 있다.

What is an algorithm and why should you care?, Khan Academy

JavinPaul

구글링 중 발견한 글 안에 담긴 말이 너무 멋져 가져와봤다.

알고리즘은 프로그래밍 문제 해결 능력과 코딩 센스를 기르는 도구다. 이 능력은 사용자 요구사항을 코드로 바꿔 프로그램을 만들어 내는 것에 연관되어 있다.

프로그래밍 언어는 유행을 타지만, 프로그래밍의 핵심인 자료구조와 알고리즘은 영원하다.

10 Best Books for Data Structure and Algorithms for Beginners, javinpaul

리누스 토르발스

리누스 토르발스는 자료구조의 중요성에 대해 이렇게 말한다. 본인이 git을 디자인하면서 겪은 경험을 바탕으로 설명한다.

git은 실제로 안정적이고 합리적으로 잘 문서화된 자료구조와 함께 단순한 디자인을 가지고 있다. 사실 난 데이터를 중심으로 코드를 설계하는 것을 매우 지지하며, 이것이 깃이 상당히 성공한 이유 중 하나라고 생각한다.

사실 난 나쁜 프로그래머와 좋은 프로그래머의 차이는 코드와 자료구조 중 무엇을 더 중요하게 생각하느냐에 달려 있다고 주장하고 싶다.

나쁜 프로그래머는 코드에 대해 걱정한다. 좋은 프로그래머는 자료구조와 그 관계에 대해 걱정한다.

Linus Torvalds

즉, 좋은 자료구조는 코드를 디자인하고 관리하기 쉽게 만들어주지만 아무리 좋은 코드라도 나쁜 자료구조를 보완할 수 없다는 말이다. 예시로 옛날 소스코드 형상관리 도구들은 새로운 기능이 업그레이드 될 때 마다 자주 자료구조를 갈아 엎어야 해서 전용 데이터베이스 마이그레이션 도구까지 사용해야했다. 그러나 깃은 기능이 폭발적으로 많아졌음에도 불구하고 내부 자료구조를 바꾼 적은 정말 드물다.

내 생각에 자료구조는 알고리즘과 연관이 있기 때문에 토르발스가 더 신경쓰라는 거 같다. 위 Algorithms 책의 자료구조 인용과 맥락이 비슷하다고 생각한다. 더 복잡한 자료구조는 더 단순한 알고리즘을 만들어내니, 사람이 이해하기 더 편할 것이라고 생각한다.

아무리 단순한 절차적 논리라도 사람이 검증하기는 어렵지만, 상당히 복잡한 자료구조는 모델링하고 추론하기가 상당히 쉽다.

데이터는 프로그램 로직보다 파악(추적)하기 쉽다. 따라서 자료구조의 복잡성과 코드의 복잡성 사이에서 선택의 기로에 놓인 경우 전자를 선택해야 한다. 더 나아가 디자인을 발전시킬 때 복잡성을 코드에서 데이터로 전환하는 방법을 적극적으로 모색해야 한다.

Linus Torvalds (The Art of Unix Programming, Eric S. Raymond에서 말함)

리누스 토르발스가 말한 내용에 대해 사람들이 토론하는 내용을 보고싶다면 이 StackExchange 게시물을 참고해보자.

(이 리스트에는 추가로 보이거나 좋은 의견이 있다면 계속 추가해나가겠다.)

정리

알고리즘

  • 컴퓨팅 자원은 한정되기 때문이다: 자원을 현명하게 쓰기위해 시간과 공간을 아껴쓰는 알고리즘을 사용할 수 있어야한다.
  • 알고리즘으로 거대하고 복잡한 문제를 비용절감하면서도 효과적으로 해결하기 때문이다
  • 알고리즘의 배경 지식을 알아야 선택의 폭이 늘어나고, 상황에 맞는 결정을 하기 때문이다
  • 알고리즘과 자료구조는 유행을 타지 않는 핵심 지식이기 때문이다
  • 알고리즘은 프로그래밍 문제 해결 능력과 코딩 센스를 기르는 도구기 때문이다

자료구조

  • 자료구조는 알고리즘과 깊은 연관이 있기 때문이다: 자료구조는 알고리즘의 부산물 또는 최종결과물이라 말할 수 있을 만큼 중요하다. 알고리즘은 계산에 관련된 데이터를 조직화하는 작업을 포함하는데, 이는 자연스레 자료구조로 이어진다.
  • 자료구조의 장점과 한계를 알아야 내 용도에 맞게 고르기 때문이다
  • 좋은 자료구조는 코드를 디자인하고 관리하기 쉽게 만들어주지만 아무리 좋은 코드라도 나쁜 자료구조를 보완할 수 없기 때문이다
  • 절차적 논리는 단순하더라도 사람이 검증하기 어렵지만, 복잡한 자료구조는 추론하기 쉽다
--------------------