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

时间:2020-03-06 14:54:06  来源:igfitidea点击:

因此,我今天刚刚采访了两个人,并给他们"测试"以了解他们的技能。两者都是入门级申请人,其中之一实际上仍在上大学。两位申请人均未发现以下代码有任何问题。

我确实知道,或者我不会选择这些例子。我们认为这些问题对于新手程序员来说太苛刻了吗?

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

解决方案

问题1

boolean active = true;

问题2

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

问题3:

进行整体重写并添加注释。经过30秒钟的读取后,我仍然无法分辨代码试图执行的操作。

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

因此,我认为我们可以解决这些问题,但是对于"正确"的答案,我们绝对应该更加宽容。

只要这些条件都明确了,我认为无所事事地拿一张白纸是一件坏事。这意味着他们或者真正地认为代码是完美的(我们知道这几乎是不正确的),或者太讨厌以至于无法分享他们的想法(这也是一件坏事)。

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

  • "活动"是不必要的:
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();
    }
}

这两个人只有时间,工作正在召唤!

编辑:我只是意识到我没有回答你的问题。我认为这一点都不复杂。我绝不是专家,我可以很容易地看到这里的效率低下。但是,我确实认为这通常是错误的方法。我认为这些特定于语言的测试不是很有用。尝试了解他们将如何攻击和解决问题。任何可以通过该考试的人都可以轻松选择一种语言并从错误中学习。

不知道C#,我花了更长的时间,但我假设#1可以表示为

