Профессия iOS разработчик сейчас довольно востребована, хорошо оплачивается и, возможно даже, модная, а потому привлекает много людей.
Ко мне и коллегам на собеседования приходит много кандидатов на открытые у нас вакансии, и я отчетливо вижу у многих новичков отсутствие базовых знаний или просто неуверенное владение ими. Хотя в интернете и много статей, книг и курсов (платных и бесплатных), из которых можно получить необходимые знания, не всегда просто понять, на изучении каких тем стоит сконцентрироваться.
В этой заметке я поделюсь информацией про то, какие навыки и знания я считаю важными для начинающего iOS разработчика, попробую объяснить зачем они нужны и дам ссылки на материалы для их изучения.
Материал адресован в первую очередь тем, кто хочет начать обучение, восполнить пробелы или понять свою готовность работать iOS разработчиком. Буду стараться пояснить все простыми словами.
Сразу скажу, что большая часть материалов, на которые буду давать ссылки, на английском языке. Я понимаю, что учиться на английском может быть сложнее и медленнее в начале, но это даст плоды позже — вы не сможете всегда находить хорошие актуальные материалы на русском.
Первые шаги
Перед тем как углубляться в последующие темы, я рекомендую подготовить фундамент, а именно ?- пройти (прослушать и воспроизвести все задания) бесплатный курс CS 193P от Stanford University и прочитать на сайте Apple документацию по Swift.
Абсолютно нормально, если вы при этом поймете или запомните не все темы, зато у вас появится основа — структурированные базовые понимания устройства iOS приложений и конструкций языка Swift. Уделив время этим вещам на старте, вам будет сильно проще добавлять знания по каждой из тем.
1. Auto Layout, Storyboard, верстка из кода
Создание интерфейса приложения на основе макета — базовый навык для iOS программиста. Знать стоит не только основные компоненты, из которых собирается интерфейс (UIView, UILabel, UIButton, UIImageView и т. д.), но и то как их расположить на экране, чтобы добиться желаемого положения и размера на разных по размеру экранах, в том числе при повороте устройства. ??Для простоты я бы выделил 3 способа создания интерфейса:
- визуальный способ через Interface Builder
- полностью описать интерфейс из кода
- комбинированный вариант, когда часть содержимого экранов заведена через Interface Builder, а их настройка вынесена в код.
Навыков верстки интерфейса только через через Interface Builder на StoryBoard вам может быть недостаточно. Помимо того, что через StoryBoard вы сможете сделать далеко не все, нужно понимать, что над крупными приложениями работают несколько разработчиков, и для объединения результатов их работы используется система контроля версий (чаще всего это Git). Когда несколько человек работают над одним участком кода, результат их работы не всегда возможно объединить автоматически. Если интерфейс был сверстан программистом из кода, проводить слияния проще и быстрее чем в случае, когда код был сгенерирован Interface Builder-ом.
?Чтобы освоить тему, рекомендую:
- пройти подробный урок от Ryan Ackermann и Matthijs Hollemans
- пройти бесплатный мини-курс от Brian Voong
- посмотреть два видео на русском языке видео 1 и видео 2 на канале The Swift Developers
Как понять, что вы освоили тему в достаточной мере? Возьмите любое из приложений, которыми вы пользуетесь на iPhone. Можно начать со стандартных, к примеру, Apple Music. Попробуйте полностью воспроизвести один или пару экранов, которые вы видите, а также их поведение при повороте.
2. Жизненный цикл ViewController
Предположим для простоты, что каждый экран в мобильном приложении — это ViewContoller, а точнее — это наследник класса UIViewContoller. iOS разработчику важно знать, как устроен жизненный цикл экрана, а точнее — какие методы будут выполняться при подготовке, появлении, повороте, уничтожении и других состояниях экрана.
Материалы по теме:
3. Работа с UITableView и UICollectionView
Большая часть интерфейсов мобильных приложений сделаны на основе таблиц. Вы должны уметь добавить на экран таблицу, подготовить ячейки, реализовать нужные протоколы, назначить делегат и источник данных.
Помимо этого важно понимать, зачем нужны идентификаторы, и что понимается под переиспользованием ячеек.
Материалы по теме:
4. Grand Central Dispatch
Приложения должны уметь параллельно решать несколько задач. К примеру, пока пользователь листает ленту новостей, загружаются данные из сети, и интерфейс при этом не блокируется.
Grand Central Dispatch — одна из важных и довольно непростых тем, которую вам точно стоит знать, если вы собираетесь программировать под iOS.
Материалы по теме:
5. Работа с сетью, получение данных из JSON
Какие из ваших любимых приложений продолжают работать без подключения к Интернету? Думаю, что если откинуть игры, вы увидите, что большая часть приложений работает с данными из сети. Что в этом случае должен уметь начинающий iOS разработчик? Думаю, что создать сетевой запрос, получить и обработать данные. Знаний о URLSession для начала должно хватить. Это самый базовый подход, и я рекомендую в первую очередь освоить применение именно его. Возможно будет не лишним знать о существовании такой популярной библиотеки как Alamofire, но это не должно быть в ущерб URLSession.
Чаще всего данные, которые приходят в приложения по сети, передаются в формате JSON. Нужно уметь эти данные получить и обработать, к примеру, вывести на основе их какой-нибудь список. При этом желательно, чтобы вы умели делать это не только с помощь одной из популярных библиотек, к примеру, SwiftyJSON, но также владели стандартными средствами языка, были знакомы с Codable.
Довольно подробно про работу с URLSession рассказано в статье от Audrey Tam. Материалов по работе с JSON довольно много, можно посмотреть статью Anand Nimje.
Чтобы освоить тему на практике рекомендую сделать приложение с прогнозом погоды, в котором есть поле ввода названия города, создается запрос к API (подойдет OpenWeatherMap), и на основе полученного JSON выводится информация о погоде.
6. Знания Swift
Тут очень поможет прочтение документации. Изучение Swift может занять время, но на выходе вы должны взять с собой и свободно ориентироваться в следующих темах:
- классы
- структуры
- перечисления
- протоколы
- коллекции
- методы работы с коллекциями (перебор, сортировка, фильтрация, map, reduce и т.д.)
- работа с опционалами и исключениями
Эти темы нужно знать и владеть ими в том объеме, в котором они приведены в документации — все это пригодится в работе. Очень хорошо, если для каждой темы вы можете привести пример задачи, которая с их помощью решается.
Тщательно разберите отличия структур и классов — не только потому что этот вопрос вам зададут на собеседовании с большой вероятностью, просто это нужно будет в работе.
Параллельно с прочтением документации по Swift можно смотреть видео марафон по Swift Алексея Скутаренко. Этот марафон не заменит прочтение документации из-за того, что в нем раскрыты не все темы, а еще он опубликовал 4 года назад, и за это время в Swift произошли небольшие изменения. Алексей проделал грандиозный труд, полезного материала и мыслей там много.
7. Сильные и слабые ссылки, ARC, утечки памяти
Как сделать так, чтобы у приложения не было проблем с нехваткой памяти?
Что такое ссылки, какие бывают типы ссылок? Что именно делает ARC, и как избежать Retain Cycle, и что это вообще такое? Тема не сложная, но крайне важная. Ознакомиться можно, к примеру, в SwiftBook.
8. Протоколы и делегаты
При разработке под iOS вы часто будете встречать делегирование, а точнее передачу отвественности от одного объекта к другому. ?Для примера классическая задача — таблица с ячейками, в каждой из которых есть кнопка «добавить элемент в избранное». Вы должны уметь создать для этой ситуации протокол, назначить делегат, реализовать у него поддержку протокола.
Материалы по теме:
9. Архитектурные подходы: MVC, MVVM, MVP, VIPER
Для простоты создания и поддержки программных продуктов при разработке их разделяют на отдельные блоки. К примеру, один блок отвечает только за работу с данными, а другой за внешний вид. У такого подхода есть ряд преимуществ, к примеру, вы сможете изменить внешний вид, не трогая логику, или при необходимости сможете поменять источник данных, опять же не меняя остальные части приложения. Очевидно, что эти подходы используются не только в iOS, скажу больше — они пришли сюда из других платформ. Есть несколько устоявшихся подходов к разделению ответсвенности между разными блоками, для работы с iOS я рекомендую хорошо разобраться с MVC и MVVM.
Вместо нормального объяснения разделения отвественности в архитектуре я часто слышу на собеседованиях, что-то вроде «MVC это плохо, потому что это Massive View Controller, а MVVM гораздо лучше».
Материалы по теме:
- подробная статья на русском языке от Badoo
- урок из двух частей от Lorenzo Boaro и Eli Ganem, раскладывающий множество архитектруных подходов в iOS
10. Хранение данных, Core Data
Как мы говорили выше, многие приложения работают с данными из сети. Нужно уметь сохранять эти данные на устройстве, а также сохранять то, что вводил пользователь. В базовый набор способов для хранения данных для начинающего iOS программиста, на мой взгляд, входят
- Keychain для чего-то небольшого и секретного
- UserDefaults для небольших настроек
- Core Data для хранения объектов, связей между ними
В этом списке нет SQLite, Realm, Firebase. Осваивать их можно при желании, но точно не в ущерб приведенным выше способам. Если у вас уже есть опыт работы с SQL, то использование SQLite на iOS я рекомендую освоить про запас, весьма вероятно, что вам такой подход к хранению покажется удобнее.
Материалы по теме:
- перевод на русский урока по KeyChain (работа с Keychain становится гораздо проще при использовании библиотек подобных Keychain Swift)
- краткая инструкция по работе с UserDefaults от Hacking With Swift
- урок с введением в Core Data от Pietro Rea
- видео-курс по Core Data
Итог
Я считаю, что равномерно распределив указанные выше темы и уделяя учебе от 20 часов в неделю, реально даже с нуля освоить всё это за срок в 4-5 месяцев.
С таким багажом знаний можно начинать брать заказы на небольшие приложения или ходить на собеседования. К примеру, при наличии вакансии мы бы человека с таким набором знаний взяли в нашу мобильную команду.
Напишите свое законченное приложение
Я уверен, что iOS разработчику стоит иметь своё приложение. Речь идет про законченное приложение, которое решает какую-то нужную задачу или проблему (ничего страшного, если решает только для автора приложения). В процессе написания своего приложения вы столкнетесь с творческими задачами поиска подходящих решений, это не только позволит лучше закрепить теоретические знания, но и доставит вам удовольствие.
Не стесняйтесь своих приложений, показывайте их на собеседованиях. Даже если приложение простое, даже если дизайн делали сами, и получилось не самое красивое приложение (если приложение нужное, функционал потом можно расширить, а дизайн сделать новый).
P.S.
Пожалуйста, расскажите в комментариях, какие темы вы считаете важными для освоения начинающими iOS разработчиками
Комментарии (12)
Agranatmark
23.02.2019 22:43+1Крайне рекомендую изучать документацию и хедеры файлов, которые вы собираетесь использовать. Без документации, знания будут поверхностными. Модель изучения — прочитал/поставил эксперимент, так намного больше поймёте. Ниже привёл ссылки на официальные руководства. Во многих из них используется Objective-C, поэтому желательно прочитать руководство по нему тоже.
* Objective-C — developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011210
* Жизненный цикл — developer.apple.com/library/archive/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007072-CH1-SW1
* Многопоточность 1 (Threads) — developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/Introduction/Introduction.html
* Многопоточность 2 (GCD, NSOperationQueue) — developer.apple.com/library/archive/documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008091
* UIView и всё что с ними связано — developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/Introduction/Introduction.html
* Autolayout — developer.apple.com/library/archive/documentation/UserExperience/Conceptual/AutolayoutPG/index.html
* Core Data — developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CoreData/PersistentStoreFeatures.html
Знания общего назначения:
* Шаблоны проектирования — www.ozon.ru/context/detail/id/31789305
* Git — git-scm.com/book/en/v2
aplekhanov
26.02.2019 11:02Не могу плюсануть из-за малой кармы, потому плюсую комментом. Очень хорошая и структурированная статья. Подписываюсь под каждым словом, как говорится.
dedyshka
Отличный гайд. Я бы добавил про Unit тесты.
slutsker Автор
Спасибо,
Я думал про unit-тесты в рамках данного списка. Конечно, будет здорово если разработчик имеет опыт их написания. Большой вопрос в том, насколько реально это встретить у начинающих.
dedyshka
Думаю, что это такой же обязательный навык для начинающего как и умение работать с системой контроля версий.
Dim0v
Я бы не ставил это в один ряд. Без навыков работы с контролем версий не выйдет эффективно взаимодействовать с командой и в проекте такой начинающий программист будет скорее мешать, чем помогать.
Касательно юнит тестов же, во-первых, есть множество проектов либо вообще без них, либо с заброшенными тестами, которые никто уже годами не поддерживает. Во-вторых — даже в проекте с тестами есть достаточно работы для начинающего, не затрагивающей тесты. В-третьих, тесты — это все таки не рокет сайенс. Если начинающий сумел освоить VIPER, MVVM, MVC, то уж как писать юнит тест он разберётся по ходу, если это потребуется.
RomanBambura
Есть такое понятие как функциональные тесты, а вот Unit тесты в 99.9% дорого и бестолково и не улучшают качество софта
Для гребца на галеру конечно это очень важный навык как и работа с версиями и работа в команде с другими 50 iOS разрабами, но для разработчика который не работает на галерах нужны совсем иные навыки вот они как раз здесь и перечислены