[Java][求拍砖]八九月份面试了若干求职者

捏造的信仰 2014-11-01 10:08:10
本人在一个创业型的小公司任职,八九月份两个月陆续面试了七八个面试者。不知道是凑巧还是怎么,除了一两个外,其余是从同一个网络培训机构出来的(也许是遇上他们的“毕业季”),借此了解了一点所谓的网络培训。

首先我觉得该培训机构故意将培训出来的学员推向我们这样的小创业公司,这是不合适的。这些学员实际上能力完全不足以胜任开发,而创业公司对开发人员的最低水平要求是比较高的。其次,虽说修行在个人,但该培训机构的培训内容(我去看了下)过于单薄和应试,完全对不住长达半年的全日制(网络)学习。

我不会只看简历就妄下结论。我面试的主要方式是机试,机试就一个题目:写一个猜数字游戏,电脑随机生成一个数字(比如 1-100 之间)让玩家猜,如果没猜中,就告诉玩家猜的数字是大了还是小了,直到猜中为止,最后告诉玩家猜了多少次。整个游戏用最简单的控制台输入输出就行。

我将编程环境准备好,面试者坐下来就能写。如果有什么地方不清楚,还可以打开浏览器上网查。不过不可以直接查答案本身。

这个题目多困难呢?它其实就是一个 20 到 30 行左右的小程序。我希望通过观察面试者的编写过程,了解其编程风格,熟练程度之类的。我不管这个人在简历上描述自己是能吃苦耐劳还是热情饱满,总之手指底下见真章。

另外,面试者通常会紧张,会发挥得不好。所以我没有像监考老师一样坐在后面盯着,我自己手头上还有事做;而且我也不限定时间,你再怎么紧张,坐在那 15 分钟,也该冷静点能写几行代码了吧。如果有的天才实在冷静不下来,那我真的对不住,就当我瞎了狗眼。不过还好没遇到。

实际情况是,只有一半的面试者写出了运行正确的程序。像把计数器变量命名为 account 的这样的错别字我都可以忽略。而最差的,对数据类型都非常陌生——定义了一个整数变量却怀疑它的值不是整数。通常是莫名其妙的循环和判断条件,有位甚至仅允许玩家猜 1000 次:写个 1000 次的 for 循环,如果玩家猜中了就跳出循环。至于那些写出来的面试者,表现得也很不熟练,比如要修改好几遍才能把 main() 方法正确定义出来。——这些面试者都号称自己熟悉 Spring 和 Hibernate 框架,足以胜任开发工作。就我看来,这水分不是一般的大。

所以,如果你是培训机构的学员,也许可以试下写一下这个小游戏,若是连这都写不出,那真该好好反思下你在培训机构都学了些什么了。软件行业是一个很年轻的行业,将来还会有很多就业需求,但现在软件职业培训的现状,似乎跟不上行业需要。也许我只看一家培训机构目光太窄,但人家好歹是上市公司,境外上市公司……
...全文
875 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ArayChou 2014-11-10
  • 打赏
  • 举报
回复
这种事情,我以前也干过,我是要求应届生写能实现排序的方法. 很可悲的是,一般的人不知道如何着手,不知道要使用一个嵌套循环. 排序其实一点都不简单, 在纸上实现,100%正确,无论你多牛都要死不少脑细胞.除非你天天干这个. 所以,我当时标准是,只有写了嵌套循环,有数据交换都过关
chairmanis 2014-11-09
  • 打赏
  • 举报
回复
比尔盖茨也不是一生下来就懂电脑的 大学生也不是一毕业就啥都会了 你这份测试只能说此时的他能力不足以胜任这份工作 如果说是其中一人是你说的那样不符合你的要求,说明你招聘这方面是没有问题的 但是,你说他们一堆人都这样,那就是你的选人标准过于单一或者缺乏洞察力了 难道培训出来的大多数都是傻子? 套句古话:英雄不问出处。 顺便说句,增删改查,还有那些逻辑,不都是照葫芦画瓢,难道都是原创的大牛? 小公司不愿意试用别人,只是你们急功近利的表现而已! 你说是不? 可以给他们多一点的时间。 当然, 可以这样说 对招聘你有偏见,或者是基于某种理由的过度自信!
猿人林克 2014-11-09
  • 打赏
  • 举报
