14年的面试官经验分享,看完必有收获

Posted 局外人一枚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了14年的面试官经验分享,看完必有收获相关的知识,希望对你有一定的参考价值。

面试,是找到好工作的过程中,最最重要的一环。

在我14年的职业生涯中,亲自面试的人应该不下1000人了。

看过的简历还要更多,尤其是微软上海早期扩张的时候。

所以今天,我就从自身经历出发,给你分享一些面试经验。

定制化面试

想象一下,明天你要和心仪的女生第一次下午茶约会了,你会做哪些准备呢?

你会研究对方喜欢喝什么,是喜欢喝茶还是咖啡?

喜欢星巴克?还是更小众有特色的咖啡馆?

对方喜欢什么口味的饮品?喜欢什么品种的花?

甚至分析对方的星座,血型,去过哪里?爱看什么书?

是喜欢听巴赫,还是莫扎特?等等…

你会想方设法去打听这些事,这是很正常的心态。

同样的,面试,其实就是一场和女神的下午茶约会。

那你要做什么准备工作呢?

你当然要对公司和职位做好充足的调研。

细化下来,你要了解几件事。

公司财报,公司竞品,公司核心产品,公司优势和你自己的优势。

公司在业内处于什么样的水平?为什么招这个职位?

最近公司有什么战略举措?职位最主要的要求是什么?

你有没有好友在这家公司?问问对方公司的真实情况怎么样?

在网上看看这家公司 CEO 的访谈,了解一下公司的愿景、使命、价值观是什么?

尽可能多地详细了解对方,然后针对性地进行定制化面试。

这就是求职者正确的心态。

如果你觉得太麻烦了,算了,我还是随便准备一下吧。

有这种心态的时候,就相当于你在“海投简历”。

不要小看HR,一个职位你是否“心仪”,对方是能够感觉出来的,对方一见面,就知道你对职位是否感兴趣。

硬技能和软技能

职位需求,大致分为硬技能和软技能。

什么叫硬技能?

硬技能是那些很容易测量和定义的技能。

比如:计算机编程,人工智能算法,设计(比如品牌包装设计、视频设计、三维动画、插画设计等)。

你的编程水平怎么样?你有没有获奖的设计作品?

你的硬技能越稀缺,你通过面试的可能性就越大。

特别稀缺的硬技能,面试到最后,你会发现,不是公司在面试你,而是你在面试公司。

什么叫软技能呢?

难以直接测量的技能。

比如销售技能,职业化程度,沟通技能,领导与管理技能等。

越是到中高级职位越是偏软技能,越是基层的职位越是偏硬技能。

首先做个区分,你是准备面试硬技能职位,还是软技能职位?

提前学会规划,区分你的技能属性。

来,介绍一下你自己

一个面试官,他首先希望从面试者身上看到什么?

强烈的渴求心。

对招聘需求方做了充分研究,对适合度做了充分的思考。

求职的本质,是将自己这款产品展示给客户,并超预期地满足对方的核心需求。

总之,是做了准备,花了心思。这是诚意。

有的招聘方面试过后,会留下一个作业给面试者。

这其实是一个故意放置的测试诚意环节。

有部分面试者在收到消息之后可能在想:面试之后还要考试,写这么多的方案,还是算了吧。

这说明,他对这份工作,并不渴望。

在面试时,各行各业都会有几个标准问题。

第1个标准问题是什么?

“来,介绍一下你自己。”

为什么会这么问呢?

一个部门负责人需要你加入,但是负责人非常忙,在HR的陪同之下,他来面试你。

但是。但是。简历实在太多了。负责人不一定记得你。

在你自我介绍的3~5分钟之内,其实同时他也在翻阅你的简历。

我曾经面试过这样的人。

我说:麻烦你先介绍一下自己。

对方:我叫XX,做过什么,其它的,简历上都有。很快结束问答。

我看到这样的面试者时,首先就会有个判断,这个人情商比较低,对吧?

虽然不至于直接pass掉,但是本来可能比较有能力的人,印象分上就降了一大格。

这个人,以后怎么共事?

