Архив недели @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 имеют сложное строение внутри, поэтому их нужно изменять с осторожностью.
Как быть:
-Включать Thread Sanitizer developer.apple.com/documentation/…
-Использовать примитивы синхронизации, либо попробовать swift.org/blog/swift-ato…, если задача позволяет
-Оставить пометку в доке, что method is not thread safe
-Перепроективать эту часть кода.
Лэйаут вьюх в айосе — это сложно
Следующая проблема — недокументируемые особенности внутрянки некоторых фреймворков. Например, SceneKit developer.apple.com/documentation/…, который в Кошельке используется для того, чтобы красивую и интерактивную карту рисовать.
Для того, чтобы не фризить мейн созданием сцены, последняя обновляется на бэкграунде, но внутри себя SceneKit использует какой-то свой shared state. В некоторый момент времени, если звёзды сойдутся, приложение может упасть из-за этого, даже если изменяются два несвязанные SCScene
Проблему решили линеаризацией операций по обновлению сцен на очереди, которая дергает методы 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 в СПб. Приходите пообщаться!
Всем отличных выходных:)
Тред (Антон Давыдов)
Воскресенье
Тема номер раз: Занимательная многопоточка. Затронем проблемы и разновидности крэшей, с которыми может столкнуться условный программист под iOS при работе с потоками/очередями, и как с этим быть.
Оглавление.
Многопоточка twitter.com/mobileunderhoo…
Тема номер два: Распределенные системы и синхронизация данных. Пытливый читательский ум мог заметить, что можно провести параллель с предыдущей темой, так как есть пересечения по понятиям (транзакции и транзакционная память, консенсус и тд) и проблематике.
Рапределенные системы, оффлайн мод twitter.com/mobileunderhoo…
Тема номер три: Swift. Разработчики новых версий языка очень продуктивны и не собираются останавливаться на достигнутом. Количество сахара, способов написать одну и ту же конструкцию продолжает расти.
Опрос: пользуетесь ли айпадом?
Айпады twitter.com/mobileunderhoo…
Мой CTO Коля @nikolay_ashanin и Engineering Manager Ярослав @Kentilini с помощью бигдаты проанализировали мою твиттерскую активность на неделе и сказали, что я недостаточно рассказал про то, над чем работаю сейчас. Поэтому тред про Swoo swooapp.com
Всем спасибо за неделю! Это был интересный опыт, оставаться на связи можно вот тут @dydus0x14.
Тред (Антон Давыдов)