回复
看了楼主说的,一开始以为是用简单的东西考察面试者的思路,没想到果然是考察基础语法。。。。。 我们面人基本看思路,只要思路想法是ok的,语法基础和熟练度可以差点;反之基础熟练,思路混乱或者不考虑严密性的,就算一个人能干2个人的我们也基本不要。。。这种人干活快,但是思路、严密性、逻辑性差的就是给我们项目挖坑的,看着干得快,扩展性、可维护性、甚至各种逻辑判断都没有,用户一用很可能影响关系,价值千万(国网、石油的用户动不动就投诉,所以但凡有点问题就会猴急,上报领导诶)。。 我要是拿这个题面试,重点将会是下面几点,哪怕他语法和控制流用的不好,或者不会用,只要能符合我写的关键点,这些问题都是小问题,十几分钟就能搞定的东西和思路简直没法比,当然如果真正做过大项目这点问题肯定会注意到的,不管是技术总监还是普通开发。
import java.util.HashMap;
import java.util.InputMismatchException;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;

public class GUESSGAME {

	/**
	 * 开始猜数字游戏
	 * 
	 * @param maxCount
	 *            猜测上线
	 * @param maxRandom
	 *            随机数最大值
	 */
	public static void startTheGame(int maxCount, int maxRandom) {
		// 初始化
		Random random = new Random();
		int sourceInt = 1 + random.nextInt(maxRandom);
		int count = 0;
		// TODO 测试用,上线需删除
		System.out.println("源数字:" + sourceInt);

		int targetInt = 0;
		// 循环输入====关键点,思路是否清晰,是否先设计框架及步骤在开始开发
		while (true) {
			// 看门狗,若超过循环上限跳出循环====关键点,防止死循环,业务上即便没有要求也要有看门狗,避免调用黑盒或其他系统接口导致本服务崩溃
			if (count >= maxCount) {
				System.out.println("超过猜数字上限,上限为:" + maxCount + ",game over!");
				break;
			}
			// 输入目标值,每输入一次计数器加一
			try {
				targetInt = new Scanner(System.in).nextInt();
				count++;
			} catch (InputMismatchException e) {// ====关键点,防止用户使用时的异常,当然直接Exception也可以
				System.out.println("请重新输入整形数值");
				continue;
			}
			// 比较源与目标大小
			Map<String, Object> resultMap = compareTheInt(sourceInt, targetInt);
			// 打印比较信息
			if (null != resultMap && null != resultMap.get("message")) {// ====关键点,若使用不确定返回值一定要判空,避免异常
				System.out.println(compareTheInt(sourceInt, targetInt).get(
						"message")
						+ ",一共猜了:" + count + "次");
			}
			// 若源与目标相等跳出循环
			if (null != resultMap
					&& null != resultMap.get("flag")
					&& ((boolean) compareTheInt(sourceInt, targetInt).get(
							"flag"))) {
				break;
			}
		}
	}

	/**
	 * 比较两个int大小,并打印结果
	 * 
	 * @param sourceInt
	 * @param targetInt
	 * @return key:value =
	 *         {"flag":boolean,"message":String}--最好用个类似Message的对象,一个项目的所有返回都使用统一值
	 *         ,提高扩展性降运维成本,例如:以后要加一个属性,表示这次两个数之间的差等等类似需求,不需要该方法修改结构即可实现。
	 *         若面试时这个是对外的api或接口,不考虑这一点的在我们项目会大打折扣
	 */
	public static Map<String, Object> compareTheInt(int sourceInt, int targetInt) {
		Map<String, Object> resultMap = new HashMap<String, Object>();
		// 目标大于源
		if (sourceInt < targetInt) {
			resultMap.put("flag", false);
			resultMap.put("message", "你填写的数字大了");
		} else
		// 源大于目标
		if (sourceInt > targetInt) {
			resultMap.put("flag", false);
			resultMap.put("message", "你填写的数字小了");
		} else
		// 源等于目标
		{
			resultMap.put("flag", true);
			resultMap.put("message", "相等了,game over!");
		}
		return resultMap;
	}

