Foundry
뉴스 피드 시스템 설계
심화
핵심

점수와 신선도

시간이 지나면 점수가 변한다는 것의 결과

앞 단계에서 후보 수백 건에만 점수를 매기기로 했습니다. 그 점수를 무엇으로 만드는지, 그리고 점수가 시간에 따라 변한다는 사실이 무엇을 강제하는지가 이 절입니다.

점수는 몇 가지의 합이다

작성자와 얼마나 가까운가
반응이 얼마나 많은가
얼마나 새 글인가
내가 이런 종류를 눌러 왔는가

각 항목에 무게를 주고 합칩니다. 처음에는 무게를 사람이 정합니다. 요구사항에 학습 모델이 없으므로 규칙으로 시작하고 재 보면서 고칩니다.

무게를 정할 때 중요한 것은 한 항목이 다른 항목을 압도하지 않게 하는 것입니다. 반응 수는 값의 범위가 크므로(0에서 수만) 그대로 더하면 다른 항목이 의미를 잃습니다. 범위를 좁혀서 더합니다.

신선도가 없으면 오래된 글이 남는다

시간이 지나면 같은 글의 점수가 내려가므로 미리 정렬한 순서가 낡는다 글 하나의 점수 올린 직후 하루 뒤 시간이 지나면 내려간다 감쇠가 없으면 반응이 많았던 오래된 글이 계속 상위에 남는다 그런데 점수가 시간에 따라 변하면 미리 정렬한 순서가 낡는다 모든 글의 점수를 매 순간 다시 계산할 수는 없다 그래서 감쇠는 꺼낼 때 적용하고, 미리 두는 것은 감쇠 이전 점수다

반응 수만 보면 어제 크게 터진 글이 오늘도 1위입니다. 반응은 시간이 지나며 쌓이므로 오래된 글이 유리합니다.

그래서 시간이 지나면 점수를 내립니다. 새 글이 하루 500만 개 올라오는데 어제 글이 계속 상위에 있으면, 사용자는 새로 볼 것이 없다고 느낍니다.

그런데 점수가 변하면 미리 정렬할 수 없다

여기에 앞 절과 충돌하는 지점이 있습니다. 읽기가 60배라서 미리 만들어 두기로 했는데, 점수가 시간에 따라 계속 변하면 미리 정렬한 순서가 낡습니다.

모든 글의 점수를 매 순간 다시 계산할 수는 없습니다. 그래서 점수를 두 부분으로 나눕니다.

부분언제 계산
시간과 무관한 부분 (친밀도, 반응 수, 종류)미리 계산해 둔다
시간에 따라 변하는 부분 (감쇠)꺼낼 때 적용한다

감쇠는 글의 나이만 알면 계산되므로 꺼낼 때 붙이는 비용이 낮습니다. 변하는 부분만 늦게 계산하는 것이 사전 계산과 신선도를 함께 얻는 방법입니다.

반응 수는 나중에 늘어난다

미리 계산해 둔 부분도 완전히 고정은 아닙니다. 글이 올라온 뒤에도 반응은 계속 붙습니다.

올린 직후에 계산한 점수는 반응이 0인 상태의 점수다

이것을 그대로 두면 좋은 글이 초반에 낮은 점수로 굳습니다. 그래서 반응 수가 크게 바뀐 글만 점수를 다시 계산합니다. 전체를 다시 하는 것이 아니라 변한 것만 다시 합니다.

기준을 정해야 합니다. 반응이 10개에서 11개가 된 것은 순서를 바꾸지 않지만, 10개에서 500개가 된 것은 바꿉니다. 순서를 바꿀 만큼 변했을 때만 다시 계산합니다.

면접에서 이렇게 나옵니다

Q.점수에 반응 수를 그대로 더하면 무엇이 문제입니까

값의 범위가 커서 다른 항목이 의미를 잃습니다.

반응 수는 0에서 수만까지 갑니다. 친밀도나 내용 종류가 0에서 1 사이라면, 반응 수를 그대로 더하는 순간 나머지는 없는 것과 같아집니다.

한 항목이 다른 항목을 압도하지 않게 범위를 좁혀서 더한다

그리고 반응 수만 보면 어제 크게 터진 글이 오늘도 1위입니다. 반응은 시간이 지나며 쌓이므로 오래된 글이 유리합니다.

흔한 실수: 무게를 조정해 해결하려는 것. 무게를 아무리 낮춰도 값의 범위 차이가 그대로면 큰 값이 나올 때마다 그 항목이 순서를 정합니다. 범위를 먼저 맞춰야 무게가 의미를 갖습니다.

Q.점수가 시간에 따라 변하는데 어떻게 미리 정렬해 둘 수 있습니까

점수를 두 부분으로 나눠서, 변하는 부분만 꺼낼 때 계산합니다.

부분언제 계산
시간과 무관 (친밀도, 반응 수, 종류)미리 계산해 둔다
시간에 따라 변함 (감쇠)꺼낼 때 적용한다

감쇠는 글의 나이만 알면 계산되므로 꺼낼 때 붙이는 비용이 낮습니다. 모든 글의 점수를 매 순간 다시 계산하는 것은 불가능하지만, 이 나눔으로 사전 계산과 신선도를 함께 얻습니다.

흔한 실수: 감쇠까지 포함한 점수를 미리 저장하는 것. 그러면 저장한 순간부터 낡기 시작해서 일정 시간마다 전체를 다시 계산해야 합니다. 그 비용이 사전 계산의 이득을 없앱니다.

Q.글이 올라온 뒤에 반응이 늘어나면 점수를 어떻게 하시겠습니까

순서를 바꿀 만큼 변했을 때만 다시 계산합니다.

올린 직후에 계산한 점수는 반응이 0인 상태의 점수입니다. 그대로 두면 좋은 글이 초반의 낮은 점수로 굳습니다.

반응 10개에서 11개는 순서를 바꾸지 않는다
10개에서 500개는 바꾼다

그래서 기준을 정해 크게 변한 글만 다시 계산합니다. 전체를 다시 하는 것이 아니라 변한 것만 다시 합니다.

흔한 실수: 반응이 붙을 때마다 점수를 갱신하는 것. 반응은 새 글 수보다 훨씬 많이 발생하므로, 그렇게 하면 갱신이 원래 작성량의 몇십 배가 되어 사전 계산 경로가 먼저 무너집니다.

Q.신선도 감쇠를 얼마나 세게 걸어야 하나요

재 보고 정합니다. 다만 두 방향의 실패가 명확해서 범위는 좁힙니다.

감쇠가 약하면감쇠가 세면
어제 글이 계속 상위에 남는다좋은 글도 몇 시간 뒤 사라진다
새로 볼 것이 없다고 느낀다반응이 쌓일 시간을 못 준다

새 글이 하루 500만 개 올라오므로 자리는 충분합니다. 그래서 대개 감쇠가 약할 때의 문제가 먼저 드러납니다.

흔한 실수: 감쇠를 한 값으로 정하는 것. 글의 성질에 따라 유효 기간이 다릅니다. 실시간 소식은 몇 시간이면 낡고, 긴 글은 며칠 뒤에 읽어도 의미가 있습니다. 종류별로 다르게 두는 편이 실제에 가깝습니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

읽었으면 문제로 확인해보세요

뉴스 피드 시스템 설계 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.