Антон Давыдов

Антон Давыдов

Неделя
Aug 16, 2021 → Aug 22, 2021
Темы

Архив недели @dydus0x14

Понедельник


Всем привет👋 Меня Антоном зовут (@dydus0x14). Программирую iOS приложения Swoo swooapp.com & Кошелёк koshelek.app. Веду канал о разработке в Кошельке t.me/km_engineering, участвую в ПК @MobiusConf

Давеча товарищ @nikitonsky представил чудесный список сложнейших, практически неразрешимых задач в IT t.me/nikitonsky_pub…. Накидайте, пожалуйста, в реплаях свои варианты задач в мобильной разработке и при использовании мобильных устройств.

Вторник


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

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

Заблуждение в Swift состоит в том, что использование структур вместо классов может излечить от всех болезней, а механизм CoW (Copy on Write) разрулит все возможные проблемы при конкурентном обновлении данных.

Пример: конкурентное добавление данных в свифтовый массив. При запуске получим EXC_BAD_ACCESS. Контейнеры данных в Swift имеют сложное строение внутри, поэтому их нужно изменять с осторожностью.
notion image

Как быть: -Включать Thread Sanitizer developer.apple.com/documentation/… -Использовать примитивы синхронизации, либо попробовать swift.org/blog/swift-ato…, если задача позволяет -Оставить пометку в доке, что method is not thread safe -Перепроективать эту часть кода.

Лэйаут вьюх в айосе — это сложно
notion image

Следующая проблема — недокументируемые особенности внутрянки некоторых фреймворков. Например, SceneKit developer.apple.com/documentation/…, который в Кошельке используется для того, чтобы красивую и интерактивную карту рисовать.

Для того, чтобы не фризить мейн созданием сцены, последняя обновляется на бэкграунде, но внутри себя SceneKit использует какой-то свой shared state. В некоторый момент времени, если звёзды сойдутся, приложение может упасть из-за этого, даже если изменяются два несвязанные SCScene
notion image

Проблему решили линеаризацией операций по обновлению сцен на очереди, которая дергает методы SCNSceneRendererDelegate developer.apple.com/documentation/….

Поделитесь плиз с какими проблемами вам приходилось сталкиваться на практике и как решали?

Следующая более очевидная проблема в многопоточке — работа с UIKit объектами не на мейне. Тут, как говорится, есть нюансики. Например, с UIImage без проблем можно работать на background очереди для генерации превьюх как вот тут nshipster.com/image-resizing/.

UIView тоже можно поконфигурировать, но при попытке добавить объект в иерархию вьюх будет немного боли и есть шанс, что получите не просто ворнинг, а приложение упадет (видимо, если будете добавлять в момент лейаута или работы механизма Responder Chaining developer.apple.com/documentation/…)

Внезапная возможная проблема с Objective-C🦕 — декларация @property(atomic) NSMutableArray *array не делает операции добавления/удаления элементов массива thread safe, а только гарантирует корректное чтение и запись непосредственно ссылки на свойство array и работу ARC.

У меня был отличный курс в ЛЭТИ на эту тему в свое время, если хочется покопать тему и изучить типы блокировок (lock-based, lock-free, wait-free), в чем плюсы/минусы спинлока, узнать что такое консенсус/консенсусное число, то рекомендую материалы курса wiki.osll.ru/doku.php/cours….

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

🔥Тред (Антон Давыдов)
@mobileunderhood Недавно был крэшик из-за того, что у меня(в очень редкой специфической ситуации) dispatchGroup.leave() вызывался большее количество раз, чем enter(). Вроде такого stackoverflow.com/questions/3047…
Плюсую, тоже натыкались на такой. twitter.com/algridmd/statu…

Среда


Тема номер два: Распределенные системы и синхронизация данных. Пытливый читательский ум мог заметить, что можно провести параллель с предыдущей темой, так как есть пересечения по понятиям (транзакции и транзакционная память, консенсус и тд) и проблематике.

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

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

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

Для ликбеза рекомендую ознакомиться с курсом лекций от Мартина Клеппмана youtube.com/watch?v=UEAMfL…

Поздравляю, после просмотра у вас в рекомендациях на ютубе появятся видео, как Мартин играет на пианино у себя на канале. Это на случай, если заскучаете.

Мартин очень много сделал для хип-хопа в свои годы и в Россию приезжал несколько лет назад на @hydraconference. Вот выступление youtube.com/watch?v=_odfim…, которое все еще релевантно в вопросах мобильной разработки. В целом на канале гидраконф можно найти и еще полезных выступлений.

🔥Тред (Антон Давыдов)
Тема номер три: Swift. Разработчики новых версий языка очень продуктивны и не собираются останавливаться на достигнутом. Количество сахара, способов написать одну и ту же конструкцию продолжает расти.

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

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

Каждый новый пользовательский класс и структура должны обязательно конформиться протоколу с именем "ИмяКлассаProtocol", иначе будет ошибка компиляции.

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

Комментарии в коде обязательно должны содержать эмодзи и смайлики в конце предложений. Прост чтобы было мило.

