こんにちは。エンジニアをしている長井洸太です。
普段はGitHub / Qiitaのエンジニア自動発掘ツールを作った話をコード付きで書いていますが、今回は少し視点を変えて、ITセールス側の人間が実際にGitHubプロフィールをどう読んでいるかを整理してみます。
github_engineer_finder.py で数百人分のプロフィールを取得したものの、実際にアプローチできる人数には限りがあります。「全員に同じテンションで連絡する」のは非効率なので、プロフィールのどこを見て優先順位をつけているかを言語化しました。
セールスが実際に見ているポイント
検索結果のJSON・CSVに含まれる項目のうち、優先順位づけに使っているのは主にこの5つです。
| 項目 | 何を読み取っているか |
|---|---|
bio(自己紹介文) |
技術スタックや今やっていることを言語化できているか=発信意欲のシグナル |
top_languages(使用言語) |
ターゲットの技術スタックと一致しているか |
public_repos(リポジトリ数) |
継続的に手を動かしているか |
followers(フォロワー数) |
コミュニティ内での認知度・影響力 |
blog(Webサイト) |
個人ブランドの発信場所を持っているか=副業・フリーランスへの関心の目安 |
数だけを見ているわけではなく、「発信しているかどうか」を一番重視しています。フォロワーが多くてもbioが空欄の人より、フォロワーが少なくてもbioで自分の専門性を語っている人の方が、返信率が体感で高いです。
作ったもの(概要)
上記の観点を毎回目視で判断するのは大変なので、github_engineer_finder.py の検索結果に対して簡易スコアをつける関数を作りました。
def score_candidate(candidate: dict, target_language: str = "") -> int:
"""プロフィールの情報からアプローチ優先度スコアを算出する"""
score = 0
# 発信意欲:自己紹介文があるか
if candidate.get("bio"):
score += 2
# 技術スタックの一致度
langs = candidate.get("top_languages", [])
if target_language and target_language.lower() in [l.lower() for l in langs]:
score += 2
elif langs:
score += 1
# 継続的な活動量
if candidate.get("public_repos", 0) >= 20:
score += 1
# コミュニティ内の認知度
if candidate.get("followers", 0) >= 50:
score += 1
# 個人ブランドの発信場所を持っているか
if candidate.get("blog"):
score += 2
return score
必要なもの
- Python 3.10以上
-
scripts/sales/github_engineer_finder.pyの検索結果(CSV/JSON)
追加のライブラリは不要です。標準ライブラリと既存の検索結果だけで動きます。
使い方(コマンド例)
既存の検索結果を読み込んで、スコアの高い順に並べ替えます。
import csv
def load_candidates(csv_path: str) -> list[dict]:
with open(csv_path, encoding="utf-8-sig") as f:
return list(csv.DictReader(f))
candidates = load_candidates("Earning/sales/github/2026-07-06_japan.csv")
for c in candidates:
c["top_languages"] = c.get("top_languages", "").split(" / ")
c["public_repos"] = int(c.get("public_repos", 0) or 0)
c["followers"] = int(c.get("followers", 0) or 0)
ranked = sorted(candidates, key=lambda c: score_candidate(c, target_language="Python"), reverse=True)
for c in ranked[:10]:
print(f"{score_candidate(c, 'Python')}点 @{c['login']} {c.get('bio', '')[:40]}")
出力サンプル(実際の結果)
7点 @exampleuser1 Backend engineer / Python, Go / OSS好き
6点 @exampleuser2 個人開発でSaaSを作っています
4点 @exampleuser3 (bioなし) Python, TypeScript
2点 @exampleuser4 (bioなし・blogなし)
スコア上位から順にアプローチすると、返信率が体感で明らかに変わりました。
やってみてわかったこと
「発信している人」の方が返信率が高い
フォロワー数だけで優先順位をつけていた時期もありましたが、実際にはbioやblogで自分の考えを言語化している人の方が、初回のDMにも反応してくれる確率が高いと感じています。「発信慣れしている人」は、知らない相手からの連絡にも身構えすぎない印象です。
スコアはあくまで「話しかける順番」を決めるだけ
スコアが低いからといって価値がない人ということでは全くありません。単に「今回どの順番で声をかけるか」を決めるための補助輪です。スコアの低い人にこそ、丁寧な個別メッセージを用意するようにしています。
数値化すると迷いが減る
「なんとなくこの人から連絡しよう」という感覚だけで動いていた頃より、スコアという軸を一つ持つだけで、100人単位のリストでも迷わず優先順位をつけられるようになりました。
おわりに
エンジニアの皆さんからすると「見られている」と感じる部分もあるかもしれませんが、bioやblogをきちんと書いている人ほど、良い縁につながりやすいというのが率直な実感です。
次回はClaude APIでエンジニアへのアプローチ文を自動生成した話を書く予定です。
毎日X(Twitter)・Instagram・LinkedInで自動化ツールや開発の話を投稿しています。ぜひ繋がりましょう!