Обложка статьи «Одна задача и 10 минут, чтобы нанять iOS-разработчика»

Одна задача и 10 минут, чтобы нанять iOS-разработчика

Рассказывает руководитель iOS-разработки RentaTeam Андрей Урядов

Представьте, что вы приходите в компанию на работу и попадаете в команду разработки приложения Facebook. Первая ваша задача касается ленты. Лента — это бесконечный список материалов: пользователь листает ее, доходит до конца, здесь подгружаются новые материалы — и так до бесконечности. Технически лента представляет собой UITableView. И задача в том, что лента тормозит. Нужно ускорить ее.

Что вы будете делать как разработчик: в первую очередь, во вторую, в третью, чтобы эту задачу решить?

Решение

Для начала проверяем, понял ли разработчик саму задачу. Слово «тормозит» может значить очень многое. Для пользователя и разработчика оно может иметь разный смысл. Если разработчик не проверит правильное понимание, он может решать совсем другую задачу. Итак, первый вопрос, который я ожидаю от разработчика: «А что значит тормозит?». «Тормозит» может обозначать как то, что пользователь ожидает от приложения, что оно будет какую-то операцию делать быстрее, так и то, что интерфейс «лагает», то есть реагирует на пользовательские действия через раз. Технически это совершенно разные вещи, и решать их надо по-разному.

Далее. Рассмотрим торможение.

Торможение может происходить, если:

  • что-то медленно работает в приложении;
  • что-то медленно работает вне приложения, но приложение ждет результата;
  • есть блокировки в процессе;
  • все вышеперечисленное.

Если тормозит что-то в приложении, то как понять, что именно? Самое верное решение — использовать профайлер. И далее обсуждаем с кандидатом самые частые причины этого:

  • неверный UITableViewCell reuse;
  • тяжелый конструктор или конфигуратор ячеек;
  • тяжелые вычисления логики в главном потоке;
  • конвертация картинок, парсинг JSON и прочие премудрости.

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

Если тормозит вне приложения, то это может быть сеть. Тут уже надо смотреть запросы: количество, частота, размер ответа сервера, время отклика, наличие и размер кеша. Можно поиграться с шириной канала, версией HTTP и поисследовать в этом направлении.

Если рассмотреть блокировки, то, например, приложение может не кешировать данные, а каждый раз при заходе на начало ленты делать блокирующий запрос на сервер. Пользователь зашел на страницу и всегда видит, как крутится индикатор загрузки. Создается впечатление, что приложение тормозное, потому что всегда приходится ждать. Также тут может быть интересный вопрос, если приложение делает большую операцию, состоящую из множества асинхронных операций. И пользователь после каждого нажатия на любую кнопку получает ожидание с индикатором. Каждое из них может длиться секунду, но если после каждого чиха приложение на секунду зависает, через 6–7 таких операций создается плотное ощущение тормозов.

Рассмотрим лаги. Это более узкий случай, который лечится разгрузкой главного потока и выносом тяжелых вещей во второстепенные. Тут самое место обсудить средства синхронизации потоков, какой код куда выносить, а какой не надо и почему.

Ну и неплохо на каждом шаге работает обоснование способа и его стоимости. Кандидат должен «продать» его мне. Потому что я, как бережливый заказчик, не хочу делать дорогие вещи, которые, возможно, мне ничего не дадут. Поэтому часто задаю кандидатам вопрос: «А почему вы уверены, что это поможет? А сколько это стоит? А какой эффект это даст и достаточен ли этот эффект, чтобы оправдать стоимость?» Такие вопросы помогают оптимальнее подходить к затратам.