今年 5 月份,领导接了一个.NET 项目,在原有老项目基础上进行二次开发,公司开发基本上都是用 Java,就我一个除了 Java,.NET 也比较熟悉,领导就安排我招几个人去客户那边驻场开发。
以前都是被面,现在突然让我去面试别人,有点不适应。五一放假那几天我基本都是在打电话进行面试,之所以用电话的形式进行技术面试,也是无奈之举,一来公司不在北京,不方便进行现场面试,二是当时急需开发人员到位,用电话面试比较方便快捷。但电话面试也有很多弊端,不能全方位考察候选人。
现在.NET 人才比较短缺,整体质量也不是很高,我打了无数个电话,符合要求的寥寥无几,令我非常失望,其实我这边的要求并不高,甚至可以说只要基本编程素养够,工作认真负责就行了。
招进来的人,有好几个只待了 1 天就走人了。有两个人虽然一直干到现在,但表现并不是让人特别满意,领导打算把这两个人换掉,现在又让我负责招聘。我吸取了上次的教训,在电话面试外,又加了一个环节,就是让候选人用邮件把自己写过的觉得满意的代码片段发给我,具体说就是发 C#写的类,我只是想知道候选人基本的写类的能力,基本的面向对象思想。并不要求什么高大上的算法数据结构的代码,只是基本的编程功底,封装能力。
可今天一个人(三年工作经验)发给我的代码让我苦笑不得,他加了我微信,发给我后,微信上问我:“您看我这个代码,成吗”,一时间我思绪万千,不知道说什么。
即便我要的不是像这种(拿 C 举例子): https://github.com/gozfree/gear-lib/blob/master/gear-lib/libqueue/libqueue.c
虽然我知道这样的代码干净、清晰、优雅,是我欣赏的代码,但平时普通的程序员只能写写业务代码,并不会接触到上面链接里面这样的代码,但起码的业务类你肯定写过吧。
最后我不得不感慨,好的.NET 开发太难找了!
邮件收到的代码完完整整如下(我不明白为什么每行都有注释):
//不加锁的方法
//public static void GetCOupon(person person)
//{
// Console.WriteLine($"date:{DateTime.Now},name:{person.name},前来领取优惠券");
// if (person.isgetcoupon)
// {
// //假装业务处理
// Thread.Sleep(1000);
// Console.WriteLine($"date:{DateTime.Now},name:{person.name},已经领取,不可以重复领取");
// }
// else {
// Thread.Sleep(1000);
// person.isgetcoupon = true;
// Console.WriteLine($"date:{DateTime.Now},name:{person.name},领取成功");
// }
//}
//private static readonly object lockobj = new object();
////加 lock 锁的方法
//public static void lockGetCOupon(person person)
//{
// lock (lockobj)
// { Console.WriteLine($"date:{DateTime.Now},name:{person.name},前来领取优惠券");
// if (person.isgetcoupon)
// {
// //假装业务处理
// Thread.Sleep(1000);
// Console.WriteLine($"date:{DateTime.Now},name:{person.name},已经领取,不可以重复领取");
// }
// else
// {
// Thread.Sleep(1000);
// person.isgetcoupon = true;
// Console.WriteLine($"date:{DateTime.Now},name:{person.name},领取成功");
// }
// }
//}
////加 mutex 锁
//public static void mutexgetoupon(person perss){
// Console.WriteLine($"date:{DateTime.Now},name:{perss.name},前来领取优惠券");
// using (var mutex=new Mutex(false,perss.id.ToString()))
// {
// try
// {
// if(mutex.WaitOne(-1,false))
// {
// if(perss.isgetcoupon)
// {
// Thread.Sleep(1000);
// Console.WriteLine($"date:{DateTime.Now},name:{perss.name},已经领取,不可以重复领取");
// }
// else
// {
// //假装业务处理
// Thread.Sleep(1000);
// //领取
// perss.isgetcoupon = true;
// Console.WriteLine("date:{0:yyyy-MM-dd HH:mm:ss},name:{1},领取成功", DateTime.Now, perss.name);
// }
// }
// }
// catch (Exception)
// {
// throw;
// }
// finally { mutex.ReleaseMutex(); }
// }
//}
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.