8年经验的老程序员,告诉你如何看透面试、通过面试

news2024/11/26 12:51:55

关注公众号程序员小灰,不迷路!

大家好,我是程序员小灰。小灰的公众号里有一位读者朋友鹤涵,是一个8年Java经验的资深程序员,并且当过多年面试官,面试过的人数超过百人。

今天,小灰特意把他邀请过来,给大家分享一下面试的一些方法,流程、实际案例,以及自己的思考。这篇分享非常良心,强烈建议大家收藏一下。

一、面试方法

一)考察点

面试主要考察:技能、能力、价值观、匹配度

1、技能

一个程序员技能过关才能完成日常开发任务,所以基础知识也是面试的必考内容。

一个Java程序员需要掌握的技能还真不少。Java基础,开源框架,中间件,代码设计,项目实战通通得会。

针对上面的每个Java技术栈的知识点,都有多年的面试题积累了(俗称「八股文」),面试前一定要过一遍,要求广度。

实际工作项目中使用到的技术一定要重点掌握,要求深度。

下面是我整理的知识点详细的脑图:

fc9fb6778b0807ea1e2880a6bf9d83a8.jpeg

2、能力

工作年限和职级越高,对能力的要求越大,对技能的要求反而没那么大。

学习能力:

世界变化太快,尤其是在IT行业。面对新的知识和技能时,具备快速学习的能力至关重要,能够迅速掌握并应用新的知识。

沟通能力:

能够清晰、准确地表达自己的想法和观点,并理解他人的意见和观点,以进行有效的沟通和交流。

作为程序员,不仅仅需要会写代码,还需要具备良好的沟通能力。即使不直接面对客户,与产品经理、测试同事、领导和下属之间也需要进行频繁的沟通。

3、价值观

当设定了自己的目标和追求时,面对困难和挑战,是选择坚持不轻易放弃,持之以恒地努力追求目标,还是选择轻易放弃?

这是否与公司的价值观一致?是否具备以公司事务为己任的owner意识?听起来确实有一些「PUA」优点,但这样做确实能在职场获得较好的回报。

4、匹配度

而面试官的目的是找到适合职位要求的候选人。

需要注意的是,这里所说的是“适合”的人选,而不是“最好”的人选。这不仅考虑到用人成本,还考虑到员工的职业发展和工作质量。许多面试官不会选择经验和技能过剩的应聘者,而是选择经验和技能匹配,甚至稍微差一些,但是具备潜力和动机的应聘者。这样的人选会更加珍惜这个机会,对工作充满兴趣,更有动力去接受挑战,主动学习并将工作做好。

二)表达技巧

1、金字塔法则

金字塔原理是美国人巴巴拉·明托提出的一种关于思考逻辑的方法论。它很简单,核心思想是任何事情都可以归纳出一个中心思想,中心思想可由三至七个论点支持,每个论点可以由三至七个论据支撑。这样延伸下去,形状像一个金字塔,所以才叫金字塔原理。

我们在讲解自己的工作经历的时候就比较适合金字塔法则。

先把我们最重要的优势先提出来,然后按照时间顺序从近到远讲解自己的工作经历。用实际做的事来印证我们的优势。

2、STAR法则

STAR法则是一种在面试中有效回答问题的方法。它包括以下几个步骤:

  • Situation(情境):描述你所面临的具体情境或挑战。

  • Task(任务):解释你在该情境下的任务或目标。

  • Action(行动):详细说明你采取的具体行动步骤。

  • Result(结果):阐述你的行动带来的具体结果和成就。

使用STAR法则可以帮助你在面试中清晰、有条理地回答问题,展示自己的能力和经验。

我们讲解做过的项目的时候非常适合使用STAR法则。

先介绍我们项目的业务背景技术背景,再说明当前要做一个什么事,然后说明具体的技术方案以及如何落地,最后说明我们这个项目取得了什么结果。

这样面试官就比较容易理解,就会认为面试者逻辑性很强。

3、学会倾听