简历里,虽然有很多关于你自己的介绍,但是你也可以从不同角度来讲讲。

既然别人提了这个问题,肯定有背后的原因。

你可以很礼貌地说:简历里有很多关于我的介绍,但是,我觉得这几点是我特别想要表达的。

然后把简历里最核心的词和信息提炼出来。

这个环节也是在考验你的“系统结构化思维”和“沟通技能”。

我叫什么名字?我毕业于什么学校?在过去几年我一直在哪家公司就职?

之前还有过几份工作?最后的一个职位是什么?主要负责什么?取得过什么样的成就?

然后我在哪里待了多少年?是否非常喜欢做有挑战的事情?等等。

你看,这就是一个比较结构化的介绍。

记住:

1)学会系统结构化思维。

2)理解每一个简单问题背后,都有其必然逻辑。

你遇到最大的困难是什么

“你遇到最大的困难是什么?你是如何解决的?”

你对这个问题的回答,其实很大程度上会体现你的能力水平。

这个回答本身并不是针对问题的,而是HR会根据你的回答,抽丝剥茧,探寻本质,匹配需求。

问题本身只是让你提供素材,HR会在你的回答里搜寻自己想要的答案。

什么答案?

你是不是一个善于解决问题的人?

你是不是一个有执行力的人?

你是不是一个有管理能力的人?

你是不是一个有领导力的人?

你是不是一个懂得协作的人?

你是否能承担压力?

如果你没有提前准备,想了半天说我这辈子好像没遇到过多大困难。

你觉得自己回答挺巧妙,但其实没有提供给对方素材。

所以面试之前好好梳理一下,自己经历过最大的困难是什么?并用故事化的表述方式,让对方被你吸引。

举个我自己年轻时在微软的例子:

有一次,晚上快下班的时候,康柏公司内部的计算机系统出了问题。

一千多台电脑的邮件都不能访问,也就意味着一千多人背后的生意、订单、客户沟通都受到影响。

我留下来紧急处理这个棘手的问题,不知不觉就干到凌晨三四点,但是依然没有解决。

对方特别着急,康柏全球CIO直接一个越洋电话打来警告我,如果不能在凌晨五点解决,他就立刻打给微软全球CFO投诉,他们在剑桥的时候,是同班同学。

我只能假装镇定地回复:没问题,一切尽在掌握。

挂了电话,然后想:怎么办,怎么办,怎么办?

这个问题,只有解决,和没解决两种情况。

那1000多台电脑如果不能访问,你找3000个理由,都是死路一条,绝无“差不多”这种状态。

临晨四点,我只能顶着巨大的压力,一个人继续排查错误。

一口气忙到早上9点,大家陆续来上班。

此时,我已经连续工作一天一夜。我有一个选择,就是把这个问题交给别人接着处理,自己去睡一觉。

但是,这一夜,我做了很多工作,哪些是有意义的,哪些是就算没有解决也已经排除的,要和下一个负责人交代一遍是非常复杂的。

为了给康柏节省时间,我决定接着干。

本以为在整个团队的协助下,可以在白天解决,但是这个涉及到源代码级别的问题,到了晚上,仍然没有被攻克。

精力被极度透支的我,根本没有挣扎,又干了整整一个通宵。

问题终于,终于完美解决了。

两天两夜,对方换了几波人,而我是连续作战精疲力竭。

但是攻坚克难后的兴奋,让我进入“回光返照”的状态,根本睡不着,于是又工作了一整个白天,处理完堆积的公务。

三天两夜,55个小时没合眼。

你看,这就是一个非常好的面试表述。

把经历和能力变成故事,用故事来传递你的专业程度。

你有什么缺点

“你有什么缺点?”

这个问题,其实是有陷阱的。

你要怎么回答这个问题?

有的人自作聪明,说我最大的缺点就是太勤奋。

如果你回答:我不知疲倦,勤奋刻苦,加班很频繁,不辞辛劳。

这是自认为很聪明。

有的人会回答说:我最大的问题就是不见南墙不回头,然后特别能坚持。遇到一些困难之后还是想攻克它。

这个也是自夸。

稍微有点经验的都能看出来。

