Artyom Ivanov

Версия 1.3, актуально на май 2023

iOS Developer Roadmap

План развития iOS-разработчика со ссылками на материалы обучения


Введение

Предлагаю для начала познакомиться. Я Артем Иванов, с 2012 года работаю в айти. В прошлом сооснователь и технический директор веб-продакшна Mechanica (раньше называлось ANMEDIO, ТОП100 продакшнов России). Долгое время занимался веб-разработкой, писал на php, ruby, js (react и nodejs), python, но душа как-то больше лежит к фронтенду. В 2019 понял, что хочу заниматься мобильной разработкой под iOS.

Поставил себе цель — войти в топ 1% iOS-разработчиков в мире. Правда, есть проблемка. Такого рейтинга даже нет 🤷‍♂️ Ну это мелочи, по ходу дальше разберусь.

Первое, что я сделал, когда начал идти этой цели - составил план обучения. Потом пообщался с крутыми ребятами, узнал что мой план плохой, сделал его получше. И так раз 5-6. И только после этого начал двигаться в обучении.

На данный момент успел поработать на российских и зарубежных позициях iOS-engineer, iOS-teamlead и CTO американского стартапа (тоже мобильное приложение под айфон), постоянно корректируя этот план по ходу моей разнообразной карьеры 🙂

Спустя три года могу сказать, что план норм. Скорректировал совсем в мелочах по ходу обучения. Попробовал поделиться с другими - тоже работает и вроде как не является ошибкой выжившего. Поэтому и решил поделиться этим с другими в надежде, что будет кому-то полезно.

Важно!

Это далеко не финальная версия плана. Тут точно полно ошибок, опечаток и прочей неудобной шелухи (гарантирую это!). Я просто собрал кучу своих материалов с гугл-доков/трелло/закладок и собрал на бутстрапе со своими комментариями. И еще даже не закончил! В общем, относитесь к этому, как к MVP. Найдете ошибки или будут мысли, что добавить — пишите мне в телеграм, пофиксим. Потом залью на github, чтобы можно было делать это все pull request-ом, но пока лень 🤷‍♂️

Прежде чем начать этот, прямо скажем, долгий путь, важно ответить себе на вопрос, а на кой черт мне это вообще нужно? Получить оффер в FAANG, запилить свое приложение, систематизировать знания, уйти-в-айти и зарабатывать 100500 тыщ/наносекунду — это все отличные цели, и они будут прямо влиять на процесс обучения. Но у каждой цели должны быть промежуточные результаты, которые будут давать вам мотивацию двигаться дальше.

Найдите мотиватор 🤘

Это не спринт, это марафон. Бежать надо будет далеко, изучать много и, это супер важно (!), регулярно. Поэтому найдите для себя промежуточные точки мотивации — делайте pet-проекты в open source, запускайте свои аппки в appstore, помогайте тем, кто знает чуть меньше чем вы, заведите технический блог, да просто ходите на сходки мобильщиков в бары в конце-то концов!

Постройте свое обучение так, чтобы получать удовольствие не только от финала (он ох как не скоро), а от всего процесса. Еще раз повторю. Это важно, правда. Кайфуйте от самого пути к цели, иначе грусть-печаль-выгорание-смерть-кладбище-кутья.

Но есть и хорошие новости! Если цель — устрооиться iOS-разработчиком, то 80% этого плана вам просто не понадобится, вас схантят гораздо раньше 🙂

В общем, ни в коем случае не претендую на последнюю истину. Лично мне этот план помог. Возможно, поможет и вам? В любом случае, enjoy!

Контекст и окружение

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

Попробуем применить тоже самое, но ровно наоборот. Поместите себя в среду, в которой все вокруг будет постоянно напоминать вам о мобильной разработке и Swift. Пойдем по пунктам:

