메모 한 줄로는 안 막혔다
3주 전에 나는 메모 한 줄을 남겼다. 판단에 쓰는 숫자는 만들어지는 자리가 하나여야 한다는 내용이었다. 리프파트너스 리포트에서 모든 종목에 동일하게 적용해야 하는 계산값을 정할 때, 그 값을 만드는 통로가 두 곳이면 언젠가 둘이 어긋난다는 뜻이었다. 옳은 메모였다. 그런데 오늘 같은 모양의 사고가 네 번 더 났다.
가장 선명하게 드러난 건 마이크로소프트였다. 같은 회사, 같은 시각에 기업이 실제로 벌어들이는 돈을 표준값으로 계산했는데, 한쪽은 570억, 다른 쪽은 938억이 나왔다. 65% 차이다. 원인을 뜯어보니 그 값을 찾아오는 통로가 두 개였다. 최근 만들어 둔 결과물을 다시 읽어오는 낡은 통로가 여전히 살아 있었고, 원본 공시를 새로 읽는 통로와 나란히 코드에 남아 있었다. 어느 쪽이 불리느냐에 따라 같은 종목의 답이 달라졌다.
이번 주에 처음으로 20개 종목을 실제로 끝까지 돌려 보는 확인 절차를 만들었다. 그동안 쌓아 온 검사 665개는 전부 부품 하나하나가 맞는지만 봤다. 부품은 다 맞는데 조립했을 때 어긋나는 경우는 그 검사로는 보이지 않는다. 실제로 돌려 보니 20개 중 2개만 온전한 리포트로 나왔고, 막힌 것들 가운데 상당수가 같은 이유였다. 값을 만드는 자리가 하나가 아니었다.
이 문제를 오늘 처음 본 게 아니라는 점이 마음에 걸렸다. 3주 전 메모에 이미 답을 적어 놓았는데도 같은 모양이 반복됐다. 혼자 코드를 짜다 보면 어제의 내가 남긴 메모를 오늘의 내가 그냥 지나치는 일이 생각보다 자주 일어난다. 팀이라면 리뷰하는 사람이 잡아 줬을 자리인데, 그 자리를 메모로 대신하려 했고 메모는 그 역할을 못 했다.
그래서 오늘은 메모를 하나 더 쌓는 대신 코드에 문을 달았다. 모든 종목에 똑같이 쓰여야 하는 값을 선언해 둔 자리를 정하고, 이제 그 값을 다른 자리에서 직접 가져다 쓰면 실행이 그 자리에서 멈추도록 만들었다. 값을 쓰려면 반드시 정해진 통로를 거치게 한 것이다. 규칙을 다시 적는 대신 규칙을 어길 수 있는 길 자체를 없앴다.
이 문이 정답을 보장하지는 않는다. 값이 나가는 문을 하나로 좁힐 뿐이다. 다만 리프파트너스가 파는 것이 결국 숫자에 대한 신뢰라서, 계산이 어긋나면 글이 아무리 정성스러워도 소용이 없다. 오늘 확인한 건 그 신뢰가 다짐으로 지켜지지 않는다는 것이다. 구조로 지켜진다.