iOS Makes Me Hate
4.11K subscribers
1.31K photos
186 videos
24 files
1.44K links
Авторский канал про iOS разработку. Путь продуктовых самураев в MAANG.

Автор: @lvbond Senior iOS Yandex, ex-Avito, VK

Самое большое сообщество практиков: https://boosty.to/lionbond
Download Telegram
Думаем….
256
Кстати, пишу это сообщение с 4к метров

Следующие посты посвящу систем дизайну и вопросу скорости интернета, размерам аудитории и странам с их покрытием

Эта тема супер интересная. Очень часто начинаю замечать запросы на разные скорости
1465
Mobile System Design: Почему важно учитывать размер аудитории

На тренировках по мобильному систем дизайну мы отдельно остановились на вопросе "Почему важно учитывать размер аудитории". Также нам подробно объяснила экс-тимлид Яндекса.

Грубо говоря, это одно из главных требований реального проектирования. Об этом много можно рассуждать, но лучше всего это сформулировано в книгах Mobile System Design и Building Mobile Apps at Scale.

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

Все авторы выделяют такие набухающие блоки:

1️⃣ Один бинарник

Маленькое приложение с небольшой аудиторией может жить даже с херовым кодом. Но при росте аудитории любая ошибка превращается в массовую проблему.

Мобилки не обновляются мгновенно как веб. Если у тебя 500 000 пользователей, у каждого может быть разная версия, и каждая ошибка живет на устройстве долго.

Вывод: глубокое проектирование и четкая система релизов становятся критичными

2️⃣ Чем больше пользователей, тем дороже ошибки

Building Mobile Apps at Scale пишет: с ростом аудитории растет и команда, а значит растет и цена ошибок.

🟣При 100 пользователях: фича может падать 1 раз в сутки, лаги не критичны, можно быстро пофиксить.

🟣При 1 млн пользователей: маленький баг превращается в стихийное бедствие. Ошибочное проектирование хранения данных вызывает коллизии. Плохая работа с сетью может и вообще привести к падению серверов.

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

3️⃣ Масштаб определяет выбор технологий

С ростом аудитории меняются и приоритеты.

Мало пользователей, значит можно выбирать модные технологии.

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

Вывод: системы, работающие на миллионах пользователей, почти всегда строятся на простых, проверенных и надёжных решениях.
Please open Telegram to view this post
VIEW IN TELEGRAM
7
🌐 Mobile System Design: Мобильный интернет и регионы

Продолжаю серию постов про масштабирование. В прошлый раз мы обсуждали размер аудитории, сейчас про кол-во регионов.

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

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

На деле все иначе. При проектировании мобильных приложений важно учитывать особенности сети и регионов, где вы ищете аудиторию. Особенно в больших странах вроде России, где покрытие нестабильное, а часть сервисов регулярно блокируется. Где VPN уже что-то обязательное. Или в странах вроде Пакистана, где средняя скорость мобильного интернета значительно ниже, чем в центре Москвы.

Зачем вообще оценивать скорость интернета?

Вы удивитесь, сколько на самом деле зарабатывают международные продукты. Иногда бывает так, что хорошо известное вам приложение под другим брендом или в виде локального клона в другой стране приносит не меньше, а то и больше денег. И вот вы выходите на новый рынок, а заказчик прямо говорит: "Наш конкурент в Пакистане загружает страницу за 4 секунды. Нам нужно сделать за 2".

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

Tjeerd в Mobile System Design подчеркивает:
мобильные приложения — это работа в условиях постоянно меняющейся сети: Wi-Fi > LTE > EDGE > offline > captive Wi-Fi > обратно.


Это влияет на:
🟣архитектуру кеширования
🟣retry / backoff механизмы
🟣error state UX
🟣периодическую синхронизацию
🟣размер загружаемых пачек данных
🟣выбор форматов данных (JSON vs protobuf)

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

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

Скорость сети системное ограничение, которое меняет архитектуру всего мобильного приложения.
Please open Telegram to view this post
VIEW IN TELEGRAM
176
А этот опыт с нами сейчас в одной комнате? 🥺