面试官问一个问题,即使你刚好很熟悉也一定不要「抢答」。一个是可能根本没有理解面试官的问题,二打断别人还是不太尊重的。面试官也是个最普通的人,是人就会被情绪操纵,留下不好印象很可能会影响这次面试的通过率。

面试官就是你的未来同事,你可以把面试官当成你的工作搭档去沟通,方便去做双向筛选。

二、面试流程

一般技术人员的面试为2-3轮技术面,一轮hr面试。

  • 一面:

    一般是跟你同级别技术能力比较强的同学。主要会考察技能是否过关,做一个初步筛选。

  • 二面

    一般是你的直系领导,你的升职加薪的直接负责人。主要会考察技能和能力,以及是否适合当前的岗位。

  • 三面

    一般是你的大领导,跟你直接的工作合作机会不会很多,绝大部分都不负责一线开发工作了。所以技术考察会少一些,会更看重能力,价值观等软性能力

  • hr面

    恭喜你,终于到了hr面。基本到了hr面只要不作死就安全了。hr主要是聊得内容不外乎职业发展,个人情况,离职原因,期望薪资这些。会根据你前面的面评和对标公司是否有offer来给你定薪资。

三、面试实战

一般Java面试会围绕项目,知识点,算法三个点进行展开。

其中最重要的是项目,因为公司招人一定是来干活,来解决公司的业务问题的,所以对以往项目的考察就比较重要了。

一)自我介绍

第一个阶段就是自我介绍,这个时间就是给面试官制造一个第一印象。用上面的金字塔原则把自己最突出的优势讲出来,引导面试官问你最擅长的部分,否则问到你不擅长的答不上来就会减分。

比如你学熟悉的是JVM调优,那你就是重点提一下,在后续的项目中也可以反复提起这个点。

案例如下

  • 面试官:

    你先做个自我介绍吧?

  • 面试者:

    我毕业于西虹市大学,有5年的工作经验。

    平常使用Java技术栈偏多,熟悉Spring,Mysql,微服务等技术栈(擅长的)。

    最近在西虹市保险公司做Java工作,目前在职状态,在公司里做了架构设计,性能优化,项目管理等工作(做出成绩的)。

    再上一家公司同理。

二)项目

项目是信息量最大的部分,能真是反应你的工作状态。写出来的代码是能用就行,还是对边界控制,代码性能,架构设计有自己的思考。

案例如下

  • 面试官:

    挑一个你最具技术挑战或者成长最大的项目讲一下?

  • 面试者:

    我们所在的部门是商业化部门,承担了公司的主要营收任务,日收入大约200万。我们小组开发的投放平台旨在为广告主维护广告信息,我在里面承担组长的角色。

    该项目主要是使用了Spring,Mysql,Redis等等技术。

    由于广告量不断增长产生了严重的性能问题,所以做性能优化。

    我使用了Java内存分析的方式进行分析优化,最终实现了内存下降了80%。

三)知识点

根据上面项目中使用的技术,进行知识点追问,有的面试官可能会刨根问底到操作系统层面。

案例如下

  • 面试官:

    我看你们用Mysql,在使用Mysql的过程中遇到什么问题了么?

  • 面试者:

    我们遇到了误用Mysql中的limit分页,导致Mysql负载飙高的问题。

    MySQL的LIMIT子句常用于分页,但在处理大量数据时,如果不加注意,它可能会导致效率问题,特别是当你使用了偏移量。例如:

    SELECT * FROM table_name ORDER BY id LIMIT 100000, 10;

    这个查询会找到前100,010个记录,但只返回最后10个。这意味着前100,000个结果实际上是无用的,但仍然会被MySQL检索出来,这会造成不必要的I/O和CPU负载。

    我们对 SQL 进行了优化,去掉了大 limit,改成先通过 id 过滤,再对 id 排序,最后使用 limit 的方式解决了这个问题。

    SELECT * FROM table_name  where id>100000 ORDER BY id limit 10
  • 面试官:

    嗯,那上面的id在Mysql一般是用什么数据结构存呢?

  • 面试者:

    MySQL中最常用的存储引擎是InnoDB,id主要使用B+树作为其索引结构。B+树是B树的一种变体,特别适合于磁盘或其他直接访问辅助存储器。

    以下是B+树的特点和结构:

    B+树在数据库中的使用是为了充分利用块访问的优点,并减少数据查找时的磁盘I/O次数,从而提高查询的性能。