Мобильник

  1. Установите шикарную аппку Unwrap от Paul Hudson на свой айфон и замените любую вредную привычку, вроде залипания в инстаграм на унитазе, на решение Swift-задачек в этом приложении.

  2. Телеграм чаты и каналы. Окружите себя постоянным информационным потоком по мобильной разработке. Даже если вы совсем ноль и не написали еще первого hello world в своей жизни, все равно уж что-то да поймете. Вот моя подборочка:

    • SwiftBook — самый активный и большой чат по Swift. Сообщество активно помогает, если задавать правильные вопросы.
    • Канал Redmadrobot — топовых ребят по мобильной разработке. В этом канале именно технические штучки.
    • Mobile Library — чат по литературе о мобильной разработке. Очень много материалов.
    • iOS Good Reads — канал одного из самых популярных изданий про iOS-dev.
    • AppTractor — канал одного из самых популярных изданий про мобильную разработку.
    • iOS Heads — канал про мобильную разработку под iOS
    • CocoaHeads Chat — чат сообщества iOS-разработчиков.
    • iOS Events — канал про события, связанные с iOS. Подкасты, митапы и проч.
    • Server Side Swift Developer — чат Swift-бэкэндеров
    • Dodo Pizza Mobile — канал-блог про мобильную разработку от Додо Пиццы. Нечасто, но любопытно рассказывают про свои фишки.
  3. Youtube и подкасты. Подписываемся на ютуб-каналы и подкасты в Яндекс.Музыке (ну или где вы там это все слушаете). Ссылочки:

  4. Если читаете Medium, то подпишитесь там на раздел Swift Programming. Через несколько прочитанных статей вам начнет приходить дайджест всякого разного новенького на почту. В этом плане их система рекомендаций мне нравится больше всего.

  5. Подпишитесь в инстаграме, твиттере или других социалках на людей, которые занимаются мобильной разработкой и транслируют это. Например: Александр Зимин, Егор Толстой, Александр Блинов, Константин Цховребов, Денис Неклюдов, Евгений Мацюк, Артем Зиннатуллин, Стас Цыганов

Сообщества

Найдите комьюнити в вашем городе. В идеале по свифту. Хорошо, если по мобильной разработке или просто тусовка айтишников. Если совсем все плохо с сообществами или вы единственный айосер на селе, то попробуйте организовать свое (совет не для каждого, понимаю). Ну и всегда можно найти комьюнити в онлайне, чатов более чем достаточно.

Я сам из Самары, поэтому могу сказать только про нее. У нас есть чудесное и активное Samara IT Community и его маленькая часть — SITC.Mobile по мобильной разработке. Знаете крутое сообщество в своем городе? Напишите мне в телеграм, добавим сюда.

Ну и я подразумеваю, что приходя в комьюнити вы будете не просто в режиме read-only. Принимайте участие в дискуссиях, общайтесь, ходите на оффлайн-встречи — на самом деле это сильно помогает как расширять кругозор, так и понимать, что вообще происходит в сфере.

А если вам вот это все общение с большими группами людей не близко, то найдите хотя бы одного единомышленника, кому эта тема также интересна. Нужен buddy, кому вы сможете покидать мемчиков про тормознутый xcode, пошутить про развертывание опционалов и обсудить прогресс друг-друга.

В отделах продаж компаний всегда должно быть минимум два менеджера по продажам на одном уровне иерархии. Если их меньше, то пропадает соревновательный момент и продажи падают.

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

Общие основы

В айти есть база, которая нужна в любой дисциплине от фронтенда до девопса. Я, например, переходил в swift-dev из full-stack web разработки, поэтому что-то уже знал.

Алгоритмы

Если вы совсем новичок, то перед началом я бы рекомендовал понять основные принципы алгоритмов и в целом программирования. Я придерживаюсь принципа «учись у лучших», и лучшее, что есть в плане алгоритмов без заунывных материалов — Курс CS50. Это серия лекций по Computer Science от Гарвардского университета. Слушается и выглядит круче, чем любой спэшл стэндап. Просто начните смотреть, это супер шоу! Ссылочки:

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

Прочитайте лучше «Грокаем алгоритмы» (Бхаргава Адитья) — она несложная и клевая. А вот эти все огромные талмуды «Компьютерные сети», «Современные операционные системы», «ООП в C++» от Лафоре и кучу всего, что будут советовать все уважающие себя программисты, прочитаете как будет желание.

Терминал

Это та самая хакерская консолька. Именно с ней неразрывно связан образ айтишника в кино. Выглядит со стороны жутко, но на самом деле это супер просто. На macOS (мы же про iOS-разработку говорим) просто устанавливаете iTerm2 и пробуете основные команды (или вот на русском). И еще несколько ссылок:

  • Подборка разных обучающих игр для изучения bash
  • Bashcrawl - текстовая игра типа подземелий, где вам нужно будет ходить с помощью терминала по директориям, читать тексты и всячески развлекаться, параллельно изучая bash.
  • Игруля в онлайне от RedHat, чтобы проверить свои скиллы по bash

Лично я использую iTerm2 с оболочкой zsh, вот хороший гайд по настройке.