dmxdevice.Active =(((CheckBox)item.FindControl(" chkactive"))。Checked == true

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

如果这就是我们要寻找的东西,那么不,这些并不是很难。我认为#1是只有在编程一段时间后才能学到的东西,但是#2似乎更容易。
我们是否也在寻找捕捉空指针异常的方法?

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

它里面有LINQ语句,这是很新的。特别是由于许多大学/学院在教授最新技术方面有些落后。所以我想说用1&2运行,或者简化3或者像其他人提到的那样对其进行大量评论

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

我认为Q1或者Q2不会过于艰辛,即使对于非Cuser而言也是如此。任何级别的代码都应该能够看到我们应该将布尔值用于活动状态,并且仅使用一个if语句。

问题3,尽管至少有人需要指出,但也需要发表评论。那不是基本的代码,尤其是如果我们也将非目标用户作为目标代码时。

我不是程序员。在第一季度,似乎有未声明的对象dmxdevice和item,这使我感到困惑。但是,在其余的代码中似乎确实存在很多混淆。在第二季度,没有声明lsvnotificationList,并且我不清楚为什么一个测试缩写为!另一个== 0-但可以将测试与||组合使用。在第三季度中,再次不言而喻地声明了lsvnotificationList。对于其余部分,似乎正在使用LINQ进行数据库查找。我至少希望将其分解为可以更透明地验证隐藏字段ID的函数。但是,如果我们还有其他想法,那么...我仍然不是程序员。

前两个似乎更像是一个测试,旨在了解一个人是否可以逻辑地遵循并意识到是否有多余的代码。我不相信入门级开发人员会理解"少即是多"。但是,如果我们解释了问题1的答案,而他们又没有将问题2的答案推导出来,我会担心。

问题3似乎是实施的一个大难题。几乎可以预期,这将是大学毕业后的初级开发人员的风格。我记得大学里的大多数教授/助教都从未读过我的代码-他们只运行可执行文件,然后放入测试集中。我不希望新的开发人员了解它的问题所在...

我通常不会向面试某人的职位扔代码并说"出了什么问题?",主要是因为我不相信这确实是我的最佳人选。面试有时会让人感到压力重重,有些让人不知所措,编码人员并不总是在他们的A游戏中。

关于这些问题,老实说,我认为如果我不了解C#,我将很难回答第3个问题。第2个问题也有点时髦。是的,我知道我们要去那里做什么,但是如果该想法是应该两次调用BindlistviewNotification()呢?目前尚不清楚,人们可能会争辩说没有足够的信息。问题1很容易清理,但是即使对于没有C#背景的入门级开发人员也无法证明任何问题,我也不敢相信。

我想我想通过他们如何解决问题(用伪代码或者他们喜欢的任何一种语言)谈论我,并从中进行评估。不过,这只是个人意见。

因此,我们向没有c#、. net,asp.net或者linq知识的人问过这个问题?我不会在纸上期待什么?

我认为我们正在测试错误的内容。显然,我们正在寻找的是C程序员,而不是有才华的程序员(并不是说我们不能成为有才华的C程序员)。例如,这些家伙可能是伟大的C ++程序员。可以学到,聪明人不能。我更喜欢在面试中询问代码,而不是用特定语言显示代码(例如:以任何一种语言实现ArrayList和LinkedList)。
当我在今年早些时候寻找3位程序员,主要在C#,Java,PL / SQL,Javascript和Delphi中工作时,我一直在寻找C / C ++程序员,但并不失望。任何人都可以学习Java,但不是每个人都具有良好的架构,数据结构和对新的复杂问题的理解能力。 C ++很难,因此它可以充当很好的过滤器。如果我被问到在此Java代码中发现错误,那我会丢失它们的。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
BTW是我的团队负责人,从事了20年的编程工作,按时和按预算开发了数十个大型项目,而我对问题2或者问题3的问题一无所知,只对C#有一定的了解,当然不是在Linq上学习,不是我不能学习它。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。这些。。。。。这些。。。。。。。不服务。。。。。。。。。。。。。。。。。 。

我不认为1和2太困难,#3要求对.​​NET中的数据绑定和LINQ如何工作有一定的了解,因此对于入门级人员而言可能有些困难。对于具有一些.NET经验的初级开发人员,我认为这些问题是相当不错的。

对于其价值,我的笔记是:

  • 使用整数作为布尔值
  • 在findControl上没有null检查
  • 过多的冗长

我的修订:

public void Question1()
{    
    CheckBox chkactive = item.FindControl("chkactive") as CheckBox;
    if (chkActive != null)    
       dmxdevice.Active = chkActive.Checked;
    else
       dmxdevice.Active = false;
}
  • 过多的冗长
  • 如果不是回发,则数据绑定将发生两次,并且没有要绑定的项目。

我的修订:

public void Question2(bool IsPostBack)
{
    if (!IsPostBack || lsnotificationList.Items.Count == 0)
    {
        BindlistviewNotification();
    }
}
  • 用获取e.Item.DataItem替换索引的循环;
  • 添加nullchecks到findControl调用。
  • 切换到TryParse并添加默认ID值。
  • 增加了更好的错误处理
  • 记录一些主要的体系结构问题,为什么要从前端查询数据库?那些LINQ查询也可以优化。
  • 为什么不检查列表项集合中的重复项,为什么不以后再通过一次提交批处理所有更新?

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

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

迄今为止,对第二个问题的大多数回答都改变了功能行为。该函数可以在原始代码中进行两次评估,尽管我不能说这是否是该函数的意图。副作用很重要。

我可能自己将第一个功能单行执行。

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

我认为我们也必须小心提出问题。本质上,前两种方法没有什么不妥。它们只是比应该的要冗长一些。

我只想给他们看一下表格,然后说:"我们对这段代码有什么看法?"
使其开放式,这样,如果他们想提出错误处理/记录/注释或者其他内容,就不会限制讨论。

我不是程序员,所以我不知道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永远不能为false并且lsvnotificationList.Items.Count同时等于0,但是这些依赖于语言和依赖于实现的问题不能用给定的代码解决。片段。

另外,如果这是"本应"在访谈中发现的错误,那么这根本不是与语言无关的。没有什么可以告诉我这应该是一个错误。

我们期望从这次采访中得到什么?员工是否必须在没有调试器等的情况下调试代码?我们是否正在雇用仅进行维护编程的人员?

我认为这些问题对候选人能力没有什么启发。

粗略地看一眼就表明,其余大部分代码都存在结构不良和不必要的条件等问题。这与生俱来就没有"错误",特别是如果程序按预期运行时。也许我们应该更改问题?

另一方面,例如,看起来根本没有正确进行转换。 (cast)object.Method()vs(cast)(object.Method())vs((cast)object).Method()。在第一种情况下,这不是语言不可知的问题,尽管它取决于优先级规则。

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

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

Do you think these questions are too harsh for newbie programmers?

是的,IMO他们太苛刻了。

Neither applicant saw anything wrong with the following code.
  • 尽管存在许多"可能的问题",例如不检查空指针,强制转换等,但似乎没有任何"实际问题"。 (例如:给定合理的输入,该程序看起来将像实际运行一样)。我猜想新手程序员会对此感到困惑。
  • 由于linq相当新,并且尚未得到广泛使用,因此它将超越新手。
  • 什么是ESLinqDataContext?如果人们不知道对象是什么或者其行为如何,应该如何知道该对象是否被正确使用?
evaluate the code for quality and discuss

我们只有从与我们面前的代码相似的合理经验中真正学习挑选无效的强制转换异常(更不用说能够判断和评论"代码质量")之类的东西了。

也许我误会了,但是对我来说,"入门级"职位从定义上讲几乎没有对先前经验的期望,因此按照需要经验的标准对其进行评分似乎并不公平。

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

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

如果我们想要一个好的程序员,则需要定义一个只有一个好的程序员才能通过的测试。一个好的程序员具有出色的解决问题的能力,并且知道如何在开始工作之前就提出问题以解决问题的核心,从而节省了时间和时间。

一个好的程序员只需很少的学习就可以用多种不同的语言进行编程,因此"代码"测试可以由伪代码组成。告诉他们我们要他们解决问题,并让他们用伪代码编写解决方案,这意味着他们无权访问所有这些漂亮的库。一个好的程序员知道库的功能,并可以在需要时重新创建它们。

所以...是的,我们本质上是在问教科书知识问题,这些项目显示记忆和语言知识,但不是解决问题所必需的技能。

-亚当

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

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

我唯一的建议是确保测试问题能够正确编译。

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

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

没有人用代码回答#3. 那应该表明人们对此有何看法。通常stackoverflowers遇到这些首先。

这是我的目的。我必须在msdn上查找EventArgs才能知道其属性。我了解LINQ,是因为在过去的8个月中我一直在仔细研究它。我没有太多的UI经验,所以我无法确定在事件处理程序中绑定绑定的调用是否不好(或者其他对于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();

}

虽然这里的人显然在业余时间没有遇到任何麻烦,但是作为大约一年前刚从拼贴中走过整个求职/面试过程的人,我认为我们必须记住类似这样的压力性问题。我了解我们只是在寻找思考的过程,但是我认为,如果让被访者平静下来后,随便和通过对话提出这样的问题,我们会从人们中得到更多的收获。这听起来像是在解决问题,但是有关在技术上可以正常运行但需要进行一些修剪的代码的问题要比纠正无法编译的代码困难得多,因为人们会认为这些示例假设是无法编译的,并且会让自己陷入困境,试图找出问题的把戏。某些人从来没有受到面试问题的压力,但很多人甚至没有,即使我们是某些才华横溢的程序员,我们可能都不希望排除这些压力,除非我们正在为他们做准备,以便他们不得不用装满枪头的程序进行准备。

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

我还想指出问题2使这里的人绊倒了,他们通过精简代码来无意中改变了代码的行为。那应该告诉你很多问题的难度。

好的,所以在熬夜之前,我要阅读所有答案并评论其中的大多数答案。

普遍的共识似乎是问题并不算太糟糕,但是,特别是对于第3季度,可以通过使用伪代码或者其他技术来隐藏某些特定于语言的内容来更好地解决。

我想现在我不会太权衡这些问题。

(当然,他们缺乏SQL知识仍然令人不安。。。只是因为他们俩的履历上都带有SQL。:()

我不得不说,我对这些问题的回答是,没有注释(或者文档)解释了代码是做什么的,甚至没有理由去看代码。该代码完全可以完成它的工作。如果将其更改为执行其他操作,甚至为了防止引发异常而对其进行更改,则可能会使它执行意外的操作并破坏了较大的程序。

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

并回答这个问题:是的,这对大多数初级程序员来说太困难了,因为从不教文档代码。

看到每个人都跳来更改或者修复代码很有趣。这些问题的目标是"有效?会导致错误吗?"答案:如果有足够的时间和金钱,请确保每个人都可以提高效率。错误,请尝试避免强制转换和编写难以阅读的代码(代码应自记录)。如果它没有错误,则可能在下一个初级程序员尝试对其进行更改之后...。此外,请避免编写似乎依赖于方法/函数范围之外的状态的代码,即那些讨厌的全局变量。如果我收到这样一些有见地的评论,将其用作创建良好对话的工具可能是合适的。但是,我认为存在一些更好的破冰船来确定一个人的批判性思维技能是否合适,以及他们是否适合团队的其他成员。我认为打树桩的程序员不是很有效。

Okey我不会从这里看到的问题中回答"问题",我们有足够的候选人可以在与工作面试中胜任。

我确实认为测试不会使我们很好地了解人员编程技能。看看Joel的面试指南:
http://www.joelonsoftware.com/articles/fog0000000073.html

在谈到可能的候选人时,他谈到了两件事:他们聪明吗?他们完成了工作(现在是一个有力的组合)。让候选人谈论他们所做的项目或者他们在家里做什么的事情。找出他们是否对编程充满热情。当然,有些经验是很好的,只是不要让他们去欺骗。