개발자를 위한 트렌드 레이더를 만들었습니다 — 스코어링 엔진이 작동하는 방식
Source: Dev.to
개발자를 위한 트렌드 레이더를 만들었습니다 – 스코어링 엔진은 이렇게 동작합니다
최근 몇 달간, 저는 개발자 커뮤니티에서 떠오르는 기술과 도구를 추적하기 위해 Trend Radar라는 서비스를 만들었습니다. 이 글에서는 그 핵심인 스코어링 엔진이 어떻게 설계되고 구현됐는지 자세히 설명합니다.
1. 목표
- 실시간으로 새로운 트렌드를 감지
- 객관적인 점수를 부여해 트렌드의 인기도와 성장성을 비교
- 투명한 로직을 제공해 사용자가 결과를 이해하고 신뢰하도록 함
2. 데이터 소스
| 소스 | 설명 | 업데이트 주기 |
|---|---|---|
| GitHub Trending | 현재 가장 많이 스타를 받고 있는 레포지토리 | 매일 |
| Stack Overflow 질문 | 특정 태그에 대한 질문 수와 답변 비율 | 매시간 |
| Reddit /r/programming | 언급량과 업보트 수 | 30분마다 |
| Hacker News | 기사와 댓글 수 | 매시간 |
| NPM / PyPI 다운로드 | 패키지 다운로드 횟수 | 매일 |
각 소스는 API 혹은 스크래핑을 통해 데이터를 수집하고, 공통 포맷(trend_id, timestamp, raw_metric)으로 저장합니다.
3. 스코어링 모델 개요
스코어링 엔진은 3단계 파이프라인으로 구성됩니다.
- 정규화(Normalization) – 서로 다른 메트릭을 0~1 범위로 변환
- 가중치 적용(Weighting) – 각 데이터 소스와 메트릭에 비즈니스 로직에 맞는 가중치를 부여
- 합산 및 스무딩(Aggregation & Smoothing) – 최종 점수를 계산하고 급격한 변동을 완화
아래 다이어그램은 전체 흐름을 시각화한 것입니다.
raw_metric → normalize() → weight() → aggregate() → smooth() → final_score
4. 정규화 단계
def normalize(value, min, max)
return 0 if max == min
(value - min).to_f / (max - min)
end
- min / max 값은 지난 30일 동안 수집된 데이터의 최소·최대값을 사용합니다.
- 로그 스케일이 필요한 경우
Math.log1p를 적용해 왜곡을 방지합니다.
5. 가중치 적용
가중치는 두 가지 차원으로 나뉩니다.
| 차원 | 설명 | 기본 가중치 |
|---|---|---|
| 소스 가중치 | GitHub, Stack Overflow 등 각 소스의 신뢰도 | GitHub: 0.4, SO: 0.3, Reddit: 0.15, HN: 0.1, 패키지 매니저: 0.05 |
| 메트릭 가중치 | 스타 수, 질문 수, 언급량 등 각각의 중요도 | 스타: 0.5, 질문: 0.3, 언급: 0.2 |
가중치는 JSON 형태로 관리되며, 필요 시 UI에서 실시간으로 조정할 수 있습니다.
{
"source_weights": {
"github": 0.4,
"stack_overflow": 0.3,
"reddit": 0.15,
"hacker_news": 0.1,
"package_manager": 0.05
},
"metric_weights": {
"stars": 0.5,
"questions": 0.3,
"mentions": 0.2
}
}
6. 합산 및 스무딩
6.1 합산
def weighted_score(normalized, source_weight, metric_weight)
normalized * source_weight * metric_weight
end
각 트렌드에 대해 모든 조합의 가중 점수를 더해 raw_score를 얻습니다.
6.2 스무딩 (Exponential Moving Average)
급격한 변동을 완화하기 위해 EMA를 적용합니다.
def ema(previous, current, alpha = 0.3)
alpha * current + (1 - alpha) * previous
end
alpha값은 0.2~0.4 사이에서 실험적으로 결정했습니다.- 첫 번째 값은 단순히
current를 사용합니다.
7. 최종 점수와 랭킹
스코어는 0~100 사이로 스케일링됩니다.
def scale_to_100(score)
(score * 100).round(2)
end
이후 데이터베이스에 저장하고, 매일 랭킹을 재계산합니다.
SELECT trend_id, final_score
FROM trend_scores
ORDER BY final_score DESC
LIMIT 20;
8. 구현 상세
- 언어: Ruby 3.2 (Rails 7)
- 백그라운드 작업: Sidekiq + Redis (15분마다 실행)
- 스토리지: PostgreSQL (JSONB 컬럼에 원시 메트릭 저장)
- 모니터링: Prometheus + Grafana (스코어 변동 그래프)
주요 파일 구조
app/
└─ services/
├─ scoring/
│ ├─ normalizer.rb
│ ├─ weight_calculator.rb
│ └─ aggregator.rb
└─ data_fetchers/
├─ github_fetcher.rb
├─ stack_overflow_fetcher.rb
└─ reddit_fetcher.rb
9. 결과 예시
| 순위 | 트렌드 | 최종 점수 |
|---|---|---|
| 1 | Rust | 92.4 |
| 2 | Svelte | 88.1 |
| 3 | Deno | 85.7 |
| 4 | GraphQL | 82.3 |
| 5 | Tailwind CSS | 80.9 |
점수는 시간에 따라 변동되며, 급격히 상승하거나 하락하는 경우 알림을 통해 커뮤니티에 공유합니다.
10. 앞으로의 계획
- 머신러닝 모델 도입 – 과거 트렌드 데이터를 학습해 미래 성장 가능성을 예측
- 사용자 맞춤형 피드 – 개인 관심사에 기반해 점수를 가중치 조정
- 다국어 지원 – 비영어 커뮤니티 데이터를 추가해 글로벌 트렌드 파악
11. 마무리
스코어링 엔진은 투명성과 확장성을 최우선으로 설계되었습니다. 코드를 오픈소스로 공개했으니, 관심 있는 분들은 직접 살펴보시고, 개선 아이디어를 Pull Request로 보내 주세요!
GitHub Repository: https://github.com/trendstackdev/trend-radar
여러분의 피드백이 더 나은 트렌드 레이더를 만드는 원동력이 됩니다. 감사합니다!
문제
“Trending”은 맥락 없이는 의미가 없습니다. 500개의 GitHub 스타를 받은 저장소도 실제로 아무도 사용하지 않으면 의미가 없습니다. 200개의 업보트를 받은 Product Hunt 출시도 일주일 안에 사라지면 의미가 없습니다.
나는 다음과 같은 질문을 하는 시스템을 원했습니다: 이 신호가 여러 독립적인 출처에서 나타나는가?
만약 어떤 것이 Hacker News에서 트렌딩하고 그리고 기업들이 그 분야에 채용을 하고 그리고 npm 다운로드가 증가하고 그리고 해당 섹터에 자금이 흐른다면 — 그것은 잡음이 아니라 신호입니다.
데이터 파이프라인
Every 2 hours a cron job pulls from these sources:
- Hacker News – 주요 기사 및 댓글
- GitHub Trending – 별을 많이 받은 저장소
- Product Hunt – 새로운 출시
- Reddit – 개발자 서브레딧 4개 (점수 기준: 65점 이상)
- RemoteOK – 채용 공고
- npm – 패키지 다운로드 추세 (추적된 패키지 134개)
- GitHub Stars Velocity – 50개 저장소의 별 성장률
- Hiring Index – 632개 기업, 884개의 활성 채용 공고
- Wikipedia – 기술 주제에 대한 페이지 조회수 증가
- VC Blogs – 투자자 블로그에서 124개 게시물
- Stack Overflow – 태그별 미답변 질문 수
- DOE Research – 연구 데이터베이스에서 346개 레코드
- Funding Context – 섹터 수준의 펀딩 히트맵
- Product Intelligence – 776개 제품에 대한 참여도 및 돌파점수
- GPT Reports – 약 240개 신호에 대한 AI 생성 분석
Raw signals are written to snapshot files; the scoring engine then processes everything.
10가지 점수 차원
각 신호는 10개의 차원에서 점수가 매겨집니다. 원점수는 최대 135점이며, 이를 0‑100 스케일로 정규화합니다.
| # | Dimension | Max pts | Description |
|---|---|---|---|
| 1 | Snapshot | 0‑20 | 현재 데이터 수집에 해당 신호가 존재합니까? |
| 2 | Compare | 0‑15 | 이전 스냅샷의 신호와 어떻게 비교됩니까? |
| 3 | Replay | 0‑15 | 이 신호가 시간에 걸쳐 지속적으로 나타났습니까? |
| 4 | Topics | 0‑15 | 키워드가 주간 성장하고 있습니까? 주제 히스토리와 npm 다운로드 추세를 확인합니다. |
| 5 | Analytics | 0‑15 | 교차 검증: 신호가 여러 독립 소스에 나타납니까? 3개 이상 검증 시 15점. |
| 6 | Intelligence | 0‑15 | AI 분석: GPT 생성 기회 점수를 제품 인텔리전스 데이터(776개 제품의 참여 + 돌파 점수)와 결합합니다. |
| 7 | Funding | 0‑10 | 해당 신호 분야에 자금이 흐르고 있습니까? 신호를 자금 히트맵에 매핑합니다(예: DevTools → Technology, AI → AI/ML + Technology). |
| 8 | Early Signals | 0‑10 | 연구 지표: Wikipedia 페이지 조회수 성장, VC 블로그 언급, Stack Overflow 활동, DOE 연구 키워드. 개별 키워드가 인덱싱되어(전체 구문이 아니라) 더 많은 매치를 포착합니다. |
| 9 | Tracking | 0‑10 | 이 신호가 1,646개의 추적 제품으로 구성된 제품 인덱스에 포함되어 있습니까? |
| 10 | Hiring | 0‑10 | 기업들이 이 분야에 적극적으로 채용하고 있습니까? 회사명 매치, 직무명과 키워드 겹침, 해당 분야에 10개 이상의 기업이 채용 중인지 확인합니다. |
핵심 통찰: 교차 검증
가장 중요한 차원은 Analytics – 교차 검증 체크입니다. 단일 데이터 소스는 조작될 수 있습니다(예: 봇이 HN 게시물을 위로 투표하거나, GitHub 스타를 구매하는 경우). 신호가 HN 에서 나타나고 npm 다운로드가 증가하며 기업들이 해당 기술을 채용하고 GitHub 저장소가 스타를 얻고 있다면, 이러한 수렴은 위조하기 매우 어렵습니다.
이것이 8of8을 Google Trends에 주로 의존하는 Exploding Topics 같은 도구나 단순 스크래퍼 덤프와 구별되는 점입니다.
점수 분포
~1,000개의 원시 신호를 처리한 후, 약 120개가 자격 필터를 통과합니다 (≥ 3 차원 통과 및 점수 ≥ 25/100).
- 최고 점수: 81/100
- 평균 점수: 43/100
- 대다수 신호 군집: 35‑55 범위
70+ 점수를 지속적으로 받는 신호는 몇 주 안에 실제 트렌드가 됩니다.
The Stack
특별한 것은 없습니다:
- Python 스코어링 엔진 (
ultimate_opportunities.py) - Flask 프론트엔드
- Gunicorn + nginx 를 단일 Vultr VPS (Ubuntu 24) 에서 운영
- 데이터 수집을 위한 Cron jobs (2시간마다) 및 이메일 알림 (매일 UTC 오전 8시)
- 결제를 위한 Stripe
- Pillow 로 자동 생성된 신호‑카드 이미지
- Twitter, Bluesky, Mastodon 에 자동 포스팅 (하루 3회)
전체 인프라 비용: VPS 기준 월 약 $12.
What I Learned
-
More data sources beat better algorithms.
스코어링 로직은 간단한 가중치 수학이며, 가치는 영리한 머신러닝이 아니라 데이터의 폭넓음에서 나옵니다. -
Normalization matters.
원시 점수는 40‑80 사이였고 의미가 없어 보였습니다. 0‑100으로 정규화하니 사용자에게 즉시 이해가 되었습니다. -
Free tier has to show value.
첫 번째 버전에서는 모든 신호를 유료 장벽 뒤에 숨겼고, 전환자가 없었습니다. 이제 무료 티어에서는 120개 이상의 신호와 점수, 체크 표시가 모두 보입니다. Pro ($29/mo) 플랜은 상세 분석, 인텔리전스 보고서, 이메일 알림을 제공합니다. -
Signal type matters for communication.
트렌딩 HN 기사와 트렌딩 GitHub 저장소는 다릅니다. 자동 포스팅 시스템에 차이를 가르쳐 블로그 글을 “도구”라고 부르는 실수를 피해야 했습니다(공개적으로 배운 당혹스러운 교훈).
사용해 보세요
대시보드가 8of8.xyz 에서 실시간으로 제공됩니다. 무료 티어에서는 모든 것을 확인할 수 있습니다. 베타 테스터를 찾고 있습니다 – 정직한 피드백을 제공하면 무료 Pro 접근 권한을 드립니다.
- X 로 DM을 보내거나 아래에 댓글을 남겨 주세요.
점수 계산 엔진은 단일 Python 파일에서 실행됩니다. Kubernetes도 없고, 마이크로서비스도 없습니다. 오직 cron과 확신만 있습니다.
제작자: Jose Marquez Alberti. 제공: ASOF Intelligence.