所以这种问题,应该怎么回答?

原则上,你要表现出:自己对一个目标的追求,然后没有得到的那种场景。

什么意思?

比如:我最大缺点,就是我演讲能力太弱。

我在团队里面开个会可以,但有一次面对一个1000人的场合,老板让我上台演讲,我讲完之后特别紧张,我觉得这是我应该攻克的一个缺点。

不要把自己的优点包装成缺点,大家都不傻。

要表述出自己对一个目标的追求,然后没有得到的那种场景。

我问完了,你有什么要问我吗?

“我问完了,你有什么要问我吗?”

面试临近结束的时候,其实是一个特别好的机会。

有些同学在面试结束时,神经开始松懈,以为终于结束了。

其实,真正的考验,往往在最后出现。

如果你问:公司是双休吗?这个工作要出差吗?要交社保吗?要加班吗?

你可能之前的印象分比较高。然后,你每问一个,分数就开始下滑。

正确的问法是什么呢?

原则:你要学会让对方开口表达。

比如,我应聘这个职位后,要汇报的那位经理和主管,大概是一个什么样的人,我能了解一下吗?

让对方开口表达,然后表示出那种非常渴望了解的兴趣。

只要让对方开始表达,他跟你的距离就近了。

为什么?

因为他在你身上花了时间,他给你提供了信息。

然后你还可以问什么?

这个职位最核心的考核目标是什么?

对方就会有种感觉,你是真的想来干这个事。

然后他会讲考核的目标是什么。

这时,有趣的事情就发生了。

对方向你表述的这些内容,其实是在越来越触及之前隐藏的、没有说出来的真需求。

他说完之后,你直接针对性回复,哪些事情是你特别擅长的。

这个时候,你得到这个工作的机会就更大了。

真正的考验,往往在最后出现。

你要学会让对方开口表达。

最后的话

今天,我给你介绍了一些面试的经验。

找到一份合适的工作,就像找到一个合适的对象一样,非常不容易。

这中间最重要的,就是你和工作之间的匹配程度。

你要抱着找对象一样的心态去找工作。

记住这个心法:详细了解对方,匹配自己优势,然后定制化面试。

祝你能找到最适合自己的工作。

祝秋安。

c语言指针详解 看完必有收获!!!!

C语言指针

1.字符串指针

  • : void* 类型的指针可以接收任意类型的指针
    - void 类型的指针不能进行解引用的操作,也不能进行加减整数的操作*
int main()
{
    char arr1[]="abcdef";
    char arr2[]="abcdef";
    char* p1="abcdef"; //常量字符串 不能修改
    char* p2="abcdef";
    if(arr1==arr2)  //arr相当于数组首地址 所以不相等
    {
        printf("相等\\n");
    }else
    {
        printf("不相等\\n");
    }
    
     if(p1==p2)  //指针里面放的常量字符串 ,所以相等
    {
        printf("相等\\n");
    }else
    {
        printf("不相等\\n");
    }
}

2.指针数组

指针数组是数组,存放指针的数组

int main()
{
    int arr1[]={1,2,3,4,5};
    int arr2[]={2,3,4,5,6};
    int arr3[]={3,4,5,6,7};
    int* parr[]={arr1,arr2,arr3};
    int i=0,j=0;
    for(i=0;i<3;i++)
    {
        for(j=0;j<5;j++)
        {
            printf("%d ",*(parr[i]+j))
        }
        printf("\\n");
    }
    return 0;
}
打印结果为:
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7    

3.数组指针

数组指针—指向数组的指针—存放数组的地址

int* p1[10]; 指针数组

int (*p2)[10] 数组指针
在这里插入图片描述
arr表示的是数组首元素的地址

&arr表示的是数组的地址,而不是数组首元素的地址