И еще важно

Я пока не расписал тут подробно со ссылками на материалы как выше, но опишу хотя бы тезисно. Также хорошо бы понимать и разбираться:

  • Системы контроля версий — git (главное), svn и mercurial (для разнообразия). Понимать как работать, хотя бы на уровне клонирования репозиториев и push/pull с github, gitlab, bitbucket (они все плюс-минус одинаковые, но интерфейс можно за 15-20 минут пощупать сразу).
  • Debugging, брейкпойнты и в целом методы отладки. Чтобы понимать, как отлавливать ошибки.
  • Принципы. И я не про книжку Рэя Далио, а про принципы программирования (которые и к жизни применимы, на мой взгляд). Основные: DRY (don't repeat yourself), KISS (keep it simple stupid) и YAGNI (you aren't gonna need it). Почитайте про них, занимает 15 минут, но закладывает верный фундамент в голове.
  • Объектно ориентированное программирование — надо понимать, что это и зачем. Там тоже все просто, не упарывайтесь в детали.
  • Функциональное программирование — такая же история, что и с ООП. Важно понимать саму концепцию.
  • Code Review и Leadership — больше для тимлидов, но всегда полезно

Swift

Ура, теперь мы добрались до самого свифта. Пойдем от простого к сложному.

По чему обучаться?

  • Если вы совсем новичок, то попробуйте приложение Swift Playgrounds от Apple. Там в формате игры для айпэда или мака учат основам алгоритмов в разрезе свифта. Его разработали для вводного обучения языку в средней школе, так что, уверен, вы справитесь 🙂
  • Чуть посерьезнее, но тоже для начинающих — начните с простого курса типа этого от Angela Yu на Udemy, там вас за ручку проведут по самым базовым основам и вы соберете свое первое приложение уже в первый день. Сможете показать друзьям и похвастаться, что вы теперь iOS-инженер (но это не точно).
  • Если вы поскилловее, посмотрите на Youtube отличные бесплатные курсы Стэнфорда CS193p — iPhone Application Development Spring 2020 и не такой свежий, но тоже хороший Developing iOS 11 Apps with Swift 2017-18.
  • Очень много отличных видео с разборами у Ray Wenderlich: там и лекции, и план обучения, и вообще куча всего. Highly recommended, в общем.
  • Среди всех ресурсов по свифту мой любимый — сайт Пола Hacking with Swift. Именно он сделал приложуху на айфон Unwrap, про которую я говорил выше. Мне очень нравится его проект 100 days of Swift — челлендж на 100 дней непрерывного изучения Swift-а. Вообще подобные челленджи, по-моему, крутейшая тема для интенсивного обучения. У него еще есть такой же по Swift UI — 100 days of Swift UI.
  • Еще лично я не использую, но многие любят NS Hipster.
  • То, что должно было стоять первым, но я решил идти от простого к сложному. Естественно, официальная документация Swift и ее перевод на Swiftbook. На Swiftbook, кстати, есть еще курс, но я не проходил, ничего не могу сказать. Я как-то больше по самостоятельному обучению. Кстати оффтоп, скорость флота определяется по скорости самого медленного судна. Также и темп обучения в группах определяется по скорости усвоения знаний самым тупым учеником. Как говорится, хочешь идти быстро — иди один. Хочешь далеко — иди вместе. Think about it.
  • Ну и, святая святых, WWDC — ежегодная конференция Apple для разработчиков. Качайте приложение Apple Developer, в нем все записи докладов.

Это, естественно, далеко не все материалы. Но мне этого хватило более чем. Теперь переходим к тому, что именно надо изучить.

План обучения

Тут в будущем распишу подробнее, пока просто списком:

  • Simple values (const/vars, bool/int/float/binary/tuples)
  • Collections (arrays, sets, dictionaries)
  • Control flow (if, switch, for, while)
  • Optionals, Optional unwrapping/binding
  • Functions, closures
  • Access control
  • Structures
  • Classes
  • Enums
  • Protocols and Extensions
  • Error handling
  • Generics
  • Initializers
  • Memory management (Stack and Heap, Value vs Reference type, MRC, ARC, Weak references, Retain cycles, Garbage collection, Memory leaks, Shallow and deep copying, Autorelease pool)
  • Advanced operators
  • Runtime, Method dispatch
  • Multithreading and concurrency (POSIX and NSThreads, Perform selector family, GCD, NSOperation(Queue), Runloop, Synchronization, Problems, Race condition, Deadlock, Readers–writers problem)
  • Swift backend, Vapor — не обязательно, но мне было интересно

А что по Swift UI? По-моему Swift UI немного отдельная тема, я бы рекомендовал ее изучать после подробного изучения самого Swift. В целом, там ничего сложного, тем более у Apple есть просто шикарный гайд онлайн в браузере по нему. Я вынес блок про Swift UI дальше, во фреймворки Apple.

Фреймворки Apple

Знать сам язык Swift и его особенности нужно, но недостаточно для разработки приложений. И если сторонние библиотеки использовать необязательно, то без фреймворков эппла тут никуда. Распишу потом подробнее и приоретизирую, пока просто списком:

  • UIKit
  • Foundation
  • UserNotifications
  • Работа с камерой
  • Core Location
  • Core Motion
  • AVFoundation
  • CoreAnimation / UIView.animate
  • Жесты (Gesture) Responder Chain
  • UITableView, UICollectionView
  • Taptic Engine, UIFeedbackGenerator
  • Working in background
  • ViewController Lifecycle
  • App Lifecycle (background, etc)
  • tvOS
  • WatchKit
  • SiriKit, Shortcuts, Spotlight
  • CloudKit
  • HomeKit
  • Beacon
  • In-App purchases, StoreKit
  • CoreML, Machine learning, FirebaseML, AmazonML?
  • ARKit
  • AppClips
  • Bluetooth
  • Connectivity
  • MFi
  • SwiftUI

Библиотеки

К счастью, iOS-разработка не ограничивается только родными фреймворками и библиотеками от Apple. Для использования сторонних зависимостей используют менеджеры: Cocoapods, Swift Package Manager и Carthage.

Библиотек просто сумасшедшее множество, каждый может написать свою, и знать все нет никакого смысла. Но знать основные, которые используются чаще всего, полезно. Я написал огромное количество своих велосипедов, которые были уже реализованы эффективнее другими инженерами до меня. Поэтому, прежде чем приступать к задаче, посмотрите — может уже ее кто-то решил до вас? 😉

В некоторых компаниях, особенно это актуально для сферы финансов, нежелательно использование сторонних библиотек, но вы всегда сможете посмотреть их исходный код, чтобы понять логику работы и написать по-своему (актуально для Open Source).

То, что первое пришло в голову по популярным зависимостям:

  • Alamofire, Moya
  • EasyPeasy
  • SnapKit, Yoga
  • MagicalRecord
  • Lottie

Архитектура

Мало уметь писать код, он еще должен быть масштабируемый, гибкий и элегантный. Для этого умные дяди инженеры придумали паттерны проектирования — типовые решения для типовых архитектурных задач в коде. Они применимы к любому языку программирования и представляют собой, по большей части, концепции, в которых описываются разные подходы.

Важно! Если вы только начинаете программировать, то это вам нафиг не нужно. Вы забьете себе голову, будете думать не как решить задачу, а как решить ее элегантно, используя самые крутые паттерны. Не надо так. Рабочий продукт важнее хорошего кода. Просто нпаишите свое приложение, пусть оно будет хоть из говна и палок, лишь бы работало и приносило пользу. Когда набьете руку — разберетесь с паттернами и будете писать как боженька.

Самый крутой сайт по этой теме — Refactoring Guru с енотиком и отличными иллюстрациями

А теперь то, что надо бы знать с точки зрения архитектуры для iOS разработчика:

  • MVC, MVVM, VIPER, MVP, SOA
  • Redux
  • Decorator (delegate)
  • Facade
  • Observer
  • RxSwift/Combine
  • Coordinator
  • Mediator
  • Proxy
  • Singleton
  • Factory, abstract factory
  • SOLID, DRY, KISS, YAGNI
  • Protocol-oriented programming

Хранение данных

Любое приложение работает с данными. Эти данные надо где-то храить. На iOS есть несколько способов, которые используются чаще всего. Чтобы не забивать молотком саморезы важно понимать, в каких случаях какой тип хранения данных надо использовать.

То, что надо знать:

  • NSUserDefaults
  • Core Data
  • KeyChain
  • Plist
  • Disk storage
  • CloudKit
  • SQLite
  • Realm
  • Firebase
  • RxRealm, RxDataSources

Тестирование

