这些面试问题对初学者来说太具挑战性了吗?

时间:2008-09-29 23:40:36

标签: c#

所以我今天刚刚采访了两个人,并给他们“测试”以了解他们的技能是什么样的。两人都是入门级申请人,其中一人实际上还在上大学。申请人都没有看到以下代码有任何问题。

我明白,或者我不会选择那些例子。 您是否认为这些问题对新手程序员来说过于苛刻?

我想我也应该注意到他们都没有太多使用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();
}

27 个答案:

答案 0 :(得分:35)

我通常不会在某个职位的面试中抛出代码并说“出了什么问题?”,主要是因为我不相信它真的让我觉得是最好的候选人。面试有时会有压力,有点压倒性,而且编码员并不总是在他们的A级比赛中。

关于这些问题,说实话,我认为如果我不了解C#,我就会遇到问题3的问题。问题#2也有点时髦。是的,我得到你想要的东西,但是如果想法是BindlistviewNotification()应该被调用两次呢?目前尚不清楚,有人可能认为没有足够的信息。问题1很容易清理,但我不相信它甚至证明了没有C#背景的入门级开发人员。

我认为我宁愿通过他们如何解决问题(用伪代码或他们习惯的任何语言)来讨论我,并从中评估它们。但是,只是个人意见。

答案 1 :(得分:11)

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

  1. “有效”是不必要的:

    CheckBox chkactive = (CheckBox)item.FindControl("chkactive");
    dmxdevice.Active = chkactive.Checked
    
  2. 您应该使用安全转换来强制转换为CheckBox对象。当然,你应该能够通过变量名找到复选框。:

    CheckBox chkactive = item.FindControl("chkactive") as CheckBox;
    
  3. 第二个功能可能更简洁:

    public void Question2(bool IsPostBack)
    {
        if (!IsPostBack || lsvnotificationList.Items.Count == 0)
        {
            BindlistviewNotification();
        }
    }
    
  4. 这两个人只有时间,工作就是打电话!

    编辑:我刚才意识到我没有回答你的问题。我认为这根本不复杂。我无论如何都不是专家,我可以很容易地看到这里效率低下的问题。但我认为这一般是错误的做法。在我看来,这些语言特定的测试并不是很有用。试着了解他们如何攻击和解决问题。任何能够通过测试的人都能轻松掌握一门语言并从错误中吸取教训。

答案 2 :(得分:11)

我认为你正在测试错误的东西。你显然正在寻找一个C#程序员,而不是一个才华横溢的程序员(不是说你不能成为一个才华横溢的C#程序员)。例如,这些人可能是伟大的C ++程序员。 C#可以学习,智能不可以。我更喜欢在面试中询问代码,而不是用特定语言呈现代码(例如:用任何语言实现ArrayList和LinkedList)。
当我今年早些时候在寻找3位程序员时,主要在C#,Java,PL / SQL,Javascript和Delphi中工作,我寻找C / C ++程序员,并没有失望。任何人都可以学习Java,并不是每个人都有良好的架构感,数据结构和对新的复杂问题的把握。 C ++很难,所以它可以作为一个很好的过滤器。如果我在这个Java代码中找到了错误,我就会丢失它们 顺便说一句,我是一个团队负责人,已经编程了20年,有几十个按时和按预算开发的大型项目,我对第2或第3个问题出了什么问题一无所知,只是熟悉C#,当然不是Linq,不是我无法学习它......我在几分钟后想出来了,但不会指望最近的毕业生能够掌握它,问题3中的所有LINQ代码都是分散注意力,隐藏真正的问题

答案 3 :(得分:7)

  

你觉得这些问题对于新手程序员来说太苛刻了吗?

是的,IMO他们太苛刻了。

  

以上代码均未发现任何问题。

  1. 虽然有很多“可能的问题”,比如没有检查空指针,转换等,但似乎没有任何“实际问题”。 (例如:给出合理的输入,程序看起来会实际运行) 我猜想新手程序员会挂断电话。

  2. 由于linq很新,而且还没有广泛使用,它将会以方式超越你的新手。

  3. 什么是ESLinqDataContext?如果人们不知道你的对象是什么或它的行为如何,他们应该如何知道它是否被正确使用?

  4.   

    评估质量代码并讨论

  5. 你只是从学习使用类似于你面前的代码的合理经验中学到了很多东西,比如无效的强制转换异常(更不用说能够判断和评论'代码质量')了。

    也许我误解了,但对我来说,根据定义,“入门级”的位置对先前的经验没有期望,因此根据需要经验的标准对它们进行评级似乎不公平。

