Новичок или опытный? Как нанять мобильного разработчика под iOS, который что-то действительно умеет

в 10:02, , рубрики: acronis, iOS, swift, Блог компании Acronis, Inc, разработка, разработка мобильных приложений, разработка под iOS

Мобильная разработка — это особая кухня, и в ней есть свои нюансы. Именно поэтому собеседования с кандидатами в отдел разработки под iOS должны проходить с определенным уклоном. Сегодня мы расскажем, как проходит прием в штат мобильных разработчиков Acronis, и какие курьезы бывают на собеседованиях, когда соискатель считает, что достаточно запомнить несколько умных слов, а потом «разберемся на месте».

image

Начнем с того, что буквально два года назад мобильная разработка под iOS приобрела свой неповторимый вкус, и это связано с появлением такого языка как Swift. Новый и современный язык с хорошей парадигмой, а также с очень сильной командой разработчиков сразу был оценен наиболее инициативными разработчиками. Но главный его плюс заключается в том, что именно на Swift будет делать ставку Apple, и это подтверждают утверждения Тима Кука, сделанные им публично. Поэтому проводить собеседование с учетом специфики знания Swift кажется логичным шагом.

Тем не менее, далеко не во всех компаниях вообще задают вопросы про Swift на собеседованиях. До прихода в Acronis я сам проходил собеседования в разных компаниях, и про Swift не спрашивал практически никто. Мне это показалось очень странным, так как, очевидно, мобильная разработка движется именно в этом направлении.

Возможно, проблема в том, что многие разработчики прошлого поколения «сидят» на Objective-C и не хотят уходить от знакомых парадигм. Но данный язык отстал от современных методов разработки, Apple его не развивает, а также он отличается наличием большого количества устаревших правил, таких как отсылка сообщений nil-объектам и динамическая система типов. Их сложно учитывать при написании кода и во время отладки. С переходом на Swift можно было бы избежать многих сложностей.

Несколько слов о Swift

Apple представила этот язык в 2014 году, как противовес Objective-C. У новичка обнаружилось сразу несколько плюсов. Например, Swift не требует наличия двух файлов, отлично реализована безопасность языка, уникальная работа с дженериками, проработанная модель типов данных и method dispatch. Этот язык можно смело назвать более читаемым за счет упрощенного и удобного синтаксиса.
 
В процессе разработки на Swift очень помогает наличие специальной среды для экспериментов под названием Playground, о пользе которой на собеседованиях мы расскажем чуть ниже.
 
Наконец, новый язык перспективен потому, что скорость разработки значительно выше, чем на Objective-C и C++. Он позволяет проще устранять баги и, вообще, разработка на Swift оказывается дешевле, эффективнее и перспективнее, чем на Objective-C. Поэтому сознательно ищем специалистов, которые имеют опыт «общения» на этом языке.

Разработчики и имитаторы

Конечно, можно нанять на работу выпускника вуза или даже стажера, обучив его в процессе прохождения практики. Но если вы ищете уже имеющего опыт специалиста, очень странным выглядит несоответствие заявленного опыта и реальных знаний. Например, соискатель утверждает, что «разрабатывал на Swift три года», и при этом не знает основ языка. Наверное, это объясняется желанием получить высокооплачиваемую работу, ведь сегодня спрос на разработчиков под iOS достаточно высок. Чтобы отсеять таких кандидатов мы проводим специально продуманные интервью, на которых уже попадались «специалисты», которые:

  • пишут код в точности по видео-примерам с YouTube;
  • копируют код с GitHub вообще без изменений;
  • пишут другу в Telegram и спрашивают, как решить элементарную задачу;
  • «выходят в туалет» или «срочно позвонить» после того, как объявлены условия задачи.

Факт недостаточной компетенции можно обнаружить, если использовать написание кода непосредственно во время интервью. В разных компаниях принято задавать вопросы с записями на доске, на листочке, на обрубке бумаге, или просто на слух. Но ведь в конечном счете разработчик пишет код на компьютере, и почему бы не посмотреть, как он выполняет свои непосредственные задачи вживую?

