Skip to content

Instantly share code, notes, and snippets.

@azimin
Last active October 9, 2023 09:29
Show Gist options
  • Star 80 You must be signed in to star a gist
  • Fork 20 You must be signed in to fork a gist
  • Save azimin/a44086ef3e2d5992aa411b8aa60d05a3 to your computer and use it in GitHub Desktop.
Save azimin/a44086ef3e2d5992aa411b8aa60d05a3 to your computer and use it in GitHub Desktop.
iOS Developer

Требования к уровням:

Среди нижеперечисленных требований разработчик может плавать в 1-2 (Level 1) / 4-5 (Level 2) пунктах (у Level 2 разработчика куда больше пунктов, и они сложнее, но он не обязан хорошо разбираться во всех темах), остальное должен понимать. Разработчики Level 3 и Level 4 должны уметь рассуждать (с помощью подсказок) на ниже перечисленные темы, даже если они с ними не сталкивались.

Level 1:

Список требований:

  1. Разработка приложений:
    1. Знает про UIKit и умеет собирать экраны с этой библиотекой
    2. Знает про механизм Auto Layout и умеет настраивать базовые зависимости между View
    3. Умеет анимировать экраны через метод animateWithDuration у UIView
    4. Умеет настраивать клиент-серверное взаимодействие, знает формат JSON и умеет работать с ним в iOS
    5. Знает про CocoaPods или Carthage
    6. Способен закоммитить свой код в локальную ветку и пушнуть локальную ветку на сервер
  2. Язык:
    1. Умеет работать с замыканиями, умеет объяснить, зачем они используются
  3. Архитектура:
    1. Умеет объяснять парадигму ООП
    2. Может разделить бизнес логику на несколько классов
    3. Умеет объяснять паттерн MVC
    4. Знает про паттерн delegate и понимает значение модификатора weak
  4. Решение проблем:
    1. Умеет сформировать вопрос к Google по новым проблемам, знает про Stack Overflow
    2. Знает про существование нескольких потоков, понимает про важность главного потока в работе с UI
  5. Хранение данных:
    1. Умеет работать с UserDefaults
    2. Знает одну из следующих БД в iOS: CoreData / Realm / SQLite (можно и в теории, но это будет создавать проблемы)

Level 2:

Пояснение: Если разработчик плавает во всем, что касается UI (CoreGraphics, Auto Layout и анимации), это можно засчитать за 1 пункт. Но стоит понять, может ли разработчик быстро разобраться в теме, иначе это может создать проблемы на этапе разработки. Не обязательно помнить все дизайн паттерны, но он должен знать основные. Между Level 1 и Level 2 очень большой разрыв, поэтому часто в компаниях ищут на должность, подходящую по критериям на Level 1-2.

Список требований:

  1. Разработка приложений:
    1. Знает про CoreGraphics и то, что UIView работает с CALayer под капотом (данный пункт подразумевает понимание как отрисовывается view: как пример практика работы с CAShapeLayer/CAGradientLayer)
    2. Умеет разрабатывать сложную верстку через Auto Layout (как пример: умеет работать с приоритетами констрейнов, знает, как правильно анимировать констрены, знает, как работают Content Hugging Priority и Content Compression Resistance Priority)
    3. Знает, как устроены анимации в iOS, и почему они продолжат работу, даже если усыпить основной поток (но не всегда)
    4. Умеет собирать экраны через код (без Xib’ов и Storyboard’ов)
    5. Понимает последствия от использования сторонних библиотек в разработке. Умеет взвешивать плюсы и минусы внедрения новых зависимостей
    6. Умеет балансировать между хорошей архитектурой и скоростью реализации бизнес требований в зависимости от текущего контекста
    7. Разбирается в парадигме GitFlow, знает в чем плюсы и минусы rebase против merge
    8. Умеет проводить Code Review
  2. Язык:
    1. Может писать читаемый код на Objective-C
    2. Умеет использовать протоколы для улучшения качества кода (например, Equatable в паре с пользовательскими объектами и поиском внутри массивов)
    3. Пишет читаемые конструкции кода
    4. Знает в чем разница между типами значений и ссылочными типами
    5. Умеет объяснять, что из Swift нельзя использовать в Objective-C
  3. Архитектура:
    1. Умеет объяснять парадигму POP (на которой построен весь foundation Swift’а)
    2. (Не обязательно знать все дизайн паттерны) Читал про основные дизайн паттерны: Adapter, Bridge, Mediator, Prototype, Factory, Observer, Builder, Decorator, Proxy
    3. Знает про дизайн паттерны при работе с UI-слоем, такие как MVVM, VIPER
    4. Знает, как расшифровывается SOLID и умеет объяснять, зачем он нужен
    5. Знает про существования реактивного программирования
    6. Знает про внедрение зависимости (Dependency injection)
    7. Знает про антипаттерны
  4. Решение проблем:
    1. Умеет работать с официальной документацией, понимает зачем и когда надо смотреть сессии WWDC
    2. Умеет работать с многопоточность: знает про deadlock, знает в чем различие NSOperationQueue и GCD, умеет выносить подсчеты бизнес логики в отдельные потоки
    3. Знает про Symbolic Breakpoints и их условия
  5. Хранение данных:
    1. Имеет практический опыт работы с одной из следующих баз данных: CoreData / Realm / SQLite, совершал миграцию между версиями одной БД (например, когда свойства переезжали из одного объекта в другой)
    2. Знает про существования NSFileManager и знает, как хранить большие файлы на девайсе
    3. Понимает роль Bundle’ов
    4. Знает, как обеспечить хорошую плавность интерфейса про заполнении БД более 10000 объектами за раз
    5. Знает про каскадное удаление, работу с БД из других потоков и кэширование данных (в данном случае речь идет не о NSCache, а способах оптимизации скорости доступа к переиспользуемым данным)
  6. Обеспечение качества:
    1. Знает про юнит тесты и умеет объяснять зачем они нужны
    2. Умеет мокать зависимости
    3. Умеет объяснять разницу между юнит и интеграционным тестами
    4. Слышал про автотесты (или UI тесты)
    5. Знает про сервисы по логированию падений (например, Crashlytics)
  7. Задачи в коллективе:
    1. Умеет учить разработчиков Level 1 (и подводить к Level 2)
    2. Умеет объяснять другим разработчиком про выбранную архитектуру
    3. Умеет писать документацию