答案 4 :(得分:5)

作为一个新手,我希望雇主更关心我的思维过程,而不是答案是否“正确”。我可以想出这些问题的一些答案,但它们可能不对。 :)

所以说,我认为你可以解决这些问题,但你应该对“正确”的答案更加自由。

只要明确了这些条件,我认为得到一张没有任何想法的空白表是件坏事。这意味着他们要么真正认为代码是完美的(我们知道这几乎不是真的),要么太羞怯以分享他们的想法(这也是一件坏事)。

答案 5 :(得分:5)

我不是C#程序员,所以我不知道BindlistviewNotification做了什么,但改变了

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

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

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

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

你可以争辩说BindlistviewNotification可以多次执行而没有副作用,或者IsPostBack永远不会是假的,并且lsvnotificationList.Items.Count同时等于0,但这些是依赖于语言和依赖于实现的问题,无法解决给定的代码片段。

此外,如果这是一个“应该”在面试中被捕获的错误,那么这根本不是语言不可知的。没有什么可以告诉我这应该是一个错误。

答案 6 :(得分:5)

我不认为1和2太难了,#3需要对数据绑定和LINQ如何在.NET中工作有一个很好的理解,所以对入门级人员来说可能有些困难。我认为这些对于具有一定.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:

  • 过多的冗长
  • 如果不是回发,数据绑定将发生两次,并且没有要绑定的项目。

我的修订版:

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

问题3:

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

答案 7 :(得分:4)

所以你问过没有c#,。net,asp.net或linq知识的人?我不会期待纸上的任何东西?

答案 8 :(得分:2)

我唯一的建议是确保你的测试题实际编译。

我认为FizzBu​​zz类型问题的价值在于观察有人如何解决您的问题。

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

答案 9 :(得分:1)

问题3似乎是泥浆类型实施的一个重要方面。这几乎可以说是直接来自大学的初级开发人员的风格。我记得大学里的大多数教授/助教从来没有读过我的代码 - 他们只运行可执行文件然后放入测试集。我不希望新的开发人员理解它有什么问题......

答案 10 :(得分:1)

前两个看起来更像是一个测试,看看一个人是否可以遵循逻辑并意识到有额外的代码。我不相信入门级开发人员会理解“少即是多”。但是,如果你解释问题1的答案而他们没有将这个答案推广到#2,我会担心的。

答案 11 :(得分:1)

看到每个人都在改变或修改代码,这很有趣。这些问题的目标是“有效吗?它会导致错误吗?”答案:如果有足够的时间和金钱,确保每一个都可以提高效率。错误,请尽量避免编译和编写难以阅读的代码(代码应该是自我记录的)。如果没有bug,可能会在下一个初级程序员尝试更改它之后...另外,避免编写看起来依赖于方法/函数范围之外的状态的代码,那些讨厌的全局变量。如果我得到这样一些富有洞察力的评论,那么将其用作创建一些良好对话的工具可能是合适的。但是,我认为有一些更好的破冰者可以确定一个人的批判性思维能力是否合适,以及他们是否适合团队的其他成员。我不认为玩程序员是非常有效的。

答案 12 :(得分:1)

我认为前两个很好。对于研究生水平的面试,第三个可能有点复杂,但也许不是,这取决于他们之前是否做过任何.net编码。

那里有LINQ语句,这很新。特别是因为许多大学/学院在教授最新技术方面略显落后。所以我会说用1& 2,或者简化3或者像其他人提到的那样大量评论

答案 13 :(得分:1)

你期望从这次采访中得到什么?您的员工是否必须在没有调试器的情况下调试代码?您是否正在招聘只会进行维护编程的人?

在我看来,这些问题对于候选人的能力没有什么帮助。

答案 14 :(得分:1)

不知道C#,它花了我一点时间,但我假设#1可以表示为

dmxdevice.Active =((CheckBox)item.FindControl(“chkactive”))。选中== true

在#2中,两个条件可以作为A OR B语句加入?

