前段时间我连续看到了几个很火的人格测试项目。
一个是大家已经很熟悉的 MBTI 风格网站,比如 16personalities,整体做得特别完整,看起来很像某种严肃的人格测评产品。另一个是像 SBTI 这种更抽象、更互联网、更适合在社交媒体上传来传去的测试。除此之外,我还看到了一个程序员版的脑洞来源,比如 B 站上有人在玩“程序员 MBTI”的梗,也看了像 cbti-test 这种把测试做成纯前端小产品的项目。
看着看着,我脑子里就冒出来一个很朴素的念头:
要不我也做一个程序员人格测试?
而且不是那种随便拼几个梗、做个几分钟就看腻了的页面,而是想认真一点做:让它外表看起来像一个很严肃的心理测评网站,但题目和结果全都在影射程序员日常那些很具体、很离谱、但又确实存在的工作习惯和精神状态。
我真正感兴趣的,是那种“外表认真,内容不正经”的反差
如果只是做一个“程序员版 MBTI”,其实很容易做成那种你看完哈哈一笑、截图发给朋友、然后第二天就忘了的东西。
我不太想只停在那个层面。
我更感兴趣的是另一种感觉:
- 页面看起来要像真的
- 交互看起来要像真的
- 结果页也要像真的
- 但你认真做完以后,会发现它测的全是程序员特有的精神状态
比如:
- 你写代码到底更依赖 AI,还是更依赖自己手敲?
- 你是不是那种看到一个小需求也想先讲一轮架构的人?
- 你排查 Bug 到底是翻日志看源码,还是先打一排
console.log再说? - 你做程序员到底是因为热爱技术,还是说白了就是为了 TC、为了别被 PIP、为了准点下班?
这些问题一旦认真想一想,其实都很有“人格测试”的味道。
真正花时间的部分,不是写代码,而是把方向讲清楚
这个项目一开始其实非常模糊。
最早只是一个感觉:
我想做一个程序员人格测试,而且最好不是泛泛的那种程序员,而是更贴近北美华人程序员、湾区程序员、Tech 公司打工人那种语境。
但只要真开始做,你就会很快发现,里面有一堆问题不是一句“做个测试”能糊过去的。
比如:
- 到底是先做中文,还是一开始就做中英双语?
- 到底要不要继续借传统 MBTI 的 E/I、S/N、T/F、J/P?
- 结果页应该更像正式报告,还是更像方便传播的海报?
- 前端要不要上 Router?
- 部署到底挂主站子路径,还是干脆单独开子域名?
- 英文版要不要强行直译中文,还是让它自己说人话?
这种问题表面看起来都不大,但它们会直接决定你最后做出来的是一个“能跑的小玩具”,还是一个至少看起来像完整产品的东西。
这次我一个很深的感受就是:
真正花时间的不是实现,而是很多方向性的取舍,需要一轮一轮来回掰清楚。
有些地方甚至不是在讨论代码,而是在讨论一句文案该不该更狠一点、结果标题该不该更像网梗、题目到底要更像心理测评还是更像互联网问卷。
这些事听上去很虚,但最后都会非常具体地影响整个产品的味道。
最后我定下来的,是一套叫 SHIP 的四维框架
后来我没有继续沿用传统 MBTI 的四个维度,而是重新造了一套更贴近程序员日常的四维框架,名字叫 SHIP。
一方面这个缩写本身挺顺,另一方面也很符合程序员语境:你开了半天会、写了半天代码、画了半天 Design Doc,最后不还是为了把东西 ship 出去。
这四个维度分别是:
1. Source:你代码的来源到底是什么?
C = CopilotT = Typecraft
也就是你更像哪一种人:
- 一看到脏活累活就先让 Gemini、Claude、Copilot 给你吐个骨架
- 还是哪怕 AI 已经写出来了,你也想自己手敲一遍才放心
2. Hierarchy:你对架构这件事到底有多上头?
O = OverdesignA = ASAP
有些程序员看到一个普通 CRUD 需求,脑子里第一反应是:
- Decoupling
- Scalability
- HA
- Backward compatibility
- Platform 级通用服务
另一些人想到的则只有一句:
今晚能不能先 Push to Prod。
3. Investigation:你排查问题的方式,到底偏理性还是偏玄学?
L = LogicP = Pray
有的人一出问题先翻日志、看 trace、顺着源码往里挖。
还有的人第一反应是:
- 先加几个 print
- 先重启试试
- 先写个兜底脚本
- 只要服务先恢复了,根因以后再说
4. Purpose:你做程序员这件事,到底是在追求什么?
G = GeekW = Worker
有些人真的会在周末自愿折腾 side project、看新技术、研究新框架。
另一些人则更容易被这些事情驱动:
- perf review
- promo
- PIP
- H1B / PERM
- layoff 焦虑
- 准点下班
我后来越来越觉得,这几个维度虽然听上去像在整活,但落到具体题目里,其实都很“像真的”。
算法我故意做得很简单,因为我不想装神弄鬼
这次在计算逻辑上,我其实有一个很明确的偏好:
不要为了显得“科学”而故意做复杂。
有些人格测试会用各种看起来很高深的向量匹配、距离计算,乍一看很厉害,但放到这个项目里我反而觉得没必要。
因为这套产品本身就只有 4 个维度、每个维度 2 极,所以最自然的方式其实就是:
- 每道题只打一个维度
- 7 点量表映射成
+3到-3 - 每个维度各自累计分数
- 分数正负决定最终字母
- 四个字母拼起来就是结果码,比如
CAPW
这个算法的好处也很直接:
- 足够透明
- 足够容易解释
- 很适合结果页上的百分比条
- 后面做中英双语时,逻辑层完全不用变
我后来把 README 也专门补得很详细,就是因为我觉得这种项目最怕的是:表面上看起来只是个整活测试,实际上里面如果堆太多没必要的“神秘逻辑”,后面连自己都不想维护。
技术架构最后也被我收得很克制
虽然这个网站看起来像个完整产品,但最后我的技术路线其实非常克制。
我没有把它塞进主博客 repo 里,而是单独开了一个独立仓库,再单独挂到了子域名上:
- 代码仓库独立
- 前端用 Vite + React
- 纯静态部署
- GitHub Pages 免费托管
- 子域名是
mbti.neilmin.com
然后我刻意没有做几件很容易“看起来更高级”,但其实对这个项目没必要的事:
- 不上 React Router
- 不上完整 i18n 框架
- 不做后端
- 不做数据库
为什么不上 Router?
因为这个产品本质上就是一个单页问卷:
- 首页
- 答题页
- 结果页
如果为了“看起来更像 SPA”去上完整路由,GitHub Pages 上反而会带来一堆没必要的深链接和 404 问题。
所以最后页面切换全靠 React state,真正保留在 URL 里的只有一个东西:
?result=CODE
这样别人如果分享一个结果链接,你还是可以直接打开结果页;但整个项目的部署复杂度会低很多。
为什么不上 i18n 框架?
后来我又给这个网站补了英语版。
但我也没有上完整的 i18n 系统。原因很简单:这个项目的文案非常重,而且英文版我根本不想做成中文直译。
所以最后的做法是:
- 一个轻量
locale状态 - 一套共用的评分逻辑和结果 code
- 两套独立的内容数据:
- 中文题库
- 英文题库
- 中文人格文案
- 英文人格文案
这样英文版就可以写得像自然英文,而不是带着中文句式的翻译腔。
最后最上头的部分,反而是人物图和分享海报
如果只是把题目和结果页做出来,这个项目其实已经能跑了。
但这种测试一旦想传播出去,真正会被保存和转发的,往往不是网页本身,而是一张图。
于是后面我又开始折腾两件特别容易上头的事。
1. 给 16 个人格做人物立绘
我参考的是那种偏 16personalities 的低多边形、干净、几何切面风格,但内容还是我们自己这套程序员人格。
最开始我还在想,是不是要一张一张单独画。后来发现这样很容易风格漂,而且太慢。最后就走了一条很符合这个时代的路:
- 先让 AI 一次性生成一整张角色表
- 再用脚本自动切图
- 最后把它们接进首页、结果页和分享海报
这种做法特别像现代软件工程版的“批处理”:创意交给模型,机械劳动交给脚本。
2. 单独做一张竖屏分享海报
结果页本身是给“读”的,海报则是给“发”的。
所以最后我没有让用户直接截结果页,而是专门做了一张手机优先的竖屏海报。里面会带上:
- 人格 code
- 标题
- quote
- 4 个维度摘要
- 长描述
- 生活与社交侧写
- 二维码
- 网址
而且二维码并不会带着分享者的结果跳转,而是直接回到测试首页。因为这张图真正的任务,不是让别人复现你的结果,而是让别人也去做一遍。
我觉得这个区别还挺重要的:
分享结果是内容,二维码入口是拉新。
最后
回头看,这个项目对我来说,更像是一件“我当时觉得挺有意思,所以就真的把它做出来了”的事情。
一开始其实没有想那么多宏大的东西,也不是奔着做什么特别完整的产品实验去的。就是我刚好连续看到了几个类似的人格测试项目,觉得这种“外表很认真,里面全是圈内梗”的反差特别有趣。再加上程序员这个群体本来就有很多非常具体、非常好笑、但又确实存在的工作习惯和精神状态,于是我就忍不住想:那不如自己也做一个。
最后做出来的这个版本,我自己觉得已经挺好玩了:
- 能认真地测
- 能比较顺地看结果
- 也能生成一张适合分享的图
但它肯定也还远远没到“已经完全定型”的地步。后面不管是题目文案、人格设定、英文版细节,还是视觉和交互,我觉得都还有继续优化的空间。
如果你也好奇自己到底更像哪一种程序员,可以去玩一下:
如果你测完觉得“这也太像我了”,那说明这次整活至少整对了一半。