	public static void main(String[] args) {
		// 开始猜数字
		startTheGame(5, 100);
	}

}
狂热的土豆 2014-11-05
  • 打赏
  • 举报
回复
我是培训机构出生的高中生,这样的程序题是以前上学的时候,刚接触java几节课后经常做的练习,企业里用来给求职者做机试题可以说是毫无难度,甚至对于有经验的工程师来说,反而会质疑这个企业的技术水平。 不知道是凑巧还是怎么,除了一两个外,其余是从同一个网络培训机构出来的(也许是遇上他们的“毕业季”),借此了解了一点所谓的网络培训。 培训机构确实有你所谓的“毕业季”,我们当时是一批一百多人,分散到北上广深,基本上几个月就会有一批。 首先我觉得该培训机构故意将培训出来的学员推向我们这样的小创业公司,这是不合适的。这些学员实际上能力完全不足以胜任开发,而创业公司对开发人员的最低水平要求是比较高的。其次,虽说修行在个人,但该培训机构的培训内容(我去看了下)过于单薄和应试,完全对不住长达半年的全日制(网络)学习。 培训机构并没有如何“推”学员,找工作的事情都是靠个人的,只是有的学员进了大公司,拿了高薪,机构会借来给自己打打广告。能力的话,大多参差不齐,这样的程序题我有很多同学毕业了也都做不出来,还是因为个人对技术的态度,有很多并不是喜欢技术而来学习的,只是受到了现在培训机构广告的影响,觉得自己毕业了就能拿一份还不错的薪水。 我可以理解很多企业、很多人对于培训机构出生的人的偏见,因为确实他们有大多数并不是真正热爱技术的人,而只是靠着伪造了学历和工作经验来混迹于这个行业。前段时间我面试了几个应聘者,看到简历的风格,我就明白应该是我“校友”,我还是很耐心的跟他交流了技术,即使他让我失望了。 另一方面,我作为一个培训机构出生的人,也受到过很多企业、很多人的偏见。我是一个热爱技术的人,我希望可以脚踏实地的研究技术,但是我在找工作的时候遇到的很多是:坐了两小时车跑过去,和一个hr聊了一分钟,听我是培训出来的就把我扫地出门的;过了笔试和技术一面了,二面一看我是培训出生就把我请出来的;甚至还有外包打电话过来说我学历太低,要给我包装成本科发给他们甲方公司的。。。不过庆幸的是还算遇到了自己的伯乐。 写这些只是希望让更多人正确的认识培训机构,和认识这些毕业的学员,这个世界少一些偏见,多一些伯乐会更加美好。。。
wl198606 2014-11-05
  • 打赏
  • 举报
回复
能上网还写不出来,这都啥人啊
doraemoncyx 2014-11-04
  • 打赏
  • 举报
回复
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
int main(){
	ios_base::sync_with_stdio(false);
	srand(time(NULL));
	int num = rand() % 100 + 1;
	int guess;
	while (cin >> guess){
		if (guess == num){
			cout << "correct!";
			break;
		}
		else if (guess < num) cout << "too small";
		else cout << "too big";
		cout << "\n";
	}
}
水一贴
zapdos 2014-11-04
  • 打赏
  • 举报
回复
好吧,虽然我知道这样会被老板抽死,尝试用最少的行数实现

public class test {
	public static void main(String args[]) throws Exception {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		for (int aim = new Random().nextInt(100), in, count = 0; aim >= 0 && (in = Integer.parseInt(reader.readLine())) == in; count++)
			System.out.println(in < aim ? "<" : in > aim ? ">" : "you win : " + (count + (aim = -1) + 2));
	}
}
zjgdtl 2014-11-04
  • 打赏
  • 举报
