흔히들 개발자에게 알고리즘은 실무 개발과는 동떨어진 주제라고 여겨진다. 특별한 목적을 위해 알고리즘을 직접 만들거나 전문적으로 활용하는 소수의 개발자를 제외하고, 애플리케이션이라 불리는 다수의 사용자가 있는 IT 시스템을 개발하는 경우 알고리즘이란 말은 현장에서 거의 사용되지 않는 것처럼 보인다. 정렬이나 검색 같은 알고리즘이 필요하다면 잘 만들어진 라이브러리를 사용하거나 검색엔진처럼 그 기능에 최적화된 서비스를 사용하면 된다. 그래서 알고리즘은 취업이나 이직에서 요구되는 코딩 테스트나 인터뷰를 통과하기 위해 잠시 공부해야 하는 일회성 도구처럼 취급된다.
하지만 과연 그럴까? 자바의 가장 인기 있는 프레임워크인 스프링의 레퍼런스 문서와 소스 코드를 살펴보면 알고리즘이라는 단어가 상당히 많이 등장한다. 대표적인 스프링 기술인 스프링 MVC의 핵심인 DispatcherServlet 클래스는 웹 요청을 처리하기 위한 공통의 알고리즘을 제공하는 책임을 갖는다고 공식 문서에 소개돼 있다. 이 외에도, 의존성 주입DI에 관한 문서를 보면 스프링이 의존 오브젝트를 찾아서 생성자로 주입해줄 때 사용하는 알고리즘에 대한 설명이 나온다. 아울러 스프링 테스트에서 DataSource를 찾는 방법도 알고리즘으로 이야기한다. 이렇게 스프링의 기술을 잘 이해하기 위해서는 스프링의 각 기술에 적용된 알고리즘을 이해하는 것이 필수다. 결국 스프링을 사용하는 개발자라면 누구보다도 알고리즘과 매우 긴밀하게 일을 하고 있는 셈이다.
더욱이, 기술을 이해하고 사용하는 데만 알고리즘이 필요한 게 아니다. 애플리케이션의 로직을 담은 컴포넌트와 코드를 작성하는 것 또한 사실상 알고리즘을 만들고 구현하는 과정이다. 스프링의 빈bean 컴포넌트 사이의 의존 관계 주입은 디자인 패턴 중 전략 패턴으로 설명된다. 스프링의 핵심은 런타임에 사용할 의존 오브젝트를 자유롭게 변경함으로써 유연하지만 견고한 애플리케이션을 개발하는 것이다. 전략 패턴은 런타임에 알고리즘을 자유롭게 교체할 수 있게 해주는 디자인 패턴이다. 그러니까 스프링은 결국 비즈니스 로직을 담은 알고리즘을 유연하게 확장하고, 교체하고, 합성해서 애플리케이션을 만들게 해주는 도구인 셈이다. 따라서 스프링 개발자라면 날마다 알고리즘을 설계하고 이를 조합해서 시스템을 만든다고 봐도 무방하다.
물론 알고리즘 인터뷰에 자주 등장하는 유명 알고리즘과 현장에서 다양한 도메인의 문제를 풀기 위해 매일 설계하고 구현해야 하는 알고리즘은 흡사 다르게 보이기도 한다. 그래도 결국 코드로 구현 가능한, 문제를 해결하는 방법과 절차라는 점에서는 유사하다. 문제를 해결할 때 시간과 공간을 어떻게 활용하는지에 주의를 기울여야 한다는 점도 비슷하다. 많은 양의 데이터를 적합한 자료구조에 담아 애플리케이션으로 가져와서 최적화된 메모리를 사용하면서 빠른 시간 내에 결과를 만들어내도록 실전 알고리즘을 구상하고 코드로 구현해내는 것이 급격하게 성장하고 꾸준히 복잡해지는 오늘날 서비스 개발자에게 요구되는 중요한 실력임이 분명하다.
개발자라면 알고리즘의 기초를 익혀야 하며, 자신이 사용하는 도구의 근간이 되는 프로그래밍 언어의 특징을 잘 파악하고 활용할 수 있는 훈련이 필요한데, 이 책 『자바 알고리즘 인터뷰 with 코틀린』은 그 점에서 탁월하다. 2장부터 이어지는 자바, 코틀린, 자료형에 관한 설명은 언어라는 도구를 최적의 알고리즘을 만들려면 어디까지 들여다보고 실험해야 하는지 모범을 보여준다. 자바와 코틀린을 태생부터 관심을 갖고 사용해왔던 나조차 미처 생각해보지 않은 영역까지 탐험하고 이를 바탕으로 이후 알고리즘을 전개하는 내용에선 감탄을 금하지 않을 수 없었다.
알고리즘 대회나 인터뷰를 위한 서적이나 자료를 훑다 보면 요즘 개발자들이 관심을 많이 갖는 클린 코드 관점에서 아쉬움이 느껴지는 코드를 많이 만나게 된다. 제한된 시간에 답을 내기만 하면 코드는 어떻게 만들고 구성해도 상관없다는 오해를 주면 어쩌나 하는 걱정이 들기도 한다. 그런데 이 책의 알고리즘 풀이 예제를 보면 간단한 구조이지만 적절한 모듈 분리, 의미 있는 네이밍, 읽고 이해하기 좋게 코드를 만들려는 저자의 강한 의지가 느껴진다. 이 책에 ‘실무’라는 단어가 얼마나 자주 등장하는지를 살펴본다면 이 책이 단순히 코딩 테스트 준비만을 위한 책 이상임을 알게 될 것이다. 당장 코딩 테스트와 인터뷰에서 필요한 지식을 쌓고 훈련을 하기에 좋을 뿐만 아니라, 이후에 애플리케이션을 만들 때 문제를 해결하는 가장 좋은 방법을 찾으려는 수고의 가치와 결과가 무엇인지 잊지 않게 해줄 수 있는 이 책은 개발자의 좋은 길잡이이자 동반자가 되어줄 것이다.
- 이일민 (이프릴 대표, 『토비의 스프링』 저자)
언뜻 보면 이 책은 저자의 유명한 전작인 『파이썬 알고리즘 인터뷰』를 단순히 자바 버전으로 출간한 듯 보이지만, 전혀 새로운 콘셉트의 책이라 할 수 있다. 이 책에 실린 실습 예제는 자바와 코틀린으로 제공되는데 이렇게 두 가지 언어로 함께 제공하는 것이 이 책의 가장 큰 장점이자, 또 다른 재미를 안겨준다. 아울러 이 책에서는 파이썬 코드 구현 의견도 제시해주기 때문에 알고리즘을 구현할 때 세 가지 언어를 비교하며 설명해주는 점이 더욱 흥미로웠다. 또한 전반적인 알고리즘 설명 외에도 특히, 왜 알고리즘을 사용해야 하는지, 실제 업무에서는 어떻게 활용해야 하는지 등 평소 고민했던 부분에 큰 도움을 받았다.
- 박찬웅 (소프트웨어 개발자)
기업은 개발자를 뽑을 때 일차적인 검증 수단으로 코딩 테스트를 봅니다. 이 책은 리트코드 문제를 선별해 출제자의 의도와 문제 해결 방법을 엿볼 수 있습니다. 알고리즘 개념 정리가 필요하거나 자바와 코틀린 언어로 코딩 테스트를 준비하는 분에게 이 책을 추천합니다.
- 오동주 (안드로이드 개발자)
이 책을 전작의 개정판으로 생각할 수도 있지만, 전혀 다른 언어인 자바를 사용하기에 다른 책이라고 봐도 좋다고 생각합니다. 파이썬을 공부하면서 전작을 읽었고 많은 도움을 받았습니다. 꼭 코딩 테스트를 위해서가 아니라 자바나 코틀린을 처음 접하는 책으로도 좋다고 생각합니다.
- 이상우 (카카오, 톡메시징파트 개발자)
신입 개발자를 위한 필수 자료구조 책을 소개합니다. (제가 아는 한) 코틀린을 통해 코딩 인터뷰/테스트를 다루는 첫 번째 책이기도 합니다. 필수적인 기본 자료구조뿐만 아니라 그리디 알고리즘이나 다이나믹 프로그래밍 같은 고급 주제까지 다루기에 폭넓은 주제를 공부할 수 있습니다.
- 정현준 (AtlasLabs, VP of Engineering)
취미 삼아 해커랭크라는 사이트에서 C++와 파이썬으로 종종 문제를 풀었지만, 항상 풀이해 설에 대한 갈망을 느끼며 좀 더 나은 알고리즘은 없는지 늘 궁금했다. 이 책에서는 평소에 등산로를 결정하는 일처럼 우리 앞에 놓여 있는 여러 가지 선택지 중 왜 이런 선택(문제 풀이 방법)을 하게 되었는지에 대한 식견은 물론, 자바와 코틀린 소스 코드를 동시에 보여준다. 이 책을 베타리딩하며 그간 내가 느껴왔던 갈증을 풀어줄 책임을 확신했다. 아니 나뿐만이 아니라 이 책을 읽는 많은 이들이 이 말에 동감하지 않을까?
- 채민석 (integrate.io, APAC 담당 세일즈엔지니어)
『파이썬 알고리즘 인터뷰』를 읽으면서 내용이 너무 좋아서 ‘언젠가 내게 더 익숙한 자바/코 틀린 기반으로 책이 나오면 얼마나 좋을까?’라는 생각을 했었는데, 정말로 나왔군요! 베타 리더로 참여하면서 읽어봤는데, 코딩 인터뷰 관련 책을 이보다 잘 쓸 수 있을까 싶을 정도로 너무 잘 쓰인 책입니다.
- 홍수영 (LINE, 서버사이드 소프트웨어 엔지니어)