개발자 관련 게시판을 보면 최적화에 관련된 글이 몇몇 있다. 그런데, 많은 개발자들이 왜 그리 지나치게(?) 최적화에 관심이 많은지 의아하다. 최적화를 잘못하면, 프로그램 전반적 속도를 더 느리게 할 수도 있다는 말에 동의하는가?
최적화는 단순히 몇가지 팁, 예를 들어 실수형 대신 정수형을 사용한다든가, if문 대신에 case문을 사용한다 같은, 최적화 관련 몇몇 팁 적용만으로 프로그램 속도가 비약적으로 빨라질 것이라고 생각하는가? 아주 간단한 프로그램이라면 이런 류의 팁으로 성과를 거둘 수 있을지도 모른다. 그러나, 일반적 상용 프로그램같이 덩치가 큰 프로그램일 경우, 이런 류의 최적화 팁들은 거의 무용지물이다.
최적화는 프로그램 최종단계에서 해야한다고 많은 고수 개발자들이 동의한다. 이말을 대충 허접하게 코딩하고 마지막에 모조리 디버깅해도 된다는 말로 오해하지는 마시라. 디버깅은 항상 개발 과정중에 일부로 항상 포함되어야 하며, 디버깅과 최적화는 전혀 다른 개념이다.
최적화를 할 때 가장 조심해야 할 것이, 자신의 섯부른 개발 경험을 믿지 말라는 것이다. 잘못된 경험은 편견을 만들고, 편견은 문제를 직시하는데 매우 좋지 않은 영향을 미친다. 최적화에서 최우선 고려사항은 프로그램 요구사항, 즉 사용자의 만족도이다. 일년에 한번만 실행되는 리포트 출력을 최적화하기 보다는, 매일 출력해야 하는 일계표 출력을 더욱 최적화해야 할 것이다.
동일한 이유로 프로그램 실행 중, 단 한번 실행될지 말지 긴가민가하는 루틴을 최적화하기 보다는, 10만번 반복하는 반복문 안에 있는 루틴을 최적화해야 할 것이다. 최적화할 때는 직관으로 하기 보다는 프로파일러를 사용하여, 어떤 루틴이 병목현상을 일으키는지는 정확히 찾아내고 그 부분을 최적화해야 한다. 프로파일러는 어떤 루틴의 실행속도와 반복 횟수를 검사하는 툴이다. 이런 툴을 사용하지 않고, 특정 루틴을 무조건 최적화해야 한다고 단정지으면, 프로그램 전반적 실행속도와는 전혀 관계없는 최적화가 될 수도 있다.
다시 말해서, 최적화는 프로그램 성능을 높이는데 크게 기여할 부분에 집중해야하지, 아무런 곳이나 무작정 최적화를 하면, 프로그램이 복잡하게 되고, 자칫 도리어 전체적 성능을 저하시킬 수도 있다는 것이다. 공룡 발톱 깍기 식으로 최적화를 하지 말라. 이 말인즉, 공룡의 몸무게를 줄이려면 공룡의 긴 꼬리나, 뱃살을 줄여야지, 공룡 발톱을 좀 깍아 준다고 해서 공룡의 몸무게가 확 줄어들지 않는다는 것이다.
예를 들어 DB업무용 프로그램이라면 Delph 코드 보다, SQL문 최적화에 더욱 중점을 두어야 하며, 통신 프로그램이라면 통신량 최적화에 더욱 중점을 두어야 한다. 이런 류의 프로그램에서 일반적인 최적화 팁들은 거의 무용지물이다.
최적화는 부작용을 유발한다. 이말인즉, 최적화는 기존 코드의 변형을 요구하기 때문에, 최적화 과정 중에 기존 코드를 복잡하게 만들 수 있다. 예를 들어 로칼 변수보다는 전역 변수의 참조속도가 더 빠르며, 메서드 보다는 전역 함수가 일반적으로 실행속도가 더 빠르다. 묻지마 최적화가 최우선이라면, 모든 로칼 변수와 메서드를 없애고, 전역 함수와 전역 변수만 사용
해야 할 것이다. 이런 경우, 아주 간단한 프로그램이면 괜찮겠지만, 자칫 프로그램 소스를 엄청나게 복잡하게 만들어서 후일 유지보수에 매우 악영향을 미치게 된다.
나의 경험에 따르면, 코드 구조를 꽈배기처럼 비틀어서 후일 유지보수를 어렵게 만드는 최적화라면, 매우 중요한 당위성이 있지 않는한 피하라는 것이다. 코드 구조의 간결화 유지와 최적화 중 어느 것을 우선시해야 한다고 묻는다면, 나는 당연히 코드 구조 간결성이다.
어떤 글에서 최적화가 객체지향이나 리팩토링보다 더욱 중요하다는 다소 어이 없는 글을 본적이 있다. 여러분들은 어떻게 생각하는가? 나는 반대로 생각한다. 최적화 보다는 객체지향이나 리팩토링이 더욱 중요하다. 객체지향과 리팩토링에 익숙한 개발자라면 상당히 경험있고 실력자이다. 객제지향과 리팩토링에 익숙한 경험있는 개발자가 최적화가 엉망인 프로그램을 만들 것 같다고 생각하는가? 그리고 객체지향적으로 리팩토링하는 도중에 코드가 자동적으로 최적화 될 수 있다는 것을 아는가?
잘 리팩토링된 코드는 후일 최적화할 때 병목현상을 찾기도 쉽고, 그 부분만 집중적으로 최적화하기 더 쉽다는 사실을 동의하시는가? 객체지향과 리팩토링은 개발론에서 기초 과목이다. 이런 기초 과목을 등한시 한채, 최적화 관련 팁이라는 단기 강의에만 집중한다고 해서 올바른 프로그램이 만들어 질 수 있다고 보는가?
실수 대신 정수, 메서드 대신 전역함수, 로칼 변수 대신 전역변수, if대신 case, 이런 묻지마 식의 최적화 팁을 모조리 적용하면, 사용자들이 아무런 불만이 없는 빠르고 최적화된 프로그램을 만들 수 있을 것 같은가? 내 경험에 의하면 전혀 아니다.
최적화는 오랜 개발 경험으로 이뤄진다. 단순히 최적화 관련 개발팁들의 적용만으로 프로그램 속도가 비약적으로 빨라지기를 기대하지 말라.