欢迎光临
我们一直在努力

金九银十,一个“不学前端“的后端,凭什么敢投全栈岗?

在这里插入图片描述

引子:一条我删了三遍的简历条目

去年这个时候,我在简历的"技能"栏里写过一行字:Vue 3 / Element Plus(了解)。写完就删了。

原因很实在——我确实跟着教程做过一个后台,也确实能改样式、能接接口,但你让我从零搭一个前端工程、处理路由守卫、想清楚组件通信,我心里是虚的。面试官随便往深里问一句"你这个响应式是怎么实现的"“打包体积怎么优化”,我就得开始编。

"了解"这两个字写在简历上,不是加分项,是靶子。

但另一端的事实是:那些写着"Java 后端工程师"的岗位,JD 里越来越频繁地出现这么一行小字——

熟悉前端技术(Vue/React),有前后端联调经验者优先。

它躺在"加分项"里,却往往是筛简历时真正被折算成钱的那一条。

于是后端们陷入一个很别扭的处境:不学,简历过不了筛;学,投入产出比又低得让人心疼。 一个后端把 Vue 学到"能独立开工"的水位,通常得三到六个月,而这段时间里,Spring 生态、JVM 调优、分布式那些真正决定你天花板的硬骨头,是一点都没动。

这篇文章想聊的就是这个矛盾的新解法。不是"要不要学前端",而是:当交付能力可以被工具补齐之后,"会全栈"这件事的定价逻辑,是不是变了。

下面所有内容,都建立在我自己完整跑过一遍的基础上。截图、数据、坑,都在。


一、金九银十的招聘现实:后端岗的 JD,早就"越界"了

1.1 招聘方要的从来不是"你会前端",而是"你能交付"

先把一个误区拆掉。

