Top Coder RAW novel - Chapter (9)
탑 코더-9화(9/303)
# 9
갑질을 이기는 기술
────────────────황호근의 발표가 끝나고.
선진 데이터시스템의 평가 위원 중 한 명이 손을 들었다.
“궁금한 게 하나 있습니다.”
황호근이 고개를 끄덕이며 답했다.
“네. 말씀하십시오.”
“사장님께서도 느끼셨겠지만, 검색 도중 갑자기 검색 성능이 높아졌는데요. 혹시 머신 러닝이 적용되어 있는 겁니까? 그걸 통해서 검색을 시도 할 때 마다 성능이 올라간 건가요?”
머신러닝.
근래 인공지능이라는 단어와 함께 가장 많이 회자되고 있는 단어였다. 황호근도 익히 들어 단어의 간단한 의미 정도는 알 고 있었다. 그러나 자신들의 솔루션에 적용 되었다?
그건 금시초문이었다.
“아··· 갑자기 성능이 좋아진 이유는······.”
말을 하며 곁눈질로 최기훈이 앉아 있는 쪽을 살폈다. 어느새 승호가 자리에 돌아와 앉아 있었다. 황호근이 보내는 눈빛의 의미를 알아들은 최기훈이 승호에게 속닥거리며 귓속말을 전했다. 승호가 급히 입을 열었다.
“머신러닝 같은 거창한 기술을 적용한 건 아닙니다. 그건 테라급 이상의 백 데이터가 필요하고, 지속적으로 데이터를 마이닝하여 적용하는 기반 시스템이 만들어져 있어야 하니까요. 시간이 좀 더 주어 졌다면 적용해 볼 수 있었겠지만 오늘은 아니었습니다.”
승호가 입맛을 다시며 말을 이었다.
“중간에 검색 품질이 향상 된 건 시연회를 지켜보며 솔루션 패치를 진행했기 때문입니다.”
안재현이 손을 들었다.
“자, 잠깐만요. 시연회 도중에 패치를 진행했다는 말입니까?”
승호가 고개를 끄덕였다. 그러자 안재현이 이도준을 보며 말했다.
“이 과장님, 시연회 도중 검색 솔루션을 개선하는 건 계약에 어긋나지 않습니까? 만약 그게 허용 되는 거였다면 저희도 하지 않을 이유가 없습니다.”
이도준이 조심스럽게 입을 열었다.
“아 그건··· 계약서를 살펴봐야겠지만······.”
평가위원으로 나와 있던 빅 데이터 분석 팀의 장민재 부장이 나섰다.
“시연회 도중 서버를 멈추지도 않고, 패치를 진행했습니다. 미라클에서 정말 그렇게 할 수 있다는 말씀 입니까? 고작 한 시간 남짓한 시간 안에?”
안재현이 입술을 꽉 깨물었다.
“그, 그건······.”
장민재가 평가 항목이 적혀 있는 문서를 들어 보이며 말했다.
“그리고 오늘 평가 요소에 시연회 도중 패치 허용 여부 같은 건 없었습니다. 지금 대화하는 중이니까. 말 끊지 마세요.”
“아, 알겠습니다.”
냉정한 말투에 움찔 한 안재현이 입을 닫았다. 장민재가 승호를 보며 말했다.
“시내 소프트 쪽 개발자 분 성함이 어떻게 되십니까?”
“강승호입니다.”
“네. 강승호씨 계속 말씀해보세요.”
장민재가 나서자 이도준도 함부로 말 하지 못했다.
“기존 검색 서버가 질의를 할 때 색인 서버는 자신이 보유 하고 있는 색인 데이터에 대해 B-Tree 알고리즘을 활용하여 검색을 진행합니다. 이러한 방식은 정확한 검색 결과를 도출 할지는 몰라도, 유연한 검색결과를 도출해 내지는 못합니다. 왜냐하면 B-Tree의 특성상 leaf 노드에 인덱스가 없으면 검색을 할 수 없기 때문입니다.”
장민재가 의아한 듯 대꾸했다.
“너무 당연한 말씀을 하시는 군요. B-Tree는 애초에 인덱스 되지 않은 데이터는 찾아낼 수 없는 알고리즘입니다.”
승호가 고개를 끄덕이며 말했다.
“맞습니다. 그래서 보완이 필요했습니다. 이를 테면 선진을 선진이나 영문자인 SJ 또는 ‘ㅅㅈ’로 입력하는 사람이 있을 것 같았어요. 그것도 아니면 신진이나 선전 같이 오타를 낼 수도 있겠다고 생각했습니다. 그러한 오타는 검색창의 입력 값을 통해서 나타날 수도 있지만 사용자들이 만들어내는 데이터에도 들어갈 수 있을 겁니다.”
장민재가 바로 입을 열어 대답했다.
“그래서 많은 회사들이 데이터 수집을 통해 분석을 진행하는 겁니다. 사용자의 오타 검색에 대해 검색어를 추천하거나, 다시 정확한 검색어로 찾아주거나.”
“그 방법의 경우는 기업의 솔루션으로는 적당하다고 생각하진 않았습니다. 웹 검색에서처럼 대량 트래픽이 발생 하지 않는 환경에서의 검색이라. 그 수준의 구축이 진행되면 비용 대비 효율이 나오지 않습니다.”
장민재가 고개를 끄덕였다. 일견 타당한 말이었다.
“하긴 선진 그룹 전체 임직원이 10만. 그 중에서 검색 시스템을 사용할 사람은 많아야 5만 명 정도. 그걸 다시 일 사용자로 따지면 수 천 명. 수백에서 수 천 만의 사용자를 거느린 서비스를 그대로 적용하는 건 맞지 않는 옷을 입는 것 과 같겠죠.”
주거니, 받거니.
회의실에 난데없는 토론이 펼쳐졌다. 대화가 길어질수록 이도준의 표정이 구겨졌다. 안재현도 안절부절 하며 어찌 할 바를 몰라 했다. 이도준이 둘의 대화를 가로 막으려 입을 열려 했으나 승호가 한발 빨랐다.
“그래서 간단하게 질의어의 오류나, 생성된 데이터에 들어가 있는 오타도 매칭 하여 찾아 줄 수 있는 보완 모듈을 만들었습니다.”
장민재의 눈이 이채를 발했다.
“시연회 도중에 말인가요?”
승호가 고개를 끄덕이며 대답했다.
“네.”
믿지 못한 장민재가 한 번 더 물었다.
“정말 시연회 도중에 만들었다는 말입니까?”
이번에도 승호의 대답은 같았다.
“네.”
“정말 그렇다면··· 한 번······.”
장민재가 뭐에 홀린 것처럼 중얼 거렸다. 돌아가던 상황을 지켜보던 이도준이 벌떡 자리에서 일어났다.
“시내 소프트 시연회까지 끝났으니 잠시 휴식 시간을 가지도록 하겠습니다. 그 후 평가 위원님들의 총 평을 듣고, 오늘 자리를 마무리 하도록 하겠습니다. 최종 결과는 별도 통보 하겠습니다.”
말을 마친 이도준이 장민재에게 다가가 말을 건넸다.
“하하, 부장님 잠시 쉬면서 커피 한 잔 하시죠.”
그러고는 안재현을 보며 빠르게 눈짓을 보낸다. 슬그머니 자리에서 일어난 안재현이 둘을 따라 나갔다.
황호근이 일행들을 데리고, 회의장을 빠져나왔다. 관심은 단연 승호에게 집중되었다. 황호근이 승호를 보며 물었다.
“뭐야, 뭐가 도대체 어떻게 돌아가는 상황이야. 머신 러닝, 모듈?”
승호가 침착하게 대답했다.
“문서 파싱 하는 프로그램을 만들다 보니 색인 서버에 보완해야 될 점이 보였습니다. 그래서 간단한 모듈을 만들어 적용해 보았을 뿐입니다.”
답은 간단했지만 결과는 간단치 않았다. 최기훈이 입을 떡 벌리며 물었다.
“네가 직접? 한 시간 만에?”
이번에도 승호의 대답은 동일했다.
“네.”
간단하고 명료했다. 박태수가 들고 있던 노트북을 펼치며 승호에게 말했다.
“여기 노트북 가져 왔으니까. 한 번 보여드려. 아까 네가 한 일.”
승호가 노트북의 전원을 켜는 사이 박태수가 깊은 숨을 들이 쉬었다.
“아까 제가 나가서 본 바로는 승호 말이 전부 사실입니다. 눈으로 보면서도 믿기지가 않더라니 까요.
황호근도 두 눈을 동그랗게 뜨며 물었다.
“그, 그러니까 승호 말이 사실이라는 말이지?”
“그렇다니까요. 모니터에 코드가 쫙쫙쫙 생겨나는데 소름이 그냥 막 쫘악∼.”
박태수의 과장된 표현에 최기훈이 헛웃음을 터트렸다. 그 사이 전원을 켜고, 자신이 작성한 코드를 화면에 띄웠다.
“이걸 개발하게 된 계기는 아까 회의실에서 다 말씀 드린 것 같고······.”
최기훈이 재빨리 물었다.
“코드 리뷰 식으로 한 번 해봐. 중요한 내용만 간략하게.”
코드 리뷰.
말 그대로 자신이 작성한 코드에 대해 다른 사람들과 의견을 나누는 행위를 말한다. 승호가 고개를 끄덕이며 말했다.
“그러면 간략하게 말씀 드릴게요. 일단 문서 파싱 부분은 알파 재단에서 나온 poi를 사용했어요. 거기에 나온 오픈 소스 라이브러리를 사용해서 쉽게 구현했고, B-Tree로 검색되지 않는 데이터 검색에는 단어 유사도를 구할 수 있는 레벤슈타인 알고리즘을 적용해서 해결 했습니다.”
당황한 황호근이 중얼 거렸다.
“레, 레벤슈··· 뭐?”
최기훈도 한 번쯤 들어 본 적은 있는 알고리즘이었다. 그러나 직접 구현을 해보거나 사용한 적은 없었다. 말 그대로 들어 본 것 뿐 이었다.
“그 뭐더라. 아! 퍼지 문자열 검색 알고리즘의 일종을 말 하는 거냐?”
승호가 고개를 끄덕였다. 최기훈이 알고 있는 지식도 거기까지가 한계였다. 더 이상 물어볼 말이 없었다. 승호가 설명을 이어나가려는 찰나, 등 뒤에서 익숙한 목소리가 들렸다.
“여기 있었군요. 그러니까 레벤슈타인 알고리즘을 적용했다. 이건 개인 적인 궁금증인데 다메라우-레벤슈타인이 좀 더 향상된 성능을 보이는 것으로 알고 있는데 굳이 레벤슈타인 알고리즘을 적용한 이유가 있을 까요?”
목소리의 주인공은 선진데이터시스템의 장민재 부장이었다. 힐끗 뒤를 돌아본 승호의 대답에는 막힘이 없었다.
“다메라우-레벤슈타인은 전치에 특화 된 알고리즘입니다. 즉 사용자의 오타가 문자의 앞 뒤 바뀜으로 발생한다고 전제하고 있죠. 그 전제가 확실하다는 근거가 없었기에 일반적인 알고리즘을 적용한 것뿐입니다.”
장민재는 고개를 끄덕였고, 최기훈은 마른침을 삼켰다. 황호근은 대부분의 말을 알아듣지 못하고, 멍하니 승호를 볼 뿐이었다. 승호가 장민재를 보면서 말을 이었다.
“물론 미흡한 점도 있었습니다. 버크하드-켈러(BK) 트리를 적용해서 검색 시간 단축 까지 꽤하고 싶었으나, 그러기에는 시간이 부족했습니다. 한 시간 안에 다 하기 에는 손가락이 아파서.”
그건 진심이었다. 빠른 속도로 타자를 친다는 건 생각보다 고된 노동이었다. 이번에는 장민재가 당황했다.
“그, 그렇군요.”
말을 마친 승호가 황호근을 보았다.
“그런데 사장님.”
“으, 응?”
“시내 소프트 기업 비밀을 계속 말해도 되나요?”
장민재의 당혹감이 한층 더 깊어졌다.