⌨️ Загрузите своё резюме и бот оценит его по баллам, отметит слабые места и даст рекомендации.

А ещё сразу после проверки можно скачать гайд «Идеальное резюме» с подсказками по структуре, оформлению и навыкам. Функция доступна до 10 раз на пользователя.
Please open Telegram to view this post
VIEW IN TELEGRAM
111
🔎 Рубрика "Алгоритмы под лупой": SwiftUI Identity vs Value

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

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

🟣Когда знаешь, какой алгоритм стоит за diffing, кешированием или версткой, проще понять, что подойдет для конкретной задачи, а что вызовет проблемы.
🟣Многая магие перестает быть магией
🟣Понимание внутренней кухни помогает не просто "делать, как принято", а осознанно проектировать UI, сеть, кеш, многопоточность.
🟣За каждым лагом стоит конкретный алгоритм: сортировка, диффинг, поиск, компрессия.
🟣На собеседованиях, в архитектуре, в ревью — чем глубже понимаешь механику, тем проще обсуждать решения и объяснять, почему они работают.

По шагам DiffableDataSource решил пройтись упрощенно по Identity. SwiftUI выглядит простым. Меняем состояние и UI апдейтится. Но под капотом работает довольно интересная система сравнения
Она решает два вопроса:
🟡Это тот же элемент интерфейса или новый? Тут идет сравнение View, id, Identifiable, .id
🟡Нужно ли действительно обновлять поддерево View?

Подробнее об этом мы писали несколько постов.

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

Алгоритм Майерса.
Этот алгоритм основа CollectionDifference. Находит минимальную последовательность изменений между двумя массивами.

Алгоритм Пола Хеккеля.
Используется в старом и забытом IGListKit. Помогает эффективно сравнивать большие списки и почему стабильные id — критичны.

Dependency Graph.
Помогает понять как SwiftUI выбирает минимальный набор обновлений. По сути это то, чем является AttributeGraph.

Полезные ссылки:
- репо DifferenceKit
- A fast and flexible O(n) difference algorithm framework for Swift collection
- Modern cell configuration
- Implementing modern collection views
Please open Telegram to view this post
VIEW IN TELEGRAM
2542
Тизер выпуска про аи инструменты на реальном проекте.

Все про AI инжениринг (согласовано с безопасниками)
1115
Еще одна традиция канала — ежегодно делиться итогами в Яндексе музыке. По праву лучшее музыкальное приложение СНГ (а может и мира), но постоянно лежат при релизе итогов.

Хоть я уже ушел окончательно в Apple Music (последний гвоздь был отсутствие ost плейлиста охеренной the Dispatch), но рекомендации в Яндекс.Музыке - лучшие.

Делитесь своими
9
Mobile System Design: Low-connectivity mode. Проблемы покрытия сети и их решения

Определить, что человек работает в СНГ реалиях, очень просто. Стоит только упомянуть про массовые блокировки интернета. На удивление об этом мало кто пишет.

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

Это новая среда выживания. Сначала удаление аппок из стора, отключение GPS, просадки мобильной сети, перебои в LTE. Хотели hardcore mode? Выживание в спартанских условиях.

Это чувствуют таксисты, курьеры, продавцы маркетплейсов. Весь малый и сервисный бизнес. Но он старается адаптироваться. Придумывает обходные механики, внедряет BDUI, работает с вайтлистами, настраивает работу под локальные Wi-Fi точки, добавляет fallback-режимы. Как можно решить такую проблему?

Вот варианты:

1️⃣ Ограничение запросов/ответов

Грузить с сети только критические данные. Так я разок сократил время загрузки контекта в 2 раза, при херовом интернете. Особенно часто на него ругались важные заказчики когда летали в самолетах или были в странах с херовым интернетом. Показывая "а вот в телеграме все лучше!". Эх если бы мне платили столько как в телеграме...

2️⃣ Offline First

Я слышал тот же WB, пока конкуренты делают ставку на BDUI, решил перейти на offline first. Мне честно сложно пока понять логику, но вроде попробовал собрать.

- Когда интернет нестабилен апка кэшируют данные локально
- позволяют работать хотя бы частично офлайн
- синхронизируются при восстановлении сети