回复
这种东西如果给一张白纸叫写在纸上还真有点压力,但是楼主你给了人家那么宽松的一个环境,还能上网查。。。。这要再写不出来就不是学的不好了,要么就是完全不懂代码,要么就是毫无解决问题的能力
daydreary 2014-11-04
  • 打赏
  • 举报
回复
这尼玛都写不出来。。。学过几天java的都会写
c_sdn_shang_bu_qi 2014-11-04
  • 打赏
  • 举报
回复
我不是做java的,不过我觉得也确实简单。。。 初学java就写过这样的程序 不过我觉得楼主可以多方面考察面试者的能力。不一定只看这个的。 也有可能是人家不 想写
ayrb13 2014-11-04
  • 打赏
  • 举报
回复
我知道有种方法能行数最少。。。。
黄小楼 2014-11-03
  • 打赏
  • 举报
回复
用得着30行? while循环判断不就行了么。。。。 楼主。我把这道面试题收下了。到时候借用一下啊。
xueleiisray 2014-11-03
  • 打赏
  • 举报
回复
import java.util.Scanner;

public class MyTest {
	public static void main(String[] args) {
		int key = (int) (Math.random() * 100);// 生成随机数
		int count = 0;// 统计次数
		int answer;
		Scanner sc = new Scanner(System.in);
		while(true) {
			count++;
			System.out.println("输入第"+count+"个数字:");
			answer = sc.nextInt();
			if (key == answer) {
				sc.close();
				System.out.println("恭喜你答对了!一共猜了"+count+"次。");
				break;
			} else if (key > answer) {
				System.out.println("对不起,你猜小了!");
			} else {
				System.out.println("对不起,你猜大了!");
			}
		}
	}
}
ayrb13 2014-11-03
  • 打赏
  • 举报
回复
额,我还写了一个类实现功能,哈哈
a346975303 2014-11-03
  • 打赏
  • 举报
回复

import java.util.*;

class Try {
	public static void main(String[] args) {
		Random random1 = new Random();
		int randomNumber=random1.nextInt(101);//获得随机数
		System.out.println(randomNumber);
		int count=0;//定义计数器
		Scanner in=new Scanner(System.in); //使用Scanner类定义对象  
        System.out.println("请输入整形数字");  
        int a;
        while (true){
        	a=in.nextInt(); //接收整形数据  
        	count++;
        	if (a==randomNumber){
        		System.out.println("恭喜您猜中了");
        		break;
        	}
        	else if (a>randomNumber)
        		System.out.println("大了");
        	else
        		System.out.println("小了");
         }
        System.out.println("您一共猜了"+count+"次");
	}
}
随便写写
捏造的信仰 2014-11-03
  • 打赏
  • 举报
回复
写起来大概就是这样子的
import java.util.Random;
import java.util.Scanner;

public class Guess {

public static void main(String[] args) {
int num = new Random().nextInt(100) + 1;
int userNum = input();
int counter = 0;

while (!check(num, userNum)) {
userNum = input();
counter++;
}

System.out.println("您猜对了,你一共猜了" + (counter + 1) + "次");
}

private static boolean check(int num, int userNum) {
if (userNum > num) {
System.out.println("您输入的数字太大了");
return false;
} else if (userNum < num) {
System.out.println("您输入的数字太小了");
return false;
}

return true;
}

private static int input() {
System.out.print("请输入一个数字(1-100):");
return new Scanner(System.in).nextInt();
}
}
捏造的信仰 2014-11-03
  • 打赏
  • 举报
回复
引用 1 楼 zapdos 的回复:
楼主,虽然这题很简单,就算是一般开发者,用惯了SSH,做惯了业务系统,他也很有可能写不好,信不信
没关系啊,不熟悉的地方无非就是 Scanner,我允许他去上网看 API。但如果循环和判断都写不好,这就明显不是做惯了业务系统的了。
ayrb13 2014-11-02
  • 打赏
  • 举报
回复
我写了80行的程序,我丢人了。。。
zapdos 2014-11-02
  • 打赏
  • 举报
回复
楼主,虽然这题很简单,就算是一般开发者,用惯了SSH,做惯了业务系统,他也很有可能写不好,信不信

590

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