Pull to refresh
13
0
Максим Юдин @tum0rc0re

Сертифицированный Android-разработчик

Send message

Апи версионирование по-взрослому

Level of difficultyMedium
Reading time8 min
Views7K

Мы все любим пробовать новые инструменты, но ненавидим их поддерживать и обновлять. Это касается всего: операционных систем, приложений, API, пакетов Linux. Больно, когда наш код перестает работать из-за обновления, и вдвойне больно, когда обновление было инициировано не нами.

В разработке API вы рискуете сломать код ваших пользователей с каждым новым обновлением. Если API -- ваш основной продукт, то обновления будут ещё более пугающими.

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

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

Читать далее
Total votes 12: ↑11 and ↓1+14
Comments37

Как устроены аннотации в Kotlin. Часть 1

Level of difficultyMedium
Reading time10 min
Views4.3K

Привет! Сегодня с вами Максим Кругликов из Surf Android Team с переводом статьи про устройство аннотаций в Kotlin и три основных механизма их обработки: процессинг, рефлексию и lint.

Читать дальше
Total votes 4: ↑4 and ↓0+4
Comments0

Как устроены аннотации в Kotlin. Часть 2

Level of difficultyMedium
Reading time10 min
Views2.2K

Привет! Сегодня с вами Максим Кругликов из Surf Android Team, и мы продолжаем статью об аннотациях в Kotlin, в которой рассмотрим кодовую базу Moshi в качестве примера того, как реальная библиотека использует процессинг аннотаций, рефлексию и lint. В первой мы рассказывали об этих трёх механизмах — рекомендуем посмотреть сначала её.

Читать дальше
Total votes 3: ↑2 and ↓1+3
Comments0

Как зарегистрировать Apple Developer в App Store для юридических лиц. Самый подробный гайд 2024 года

Level of difficultyEasy
Reading time5 min
Views6.7K

Из-за санкций зарегистрировать аккаунт разработчика в App Store становится если не наказанием, то как минимум испытанием. Прочитайте эту инструкцию, прежде чем приступить к созданию Apple Developer. Рассказываем про нюансы с регистрацией и оплатой лицензии юридического лица.

Читать далее
Total votes 4: ↑3 and ↓1+4
Comments3

Как создать аудиоплеер. Часть 1. Что под капотом

Level of difficultyMedium
Reading time6 min
Views6.7K

Всем привет! Меня зовут Дмитрий Булгаков, я Android-разработчик в HiFi-стриминге Звук, и я расскажу, как можно создать аудиоплеер в приложении. Поговорим об инструментах разработки и устройстве плеера —  разберем его «анатомию», компоненты и их применение, а также способы улучшения звука с помощью эквалайзера.

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

Поехали!

Читать далее
Total votes 16: ↑13 and ↓3+12
Comments7

Удобный CI/CD доступен каждому

Level of difficultyMedium
Reading time13 min
Views15K

Привет, Хабр! Недавно я выступал на Moscow Python Conf, где делился нашим опытом создания и использования CI/CD пайплайнов. В данной статье я расскажу об этих пайплайнах, раскрою их особенности и покажу, как они помогают нам быстро доставлять код и поддерживать высокий показатель Time To Market. Надеюсь, что наш опыт будет полезен и вам.

Читать далее
Total votes 19: ↑17 and ↓2+19
Comments13

В каких случаях использовать функцию derivedStateOf из Jetpack Compose

Level of difficultyMedium
Reading time4 min
Views7.3K

derivedStateOf { ... }

derivedStateOf - это функция, которая из исходных объектов State формирует производный State. Основной смысл применения функции derivedStateOf - понизить частоту изменения исходного State, тем самым избавиться от ненужных рекомпозиций.

Лямбда-выражение, которое передается в derivedStateOf, выполняется каждый раз, когда изменяется любой из входных объектов State, и результат используется для обновления значения производного State. Важно понимать, что лямбда-выражение будет вызываться повторно только если изменится свойство value объекта State и чтение этого свойства происходит в этой лямбде. Изменение захваченных переменных другого типа не приведет к повторному вызову лямбда-выражения.

