iOS Makes Me Hate
3.94K subscribers
1.16K photos
167 videos
15 files
1.33K links
Авторский канал про iOS разработку. Путь продуктовых самураев в MAANG.

Самое больше iOS сообщество практиков: https://boosty.to/lionbond/

Автор: @lvbond Senior iOS Yandex, ex-Avito, VK
Download Telegram
Топ советов для себя в начале пути

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

🟣Нет никаких гайдов.
Когда ты новичок ты думаешь, что твоя работа — это только писать код. Но чем дольше ты в индустрии, тем лучше понимаешь, что код — это только 1/10 эффективного результата.

Никто тебе не скажет в чем проблема и не создаст идеальные условия, где ты получишь идеально расписанную задачу. От инженера ожидается, что он создаст или организует идеальные условия себе сам.

🟣Изучай всё. Наша индустрия развивается быстрее всех. Она создает целые виртуальные вселенные и только находясь внутри нее ты можешь ее чувствовать. Но иногда нужно выходить за границы и смотреть на нее со стороны.

Изучай базу, алгосы, архитектуры. Они отличный фитнес для улучшения кодерских навыков. Вдохновитель на новые идеи. Закрепление старых.

Ты не знаешь что будет актуально через год. Но почти все держится на одном фундаменте и идеях. Единственный путь оставаться актуальным — не прекращать развитие.

🟣Понимай ценности для бизнеса.
Ты — коммерческий разраб. Тебя не нанимают для убыточного прожигания бюджетов бизнеса. Весь твой перфекционизм разбивается об прагматизм. Ты не просто пишешь код — ты создаешь продукт.

Особенно актуален этот навык с развитием ИИ, где все мы перестанем быть кодерами и будем микро-предпринимателями.

🟣Будь частью команды.
Программирование стало командным видом спорта. Эпоха соло кодеров ушла. Большинство проблем, которые мы решаем — это договоренности, сбор требований и понимание потребностей. Ты выигрываешь не когда пишешь самый крутой код, а когда команда выпускает рабочий продукт.

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

🟣Важна практика. На первый взгляд это самый банальный совет, но он находится в дефиците. Вокруг множество пустых каналов с пустым контентом. Накруток опыта. Творческой импотенции. Виртуальной симуляции. Из всего шума в сети почти нет голоса программистов-практиков. Обычных работяг.

В одном из последних ИПР на работе мы с моим руководителем придерживались концепции "80/15/5". Где 80% — это практика на работе, 15% это дополнительное образование и 5% это книги и другие источники образования. Многие лишь повторяют что практика нужна, но их слова или контент — это репосты чужих статей или копирование других идей. А их авторских мыслей или постов с уникальной экспертизой нет. Они лишь повторяют что важна практика, но каждое их действие — это очередная копия.

Мне не хочется идти по этому пути.
Please open Telegram to view this post
VIEW IN TELEGRAM
18
Forwarded from XOR
«Мы ожидаем от всех сотрудников навыков владения нейросетями», — гендиректор Shopify разослал сотрудникам письмо. Кратко о новой реальности:

🟢 Использовать ИИ в работе теперь обязаны все: от рядового менеджера до CEO.

🟢 Навыки промптинга появятся в перформанс-ревью Shopify.

🟢 И прежде чем просить больше сотрудников и ресурсов команды должны ходить доказывать, почему они не могут обойтись помощью ИИ. 😭

Как бы вы отнеслись к такой новой политике в вашей компании?

🔥 — за

💔 — против

@xor_journal
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
52141
🗑 Почему наш подписчик от TCA отказался

По следам прошлого поста получили свежий отзыв от подписчика чата про выпил TCA. @ios_iss_blog решил дать очень ценный и хорошо сформулированный комментарий. Поделился своим опытом использования TCA на большом проекте. И как они от него отказались. 😬

Он обещал написать большую статью на Хабре с детальными примерами. Очень ждем.

У TCA очень много преимуществ, начиная от эргономики, observability и высоким уровнем возможности покрытия тестами

Это все достигается, если использовать главный стор, из которого скоупами ты создаешь чайлд сторы, создавая дерево сторов.