Так мы не упускаем юзера, все его поведения сохраняются локально, а отправляется сразу с подключением к нормальной сети (или делится на чанки и постепенно)

3️⃣ Резать медиа файлы

Мы уже отдельно проходили как оптимизирует трафик тот же запретограм. Вкратце:
- Prefetching
- Chuncking
- Размеры под разные соединения

4️⃣ Разделяй критичность и второстпенность

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

Поделитесь своими рекомендациями как выживать в текущем мире.
5
This media is not supported in your browser
VIEW IN TELEGRAM
Конкурс Telegram для iOS-разработичков 2025

Telegram проводит конкурс для iOS-разработчиков, задача которого — внедрить эффекты Liquid Glass в старые версии iOS. Призовой фонд - 50,000 долларов. Срок - до 26 декабря.

Задача

Реализуйте в Telegram для iOS кастомные версии некоторых эффектов Liquid Glass и соответствующие интерфейсные потоки, чтобы эти эффекты работали в iOS 18 и более старых версиях.

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

• Панели вкладок
• Кнопкам
• Переключателям и слайдерам

Поддержка iOS 18 является обязательной. Не допускается использование сторонних фреймворков или новых зависимостей. Изменения не должны негативно влиять на производительность, использование памяти или стабильность приложения.
26
Forwarded from YDC — Pizza Powered iOS (Kirill Smirnov)
🤫 Секреты на клиенте: как снизить вероятность утечки с нуля до почти нуля

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

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

Материал подготовлен по мотивам доклада на Podlodka iOS Crew, посмотреть можно здесь


#L #CS #encryption #obfuscation

👏
Please open Telegram to view this post
VIEW IN TELEGRAM
333
Профилирование и Перфоманс метрики

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

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

Эта система собирает локально метрики из устройств реальных пользователей и отдает серверу. Если перфоманс в АБ тесте упал, то продуктовые эксперименты блокируются к релизам. Так ты четко и ясно понимаешь объективность и не гадаешь упадет ли перф в релизе.

Такую систему мало где видел, поэтому решил изучить открытые third party библиотеки:

1️⃣ Xcode Performance and metrics

Плюсы: Глубокий анализ CPU, памяти, графики в реальном времени; бесплатный и интегрирован в Xcode.
Минусы: Требует подключенного устройства; не для production-мониторинга

2️⃣ MetricKit

Плюсы: MetricKit работает пассивно в продакшене. Уже лучше для релиза
Минусы: Отчеты передаются только раз в сутки

3️⃣ New Relic Mobile

Плюсы: Облачный мониторинг в проде, можно следить за трендами версий и делать сравнения. ​
Минусы: Платный

4️⃣ Firebase Performance

Плюсы: Неплохой базовый бесплатный функционал
Минусы: Мало инструментов

Расскажите какие необычные инструменты для профилирования и метрик юзаете вы? Пишите ли сами или используете готовые решения?
4
Как фиксить AI-генерейтед Swift код

Эту статью уже обсудили и на линкедине, и в тг, и в тв.

Генерация кода с АИ стала новым скиллом. Когда ты раньше точечно и аккуратно писал в ручную небольшой, но выверенный код, то сейчас игра поменялась.

В день ты можешь увидеть десятки вариантов кода и тут из-за объемов — качество может сильно страдать. Нужно переучиваться и адаптироваться. Этот этап говнокодерства должны пройти все, как прошли когда-то с ручным. И возможно, не всем далеко твой код будет нравиться. Даже обученный по текущей кодовой базе проекта.

Еще больше усложняет то, что Swift код от ИИ в разы хуже того же Kotlin'а, Go, Python'а из-за их популярности. В этой статье автор дает лайфхаки как фиксить код от аишек:
- Если проект неправильно настроен на rules, то АИ могут игнорировать общий стиль и правила.
- Проблемы с асинхронностью и управлением потоками. Часто он генерит GCD, чем Swift Councurrency
- АИшки редко думают о корнеркейсах. Здесь их нужно поправлять и давать доп условия.
- Пиши тесты и не стесняйся их использовать

Ну и главное правило — использовать аи как помощника, а не как источник истины.
10