这些面试问题对初学者来说是否太具有挑战性了
本文关键字:是否 挑战性 面试 问题 初学者 | 更新日期: 2023-09-27 17:47:22
所以我今天刚刚采访了两个人,并给他们做了"测试",看看他们的技能是什么样的。两人都是入门级申请者,其中一人实际上仍在上大学。 两个申请人都没有看到以下代码有什么问题。
我这样做,显然,否则我不会选择这些例子。 你认为这些问题对新手程序员来说太苛刻了吗?
我想我还应该注意到他们都没有太多使用 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();
}
我通常不会向面试职位的人扔代码并说"怎么了?",主要是因为我不相信它真的能找到我的最佳人选。 面试有时会让人感到压力很大,有点压倒性,程序员并不总是在他们的A游戏中。
关于这些问题,老实说,我认为如果我不了解 C#,我会很难回答问题 3。 问题#2也有点时髦。 是的,我明白你要去那里做什么,但如果这个想法是BindlistviewNotification()应该被调用两次呢? 目前尚不清楚,有人可能会争辩说没有足够的信息。 问题 1 很容易清理,但我不相信它对于没有 C# 背景的入门级开发人员来说证明了什么。
我想我宁愿让一些东西告诉我他们如何解决一个问题(用伪代码或任何他们熟悉的语言)并从中评估他们。 不过,这只是个人意见。
我是一名初级程序员,所以我可以尝试一下:
-
"活动"是不必要的:
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#程序员,而不是一个有才华的程序员(并不是说你不能成为一个有才华的C#程序员)。例如,这些家伙可能是很棒的C++程序员。C#可以学习,聪明不能。我更喜欢在面试中询问代码,而不是用特定语言呈现代码(例如:用任何语言实现 ArrayList 和 LinkedList)。
今年早些时候,当我寻找3名程序员,主要使用C#,Java,PL/SQL,Javascript和Delphi时,我寻找C/C++程序员,并没有失望。任何人都可以学习Java,不是每个人都有良好的结构,数据结构和对新的复杂问题的掌握。C++很难,所以它是一个很好的过滤器。如果我要求查找此 Java 代码中的错误,我会丢失它们。
顺便说一句,我是一名团队负责人,已经编程了 20 年,按时、按预算开发了数十个大型项目,我对问题 2 或 3 出了什么问题一无所知,对 C# 只有一时的熟悉,当然不是 Linq,不是我学不了......几分钟后我就想通了,但没想到刚毕业的毕业生会掌握它,问题 3 中的所有 LINQ 代码都是一种分散注意力,隐藏了真正的问题。
你认为这些问题对新手程序员来说太苛刻了吗?
是的,IMO 他们太苛刻了。
两个申请人都没有看到以下代码有什么问题。
-
虽然有很多"可能的问题",比如不检查空指针、强制转换等,但似乎没有任何"实际问题"。(例如:给定合理的输入,程序看起来实际上会运行)。
我猜新手程序员会为此挂断电话。 -
由于 linq 是相当新的,并且仍然没有被广泛使用,因此它将远远超出新手的头顶。
-
什么是
ESLinqDataContext
?如果人们不知道你的对象是什么或它的行为方式,他们怎么知道它是否被正确使用? -
评估代码的质量并讨论
只有真正学会从处理类似于你面前的代码的合理经验中挑选诸如无效强制转换异常之类的东西(更不用说能够判断和评论"代码质量"了)。
也许我误解了,但对我来说,"入门级"职位几乎根据定义没有对先前经验的期望,因此根据需要经验的标准对他们进行评分似乎不公平。
我不是 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 为假,则执行 foo。如果 lsvnotificationList.Items.Count == 0,则再次执行 foo。修改后的代码只会执行一次 foo。
你可以争辩说,BindlistviewNotification 可以执行多次而不会产生副作用,或者 IsPostBack 永远不会是假的,而 lsvnotificationList.Items.Count 同时等于 0,但这些都是语言依赖和实现依赖的问题,无法通过给定的代码片段解决。
此外,如果这是一个"应该"在面试中发现的错误,那么这根本不是语言不可知的。没有什么可以告诉我这应该是一个错误。
作为一个新手,我希望雇主更关心我的思维过程是什么,而不是答案是否"正确"。 我可以想出一些答案来回答这些问题,但它们可能不正确。 :)
所以话虽如此,我认为你可以回答这些问题,但你绝对应该对"正确"答案更加自由一些。
只要这些条件明确,我认为没有思想地得到一张白纸是一件坏事。 这意味着他们要么真的认为代码是完美的(我们知道这几乎从来都不是真的),要么太羞怯而无法分享他们的想法(这也是一件坏事)。
我不认为 1 和 2 太难,#3 需要对数据绑定和 LINQ 在 .NET 中的工作方式有很好的了解,所以对于入门级的人来说可能有些困难。我认为对于具有一些 .NET 经验的初级开发人员来说,这些都是相当不错的问题。
对于它的价值,我的笔记:
问题1:
- 使用整数作为布尔值
- 查找控件上没有空检查
- 过于冗长
我的修订版:
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;
- 添加空检查以查找控件调用。
- 切换到 TryParse 并添加默认 id 值。
- 添加了更好的错误处理
- 记录一些主要的架构问题,为什么要从前端查询数据库?这些 LINQ 查询也可以进行优化。 为什么不
- 检查列表项集合中的重复项,为什么不稍后通过单个提交对所有更新进行批处理?
所以你问了一个没有 c#、.net、asp.net 或 linq 知识的人?我不会期望纸上有什么?
我唯一的建议是确保你的测试问题实际编译。
我认为 FizzBuzz 类型问题的价值在于观察某人如何解决您的问题。
看着他们将解决方案加载到 IDE 中,编译它,通过调试器逐步执行代码,为明显的预期行为编写测试,然后重构代码使其更正确/更易于维护,这比知道他们可以阅读代码并理解它更有价值。
不知道 C#,花了我更长的时间,但我假设 #1 可以表示为
DMX设备。活动 =((复选框)项。FindControl("chkactive"))。已选中 == 真
在 #2 中,这两个条件可以连接为 A 或 B 语句吗?
如果这就是你要找的,那么不,这些并不太难。我认为 #1 是你可能只有在编程一段时间后才能学习的东西,但 #2 似乎更容易。您是否也在寻找它们来捕获空指针异常?
我认为前两个很好。 第三个对于研究生水平的面试来说可能有点复杂,但也许不是,这取决于他们以前是否做过任何 .net 编码。
它有 LINQ 语句,这是非常新的。 特别是因为许多大学/学院在教授最新技术方面有点落后。 所以我会说用 1 和 2 运行,要么简化 3,要么像其他人提到的那样对其进行大量注释
前两个似乎更像是一个测试,看看一个人是否可以逻辑地遵循并意识到有额外的代码。 我不相信入门级开发人员会理解"少即是多"。 但是,如果您解释了问题 1 的答案,而他们没有将该答案外推到 #2,我会担心。
问题 3 似乎是一个大泥浆类型的实现。 这几乎可以预料到是大学毕业的初级开发人员的风格。 我记得我在大学里的大多数教授/助教从未读过我的代码——他们只运行可执行文件,然后放入测试集。 我不希望新开发人员了解它的问题所在......
你期望从这次面试中得到什么?您的员工是否必须在没有调试器或其他东西的情况下调试代码?您是否正在雇用仅进行维护编程的人?
在我看来,这些问题对你对候选人的能力几乎没有启发。
如果您正在寻找维护程序员或测试人员,这是一个很好的问题。
但是,这不是检测优秀程序员的好测试。 一个好的程序员当然会通过这个测试,但许多不好的程序员也会通过。
如果你想要一个好的程序员,你需要定义一个只有优秀的程序员才能通过的测试。 一个好的程序员具有出色的解决问题的能力,并且知道如何在问题开始工作之前提出问题以进入问题的核心 - 节省他们和你的时间。
一个好的程序员可以用许多不同的语言编程,只有一点点的学习曲线,所以你的"代码"测试可以由伪代码组成。 告诉他们你希望他们解决问题,并让他们用伪代码编写解决方案 - 这意味着他们无法访问所有这些漂亮的库。 一个好的程序员知道库是如何工作的,并且可以在需要时重新创建它们。
所以......是的,你本质上是在问教科书知识问题——展示记忆和语言知识的项目,但不是解决问题所必需的技能。
-亚当
看到每个人都跳起来更改或修复代码很有趣。 问题针对"有效?会不会引起虫子? 答案:如果有足够的时间和金钱,确保每个人都可能更有效率。 Bug,请尽量避免投射和编写难以阅读的代码(代码应该是自文档的)。 如果它没有错误,它可能会在下一个初级程序员尝试更改它之后...... 此外,避免编写似乎依赖于方法/函数范围之外的状态的代码,即那些令人讨厌的全局变量。 如果我得到一些像这样的有见地的评论,那么将其用作创建一些良好对话的工具可能是合适的。但是,我认为存在一些更好的破冰者来确定一个人的批判性思维技能是否合适,以及他们是否适合团队的其他成员。 我不认为玩树桩程序员是很有效的。
问题 #1
boolean active = true;
问题 #2
if ((!IsPostBack) || (lsvnotificationList.Items.Count == 0))
问题#3:
完全重写并添加注释。读取 30 秒后,我仍然无法分辨代码试图做什么。
我不是 C# 程序员。 在 Q1 上,似乎有未声明的对象 dmxdevice 和 item,这让我感到困惑。 但是,代码的其余部分似乎确实存在很多混淆。 在 Q2 上,没有声明 lsvnotificationList,我不清楚为什么一个测试缩写为 !另一个带有 == 0 - 但测试似乎可以与 ||] 结合使用。 在第三季度,lsvnotificationList并没有再次不言而喻地声明。 对于其余部分,它似乎正在使用 LINQ 进行数据库查找。 我至少希望将其分解到一个更透明地验证隐藏字段 ID 的函数中。 但是如果你有其他想法,那么...我仍然不是 C# 程序员。
免责声明:我拥有 4 年的学位和一年的专业 Java 经验。
前两个问题非常简单,如果候选人没有看到更好的方法,我会怀疑这是因为他们在课堂上没有集中注意力;-)
到目前为止,对第二个问题的大多数答案都改变了函数行为。该函数很可能在原始代码中被计算两次,尽管我不能说这是否是函数的意图。副作用很重要。
我自己可能会单行第一个函数。
这些问题与语言无关,但它们与库无关,我认为这同样重要。如果你专门寻找.NET知识,很好,但是没有Google,我无法告诉你ESLinq.DataContext是什么,我对第三个问题的回答也相应受到影响。事实上,这对我来说几乎是不可理解的。
我认为你也必须小心你如何提出问题。前两种方法本身并没有什么错误。它们只是比应有的更冗长一点。
我只会把工作表交给他们,然后说:"你觉得这段代码怎么样?让它开放,这样如果他们想提出错误处理/日志记录/评论或其他事情,它就不会限制讨论。
粗略地看一眼就会发现,其余大部分代码都存在结构不佳和不必要的条件等。 这本身并没有什么"错误",特别是如果程序按预期运行。 也许你应该改变这个问题?
另一方面,铸造看起来根本没有正确完成,例如。(投掷)对象。方法() vs (cast)(对象.方法()) vs ((强制转换)对象)。方法()。 在第一种情况下,这不是一个与语言无关的问题 - 它取决于优先规则。
我不认为这很难,但这完全取决于你想测试什么。 IMO,聪明的候选人应该在尝试回答之前问很多关于程序功能和类结构的问题。 例如。 如果他们不问,他们怎么知道"item"是否是全局/成员变量? 他们怎么知道它是类型? 他们甚至知道它是否支持FindControl方法吗? FindControl 的返回类型如何?
不过,我不确定有多少大学教 Linq,所以也许你应该删除那部分。
没有人用代码回答#3。 这应该表明人们对此的看法。 通常叠花先遇到这些。
这是我的刺痛。 我不得不在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 绊倒了,通过简化代码,他们意外地改变了代码的行为。这应该告诉你很多关于你的问题的难度。
好的,所以在熬夜过了我的睡前阅读所有答案并评论其中的大部分之后......
一般的共识似乎是这些问题还不错,但是,特别是对于Q3,通过使用伪代码或其他一些技术来隐藏一些特定于语言的东西可以更好地服务。
我想现在我不会太重地权衡这些问题。
(当然,他们缺乏SQL知识仍然令人不安...如果只是因为他们的简历上都有SQL。:( )
我不得不说,我对这些问题的回答是,如果没有注释(或文档)来解释代码的目的是做什么,甚至没有理由查看代码。 代码完全按照它的作用执行。 如果你改变它来做其他事情,甚至改变它以防止引发异常,你可能会让它做一些意想不到的事情并破坏更大的程序。
这三个问题的问题在于没有意图。 如果修改代码,则假定您知道原始编码器的意图。 这种假设往往是错误的。
回答这个问题:是的,这对大多数初级程序员来说太难了,因为从来不教编写代码。
Okey 我不会回答我在这里看到的 C# 问题,您有足够的候选人在与您进行求职面试时会做得很好。
我确实认为这些测试不会让你很好地了解一个人的编程技能。看看乔尔的面试指南:
http://www.joelonsoftware.com/articles/fog0000000073.html
当谈到可能的候选人时,他谈到了两件事:他们是否聪明,他们是否完成了工作(现在这是一个强大的组合)。让你的候选人谈谈他们做过的项目或他们在家里玩的东西。了解他们是否对编程充满热情。有些经验当然很好,只是不要要求他们做技巧。
Q1 在item.FindControl()
行上也有一个潜在的 InvalidCastException。
我不认为 Q1 或 Q2 超出了太难的范畴,即使对于非 C# 用户也是如此。任何级别代码都应该能够看到您应该使用布尔值表示活动,并且只使用一个 if 语句。
Q3 虽然至少需要评论,正如其他人指出的那样。这不是基本代码,特别是如果你也使用它来定位非 C# 用户。
在问题 2 中,为了更好的模块化,我建议将 lsvnotificationList.Items 的计数作为参数传递:
public void Question2(bool IsPostBack, int listItemsCount)
{
if (!IsPostBack || listItemsCount == 0)
BindlistviewNotification();
}