<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>职业发展 on Dan</title><link>https://jst-well-dan.github.io/tags/%E8%81%8C%E4%B8%9A%E5%8F%91%E5%B1%95/</link><description>Recent content in 职业发展 on Dan</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Thu, 09 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://jst-well-dan.github.io/tags/%E8%81%8C%E4%B8%9A%E5%8F%91%E5%B1%95/index.xml" rel="self" type="application/rss+xml"/><item><title>Career-Ops：如何构建 AI 求职工具</title><link>https://jst-well-dan.github.io/posts/career-ops-how-to-build-ai-job-hunting-tool/</link><pubDate>Thu, 09 Apr 2026 00:00:00 +0000</pubDate><guid>https://jst-well-dan.github.io/posts/career-ops-how-to-build-ai-job-hunting-tool/</guid><description>本文分析了如何利用 Claude Code 和系统化标准构建高效的 AI 求职工具 Career-Ops。</description><content:encoded><![CDATA[<p>GitHub 上有个新项目，2天斩获2万 star。</p>
<p>作者 Santiago 在找工作时，用它评估了 516 个岗位、生成了 631 份报告、最终投递 68 份，拿到了 Head of Applied AI 的 offer。</p>
<p>它吸引我的不只是结果，而是背后的两件事：<strong>他对求职流程的系统化思考，以及他用 Claude Code 构建多智能体协作的方式。</strong></p>
<p><img alt="image-20260409154848524" loading="lazy" src="/posts/career-ops-how-to-build-ai-job-hunting-tool/image-20260409154848524.png"></p>
<hr>
<h2 id="求职的系统化思考">求职的系统化思考</h2>
<h3 id="找工作包含大量的重复劳动">找工作包含大量的重复劳动</h3>
<p>Santiago 的核心洞察很朴素：求职中 70% 的工作是重复的分析劳动，而不是决策。读岗位描述、映射自己的技能、判断匹配度、改简历、填表单，这些动作每个岗位都要重复一遍。</p>
<p>他的数据也验证了这一点：631 份评估报告中，74% 的 offer 得分低于 4.0（满分 5.0）。也就是说，如果没有系统化筛选，大量时间会花在根本不合适的机会上。</p>
<p><img alt="Real evaluation: Datadog Staff AI Engineer, MCP Services — Score 4.55/5, archetype AI Platform + Agentic Workflows, role summary with 7 dimensions" loading="lazy" src="/posts/career-ops-how-to-build-ai-job-hunting-tool/datadog.webp"></p>
<h3 id="评估框架先于行动">评估框架先于行动</h3>
<p>他设计了一套 10 维加权评分体系，其中角色匹配和技能匹配是最关键的指标——不匹配直接 pass。其余维度包括资历、薪酬、公司阶段等。</p>
<p>这个框架的价值在于：把&quot;什么是好机会&quot;从直觉判断，变成了可执行的结构化标准。</p>
<p><img alt="image-20260409154940415" loading="lazy" src="/posts/career-ops-how-to-build-ai-job-hunting-tool/image-20260409154940415.png"></p>
<h3 id="简历是论证不是文档">简历是论证，不是文档</h3>
<p>他不是拿着一份简历到处投，而是基于每个岗位动态生成简历：从岗位描述中提取 15-20 个关键词，识别岗位属于 6 个工作方向中的哪一个，然后按相关性重排经历的优先级制。</p>
<p>同一份经历，不同的框架。他的原则是：<strong>什么都不编造，只是让最相关的证据出现在最显眼的位置。</strong></p>
<p><img alt="image-20260409155000625" loading="lazy" src="/posts/career-ops-how-to-build-ai-job-hunting-tool/image-20260409155000625.png"></p>
<hr>
<h2 id="用-claude-code-构建这套系统">用 Claude Code 构建这套系统</h2>
<h3 id="多个模式只用一个-skill-路由">多个模式，只用一个 Skill 路由</h3>
<p>Santiago 采用了渐进式披露的方式：把所有指令放进 <code>CLAUDE.md</code>，统一通过 <code>career-ops</code> skill 进行路由，再按模式注入额外参数。</p>
<p><code>modes/</code> 目录下有 14 个 <code>.md</code> 文件，负责精准的动态上下文注入。这给了我一个启发：<strong>并不是所有内容都要设计成 skill，直接作为 MD 文件保存在项目里，需要时注入调用就够了。</strong></p>
<p><img alt="image-20260409155531716" loading="lazy" src="/posts/career-ops-how-to-build-ai-job-hunting-tool/image-20260409155531716.png"></p>
<h3 id="ai-做推理脚本做确定性">AI 做推理，脚本做确定性</h3>
<p>AI 擅长评估和生成，但数据合并、去重这类需要确定性结果的操作，Santiago 选择用传统脚本来做——<code>verify-pipeline.mjs</code> 负责监控检查，<code>dedup-tracker.mjs</code> 按 <code>company+role</code> 去重。</p>
<p>同一个岗位可能在不同平台多次发布，他的实践中共发生了 680 次重复 URL 的去重。这件事比任何评分优化都能节省更多时间。</p>
<h3 id="批处理粗暴但可控的并行">批处理：粗暴但可控的并行</h3>
<p>Santiago 没有用 Claude Code 自带的 <code>/batch</code>，也没有设计 sub-agent 来完成批量调用。他的方案更&quot;粗暴&quot;：用 <code>batch-runner.sh</code> 通过 tmux 同时开多个会话，每个会话跑一个 <code>claude -p</code>，再用 <code>batch-state.tsv</code> 追踪谁完成、谁失败。</p>
<p>sub-agent（Task 工具）是在同一个 Claude Code 会话内部派生子任务，共享上下文窗口，受主进程调度；<code>claude -p</code> 则完全绕过会话管理，在操作系统层面用 bash 做进程编排。代价是每个 worker 需要手动事先编排好上下文——但好处是并行度和容错性更强。</p>
<p><img alt="image-20260409160343058" loading="lazy" src="/posts/career-ops-how-to-build-ai-job-hunting-tool/image-20260409160343058.png"></p>
<hr>
<h2 id="对我的启发">对我的启发</h2>
<p>Career-Ops 让我看到的不只是一个求职工具，而是一种用 Claude Code 构建领域系统的方法论——把复杂工作流拆成独立的 mode 文件，用路由表分发而非堆砌 skill；AI 做推理和生成，脚本做确定性操作，各取所长；批处理用 conductor-worker 模式， worker prompt 自包含，文件系统做通信。</p>
<p>这些经验不只适用于求职场景——但可以迁移的是思维方式，不是这套工具本身。</p>
]]></content:encoded></item></channel></rss>