程序员们,去面试吧

程序员们,去面试吧
图片取自频道“好战紫水晶»

我作为 Linux 系统程序员工作了大约 10 年。这些是内核模块(内核空间)、各种守护进程以及与用户空间(用户空间)中的硬件一起工作、各种引导加载程序(u-boot 等)、控制器固件等等。甚至有时会碰巧切断网页界面。但更常见的情况是,我不得不坐在烙铁旁与印刷电路板设计师互动。此类工作的问题之一是评估你的能力水平相当困难,因为你可能对一项任务非常了解,但你可能对另一项任务根本不了解。要了解该去哪里以及现在的潮流,唯一充分的方法就是去采访。

在这篇文章中我想总结一下我面试Linux系统程序员职位的经历,面试的具体情况,工作,以及如何通过与未来雇主的沟通来评估你的个人知识水平以及你不应该做的事情从中期待。

本文将包括一个有奖品的小型竞赛。

专业特点

在我工作的特定领域,系统程序员是一个完全的多面手:我必须既编写代码又调试硬件。通常需要自己焊接一些东西。有时,我对硬件的调整会被转移给开发人员。因此,要在这一领域工作,您需要在数字电路和编程领域拥有相当好的知识基础。因此,系统程序员职位的面试通常看起来像是寻找电子专家。

程序员们,去面试吧
系统程序员的典型工作站。

上图是我调试驱动程序时的典型工作场所。逻辑分析仪显示传输消息的正确性,示波器监视信号边沿的形状。此外,jtag 调试器未包含在框架中,当标准调试工具不再适用时,将使用该调试器。您需要能够使用所有这些设备。

通常情况下,自己重新焊接某些元件并纠正拓扑错误比将产品交给安装人员更快更容易。然后焊台也会出现在您的工作场所。

驱动和硬件层面开发的另一个特点是Google不帮忙。通常,您必须查找有关您的问题的信息,并且有三个链接,其中两个是您自己在某个论坛上提出的问题。或者更糟糕的是,当您遇到 5 年前在内核邮件列表上提出的同一个可怜人提出的问题但从未收到答案时。在这项工作中,除了硬件和软件设计上的错误之外,还经常遇到文档错误——这些可能是最严重和最令人不快的问题。有时寄存器的描述不正确,或者根本没有对它们的描述。此类问题只能通过科学地将随机数放入某些寄存器(一种逆向)来解决。经常会发生这样的情况:处理器包含某些功能,但除了您之外没有人实现此功能(特别是如果处理器是新的)。这意味着要带着耙子走过田地,其中 70% 是为儿童准备的。但当有文档时,即使有错误,这也已经是进步了。很多时候,根本没有任何文件,那就是当铁在燃烧时开始穿越雷区。是的,我也成功解决了此类问题。

采访

我的观点是,即使您热爱自己的工作并且不想改变它,您也应该至少每六个月去面试一次。面试可以让您了解您作为专家的水平。我相信最有价值的面试就是那些失败的面试。他们是最准确地表明您的知识瓶颈需要改进的人。

另一个有趣的特点是采访的质量。这是我的观察,并不真实,我承认我只是运气好。如果面试按照场景进行:

  • 向我们介绍你自己;
  • 我们有这样的任务;
  • 你喜欢?

如果在这次对话之后你们彼此喜欢,然后去工作,那么通常,公司和任务都会变得非常愉快和充足。如果面试就像经历十二圈地狱:第一次面试HR,然后面试一群程序员,然后面试主管,更多的作业等等,那么通常这些都是失败的组织,我没有在其中工作过很长一段时间。再次强调,这只是个人观察,但一般来说,过多的官僚主义和冗长的招聘流程表明,公司内部也发生着同样的流程。决策缓慢且低效。也有相反的情况,当面试地狱一圈圈的时候,公司却是伟大的,而当一巴掌打过去之后,公司却变成了一片沼泽,但这些都是罕见的。

如果您认为这样的场景:见面、介绍自己并被录用,只存在于小公司中,那么不存在。我在拥有数百名员工并在全球市场上占有一席之地的大型公司中看到了这一点。这是一种正常机制,特别是如果您拥有丰富的业绩记录并且有机会致电您以前的雇主并询问您的情况。

