함수 이름을 모를 때
jevgrep을 보며, 동작으로 코드를 찾는 질문이 구체적인 함수 이름으로 바뀌는 순간을 생각했다.

그 코드는 어디에 있더라
처음 보는 저장소에서 요청 재시도를 고쳐야 한다고 해보자. 증상은 안다. 서버 응답이 늦으면 같은 요청을 다시 보낸다. 그런데 그 일을 하는 함수 이름을 모른다.
검색창에 retry를 넣어 볼 수 있다. 설정 파일과 테스트, 주석이 나온다고 치자. 정작 요청을 보내는 코드는 공통 클라이언트 뒤에 숨어 있다. 재시도라는 단어가 적힌 곳을 다 읽고 나서도, 내가 고칠 요청이 그 길로 가는지는 아직 헷갈린다.
이럴 때 옆 사람에게 묻고 싶은 말은 짧다. ‘시간 초과되면 다시 보내는 거, 어디서 해요?’
jevgrep은 그런 질문으로 코드를 찾게 하는 도구다. 공식 문서는 저장소에 동작을 질문하면 관련 파일과 읽을 지점, 줄 위치가 붙은 원문을 돌려준다고 소개한다. 나는 설치해서 써 본 후기를 쓰는 중은 아니다. 문서와 공개 출력 예시를 읽고, 낯선 코드를 찾아가는 이 장면을 떠올렸다.
책 제목을 모른 채 도서관에 들어간 기분과 조금 비슷하다. ‘주인공이 매일 같은 날을 사는 책인데요’라고 물어볼 수는 있다. 먼저 제목을 알아야만 검색할 수 있다면, 질문은 그 자리에서 빙빙 돈다.
첫 페이지를 펼친 다음
문서에서 마음에 든 것은 결과에 실제 소스가 붙는다는 점이었다. 공개된 출력 예시에는 다른 클래스의 메서드로 넘기는 짧은 코드와, 그 메서드가 있는 파일이 함께 나온다. 읽던 줄에서 다음 파일로 넘어갈 손잡이가 있다.
가상의 재시도 문제에서도 그런 손잡이를 원한다. 누군가 ‘공통 클라이언트 쪽을 보세요’라고 알려 주면 좋겠지만, 거기서 어떤 함수를 열어야 하는지까지 보이면 더 좋다.
첫 소스에서 sendWithPolicy라는 이름을 발견했다고 가정해 보자. 이제 그 이름으로 호출하는 곳을 찾을 수 있다. 막연했던 질문에 검색할 단어가 생겼다.
함수 안에 재시도 분기가 있다고 해서 내가 찾던 요청의 설명이 바로 끝나지는 않는다. 그 함수를 부르는 쪽에서 어떤 정책을 넘기는지도 읽어야 한다. 예를 들어 같은 클라이언트를 쓰는 두 경로 중 한쪽만 재시도를 켜도록 작성돼 있을 수 있다.
이 예에서는 함수 본문을 찾은 뒤에 오히려 질문이 작아진다. ‘재시도를 어디서 하지?’가 ‘이 호출에서는 어떤 정책을 넘기지?’로 바뀐다. 다음에 읽을 줄을 고를 수 있게 된다.
코드를 찾는 도구에 기대하는 도움도 이쪽에 가깝다. 처음부터 저장소 전체를 이해한 사람처럼 설명해 주는 것보다, 내가 다음 문장을 읽을 자리를 찾아 주면 좋겠다.
같은 이름의 다른 길
jevgrep의 아키텍처 문서는 구문 분석과 읽을 지점 안내가 실제 실행 시 호출될 메서드를 증명하는 것은 아니라고 범위를 적어 둔다. 코드의 위치와 실행의 선택은 연결해서 읽어야 한다는 말로 받아들였다.
상속받은 메서드, 환경에 따라 고르는 구현, 호출할 때 넘기는 옵션을 생각하면 그 구분이 이해된다. 이름이 같아도 어떤 객체와 설정을 거쳐 들어왔는지에 따라 봐야 할 코드가 달라질 수 있다.
그래서 첫 결과를 읽고 나면 익숙한 일을 다시 하게 될 것 같다. 정확한 이름으로 참조를 찾고, 호출하는 쪽을 열고, 설정이 어디서 들어오는지 본다. 동작을 설명하는 질문으로 시작했어도 중간부터는 구체적인 이름이 필요해진다.
검색이 비어 있을 때도 마찬가지다. 내가 물은 범위와 도구가 살펴본 범위를 확인해야 한다. 문서에는 탐색 예산에 도달한 결과를 부분 탐색으로 알린다고 쓰여 있다. 그런 결과라면 질문이나 검색할 루트를 좁혀 다시 볼 이유가 있다. 빈 목록만 보고 기능이 없다고 결론내리기는 이르다.
반대로 이미 함수와 경로를 알고 있다면 바로 그 파일을 열면 될 일도 많겠다. 매번 도서관 안내 데스크에 들를 필요는 없다. 책장 위치를 외웠다면 그냥 걸어가면 된다.
이제 이름 하나는 안다
가상의 재시도 작업에 남길 메모를 생각해 본다. ‘관련 코드 찾음’보다는 어떤 요청에서 시작해 어느 호출을 거쳐 어떤 정책에 도착했는지를 짧게 적고 싶다. 다음 사람이 그 줄들을 다시 열 수 있도록.
정적인 소스만 읽었다면 메모도 거기까지다. 실제 요청을 실행해 관찰한 내용은 따로 남겨야 한다. 문서를 읽은 나 역시 이 글에서 특정 저장소의 재시도 동작을 확인했다고 말할 수는 없다.
그래도 처음보다 상황은 낫다. 이름을 몰라서 시작하지 못했던 질문이, 다음에 찾아볼 이름 하나를 얻었다.
이제 sendWithPolicy를 검색할 수 있다. 내가 고칠 요청은 어느 쪽에서 이 함수를 부르고 있을까.