Level 3:

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

Одно из отличий от Level 2 то, что на вопросы разработчика Level 2, разработчик Level 3 должен отвечать четко и давать свои дополнительные пояснения.

Список требований:

  1. Разработка приложений (все, что касается этого пункта, разработчик должен делать без фанатичности, четко взвешивая плюсы и минусы, обсуждая с другими разработчиками. Как пример: разработчик не должен гнаться за внедрением автотестов, если проект на начальном этапе, и идет проверка гипотез бизнеса; или разработчик не должен внедрять реактивное программирование только потому, что это сейчас модно, и в короткой перспективе экономит время разработчиков):
    1. Способен выстраивать новые подходы к разработке внутри команды (например, выстраивать процессы написания тестов, code review, работы CI и т.п.)
    2. Способен следить за скоростью роста проекта и выбирать вектор, чтобы избежать потенциальных проблем
    3. Способен внедрять модульную архитектуру, если того потребуют процессы разработки
    4. Знает, как оптимизировать отрисовку UI, чтобы достичь приемлемый FPS (знает про offscreen rendering)
    5. Умеет отговаривать дизайнеров внедрять уникальный UI компонент, если это является лишней тратой ресурсов
    6. Умеет обсуждать с бизнесом траты ресурсов на процессы разработки, объясняя их преимущества с точки зрения бизнеса
  2. Язык:
    1. Если в проекте используется Objective-C, то разработчик должен в нем хорошо разбираться (как минимум, на уровне книги Effective Objective-C 2.0)
    2. Может приучить других разработчиков писать хорошо читаемый код, который можно будет писать без комментариев
  3. Архитектура:
    1. Имеет опыт работы с разными архитектурами UI слоя и знает, когда какую стоит применять
    2. Хорошо ориентируется в дизайн паттернах
    3. Знает, как заставить других разработчиков использовать внедрение зависимости (Dependency injection)
    4. (Не обязательно давать ответ на все термины, но уметь объяснять большинство) Разбирается в терминологии: View, ViewController, Model, ViewModel, DataSource, Presenter, Tracker, Service, Provider, Coordinator, Configurator, Router, Interactor, Navigator, Factory, Flow, Handler, Builder, Decorator
  4. Решение проблем:
    1. Знает, как декомпилировать код и слышал про Hopper
    2. Может рассуждать на темы поиска проблем (например, про поиск источника проблемы путем логарифмического прыжка по коммитам), знает команды для консоли отладки (например bt)
  5. Хранение данных:
    1. Представляет себе процесс миграции с одной БД на другую (знает про прогрессивное внедрение и способы отката при неудачной миграции)
    2. Умеет писать тесты на миграцию БД между версиями одной БД
  6. Обеспечение качества:
    1. Догадывается, как можно использовать assert’ы в производстве (логирование в аналитику)
    2. Умеет работать с логами
    3. Если в проекте есть аналог дизайн системы, то должен знать про Visual Snapshot тесты и их преимущества
    4. Знает, в чем преимущества автотестов и может объяснять QA команде, как их писать
    5. Слышал про watchdog’и
    6. Не даст веткам мерджиться пока CI не пропустит все юнит и интеграционные тесты
    7. Знает, как правильно переезжать с одного Xcode на другой в крупном проекте и как подготовиться к выходу новой iOS
  7. Задачи в коллективе:
    1. Умеет учить разработчиков Level 1 и Level 2
    2. Умеет управлять небольшими командами из разработчиков Level 3
    3. Умеет точно оценивать размер задачи и отчитываться о проблемах при выполнении
    4. Умеет взаимодействовать на хорошем уровне коммуникации с остальными командами (серверная разработка, продукт менеджеры, дизайнеры и т.п.)

Level 4:

Пояснение: У разработчика Level 4 не появляется больше технических знаний, а иногда они даже отвечают на вопросы чуть дольше, чем разработчики Level 3 т.к. долго не использовали какие-то вещи. Но основное отличие разработчиков этого уровня от разработчиков Level 3 в том, что разработчики Level 4 умеют управлять целыми отделами, имеют практический опыт внедрение технических процессов, следят за производительностью своего отдела и отчитываются руководству.

Из основных требований я бы выделил:

  1. Знает управленческие методологии (например Scrum)
  2. Имеют практические (не только теоретические) знания по выстраиванию технических процессов, будь то процессы написания тестов новых типов, code review, работы CI и т.п.
  3. Умеют оценивать производительность других разработчиков и оформлять это для других менеджеров
  4. Несет ответственность за срыв сроков его командой и умеют выстраивать процессы, чтобы минимизировать повторение ошибок одного типа
  5. Умеет выстраивать процесс найма в свой отдел
  6. Умеют проводить реформации внутри существующих команд (например, при появлении нового проекта внутри компании)
@BatrBadmaev
Copy link

супер!

@komolbek
Copy link

komolbek commented May 30, 2020

Спасибо) До сих пор большинство информации акутально. Разве что требования к Джунам сегодня немного выше.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment