这些面试问题对于初学者来说是否太具有挑战性?

5

今天我面试了两个人,并给他们“测试”以查看他们的技能水平。这两个申请者都是入门级别的申请者,其中一个还在上大学。没有一个申请者发现以下代码有任何问题。

显然我发现了问题,否则我不会选择这些例子。 你认为这些问题对于新手程序员来说太严格了吗?

我想我还应该注意到他们两个都没有太多的C#经验...但我认为这些问题与语言无关。

//For the following functions, evaluate the code for quality and discuss.  E.g.
//E.g. could it be done more efficiently? could it cause bugs?        
public void Question1()
{
    int active = 0;

    CheckBox chkactive = (CheckBox)item.FindControl("chkactive");
    if (chkactive.Checked == true)
    {
        active = 1;
    }

    dmxdevice.Active = Convert.ToBoolean(active);
}

public void Question2(bool IsPostBack)
{
    if (!IsPostBack)
    {
        BindlistviewNotification();
    }

    if (lsvnotificationList.Items.Count == 0)
    {
        BindlistviewNotification();
    }
}


//Question 3
protected void lsvnotificationList_ItemUpdating(object sender, ListViewUpdateEventArgs e)
{
   ListViewDataItem item = lsvnotificationList.Items[e.ItemIndex];
   string Email = ((TextBox)item.FindControl("txtEmailAddress")).Text;
   int id = Convert.ToInt32(((HiddenField)item.FindControl("hfID")).Value);

   ESLinq.ESLinqDataContext db = new ESLinq.ESLinqDataContext();
   var compare = from N in db.NotificationLists
                 where N.ID == id 
                 select N;
   if (compare.Count() > 0)
   {
       lblmessage.Text = "Record Already Exists";
   }
   else
   {
       ESLinq.NotificationList Notice = db.NotificationLists.Where(N => N.ID == id).Single();
       Notice.EmailAddress = Email;
       db.SubmitChanges();
   }
   lsvnotificationList.EditIndex = -1;
   BindlistviewNotification();
}

2
我使用过Java和C++,但没有用过C#,如果要理解这些问题,我必须了解您正在使用的C# API部分的具体信息。换句话说,它们极度依赖于编程语言。 - MetroidFan2002
3
第二个问题与.NET框架关系甚少,任何了解基于C语言的人都应该明显看出其缺陷。 - Jim Burger
2
就个人而言,我认为这些问题实际上几乎太容易了。好吧,我猜我不能确定自己是否得到正确的答案,但我很快就能看出一些缺陷(以及如何处理它们)。而我正在攻读计算机编程专业的学士学位。 - David The Man
1
问题2,是的,我理解你关于布尔值的观点,但自从我看到一个大写的参数以来已经有一段时间了,读你的代码时我的眼睛忽略了那个。但是对于问题1,我需要知道Convert.toBoolean的合同是什么,#3,什么是ListViewDataItem等。这是C#特定的。 - MetroidFan2002
3
也许你应该在面对面的交流中问:“如果你正在为同事进行代码审查,你会认为哪些方面存在问题?”这样可以让他们至少识别并开始对话,而不必知道你期望什么,而不是进行测试。 - Robert Paulson
27个回答

35

我通常不会在面试时向应聘者展示代码并问“哪里有问题?”,因为我不认为这样能找到最优秀的候选人。面试有时会让人感到压力和不知所措,码农也不总是处于最佳状态。

至于这些问题,说实话,如果我不懂C#,我会对第三个问题感到困难。第二个问题也有点奇怪。是的,我明白你的意思,但如果想法是要调用两次BindlistviewNotification()会怎么样呢?这不够清楚,有人可能会认为信息不足。第一个问题很容易清理,但我不确定甚至它是否能证明一个没有C#背景的入门级开发人员的任何东西。

我认为我更愿意听到有人用伪代码或他们熟悉的语言向我解释如何解决问题,并从中评估他们。不过这只是我的个人意见。


11

我认为你在测试错误的内容。 显然,你正在寻找C#程序员,而不是才华横溢的程序员(并不是说你不能成为才华横溢的C#程序员)。 这些人可能是伟大的C++程序员。 C#可以学习,智商却不能。 我更喜欢在面试时询问代码,而不是以特定语言呈现代码(例如:在任何语言中实现ArrayList和LinkedList)。
当我今年早些时候寻找三名程序员,主要在C#,Java,PL / SQL,JavaScript和Delphi上工作时,我寻找了C / C ++程序员,并且一直没有失望。 任何人都可以学习Java,但不是每个人都有良好的架构感、数据结构掌握能力以及解决新复杂问题的能力。 C ++很难,因此它起到了很好的筛选作用。 如果我让他们寻找这个Java代码中的错误,我就会失去他们。
顺便说一下,我是一个团队领导,从事编程已有20年,完成了很多大型项目,并按预算和时间表开发。 对于第2或第3个问题出了什么问题,我不知道,只对C#略有了解,当然也不了解Linq。不是说我不能学会它...几分钟后,我想出了答案,但我不指望最近的毕业生能理解它。在问题3中的所有LINQ代码都是隐藏真正问题的干扰。