int mian()
{
    char* arr[5];
    char* (*p)[5]=&arr;  //&arr取出的是一个数组的地址
      
    return 0;
}
int main()
{
    int arr[5]={1,2,3,4,5};
    int (*p)[5]=&arr;
    int i=0;
   // for(i=0;i<5;i++)
    //{
      //  printf("%d ",*(*p+i)); //*p=arr 
   // }
    //或者下面这种写法
    for(i=0;i<5;i++)
    {
        printf("%d ",(*p)[i]); //打印出1,2,3,4,5
    }
    return 0;
}
#include <stdio.h>
void print1(int arr[3][5],int x,int y)
{
    int i,j;
    for(i=0;i<x;i++)
    {
        for(j=0;j<y;j++)
        {
            printf("%d ",arr[i][j]);
        }
        printf("\\n");
    }
    
}

void print2(int (*p)[5],int x ,int y)
{
    int i,j;
    for(i=0;i<x;i++)
    {
        for(j=0;j<y;j++)
        {
            printf("%d ",*(*(p+i)+j));  //*(p+i)代表每行首元素的地址
        }
        printf("\\n");
    }
}
int main()
{
    int arr[3][5]={{1,2,3,4,5}, {2,3,4,5,6}, {9,3,4,5,6}};
    print1(arr,3,5);
    print2(arr,3,5); //传的是一维数组的地址
    //数组名arr代表首原素的地址
    //但是二维数组的首元素是二维数组的第一行,所以这里传递arr,其实相当于第一行的地址,是一维数组的地址,可以用数组指针来接收
    
    return 0  
}

下面看看几种常见的写法:

int arr[5]; //arr是一个5个元素的整形数组
int* parr1[10]; //parr是一个数组,数组有10个元素,每个元素的类型是int*,parr1是指针数组
int (*parr2)[10]; //parr2是一个数组,数组有10个元素,每个元素的类型是int, parr2是数组指针
int (*parr3[10])[5]; //parr3是一个数组,该数组有10个元素,每个元素是一个数组指针,该数组指针指向的数组有5个元素,每个元素是int.

4.数组参数,指针参数

二维数组传参可以省略行,但不能省略列.

二级指针传参可以传哪些参数: 如下代码中的三种都行

void test(char **p)
{
 
}
int main()
{
 char c = 'b';
 char*pc = &c;
 char**ppc = &pc;
 char* arr[10];
 test(&pc);
 test(ppc);
 test(arr);//Ok?
 return 0;
}

5.函数指针 - 指向函数的指针

函数指针 - 指向函数的指针----存放函数地址的指针

int Add(int x ,int y)
{
    int z = x+y;
    return z;
    
}
int main()
{
    int a = 10 ;
    int b = 20 ;
    //&函数名和函数名都是函数的地址
    int (*p)(int, int)=Add;// 把add的地址传给了p
    printf("%d\\n", (*p)(2,3));//5
    printf("%d\\n",p(2,3)); //5
    //*可以加也可以不加
    return 0;
}
void (* signal(int ,void(*)(int)))(int) (1)
   
typedef void(*pfun)(int);  (2)
pfun signal(int , pfun)    (3)
    (2)(3)等效为(1)

6.函数指针数组

int Add(int x ,int y)
{
    return x + y ;
}
int Sub(int x , int y)
{
    return x - y;
}
int Mul(int x ,int y)
{
    return x * y;
}
int Div (int x , int y)
{
    return x/y ;
}
int main()
{
    int i = 0;
    //下面这个函数指针数组可以存放4个函数的地址
    int (*parr[4])(int , int ) = {Add , Sub , Mul , div}
   for(i=0;i<4;i++)
   {
       printf("%d\\n",parr[i](2,3)); //5 -1 6 0
   }
    return 0;
}
//char* my_strcpy(char* dest , const char* src)
//1.写一个函数指针pf,能够指向my_strcpy
char* (*pf)(char* , const char*)
//2.写一个函数指针数组,能够存放4个my_strcpy函数的地址
char* (*fp[4])(char* , const char*)

函数指针数组的用途 : 转移表

