오후 2시 아내에게 전화가 왔다.
"6시에 전세계약 서명해야 하니까, 회사에서 일찍 출발해서 늦지 않게 와야해. 알았지?"
당시 회사에서 퇴근길은 지독한 교통 체증으로 유명했다. 출퇴근 40킬로 정도 되는 거리지만 2시간은 넘는 시간을 생각해야 했다. 좀더 일찍 출발해야 했지만 업무가 많아 4시 조금 넘어서 출발했다.
마음이 조급했지만 한가지 믿는 구석이 있었다. 그건 네비의 최소거리 옵션이다. 최소거리를 검색해보니 6시 조금 안되는 시간 도착으로 되었다.
'아싸, 네비 덕분에 빠른 경로로 갈 수 있네.'
그런데, 네비 따라 가면서 조금씩 불안감이 늘어갔다. 내가 모르는 길을 가는 것도 그렇지만 새로운 길 또한 만만찮게 막히고 있었다. 네비는
"경로를 재탐색합니다."
라는 말을 반복했고 등골에 땀이 쏟아지기 시작했다. 도착 예정시간은 6시를 넘기고 있고 아내에게 재촉 전화는 몇 분 간격으로 걸려왔다.
결국 난 약속시간을 30분 초과해서 도착을 했고 계약자와 공인중개사 모두 내 덕에 모두 늦게까지 기다리게 되는 민폐를 끼치게 되었다.
이 사건은 10년도 넘은 일이다. 지금의 네비게이션의 프로그램 알고리즘은 훌륭하다. 무엇보다 교통 정보에 대한 실시간 업데이트 속도도 빠르고 검색되는 경로도 무난하게 안내한다. 새로운 길을 가더라도 걱정하는 사람들은 거의 없을 것이다. 거리의 골목길까지 거의 정확하게 안내를 해 준다.
내가 하는 검사 알고리즘도 유사한 방식이다. 현장의 복잡한 검사 과정에서 중요한 요소를 골라내고 주변 환경값을 이용해서 프로그래밍하게 된다. 지도같이 많은 항목이 있는 것처럼 카메라로 TV 글라스를 찍으면 수천만 화소 이미지에 복잡한 패턴이 나온다. 네비가 지도의 많은 지형들을 단순화 하듯, 내 소프트웨어도 이미지를 단순화시켜 가장 불량 가능성이 높은 곳을 먼저 찾는다.
그렇다면 네비게이션은 정말 사람이 길을 찾는 것보다 훨씬 잘 찾는 것이 맞을까? 네비게이션이 빠른 길을 찾는 알고리즘은 '그래프 탐색 문제'라고 부른다. 프로그램 대회에서도 단골로 나오는 문제가 최단 경로 찾기다.
먼저, 지도 상 교차로를 노드(node), 도로를 간선(edge)로 단순화시킨다. 그래서 출발점에서 도착지까지 가장 짧은 거리의 노드를 선택하고 노드에서 갈 수 있는 주변 길을 찾게 된다. 그 과정에서 실시간 교통정보, 신호등, 고속도로 vs 일반도로, 통행료 등과 같은 가중치(weight)가 들어간다.
알고리즘이 이런 것이다. 복잡한 현상을 단순화하고 그 과정에서 발생될 수 있는 요소를 고려하면서 최적화해 나가는 과정이다. 그래서 알고리즘 개발자는 프로그래밍 능력 뿐만 아니라 현장 경험이 매우 중요하다. 네비게이션이 지금의 성능이 오기까지 20년 넘는 경험이 축적되어 이제 내가 신뢰를 할 수 있게 된 것 처럼 말이다.
매일 운전하면서 나는 네비게이션이 선택해 주는 길을 보며 그리고 다른 길을 선택하는 옵션을 보며 이 녀석의 선택이 정말 옳았는지 나와 대결을 해본다. 녀석의 알고리즘이 선택한 길과 내가 생각한 길 중 어느 것이 최적일까? 오늘도 출근길, 네비가 고른 길 대신 내가 고른 길로 핸들을 꺾는다. 나도 25년짜리 알고리즘이니까. 오늘의 스코어는 아직 알 수 없다.