面试官写"熟悉前端技术"的时候,他真正想买的,其实不是你的 Vue 水平。他想买的是三件事:

  • 一个人能干完的活,不用配两个人。 这是人力成本,也是沟通成本。

  • 出了问题,能自己定位到底是前端还是后端。 联调阶段最怕的就是两边互相甩锅,一个能同时看得懂 Network 面板和 Controller 断点的人,能省掉大量扯皮。

  • 需求过来的时候,能自己判断"这个交互做不做得到"。 这是设计能力,不是编码能力。

  • 注意,这三条没有一条要求你写出多漂亮的前端代码。

    所以真正稀缺的,从来不是"前端很熟的后端",而是"能独立闭环交付一个完整项目的人"。这两个东西在招聘市场上经常被混为一谈,但成本差得很远。

    1.2 一个更隐蔽的矛盾:招聘成本与岗位预算的错位

    从招聘方的角度算一笔账,会更清楚为什么"全栈优先"这四个字越来越常见。

    一个中等复杂度的中后台需求(比如一个内部工单系统、一个权限管理后台),传统模式下的人力配置大致是这样:

    环节角色参考工作量
    前端开发 前端工程师 1 人 约 3 天
    后端开发 后端工程师 1 人 约 2 天
    前后端联调 前端 + 后端 约 2 天
    合计 至少 2 人 约 7 天

    问题在于,这类需求往往体量很小——预算撑不起两个人的人力成本,但又确实需要两个人。招聘方只能二选一:要么把需求拖到能养得起两个人的规模,要么压低单个人的人力成本去招"什么都会一点"的人。

    这就是"全栈"溢价的来源:不是市场觉得全栈更高级,而是市场需要一个能顶两个人的交付单元。

    1.3 我从面试和项目里看到的三个信号

    结合我自己投递、面试和被问到的经历,以及身边同行的反馈,我总结了三个信号:

    信号一:问"你独立交付过什么"的面试官,比问"你熟悉哪些技术"的更多了。

    技术栈可以通过背题补,交付经历补不了。一个完整的、能跑起来的、有权限控制和状态流转的项目,比十道八股文更能证明你。

    信号二:全栈岗位的薪资带宽,确实比同级别的纯后端岗更宽。

    但这个溢价不是"发给你学前端的时间"的补偿,而是"发给你一个人扛下整条链路"的责任定价。溢价买的是结果,不是过程。

    信号三:门槛正在从"会写"转移到"会设计"。

    当代码的产出速度不再是瓶颈,瓶颈就自动上移到了它前面那一步——你有没有能力把需求想清楚、把边界划清楚、把状态和权限定义清楚。

    这三点看起来很虚,但它们恰恰是这轮变化里最值钱的部分。后面两章我会用一个真实项目把它们讲透。


    二、实测:把"全栈岗"的活,交给一个人加一套工具

    这一章是全文的骨架。我以一个真实中后台需求(TicketDesk 企业工单与处理看板系统)为对象,完整走了一遍从需求到运行的流程,每一步都留了截图。

    2.1 先把测试条件说清楚

    数据要能站住脚,前提是把条件写明白。这次实测的环境和复杂度如下:

    项目说明
    硬件环境 macOS 笔记本,Apple Silicon
    IDE IntelliJ IDEA(安装飞算 JavaAI 插件,专家模型)
    后端 Spring Boot 3.2.5 + JDK 17
    持久层 Spring Data JPA + MySQL 8.0
    前端 Vue 3 + Element Plus(CDN 方式,无需构建)
    构建工具 Maven
    需求复杂度 2 种角色、4 个页面、4 张数据表、11 个接口、14 个需求关键点
    交付形式 本地可运行(mvn spring-boot:run 后访问 http://localhost:8080/)
    测试性质 单人单次实测,非严格实验室对比环境

    最后一行很重要。单人单次意味着它不具备统计意义,我会在第三章明确说明哪些数字有参考价值、哪些只能当个例看。

    2.2 第一步:需求输入——一段中文,代替一份 PRD

    这是我全程感触最深的一步。

    传统流程里,后端拿到的是一个模糊的口头需求,或者一份没画完的设计稿。你得先跟产品扯三轮,才敢动手。这次我做的事情很简单:把需求直接写清楚,写到我愿意拿它去跟产品对线为止。

    在这里插入图片描述

    我写的那段提示词,结构是这样的:

    请为我开发一个用于 Java 求职作品展示的全栈项目:TicketDesk 企业工单与处理看板系统。

    一、角色
    1. 提交人:创建工单、查看自己的工单、补充评论、关闭已解决的工单。
    2. 处理人:查看全部工单、领取待处理工单、处理自己领取的工单。
    提供两个提交人账号和一个处理人账号用于本地演示。身份由后端登录态识别,权限必须在后端校验。

    二、页面范围
    1. 登录页。
    2. 工单列表:支持关键词、状态、优先级筛选和分页。
    3. 工单详情:展示描述、处理人、评论、操作记录和当前可执行操作;创建工单使用弹窗。
    4. 处理看板:按待处理、处理中、已解决、已关闭分列展示。

    三、业务规则
    1. 工单包含标题、描述、分类、优先级、提交人和创建时间。
    2. 状态按 待处理→处理中→已解决→已关闭 流转。
    3. 领取后进入处理中;只有领取人可以提交解决说明。
    4. 已解决工单只能由原提交人关闭。
    5. 非法状态变更返回明确错误,前端同步提示。
    6. 状态变更保存操作人、时间、前后状态和备注。
    7. 提交人不得查看其他提交人的工单,直接访问接口也应被拒绝。

    四、交付与验收
    提供完整代码、演示账号初始化方式、覆盖各状态的模拟数据和启动文档。
    验证"提交→领取→解决→关闭"的完整流程。
    页面包含加载、空列表、失败和防重复提交状态。
    不要使用前端固定数组代替真实接口,也不要声称未执行的测试已经通过。

    注意最后两行。“不要使用前端固定数组代替真实接口”“不要声称未执行的测试已经通过”——这两句是这次需求能验收成功的关键。它们把"演示级"和"可交付级"的区别前置到了需求阶段,避免了后面拿一个纯静态的假页面自我感动。

    这一步我花了大约 20 分钟。 看起来是"输入需求",实际上是做领域建模。状态机怎么流转、权限边界在哪里、谁能操作谁不能——这些想不清楚,后面生成什么都是白搭。

    2.3 第二步:需求被拆成 14 个关键点

    需求提交后,工具没有直接开始写代码,而是先把它拆解成了 14 个可逐条勾选的关键点。

    在这里插入图片描述

    这一步的价值被很多人低估了。它相当于强制你做一次需求评审,只不过评审对象变成了自己写的那段话。

    拆出来的 14 条里,有几条是我原本没写得那么明确的,比如:

    • 提交人只能查询自己的工单,处理人返回全部工单(数据隔离的落点)

    • 工单详情要返回"当前用户可执行的操作列表"

    • 每次状态变更自动保存操作人、操作时间、变更前状态、变更后状态和备注

    • 所有写操作均具备防重复提交机制

    "当前用户可执行的操作列表"这条尤其关键。它意味着不是前端硬编码"什么状态显示什么按钮",而是后端根据当前登录人和工单状态算出来返回给前端。这是权限校验必须放在后端这条规则的具体落地方式,也是面试时能讲出深度的一个点。

    这一步大概花了 10 分钟,主要时间用在逐条确认和删掉一条我觉得多余的。

    2.4 第三步:4 组接口方案,接口先对齐再写代码

    接下来是接口设计,生成了 4 组接口方案。

    在这里插入图片描述

    4 组分别是:

    接口分组覆盖能力
    认证与初始化服务 账号密码校验、登录态凭证、演示账号与模拟数据初始化
    工单查询服务 创建工单、列表查询(关键词/状态/优先级筛选)、详情查询、处理看板分组查询
    工单流转处理服务 领取、解决、关闭,含状态流转规则校验与操作记录
    工单评论服务 评论添加与查询

    最终落地的接口一共 11 个:

    POST /api/auth/login 登录,返回 JWT Token
    POST /api/auth/logout 登出
    GET /api/auth/current 获取当前登录用户信息

    POST /api/work-orders 创建工单(仅提交人)
    GET /api/work-orders 工单列表(关键词 / 状态 / 优先级 + 分页)
    GET /api/work-orders/{id} 工单详情(含评论、操作记录、可执行操作)
    GET /api/work-orders/board 处理看板(按状态分组)
    POST /api/work-orders/{id}/claim 领取工单(仅处理人)
    POST /api/work-orders/{id}/resolve 解决工单(仅领取人)
    POST /api/work-orders/{id}/close 关闭工单(仅原提交人)
    POST /api/work-orders/{id}/comments 添加评论

    这里有件事值得单独说:接口是在生成代码之前定下来的。

    传统开发里,接口文档经常是"边写边改",前端拿到的是半成品,联调时字段对不上、命名不一致、返回结构不统一,这些都是联调阶段最常见的返工来源。

    而这次流程里,接口是先于代码存在的。这意味着后端 Controller 和前端 api.js 从一开始就引用同一份约定——这不是"联调做得快",而是"联调这个环节被提前消化掉了"。

    这一步大约 10 分钟。

    2.5 第四步:4 张表、11 个接口定下来

    接口之后是数据库表设计,共 4 张表。

    在这里插入图片描述

    4 张表分别是 t_user(用户信息表)、t_work_order(工单信息表)、t_work_order_comment(工单评论表)、t_work_order_operation_log(工单操作记录表)。

    其中核心的工单表结构是这样:

    CREATE TABLE IF NOT EXISTS `t_work_order` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `title` varchar(255) NOT NULL COMMENT '工单标题',
    `description` text COMMENT '工单描述',
    `category` varchar(64) COMMENT '工单分类',
    `priority` varchar(32) NOT NULL COMMENT '优先级',
    `status` varchar(32) NOT NULL DEFAULT 'PENDING'
    COMMENT '状态(PENDING:待处理,PROCESSING:处理中,RESOLVED:已解决,CLOSED:已关闭)',
    `submitter_id` bigint(20) unsigned NOT NULL COMMENT '提交人ID',
    `processor_id` bigint(20) unsigned DEFAULT NULL COMMENT '处理人ID',
    `resolution_note` text COMMENT '解决说明',
    `create_by` varchar(64) COMMENT '创建人',
    `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_by` varchar(64) COMMENT '修改人',
    `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
    ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='工单信息表';

    有两个设计细节我认为值得点赞,也有一个我想吐槽的(留到第四章)。

    值得点赞的:

    • t_work_order_operation_log 这张日志表。它记录 before_status、after_status、operator_id、remark。这意味着每一次状态变更都是可追溯的,而不是只保留一个最终状态。很多人做练手项目会忽略这张表,但它在真实业务里几乎是标配——因为"这个工单是谁改的状态"是运维和审计的刚需。

    • 统一的审计字段(create_by / create_time / update_by / update_time)出现在每一张表上,命名一致。这种一致性在人工写代码时反而是最容易漏的。

    这一步约 15 分钟,我主要是在核对 priority 和 status 用字符串枚举还是数字枚举——最后选了字符串,可读性优先,代价是索引效率略差。这个取舍在演示项目里是划算的。

    2.6 第五步:代码生成计划

    表结构确认之后,出现的是一个分阶段的代码生成计划。

    在这里插入图片描述

    计划被拆成了 7 个 Phase,从项目骨架、配置类、枚举与统一响应体,一直到前端页面和验收文档,每一条任务都可以单独撤回或调整。

    这一步我基本没动,大约 5 分钟扫了一遍,确认没有多余的依赖(比如没有给我塞 Redis、没有塞消息队列)。

    这里有个判断标准可以分享:生成计划里如果出现了你的需求里没提过的中间件,一定要删掉。 练手项目里塞越多组件,面试时被问穿的概率越高。

    2.7 第六步:55 个文件落地

    生成完成后,右侧工作区列出了完整的交付清单。

    在这里插入图片描述

    最终产出:

    交付物内容
    项目文档 README.md(环境要求、数据库初始化、启动方式、演示账号、验收对照表)
    设计文档 DESIGN.md(页面布局、角色权限矩阵、状态流转图、表结构、接口字段定义)
    项目配置 pom.xml、application.yml
    后端代码 src/main/java/com/ticketdesk/ 下完整分层:common / controller / dto / entity / repository / service
    前端代码 src/main/resources/static/ 下的 index.html + js/(api.js / store.js / app.js / pages/ 四个页面)
    数据库脚本 src/main/resources/sql/init.sql

    我统计了一下实际代码规模:

    类型文件数代码行数
    Java 后端 41 个 约 3,113 行
    前端 JS / HTML 8 个 约 1,189 行
    合计 55 个文件 约 4,300 行

    其中几个核心文件的体量:WorkOrderServiceImpl.java 579 行(状态机与权限校验的集中地)、WorkOrderController.java 140 行、JwtUtils.java 124 行;前端 detail.js 325 行、list.js 311 行、board.js 127 行。

    生成过程大约 25 分钟,这个时间里我可以去干别的,这一点确实是人力做不到的。

    2.8 第七步:四个页面跑通,闭环验收

    代码生成完,接下来是最见真章的环节:它到底能不能跑。

    启动过程有一步需要自己动手——建库、执行 init.sql、改 application.yml 里的数据库账号密码。这一步 AI 替不了你,因为你的 MySQL 密码只有你自己知道。

    然后 mvn spring-boot:run,浏览器访问 http://localhost:8080/。

    在这里插入图片描述

    这是登录页的实际效果。左侧是产品化的说明文案,右侧是登录表单,下方还贴心地把三个演示账号做成了可点击填充的卡片,并标注了角色(提交人 / 处理人)。

    进入系统之后是工单列表页:

    在这里插入图片描述

    这一页的信息量很大,我逐条核对了一遍:

    • 筛选区:关键词、状态、优先级三个条件,加查询和重置按钮 ✅

    • 列表字段:工单编号、标题、分类、优先级、提交人、处理人、状态、创建时间、操作 ✅

    • 状态标签的颜色区分:待处理(橙)、处理中(蓝)、已解决(绿)、已关闭(灰)✅

    • 优先级区分:普通(灰)、高(橙)、紧急(红)✅

    • 分页控件:显示 1-4,共 4 条 ✅

    • 空处理人显示为"未领取",而不是显示空白或 null ✅

    最后这一条是个小细节,但很能说明问题:它没有把"未领取"这种业务语义直接暴露成技术上的 null。 这种细节通常只有真正想过业务的人才会在意。

    而权限隔离和状态流转,我是直接拿接口验的,验收结果如下:

    验收项验证方式实际结果
    完整流程 提交 → 领取 → 解决 → 关闭 状态依次流转,操作记录完整
    列表隔离 提交人 A 创建工单后,提交人 B 查列表 列表中不显示该工单
    详情隔离 提交人 B 直接访问 A 的工单详情接口 返回 403,无权访问
    跳过领取直接解决 对"待处理"工单调用解决接口 返回"待处理工单不能直接解决"
    非领取人解决 其他处理人尝试解决已领取工单 返回"只有工单领取人才能提交解决说明"
    非提交人关闭 非原提交人尝试关闭工单 返回"只有工单提交人才能关闭工单"
    数据持久化 刷新页面后重新查看 状态、评论、操作记录均正确保留

    验收加上环境准备,大约 60 分钟。

    到这里,"后端不学前端、不联调,一人交付完整前后端项目"这句话,在我这里是跑通了的。


    三、把时间摊开算:省掉的不是"写前端",是"返工"

    第二章是过程,这一章算账。

    3.1 传统 7 天是怎么花完的

    官方给的口径是:中等复杂度 CRUD 页面,传统模式 约 7 天(前端 3 天 + 后端 2 天 + 联调 2 天),工具模式 约 1 天。

    我一开始对这个"1 天"是持怀疑态度的。但把环节拆开之后,我发现真正值得讨论的不是"1 天能不能做到",而是那 7 天里,究竟有多少是花在真正的开发上。

    环节参考耗时时间究竟花在哪
    前端开发 3 天 搭工程、写组件、调样式、处理路由与状态
    后端开发 2 天 建模、写接口、写业务逻辑、写校验
    前后端联调 2 天 字段对不上、参数名不一致、返回结构不统一、状态码约定不同

    我的判断是:联调那 2 天,是纯粹的摩擦损耗。

    它不产生任何业务价值,它的存在只是因为前后端各自拿着一张"可能对不上的约定"在干活。而这 2 天,恰恰是这套流程最先消掉的部分——因为接口在代码生成之前就已经定好了,前端调用和后端实现引用的是同一份定义。

    3.2 这一次实测的账

    我把自己的耗时如实记了下来:

    阶段实测耗时备注
    写需求描述 约 20 分钟 含业务建模与状态机梳理
    需求关键点确认 约 10 分钟 逐条核对 14 个关键点
    接口方案确认 约 10 分钟 4 组接口方案
    表结构确认 约 15 分钟 4 张表,核对字段与枚举类型
    代码生成计划 约 5 分钟 扫一遍,删掉多余依赖
    生成源码 约 25 分钟 期间可以离开
    环境准备 + 跑通 + 验收 约 60 分钟 建库、改配置、逐项验收
    合计 约 2 小时 25 分钟 单人单次,不含调试意外

    这个数字比官方口径的"约 1 天"要好看。

    但我必须把话说明白,否则这个数字就是在误导人:

  • 我熟悉中后台场景。 工单系统、权限隔离、状态流转这套业务模型,对我来说是零成本的。如果你面对的是一个陌生领域(比如医疗、金融风控),需求建模那一步可能要花上几天。

  • 我把需求写得很细。 那段提示词大约 800 字,是我自己思考的产物。AI 没有替我想清楚业务,它只是把我已经想清楚的东西执行了。 前置思考的时间成本,被我在表里计入了 20 分钟——如果算上我平时积累的领域经验,这个成本远不止 20 分钟。

  • 这是单次记录,不是对照实验。 它不能证明"所有人用这套方式都能 2.5 小时交付"。

  • 所以更诚实的结论是:工具把"执行"这一段压缩了将近一个数量级,但它没有压缩"想清楚"这一段。 而"想清楚"恰恰是决定项目质量上限的那一段。

    3.3 联调归零,到底值多少钱

    如果把这件事换算成钱,逻辑会更清楚。

    假设一个前端 + 后端的组合,按人均日成本 800 元算,7 天是 11,200 元。其中联调占 2 天,也就是 3,200 元。

    这 3,200 元买到的,是"两个人把各自的约定对齐"这个动作。而现在这个动作被前置到了设计阶段,成本接近于零。

    这才是"全栈功能"真正的经济意义所在:它不是让你免费获得一个前端,而是让你免于支付协调成本。

    从求职者的角度看,这句话可以翻译成更实在的一句话:

    如果你能独立交付一个完整项目,你在雇主眼里的价值,锚定的不是"一个后端"的价格,而是"省下一整个前端岗位协调成本"的价格。

    这就是"会全栈的后端"在市场上溢价的真正来源。

    3.4 质量账:那 10% 去哪了

    官方口径里还有一句:常规页面一次生成完成度约 90%,部分页面可直接使用。

    这 90% 是很硬的数字,但那 10% 才是决定你能不能把它写进简历的关键。我这次的实际情况是:

    • 页面骨架、表单、表格、筛选、分页、状态标签:一次成型,可以直接用

    • 复杂交互(比如详情页里"按权限动态显示可执行操作按钮"):逻辑是对的,但视觉细节我改了

    • 响应式与细节间距:需要人工过一遍

    那 10% 是什么?是"能跑"和"敢拿去面试"之间的距离。

    这也引出下一章——如果打算用这种方式做一个求职作品,你必须知道它的边界在哪里。


    四、冷静视角:这套方式的溢价空间与天花板

    按约稿要求,这一章写"优点 + 不足 + 建议"。我会尽量说得直白。

    4.1 真实评价·优点

    第一,交付物的完整度确实超出我对"AI 生成代码"的预期。

    它给的不只是代码。README.md 里写了环境要求、数据库初始化方式、启动命令、演示账号,以及一份逐项的验收对照表;DESIGN.md 里给了页面布局草图、角色权限矩阵、状态流转图、表结构和接口字段定义。

    也就是说,它交付的是一个"项目",而不是一堆文件。这一点对求职场景尤其重要:面试官想看的是你有没有工程意识,而文档本身就是工程意识最直观的证据。

    第二,业务规则不是"提示词级别"的实现,而是落到代码里的实现。

    我原本担心"权限必须后端校验"这种要求会被敷衍成前端隐藏按钮。实际结果是后端 /api/work-orders/{id} 对非本人的访问真的返回 403,非法状态流转真的返回了具体的错误文案(比如"待处理工单不能直接解决,请先领取")。这是能拿到面试桌上讲的东西。

    第三,设计与实现的一致性,让"讲清楚为什么这么设计"变成了可能。

    因为 DESIGN.md 里的状态流转图、权限矩阵是和代码一起生成的,你在面试时讲出的设计理由,和代码里实际的行为是能对上的。这比背设计模式强得多。

    4.2 真实评价·不足

    有 5 条,我按严重程度排:

    不足一:文档和实现之间会出现"小漂移",必须自己核对一遍。

    这是最实际的问题。我看到的项目文档里,演示账号写的是 submitter1 / submitter2 / processor1,密码 123456;但实际跑起来的登录页,显示的却是"张三 / 李四 / 王工",密码 Demo123。

    功能没问题,两者都能登录,但如果你直接把文档交出去,别人照着文档是登不进去的。

    这类漂移在生成式流程里几乎是必然的——文档、SQL 脚本、初始化代码是分别生成的三份东西,任何一份改动都可能导致它们不再对齐。

    结论:把"文档与实现一致性核对"当成交付前的必做项。 至少要把 README 里的每一行命令、每一个账号,实际跑一遍。

    不足二:前端用的是 CDN 方式引入 Element Plus,这是演示级的方案,不是生产级的方案。

    代码里前端是 index.html 直接引 CDN 的 Vue 3 和 Element Plus,连构建步骤都省了。好处是极低的上手门槛——mvn spring-boot:run 之后就能看到页面,不需要 npm、不需要 Vite、不需要 node_modules。

    但代价也很明确:

    • 依赖外网 CDN,内网或断网环境下页面直接白屏

    • 无法做按需加载,首屏体积偏大

    • 没有版本锁定,CDN 上的版本更新可能直接让你的页面崩掉

    • 没有工程化构建,意味着没有 ESLint、没有 TS、没有模块拆分——如果面试官问"你这个前端工程是怎么组织的",index.html + 一堆全局 js 文件这个答案,是不够看的

    这一条必须清楚:它让你"能交付",但不等于让你"能讲工程化"。 如果你投的是明确要求前端能力的岗位,这块要自己补上。

    不足三:“不学前端"不等于"可以不懂前端”。

    这是我最想强调的一条认知风险。

    生成的代码里,前端逻辑分布在 api.js(请求封装)、store.js(状态管理)、pages/*.js(四个页面)里。它确实能跑,也确实能改。但一旦出现问题——比如某个按钮点了没反应、某个字段显示成了 undefined、样式在某个分辨率下错位——排查的责任还是在你身上。

    而排查前端问题的能力,恰恰是"不学前端"最缺的那部分。你不需要会写,但你需要会看:会看 Network 面板、会看 Console 报错、会看组件传参。这部分能力,工具替不了你。

    不足四:默认配置是"演示友好",不是"生产安全"。

    我在代码里看到几处明显不适合上生产的地方:

    • application.yml 里数据库账号密码是明文的 root / root

    • JWT 的签名密钥硬编码在配置里

    • 演示账号是启动时自动初始化的(DataInitializer),生产环境应该关掉

    • 密码用了 BCrypt 加密(这点做得对),但演示账号密码统一是 123456 或 Demo123,弱得离谱

    如果这东西要真上生产,安全配置必须自己重新过一遍。 别指望生成的默认值。

    不足五:它对"需求描述的清晰度"极其敏感,你含糊它就散。

    我这次之所以顺利,很大程度上是因为需求写得足够细。如果我当时只写一句"做一个工单系统",大概率会得到一个"能增删改查但没有任何业务规则"的 CRUD 模板。

    这不是工具的缺点,是它的特性。但它意味着:你省下的编码时间,会以"需求思考时间"的形式还回来。 想偷懒跳过思考直接生成,结果一定是拿到一个自己都讲不清的东西。

    4.3 真实评价·建议

    建议一:把它当"前端代写 + 联调替代",别当"业务代想"。

    正确的分工是:你负责想清楚(领域模型、状态机、权限边界、异常路径),它负责写出来。

    一旦你把"想清楚"这一步也交出去,你交出来的作品就是没有灵魂的,面试一深挖就散。

    建议二:用它做一个"你能讲两个小时"的项目,而不是十个"能跑"的项目。

    一个讲得透的项目,胜过一个仓库里躺着的十个 demo。判断标准很简单:你能不能不看代码,把状态流转、权限校验、异常处理讲清楚,并且说得出"为什么这么设计"。

    建议三:把生成后的代码当"别人写的代码"来 review。

    这是我这次收获最大的一步。因为不是自己写的,我反而更认真地看了一遍 WorkOrderServiceImpl.java(579 行)——状态校验的顺序、权限判断的位置、事务的边界。看别人(或 AI)的代码,比自己写一遍更能提升。

    而这件事本身,就是面试里非常值钱的一段经历。

    4.4 面试官会追问你的四个问题

    如果你打算把这个项目写进简历,请先准备好这四个问题的答案:

    Q1:你这个权限校验为什么放在后端?前端隐藏按钮不行吗?

    参考方向:前端隐藏按钮只是交互优化,不是安全边界。用户可以直接调接口。所以必须在后端对每个请求重新做身份与归属校验——这也是为什么详情接口要返回 availableActions,而不是让前端自己判断。

    Q2:状态流转是怎么保证不出错的?

    参考方向:不是靠前端控制,而是在 Service 层做状态机校验:先查当前状态,再判断目标状态是否合法、操作人是否符合身份,不合法直接抛业务异常并返回明确文案。同时写一条操作日志,保证可追溯。

    Q3:重复提交你是怎么处理的?

    参考方向:前端做了按钮 loading 和禁用,但那只防"手抖"。后端有独立的防重复提交工具类(IdempotentUtils),避免绕过前端重复调用。

    Q4:这个前端工程是怎么组织的?为什么用 CDN?

    这题是陷阱。 老实回答:CDN 是为了降低本地运行门槛,让演示者不需要 npm 就能跑起来;如果要做生产级交付,会改成 Vite + npm 的工程化构建,做按需加载和版本锁定。

    承认取舍,比假装完美更能加分。


    五、这个金九银十,你可以怎么用

    5.1 三条行动清单

    第一,别急着学框架,先去做一个能讲透的项目。

    如果你的目标是"拿到全栈岗的面试机会",那三个月速成的 Vue 未必能帮到你,但一个完整交付的项目能。先用两周做一个真实的小系统,把状态机、权限、异常路径想清楚。等你真正卡在"前端写不出来"的时候,再去补前端,你的学习会有的放矢得多。

    第二,把"交付过程"留下来,它比代码更值钱。

    这东西没法造假——整个流程的操作截图、每一步的耗时、你改过什么、你发现了什么不足。这些痕迹堆在一起,才构成一个可信的"我能独立交付"的证据链。

    面试的时候别只给一个 GitHub 链接,把你当时怎么想的、踩了什么坑、最后怎么改的讲出来。这一段的杀伤力,比"我熟悉 Spring Boot"大得多。

    第三,保持怀疑,包括对我这篇文章。

    我在第三章把"2 小时 25 分钟"这个数字连同它的三个前提条件一起摆出来了,第四章也写了 5 条不足。这不是谦虚,这是"允许批评"这个要求本身该有的样子。

    任何工具都有它的适用边界。判断一个工具值不值得用,标准从来不是"它有多强",而是"它的短板,是不是你恰好不需要的那块"。

    5.2 结论

    回到最开始那个问题:金九银十,"会全栈"的 Java 工程师更值钱吗?

    我的答案是:值钱的不是"会全栈"这三个字,而是"能独立闭环交付"这个能力。

    而这两者之间,差的是整个执行环节的成本。以前这个成本必须由你自己(花半年学前端)或者雇主(配两个人)来承担。现在多了一个第三种选择。

    这不会让"学前端"这件事变得没有意义——真正懂前端的人,依然比只会用工具的人更能解决深水区的问题。 但它确实改变了定价:你的技术广度决定你能走多远,而你的交付能力,决定你今天能拿到多少。

    如果非要用一句话总结我这次实测最真实的感受,大概是——

    工具能替你写代码,但替不了你对业务的判断。所以它最先淘汰的,不是不会写前端的人,是不知道自己要做什么的人。

    金九银十,祝各位都能拿到心仪的 offer。


    赞(0)
    未经允许不得转载:171主机测评 » 金九银十,一个“不学前端“的后端,凭什么敢投全栈岗?
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址