① 地基:我们的六度不是概念,是三根轴(已建成)
| 轴 | 是什么 | 已经有的东西 | 用户今天看得见吗 |
|---|---|---|---|
| 长度(隔几度) | 你和某人之间要经过几个人 | 好友/羁绊的边已经在库里(friends + bonds) |
看不见 —— 一次都没露过面 |
| 宽度(认识多少人) | 登巴数 150 分四环:至亲5 / 密友15 / 好友50 / 朋友150 | 登巴环页 dunbar_rings_screen.dart,联系人 chips 右侧 ⭕ 进 |
看得见 |
| 深度(多熟) | 关系温度 0~1000,按互动累积、按比例衰减 | conversation_warmth;握手亲人/挚爱 +300 |
看得见(环上的光晕) |
我们最值钱的地方:边是"双向握手"换来的事实,不是单方面贴的标签 (微信那种标签贴完就腐、没人维护)。这决定了下面所有玩法都建立在真关系上 —— 也决定了它们刷不动(刷一条边要另一个人点头)。
② 为什么现在不好玩 —— 三个"哇"一个都没给到
人对六度上头,只有三种时刻:
| 时刻 | 用户心里那句话 | 我们现在 |
|---|---|---|
| 看见路径 | 「原来我跟他就隔两个人?!」 | 没有任何入口 |
| 够得着 | 「那能不能帮我介绍一下」 | 没有 |
| 看见网在长 | 「我这张网今年长这样了」 | 只有静态的登巴环,没有"变化" |
判据:先给"哇",再给系统。
六度的乐趣是发现,不是统计。任何一版设计,先问一句:
用户在第几秒会"咦"一下? 答不出来,那一版就是仪表盘,不是玩法。
③ 待做 · P1 玩法一:度数与路径「你 ↔ 陈七妹 ↔ TA · 2 度」
打开任何一个人的资料页,顶上一行就告诉你隔几度。这是最便宜的"哇" —— 数据全是现成的。
怎么算
双向 BFS(从我和从他同时往外扩),深度上限 3(= 最多显示"3 度以内")
· 边 = 好友关系(双向已确认);羁绊握手过的边**权重更高**,优先作为展示路径
· 每层扩展上限 N(比如 500 个)—— 超了就停,返回"3 度以上"而不是硬算
· 结果缓存 Redis `sixdeg:{minUid}:{maxUid}`,TTL 6h;任一方加/删好友时删掉与他相关的缓存
接口草案
GET /v1/social/path?to={uid}
→ 200 {
"degree": 2, // 1=直接好友 · 2/3=中间隔人 · null=3 度以上/算不出
"via_count": 1, // 中间隔了几个人(不含两端)
"via": [ // ⚠️ 默认**空数组**:名字要中间人同意才给(见红线一)
{"user_id":"…","name":"陈七妹","avatar":"…"}
],
"can_intro": true // 这条路上有人开着"可被引荐"
}
三个不许
- 算不出来就不显示这一行 —— 不许写"未知/0 度"这种糊弄词(用户会当成"没关系")。
- 不许拿温度参与路径:温度天天漂,路径不能今天两度明天三度(和 as-built 判据三同一条)。
- 不许在列表页批量算:一屏 30 个人就是 30 次图搜索。只在资料页这种单人页算。
④ 待做 · P1 玩法二:请求引荐(看得见 → 够得着)
看见"隔一个人"之后,人第一反应是「那帮我说一声?」。这一步把好玩变成有用, 也是六度唯一能变成增长的地方 —— 而且我们的边比 LinkedIn 干净(握过手的)。
三方流程
我 → 「请陈七妹引荐」+ 一句话(限 60 字,给她好开口) 陈七妹(中间人) → 收到卡片:引荐 / 婉拒 / 忽略 ← 她永远有"什么都不做"这条路 对方 → 只有中间人点了"引荐"才知道这件事 ← 被拒的人不会尴尬,他压根没被打扰 引荐成立 → 后端建一个三人临时会话(或直接互加请求),中间人可以随时退出
要落的表(迁移号做的时候再取,现在不占号)
intro_requests(id, from_uid, via_uid, to_uid, note, state, created_at, decided_at) state: pending | forwarded | declined | expired · 同一对 (from,to) 7 天内只允许一条 pending —— 防骚扰 · 中间人 24h 不处理 → expired(**不通知发起人"她拒绝了"**,只说"这次没成")
判据:引荐是"请人帮忙",不是"系统撮合"。
所有措辞都要让中间人觉得不回也没关系 —— 一旦她感到被系统逼着回应,
她会关掉"可被引荐",那条路就永远断了。
⑤ 待做 · P2 玩法三:每周「链到 TA」挑战
活动层,不动地基:每周公布一个目标(某个官方账号 / 某个游戏高手 / 某位创作者), 用最少的人链到他。它天然裂变,而且不需要新的数据模型。
- 榜单只显示度数和用了几步,不显示"你认识多少人"。
- 反刷:只算握过手的边,且边要"有年龄"(比如成立满 24h)—— 临时加一堆好友刷不出成绩。
- 奖励走现成的绿能量,别为它另发一种货币。
⑥ 待做 · P2/P3 玩法四、五:让"网在长"这件事看得见
握手要有仪式感
现在握手成功只是一行状态变了。应该给一次短动画 + 温度 +300 的可见跳动 —— 关系是这个 App 的主角,主角出场要有音乐。
我的星图能拿出去
登巴环之外,给一张能分享的图:我的四环 + 今年新长出的边 + 最深的三个人(名字可隐去)。这是用户主动帮我们宣传的唯一自然理由。
收集癖(便宜又上瘾)
「你是第 3 个和 TA 握手的人」 ← 稀有度 「你的网里有 4 个国家 / 7 座城市」 ← 广度(不排名,只陈述) 「你和 3 个人互为『至亲』」 ← 深度 「有 12 个人通过你认识了别人」 ← 你是别人的桥(这条最动人)
🚨 ⑦ 两条红线(建议现在就定死,别等做出来再改)
红线一:路径暴露的是别人的关系
「你 ↔ 陈七妹 ↔ TA」这行字,泄露的是陈七妹和 TA 认识这件事 —— 那不是我的信息。
- 默认只给度数,不给名字。要看中间是谁 / 要引荐 → 需要中间人开过"可被引荐"或当场点头。
- 被 vault / 暗影空间降级的关系不进图(和
SHADOW.md对齐)。 - 「谁能看到我出现在别人的路径里」要有一个总开关,而且默认保守。
红线二:不做"人脉广"排行榜
一排名,人就会去刷握手 —— 而握手一旦被刷,三根轴同时脏掉:分类不准、登巴环失真、温度失去意义。
判据:我们比的是关系的"深",不是"多"。
任何一个会让人想"多加几个人"的设计,先假设它会被刷,再问"刷了之后我们还剩什么"。
⑧ 性能:不预计算全图,只算"两点之间"
| 做法 | 取舍 |
|---|---|
| 要查才算(双向 BFS + 缓存) | 只在资料页触发;深度封 3、每层封上限;算不出就诚实说"3 度以上" |
| 预计算全图 / 存所有人两两距离 | N² 爆炸,而且关系一变就全脏 —— 这条不做 |
| 图数据库(Neo4j 之类) | 现在这个量级不值当;真到瓶颈再说(铁律 10:MVP 先能跑) |
缓存失效的判据:加/删好友、握手/解除羁绊这四个动作,清掉与该用户相关的缓存 —— 别用"定时清空"糊过去,那会让用户看到明明加了好友却还显示 3 度。
⑨ 分阶段(按"他能先感觉到什么"排,不按施工难度)
| 阶段 | 做什么 | 用户第一眼看到的变化 |
|---|---|---|
| P1-a | 资料页那一行度数(③) | 「咦,我跟他隔一个人」 |
| P1-b | 请求引荐(④)+ 中间人卡片 | 「那帮我说一声」——第一次真的用它办成事 |
| P2-a | 每周挑战(⑤) | 有理由回来玩 |
| P2-b | 握手仪式 + 可分享星图(⑥) | 愿意截图发出去 |
| P3 | 收集式成就 / 「你是别人的桥」 | 长期黏性 |
⑩ 待 Jeff 拍板(四件)
- 路径显名的默认值:默认只给度数(我建议),还是默认显示中间人名字?
- 引荐的入口摆哪:资料页那一行点开,还是单独一个"六度"页?
- 挑战奖励用绿能量吗,还是先不发奖、只上榜?
- 度数上限显示到几度:我建议 3(再远的关系用户没有感觉,算力也贵)。
拍完我这边按 P1-a → P1-b 的顺序开工,每一刀都能单独上线、单独看得见。