Версия 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. Пойдем по пунктам:
Мобильник
Установите шикарную аппку Unwrap от Paul Hudson на свой айфон и замените любую вредную привычку, вроде залипания в инстаграм на унитазе, на решение Swift-задачек в этом приложении.
Телеграм чаты и каналы. Окружите себя постоянным информационным потоком по мобильной разработке. Даже если вы совсем ноль и не написали еще первого 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 — канал-блог про мобильную разработку от Додо Пиццы. Нечасто, но любопытно рассказывают про свои фишки.
Youtube и подкасты. Подписываемся на ютуб-каналы и подкасты в Яндекс.Музыке (ну или где вы там это все слушаете). Ссылочки:
Если читаете Medium, то подпишитесь там на раздел Swift Programming. Через несколько прочитанных статей вам начнет приходить дайджест всякого разного новенького на почту. В этом плане их система рекомендаций мне нравится больше всего.
Подпишитесь в инстаграме, твиттере или других социалках на людей, которые занимаются мобильной разработкой и транслируют это. Например: Александр Зимин, Егор Толстой, Александр Блинов, Константин Цховребов, Денис Неклюдов, Евгений Мацюк, Артем Зиннатуллин, Стас Цыганов
Сообщества
Найдите комьюнити в вашем городе. В идеале по свифту. Хорошо, если по мобильной разработке или просто тусовка айтишников. Если совсем все плохо с сообществами или вы единственный айосер на селе, то попробуйте организовать свое (совет не для каждого, понимаю). Ну и всегда можно найти комьюнити в онлайне, чатов более чем достаточно.
Я сам из Самары, поэтому могу сказать только про нее. У нас есть чудесное и активное 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 разработчика. Знаете чем дополнить? Пишите мне в телеграм, дополним.