11

我是一名初级程序员,我可以尝试一下:

  1. "active"是不必要的:

CheckBox chkactive = (CheckBox)item.FindControl("chkactive");
dmxdevice.Active = chkactive.Checked
您应该使用安全转换来转换为 CheckBox 对象。当然,您无论如何都应该能够通过其变量名找到该复选框。
CheckBox chkactive = item.FindControl("chkactive") as CheckBox;
第二个函数可以更加简洁:
public void Question2(bool IsPostBack)
{
    if (!IsPostBack || lsvnotificationList.Items.Count == 0)
    {
        BindlistviewNotification();
    }
}

只有时间处理那两个问题,工作在召唤!

编辑:我刚才意识到我没有回答你的问题。我认为这并不复杂。虽然我不是专家,但我很容易看出这里的低效率。但我认为这种特定语言的测试从根本上是错误的方法。在我的观点中,它们并不是很有用的。尝试感受他们如何攻击和解决问题。任何能通过这个测试的人都能轻松地掌握一门语言,并从自己的错误中学习。


  1. 在第一种情况下,比较是不必要的,但是比较将一个布尔变量与true进行比较。为什么不直接评估布尔值呢?
我认为只有第三种情况是特定于语言的,而且我认为语言可以很容易地掌握。
- Steve g

8
你认为这些问题对新手程序员来说太严厉了吗?
是的,在我看来,它们太严厉了。
申请人都没有发现以下代码中的任何问题。
虽然有很多“可能存在的问题”,比如不检查空指针、强制转换等,但似乎没有任何“实际问题”。 (例如:给定合理的输入,程序看起来实际上将运行)。 我猜新手程序员会被卡住。
由于linq相当新,并且还没有得到广泛使用,所以它将超出新手的理解范围。
什么是ESLinqDataContext?如果人们不知道你的对象是什么或者它的行为方式,他们怎么知道它是否被正确使用?
只有通过合理的经验才能真正学会像无效的强制转换异常这样的东西(更不用说判断和评论“代码质量”了)。
也许我误解了,但在我看来,“入门级”职位基本上定义为没有先前经验的期望,因此,按照需要经验的标准对他们进行评分似乎不公平。

请不要过于技术化——因为在这种情况下,问题会变得太过深入。这只是一点技术思考,只是为了回答代码中的错误。这样一来,真正的问题,即它太严厉了,就被淡化了。 - Georgi
好的观点。我已经删除了技术答案(因为那不是重点),并保留了我的原始答案。 - Orion Edwards

6

我不是C#程序员,所以不知道BindlistviewNotification是什么意思,但更改

public void Question2(bool IsPostBack)
{
    if (!IsPostBack)
    {
        foo();
    }

    if (lsvnotificationList.Items.Count == 0)
    {
        foo();
    }
}

to

public void Question2(bool IsPostBack)
{
    if (!IsPostBack || lsvnotificationList.Items.Count == 0)
    {
        foo();
    }
}

更改函数!如果IsPostBack为false,则执行foo。如果lsvnotificationList.Items.Count == 0,则再次执行foo。修订后的代码将只执行一次foo。

你可以争论BindlistviewNotification可以执行多次而没有副作用,或者IsPostBack永远不可能是false,而lsvnotificationList.Items.Count等于0,但这些是依赖于语言和实现的问题,不能通过给定的代码片段解决。

此外,如果这是一个“应该”在面试中被发现的错误,那么这根本不是语言无关的。没有任何东西能告诉我这应该是一个错误。


可以毫不犹豫地说,在.NET中你不想要对同一数据进行两次绑定。但是,在面试中问这个问题也是合理的:“你想要绑定两次吗?” - FlySwat
1
但是,唉,这在这个范围内不是一个有效的问题。我认为问题提问者完全没有抓住重点。 - Georgi
不然说,你真的确定 "lsvnotificationList.Items.Count" 是什么意思吗?嗯... - Georgi

5
作为一名新手,我希望雇主更关心我的思考过程而不是答案是否“正确”。我可以提供一些答案,但它们可能不正确。 :)
因此,我认为你可以用这些问题来解决问题,但你应该对“正确”答案更加宽容。
只要这些条件明确,我认为拿到一张空白纸是件坏事。这意味着他们要么真的认为代码完美无缺(我们知道这几乎从来没有发生过),要么就是太胆小了,不敢分享自己的想法(这也是一件坏事)。

问题是我没有真正得到答案。我本来想让他们写出自己的想法,但最后只收到了空白的纸张... - CodeRedick
我明白你的意思。我已经更新了我的帖子以反映这一点。 - Jason Baker

