❗ 주의! 이 글은 초보 개발자의 생각을 담은 글입니다.
우리가 알고리즘과 자료구조를 의식적으로 고려하게 되는 때는 언제일까? 시스템 프로그래밍을 할 때? 아니면 몇일 후 앞두고 있는 면접을 준비 할 때? 그것도 아니면... 상단의 사진과 같은 알고리즘 문제를 풀 때? 본문의 논제에 대해 생각하기 전에, 한 번 진지하게 생각해보자.
우리는 언제 알고리즘과 자료구조를 의식하면서 프로그래밍을 할까? 🤔
알고리즘과 자료구조의 필요성과 중요성은 개발자들 사이에서 수도 없이 논란이 되는 이슈이다. 잊을 만 하면 거론되는 이슈기도 하다. 필자 역시 이 주제에 대해 고민 한 적이 종종 있다. 물론 고민이라기보단 그저 공부하기 싫은 한 학생의 투정이라고 봐도 무관한 수준이긴 하다.
아직 초보 개발자긴 하지만, 지금까지의 개발 경험을 생각했을 때 알고리즘과 자료구조를 고려하게 되는 때는 극히 드물었고-과하게 말하면 한 번도 없었다-, 그나마 알고리즘과 자료구조를 공부하고 적극 사용하는 상황은 면접을 준비하거나 알고리즘 문제를 풀 때였다. 이쯤되니 '자료구조와 알고리즘은 정말 중요할까?' 라는 생각이 절로 들었다. 사람들은 왜 그리 알고리즘과 자료구조에 집착하는 것일까? 근본적인 나의 궁금증을 풀기 위해 여러 견해를 탐색했고, 나 스스로도 정말 중요도가 있는지에 대해 한 번 깊게 고민해보기로 했다.
수많은 천재들의 견해가 오가는 이 판 속에서, 감히 이 주제에 대한 나의 감상과 견해를 써보고자 한다.
모든 프로그래머들, 아니 대다수의 프로그래머들은 프로그래밍 입문으로 C언어를 택한다. C언어는 모든 언어의 기반이기 때문이다.
처음 C언어를 접하고 배웠을 때를 생각해보자. hello, world!를 처음 출력하고 이후 변수, 배열, 포인터, 함수와 같은 특징을 배우며 간단한 프로그램을 작성하다 자료구조와 알고리즘을 배운 것이 기억 나는가? 어떻게 쓰이는지도 모르고 왜 필요한지도 자세히 모르는 자료구조를 구현 해 보겠다고 포인터와 싸우고, 수많은 에러와 마주하며 좌절하고... 프로그래머 인생에서 첫 벽을 마주하게 되는 것이다. 아마 이 때부터 '내가 프로그래밍을 하고 있다'라는 느낌을 받은 사람이 많을 것이다.
보통 이렇게 큰 벽을 지나게 되면 C를 기반으로 만들어진, 프로그래머가 더욱 쉽게 프로그래밍을 할 수 있도록 도와주는 타 언어를 만나게 된다. Python같은 언어 말이다. C언어만을 공부하다 타 언어를 접하고, 배우게 되는 사람들은 대게 기함을 토하고, 충격받는다.
이렇게 쉬운 언어가 있다고? 심지어 내가 구현하려고 애쓰던 모든 것들이 이미 내장 함수로 구현되어 있잖아! 그동안 정렬을 위해 짜던 몇 십줄의 코드가 단 한 줄로 변하다니...
이런 경우가 한 번 즈음은 있지 않은가? 어떻게던 기능을 구현 해 보겠다며 아등바등하던 과거는 안녕, 내가 원하는 기능들이 이미 다 구현되어 있다니. 그야말로 혁명이라고 할 수 있겠다. 그렇게 우리는 내장 함수를 이용하여 편리하게 코드를 작성하게 되고, 점점 알고리즘과 자료구조에 대한 지식은 저 멀리 구석으로 밀려나게 된다. 그런 생활이 반복되면 결국, 자연스럽게 이러한 생각을 하게 된다.
자료구조? 알고리즘? 이미 다 내장 함수로 구현되어 있는데... 뭐하러 공부하죠?
생각해보자. 편히 사용하라고 만들어진 언어들로 인해 뇌가 굳지는 않았는가?
뇌가 굳은, 편리성으로 인해 자료구조와 알고리즘의 중요성을 잃은 이들에게 한 가지 예시를 들도록 하겠다.
여기, 하나의 카메라가 있다. 이 카메라는 아주 고화질이어서, 마치 내 눈을 통해서 보는 만큼의 화질이 출력된다. 한 치의 틀림도 없이 말이다! 하지만, 고화질인 만큼 사진을 한 장 출력하는 데에 대략 한 시간 정도가 걸린다. 또한 출력 사진의 용량은 장 당 1G가 넘는다! 그렇다면 당신은 이 카메라를 구매하겠는가?
단언컨데, 방금 전 질문에 YES라고 대답 한 사람은 단 한 명도 없을 것이다. 아무리 기능이 좋으면 뭐하나, 효율이 좋지 않으면 버려지고 외면 받기 일쑤이다. 그렇다면, 이 개념에 자료구조와 알고리즘을 도입할 수 있지 않을까?
고화질 카메라를 구매하지 않는 이유는 무엇일까? 바로 좋은 기능에 비해 신속하지 못한 실행 시간 때문이다. 아무리 기능이 좋아도 실행 시간이 좋지 못하면 사람들은 외면 할 것이고, 메모리 효율 또한 좋지 못하다면 이 역시 같은 결과를 초래할 것이다.
즉, 이 고화질 카메라는 자료구조와 알고리즘을 고려하지 않았기 때문에 사람들에게 등한시되고, 버려지게 되는 것이다.
에이, 어짜피 엔지니어링이나 시스템 쪽에서 고려 할 만한 문제인거네. 웹 프론트 개발자 같은 사람들은 크게 신경쓰지 않아도 되는거 아닌가? 너무 low한 고민인 것 같으니 high쪽 종사자들은 고려 할 필요 없겠네.
혹시 아직도 이러한 생각을 가지고 있는가? 흠, 그럼 예시 하나를 더 보도록 하자.
여기에 기능이 아주 대단한 사이트가 있다. 사용자가 원하는 자료를 탐색해달라고 요청하면, 이 웹사이트는 인터넷 상에 자료가 존재하는 한 사용자가 원하는 정보를 정확하게 모아 파일로 만들어 그 파일을 저장할 수 있게끔 해준다. 사용자가 일일이 자료를 검색 할 필요도 없으며, 우리를 괴롭히는 조별과제에서 엉망진창으로 모아진 자료 조사 파일을 한참이나 다시 분석하지 않아도 되니까!
하지만, 이 웹사이트에 다음과 같은 조건이 걸려있다면 어떨까?
우리 웹사이트는 당신이 원하는 정보를 정확히 전달해줍니다. 정보를 탐색하는 데에는 24시간이 걸리며, 파일 크기는 평균 1GB입니다.
고화질 카메라와 비슷한 상황처럼 보이지 않는가? 이 웹사이트도 같다. 아무리 기능이 좋아도, 효율이 좋지 못하기 때문에 수많은 사람들은 이 웹사이트를 이용하지 않을 것이다.
우리는 이 웹사이트가 다시 주목을 받을 수 있게 하는 방법을 아주 잘 알고 있다. 바로 정보를 탐색하는 시간을 최대한 줄이고, 리턴되는 파일 크기 또한 줄이는 것이다. 데자뷰가 느껴지지 않는가?
두 가지의 예시는 모두 극단적이고, 실제로 배포되어서는 안되는 치명적인 단점을 가리키고 있다. 예시가 너무 극단적이기에 '에이, 예시나 저렇지 실제로 저런 경우는 드물지 않나?' 라고 생각하는 사람도 있을 것이다.
하지만 우리는 조금 더 생각해 볼 필요가 있다. 웹 사이트를 만들면서 최적화 작업은 왜 하는 것일까? 수신되는 정보는 조금 늦게 처리하더라도, 페이지 로딩을 더욱 빠르게 하려는 이유는? 왜 삼성에서 출시되는 전자기기는 이전 세대보다 더 빠른 속도를 가지고 있다는 것이 당연시 되는 것일까?
그 이유는 너무 쉽다 못해 자다가 잠꼬대로도 할 수 있을 정도이다. 소비자가 원하기 때문이다. 소비자는 더욱 더 빠르고 눈에 명시적으로 보이는 것을 원한다. 소비자가 원하는 것을 생산하고 배출해야 기업의 매출도 동시에 오른다. 그렇기 때문에 우리는 더욱 더 효율적이고 성능 좋은 것을 추구하는 것이다.
그래서 예시를 든 이유는 무엇인가? 결론은? 두 가지의 예시가 아무리 좋은 기능을 가지고 있어도 등한시 받는 이유는 최악의 실행 시간과 방대한 메모리 때문이었다. 실행 시간과 메모리, 어떠한 것과 연관시킬 수 있지 않을까?
그렇다, 알고리즘과 자료구조이다. 우리는 더욱 좋은 프로그램을 작성하기 위해선, 필수적으로 알고리즘과 자료구조를 공부해야 할 필요가 있는 것이다. 스스로 생각하고, 더 좋은 제품을 개발해내기 위해선 필수적으로 알고리즘과 자료구조가 따라오는 것이다.
그렇다면 어떻게 해야 자료구조와 알고리즘을 잘 한다고 볼 수 있을까? 자료구조 구현을 잘 하면? 알고리즘을 많이 알고 있다면? 이 역시 개인마다 다른 견해를 가지고 있다고 보지만, 필자의 생각은 이렇다.
많은 초보자들이 자료구조를 구현하는 데에 집착한다. 아무리 원리를 이해한다고 해도, 구현하지 못하면 말짱 도루묵 아니냐는 생각을 가지고 스스로 자료구조를 구현할 수 없다면 자료구조를 알고 있다고 단언하지 못한다. 심지어 자신은 그 자료구조에 대해 모른다며 안절부절하고 자책감에 빠지기도 한다.
이런 이들에게 필자는 이런 말을 해주고 싶다. 구현이 완성은 아니다라고.
한 때 필자 역시 자료구조에 대해 알고 있어도 구현하지 못하면 그 자료구조를 알고 있는 것이 아니라는 생각이 들어 초조해하곤 했다. 하지만 지금 필자는 그렇게 생각하지 않는다.
아무리 구현을 할 수 있어도, 이 자료구조가 어떠한 상황에 적절히 쓰이는 지, 어느 자료구조가 적합한지 판단할 수 없으면 말짱 도루묵이기 때문이다. 아무리 구현을 효율적으로 한들 뭐할까, 내가 현재 처한 상황에 어떠한 자료구조를 도입해야 더욱 성능이 좋아지는 지 판단할 수 없으면 그것은 알고 있는 것이 아니다.
그렇기에 나는 구현이 완성은 아니다라고 말해주고 싶은 것이다. 각각의 특징을 파악하고 원리를 이해하고 장단점을 알고 있으면 무작정 코드를 사용 할 때보다 훨씬 더 좋은 결과를 가져 올 테니까.
알고리즘은 이미 너무나도 당연한 기준을 가지고 있기에 긴 말 하지 않도록 하겠다.
알고리즘을 풀어 본 사람이라면 알겠지만, 알고리즘에서 가장 중요시 하는 것은 소모 시간과 효율성이다. 이 알고리즘의 소모 시간이 얼마나 적은지, 얼마나 메모리를 적게 사용하여 효율성을 높이는지를 판단하는 것이다.
그렇다면 이는 어떤 기준에서 판단하는 것일까? 바로 시간 복잡도와 공간 복잡도이다. 한 마디로, 시간 복잡도와 공간 복잡도를 고려하여 알고리즘을 작성한다면 알고리즘의 원리를 잘 파악하고 있다는 소리와 같은 것이다.
프로그래머들 사이에서 수도 없이 고개를 드는 질문이 바로 자료구조와 알고리즘은 정말 중요할까? 이다. 필자는 이 논제에 대하여 YES 라고 생각한다. 그 어느 누구도 아닌, 자기 자신을 위해서 말이다.
끊임없이 성장을 갈구하고 새로운 것을 배워나가야 하는 직업이 바로 프로그래머라고 생각한다. 앞으로 몇십년이고 나아가야 할 배움의 길에서 스스로 생각하고 더 좋은 것을 개발하기 위해 노력하려면, 필수적으로 알고리즘과 자료구조가 이를 받쳐줘야 가능하지 않을까라는 필자의 생각을 주저리 주저리 써보았다.
개발자라면, 프로그래머라면 이 논제에 대해 한 번 쯤은 생각해봐야 하지 않을까?
글 잘 읽었습니다. 일개 학부생이지만, 자료구조와 알고리즘은 개발자에게 정말 중요한 요소라고 생각해서 공감이 됩니다.