В икскод добавить по дефолту темплейт для создания VIPER модуля.

Ключевое слово func пометить как deprecated и заменить на fun

Четверг


Вернемся к текущему состоянию свифта. Поделюсь списком конструкций и решений в дизайне языка, которые считаю спорными. Дисклеймер: как настоящий патриот платформы, считаю правильным критически мыслить и высказываться насчет таких решений 🧵

Проперти врапперы docs.swift.org/swift-book/Lan…. Очень странная конструкция, почему именно такой синтаксис не ясно. Много ограничений. Кроме @UserDefault что-нибудь есть популярное и полезное, без чего не прожить и не решить другими возможностями языка?

🔥Тред (Антон Давыдов)
Опрос: пользуетесь ли айпадом?
🤔 48.0% Пользуюсь
🤔 13.6% Не пользуюсь, но планирую
🤔 38.4% Не пользуюсь, не планирую

Разрабатываете ли приложение для айпада?
🤔 17.1% Да, сделано на сдачу
🤔 13.3% Да, со спец дизайном
🤔 69.5% Нет

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

А что по аксессуарам к айпаду — пенсилы.
🤔 11.0% Пользуюсь Pencil 1 пок.
🤔 30.8% Пользуюсь Pencil 2 пок.
🤔 58.2% Палец лучше!

Аксессуары к айпаду — клавиатуры.
🤔 14.8% iPad Smart Keyboard
🤔 13.0% Любая другая клавиатура
🤔 72.2% Только виртуальная!

Аксессуары к айпаду — манипулятор "мышь"
🤔 5.1% Подключаю мышь
🤔 1.7% Подключаю внешний тачпад
🤔 93.2% Палец лучше!

Пятница


Из последних айпадских приложений меня впечатлило приложение @MuseAppHQ museapp.com

Только посмотрите какой классный у них handbook museapp.com/handbook/

И кстати есть довольно большая статья по поводу истории создания и мотивации принятия тех или иных решений в приложении inkandswitch.com/muse-studio-fo…. Если интересуетесь дизайном продактивити тулов, то будет познавательно

🔥Тред (Антон Давыдов)
Мой CTO Коля @nikolay_ashanin и Engineering Manager Ярослав @Kentilini с помощью бигдаты проанализировали мою твиттерскую активность на неделе и сказали, что я недостаточно рассказал про то, над чем работаю сейчас. Поэтому тред про Swoo swooapp.com

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

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

Swoo — это что-то лёгкое, невесомое, магичное. Наиболее близкие отсылки к названию — это swoosh (проноситься со свистом) или swoon (падать в обморок, но от счастья). Поэтому девиз приложения — All cards in one app. Magically simple!

Сейчас в приложении доступна работа с картами лояльности. В будущем появятся платежная функциональность и крипто-сервисы.

В технической команде 2 iOS, 3 Android, 3 backend и 3 QA специалиста. Есть команда дизайна, data и business аналитиков, продактов. Планируем расширять команду по всем фронтам swooapp.notion.site/swooapp/Career…

Технологический стек: Swift/Obj-C, внедряем SwiftUI, 14 min версия для iOS. Kotlin/Java, внедряем Jetpack Compose, 8 Oreo min версия для Android. Kotlin/Java, AWS на бекенде.

На следующей неделе на iOS Podlodka поделюсь опытом генерации сетевого слоя на основе OpenAPI спеки podlodka.io/ioscrew. Сейчас переводим сетевой слой на этот подход на клиентах плюс смотрим в сторону использования и на бекенде. Поэтому приходите пообщаться на конфу!

Ещё пишу в телеграм канал про разработку t.me/km_engineering

У СТО Коли @nikolay_ashanin тоже есть свой канал t.me/pro_cto, Подписка, лайка, коммент!

А вообще мы уже отдыхаем после трудовых будней в баре Do immigration в СПб. Приходите пообщаться! Всем отличных выходных:)
notion image

🔥Тред (Антон Давыдов)

Воскресенье


Тема номер раз: Занимательная многопоточка. Затронем проблемы и разновидности крэшей, с которыми может столкнуться условный программист под iOS при работе с потоками/очередями, и как с этим быть.
Оглавление. Многопоточка twitter.com/mobileunderhoo…

Тема номер два: Распределенные системы и синхронизация данных. Пытливый читательский ум мог заметить, что можно провести параллель с предыдущей темой, так как есть пересечения по понятиям (транзакции и транзакционная память, консенсус и тд) и проблематике.
Рапределенные системы, оффлайн мод twitter.com/mobileunderhoo…

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

Опрос: пользуетесь ли айпадом?

Мой CTO Коля @nikolay_ashanin и Engineering Manager Ярослав @Kentilini с помощью бигдаты проанализировали мою твиттерскую активность на неделе и сказали, что я недостаточно рассказал про то, над чем работаю сейчас. Поэтому тред про Swoo swooapp.com

Всем спасибо за неделю! Это был интересный опыт, оставаться на связи можно вот тут @dydus0x14.

🔥Тред (Антон Давыдов)

Ссылки