При этом, есть несколько особенностей:

- изменение в любом сторе ведет к вызову всех редьюс методов во всех сторах по всему дереву, почему?

1) Таким образом достигается observability, и в этом и есть смысл TCA

2) Нельзя приватить actions в чайлд сторе, так как это enum, поэтому любой чих в приложении, это редьюс всех сторов

3) Да, в простых приложениях редьюсеры лежат на стэке, и, мол, прогон каждого экшена - ничего страшного, из этого возникают новые проблемы:

i: Переполнение стэка (прям мужицкий краш, из-за которого есть гайды, как перекинуть стэк в кучу в TCA)

ii: По моим замерам на банковском приложений (простом технически, но много флоу и экранов), при открытии глубоко экрана по иерархии с CPU начинается беда, и каждый клик кнопки начинает «ощущаться» физически

iii: Практики начинают создавать мультисторы, когда помимо корневого, то создаешь новые, но связываешь их не через скоуп TCA, а через экшены в конкретном флоу. Это позволяет приватить (логически) экшены, потому что ты их не отправляешь сам, но тут начинает теряться весь смысл TCA

возвращаемся к особенностям:

- Сомнительная работа в рамках Swift Cuncurency:
1) нельзя редьюсер подписать под main actor, и в редьюс методе приходится писать переходы на мейн поток

2) казалось бы, а если бы всю эту жатву вынести в бэкграун поток, таким образом вся бизнес логика будет в бэкграунде (мечта любителей бигтеха?). Если коротко - то нет, редьюсеры чисто на главном потоке, если мы говорим про основное дерево редьюсеров

3) из-за этого нельзя (можно, но больно) создавать редьюсеры для сервисов, чтобы был observability и stability сервисов. Опять же можно, но с главного потока либо прочие костыли. Да и опционально создавать их тоже гемор, с особенностями

возвращаемся к особенностям:

- баги и краши TCA. Если коротко: они есть

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

- Тянешь TCA, значит тянешь 10+ либ, ребята молодцы, но уровень входа в проект растет. Плюс дока и экзамплы оставляют желать лучшего.

Наверняка еще что-то было, и, в целом, мы со всеми недостатками нашли способ работать, но вот когда начало страдать CPU, было началом конца TCA в нашем проекте

Кст выпил TCA очень прост, заменяем редьюсер на VM, редьюс метод на func, а стейт на @Published

Даже половина тестов сразу сохранили

Но у нас банковское приложение относительно простое с точки зрения бизнес логики было, только UI мудреный


Я считаю, что делиться реальным практическим опытом, а не пересказами чужих статей и документаций, преступно нужно.

Слова обычных и честных работяг — важнее некуда, но редкие. Важнее слов менторов, блогеров, коучей и тп. Только у работяг есть реальный опыт и реальные навыки владения инструментами. У остальных они накрученны, неактуальные, пересказанные.

В критике после реального опыта — больше пользы. О ней мало кто скажет, потому что мало кто попробует. А еще меньше соберется сформулировать отзыв. Еще сложнее быть готовым к критике своего мнения, которое не похоже и отличается, на это тоже нужно мужество. Именно поэтому я и ставлю практиков на вершину иерархии и их мнение самое важное в моих приоритетах.
Please open Telegram to view this post
VIEW IN TELEGRAM
189
🧑‍💻 SwiftUI: Подборка лучших задач для изучения часть 1

Уровень: Junior

Собрал топ полезных задач, которые помогут для первых шагов в изучении SwiftUI.

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

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

Кстати, в базе уже есть два авторских роадмапа: общий от комьюнити и роадмап по SwiftUI от разрабов Авито

🧬 Получить материалы вы можете 💰 тут или ⭐️ тут
Please open Telegram to view this post
VIEW IN TELEGRAM
3
🔄 SwiftUI: State and Binding

В прошлых постах мы немного прошлись с критикой REDUX-based архитектур. Их принципиальный недостаток в отличие от WEB — это то, что в мобилке мы сохраняем навигационный стэк. А в WEB архитектуры редакс лучше прижились, тк он не держит в памяти предыдущие экраны. Там вообще нет стэка экранов, а только одна html страница.

В бОльшей степени это связано с binding'ом. Все события предыдущих экранов прослушиваются и измененяются от глобального стора. Из-за ограниченности мобилок с каждым следующим открытым экраном накопление редьюсеров и обсерверов сильно влияет на CPU, батарею и память. Проще говоря, чем глубже дерево открытых экранов — тем больше изменений в приложении.

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

🌀 Вспомним как работает цикл обновления в SwiftUI?
1. Строится View Tree.
2. Создаётся или обновляется Render Tree, которое хранит стейт
3. Изменение стейта
4. Всё повторяется

🧬 На практике SwiftUI самостоятельно следит за изменением и нам почти не нужно об этом думать. Кроме ситуаций, когда у нас проблемы с перфомансом и нужно найти причины. Например, в зависимости от Value или Reference типов мы выбираем property wrapper: @State, @StateObject и @ObservedObject. Подробно я их разбирал тут.

После iOS 17 пришли серьезные изменения — к чертям выпилили ненужный Combine (я сразу говорил что он юзлес).

Вместо этого теперь работает механизм на макросах (@Observable), благодаря чему @StateObject и @ObservedObject стали не обязательны.

Теперь @State можно использовать и для структур, и для объектов.

🍿 Разберем детально в картинках. А в следующих постах разберем когда использовать каждый из них и какие ошибки не стоит допускать.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
134
Demeter — новый инструмент для Android-разработчиков

Это библиотека, которую выложила в опенсорс команда мобильной разработки Яндекса. Она помогает измерять производительность Android-приложений, подробнее можно почитать в статье.

Почему это важно и зачем это в iOS канале?

Ни один инструмент на рынке не умеет сразу анализировать ВСЕ методы в коде. Обычно надо самому указать нужный метод, собрать проект и только потом получить данные. iOS'ерам можно вдохновиться.

Demeter решает эту проблему. Он автоматически показывает, сколько времени занимают методы прямо во время работы приложения и как долго инициализируются зависимости в Dagger. Также Demeter позволяет сделать подсчет количества рекомпозиций в Composable функциях, работать со сторонними библиотеками и писать свои плагины, расширяя функционал под задачи команды.

А в чём польза для бизнеса? Скорость — это деньги. Долгая загрузка экрана = потерянный пользователь. Я об этом писал еще пару лет назад.

Инструмент может работать через модификацию байткода и/или через плагин Kotlin компилятора. По итогу, Demeter помогает понять, какие функции тормозят приложение, показывает, как ведёт себя интерфейс при действиях юзера, генерирует подробные отчёты и позволяет отлавливать проблемы в коде еще до релиза.

Репозиторий на GitHub — тут
75
🧬 SwiftUI: Как работает Observable под капотом

В прошлых постах мы поговорили про State & Binding. А именно что дает нам SwiftUI для отслеживания изменения состояний. Мы определили, что Observable выглядит как самый рабочий вариант на 2025.

Хоть Observable работает только с iOS 17, но нет проблем написать свою реализацию для совместимости с версиями ниже. В интернете полно реализаций как можно сделать свой Observable. Но лучше всего подкапотную логику разобрали в книге "Thinking in SwiftUI". Мы будем много брать оттуда примеров.

Понимание подкапотной логики сильно поможет написать свой бэкпорт и не тащить библиотеки, которые недопустимы для крупных проектов (ну или можно их форкнуть и переписать).

🧬 Что делает @Observable под капотом?
- Ты подписываешь класс под макрос @Observable
- Компилятор превращает его в нужный код
- Когда SwiftUI рендерит body он опрослушивает его через withObservationTracking
- Всё, что ты читаешь в body, становится наблюдаемым.

В итоге. Всё работает автоматически. Без @Published, @ObservedObject, objectWillChange. Наблюдение за объектами стало чище, проще и точнее.

Детальней разберем традиционно на картинках.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
10
Подборки книг для инженеров от разраба Spotify

Пока я в небольшом отпуске перед выходом на новую работу, ищу себя чем занять. Прошел две части Ori (одна из лучших игр ever), посмотрел пару сериалов, походил в бани и зал. Даже с женой посмотрели пару выпусков "Беремена в 16". И узнал что такое мемы про italian brainrot, мой любимый это crocodilo bombardino.

Но пора потихоньку выходить из такого отпуска. Начинать разминать мозг. Вот подборка крутых книг от сеньора иосера и нашего любимого блогера:

🟣Write Great Code: Understanding The Machine (Randall Hyde)
Лучшая альтернатива Танненбауну. Понятное введение в то, как работают современные компьютеры. Книга не перегружена техническими деталями, но помогает глубже понять, что происходит “под капотом”.

🟣*OS Internals Trilogy (Jonathan Levin)
Отдельная рекомендация автора. Подробное руководство по внутреннему устройству платформ Apple. Рекомендуется опытным разработчикам, интересующимся такими темами, как загрузчики и ядра. Книги объемные и не подходят для новичков.

🟣Hacking: The Art of Exploitation
Первая часть книги посвящена C и ассемблеру, что может быть устаревшим. Однако вторая часть предлагает полезное введение в сетевую безопасность и основы реверс-инжиниринга.
Please open Telegram to view this post
VIEW IN TELEGRAM
10
💎 Большая статья SwiftIU: State, Binding, Observable и частые ошибки

Роадмапы и шпаргалки "100 вопросов на собесах в компанию N" — вымерли как формат обучения. EdTech не стоит на месте. Индусы засыпали линкедин топ 1к вопросов, их даже можно посмотреть в наших ресурсах. А чатгпт дает всю базу сразу в лоб.

Рекрутеры ищут самых любопытных. Теперь среди кандидатов выигрывает не тот, кто знает ответ. А тот, кто знает самый полный и глубокий. Чей ресерч был лучше, подходящей и практичней. А мысли сформулированней (Так он лучше промтит 😂)

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

В этой статье я разобрал:
🟣как устроен под капотом State
🟣что такое Binding и как он устроен в кишках
🟣лучшие практики использования State & Observable
🟣И другое

📹 Ну а к концу следующей недели ждите тестовый мини-обучающий видос для самураев. Видео формат — будущее образования?

🧬 Получить материалы вы по подписке 💰 тут или ⭐️ тут
Please open Telegram to view this post
VIEW IN TELEGRAM
5
Разработка стала командным видом спорта

Этот пост глубже чем кажется

Вы часто слышали эти слова. Время соло контрибьюторов почти закончилось. Компании, которые оценивают тебя за импакт в одной платформе, почти вымерли.

Им уже не важно какой крутой код ты пишешь. Какую архитектуру придумываешь. Сколько юнит-тестов напишешь. Какие алгоритмы используешь.

Она оценивает тебя по командному результату. Как ты помогаешь команде и какой результат приносишь. Представь, что ты играешь в футбол. В нем есть 11 игроков. И каким бы ты лучшим нападающим сезона не был, но тебе не дадут призовые, если твоя команда проигрывает. А ты гонишься только за своей выгодой и мешаешь ей. Тебя не похвалят за митапы, доклады и блоги, если твой продукт вымер.

Это большое заблуждение среди разработчиков — тянуть на себя все одеяло. Опыт доты 2 показывает, что тимплей в снг у нас слабый. Мы все хоть раз разбивали шмотки и фидили курьерами когда были новичками. Но адекватное ли это поведение и станешь ли ты most valuable player? Или же наоборот и ты можешь быть самым расфармленным персонажем, но вам снесли трон. Жиза?

Сила команды сейчас решает больше, чем никогда.

Что мы можем тут сделать? Стараться быть MVP и искать крутые команды.

Поэтому я ставлю доверие и тимплей впереди всего. А ложь всегда сыграет команде в убыток. Не играй на себя в командной игре. Не будь единоборцем в процессе, где важны командные усилия.

Ты можешь закрывать и перезакрывать матрицы компетенций, но их вес аннулируется, если продукт или цели команды не будут впечатляющими
186
О важности производительности

