初学者还是经验丰富? 如何聘请真正了解如何的iOS移动开发人员

移动开发是一个特殊的厨房,它有自己的细微差别。 这就是为什么要对iOS开发部门的候选人进行面试的原因。 今天,我们将告诉您如何聘用Acronis的移动开发人员,以及在面试中会发生什么好奇心,当申请人认为这足以记住一些聪明的话,然后“找出答案”。

图片

首先,从两年前开始,iOS的移动开发获得了自己的独特风格,这是由于Swift等语言的出现。 最活跃的开发人员立即赞赏一种新的现代语言,它具有良好的范例和强大的开发团队。 但它的主要优势是苹果将押宝Swift,蒂姆·库克(Tim Cook)公开发表的声明证实了这一点。 因此,在考虑Swift知识的细节的情况下进行访谈似乎是合乎逻辑的一步。

但是,并非所有公司都在采访中普遍询问有关Swift的问题。 在加入Acronis之前,我本人曾在多家公司接受采访,几乎没有人问过Swift。 对我来说,这很奇怪,因为很明显,移动开发正朝着这个方向发展。

也许问题在于,上一代的许多开发人员都“坐在” Objective-C上,并不想离开熟悉的范例。 但是该语言落后于现代开发方法,Apple并未开发它,它还具有许多过时的规则,例如将消息发送到nil对象和动态类型系统。 在编写代码和调试期间,很难考虑它们。 改用Swift,可以避免很多困难。

关于Swift的几句话


苹果在2014年推出了该语言,以抵消Objective-C的影响。 新手立即显示出一些优点。 例如,Swift不需要两个文件,出色的语言安全性,使用泛型的独特工作,完善的数据类型模型和方法分派模型。 由于简化和方便的语法,可以安全地将该语言称为更具可读性。

在Swift的开发过程中,称为Playground的特殊实验环境的可用性大有帮助,下面将在访谈中讨论其使用。

最后,由于开发速度比Objective-C和C ++快得多,因此新语言很有希望。 它可以更轻松地修复错误,并且一般而言,与Objective-C相比,Swift开发更便宜,更高效且更有希望。 因此,我们正在寻找具有这种语言“交流”经验的专家。

开发人员和模拟器


当然,您可以雇用大学毕业生或实习生,在实习过程中对他进行培训。 但是,如果您正在寻找已经有经验的专家,那么所声明的经验与真实知识之间的差异看起来很奇怪。 例如,申请人声称已经“在Swift上开发了三年”,但还不了解该语言的基础知识。 也许这是由于渴望获得一份高薪工作,因为今天对iOS开发人员的需求非常高。 为了淘汰此类候选人,我们进行了一些经过深思熟虑的采访,这些采访已经遇到了“专家”,他们:

  • 完全按照YouTube视频示例编写代码;
  • 从GitHub复制代码,完全没有任何更改;
  • 用电报给朋友写信,询问如何解决基本问题;
  • 任务条件宣布后,“上厕所”或“紧急呼叫”。

如果在面试中直接使用代码,则可以发现能力不足的事实。 在不同的公司中,习惯上在板上,一张纸上,一张纸上或只是用耳朵问问题。 但是最后,开发人员在计算机上编写了代码,为什么不看看他如何现场执行他的即时任务呢?

例如,我们的专家带着一台笔记本电脑,为申请人提供了在非常特殊的Swift语言环境中在Playground上开始创作的机会。 在Playground中,您可以简单地“按原样”运行代码,并查看其工作结果。 这很方便并且可以节省时间(毕竟,为技术面试最多分配2个小时)。 在C ++中,您需要创建一个项目,将其保存在某个地方,对其进行配置,而Playground则使您可以执行代码而不会带来其他麻烦。 因此,至少在Acronis中,Playground已证明自己是采访工具。

五圈...工作面试


为了弄清申请人是否可以在面试后立即开始工作,我们提出以下五个实际问题:

1.引用类型和值类型之间的差异


适用于iOS的移动开发人员都知道该语言具有不同类型的变量。 它们分为两种主要类型。 即,有些是通过引用传递的-引用类型(引用类型),而另一些是通过值传递的-值类型(值类型)。 在采访中,我们问(结构)结构和(类)类之间的区别是什么。 结构是值类型,而类是引用类型。 las,不是每个人都回答这样的问题,有些候选人甚至对“为什么一开始这么奇怪的问题”感兴趣? 但是,如果您考虑一下,这个问题一点也不奇怪,特别是如果您打算在Swift上进行开发。

在初始化和分配期间,引用类型实例开始引用内存中的同一区域,结果,它们之间共享相同的值;对于值类型,复制数据,并且对象开始引用不同的内存区域,他们彼此之间没有共同的意义。 严格来说,对于值类型,写时复制原理起作用。 也就是说,在尝试更改值之前,值类型的实例将引用相同的地址,并且第一个更改将被复制。 显然,开发人员必须对此有所了解。 对于类和结构,代码的行为可能完全不同。 但是仅仅知道差异是不够的。 第二层意识是编写代码的区别。 事实证明,如果您没有在Swift中进行编程的经验,那么在Playground中编写代码并证明使用引用类型和值类型的区别并不容易。 3名候选人中只有1名通过了此考试。

出于好奇,这些差异在WWDC上得到了很好的展示,并在文档博客中进行了详细讨论。

2.什么是面向协议的编程?