如果这就是你要找的东西,那么不,那些并不太难。我认为#1是你可能在编程一段时间后才能学到的东西,但#2似乎更容易。 您是否正在寻找它们以捕获空指针异常?

答案 15 :(得分:1)

如果您正在寻找维护程序员或测试人员,这是一个很好的问题。

但是,这不是检测优秀程序员的好测试。一个优秀的程序员肯定会通过这个测试,但许多不好的程序员也会通过它。

如果你想要一个优秀的程序员,你需要定义一个只有优秀程序员才能通过的测试。一个优秀的程序员具有出色的解决问题的能力,并且知道如何在问题开始工作之前提出问题以找到问题的核心 - 节省他们和你的时间。

一个优秀的程序员可以用很多不同的语言编程,只需要一点学习曲线,因此你的'代码'测试可以包含伪代码。告诉他们你希望他们解决问题并让他们用伪代码编写解决方案 - 这意味着他们无法访问所有那些漂亮的库。一个优秀的程序员知道库的功能,并且可以根据需要重新创建它们。

所以......是的,你基本上是在问教科书知识问题 - 那些表现出记忆和语言知识的东西,而不是解决问题所必需的技能。

- 亚当

答案 16 :(得分:0)

Okey我不会回答我在这里看到的C#问题,你有足够的候选人在你的面试中做得很好。

我确实认为测试不能让你很好地了解人的编程技巧。看看Joel的采访指南:
http://www.joelonsoftware.com/articles/fog0000000073.html

关于可能的候选人,他谈到了两件事:他们是否聪明并且他们完成了工作(现在这是一个强大的组合)。让你的候选人谈谈他们所做的项目或者他们在做什么在家里。了解他们是否对编程充满热情。一些经验当然很好,只是不要让他们做技巧。

答案 17 :(得分:0)

问题#1

  boolean active = true;

问题#2

  if ((!IsPostBack) || (lsvnotificationList.Items.Count == 0))   

问题#3:

完全重写并添加评论。读完30秒后,我仍然无法分辨出代码正在尝试做什么。

答案 18 :(得分:0)

我将不得不说,我对这些问题的回答是,如果没有注释(或文档)解释代码的作用,那么甚至没有理由查看代码。代码确实完成了它的功能。如果你改变它做其他事情,甚至改变它以防止抛出异常,你可能会让它做一些无意的事情并打破更大的程序。

所有三个问题的问题在于没有意图。如果您修改代码,则假定您知道原始编码器的意图。而这种假设往往是错误的。

回答这个问题:是的,这对大多数初级程序员来说太难了,因为从来没有教过编写代码。

答案 19 :(得分:0)

好的,所以在我睡觉前熬夜阅读所有答案并评论大部分答案......

一般的共识似乎是问题并不是太糟糕,但是,特别是对于Q3,使用伪代码或其他技术来隐藏某些特定语言的东西可以更好地服务。

我想现在我不会过分夸大这些问题。