Приступая к углубленному изучению SwiftUI я много затрагивал такие вещи как производительность и память. Ведь именно они являются бутылочными горлышками. Инженерный подход к обучению сразу помогает подходить к станку и лучше его изучать на реальных проблемах.

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

Допуская такие серьезные ошибки как запуск приложения после подкачки фичатоглов, что увеличивает время запуска. Избыточную нагрузку на Main Thread. Не следят за расходом батареи и памяти.

Я считаю, что профессионалы высокого уровня должны задумываться об этом почти сразу. Это отличает хорошие решения от плохих. Во многих крупных компаниях даже есть специальные команды Perfomance, которые могут заблокировать раскатку вашей фичи, если вы заметно просадили метрики.

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

🟣Производительность влияет на такие аспекты, как время отклика, энергопотребление, использование сетевых и дисковых ресурсов. Это напрямую влияет на кол-во лидов и лояльность юзеров.

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

🟣Игнорирование производительности может привести к необходимости масштабных переработок в будущем. В прошлой компании даже почти отказались от фреймворка BDUI для WEB, потому что сильно проседал перфоманс.

🟣Разработка с учётом производительности (performance-aware programming) не требует глубоких знаний ассемблера, но помогает принимать обоснованные решения при проектировании и реализации.
Please open Telegram to view this post
VIEW IN TELEGRAM
9
Топ 3 бесячих приложения

Мнение автора может отличаться от вашего*

У меня iPhone 15 Max, но даже с этим устройством некоторые приложения либо долго загружаются, либо подвисает FPS. Что меня дико триггерит.

Этим постом не пытаюсь поставить чью-то компетентность под сомнения, но просто делюсь тем, что дико не нравится.

1. На первом месте меня бесит выдача в hh.ru. Даже на моем не слабом устройстве есть ощущение при скролле, что кадры куда-то теряются. Все обрывисто и дергано

Кстати, есть слух что это сделано на SwiftUI. Апрувните?

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

3. Тут я не знал между чем выбрать: мегамаркет, самокат или Яндекс маркет. Записал видео с мегамаркетом, тк иногда он просто не загружает страницу.

К маркету можно подойти снисходительно, его и так ругают часто (возможно из-за BDUI). А самокат вообще сделан на React Native достойно. Но все же отсутствие плавности, фреймдроп, долгая загрузка на мощных устройствах бросается сильно в глаза

Делитесь своими бесячими моментами
208
Пост мотивации с утра написать про дисциплину

С самого первого дня канала я пишу как фокус и как дисциплина дала мне больше, чем вдохновение и мотивация.

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

Удивлен, что чаще многого и не нужно. Просто придерживаться планов и своим словам.

Банально, мы с женой ходим в зал уже 6 месяцев регулярно. 3 раза в неделю с тренером, в 8 утра. И какого же наше было удивление как сложно найти тренера который дисциплинировано приходит в 8 утра и не переносит под глупыми отговорками. Казалось бы, режим и методичные упражнения лучше всего воспитывают самоконтроль, но нет. Три тренера подряд начали сачковать, хотя красиво стелили и клялись что они "не такие как предыдущий(ая)" и с их стороны не будет пропусков.

Эти тренера сами себе враги. Они потеряли деньги просто потому, что сами пообещали одно, но не смогли выполнить план. Выигрыли те, кто банально просыпается раньше, тверд в своих словах и поступках. У них и клиентов больше, и их ученики добиваются результатов быстрее.

Мотивация заканчивается на третьей тренировки. На десятом посту в блоге. На пятой задаче в литкоде. На двадцатой странице в книге. На третьем спринте на работе.

Также в ит, в блогерстве и тп. Каждый поставит себе цель «попасть в компанию X» или какую-нибудь другую, но его очередная цель внезапно перебилась другой внезапной целью. Забрасывают на старте, или сдуваются. 80% громких обещаний в СМИ тихо умирают, потому что «появились более важные дела». В итоге, ни одно дело до конца не доведено. А воздух сотрясен.

В эти моменты понимаешь всю силу слов «выполняй обещания и умей доводить дело до конца». Ну и более народное «мужик познается верностью слова» 😐

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

В многозадачности дисциплина помогает от инверсии приоритетов и гонки данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
271