对我来说,当一家公司要求展示其项目和代码的示例时,这是一个很好的指标。申请人的培训水平立即显示。而且,对我来说,从选拔候选人的角度来看,这是比秀面试最有效的选拔方法。事实上,你可能会因为兴奋而在面试中失败,或者相反,因为肾上腺素的增加而失败。但在实际工作中,你无法应对真正的任务。我自己采访人的时候也遇到过这种情况。一位专家来了,表现出自己很优秀,我喜欢他,他也喜欢我们。我在一个最简单的问题上苦苦挣扎了一个月,结果另一位程序员在几天内就解决了它。我不得不和那个程序员分手。

我特别看重面试中的编程任务。还有那些必须在会议期间、在压力下和做作业时解决的问题。第一个显示您是否准备好在压力情况和紧急情况下快速准确地解决问题。第二个显示您的能力水平以及搜索信息和解决当前问题的能力。

我最有趣的工作是在我国的国防综合体。在工作过程中,我必须解决商业程序员从未梦想过的奇妙问题。超级计算机、设计路由器、各种节点战斗系统——这非常令人兴奋。当您在游行期间看到一个存储您的代码的综合体时,这真的很棒。奇怪的是,这类公司的面试通常都很简单,字面上来,喜欢,接受(可能是军方的具体情况,他们不喜欢说太多),都是叠加的。我在那里面临的挑战确实有趣且具有挑战性。事实证明,随着经验的积累,他们非常适合学习成为一名高素质的系统程序员。缺点也有,这还不算低工资。目前,国防综合体的工资相当不错,还有奖金和福利。一般来说,官僚作风很多,工作时间长,工作无休无止,工作压力很大。在某些情况下,不能排除保密性,这给出国旅行增加了一定的问题。当然,还有老板的暴政,唉,这种情况也会发生。尽管我与客户代表一起工作的经历非常愉快。这是三个不同的国防订单相关研究机构和企业的集体印象。

面试任务

为了避免误解,也为了不暴露我采访过的公司,我不会冒险透露他们的细节。但我很感激每一次采访,感谢人们花在我身上的时间,感谢有机会从外部审视自己。我只能说,这些任务是针对在不同国家设有代表处的大型国际公司的。

我会告诉你最有趣的事情:面试时会给出哪些任务。一般来说,系统程序员和微控制器程序员的空缺最常见的问题是位操作,以及所有可能的变化。因此,请在这方面做好充分准备。

第二个最两极分化的话题是路标,这真的应该让你大吃一惊。这样他们就会在半夜叫醒你,你就可以讲述并展示一切。

我从一些采访中偷来的问题在我的脑海里,我将在这里呈现它们,因为我发现它们很有趣。我故意不给出这些问题的答案,是为了读者可以在评论中自己回答这些问题,并在真正的采访时有一点粉。

问题 1

一、SI知识。以下条目的含义是什么:

const char * str;

char const * str;

const * char str;

char * const str;

const char const * str;

所有条目都正确吗?

二.为什么这个程序会抛出分段错误?

int main ()
{
       fprintf(0,"hellon");
       fork();
       return(0);
}

三.变聪明。

有一根一米长的棍子。十只蚂蚁随机落在她身上,朝不同的方向爬行。一只蚂蚁的移动速度是1m/s。如果一只蚂蚁遇到另一只蚂蚁,它会转身向相反的方向爬行。等待所有蚂蚁从棍子上掉下来最多需要多长时间?

接下来的面试对我来说是失败的,但我认为它对我的编程实践来说是最有用的。这显示了我的无能之深。在这次采访之前,我对这些问题都很熟悉,在我的实践中也经常出现,但不知何故我对它们不太重视,因此我对它们的理解也不是很好。因此,我这次考试耻辱地失败了。我很庆幸发生了这样的失败;它给我带来了最清醒的影响。您认为自己是一位很酷的专家,您了解电路设计、接口以及使用内核。然后你有了真正的问题,你就漂浮起来。那么让我们看看。

面试问题#2

硬件问题。

  • Linux 系统调用如何在 x86 的 ARM 处理器上以汇编语言排列。有什么不同?
  • 有哪些同步工具?哪些同步工具可以在中断上下文中使用,哪些不能,为什么?
  • i2c总线和spi总线有什么区别?
  • 为什么 i2c 总线上有终结器以及它们的值是什么?
  • RS-232 接口只能在两条线上工作:RX 和 TX 吗?这里我给出答案:结果是不好,在9600,但是可以!!!
  • 现在第二个问题:为什么?
  • 在多层板上布置信号线和电源的最佳方式是什么?为什么?层内有电源,还是层内有信号线? (问题通常纯粹是关于电路设计)。
  • 为什么差分线的走线到处都在一起?
  • RS-485 总线。通常这样的线上有终止符。然而,我们有一个星形电路,带有数量可变的插件模块。应采取哪些措施避免碰撞和干扰?
  • 什么是红树和二叉树?
  • 如何使用cmake?
  • 有关构建 yocto Linux 的问题。