У объекта State может читаться свойство value в одной или нескольких compose-функциях. Через объект MutableState можно менять свойство value в callback'ах compose-функций или где-то еще за пределами compose, например во ViewModel'и. Если свойство изменилось, то в процессе построения следующего кадра произойдет рекомпозиция (повторный вызов) тех compose-функций, где это свойство читается. Таким образом частота изменения объекта MutableState определяет частоту рекомпозиций, но не чаще чем системный Frame rate, это примерно 60Hz, то есть 60 раз в секунду. Когда изменится State, Compose обновит UI при построении следующего кадра.

Когда частота изменения State слишком высокая, или другими словами есть некоторая последовательность изменений value State'а, при которой не нужно обновлять UI пускай даже значения разные, а следовательно не нужно совершать рекомпозицию, в этих случаях нужно использовать derivedStateOf. derivedStateOf определяет производный объект State от одного или нескольких других объектов State. Производный State должен обобщать исходные объекты State, то есть исходное множество значений State должно делиться на подмножества, и каждое такое подмножество будет соответствовать значению из производного множества. Изменения исходного State не всегда будут приводить к изменению производного State, таким образом понижается частота рекомпозиций.

Читать далее
Total votes 4: ↑3 and ↓1+3
Comments1

Compose-recompose: почему происходят рекомпозиции и как уменьшить их количество

Reading time17 min
Views14K

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

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

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

Читать далее
Total votes 14: ↑14 and ↓0+14
Comments6

Drag and Drop в Jetpack Compose

Level of difficultyEasy
Reading time5 min
Views2.4K

В январе 2024, крупное обновление Jetpack Compose добавило два новых модификатора: dragAndDropSource и dragAndDropTarget. В этой статье я расскажу как реализовать эффект Drag and Drop в Jetpack Compose.

Читать далее
Total votes 2: ↑2 and ↓0+2
Comments0

Уровень Android API, обратная и прямая совместимость

Reading time7 min
Views72K
Добрый вечер, друзья. Мы подготовили полезный перевод для будущих студентов курса «Android-разработчик. Продвинутый курс». С радостью делимся с вами данным материалом.




Если вы читаете эту статью, значит вас могут интересовать такие вещи, как:

  • Что означает уровень API?
  • Как использовать compileSdkVersion, minSdkVersion или targetSdkVersion?
  • Как можно гарантировать, что приложение будет работать правильно на устройствах с разными версиями ОС?
Читать дальше →
Total votes 16: ↑14 and ↓2+12
Comments1

Погружаемся в работу со скроллом в Jetpack Compose

Reading time8 min
Views16K

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

Какое-то время назад я решил, что надо попробовать Compose в деле и начал делать pet project приложение Хотелки, суть которого в записи своих желаний и возможности делиться списком желаний с помощью любого мессенджера.

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

Читать далее
Total votes 12: ↑12 and ↓0+12
Comments3

SwiftUI уроки (часть 1)

Reading time9 min
Views7.5K

В чём особенность этих уроков?

Основаны на книге "Mastering SwiftUI" от Appcoda: Мы берем за основу материал этой книги, но не слепо следуем ей.

Интерпретация и перевод: Мы адаптируем материал книги для русскоговорящей аудитории, делая его более понятным и удобным для восприятия.

Для начинающих и опытных: Эти уроки подойдут как тем, кто только начинает изучать SwiftUI, так и тем, кто хочет узнать что-то новое об этом фреймворке.

Чего вы можете ожидать?

Пошаговое изучение SwiftUI: Мы будем проходить все основные темы, от простых до сложных.

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

Присоединяйтесь к этой серии!

Читать далее
Total votes 5: ↑5 and ↓0+5
Comments2

SwiftUI уроки (часть 2)