四)算法

算法常见的就是考leetcode原题,或者基于场景的代码编写。

我一般不考leetcode原题,因为意义不大,背过了就会没背过就会卡壳,即使是高手也没有AI写得快。

应该重点考核工作中实际场景如何解决问题。

我一般会考两个线程交替打印奇数偶数。这道题的的难度不是太大,既能考察面试者的代码能力,也可以考察对多线程的熟悉程度,而且可以深入考察多线程的知识点。

  • 面试官:

    写一个代码两个线程交替打印奇数偶数

  • 面试者:

    可以使用wait()和notify()方法来实现线程间的协作。

    我们使用了一个共享的锁对象LOCK。奇数线程和偶数线程会轮流获取这个锁,然后检查当前数字是否符合它们的输出条件。如果符合,就输出数字,增加数字并唤醒其他线程;如果不符合,就让当前线程等待。

    public class AlternatePrint {
        private static final Object LOCK = new Object();
        private static int number = 1;
        private static final int MAX = 100;
    
    
        public static void main(String[] args) {
            Thread oddThread = new Thread(() -> {
                while (number <= MAX) {
                    synchronized (LOCK) {
                        if (number % 2 == 1) {
                            System.out.println(Thread.currentThread().getName() + " : " + number);
                            number++;
                            LOCK.notify();
                        } else {
                            try {
                                LOCK.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }, "OddThread");
    
    
            Thread evenThread = new Thread(() -> {
                while (number <= MAX) {
                    synchronized (LOCK) {
                        if (number % 2 == 0) {
                            System.out.println(Thread.currentThread().getName() + " : " + number);
                            number++;
                            LOCK.notify();
                        } else {
                            try {
                                LOCK.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }, "EvenThread");
    
    
            oddThread.start();
            evenThread.start();
        }
    }
  • 面试官:

    还有别的实现方式么?

  • 面试者:

    使用volatile关键字可以确保一个变量的读写操作对所有线程都是可见的,也即某一个线程修改了一个volatile变量后,其他线程可以立刻看到修改后的值。

    为了使用volatile来控制两个线程交替输出,我们可以使用一个volatile标志来指示哪一个线程应该进行输出。

    我们使用了isOdd这个volatile变量来标记当前应该由哪个线程输出。当isOdd为true时,奇数线程输出数字并递增,然后设置isOdd为false。当isOdd为false时,偶数线程输出数字并递增,然后设置isOdd为true。

    使用volatile的这种方法可能导致CPU的忙等待,因为线程会在一个循环中不断地检查isOdd的值而没有进入休眠状态,这可能会增加CPU的使用率。

    public class AlternatePrintVolatile {
        private static volatile int number = 1;
        private static final int MAX = 100;
        private static volatile boolean isOdd = true;  // true means Odd thread should print, false means Even thread should print
    
    
        public static void main(String[] args) {
            Thread oddThread = new Thread(() -> {
                while (number <= MAX) {
                    if (isOdd) {
                        System.out.println(Thread.currentThread().getName() + " : " + number);
                        number++;
                        isOdd = false;
                    }
                }
            }, "OddThread");
    
    
            Thread evenThread = new Thread(() -> {
                while (number <= MAX) {
                    if (!isOdd) {
                        System.out.println(Thread.currentThread().getName() + " : " + number);
                        number++;
                        isOdd = true;
                    }
                }
            }, "EvenThread");
    
    
            oddThread.start();
            evenThread.start();
        }
    }
  • 面试官:

    volatile的实现原理是啥?

  • 面试者:

    blabla..(又过去十分钟)

  • 面试官:

    整挺好!

四、最后

是金子总会发光,希望大家都能找到心仪的工作。

更多精彩内容,欢迎关注公众号程序员贺涵

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1175830.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优雅设计之美:实现Vue应用程序的时尚布局

前言 页面布局是减少代码重复和创建可维护且具有专业外观的应用程序的基本模式。如果使用的是Nuxt&#xff0c;则可以提供开箱即用的优雅解决方案。然而&#xff0c;令人遗憾的是&#xff0c;在Vue中&#xff0c;这些问题并未得到官方文档的解决。 经过多次尝试&#xff0c;小…

C# Onnx Dense Face 3D人脸重建,人脸Mesh

效果 项目 代码 using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms;namespace Onnx_Demo {public partial class frmMain : Form{public frmMain(){InitializeComponent();}string fileFilter "*.…

随笔--解决ubuntu虚拟环境的依赖问题

文章目录 问题一&#xff1a;在conda虚拟环境中报错ImportError: libcupti.so.11.7:cannot open shared object file: No such file or directory解决步骤问题二&#xff1a; RuntimeError: CUDA error: CUBLAS_STATUS_INVALID_VALUE when calling cublasSgemmStridedBatched( …

打造高效运营底座,极智嘉一体化软件系统彰显科技威能

在仓储成本和物流需求日益增加的今天&#xff0c;创新且高效的物流机器人解决方案能够显著提升物流运营效率&#xff0c;降低物流成本&#xff0c;实现智能化、精益化、一体化的物流管理。全球仓储机器人引领者极智嘉(Geek)以「一套系统&#xff0c;天生全能」为准则&#xff0…

python 虚拟环境使用

创建虚拟环境 python -m -venv dir dir是要创建虚拟环境的目录,文件夹不存在会自动创建相关的文件夹及其父文件夹. 示例 python -m venv d:\pythonvenv\python3.11.5 这样会在d:\pythonvenv\python3.11.5 目录下创建一个虚拟环境 使用帮助: python -m -venv -h 使用虚拟…

2023下半年软考系统集成项目管理工程师上午真题及答案解析

1.( C )不属于风险识别的信息收集技术。 A.头脑风暴 B.德尔菲技术 C.排除法 D.根本原因分析 解析&#xff1a; 2.( C )不是SaaS(软件即服务)的特点。 A.由供应商管理软件更新和安全 B.无需购买软件 C.需要自行安装和维护软件 D.按需付费 解析&#xff1a; 3.…

蓝牙芯片的 PCB 板载天线设计注意事项

1.天线示意图 1.1 要点说明 ⑴ 板厚不同&#xff0c;适用的天线不同 ⑵ PIFA天线到地的距离不要变&#xff08;很重要&#xff09;&#xff0c;通常在PCB设计时要锁定参考设计复制/拷贝比较好。 ⑶ ANT 馈线需要符合50 欧阻抗&#xff0c;背面需铺铜&#xff0c;板厚、粗细、与…

【编码魔法师系列_构建型2.2】单例模式「懒汉式」(Singleton Pattern)

学会设计模式&#xff0c;你就可以像拥有魔法一样&#xff0c;在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们&#xff08;GoF&#xff09;凝聚出来的最佳实践&#xff0c;可以提高代码的可读性、可维护性和可重用性&#xff0c;从而让我们的开发效率更高。通…

如何整合项目计划与执行,看看这篇就够了

项目中的挑战&#xff0c;如同生活中的问题&#xff0c;无处不在。常言道&#xff1a;“家家有本难念的经”&#xff0c;面对这些问题&#xff0c;我们应采取积极的态度&#xff0c;通过有效的沟通&#xff0c;让家人了解我们的困境&#xff0c;这样许多问题就能在无形中得到解…

虚拟机Linux-Centos系统网络配置常用命令+Docker 的常用命令

目录 1、虚拟机Linux-Centos系统网络配置常用命令2、Docker 的常用命令2.1 安装docker步骤命令2.2 在docker容器中安装和运行mysql 1、虚拟机Linux-Centos系统网络配置常用命令 进入网络配置文件目录 cd /etc/sysconfig/network-scripts/用 ls 命令查看文件&#xff1a;ls …

基于SpringAOP实现自定义接口权限控制

文章目录 一、接口鉴权方案分析1、接口鉴权方案2、角色分配权限树 二、编码实战1、定义权限树与常用方法2、自定义AOP注解3、AOP切面类&#xff08;也可以用拦截器实现&#xff09;4、测试一下 一、接口鉴权方案分析 1、接口鉴权方案 目前大部分接口鉴权方案&#xff0c;一般…

Ps:色域警告

Ps菜单&#xff1a;视图/色域警告 View/Gamut Warning 色域警告 Gamut Warning可以依据要模拟的输出设备的色彩能力来确定图像上的哪些颜色可能会超出该设备的色彩范围。 “色域警告”只能起到提示的作用&#xff0c;启用&#xff08;勾选&#xff09;以后&#xff0c;画面上的…

清华软院2024届推免拟录取名单

名单 直博生 硕士生 分析 清华软院2024届共录取推免硕士生68人&#xff0c;其中 专硕085405软件工程 59人&#xff0c;学硕083500软件工程9人&#xff1b;推免直博生 15人 和贵系相比难度要低很多哦&#xff01; 欢迎关注我的公众号 “程序员小风学长”&#xff0c;会定期进…

【工具】Github统计代码行数工具推荐(VScode插件、兼容任何平台、不用下载安装包)

需求&#xff1a; 1&#xff09;被要求统计代码行数&#xff1b; 2&#xff09;不想打开Linux&#xff0c;懒得下载Windows版本GitStats&#xff1b; 3&#xff09;打开了Linux但也不记得find命令行怎么用&#xff1b; 4&#xff09;打开了Linux&#xff0c;装好了Gitstats但自…

基于金枪鱼群算法的无人机航迹规划-附代码

基于金枪鱼群算法的无人机航迹规划 文章目录 基于金枪鱼群算法的无人机航迹规划1.金枪鱼群搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用金枪鱼群算法来优化无人机航迹规划。 …

唐顿庄园的AI圣诞设计(ideogram.ai )

唐顿庄园是一部经典的英国历史剧&#xff0c;讲述了 Crawley 家族在 20 世纪初生活的故事。该剧以其精美的服装、场景和道具而闻名&#xff0c;因此它是圣诞装饰的绝佳灵感。 在本文中&#xff0c;我们将使用 ideogram.ai 创建一个 Downton Abbey 圣诞设计。ideogram.ai 是一个…

图解系列--查漏补缺

1. L2转发&#xff0c;L3转发 网络传输中&#xff0c;每个节点会根据分组数据的地址信息&#xff0c;来判断该报文应该由哪个网卡发送出去。为此&#xff0c;各个地址会参考一个发出接口列表。在这一点上 MAC 寻 址与IP 寻址是一样的。只不过MAC 寻址中所参考的这张表叫做地址…

Activiz.NET.x64无法显示点云

将Activiz.NET.x64 nuget包拉下后&#xff0c;无法显示点云&#xff0c;或者报错&#xff0c;需要检测几个要素&#xff1a; 1.活动平台是否60位&#xff0c; 2.显示控件是否正常加载&#xff0c; 3.点云是否正确&#xff0c; 4.如果是.netcore&#xff0c;还需要自己将Activiz…

docker容器的日志占满磁盘空间处理办法

1、输入命令&#xff1a; du -d1 -h /var/lib/docker/containers | sort -h 日志文件高达几十个G&#xff0c;进入每个容器的路径&#xff1a; cd /var/lib/docker/containers/b35751c633bdd3b268769675fb145a8ade8d9c8b5df45d28a596274447913dd4 清空名为"容器id-json…

改进YOLO系列:12.Repulsion损失函数【遮挡】

1. RepLoss论文 物体遮挡问题可以分为类内遮挡和类间遮挡两种情况。类间遮挡产生于扎堆的同类物体,也被称为密集遮挡(crowd occlusion)。Repulsion损失函数由三个部分构成,yolov5样本匹配,得到的目标框和预测框-一对应第一部分主要作用:预测目标框吸引IOU最大的真实目标框,…