int Add(int x ,int y)
{
    return x + y ;
}
int Sub(int x , int y)
{
    return x - y;
}
int Mul(int x ,int y)
{
    return x * y;
}
int Div (int x , int y)
{
    return x/y ;
}
void meun()
{
    printf("**********************\\n");
    printf("**** 1.Add  2.Sub ****\\n");
    printf("**** 3.Mul  4.Div ****\\n");
    printf("****** 0.exit ********\\n");
    printf("**********************\\n");
}
int main()
{
    int x =0 ,y=0;
    int input = 0;
    meun();
    printf("请选择哪种算法\\n:");
    scanf("%d",&input);
    printf("请输入两个数:> ");
    scanf("%d%d",&x , &y);
    int (*parr[5])(int ,int )={0,Add,Sub,Mul,Div};
    do
    {
        if(input>=1&&input<=4)
        {
            printf("%d\\n",parr[inpnt](x,y));
        }else if(input==0)
        {
            printf("退出\\n");
        }else 
        {
            printf("选择错误\\n");
        }
    }while(input)
        return 0;
}
//注: 这题也可以用swich case ,但代码长度较长

小结

int Add(int x , int y)
{
    return x+y;
}
int main()
{
    //指针数组
    int* parr[4];
    //数组指针
    int* (*P)[4]=&parr;
   // 函数指针
    int (*p)(int ,int )=Add;
    //函数指针的数组
    int (*parr[4])(int , int)={Add,Sub,Mul,Div};
    //指向函数指针的数组的指针
      int (*(*parr)[4])(int , int);  
}
  • 回调函数: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针作为参数传递给另一个函数,当这个指针被用来调用其他所指向的函数时,我们就是说这是一个回调函数.回调函数不是由该函数的现实方直接调用,而是在特定的事件或条件发生时有另一方调用的,由于对该事件或条件进行响应. 如 :

    void cola (int (*fp)(int ,int))

    cola(Add);
    //cola 函数能Add函数的地址

    void print(char* str)
    {
      printf("%s",str)  ;
        
    }
    
    void test(void(*p)(char *))
    {
        printf("TEST ");
        p("hello world");
    }
    int main()
    {
        test(print); //输出:TEST hello world
        return 0 ;
    }
        
    

7.库函数qsort的用法: qsort(void* p,int num1 , int num2 , int (cmp)(counst void e1, counst void* e2) )

第一个参数 : 待排序数组首元素的首地址

第二个参数 : 待排序数组元素的个数

第三个参数 : 待排序数组每个数组元素的大小—单位为字节

第四个参数 : 函数指针–比较两个元素函数的地址,这个函数要自己实现

//自己实现一个qsort排序
struct stu
{
  char name[10];
  int age;
};
void swap(char *p1 ,char *p2, int witdh)
{
    int i= 0;
    for(i=0;i<witdh;i++)
    {
     char temp=*p1;
        *p1=*p2;
        *p2=temp;
        p1++;
        p2++;
    }
    
}

void bubble_sort(void* base, int sz ,int width , int (*cmp)(void *e1, void *e2))
{
    int i=0;
    //趟数
    for(i=0;i<sz-1;i++)
    {
        int j=0 ;
        //每一趟比较的对数
        for(j=0;j<sz-1-i;j++)
        {
            //两个元素的比较 得到两个元素的首地址
            if( cmp((char*)base+j*width , (char*)base+(j+1)*width ) >0 )
            {
                //交换
                swap((char*)base+j*width , (char*)base+(j+1)*width ,width);
            }
                
        }
        
    }
    
}
 
int cmp_init(void* p1,void* p2)
{
    return *(int*)p1-*(int*)p2;
}

void test1()
{
    int i=0;
     int arr[]={9,8,7,6,5,4,3,2,1,0};
    int sz=sizeof(arr)/sizeof(arr[0]);
    bubble_sort(arr,sz,sizeof(arr[0]),cmp_init);
    for(i=0;i<sz;i++)
    {
        printf("%d",arr以上是关于14年的面试官经验分享,看完必有收获的主要内容,如果未能解决你的问题,请参考以下文章

Java学长校园招聘面试经验分享

这里有6个关于BAT程序员面试的经验分享!

c语言指针详解 看完必有收获!!!!

Spring循环依赖 | Spring三级缓存 | 看完必有收获

Spring循环依赖 | Spring三级缓存 | 看完必有收获

Spring循环依赖 | Spring三级缓存 | 看完必有收获