Reading time12 min
Views3.4K

Если вы уже ознакомились с первой частью, то у вас есть базовое понимание что из себя представляет SUI и знаете как отобразить текстовый контент, в этой части давайте познакомимся с элементом отображающим изображения.

Читать далее
Total votes 4: ↑4 and ↓0+4
Comments0

SwiftUI уроки (часть 3)

Reading time15 min
Views3.2K

Ссылка на часть 2

Создаем UI с помощью стеков

Стеки в SUI похожи на стеквью в UIKit. Если комбинировать горизонтальные и вертикальные стеки можно создать комплексный UI для приложения, который будет отлично адаптировать под различные размеры экранов и типы устройств. В UIKit основное средство создания UI — это auto layout который применяется для правильного отображения вьюшек на экране. Зачастую для начинающих разработчиков автолейаут кажется чем‑то очень сложным как для применения так и обучения, так что если вы уже переходите на SUI — есть хорошие новости, автолэйаут вам больше не потребуется. Вы будете оперировать такими компонентами как VStack, HStack, ZStack.

Читать далее
Total votes 4: ↑4 and ↓0+4
Comments1

Про тестирование мобильных приложений. Часть 4. Интеграционное тестирование

Level of difficultyMedium
Reading time8 min
Views3.2K

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

Читать далее
Total votes 3: ↑3 and ↓0+3
Comments2

Про тестирование мобильных приложений. Часть 3. Cквозное (UI, e2e) тестирование

Level of difficultyEasy
Reading time8 min
Views4.7K

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

Читать далее
Total votes 5: ↑4 and ↓1+4
Comments0

Про тестирование мобильных приложений. Часть 2. Unit tests

Reading time13 min
Views6.3K

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

Читать далее
Total votes 3: ↑3 and ↓0+3
Comments16

Про тестирование мобильных приложений. Часть 1. Обзор

Reading time4 min
Views5K

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

Читать далее
Rating0
Comments2

Как катить фичи без релизов. Часть 2: про низкоуровневый Server Driven UI

Level of difficultyMedium
Reading time7 min
Views6.7K

Server Driven UI в Альфа Банке — это низкоуровневый и гибкий подход для реализации динамической отрисовки UI, управляемый с сервера. Если дословно перевести, то SDUI переводится как пользовательский интерфейс (UI), управляемый сервером. На деле так и получается — API сообщает фронту, что и с каким содержимым отображать. 

Например, если дизайнер указал, что цвет фона в UI-компоненте кастомизируется, то SDUI модель для этого компонента должна по умолчанию уметь настраивать цвет с бэкэнда. Аналогично со всеми другими свойствами компонентов: шрифт, размер, форма. 

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

Читать далее
Total votes 27: ↑27 and ↓0+27
Comments15

Как катить фичи без релизов. Часть 1: про виджеты

Level of difficultyMedium
Reading time9 min
Views6.6K

Backend-Driven UI — это подход для динамичного и гибкого пользовательского интерфейса, в которой бэкенд управляет не только данными в приложении, но и его вёрсткой. Сервер посредством API сообщает приложению какие компоненты и с каким контентом отображать. Сегодня многие команды разработки используют Backend Driven UI и мы в Альфе не исключение — помогает быстро выпускать фичи в продакшн.

У нас в Альфе есть несколько подходов к BDUI и про один из них как раз сегодня поговорим, он называется «Виджеты». Независимость, переиспользуемость, уменьшение копипасты, стандартизация UX и без ревью — это всё о них.

Читать далее
Total votes 25: ↑25 and ↓0+25
Comments7
1
23 ...

Information

Rating
Does not participate
Location
Мытищи, Москва и Московская обл., Россия
Registered
Activity

Specialization

Mobile Application Developer
Lead
From 500,000 ₽
Android development
Kotlin
Android SDK
Dagger 2
RxJava 2
Development of mobile applications
Google Firebase
Client-server applications
Material Design
MVVM