Например, наш специалист берет ноутбук и предлагает соискателю начать творить в Playground — в той самой специальной среде языка Swift. В Playground можно просто запустить код «как есть» и посмотреть на результаты его работы. Это удобно, и экономит время (ведь на техническое интервью выделяется максимум часа 2). Тогда как на С++ нужно создать проект, куда-то его сохранить, настроить, Playground позволяет исполнить код без дополнительных заморочек. Поэтому Playground прекрасно зарекомендовал себя как инструмент для собеседования, по крайней мере в Acronis.

Пять кругов…собеседования

Чтобы выяснить, может ли соискатель приступить к работе сразу после собеседования, мы задаем следующие пять практических вопросов:

1. Различия между reference type и value type

Мобильные разработчики под iOS прекрасно знают, что в языке есть разные типы переменных. Они делятся на два основных вида. А именно, одни передаются по ссылке — reference type (ссылочный тип), а другие — по значению — value type (тип значений). На интервью мы спрашиваем, в чем разница между (struct) структурой и (class) классом. Структура является value type, а класс — reference type. Увы, на такой вопрос отвечают далеко не все, а некоторая часть кандидатов даже интересуется, «почему такой странный вопрос в самом начале?». Но если задуматься, вопрос-то совсем не странный, особенно если вы планируете разрабатывать на Swift.

Экземпляры reference type при инициализации и присвоении начинают ссылаться на одну и ту же область в памяти и, как следствие, делят одно и то же значение между собой, а в случае с value type происходит копирование данных, и объекты начинают ссылаться на разные области памяти, и значения между собой они не делят. Строго говоря, в случае с value type работает принцип copy-on-write. То есть, до момента попытки изменения значения экземпляры value type будут ссылаться на один и тот же адрес, а при первом же изменении произойдёт копирование. Очевидно, что понимание этого необходимо разработчику. Код может вести себя абсолютно различно для классов и структур. Но просто знать отличия — мало. Второй уровень осознанности — разница в написании кода. Оказывается, что написать в Playground и продемонстрировать отличия в работе с reference type и value type не так-то просто, если вы не имели опыта программирования в Swift. У нас только 1 из 3 кандидатов проходит этот тест.

Для любопытствующих, различия хорошо были показаны на конференции WWDC, а также подробно рассмотрены в документации и блоге.

2. Что такое Protocol Oriented Programming?

В программировании невозможно обойтись без интерфейсов. Apple в своих языках использует термин protocol. Протоколы позволяют решить проблему множественного наследования. Protocol Oriented Programming Apple представила общественности несколько лет назад на конференции WWDC вместе со Swift, сделав упор на их важности для языка. Например, важным показателем для использования протоколов является тот факт, что в языке нет protected уровень доступа к полям.

Подразумевается, что полиформизм должен достигаться с использованием протоколов, а не наследования. И хотя на самом деле Protocol Oriented Programming — это скорее маркетинг, в ответе на такой вопрос мы ждем, что программист начнет рассказывать об особенностях протоколов и сможет создать протокол в Playground. В сущности, чтобы описать протокол нужно три строчки. Увы, в мобильной разработке люди часто не понимают назначения протоколов, и не могут даже этого. А мы ждем чего-то простого, например:

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

К тому же бывают обычные протоколы, а бывают generic-протоколы, которые работают с ассоциативными типами (Associated Type). И, по сути, являются близкими к шаблонам (templates) в C++. Generic-протоколы представляют собой абстрактные и специфичные вещи, которые очень редко применяются в обычном программировании. Они нужны для написания внутренних библиотек (и именно для этого используется самой Apple) или библиотек, где нужно использовать высокую степень абстракции. Хорошо если соискатель знает и об этом. Раз ссылка и два.

3. Работа с памятью