本次采访的目的:

1. 编写一个反转函数 uint32_t 所有的位。 (在面试中使用bits很受欢迎,我推荐它)
2.

int32_t a = -200;
uint32_t b = 200;
return *(uint32_t) * (&a)) > b;

这个函数会返回什么? (纸上解决方案,无需计算机)

3.计算两个数的算术平均值的函数 int32_t.

4. 程序中的输出方式有哪些,包括?变成错误流。

第三个选择是最近的,如果还有这样的调查问卷,我不会感到惊讶,所以我不会透露公司,以免暴露他们......但总的来说我会举一个例子可能的问题,如果您认识到您的问题,那么我会问好:)。

面试问题#3

  1. 给出了一个树遍历代码的例子;需要说明这段代码做了什么,并指出错误。
  2. 编写 ls 实用程序的示例。使用最简单的选项“-l”。
  3. 举例说明如何进行静态和动态链接。有什么不同?
  4. RS-232 是如何工作的? RS-485 和 RS-232 有什么区别?从程序员的角度来看,RS-232 和 RS-485 有什么区别?
  5. USB 是如何工作的(从程序员的角度来看)?
  6. 将技术文本从俄语翻译成英语。

面试成功并不能保证工作成功

本章甚至可能不适合程序员(尽管也适合他们),而更适合 HR。最有能力的公司不会仔细查看面试结果。犯错误是很正常的;大多数情况下,他们会考察一个人如何知道如何解决问题和推理。

其中一个关键问题是,候选人在面试中成功解决了问题,表现出自己是一名优秀的专家,但在第一个真正的任务中却失败了。我不会撒谎,这也发生在我身上。我成功地走过了所有的地狱,解决了所有的测试任务,但在实际情况下,由于缺乏经验,这项工作太艰难了。上船并不是最困难的任务。最困难的是留在这家公司。

因此,我相信更多的公司会对候选人进行简单的面试并说:工作第一个月后,你是否适合我们就很清楚了。这是最合适的方法,是的,也许有点贵,但可以立即清楚谁是谁。

面试还有另一种选择:当你成功通过面试时,但根据面试结果,你了解到雇主完全不合格。如果有人向我承诺以个体企业家的身份提供高额收入,我会立即拒绝。这是运营组织逃税的一种形式,雇主的问题为什么要让我这个程序员担心呢?另一种选择是各种政府机构。我去面试了,结果给了我不错的薪水,但是他们说以前的程序员辞职了,生病了,死了,因为工作量大而暴饮暴食,而你的工作日是早上8点开始。从这样的地方他也跑得鞋跟闪闪发光。是的,人力资源部,请注意,如果工作日必须一大早开始,程序员就准备好拒绝即使是最美味的工作。

最后我会给出一个优秀的程序员选拔视频,本文开头给出了该视频的截图。我也不止一次接受过这样的采访。如果你在提问阶段看到暴政,那么尊重自己,起身,拿走你的东西然后离开——这很正常。如果HR和经理在面试时以你为代价来维护自己的利益,这表明这家公司有毒,你不应该在那里工作,除非你喜欢不合格的老板。

发现

程序员们,去面试吧!并始终努力升职。假设你拿到了N块钱,那么去面试至少需要N*1,2,或者更好的是N*1,5。即使您不立即接受这个职位空缺,您也会了解这个水平的薪酬需要什么。
我的观察表明,良好的英语知识、足够丰富的行业经验和自信决定。后者是主要品质,生活中随处可见。一般来说,一个更自信的候选人在面试中可以比一个优秀但更害羞和积极主动的候选人表现得更好,即使错误更多。祝你面试顺利!

P/S 竞赛

如果您有 HR 给您带来的有趣问题示例,欢迎在评论中留言。我们准备了一场小型竞赛 - 条件很简单:你写下你在采访中遇到的最不寻常的任务,读者对其进行评估(加号),一周后我们总结结果并用有趣的好东西奖励获胜者。

程序员们,去面试吧

程序员们,去面试吧

来源: habr.com

添加评论