
今天面了一个自称“三年经验”的前端开场五分钟我就想把简历合上。简历写得很好看。工作经历排得整整齐齐项目写得满满当当技术栈一栏列了十几个框架和工具。我照惯例让他先讲讲自己最满意的项目他顿了一下说“就一个后台管理系统”。我问用了什么技术他说“就是Vue加Element”然后就不说话了。我追问除了页面还做了什么他想了半天说“封装过请求”。我让他说说封装了什么东西他说“就是拦截器加token”。我问拦截器除了加token还能干什么他一脸茫然。那一刻我确实有点崩溃。不是因为他不会而是因为他简历上写了“精通Vue、熟悉源码、熟练使用TypeScript”。我还没开始问难的甚至连本源都算不上。这种“半吊子前端”我这些年见了不止一个。今天这篇就写写面试半吊子前端的那些瞬间以及为什么基本功会成为面试场上的照妖镜。也顺便聊聊技术面试到底该怎么筛人求职者到底该怎么准备才算真正“会”前端。1. 面试现场实录半吊子的几个典型瞬间先说几个我印象特别深、几乎可以组成一个“半吊子前端图鉴”的场景。如果你也是面试官大概率会心一笑如果你是学习者希望这些不是你的未来。1.1 简历上的“精通”与嘴上的“用过”很多候选人的简历写得很有气势。“精通JavaScript”“熟悉浏览器渲染机制”“掌握Vue3响应式原理”。但问到具体内容就开始含糊。常规问法是这样的你说你精通JavaScript那我问你事件循环和微任务、宏任务的执行顺序是什么样的有人能说出“先同步后异步微任务先于宏任务”但问他为什么他会沉默。再问他Promise属于哪种任务他说不清楚。再问一个闭包是什么你能用来做什么他回答“函数里返回函数”。我追问变量怎么回收内存怎么释放他答不上来。这不叫精通这叫“用过”。用过一个东西和懂一个东西面试官只需要三个追问就能分辨。你的简历上写的每一个词都应该有被深挖的底气。写“精通”而答不出“为什么”是整个面试里最扣分的行为。1.2 项目经历里的“熟悉的陌生人”技术问题答不上来很多人会转到项目上找补“这个我也不太记得了但是我项目里用过。”我一般都会顺着他问“那你说说你项目里最复杂的一个需求。”这时候就会看到两种人。一种是眼里有光的能马上说出需求背景、技术选型、踩坑过程另一种就是“半吊子”描述永远是“我写了一个页面”“我调了一个接口”“我联调了一下”。项目真的是很好的照妖镜。因为真实做过的项目一定伴随冲突和问题比如“接口字段不统一怎么办”“表格大数据卡顿怎么办”“跨域了怎么办”。而“熟悉”项目的候选人只能说出最终的页面长什么样中间所有的“为什么”都是空白。我面试过一个候选人简历上写着“负责公司后台核心模块开发”。我问你这个模块有几个页面他说十几个。我问有没有遇到过权限控制的问题他说“有路由守卫做了”。我问守卫里怎么判断权限的他说“角色判断”。我再问角色存在哪里变了怎么办他说“没考虑那么细”。那一刻我的崩溃不只是因为他答不上来还因为他根本意识不到这一类问题在一场正常的技术面试里绝对会被问到。他没有为自己的项目做过一次复盘没有想过自己写的每一行代码为什么要这么写这比“不会”更让我觉得可怕。1.3 停留在“代码会跑就行”的认知水平还有一种半吊子他确实能干活但认知停留在“能跑就行”阶段。你问他为什么用Vue不用React他说“公司用的就是Vue”。你问他v-if和v-show的区别他能说出“一个不渲染一个隐藏”。再问他什么时候用哪个他就说“都行”。你问他有没有想过做工程化改造他反问“什么叫工程化”。你问他组件库的样式怎么定主题的他说“用CSS覆盖”。你问他打包体积太大怎么优化他说“还没遇到”。这些问题的答案本身不重要重要的是暴露了他有没有“往下挖一层”的习惯。半吊子和靠谱开发者的分水岭就在这里一个遇到问题只看表面一个会去想背后的原理、权衡和取舍。2. 为什么半吊子会这么多基本功塌方的根源见过很多半吊子候选人之后我开始思考一个问题他们到底是怎么走到面试这个环节的为什么做了两三年基本功还这么弱后来我发现原因其实可以归纳成几条每一条都对应一种成长路径上的陷阱。2.1 把“会写页面”当成“会前端”前端这个岗位有个很迷惑人的特性入门的视觉反馈特别快。你写一个div浏览器立刻渲染出来你改个颜色页面马上变。这种“即时反馈”给了很多人一种错觉觉得自己在掌控技术。而实际上页面能展示和你理解渲染原理之间隔着一整条流水线。你只是站在流水线的末端看产品成型却不知道流水线是怎么转起来的。我在面试时经常举一个例子你说你会用CSS那我问你一个元素在页面上的位置是由哪几个关键属性决定的很多人只能说出position说不出文档流、包含块、margin塌陷这些东西。你说你不需要懂这些可它就是布局问题的本源。会写页面只是前端最表层的能力。所谓“会前端”至少应该覆盖语言核心、浏览器工作原理、运行时机制、网络交互、工程化组织、性能优化意识。这些缺一不可否则只要页面一复杂你立刻就会失控。2.2 “看视频学习”成瘾练习却几乎没有这几年有个现象收藏从未停止学习从未开始。很多人的学习路径是看视频、看文章、买课看到“面试必问”“一文搞懂”就点收藏但真正动手写代码的时间少得可怜。视频学习的假象在于老师写得快你听得爽一节课下来你觉得“我都会了”。可是面试的时候不给你老师不给你提示也不给你编辑器里的代码提示你得凭空组织出自己的知识体系。这时候你才发现脑子里的“知识”全是模糊的影像没有一个能被你调出来。我特别相信一个标准你写不出来就是不会。你讲不明白就是不懂。低效的学习是什么是看别人写代码还觉得简单高效的学习是什么是自己写不出来然后去翻源码、查文档、写demo最后彻底搞懂。同样是两个小时前者是“看了一个视频”后者是“亲手解决了一个问题”两者在面试里的差距天壤之别。2.3 知识点零散没有形成知识网络半吊子的另一个典型特征是知识是碎片化的。你问什么他好像都知道一点但串不起来。他知道Vue有虚拟DOM但不知道虚拟DOM解决了什么他知道浏览器有重排重绘但不知道什么操作会引起他知道Webpack有loader但不知道怎么配一个。碎片化知识最大的问题是它没法迁移。今天你学到的一个技巧换一个场景就失效了因为你不知道这个技巧是为哪个问题服务的。而扎实的基本功本质上是一张网你学到一个新知识能和旧知识连在一起形成“因为A所以B但C场景下要小心D”这样的推理链。所以我在面试里特别喜欢追问“为什么”。不是因为想刁难人而是想通过“为什么”看他脑子里有没有这张网。比如我问他页面加载慢你怎么排查他如果说“用Chrome的Performance面板看”OK继续追问“哪个指标代表什么”如果他接着说“看FCPLCP还有TTI”我会再追问“这些指标哪一个更能反映用户真实体验”。能一步步答下来的人他的知识是连成片的答不下来的人基本就是背了几个名词。2.4 项目外包化、低代码化让人越来越没机会碰核心还有一个客观原因现在很多公司的前端业务被外包化、模板化、低代码化了。开发者在做页面时有现成的组件库有现成的脚手架有现成的接口文档。很多人写了三年写的是业务组件拼装和样式微调从来没有人让他从零建立一个项目。框架的底层、构建的流程、兼容性的处理对他来说都是黑盒。但这恰恰是基本功的价值所在。因为越是在“傻瓜化”的工具环境里能主动摸清原理的人就越稀缺就越值钱。永远不要觉得“公司没让我做底层我没机会”机会从来是自己给自己找的。3. 面试官视角如何在30分钟内筛掉半吊子如果你也是前端技术面试官或者即将要开始面试别人这里有一些我已经实践过很久的排查思路。核心目标只有一个在最短的时间里分辨出“真正能做事的”和“简历包装很漂亮的”。3.1 先从一个“大范围”的问题入手我一般会先问一个开放式问题“从你在浏览器输入一个URL到页面完整展示中间经历了哪些步骤”这个问题看似基础但它能覆盖很多知识点DNS解析、HTTP请求、服务器响应、HTML解析、CSS渲染、JavaScript加载执行、DOM树构建等等。注意我不需要候选人背出标准答案我只需要看他能说多远。有人说到DNS就停了有人说到网络请求就开始含糊有人能讲到渲染进程和GPU合成。这段回答质量直接决定了我后面问什么、从哪个深度问。这一步核心判据不是“答得多”而是“有没有逻辑链”。比如他说“HTML解析完然后构建DOM树”我会追问“构建DOM树中途遇到script标签会怎样”。他如果能说出“会暂停解析先下载执行脚本”接着能继续说出“可以用defer和async控制”那他就及格了。半吊子典型表现是每句话都说对但每句话之间没有任何因果连接。3.2 语言基础用“假装面试官”的追问法语言基础是前端的基本功。不同水平的候选人在语言维度上的回答表现出明显的分层只会用不深究回答“闭包就是函数里的函数”说不出为什么需要闭包。了解原理但不会表达知道闭包是为了让内部函数访问外部变量但说不清楚变量如何保存、何时释放。真正懂得底层能从执行上下文、作用域链、垃圾回收机制层层拆解并能说出在防抖、柯里化、模块封装里的实际应用。我的做法是准备一个小题库每组问题都带一个“为什么”。事件循环执行顺序是什么为什么微任务先执行原型链new 一个对象发生了什么prototype和__proto__分别是什么this箭头函数里的this为什么不能被改变能用call改变吗Promise为什么要有微任务宏任务和微任务在一起时谁先执行每一个问题看起来不大但环环相扣。半吊子会在第一组问题就被卡住因为他们的知识只是听过名词没有真正独立推导过结论。3.3 动手题看代码风格和问题拆解能力只问不练很容易被“嘴强王者”骗过去。所以我一定会安排动手环节。在它们中选一两个足够了关键是让他讲思路我给你一个数组里面有嵌套数组你把它一维化。这道题考察的是递归、数组方法、参数处理。我见过最让我满意的答案不是一步写出最简代码而是他能一边写一边说先判断元素是不是数组如果是递归处理用Array.isArray判断要注意深度用flat其实可以但你不能只会用API还得知道它背后做了什么。这种人基本功是真的扎实。半吊子最大的问题是拿到题目就愣住然后开始写写两行觉得不对又删掉最后在我提示下勉强写出来整个过程完全看不到他大脑里有什么清晰的解法路径。动手题考察的不只是你会不会做更是你面对未知问题时的拆解能力这是日常开发最需要的能力。3.4 问项目必须精确到“你的改动”和“实际数据”项目经历我坚决不允许空谈。简单给一个排查模板面试官可以直接照着问。你也别问太虚的东西比如“你在这个项目里做了什么”这种问题太开放容易被含糊带过。要拆开问越细越好。这个项目的整体架构是什么你负责的是哪一层你做的这个模块数据流是怎么走的你提到性能优化优化前和优化后的指标分别是什么你和后端联调时遇到过什么字段问题怎么解决的你写的这个组件有哪些边界情况没处理好的这一套问下来半吊子基本就藏不住了。因为真实做过的人一定会在某个点上突然来了精神“当时踩坑踩了很久”“这个bug我印象特别深”。面过上千人我总结出一条经验描述很流畅、很标准、像背书的候选人大概率没深度描述磕磕绊绊但能在某个具体细节上说得很生动的人才是真正干活的人。4. 给求职者和面试官的建议别再互相折磨了聊完了“半吊子”的种种表现我还是想给双方一些实际建议。不然这篇文章就真的只是发泄了我没兴趣做只吐槽不给方案的人。4.1 给求职者把“精通”两个字从简历上删掉先来一个最实用、最直接的在你还不能不看文档就说出原理、不查资料手写实现之前把简历上的“精通”“熟悉源码”“深入理解”这些词全删了。简历上的关键技术词越多面试时被深挖的概率越大。你写了就不会被追问那叫诚实你写了却被追问那叫自曝。我强烈建议简历上的每个技术词都像面试官一样问自己三个问题它是什么它解决什么问题我实际用过它吗每项能做到“用大白话讲清楚”才配写上去。4.2 给求职者建立自己的“最小知识网络”与其到处追着面试题背不如花时间把下面这张网络搭好。语言核心变量、类型、作用域、闭包、原型链、事件循环、Promise浏览器页面渲染流程、回流重绘、缓存机制、安全、性能指标框架如何实现响应式、虚拟DOM和diff算法、组件生命周期、通信方式工程化模块化、打包原理、依赖管理、环境配置、部署流程网络HTTP、HTTPS、状态码、跨域方案、接口设计不要试图一口气全学完而是每学习一个知识点都问一句“它是为了解决什么问题而存在的”。这样做的好处是知识会自然串起来面试时哪怕遇到不会的题也能用邻近知识做推理“虽然我不确定但按照我对事件循环的理解应该……”——这种回答比“我不会”要好得多。4.3 给求职者面试是“证明我干过”不是“展示我知道”面试的本质不是考试是证明你能干活。所以要学会用项目来组织答案先说要解决的问题再说你用的方案再说方案为什么是对的最后说踩了什么坑。每回答一个面试问题都走完这四步你会从众多候选人里脱颖而出。我还想特别叮嘱一句不要背题。现在的面试官越来越精背题的答案一听就是别人的思路。你可以参考问题清单但一定要用自己的语言组织答案。4.4 给面试官筛的不是“最强者”是“最匹配者”说回面试官这边有个执念也要放下来。有些面试官喜欢用“问倒人”来显示水平把面试变成了知识竞赛。这没有意义。面试官的任务不是寻找“无所不知的人”而是筛选出“能完成这边工作的人”。所以出题之前先想清楚这个岗位需要什么技术栈、什么协作方式、什么复杂度。如果岗位就是常规的业务开发就不必抓着人家问“Vue3源码里effect和track怎么实现”。反之如果岗位要求手写框架级别的代码那就别拿基础题浪费时间。我在面试末尾必问一个问题“你最近在研究什么技术踩过什么坑”这个问题的含金量极高因为它能直接看出来候选人有没有学习的热情和钻研的习惯。同一个岗位我愿意要一个基础稍弱但热爱钻研的人也不要一个基础尚可但毫无求知欲的“老油条”。4.5 给面试官建立一套可复用的评分表我自己用的评分表分成四个维度语言基础、浏览器与网络、框架与工程化、项目深度。每个维度有五个档位从“没听说过”到“能讲清楚原理、有自己思考”共五档。满分为20分低于12分直接不通过。每个档位都附一句描述性的话防止自己面试多了凭感觉打分。这套评分表真正的作用不是给候选人定生死而是让面试流程公平、稳定。你也不会因为今天心情不好而挂掉一个优秀的人更不会因为对方说话好听而忽略基础薄弱。5. 写在最后半吊子并不可怕可怕的是不自知说实话写到这里我情绪已经平复不少。那个让我“瞬间崩溃”的候选人其实也不是“无药可救”。他只是把学习这件事想得太简单了把“看懂了”当成了“学会了”。我自己带过的新人里有刚毕业的学生也有转行过来的零基础还有工作了几年但想补基础的前端。我发现能不能从不牢靠的“半吊子”变成扎实的开发者主要看一条有没有承认自己不够好的勇气有没有从头再来的耐心。如果你也是那个半吊子别慌也别自我放弃。基础这东西任何时候补都来得及。我在实际面试中见过的很多优秀候选人有一个共同点他们大多数是从无数次“发现自己不会”的尴尬里爬出来的。被面试官问住不丢人丢了工作还丢了下一次机会才可惜。面试后赶紧复盘问题把每个卡壳的点补成体系这是最有效的成长路径。再分享一个我个人的面试心得判断一个前端是否靠谱根本不看他能说出多少名词。看他接到一个任务时是先动手再思考还是先拆解问题再动手看他遇到报错时是直接改代码碰运气还是先推演原因再处理看他写完后觉得“能跑就行”还是会停下来想想“这个设计合理吗”。这三个习惯比任何技术栈都重要。希望在读完这篇后无论你是求职者还是面试官都能少一点崩溃时刻多一点真正的成长。