在编程中,没有接口是不可能的。 Apple在其语言中使用术语协议。 协议可以解决多重继承的问题。 面向协议的编程苹果几年前在与Swift举行的WWDC会议上向公众介绍了该语言对苹果的重要性。 例如,使用协议的一个重要指标是该语言对字段的访问级别不受保护。

可以理解,多态性应该使用协议而非继承来实现。 而且,尽管实际上面向协议的编程更可能用于市场营销,但针对此问题,我们希望程序员开始谈论协议的功能,并能够在Playground中创建协议。 本质上,描述协议需要三行。 mobile,在移动开发中,人们常常不了解协议的目的,甚至无法做到这一点。 我们正在等待一些简单的事情,例如:

protocol Developer { func readManual() var name: String { get } } 

此外,存在常规协议,并且存在适用于关联类型的通用协议。 而且,实际上,它们接近于C ++中的模板。 通用协议是抽象的特定事物,在常规编程中很少使用。 它们是编写内部库(Apple本身使用的)或需要使用高度抽象的库所必需的。 申请人知道这一点很好。 两环

3.处理内存


IOS拥有自己的内存系统,该系统使用引用计数。 Swift中有两种方法。 这些是手动参考计数(MRC)和自动参考计数(ARC)。 手动引用计数用于直接内存操作,但通常使用ARC。 尤其重要的是,开发人员必须了解强链接和弱链接之间的区别。 对于那些没有垃圾收集器的语言,这一点很重要。 这是一封有趣的电子邮件 ,说明了Swift为什么不使用Garbage Collector。

实际上,这里并没有那么复杂-您需要谈论引用计数器,当计数器达到0(零)时,对象将被删除,依此类推。 但同样,我们需要一个人在操场上树立榜样。 这里有一部分申请人有木僵病。 即使已经成功学习了关于强链接和弱链接的几个短语,在这个阶段,如果这个人没有正常的Swift编码实践,就会变得很明显。

 //  var slimer: Ghost? = Ghost(name: "Slimer") //   ,    weak var weakSlimer = slimer //   ,   let strongSlimer = slimer //    slimer = nil 

4.使用闭包


在Java中,C ++中有lambda,在Objective-C中有block,在许多语言中,都有对应于Swift中闭包概念的结构。 但是申请人通常无法解释如何处理闭包,因为为此您需要了解如何使用内存以及内部和外部变量的互连系统。 所以-您需要充分了解标准数据格式,内存管理和其他相关问题。 如果在代码中创建闭包对申请人而言不是特别困难:

 let completionHanlder: () -> Void = { print("Success") } 

例如,说什么类型(值或引用)是闭包,已经是一项相当艰巨的任务。 实际上,闭包是参考类型。 从这里,出现了[弱自我]的著名构造。

 let completionHanlder: () -> Void = { [weak self] in self?.close() } 

为了测试申请人的技能,我们在操场上准备了一个模板。 在下面,您可以看到一个在两个线程中变化不同的数组。 您需要回答这将在应用程序中产生什么影响。 在这种情况下,对过程的理解反映了使用变量并在不同对象之间传递变量的能力。

 //: Playground — noun: a place where people can play import Foundation import PlaygroundSupport let queue = DispatchQueue.global() var employees = ["Bill", "Bob", "Joe"] queue.async {   let count = employees.count   for index in 0 ..< count {       print("\(employees[index])")       Thread.sleep(forTimeInterval: 1)   } } queue.async {   Thread.sleep(forTimeInterval: 0.5)   print("remove")   employees.remove(at: 0) } PlaygroundPage.current.needsIndefiniteExecution = true 

这里有一个例子。

5.编写一个简单的应用程序


任何开发人员都应该能够启动一个项目。 为此,我们给出了一个简单的任务-开发一个iOS应用程序,该应用程序仅显示Acronis网站。 对于真正在Swift上做过一些事情的程序员,这样的任务将需要10到15分钟,这基本上是设置设置和检查的时间。

如果通过了这个阶段,任务将变得更加复杂,就像在生活中通常发生的那样:“产品经理到来,他们改变了条件,迫切需要改进”。 确实,这就是任何程序员的日常实践的构建方式。 有趣的是,人们如何根据新条件更改代码。 在我们的简单测试任务中,我们经历了多次迭代,例如:

  • 添加应用内导航
  • 在多个站点之间做出选择
  • 添加架构
  • 更抽象地写

通过交互地观察这些工作,您可以发现一个人如何使用文档,GitHub和其他资源。

当然,这与面试中提出的所有问题相去甚远,但是我们的候选人必须首先解决这些基本任务。

结论


交互式面试使您可以看到开发人员的真实行为,包括开发人员的软技能以及与经理沟通的能力。 并非所有来找我们的专家都通过了部分测试。

我们愿意合作 ,正在等待我们有才华的开发人员团队。

如果您想从事Acronis移动开发工作,建议您练习Swift编程。

同时,我们将准备一系列有关使用这种编程语言的经验的文章。

订阅我们的博客,这样您就不会错过任何内容。

比赛项目


源代码存储在Github上的应用程序在启动时崩溃。

任务:必须创建一个拉出请求并纠正跌倒的原因。

提出此请求并进行纠错的人将获得一个奖项-移动电源和具有1 TB云存储的Acronis True Image 2018年度许可证。

Source: https://habr.com/ru/post/zh-CN415655/


All Articles