Christina是一名高级QA工程师,在测试自动化方面具有专业知识, test management, 以及对网络和移动应用程序的手动测试. She has created test automation frameworks from the ground up using Selenium WebDriver in several projects as well as automating API testing using REST-assured and Postman. 在私营和公共部门都有工作经验, 克里斯蒂娜曾与大型, medium-size, 小型创业公司.
Muhammad is a senior software engineer with several years of experience in industries ranging from the public education sector (WSU), 私营医疗保健公司(Meridian), 汽车行业的财富500强上市公司(通用汽车 & AAM). Throughout his career, 他用HTML/CSS设计网页应用, 使用JavaScript框架(Angular/Ionic)开发客户端应用, 并使用Java和c#开发健壮的服务器端应用程序.
Bogdan是一名软件工程师,过去几年一直在游戏开发行业工作. 他的职业生涯开始于c++(前四年),然后转向Unity和c#(过去三年)。. Bogdan has worked in both corporate and startup environments and can quickly switch his code to other languages (he has experience with C, Java, JavaScript, PHP, Python, and Bash/Batch).
In 2005, 托马索的职业生涯始于软件工程师,然后在2011年跨入移动开发领域, 将两个世界连接在一起. 加入企业和敏捷方法将他的职业生涯推向了下一个阶段——tdd和干净的代码让他大吃一惊! Since 2015, Tommaso曾在专题小组工作过, 照顾每一个发展方面, 从后端到前端的持续交付流程.
真正的iOS专业知识远不止编码知识. 经验丰富的iOS开发者将对iOS平台有透彻的了解, its idiosyncrasies, 以及各种可用的实现选项的相对优点和缺陷. This guide offers a sampling of effective questions to help evaluate the breadth and depth of a candidate's mastery of the iOS platform.
我们使用Toptal聘请了一位具有丰富的Amazon Web Services经验的开发人员. 我们面试了四位候选人,其中一位非常符合我们的要求. 这个过程迅速而有效.
Abner Guzmán Rivera,首席技术官和首席科学家
Photo Kharma
Sergio是一个很棒的开发者. 一流,反应迅速,工作效率高.
Dennis Baldwin,首席技术专家和联合创始人
PriceBlink
和Marcin一起工作是一种乐趣. He is competent, professional, flexible, 并且非常迅速地理解需要什么以及如何实现它.
André Fischer, CTO
POSTIFY
我们需要一位能立即开始我们项目的专业工程师. 西马纳斯的工作超出了我们的预期. Not having to interview and chase down an expert developer was an excellent time-saver and made everyone feel more comfortable with our choice to switch platforms to utilize a more robust language. Toptal使这一过程变得简单方便. Toptal现在是我们寻求专家级帮助的首选之地.
Toptal为快速发展和规模化的企业提供不妥协的解决方案. Every engineer we've contracted through Toptal has quickly integrated into our team and held their work to the highest standard of quality while maintaining blazing development speed.
Greg Kimball,联合创始人
nifti.com
如何通过Toptal招聘iOS开发者
1
与我们的行业专家交谈
Toptal的工程总监将与您一起了解您的目标, technical needs, and team dynamics.
At Toptal, 我们会对iOS开发者进行全面筛选,确保为你提供最优秀的人才. Of the more than 200,每年有5000人申请加入Toptal网络, 只有不到3%的人能达标. 你将与工程专家(而不是一般的招聘人员或人力资源代表)一起了解你的目标, technical needs, and team dynamics. 最终的结果是:经过专家审查的人才从我们的网络,定制匹配,以满足您的业务需求.
我能否在48小时内通过Toptal雇佣iOS开发者?
取决于可用性和进度, 你可以在注册后48小时内开始与iOS开发者合作.
Toptal iOS开发者的无风险试用期是多长?
我们确保你和你的iOS开发者之间的每一次合作都有长达两周的试用期. 这意味着你有时间确认订婚是否成功. 如果你对结果完全满意, 我们会给你开时间单的,你愿意多久我们就多久. 如果您不完全满意,我们不会向您收费. From there, we can either part ways, 或者我们可以为您提供另一位可能更合适的专家,我们将与他开始第二轮谈判, no-risk trial.
Share
如何聘请优秀的iOS开发者
The population of iOS app developers has grown significantly in the years since the iPhone was released for 3rd party development in 2008. 目前,App Store上有超过100万款iOS手机应用可供下载, 由不断扩大的全球开发人员社区提供.
对于那些想要雇佣一名专门的iOS开发者的人, 这种新出现的人气既是一种祝福,也是一种诅咒. 虽然它使iOS程序员比以往任何时候都更容易找到, it also makes it that much more difficult to sort through the many available candidates to locate those who are really iPhone app development experts.
部分挑战在于,真正的专业知识远远超出了编码知识. 它需要了解实现解决方案所存在的各种选项, 以及这些不同的选择在生产力方面带来的权衡, scalability, performance, and maintainability.
With that in mind, this article offers a sampling of questions that can be used to evaluate the depth and breadth of a candidate’s overall iOS expertise.
With regard to coding, 本招聘指南试图尽可能不涉及语言, 同时也满足了大多数iOS和iPhone开发者社区的需求.e., 那些用Objective-C编写iOS应用程序的人,或者那些正处于采用Swift和Cocoa Touch不同阶段的人). 然而,重要的是要认识到iOS应用程序也可以用Ruby, Python, c# /编写.NET, Lua, Pascal, 甚至使用抽象库,让你用web技术编写iOS应用程序. That said, 因为iOS开发框架基本上是用Objective-C编写的, 做iOS开发需要一些Objective-C概念的基本知识,因此在本指南中进行讨论.
需要注意的是:这些示例问题只是作为一个指南. 并不是每一个值得雇佣的“A”候选人都能正确回答所有问题, 回答所有问题也不能保证成为A级考生. Rather, 这些问题是有效招聘过程的重要组成部分, as described in our post 寻找少数精英. 说到底,招聘既是一门科学,也是一门艺术.
评估基金会
有一些iOS编程的基础知识(尤其是Objective-C)是求职者应该熟悉的. Here are some examples.
问:描述一下Objective-C中方法和消息的使用. 讨论这种方法的一些优点和缺点.
Objective-C中的方法与类相关联. Objective-C有实例方法需要(用面向对象的说法)一个类的实例, 类方法可以用一个类调用(类似于Java中的静态方法的概念), for example).
在Cocoa工具链的早期版本中,您还可以调用编译器使用的方法, at compile time, 无法确定的存在. 虽然这听起来像是一个强大的功能, 它更常见的是一个恼人的调试场景的来源.
这里需要注意的是,除了用“奇怪的”方括号发送消息外, to the uninformed eye, Objective-C appears 有一个外部参数名称的概念(一个从Swift借来的术语),但事实并非如此. 在上面的例子中,方法被调用 must have forDuration: 加上一个伴随的参数 must 在方法调用中处于相同的位置.
A selector 该机制是否用于为对象选择要执行的方法, 或在编译源代码时替换名称的唯一标识符. 选择器的作用就像一个动态函数指针,指向类方法的实现.
例如,假设您有一个方法的选择器 run, and three classes (Dog, Athlete, and ComputerSimulation),每个实现一个方法 run. 选择器可以与每个类的实例一起使用,以调用其run方法, 尽管每种方法的实现可能非常不同.
问:如何在运行时动态检查一个类是否支持一个可以响应特定消息的方法?
The respondsToSelector: method returns a Boolean value that indicates whether the receiver implements or inherits a method that can respond to a specified message.
The ability to check dynamically at runtime if a class supports a method can be particularly useful with delegates (see the next question in this guide) that can have optional methods a developer can choose to implement or not. 一个常见的模式是使用 respondsToSelector: 查看委托对象在发送消息之前是否实现了可选方法. For example:
As noted in 苹果的iOS文档但是,您不能测试对象是否 inherits 一个方法(来自它的父类) respondsToSelector: to the object using the super keyword. Sending respondsToSelector: to super 等于把它发送到 self. 相反,你应该使用 instancesRespondToSelector: 方法,例如:
委托是指一个对象依赖于另一个对象来提供一些定义良好的功能, state information, data, or events. As stated in 苹果的Cocoa开发者指南, 委托的主要价值在于它允许你在一个中心对象中轻松地定制多个对象的行为。.
授权的一个很好的例子是 UITableView 对象,该对象通常在屏幕上呈现表时使用. The UITableView 使用两个不同的委托:
UITableViewDelegate:如果用户有,则调用, for example, selected a cell, 或者确定一行的高应该是多少.
UITableDataSource:用于检索与如何呈现表中的每个单元格有关的信息, how many rows there are, 如果行可以编辑或移动, and so on.
问:Objective-C中的类别是什么?它们与子类有什么不同?
类别是扩展现有类的一种方式,是使用子类的另一种选择. The main distinction between subclassing and categories is that a category adds functionality to an existing class itself which is then available anywhere in your code that uses that class or its subclasses. 相反,子类化会创建一个具有添加(或修改)功能的新类. 然后必须使用这个新的子类, 而不是原始类或它的任何子类, 来访问此扩展或修订的功能.
For example, Objective-C中常见的字符串对象是NSString它有一个可变子类NSMutableString. 当你使用类别来扩展NSString类, 你代码中的每个NSString和NSMutableString对象都会支持这些新方法. 这些新方法可以在任何导入类别头文件的类中的任何NSString或NSMutableString上被调用.
类别的另一个限制是它不能为类定义新的实例变量. However, an experienced developer will be aware that you can define new state objects associated with the class using Objective-C runtime methods, 哪个为类别提供了一种存储状态更改的方法.
问:描述一下Cocoa中的错误处理.
大多数错误在Cocoa中通过 NSError. 两种比较常见的方法如下:
Pass a blank NSError 对象转换为方法和, 当方法完成时, 检查该对象是否仍然为空或包含错误. (更精确地说,传递一个指向 NSError pointer, or NSError ** in Objective-C parlance.)
将一个NSError对象传递给某个失败委托方法或回调.
NSError 对象具有错误域、错误代码和用于附加信息的用户信息字典. 这些附加信息可能包括, for example, 本地化的描述和恢复建议, 之后的代码可以把它显示给用户.
In addition to NSErroriOS开发也是如此 NSException. 与其他语言中的异常不同, NSException 仅用于编程错误. Cocoa框架通常不是异常安全的, 因此,如果您生成(或调用生成)异常的代码, 在使用try/catch时应尽可能靠近发生异常的地方. In practice, NSException 在iOS代码库中很少使用.
问:常见的原因是什么 exc_bad_access 错误以及如何调试它们?
exc_bad_access errors are a common occurrence that can frustrate beginner iOS developers due to the lack of useful debugging information that they provide. 当试图访问从未初始化或已经释放的对象时,通常会发生这种情况. 这些错误也可能是由于向消息传递了一个不打算接收的参数而导致的.g., passing in an NSInteger when an NSString is expected).
请注意,在某些情况下,编译器将提供 warning that, if heeded, 是否可以提醒开发人员注意问题,以便在发生任何运行时错误之前解决问题. 但如果忽视这些警告, exc_bad_access errors may occur. Here, for example, 试图使用整数变量格式化字符串的错误代码:
[NSString stringWithFormat:@"This is %@", 123];
The %@ 在字符串格式规范中表示一个对象, rather than an integer, 是预期的(整数将用 %d). 因此,该语句将导致编译器警告,如果忽略它,将导致 exc_bad_access error at runtime.
But not all causes of exc_bad_access 错误将被编译器识别.
A common cause of exc_bad_access 编译器无法检测到的错误正在试图访问已释放的对象. In such cases, enabling NSZombies 在Xcode中是一种有效的调试技术. Enabling NSZombies 使通常会被释放的对象以“僵尸”的形式存活。. After enabling NSZombies, you can then follow what is happening in your code and receive a message when the application tries to access an object that has been released, 从而识别代码中的问题. 但要注意的是:一定要记住 disableNSZombies 在将应用提交到app Store之前. When NSZombies is enabled, 没有对象被释放,你将不断地泄漏内存,直到你的应用程序最终由于内存警告而被杀死.
Digging Deeper
如前所述,真正的iOS专业知识远不止编码知识. Highly experienced iPhone application developers will have a thorough understanding of what’s going on “under the hood” on the iOS platform. 他们也将很清楚现有的各种执行办法, 包括这些不同的选择在生产力方面带来的权衡, scalability, performance, and maintainability. 接下来的问题有助于评估候选人在这方面的专业知识.
问:在Objective-C中比较和对比MRR和ARC的内存管理方法.
object - c通过使用a来跟踪哪些对象正在使用或未使用 retain count. When an object is in use by another object it’s retain count goes up; when it is not being used by any objects, 它的保留计数恢复为零.
当iPhone刚问世的时候, 流畅的滚动是积极用户体验的关键之一. However, 新手开发人员可能会犯许多错误,导致滚动时出现延迟. Examples include:
没有正确使用重用标识符. The default behavior when a table is scrolled is that table cells that go offscreen are deallocated and new cells are created for the new content that is shown. 当您使用重用标识符时, 当单元格离开屏幕时,它不会被释放,而是被缓存以供重用. 如果要出现具有相同重用标识符的新单元格, 使用缓存的单元,并且避免了分配和布局一个全新单元的昂贵操作. 相反,缓存单元格必须重新配置以显示新内容, 例如更新显示的文本和图像.
同步加载网页内容. 如果加载是同步完成的, 当数据加载时,它会使主线程停止运行, 在滚动时,哪个会导致明显的延迟. 当下载图像以在表格单元格中显示时,这是一个特别常见的问题. 这里的解决方案是使用占位符值或图像,并在后台异步加载数据. Once the data is loaded, 然后可以向主线程发送消息以更新相应的单元格.
在设置要显示的单元格时应用昂贵的操作. Expensive operations, 例如将高分辨率图像转换为缩略图,或对图像应用复杂的照片滤镜或转换, 是否会严重降低显示性能. 如果您只需要缩略图大小的图像,请在本地存储较小的图像. 同样,如果可能的话,提前对图像应用任何复杂的变换. Alternatively, perform the necessary operations on the image off the main thread and then refresh the cell once the image is ready for display.
过于复杂的视图层次结构. 虽然你可以使用各种uiview来创建自定义单元格, 如果过度使用或过于复杂,这可能会降低性能. 尽管随着支持iOS设备的速度越来越快,这已经不再是一个问题, 在某些设备和场景中,它仍然会影响滚动性能. Although tedious, 这个问题可以通过实现您自己绘制单元格的内容来解决.e.,替换uilabel, UIImages等.,用一个UIView,然后在那个视图中实现你自己的绘图). 如果操作得当,可以显著提高渲染单元格时的性能.
问:图解核心数据栈.
Core Data 苹果的模型层、持久对象存储和对象图管理器. 您可能会想调用Core Data Apple的对象关系映射器, 但它真的不止于此.
下面是核心数据栈的示意图.
Note: 很少有开发者能够从内存中映射出整个核心数据栈. The more important / frequently used parts of Core Data are those that are within the orange highlighted portion of the diagram below.
问:Core Data线程安全吗? 如何在应用中处理这个问题?
Core Data is not thread safe. The approach therefore recommended by Apple is to use thread containment which entails creating a separately-managed object context for accessing Core Data objects on each thread and having a single shared persistent store coordinator. 如果您需要更大的并发性, 您还可以拥有单独的持久存储协调器, 尽管这带来了额外的复杂性和内存使用的增加.
在iOS 5之前,开发者需要手动管理线程. However, the release of iOS 5 added new methods to the managed object context to eliminate the need for manual thread management; instead you can safely access Core Data objects through a block of code passed to the performBlock: or performBlockAndWait: methods.
Keep in mind, though, 对核心数据对象的更改不一定会立即传播到其他线程. In the standard case, Core Data objects that are loaded into memory are not updated on a different thread until those objects are fetched again from persistent storage. 为了使托管对象上下文能够立即接收来自另一个线程上的核心数据对象的更改, 它需要观察 NSManagedObjectContextDidSaveNotification. 发生此通知后,对象可以使用 mergeChangesFromContextDidSaveNotification: method.
dispatch_group_async:您可以使用。创建一组分派任务 dispatch_group_create() and dispatch_group_async(). 您甚至可以等待队列中的所有任务完成 dispatch_group_wait().
Bonus Section: Swift
Swift 是苹果公司推出的一种新的编程语言,被称为“没有C的Objective-C”。. Swift可以与Objective-C并行工作, 提供许多改进,使开发人员能够在更短的时间内创建更稳定、性能更好的应用程序. 总的来说,这是自iOS SDK首次发布以来iOS开发的最大变化. 2014年在苹果的WWDC上发布, 并在2014年9月发布iOS 8后投入生产使用, Swift还将兼容iOS 7和OS X Mavericks.
Apple框架在Swift中也以同样的方式使用, 所以一个有经验的iOS开发人员能够将他或她的大部分知识转移到编写Swift代码上. That said, there are several issues an experienced iOS developer should be aware of regarding Swift and its interoperability with Objective-C.
问:在同一个项目中,Swift和Objective-C代码如何一起使用? 在这方面有哪些限制? Provide an example.
However, 这种桥接只能在Objective-C到Swift中完美地工作(反之亦然)。, 因此,利用Swift新特性的代码将无法在Objective-C文件中访问. 这方面的例子包括泛型, tuples, 和Swift中定义的结构, 这在Objective-C中是没有对应的. Unfortunately, this can make it difficult or impossible to utilize some of the exciting third-party libraries that are being built in Swift with an existing Objective-C code base.
Q:比较Objective-C和Swift中的方法调用和消息. Provide an example.
而Objective-C使用独特的括号语法来调用对象上的方法, Swift使用更传统的点符号.
So, a message like [myUser allowAuthorizationTo: secretChamber forDuration: oneHour] 在Objective-C中变成 myUser.allowAuthorizationTo(secretChamber, forDuration: oneHour) in Swift.
随着一种全新的编程语言(Swift)的发布,iOS应用开发领域正在发生巨变。, it has become more important than ever to find elite iPad and iPhone app developers who have mastery of the application development platform and can transition between these two languages. While finding these experts for your development team on a full-time or part-time basis is always a challenge and no brief guide can cover the topic entirely, we hope that the questions in this post can provide a starting point for identifying developers with a solid mastery of the mobile app development environment.