先别急着报班,也别被"今年是Agent元年"这种话吓到——Java工程师转Agent Engineer,其实是条比想象中更顺的路。我做Agent相关开发快两年,接触过不少从传统后端转过来的同事,发现一个规律:能把Java写明白的人,转过去之后往往比一些"半路出家"的Python选手更稳。原因很简单,Agent开发真正卡人的地方不在"会不会调大模型API",而在系统性设计:状态怎么管、工具怎么编排、异常怎么兜底、记忆怎么分级。这些恰恰是Java工程师日常就在做的事。
这篇计划不是把Python教程换皮,而是完全站在Java背景的角度,设计出一条24周可执行的转型路线。六个月内,你会从"会调接口"走到"能独立设计并落地一个Agent系统"。适合谁看?工作两三年、想往AI应用层发展的Java后端工程师,或者已经在公司内部接触过AI辅助编码、想系统化补齐Agent能力的同学。
1. 转型前的认知重构:Agent Engineer到底在做什么
1.1 别把Agent想得太玄
很多Java工程师一听"Agent Engineer",第一反应是"要重新学机器学习"。不是的。Agent工程师做的不是训练模型,而是利用已经训练好的大模型,搭出一个能自主完成任务的系统。你更接近的角色是"导演",不是"演员"。
拆开来看,一个典型的Agent系统包含四层:
- 大模型底座:负责理解和生成,它提供的是"智力"。
- 规划层:把用户的目标拆解成一系列可执行的子任务。
- 工具层:让Agent能调用外部API、查询数据库、操作文件、发消息等。
- 记忆层:让Agent记住之前的对话、用户的偏好、执行中的中间状态。
你把这四层大概理解成"一个会思考的微服务系统",就明白为什么Java背景反而是加分项了。传统程序是固定的if-else流程,Agent则是在运行时根据上下文动态决定走哪条分支。但"动态"不等于"失控"——工程师的核心工作依然是建模、编排、约束。
1.2 Java工程师的隐藏优势
我经常和团队里新来的同学说一句话:写Agent其实是在写一套"带不确定性的分布式系统"。这句话翻译成Java语境就很好懂了。
- 强类型思维:Agent的能力越强,对"输出结构"的要求就越高。强类型语言天然对"返回结果必须符合预期结构"这件事敏感,这正是Agent稳定运行的关键。
- 框架抽象能力:Java工程师熟悉依赖注入、切面、模板方法这些设计模式。到了Agent开发里,这些模式可以用来设计"工具注册""链路追踪""降级方案",几乎是平移过去的。
- 企业系统集成经验:Agent最终要落地到业务里,就要连接订单系统、CRM、审批流、消息中间件。Java后端工程师对这些系统的接入方式太熟了。
所以,转型的关键不是"忘掉Java",而是"把Java的工程素养翻译成Agent的编排逻辑"。
1.3 一个决定性认知
我见过不少转型失败的人,失败原因几乎一样:把"会写Prompt"当成了Agent开发。学了一堆提示词技巧,真到业务里就失灵。因为Prompt本身不是产品,能稳定完成任务的系统才是。
24周计划里,前几周确实会花时间在Prompt上,但把它当作一种"接口设计"来学——你设计的是大模型和任务之间的对话协议,不是聊天话术。后面的所有阶段,重心都会放在"系统"二字上:记忆怎么存、工具怎么选、失败了怎么办、成本怎么控。
2. 24周计划的整体设计思路
2.1 为什么是24周
六个月的周期,不是拍脑袋定的。我观察过不少学习路径,发现一个规律:想在Agent开发上达到"能独立接企业级项目"的水平,至少要完整经历四个阶段——知道是什么、能手写Demo、能在真实场景里踩坑、能把系统做到稳定可用。
前两个阶段大概两个月能完成,第三个阶段需要一个月到两个月,第四个阶段是不断打磨的过程。24周正好能把这四步走完,又不至于松散到让人失去节奏。
每四周为一个阶段,每个阶段结束时有明确的输出物。这个设计很重要——学AI应用开发最怕"什么都看了一点,什么都没做出来"。有了输出物,你才有简历里能写的东西,也才有面试时能讲的案例。
2.2 六个阶段的总览
| 阶段 | 时间 | 核心主题 | 阶段产出 |
|---|---|---|---|
| 第一阶段 | 第1-4周 | 大模型基础与Prompt工程 | 一个会议纪要自动化小工具 |
| 第二阶段 | 第5-8周 | Agent框架与工具调用 | 一个能自主调用工具的代码审查助手 |
| 第三阶段 | 第9-12周 | RAG与记忆机制 | 一个团队知识库问答Agent |
| 第四阶段 | 第13-16周 | 场景实战与多Agent协作 | 一个贴近业务的Agent原型系统 |
| 第五阶段 | 第17-20周 | 工程化与性能优化 | 一个具备线上可用性的Agent服务 |
| 第六阶段 | 第21-24周 | 综合项目与职业输出 | 完整作品集、可公开分享的项目复盘 |
2.3 贯穿全程的三条学习方法
第一,"项目带知识"。不要先系统学完再动手,而是先定一个阶段目标,倒推需要补什么知识,学完立刻用到项目里。第二,所有代码和Prompt都放进版本管理里。第三,每周写一篇简短的学习日志,只记录"本周做成了什么、卡在哪、怎么解决的"。别小看这个习惯,三个月后回头看,你会清楚看到自己的认知变化。
整个计划里,Java不是被抛弃的,而是你的主线。你写的每一个Agent工程,尽量都用Java和Spring技术栈去落地——这也是你必须做的选择。理由下一节细说。
3. 第一阶段(第1-4周):地基与思维转换
3.1 大模型基础速览:够用就行
第一阶段不需要去啃大模型的数学原理,但有几个概念必须清清楚楚,否则后面学框架会非常吃力。
- Token:大模型处理文本的最小单位。记住一句话:计费、上下文限制、响应时间,全和Token数直接相关。英文1个Token大约是3-4个字符,中文通常1个字对应1-2个Token。
- 上下文窗口:模型一次能"看"到的最大Token数。Java里你习惯了一个对象有多大内存,这里要习惯"对话历史有多长Token"。
- 温度(temperature):控制输出的随机性。数值越高越天马行空,越低越稳定。做业务Agent时我几乎都用0到0.3,稳定优先。
- 结构化输出:让模型按JSON等固定格式返回内容。这是Agent工程里最重要的能力之一,后面工具调用全靠它。
另外要跑通一件事:用API完成一次最简单的对话。不需要多复杂,重点是理解"请求体里有什么、响应体怎么解析、异常怎么处理"。
3.2 Prompt工程:把聊天变成协议设计
很多初学者以为Prompt工程就是"怎么把话说清楚"。我建议你用另一个视角理解:设计Prompt,等于设计一份接口文档。
一份能稳定工作的Prompt,至少要包含这几个要素:
- 角色定义:告诉模型"你是谁"。
- 任务说明:明确"要做什么",最好给出具体的输入输出格式。
- 约束条件:明确"不能做什么",比如"只使用已提供的信息""不要编造订单编号"。
- 输入数据:变量的占位。
- 输出格式:JSON、Markdown,或者特定字段结构。
举个例子。同样是"帮我写周报",初学者会写"写一份本周工作周报",而工程化的Prompt会长这样:
你是某公司的软件工程师。请根据以下工作记录生成一份周报,要求: 1. 按"本周完成""遇到的问题""下周计划"三部分输出 2. 每条内容控制在50字以内 3. 不要添加工作记录中没有的信息 4. 使用JSON结构返回,格式为:{"summary": "...", "issues": "...", "plans": "..."} 工作记录如下: {{work_logs}}把Prompt当接口文档来设计,你会自然而然地关注"边界情况""格式约定""错误处理",而这些才是Agent稳定性的基础。
3.3 Java技术栈上手:Spring AI初体验
作为Java工程师,你完全不需要去转换语言阵营。现在Spring生态已经有官方的AI开发组件(一般叫Spring AI),它把"调用大模型"封装成了类似Spring Data的风格——配置一个Client,然后注入使用。这对Java工程师极度友好。
第一阶段的任务是:用Spring AI写一个简单的对话接口,把上面的"周报生成Prompt"落地成一个可调用的HTTP服务。注意几个实操细节:API密钥不要写死在代码里,用环境变量;接口返回结构统一定义;日志里输出Token用量。
踩坑提示:模型API返回的JSON有时候会有多余的包围文本(比如```json标号),解析前先做清理。这个坑我在第一个项目里被折磨了整整一下午。
第一阶段产出:一个"会议纪要自动整理"小工具,输入一段语音转文字的内容,输出结构化会议记录。够简单,但能完整跑通"请求—Prompt拼接—结果解析—落库"整条链路。
4. 第二阶段(第5-8周):框架、工具与Agent的基本形态
4.1 Java界的Agent框架选型
现在Agent框架群雄并起,Java生态里最值得关注的是两个方向:Spring AI和LangChain4j。
我的个人建议是主学Spring AI。原因有三:一是你本来就熟悉Spring,学习曲线最平滑;二是Spring AI和Spring Boot、Spring Cloud的兼容性好,后面接入企业系统很自然;三是社区活跃度在持续上升,很多大厂内部已经在用。
LangChain4j也值得了解,它的组件设计更贴近Python版LangChain,社区资料更丰富。但注意一个原则:框架只是工具,核心要学的是框架背后的概念——工具注册、记忆管理、链式调用、Agent循环。你换一个框架,这些概念照样能用。
4.2 核心机制:弄清楚"工具调用"到底怎么回事
工具调用(Tool Calling / Function Calling)是Agent和普通聊天机器人的分水岭。它的本质是:大模型不直接执行操作,而是"请求"调用某个工具,并给出参数。真正的执行由你的代码完成。
流程大致是这样的:
- 你把工具列表(名称、描述、参数结构)传给模型。
- 模型根据用户意图,决定"我需要调用XX工具,参数是YYY"。
- 你的程序收到这个调用请求,执行真实逻辑,拿到结果。
- 把结果返回给模型,模型再基于结果生成最终回答。
这个机制的精妙之处在于:模型负责决策,代码负责执行。你的工具可以是查询数据库、调用下游接口、发送邮件,什么都行。
4.3 亲手实现一个带工具的Agent
第二阶段我建议做一个"代码审查助手"。它的功能是:用户提交一段Java代码,Agent自动分析,查出潜在问题,并可以调用一个"静态检查工具"(你自己封装一个基于正则或者简单规则检查的Mock工具)来辅助判断。
用Spring AI写的话,大致是这样一个结构:
// 定义一个工具类,注册给模型 @Component public class CodeInspectorTool { private static final String TOOL_NAME = "inspectCode"; private static final String TOOL_DESC = "对Java代码进行静态规则检查,返回问题列表"; // 这里简化展示:实际需要按框架要求写参数结构 public InspectResult inspect(String code) { // 1. 提取类名、方法名 // 2. 检查是否缺少异常处理 // 3. 检查是否有明显的资源未关闭问题 // 返回结构化结果 } }编写这类工具时,最关键的三个点:
- 描述写得越精确,模型决策越准。你写"inspectCode——对Java代码做检查,返回问题清单",模型就知道什么时候该用它。
- 参数结构用JSON定义,模型只负责生成参数,不负责理解业务。校验和兜底都在你的方法里做。
- 工具执行要有超时和异常处理。说得直白点:工具崩了,不能让整个对话崩了。
4.4 当前阶段常犯的错误
这四周里,你大概率会把大量时间花在"调Prompt让模型听话"上。我的建议是:如果一个问题反复调Prompt还不行,优先换思路,而不是继续调。比如工具描述不够明确,就重写描述;模型一直漏参数,就在提示词里给一个完整的示例JSON。这些都是工程手段,不是玄学。
第二阶段产出完成后,你会非常清晰地理解"模型决策、代码执行"这个分工,这是后面所有复杂Agent的基础。
5. 第三阶段(第9-12周):RAG与记忆,让Agent不再"失忆"
5.1 RAG:给模型配一个外挂知识库
大模型的知识是有截止日期的,也没有你的企业私有数据。RAG(检索增强生成)解决的就是这个问题:先根据用户问题检索出相关资料,再把资料拼进Prompt里,让模型基于资料回答。
RAG的标准流程是:
- 把文档切分成小块,每块做向量化(embedding),存入向量数据库。
- 用户提问时,把问题向量化。
- 在向量数据库里做相似度检索,找出最相关的几个片段。
- 把片段拼进Prompt,调模型生成回答。
这个过程其实很像后端开发里的"缓存策略":问题来了先查索引,查不到就回源,回源结果再写回索引。Java工程师理解这个模型毫无压力。
5.2 向量数据库选型与实操
向量数据库的选择,取决于你的规模。本地开发练手,可以用轻量的方案,直接在内存里做向量检索,最多几百条数据,够用了。到了要接企业文档的时候,再上一个生产级的向量库,常见的有开源的Milvus、Qdrant,或者直接使用云厂商提供的向量检索服务。
实操上,第一周先把"文档切分"做好。切分是RAG效果好坏的最大变量。切得太小,上下文碎片化;切得太大,语义混在一起。经验值是每块300-500字左右,重叠50字。这组参数不是绝对的,要根据你的文档类型微调——制度文档可以切大点,技术问答类文档切小一点。
5.3 记忆分层:像设计缓存一样设计记忆
一个成熟的Agent,需要区分三种记忆:
- 短期记忆:当前对话的上下文,存在内存里,或者直接放对话History里。
- 长期记忆:用户偏好、历史事实,存在向量数据库里,下次对话可以检索。
- 会话摘要:当对话超过窗口时,用一个模型把历史浓缩成摘要,替换掉原始内容。
这里有一个很实用的技巧:对话摘要不是简单地把旧内容删掉,而是每次对话即将超过上下文限制时,触发一次"总结-替换"。你可以在调用前后判断Token数,超过阈值就做一轮压缩。这套逻辑和写缓存淘汰策略非常像。
5.4 阶段实战:团队知识库问答Agent
第三阶段产出一个"团队知识库问答Agent",喂给它的资料是你整理的学习笔记、项目文档。要求是:用户提问后,Agent先检索,再回答;回答末尾标注信息来源;当检索不到相关内容时,明确说"我没有找到相关信息",而不是硬编造。
这个项目做完,你会踩到一个高频坑:检索到了不相关的片段,反而把答案带偏了。观察几次就会发现,问题出在"切分方式"和"检索数量"上——不是切分太碎,就是Top-K取值过大,捞回了太多噪音。调参的思路是:先固定其余变量,一次只动一个参数,记录效果。别凭感觉乱调。
6. 第四阶段(第13-16周):场景实战与多Agent协作
6.1 怎么选一个"练手"的业务场景
到了这个阶段,你必须脱离教程,自己设计一个贴近真实业务的Agent。选场景有个原则:复杂度适中,对"准确率"有要求,并且你熟悉那个业务领域。
我建议从"企业内部系统"入手,因为这类系统你了解流程和数据。一个很好练手的例子是"订单异常处理Agent":用户反馈一个订单问题,Agent先去订单系统查状态,再根据异常类型决定是否发起退款流程,最后把处理结果反馈给用户。
这种场景选得好,不是因为技术难,而是因为它的每一步都要求"工具调用+决策判断"。查完订单后,"要不要退款"这种决策,恰好是Agent自动化价值最大的地方。
6.2 设计多Agent协作的两种模式
单Agent简单直观,但到了复杂任务会捉襟见肘。第四阶段要开始尝试多Agent。
这里先说两种应用最多的模式:
- 编排者-执行者模式:一个主Agent负责理解任务、拆解子任务,然后分发给不同的子Agent执行,最终汇总结果。适合"用户一句话,后台联动多个系统"的场景。
- 流水线模式:任务按固定顺序经过多个Agent,每个Agent负责一个环节。适合"意图识别—信息抽取—结果生成"这种链路固定的任务。
不要为了多Agent而多Agent。如果一个Agent加一个大工具列表就能做完,就别拆。多Agent的复杂度是指数级上升的,通信协议、状态同步、失败重试都要额外设计。
6.3 一个完整的多Agent原型:从设计到落地
我建议做一个"智能工单处理Agent",至少包含三个角色:
- 意图识别Agent:判断工单属于"咨询""故障"还是"投诉"。
- 信息抽取Agent:从工单文本里提取订单号、用户ID、问题描述。
- 处理Agent:根据前面的结果,选择调用查询工具、发消息工具或提交工单工具。
这个项目里,你要认真设计Agent之间的"通信协议"。我的经验是:Agent之间不要传递自然语言,而是传递结构化的JSON。比如:
{ "intent": "故障", "order_id": "A123456", "summary": "用户反映订单3天未发货" }让每个Agent只负责生产JSON,下游Agent只消费JSON。这是多Agent系统稳定运行的关键——自然语言传话会失真,结构化数据不会。
6.4 接上真实系统前要做好三件事
接数据库和数据表前,先想清楚权限边界。接外部API前,先确认接口的限流规则。接用户消息前,先想好人工兜底方案——Agent处理不了,要能无缝转给真人。这三件事做在前面,后面才不会被临时问题打断节奏。
第四阶段结束时,你手里就有了一个可以演示给同事看的多Agent系统。这一步走完,你就正式从"会写Demo"升级到"能设计系统"了。
7. 第五阶段(第17-20周):工程化与性能——把Agent做成能上线的服务
7.1 Token成本控制:先学会算账
Agent项目上线的第一道坎不是功能,是成本。你做一个公司内部的文档助手,一天被调用500次,每次消耗几百Token,一个月账单吓自己一跳。
成本优化有三个非常实用的杠杆:
- 模型分级:简单任务用轻量模型,复杂任务用重量模型。你不需要让"查天气"这种任务动用最强模型。
- 提示词压缩:把Prompt里的冗余内容删掉。很多默认指令翻译成英文再口语化,Token瞬间少一半。
- 结果缓存:同一个问题重复问,直接返回缓存结果,不再调模型。这里可以借鉴Java后端的缓存设计,用Redis或者本地缓存都行。
另外一个容易忽略的点:控制Agent的"自主迭代"次数。Agent循环一旦跑起来,每多一轮就是一个新的模型调用。给循环设置最大轮数(比如5轮),联合兜底逻辑,能显著压住失控成本。
7.2 稳定性建设:超时、重试、熔断
模型接口是外部依赖,随时可能变慢、报错、超时。你之前调分布式接口的经验,现在全部派上用场。
一个生产级Agent服务,至少要处理好这几件事:
- 调用超时:模型调用的Socket超时时间不能设太大,建议10到30秒,超过就异步重试或者返回降级结果。
- 指数退避重试:遇到限流或者瞬时错误,按"1秒、2秒、4秒"的间隔重试,不要一上来就猛烈重试。
- 熔断降级:某个工具连续出错,直接熔断,不让Agent反复调一个"有问题的工具"。
我见过一个项目,Agent在深夜批量处理工单时,因为模型服务方限流,重试逻辑又没有退避,直接把对方接口打爆了,最后整个系统挂了半小时。这种事故,完全是可以用工程手段规避的。
7.3 可观测性:Agent也需要Trace
Agent系统的可观测性是个新命题。你不仅要知道"用户调了接口、接口返回了",还要知道"模型为什么调用这个工具、Prompt最终拼成了什么样、哪一步消耗了多少Token"。
一个实践经验是:自己维护一套简易的日志模型。核心是四个维度——时间、会话ID、步骤ID、消耗Token数。每次模型调用、每次工具执行,各打一条日志。代码里预留一个追踪ID,从用户请求进来开始,贯穿所有内部调用。
如果系统复杂度上去了,可以直接接入业界成熟的可观测性工具,把每一轮模型调用也当作一个Span来处理。但你得先想明白"要追踪哪些信息",而不是直接上工具。
7.4 安全与合规:过滤输入,限制输出
Agent接上企业数据后,安全就是顶格优先级。至少做到三条:
- 输入侧:用户输入不能直接拼进Prompt前,先做内容和长度过滤,防止提示词注入。所谓提示词注入,就是用户输入了一串"忽略之前指令"的话,试图劫持Agent的行为。解决方式是对输入做严格的内容类型识别。
- 输出侧:模型输出先走一遍脱敏逻辑,再对外展示。手机号、身份证号这类信息,在落库和显示前都要处理。
- 权限边界:Agent能调用的工具和数据,必须严格遵守账号权限。不能让一个普通用户通过Agent绕过了原本的权限校验。
第五阶段的核心目标只有一个:让一个Agent系统稳定、可控、成本可预估地运转起来。达到这个水平,你已经具备企业里独立负责一个Agent模块的能力了。
8. 第六阶段(第21-24周):综合项目与职业输出
8.1 设计一个能放进简历的综合项目
前面几个阶段产出的都是模块级项目,最后四周一定要做整合。一个理想的综合项目,最好同时包含:RAG知识库、多Agent协同、工具调用、工程化能力四块内容。
我推荐一个方向:"个人/团队智能助手"。
举个例子,你可以做一个"团队周报生成Agent":自动从多个成员的周报素材里抽取信息,汇总成周报;在生成周报之前,先检索历史周报,提炼团队重点;如果发现成员周报里提到系统异常,自动调用监控工具查询当天日志。这样一个小系统,几乎把24周学到的所有知识点都用上了。
8.2 把学习过程变成作品集
技术面试最怕"会但讲不出来"。综合项目做完后,一定要准备一份项目复盘文档,核心内容是:
- 项目背景和业务痛点在哪儿
- 系统架构图(用文字描述各Agent如何协作)
- 关键设计的决策过程,比如为什么选某个框架、为什么用这种记忆策略
- 性能数据,比如响应时间、Token消耗、工具调用成功率
- 踩过的坑和对应的解决方案
这份文档比简历里三行项目描述有说服力得多。面试官问你项目时,你顺手就能把思路讲清楚。
8.3 简历与面试要点
简历上写Agent项目时,不要只写"开发了AI助手",要突出"系统设计"相关的关键词。每句话尽量落在具体的工程动作上,让面试官一眼看出你具备完整设计能力。
面试中常见的考察点包括:Agent的核心组成、工具调用的原理、RAG的效果怎么优化、如何评估一个Agent的好坏、记忆有哪些类型和实现方式。每一个问题,都能对应到你24周里做过的具体项目上来回答,而不是背概念。
8.4 持续成长:别在"新玩具"上停太久
这个行业变化快,但核心概念(工具调用、记忆、RAG、多Agent)变化没那么快。24周结束后真正要做的是持续跟进:
- 保持关注主流开源社区和厂商发布的新能力。
- 持续把新想法塞到你的综合项目里,让它变成一个长期维护的个人作品。
- 有条件就参与开源项目,贡献一个Agent工具,这个信号比简历强十倍。
转型窗口期可能还有两三年,趁现在进入,等到"Agent工程师"这个岗位彻底成熟时,你已经有了别人需要追赶的实践经验。
9. 常见卡点与避坑经验总结
9.1 高频问题速查表
| 卡点 | 典型现象 | 解决思路 |
|---|---|---|
| Prompt不稳定 | 同样的输入,输出时好时坏 | 降低temperature;给出明确的Few-shot示例 |
| 模型幻觉 | 回答里出现编造的订单号、事实 | 强制"先检索后回答";限定只能使用提供的资料 |
| 上下文超长 | 对话到一半接口报Token超限 | 做会话摘要压缩;控制K值,检索只取Top-K |
| 工具调用失控 | Agent反复调用同一个工具 | 设置最大迭代轮数;工具侧增加参数校验 |
| 成本飙升 | 单个请求Token消耗远超预期 | 用模型分级;为重复问题增加缓存 |
| 多Agent混乱 | 两个Agent互相传话导致死循环 | Agent间只用结构化JSON通信;增加超时和终止机制 |
9.2 最值得说透的三个坑
想多说几个我踩得最深的坑。
第一个是"幻觉比错误可怕"。代码出错了有报错栈,能定位。模型编造了一个不存在的订单编号,你连排查都无从下手。对抗幻觉最好的方式不是调Prompt,而是设计约束:让Agent在回答前必须调用查询工具,如果工具返回空,就明确说"未查得"。这本质上是用工程手段对冲模型不确定性。
第二个是"记录里没有的坑"。统计信息和中间结果如果只留在控制台里,出了问题会非常被动。从第一天起,就把每次模型调用的输入、输出、Token数、耗时都记录到结构化日志里。你后面调优、复盘、排查,全靠这份记录。这个习惯越早养成越轻松。
第三个是"过度设计"的陷阱。我见过有人一开始就搭建复杂的多Agent编排框架,结果连基本流程都没跑通。正确顺序永远是:先用最简单的方式跑通一个最小可行闭环,再逐步加入编排、记忆、优化。等系统复杂度上去了,再重构也完全来得及。
最后一个提醒:别因为看到新概念就焦虑。Agent开发的天花板很高,但地基就是工程基本功——架构设计、异常处理、成本意识、系统思维。这些你作为Java工程师早就有了。接下来半年,只是把这些能力复用到一个新领域,并把"模型决策"这层不确定性变成你能驾驭的变量。
24周之后,你会发现自己已经不是"会写Java的人",而是"会用模型设计和构建智能系统的人"。这条路走下来,能力边界会比想象中宽很多。