Код без тестов — плохой код. Это не так очевидно, пока пишешь для себя простые приложения, но любая работа в команде без тестирования превращается в ад. То, без чего вы не выживете в командной разработке:

  • XCTest
  • Unit Tests
  • Snapshot Tests
  • Functional test
  • TDD, BDD
  • Nimble
  • Appium

Инструменты

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

  • XCode
  • Device Simulator
  • Alternatives IDE (VSCode, AppCode)
  • Swiftlint
  • Sourcery
  • Fastlane
  • CI/CD (Jenkins, XCode server, Gitlab CI/CD, Bitrise, TeamCity)
  • Google Firebase, AWS
  • Swagger/Postman/Insomnia/Charles
  • AppStore Publishing (TestFlight)
  • Apple Certificates
  • In-app analytics (google firebase, facebook pixel, appsflyer, appmetrika, etc)
  • XCode localization

Безопасность

Войти в приложение по отпечатку пальца или Face ID — стандарт индустрии. Хранение паролей в эппловской связке ключей тоже сильно упрощает жизнь пользователям, поэтому это нужно знать. А еще с недавних пор Apple сильно переживает за Privacy, так что обойти стороной этот раздел не получится. Также, списком:

  • Keychain
  • iCloud Storage
  • Face ID, Touch ID
  • Access to Protected Resources
  • App Files Encrypting

Верстка и UI

Приложение обычно разрабатывается по макетам. Макеты рисует, как ни странно, дизайнер. Инструментов у дизайнеров тоже немало, и важно разбираться в них: понимать концепцию дизайн-системы, дизайн-компонентов, основы типографики, правил внутреннего и внешнего и еще много чего. История про дизайн — тема для отдельного роадмэпа, а сейчас кратенько, что надо знать из прорамм дизайнеров хотя бы на уровне нарезки макетов:

  • Figma
  • Sketch
  • Adobe XD
  • Zeplin
  • Photoshop (и такие бывают в 2021, мда)

Когда макет нарезан, он дальше верстается. Тут есть два глобальных подхода. Первый — это декларативный Swift UI, где мы верстаем в коде. Второй — по старинке, через Storyboard. Списком, что надо уметь для верстки UI:

  • SwiftUI
  • Storyboard in Interface builder
  • Storyboard in code
  • Light/dark themes
  • Navigation Controller (stack, popups, etc)
  • Transition Delegate
  • UILabel, UIButton, UITextField

И еще изучите Apple Human Interface Guidelines . Так вы будете понимать принципы дизайна мобильных приложений и, возможно, даже будете поправлять нехороших дизайнеров, которые этим гайдлайнам не следуют.

Запросы и API

Приложение редко изолировано от интернета, чаще всего нужно слать запросы в бэкэнд, обрабатывать ответы и кэшировать эти данные. Списком то, что надо изучить для этого:

  • REST API
  • GraphQL
  • JSON
  • WebSocket
  • WebRTC
  • XML
  • Codable
  • Protobuf

Objective C

Несмотря на то, что сейчас на ObjC редко пишут, а новые приложения и подавно, будет не лишним узнать про его особенности. Например, про Objc runtime и Method swizzling. В будущем допишу сюда темы, про которые чаще всего спрашивают на собеседованиях.

Будет не лишним

Я сторонник теории T-Shaped Person, это когда человек является глубоким специалистом в своей достаточно узкой нише, но при этом разбирается и в других. На мой взгляд, это путь любознательного и эффективного человека. Поэтому вкину немного того, что будет не лишним знать iOS инженеру.

  • Appstore Connect — публикация приложения. Надо знать как минимум для того, чтобы залить свое приложение в магазин и скинуть ссылку друзьям на скачивание.

  • ASO — оптимизация текстов приложения для продвижения в Appstore.

  • Flutter — фреймворк для создания кроссплатформенных приложений от Google. Полезно знать как минимум для того, чтобы уметь собрать простенькую аппку на Android или объяснить разницу между нативным Swift и кроссплатформенным Flutter.

  • React Native — такой же фреймворк от Facebook. В свое время дико взлетел, сейчас немного уступил флаттеру и некоторые компании, например, Airbnb, публично отказывались от использования реакта в пользу нативной разработки.

  • Тайм-менеджмент и планирование. Чтобы нормально работать и обучаться, нужно уметь планировать свое время. Увы, в школе этому не учат, хотя надо бы. Книг на эту тему миллион, лично я работаю по простой технике Pomodoro и трекаю свое время.

Вроде бы все охватил, что нужно для iOS разработчика. Знаете чем дополнить? Пишите мне в телеграм, дополним.