5

我认为问题1和2并不太难,问题3需要对.NET中的数据绑定和LINQ有一个相当好的理解,因此对于初入门级别的人可能会有些困难。我认为这些是对于有一些.NET经验的初级开发人员而言相当不错的问题。

就我个人而言,我的笔记如下:

问题1:

  • 将整数用作布尔值
  • 未对findControl进行空值检查
  • 过度冗长

我的修订如下:

public void Question1()
{    
    CheckBox chkactive = item.FindControl("chkactive") as CheckBox;
    if (chkActive != null)    
       dmxdevice.Active = chkActive.Checked;
    else
       dmxdevice.Active = false;
}

问题2:

  • 过度冗长
  • 如果不是回发(postback),且没有要绑定的项,数据绑定将会发生两次。

我的修改:

public void Question2(bool IsPostBack)
{
    if (!IsPostBack || lsnotificationList.Items.Count == 0)
    {
        BindlistviewNotification();
    }
}

问题 3:

  • 将索引查找替换为获取 e.Item.DataItem;
  • 在 findControl 调用中添加空值检查;
  • 切换到 TryParse 并添加默认的 id 值;
  • 改进错误处理;
  • 记录一些重要的架构问题,为什么要从前端查询数据库?那些 LINQ 查询也可以被优化;
  • 为什么不在列表项集合中检查重复项,以及为什么不将所有更新批量提交后再处理?

能否详细说明一下如何优化LINQ查询?否则,回答不错,点赞+1。 - Amy B
不要使用Contains()方法,而是选择适当的ID,然后检查是否返回了一个元素。如果返回了一个元素,那么你已经找到了匹配项,这样可以避免进行昂贵的扫描,并减少一次与数据库的往返。 - FlySwat
我找了很久,也没有发现Contains(),难道你是想用Count吗?Count已经按照ID过滤了,所以应该没问题。还有,你关于双重往返的说法是错误的。DataContext知道符合条件的记录,不会再次往返获取它。重复的代码才是真正的罪恶。 - Amy B
你在第三个问题上错过了真正的问题。大问题在于,在 UPDATE 方法中,他检查记录是否已经存在,如果存在则显示错误信息。好好想一想。 - CodeRedick
我确实考虑过这个问题,如果这是一个分布式应用程序,并且在此刷新之前,其他人已经对该行进行了更新,那该怎么办?嗯? - FlySwat
那又怎样呢?如果你因为行已经存在而阻止更新,你实际上永远无法进行更新。不管是分布式还是非分布式。 - CodeRedick

4

所以你向一个没有c#、.net、asp.net或linq知识的人提出了这个问题?我不会期望任何纸上谈兵。


我觉得第3个问题可能会让人停下来思考一下(这是意在设置难点的问题)。不过我认为第一个问题相当简单。 - CodeRedick
如果你从未使用过findcontrol,你怎么知道它的潜在问题?在C++中,true为1,false为0。我不确定他们是否能在学校里掌握防御性编程技巧?他们有多少经验? - Aaron Fischer
FindControl并不是问题所在。我知道C++使用1/0表示真/假,但当你看到一个已经是布尔类型的整数被转换成布尔类型时,难道不会让你感到奇怪吗?其中一个之前有两年的编程工作经验,另一个还在上大学,没有任何经验。 - CodeRedick
有两年的经验,你是正确的。他们应该看到了一些东西。 - Aaron Fischer

2

我唯一的建议是确保你的测试问题可以编译。

我认为FizzBuzz类型的问题的价值在于观察某人如何解决你的问题。

看他们将解决方案加载到IDE中,编译它,使用逐步调试器逐步执行代码,为明显预期的行为编写测试,然后重构代码使其更正确/可维护,这比知道他们能否阅读代码并理解它更有价值。


不幸的是,这些代码片段来自一个更大的项目。我认为如果直接给出解决方案,就没有机会让他们理解了...虽然也许我可以想出一个沙盒应用程序... - CodeRedick
抱歉,我没有说明,但是是的,要么使用现有的应用程序,要么想出一个代表性且足够小以在一次坐下理解的应用程序。 - Jim Burger

1
看到每个人都跳进来更改或修复代码,真有趣。问题是“高效?会引起错误吗?”答案是:只要有足够的时间和金钱,肯定可以使每个人更加高效。请避免编写复杂难读的代码(代码应该是自我描述的),以避免出现错误。如果没有错误,下一个初级程序员尝试更改它后可能会出现错误。还要避免编写依赖于方法/函数范围之外包含状态的代码,那些讨厌的全局变量。如果有一些富有见地的评论,那么将其用作创造良好对话的工具可能是合适的。但是,我认为有一些更好的破冰方式可以确定一个人的批判性思维能力是否合适,并确定他们是否适合其余的团队。我认为玩“考倒程序员”并不是非常有效的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接