В iOS своя система работы с памятью, в которой используется подсчёт ссылок. Есть два подхода в Swift. Это ручной подсчёт ссылок (Manual Reference Counting, MRC) и автоматический подсчёт ссылок (Automatic Reference Counting, ARC). Manual Reference Counting используется при прямой работе с памятью, но обычно всё же используется ARC. В частности, разработчику важно понимать, чем отличаются сильные ссылки (strong) от слабых (weak). Это важный момент для тех языков, где нет сборщика мусора (Garbage Collector). Вот интересное письмо на тему, почему в Swift не используется Garbage Collector.

На самом деле тут все не так сложно — нужно рассказать про счетчик ссылок, о том, что объект удаляется, когда значение счетчика достигает 0 (нуля), и так далее. Но нам опять же нужно, чтобы человек показал пример в Playground. И тут у части соискателей возникает ступор. Даже если пара фраз о сильных и слабых ссылках была успешно выучена, на данном этапе становится очевидно, если у человека не было нормальной практики кодинга на Swift.

// Инициализировать
var slimer: Ghost? = Ghost(name: "Slimer")
// Создать слабую ссылку, не увеличивая счётчик
weak var weakSlimer = slimer
// Создать сильную ссылку, увеличивая счётчик
let strongSlimer = slimer
// Уменьшить счётчик ссылок
slimer = nil

4. Работа с замыканиями

В Java, С++ есть лямбды, в Objective-C есть блоки, во многих языках есть свои конструкции, соответствующие понятию замыканий (closure) в Swift. Но соискатели часто не могут объяснить, как обращаться с замыканием, ведь для этого нужно понимать, как работать с памятью и системой взаимосвязей внутренних и внешних переменных. А значит — нужно хорошо знать стандартные форматы данных, управление памятью и прочие связанные моменты. Если создать замыкание в коде не представляет для соискателя особой сложности:

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

То, например, сказать, каким типом — value или reference — является замыкание, уже достаточно сложная задача. На деле замыкание — это reference type. И именно отсюда появляются известные конструкции [weak self] in.

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

Чтобы проверить умения соискателей, мы заготовили шаблон в Playground. Ниже вы можете видеть массив, который изменяется по-разному в двух потоках. И нужно ответить, какой эффект это создаст в приложении. Понимание процесса в данном случае отражает умение работать с переменными и передавать их между разными объектами.

//: 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 минут, которые в основном уходят на выставление настроек и проверку.

Если этот этап пройден, происходит усложнение задачи, как обычно это бывает в жизни: «приходит product-manager, который меняет условия и срочно требует доработки». Ведь именно так строится ежедневная практика любого программиста. Интересно посмотреть, как человек меняет код согласно новым условиям. В нашем простом тестовом задании мы проходим несколько итераций, например:

  • Добавить навигацию в приложении
  • Сделать выбор между несколькими сайтам
  • Добавить архитектуру
  • Написать более абстрактно

Наблюдая за такой работой в интерактивном режиме, можно узнать, как человек пользуется документацией, GitHub и другими ресурсами.

Безусловно, это далеко не все вопросы, которые задаются на собеседовании, но наши кандидаты должны справиться, в первую очередь, с решением этих базовых задач.

Заключение

Интерактивное собеседование позволяет увидеть реальное поведение разработчика, включая его soft-skills и умение общаться с менеджерами. И далеко не все специалисты, которые приходят к нам, проходят даже часть испытаний.

Мы открыты к сотрудничеству и ждем в нашу команду талантливых разработчиков.

Если вы хотите работать в мобильной разработке Acronis, рекомендую вам попрактиковаться с программированием на Swift.

А мы, тем временем, подготовим серию постов о своем опыте работы с этим языком программирования.

Подписывайтесь на наш блог, чтобы ничего не пропустить.

Конкурс

Приложение, исходники которого хранятся на Github, падает при запуске.

Задача: необходимо создать pull request с исправлением причины падения.

Первый, кто сделает этот запрос с исправлением ошибки, получит приз — Power Bank и годовую лицензию Acronis True Image 2018 с 1 Тб облачного хранилища.

Автор: VyacheslavAcronis

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js