老板路过都不怕:我把"谁是卧底"伪装成了系统监控工具

0 阅读6分钟

开会太无聊?团建没气氛?工位上想摸鱼又怕被抓?这个开源项目,可能是你今年最需要的那一行代码。

image.png


一、每个程序员都经历过的社死现场

周一下午三点,会议室。

你和同事们在玩"谁是卧底"。正当你说出那句精心设计的描述——"它经常出现在早餐桌上,但有时候也会出现在深夜"——老板推门进来了。

所有人瞬间收声。手机屏幕亮着,桌上摊着卡片。

"在干嘛?"

"在……讨论技术方案。"

这种尴尬,从此不会再有了。

二、DoubleTake:伪装成系统诊断工具的"谁是卧底"

DoubleTake 是一个用 Go 语言写的命令行版"谁是卧底"。但它的精髓不在于"命令行",而在于一个字——

开启 --stealth 模式后,整个游戏界面长这样:

[sysmon] v2.4.1 — diagnostics mode
[session:0000] 输入游戏参数
  玩家人数 (4-10): 6
  卧底人数 (1-3): 1
  白板人数 (0+, 回车默认 0): 0
[session:0000] 房间已创建,房间码: deP6OMsz (等待 6 名玩家加入...)
[session:0000] 小明 joined [1/6]
[session:0000] 人已齐,输入 start 开始游戏
[session:0000] 游戏开始!
[node-00] assigned token: 苹果 [平民]
[node-00] 轮次 1,发言顺序: 小明 → 小红 → 小刚 → 小李 → 小王 → 小张
[node-00] 等待 小明 描述...

谁看了不说一句:这哥们在排查生产环境问题呢?

[sysmon][session:][node-]warning: —— 每一个前缀都散发着运维工程师的专注气息。隔壁工位的同事凑过来看一眼,只会默默走开,心想"别打扰他,线上肯定出事了"。

image.png

三、怎么玩?三步搞定

第一步:有人当裁判

doubletake --role judge --stealth

裁判负责:

  • 设定人数(4-10人)、卧底人数(1-3人)、白板人数
  • 把生成的房间码告诉小伙伴们
  • 设定平民词语和卧底词语(比如"苹果"和"梨子")

第二步:其他人加入

doubletake --role player --stealth

输入房间码,起个名字,就进去了。

第三步:开杀

游戏自动流转:轮流描述 → 投票淘汰 → 循环往复。直到平民消灭所有卧底,或者卧底反杀成功。

整个过程,你的屏幕上只有冰冷的技术日志。

四、不只是"装"——它真的好玩

别以为这只是个玩具项目。DoubleTake 的游戏机制做得很完整:

PK 机制:平票不将就

投票出现平票?直接进入 PK 环节——平票玩家再次轮流描述,所有人重新投票。没有"算了下一轮吧"的敷衍,每一轮都有交代。

白板玩法:暗夜中的赌徒

白板玩家什么词都没有,全靠听别人的描述来猜。你可以随时输入 guess 苹果 来一发豪赌——猜对了,直接获胜;猜错了,继续装。这种刺激感,其他角色给不了。

断线重连:掉线不掉队

网络波动?没关系。重新连接,输入之前的昵称,游戏状态自动恢复。掉线期间你的发言/投票回合会等你 60 秒。就算你去上了个厕所回来,游戏还在等你。

多局连续打

一局结束?裁判可以选择继续开新一局,不用重新建房间。团建一整个下午,一个 doubletake 进程就够了。

五、技术人会爱上的细节

作为一个开源项目,DoubleTake 在技术实现上也有不少值得玩味的地方:

纯 Go 实现:零依赖(除了标准库),编译出来就是一个二进制文件。Windows、macOS、Linux 全平台覆盖。go build 一下就完事。

TCP 长连接:裁判端和玩家端之间通过 TCP 保持长连接,消息实时推送,没有轮询延迟。

房间码编码:IP 地址 + 端口号经过 Base62 编码,生成一个短字符串作为房间码。比如 192.168.1.100:8127 会被编码成 deP6OMsz 这样的 8 位码,方便口头传达。

完整的协议设计:JOIN、ROLE、ROUND、TURN、DESC、VOTE、RESULT、WIN、PK_START、RECONNECT……十几种消息类型,覆盖了游戏的所有状态流转。

游戏实现的秘密

实际上,这个游戏安全是 AI生成的, 人类没有写一行代码,你可以在github上追踪这个游戏从零开始如何实现的。

不止于此,甚至连需求文档都是 AI 生成的。整个项目从设计到任务拆解到实现,都是在 AI 的指导下完成的。

开局就是一个Story,从网上找的《我是卧底》的游戏规则。然后使用autoresearch/prd skill 生成了一个详细的需求文档(就是上面那个规则说明)。

接着又使用 /prd 基于这个需求文档拆解成features,并在github上创建相应的issues。

image.png

你可以围观这些issues,里面详细描述了此功能和验收标准:

image.png

然后 autoresearch 花了一天一夜的时间,动用了三个编码智能体和三家的模型服务,完成了每一个issue的开发:

  • claude code/mimo-v2.5-pro: 小米赠送了 2 亿token,但是这一天已用了73%,不禁用呀
  • codex:智谱5.1 lite套餐
  • opencode: opencode go套餐

每个游戏的issue完成后autoresearch都会自动加上实现摘要:

image.png

六、真实使用场景(认真的)

场景一:公司团建

HR 组织团建,大家围坐一圈。掏出终端,doubletake --role judge,三十秒开局。不用下载 App,不用扫码注册,不用关注公众号。

场景二:技术社群线下聚会

一群 Go 开发者 meetup 完了想玩点什么。有人提议"谁是卧底",然后有人说"等等,我有个好东西"。

场景三:远程会议间隙

Zoom 开会太无聊?同事之间开一局。反正大家都是对着屏幕打字,和正常工作毫无区别。

场景四:真的在摸鱼

工位上,四五个同事各自开着终端。老板巡视时,所有人屏幕上都是 [sysmon] v2.4.1 — diagnostics mode。老板满意地点点头:"这帮人真敬业。"

七、快速上手

安装

直接去 Releases 页面下载对应平台的二进制文件。

或者从源码编译:

git clone https://github.com/smallnest/DoubleTake.git
cd DoubleTake
make build

需要 Go 1.26.2+。

开一局试试

# 终端 1:裁判
./doubletake --role judge --stealth

# 终端 2-N:玩家(用裁判给的房间码)
./doubletake --role player --stealth

八、最后说两句

"谁是卧底"是一款已经有十多年历史的桌游,从线下火到线上,从实体卡片火到手机 App。但 DoubleTake 给了它一个新的打开方式——把它藏在程序员最熟悉的界面里

这不仅仅是一个游戏项目。它是一种态度:

工作要认真,摸鱼也要认真。

开源地址:github.com/smallnest/D…


Star 一下,下次团建用得上。