CSDN|零基础编程小白如何拿 Offer?八年经验面试官万字肺腑之言


【CSDN|零基础编程小白如何拿 Offer?八年经验面试官万字肺腑之言】CSDN|零基础编程小白如何拿 Offer?八年经验面试官万字肺腑之言
本文插图
作者 | hsm_computer 责编 | 伍杏玲 出品 | CSDN(ID:CSDNnews) 对于很多程序员小白来说 , 只要能有实践的机会 , 哪怕工资再低 , 公司情况再一般 , 只要自己上心努力 , 就可能在短时间内快速提升 , 甚至有希望在工作2年后进大厂 , 毕竟项目里真实的开发实践环境是平时学习不能模拟的 。但很多想从事Java开发的同学被卡在了第一步:无法积累足以找到工作的项目经验 , 甚至不知道该如何积累 , 导致缺少面试机会 , 或者面试总通不过 , 导致很多有编程天赋、聪明上进的程序员可能与感兴趣的职业失之交臂 。作为面试官 , 我知道Java初级开发的最低面试标准 , 作为Java培训讲师 , 我帮助过不少零基础的人应聘成功初级Java开发岗 。 在这篇文章里 , 将结合我多年来从事面试官和培训师的经验 , 针对零Java基础、零Java项目基础的同学 , 讲述下如何积累项目经验 , 以及成功找到开发工作的相关技巧 。明确目标:去哪些公司应聘?有哪些要求?对于零基础的同学来说 , 目标可以是半年后(最快三个月)进公司做Java , 这里的公司可能是: 1、规模比较小的公司; 2、外派公司:以外派的身份到银行保险之类甲方公司去干活; 3、外包公司:在公司里干些分包的活 。如何你的学历和学校比较好的话 , 可以挑战下大公司 , 但毕竟路要一步步走 。 不过在上面的这些公司里 , 可能工作环境和氛围不尽如意 , 但项目包含的值钱技术点足以帮助你在两三年后进大厂 。 更重要的是 , 这些公司的应聘要求相对比较低 , 下面是这些目标公司的面试基础要求: 1、商业项目经验越长越好 , 但至少做过SSM或Spring Boot的项目 。2、数据库会增删改查 , 最好知道单机版调优技巧 , 比如索引和执行计划 。 会Spring用Mybatis整合数据库的经验 , 知道在Mybatis的配置文件编写增删改查乃至事务的技巧 。3、Java基础 , 掌握集合、文件操作、异常处理、面向对象、多线程等基础知识 , 可通过刷面试题达到要求 。4、计算机基础知识:数据结构、算法、操作系统、网络编程等技能 。 其中可能问些数据结构和算法的问题 , 其它问题大多通过刷题来解决 。以上是技术方面的 , 当然还有工作态度方面:比如人看上去比较老实、肯加班、学习能力强、沟通没问题等 。 说实在的 , 在面试的这段较短时间内 , 很少因为这些因素刷掉人的 , 比如我问愿不愿意加班 , 听到的大多是愿意加班 , 问遇到你不熟悉的技术怎么办 , 大多数的回答都是尽快努力学习 。而面试中的加分项 , 比如以敏捷等方式实践项目的技巧、JVM性能调优、分布式组件基础、Linux实践要点和分析与排查问题的能力 。 虽然对于初级开发不做要求 , 但真的要准备面试时的说辞 , 你说了就比别人强 , 在本文里也会给出相关技巧 。把公司的面试要求对应到技术点上我们目标明确后 , 可以对应列出需掌握的技术点 。 在实践中可能有增减的技术点 , 但至少不会出现“花大量时间去学无需掌握技能”的情况 。 下面我将由浅到深 , 给出各方面具体要学的技术点 。首先是Java语法 , 包括基础语法、集合、IO操作、异常处理、JDBC、多线程 。对初级开发来说 , 面向对象思想和设计模式太抽象 , 如果没有一定项目的积淀很难灵活应用 , 所以大多数初级开发就“会说”而已 。 这块大家只要多背些题 , 同时再结合项目说下你用过的设计模式应该就可以了 , 无需花大力气准备 。别去看Java界面开发的内容 , 如Swing方面的技能 , 因为面试不问 。 对于Java虚拟机和垃圾回收流程方面 , 虽然抽象 , 但项目里会用到 , 所以不仅需要掌握理论 , 最好再结合项目准备亮点 。其次是数据库方面 , 至少会一种数据库 , 如MySQL或SQL Server或Oracle等 。会写增删改查 , 知道索引怎么用 , 如何建表 , 知道group by、having、连接查询和子查询等的技巧 。掌握用JDBC和Mybatis等操作数据库的基本操作 , 说白了该知道如何做增删改查 。 如果你知道执行计划 , Redis、Mycat等资深调优技能 , 是加分项 , 但这些对初级开发不做过多的要求 。最重要的是框架方面 , 当前Java较流行的是Spring Boot和SSM框架 。 对初级开发来说 , 能照着现成例子做增删改插查的业务模块 , 如有增加订单的方法 , 你照着它写个删除订单的方法 。 所以你了解基本的Spring相关配置文件 , SSM或Spring Boot项目的开发流程 , 数据库整合的方式 。 你如果具备调试框架代码分析解决实际问题的能力更好 。以上给出的其实是低配版的技能要求 , 只要你会增删改查 , 基本也就达到了进小公司干活的要求 。 在明确技术点的基础上 , 下面就会给出学习的相关建议 。如何在短时间内快速掌握基础知识?对于IT人来说 , 职业发展的黄金时间并不多 , 如果30岁还在小公司 , 你后面就会很吃力 。 一般来说 , 初级开发升高级需要2到3年 , 达到高级开发后还需1到2年才具备进大厂的资格 , 外加些余量 , 所以零基础到进大厂 , 一般需要4到5年时间 。在这段时间里 , 我们能浪费的时间还真不多 。 通常来说 , 半年足矣 , 顶多一年 , 如果超过一年还没得到实践机会 , 要么就是态度问题 , 要么就是方法问题 。 为了杜绝方法问题 , 如下给出些具体的学习规划 。1、准备阶段最多是一周 , 准备好在自己的机器上安装IDEA等开发环境 , 买若干本Java基础书、SSM、Spring Boot相关的书 。 如果不知道该买哪些 , 就看销量最好的 , 最好买带视频教程 , 同一题材买2到3本 , 比如Java基础买2本 , SSM买两到三本 , Spring Boot买两到三本 。 为什么要买两到三本呢 , 因为一本书上的知识点可能不全 , 买多了知识点就重复了 , 如果买两到三本 , 基本该覆盖到的技术点覆盖了 。2、环境安装好了 , 书也买好了 , 照着书敲代码了 。 我们拿现成代码复制粘贴来运行 , 退一步就是照着书上敲 , 别自己写代码 。 因为刚开始什么都不懂 , 自己写很容易出错 , 往往因为一个拼写错误就卡两三个小时 , 这样浪费时间 。把敲进去的代码运行后 , 就能从结果里反推关键代码的含义 。 再加上书上的说明 , 很容易就能快速上手 。 一般来说 , 对于Java基础知识 , 一般两周运行并理解好一本书 , 顶多用1个月就能掌握Java核心的大致语法 。3、JDBC数据库和SSM框架也一样 , 这两方面需要配置环境 , 如要搭建MySQL数据库 , 在其中建表 , 搭建SSM环境 , 下载pom文件 , 编写配置文件并部署到Web服务器上 。 对于数据库和框架 , 难点并不是代码 , 而是如何成功运行 , 如果你的书有视频教程 , 你可以照着做 , 遇到问题 , 就去搜索引擎搜索 , 这个过程可能需要1个月 。 对大多数零基础的同学而言 , 这块确实有难度 , 但大家都这样过来了 , 遇到问题如何解决?第一看视频照着别人做 , 第二到网上查解决方法 。掌握基础知识的标志是运行通并理解两到三个SSM框架 , 运行通了 , 大致能理解其中的调用步骤以及基本配置 , 在下面部分里我会详细给出框架项目里该要具体掌握的点 。如何学习框架项目?不同的SSM等框架项目业务可能不同 , 比如是商城或管理系统 , 但调试的步骤大致相同 。1、安装数据库环境 , 一般是MySQL , 在本地装服务器和Navicat客户端 。 安装好以后 , 还需根据业务建表 。2、在IDEA开发环境里导入项目 , 建议用书上的项目 , 或者网上视频课的代码 , 不建议运行来路不明的项目 。 如果项目经过出版社等机构认可后 , 运行通的概率就很高 。3、导入项目后 , 用pom或gradle去下载依赖包 , 确保代码里所有的import都正确 , 没语法问题就行 。4、比较麻烦的是集成Web环境 , 不建议自己配置额外Tomcat等 , 用IDEA环境集成Tomcat , 并把代码部署到Tomcat服务器里 , 如果是Spring Boot项目 , 还能直接运行 。部署后就可以在页面上运行 , 运行通后 , 无需跑遍所有的业务点 , 跑通3个功能即可 , 因为你关注的是技术 , 不是业务 。 我拿最基础的登录功能来例子说明大家需要掌握的流程和细节 。1、前端只要关注用户名和密码如何传到Java代码 , 可以是Ajax、query、form , 至于前端页面里的juery等元素了解即可 , 开始阶段可忽略 。2、前端请求会通过配置文件映射到业务处理层 , 即business层 , 这块需要关注配置文件 , 理解如何把请求映射到具体的业务处理类 , 在业务类里 , 一般会用spring的方式引入依赖包 , 比如@autowired等的方式 , 这种依赖方式需要结合配置文件或注解搞明白 。3、业务层调用service层 , service会调用dao或repo层 , 在dao或repo层通过Mybatis和数据库交互 。 这种层层调用关系一般不难 , 难点在于Mybatis和数据库的交互 , 用户model类如何与数据库里的用户表相关联 , Mybatis如何传入参数 , 如何把从数据库里的结果映射到业务model类里 。在登录流程里 , 先从前端收集登录信息 , 层层到数据库 , 数据库结果层层传递回前端 , 这个流程以及类之间的调用关系大家需要看明白 , 类似地理解其它若干个流程 , 这样就能基本掌握SSM框架或Spring Boot框架 。在此基础上 , 再看些基本的配置技巧 , 比如Mybatis如何配置数据源 , Spring如何同事务整合等 , 当你用一个月到两个左右的时间运行通框架代码并理解后 , 你就掌握面向框架的增删改查流程了 , 就有资格去面试了 。在简历上写全公司感兴趣的要素 , 至少先得到面试机会一般通过2个月的时间学习后 , 你至少掌握框架层面的增删改查技巧 。 如果要进一步理解框架以及其它值钱技术(如Redis , kafka等分布式技术) , 靠自学就比较难了 。 虽然这些技术的理论谁都接触到 , 但如果你没做过商业项目 , 很难理解这些技术在项目里的用法 。 所以这个阶段你就该去找工作了 。如果你有足够的面试机会 , 可能刚开始会一问三不知 , 但至少能用面试的问题来调整自己的准备方向 , 这样多面试几次就能成 。 但不少同学由于简历不达标 , 甚至不会有面试机会 。 哪些简历得不到面试机会呢? 出现最多的问题是 , 在简历上看不出相关技术的项目经验 , 比如某公司要一个Java初级开发 , 那么在职位介绍上一定会写要求 , 比如框架会SSM , 数据库Mysql等 。 哪怕要求再低 , 相关技术一定得有项目经验来支撑 , 如果就在简历上写会xx技术 , 没项目经验 , 或者你给出的项目里 , 用到的技术都是人家不用的 , 那么自然就连面试机会都没了 。 哪怕你是零基础 , 哪怕你就只有学习项目经验 , 你简历上好好写 , 至少能得到小公司或外派公司的面试机会 。1、简历上介绍完年龄学校学历手机联系方式后 , 立即列出你掌握的技术 , 如: (1)熟悉SSM框架 , 有相关项目经验 (2)掌握MySQL等数据库等用法 (3)有n个项目经验 , 实践过xx项目 , 总之职位介绍上要求什么 , 你尽量开门见山地列上 , 这样看简历的人就会感兴趣 , 然后就向下读了 。2、倒序列出你做的项目 , 如果你没商业项目 , 那就写学习项目 , 写的时候淡化学习项目的因素 , 在写项目时 , 别侧重写业务功能 , 侧重写用到的技术 , 如下: 在xx到xx的时间段里 , 我做了xx系统 , 其中用到了Spring Boot框架 , 我做了其中的订单查询和xx系统 , 这个项目有3个人做 , 数据库是Mysql 。 具体还用到了Mybatis , Spring事务 , XML文件读写技术(其它JD上要求的技术 , 如果你用在项目里 , 也写上) 。3、有几个写几个 , 如果你就写xx商城之类的项目 , 面试官大多能看出是学习项目 , 这样可能只有项目比较急的公司或外派公司才会给面试机会 , 所以你尽量挖掘你的商业项目经验 。比如你在大学实习阶段 , 在外面公司用过Java , 或者你毕业论文项目是公司里的真实项目 , 或者你毕业后 , 虽然不是从事Java相关开发工作 , 但和朋友一起做过兼职项目 。总之多挖掘些公司的商业项目出来 , 但别太夸张 , 比如某商城项目 , 你说你全做了谁都不信 , 但你说这是个维护项目 , 你们公司做了其中一部分 , 这样可信度就大了 。 或者你是兼职做了某项目里的xx子模块 , 同时外带功能改进 , 这样面试官也能理解 。可能有同学说了 , 我确实没商业项目经验 , 所以找工作有困难 , 你该继续积累学习项目经验 , 多挖掘商业项目经验 。准备面试时 , 先要刷题如果你投出去的简历大多石沉大海 , 可以多加上些项目经验 , 或者多加些技术描述 , 同时看下你的简历是否能对上对方的JD 。 当你有面试机会时 , 首先应该刷题 , 毕竟很多面试题是源于项目但高于项目 。1、网上搜Java、Spring、SSM框架、Spring Boot、数据库等面试题 , 总能看到一大堆题目 , 先把它们背下来 , 不少地方甚至有系列题 , 做到这点基本没问题 。2、对初级开发来说 , 面试官会侧重Java基础 , 所以大家还可以去找些集合、异常处理、IO和多线程方面的题去背下 。3、找些数据结构和算法题 , 比如排序相关 , 链表堆栈队列等的 , 这块不仅要会说 , 更要会写代码 , 毕竟不少公司有笔试 。4、至于智力题、情商题还有面试刁钻问题 , 这块也有现成的资料 。但如果你单纯准备这些理论方面的面试题 , 大多数面试你过不了 , 因为面试官更要结合项目经验考核你的技术: 1、问项目里常用的SSM框架配置 , Mybaits和Spring整合的方式 , 你做过项目一定知道 , 没做过就很难说出 。2、结合项目业务说下SSM框架或Spring Boot的流程 。如果你主动地结合项目展示你的技能以及加分项 , 能超越你的大多数竞争者 , 之前说过大多数初级开发只会增删改查 , 在下文里 , 就将围绕项目介绍 , 告诉大家展示技能和亮点的面试技巧 。如何准备介绍项目的说辞?我面过不少候选人 , 有人面试题回答都很好 , 但让介绍项目 , 并结合项目提问技术点时 , 就回答得很不好了 , 这也是大多数零基础开发者的通病 。大家别抱有幻想 , 面试时面试官一定会结合项目提问 , 下面我给出具体的应对技巧 。1、面试前多练习项目说辞 , 下面给出一个范例: 我做的最近的一个项目 , 客户方是xx , 有5个人做了半年 , 是xx系统的维护项目(说出项目要素 , 暗示不是学习项目 , 是公司的实战项目) , 用到了SSM框架 , 数据库用MySQL , 还用到了数据库调优(索引) , 批量读写文件等的技术 。 (本次面试岗位的JD上还包含哪些技术要求 , 这里尽可能地都说全) 。项目用到了敏捷的开发模式 , 一般是1个月有一次发布 , 项目里用了Maven , junit、Jenkins等管理软件 , 用log4j来写日志(进一步暗示是实战项目 , 同时暗示你有一定的项目经验) 。 在这个项目里 , 我除了做开发以外 , 还做了单元测试和集成测试 , 测试时用junit(暗示你不是只会写代码) 。在项目开发过程中 , 我还有数据库调优和内存调优的经验 , 通过观察Linux日志分析并排查过实际问题 。 (抛出亮点 , 并展示你有实际解决问题的能力) 说到这里就可以了 , 由于你抛出了JD里提到的关键点 , 以及调优等亮点说辞 , 就自然而然地把后继问题引到这些方面了 。2、介绍项目别深入业务细节 。 我遇到一些候选人 , 大谈特谈某个模块里的业务 , 比如第一步调会员第二步调风控第三步再怎么地 , 遇到这类情况我会直接打断 , 因为当前岗位的业务一定和之前的不同 , 面试官不关心 , 这样候选人就相当于把后面提问的主导权交到面试官手里了 。3、用1-2分钟介绍项目 , 说到点、别涵盖面 。 如你提到用Log4j做日志就行 , 别深入说具体的配置 , 因为当前介绍项目 , 如果深入细节会让面试官感觉你主次不分 。4、介绍项目有两个目的 , 第一证明你在项目里过JD上的技术 , 第二抛出关键字引导面试官后继提问 , 所以你抛出的技术你至少得知道怎么用 , 第二尽可能多地抛出亮点 。除了数据库调优JVM内存调优及分析解决实际问题的亮点外 , 适合零基础的同学抛出的亮点还有如下这些: 1、Java集合方面 , 结合底层代码说下快速失效 , HashCode , ArrayList扩容的点 , 这块能展示底层代码的能力 , 证明你的资深 。2、线程方面 , 了解violate+ThreadLocal等关键字 , 能证明你熟悉多线程并发方面的内存管理细节 。3、结合ConcurrentHashMap , 展示并发能力 , 展示你熟悉底层代码 。4、围绕分析日志 , 准备Linux读文件和搜索文件的技巧 , 证明你解决过实际问题 。一方面 , 准备此类亮点并不难 , 我之前写过一篇文章《如何准备Java面试?如何把面试官的提问引导到自己准备好的范围内?》 , 详细给出了在项目介绍阶段引导面试官提问的方法和说辞 , 大家可以参考下 。另一方面 , 在介绍项目时抛出此类亮点很简单 , 比如就说一句 , 在项目里我们还遇到过因集合快速失效而导致的问题 , 经过Debug底层代码 , 我就解决了这个问题 。 其它问题也可以照此方式抛出 。能力一般 , 更要在回答问题时引导面试官零基础的同学经过一段时间的学习和背面试题 , 能力达到能干活的程度 , 但如果被面试官发散性地提问的话 , 很多问题是说不上的 , 所以同学们面试时更要掌握引导技巧 , 引导技巧说穿了一文不值 , 即回答好对应问题后再多说一句 , 然后面试官自然就接茬问了 。下面给出具体的范例: 1、回答完数据库相关的问题后 , 你顺口说句 , “我在项目里 , 还通过执行计划优化过SQL技能” 。 然后展开通过执行计划调优 , 大多数是理论方面的技巧 , 初级开发绝对可以准备 。2、在回答集合方面问题后 , 你说 , 在遍历集合的时候 , 我们项目里会非常小心快速失效问题 , 然后展开 。3、在回答线程内存模型 , 或被问到volatile相关问题时 , 你说 , 我知道ConcurrentHashMap里用到volatile , 我能具体说下吗?再结合这个对象 , 扩展到线程并发话题 , 结合底层代码讲的 。4、被问异常处理问题 , 如运行期异常 , 如何自定义异常 , 那么再引导到异常处理最佳实践 , 比如finally的用法 。5、回答完线程方面的问题后 , 提下在项目里用过ThreadLocal , 由此引出底层的Weak引用话题 , 再引出JVM结构以及OOM调优方面的话题 。 具体的细节大家可以参照我提到过的文章 。6、准备好Log4j的实践技巧 , 在被问到SSM等框架时 , 回答好问题再多说一句 , 在这个项目里我们还用到了Log4j分级打印日志 , 然后展开 。下面就给出三个非常实用的引导案例 , 哪怕你之前是零基础 , 照样可以准备 , 照样可以在面试中发挥 。 第一个可以从String一直引导到JVM性能调优: String问题面试时一定会问到 , 比如String a= “123”; String b=”123”; a==b;结果是true还是false , 这个问题大概率问到 。 怎么引导呢? 先说结果是true , 因为常量是存储在JVM的常量池里 , 然后说 , 我们项目里 , 在用String时要非常注意 , 因为会涉及到JVM性能优化 , 比如尽量少用连接操作 , 因为会造成内存碎片 , 由此引导到JVM调优 。当面试官很有可能问 , 你还知道JVM调优方法?你就可以顺带展开 , 如用到集合要clear、用好IO、Connection对象要close , 尽量用StringBuilder等 。然后接着说 , 在实际项目里 , 我还排查过线上OOM问题 。面试官很可能继续问 , 如在测试环境 , 看到日志里经常有OOM , 然后你看dump文件 , 发现OOM的原因是某个大对象没clear , 或者说ThreadLocal对象没remove , 或者是Mybatis里不慎把表里所有数据都捞出来了等等 。 这样一引导后 , 虽然你实际能力通过3个月运行过若干SSM项目 , 但和别的初级开发竞争者 , 差距马上就拉开了 。第二个引导案例是从volatile等问题引导到ConcurrentHashmap底层代码 。 对于初级开发而言 , ConcurrentHashmap底层代码是个万能的法宝 , 你费少许功夫看明白底层源码的流程 , 并看明白其中读写操作和并发的关系 , 在面试中可以说是百试百灵的 。面试时问多线程 , volatile关键字大概率被问到 。 比如你知道volatile是什么含义吗? 你除了说好本身含义外 , 再说下 , 我看过ConcurrentHashmap底层源代码 , 其中用到volatile , 虽然volatile无法做到原子性 , 但可以提升效率 。 你看了底层源码后就能继续说 , 在该类的put和get方法 , 以及Entry对象里 , 大量用到这个 , 还有transient关键字 。 当你结合底层源码说清楚ConcurrentHashmap的相关流程以后 , 一些外派公司甚至就不再问了 。第三个引导案例展示你的Java基础 , 从final关键字引导到JVM垃圾回收流程 , 并进一步引导到OOM问题排查 。 final关键字面试时一般会问 , 你回答好final作用在类、方法上的含义后 , 再说下 , 我还知道匿名内部类只能访问final类型的变量 , 这个点可能一些高级开发不知道 , 你提出来后面试官一定会感兴趣 。说好以后 , 你就可以继续说 , 平时我还专研过JVM GC流程 , 这个背资料就能说 , 说好以后你再深入下说 , 我除了知道GC回收外 , 还在项目里排查过OOM问题 , 至于OOM问题的排查方法 , 大家可以参照前文的说辞 。大家在引导说辞在面试之前就要准备好相关内容 , 比如被问到xx问题还如何抛出其它相关点 , 这样引导的时候就会很自然 , 否则的话被面试官看出牵强附会的痕迹就不好了 。原本面试官在面试初级开发的时候 , 本来期望就不高 , 能增删改查就行了 , 但你如果用上述三个引导说辞 , 让面试官挖掘出你底层代码和OOM以及JVM等方面的亮点 , 这样哪怕你有些问题没回答好 , 也会大概率过面试 , 如果你其它回答中规中矩 , 但如果通过引导说出上述任一亮点的话 , 那么基本上面试成功就成定局了 。总结如果零基础的同学按本文给出技巧和经验 , 虽然不敢保证一定能100%找到工作 , 但一定能大幅增加通过面试找到工作的概率 , 因为本文总结了前人的经验 。“说一千道一万不如真刀真枪地干” , 大家如果真开始敲代码 , 一定会遇到很多问题 , 当大家进展到准备简历和面试实战的阶段 , 会遇到更多的问题 。 但我相信 , 本文给出的介绍项目经验和面试引导相关技巧 , 能帮助到大家 , 当大家开始实践后 , 自然会见招拆招 , 克服掉很多问题 。如果大家总是有各种顾虑 , 比如担心学好了工作找不到 , 或者积累的项目通不过筛选 , 那么就会止步不前 , 可能将失去机会 。 预祝大家经过努力 , 找到心仪的工作 。


推荐阅读