(当然,他们缺乏SQL知识仍然令人不安......如果只是因为他们在简历中都有SQL。:()

答案 20 :(得分:0)

虽然这里的人们在业余时间显然没有遇到这些代码的问题,但是大约一年前,作为一个完成整个求职/面试流程的人,我认为你必须记住像这样的压力问题如何是。我知道你只是在寻找思考过程,但我认为如果你在让受访者平静下来之后随便和对话地提出这样的问题,你会得到更多的人。这可能听起来像是一个警察,但是在技术上工作但需要一些修剪的代码的问题可能比纠正不编译的代码要困难得多,因为人们会认为这些例子假设不能编译,并且将自己推上墙,试图找出问题的诀窍。有些人从来没有因为面试问题而感到压力,但是很多人,甚至是一些你可能不想排除的才华横溢的程序员,除非你正在准备他们必须用负载枪支编程的情况。< / p>

问题3中的代码本身似乎非常具有C#。我只知道作为LINQ,因为有人在这里的答案中指出了它,但作为一个Java开发人员,我根本不会认识到这一点。我的意思是你真的希望大学教授一个最近才在.net 3.5中引入的功能吗?

我还想指出这里有多少人被问题2绊倒,通过简化代码,他们意外地改变了代码的行为。这应该告诉你很多关于你的问题的难度。

答案 21 :(得分:0)

没有人用代码回答#3。这应该表明人们对此的看法。通常stackoverflowers首先满足这些要求。

这是我对它的刺痛。我不得不在msdn上查找EventArgs以了解属性。我知道LINQ因为我在过去的8个月里仔细研究过它。我没有太多的UI经验,所以我无法判断在事件处理程序中对bind的调用是否错误(或者其他对UI编码器来说很明显的事情)。

protected void lsvnotificationList_ItemUpdating(object sender, ListViewUpdateEventArgs e)
{
  string Email = e.NewValues["EmailAddress"].ToString();
  int id = Convert.ToInt32(e.NewValues["ID"]);

  using (ESLinq.ESLinqDataContext db = new ESLinq.ESLinqDataContext(connectionString))
  {
    List<NotificationList> compare = db.NotificationLists.Where(n => n.ID = id).ToList();

    if (!compare.Any())
    {
      lblmessage.Text = "Record Does Not Exist";
    }
    else
    {
      NotificationList Notice = compare.First();
      Notice.EmailAddress = Email;
      db.SubmitChanges();
    }
  }
  lsvnotificationList.EditIndex = -1;
  BindlistviewNotification();

}

答案 22 :(得分:0)

粗略地看一眼,其余大部分代码都会遇到结构不良和不必要的条件等问题。没有任何内在的“错误”,特别是如果程序按预期运行。也许你应该改变这个问题?

另一方面,铸件看起来并不完全正确。 (cast)object.Method()vs(cast)(object.Method())vs((cast)object).Method()。在第一种情况下,它不是一个与语言无关的问题 - 它取决于优先规则。

我认为不是那么难,但这一切都取决于你想要测试的内容。 IMO,聪明的候选人应该在尝试回答之前询问关于程序功能和类结构的很多问题。例如。如果他们不问,“他们”应该知道“item”是否是全局/成员变量?他们怎么知道它的类型?他们甚至知道它是否支持FindControl方法?那么FindControl的返回类型呢?

我不确定有多少大学教过Linq,所以也许你应该删除那部分。

答案 23 :(得分:0)

免责声明:我来自4年制学位和一年的专业Java经验。

前两个问题非常简单,如果候选人没有看到更好的方法,我会怀疑这是因为他们没有在课堂上注意; - )

到目前为止提出的第二个问题的大部分答案都改变了函数的行为。该函数很可能在原始代码中被评估两次,但我不能说这是否是函数的意图。副作用很重要。

我可能会将第一个函数单行化,我自己。

这些问题与语言无关,但它们与图书馆无关,我认为这同样重要。如果你专门寻找.NET知识,那么好,但没有Google,我无法告诉你ESLinq.DataContext是什么,我对第三个问题的回答也会受到影响。事实上,对我来说几乎是不可理解的。

我认为你也必须小心提出问题。关于前两种方法本身没有不正确的。他们只是比他们应该更加冗长。

我只是将它们与表格一起呈现,然后说:“你觉得这段代码怎么样?” 如果他们想要提出错误处理/记录/评论或其他事情,那就是开放式结束,这不会限制讨论。

答案 24 :(得分:0)

我不是C#程序员。在Q1,似乎有未申报的对象dmxdevice和item,这让我很困惑。但是,其余的代码似乎确实存在很多混淆。在Q2上,没有声明lsvnotificationList,并且我不清楚为什么一个测试缩写为!和另一个== 0 - 但似乎可以将测试与||结合起来。在Q3中,lsvnotificationList再次无法自我声明。对于其余的,它似乎是使用LINQ进行数据库查找。我至少期望将其纳入一个更透明地验证隐藏字段ID的函数中。但如果你有其他想法,那么......我还不是C#程序员。

答案 25 :(得分:-1)

在问题2中,为了更好的模块化,我建议将lsvnotificationList.Items的计数作为参数传递:

public void Question2(bool IsPostBack, int listItemsCount)
{
    if (!IsPostBack || listItemsCount == 0)
       BindlistviewNotification();
}

答案 26 :(得分:-1)

Q1在item.FindControl()行上也有潜在的InvalidCastException。

我认为即使对于非C#用户来说,Q1或Q2也不会过于强硬。任何级别的代码都应该能够看到你应该使用boolean for active,并且只使用一个if语句。

第三季虽然至少需要其他人注意到的评论。这不是基本代码,特别是如果您也使用它来定位非C#用户。