SlideShare une entreprise Scribd logo
1  sur  23
Télécharger pour lire hors ligne
История нескольких
проектов
и что в них пошло не так
Вячеслав Романюк
Немного обо мне
• В мобильной разработке с
2009 года, в разработке
вообще – с 2007

• В Complex Networks
работаю уже 5 лет

• Среди прочих, создали
приложения для двух
музыкальных конференции
с количеством участников в
каждой более 50000
человек в течении двух дней
Что мы обсудим сегодня
• Случай, когда выбранная технология испортила User
Experience и убила проект безвозвратно

• Пример технологии, которую адаптировали слишком
рано, что усложнило дальнейшую разработку

• Пример использования библиотеки ButterKnife,
которая принесла вполне ощутимый вред, но не пользу

• Реальная ситуация с использованием RxAndroid,
которая сделала проект практически
неподдерживаемым
• Проект был написан контакторами как web view с
кодом на основе React.js (React Native был
представлен только в 2015 году)

• Приложение зависало, показывало ошибки по
любому поводу и без него

• В Google Play Market было меньше 5000 активных
пользователей (с учетом крайне агрессивной рекламы
и куче траффика, направлявшегося в магазин), кучи
гневных отзывов и оценка 2.3.
После полного
переписывания кода
• Приложение было переписано полностью на Java

• В течении 6 месяцев после публикации количество
активных установок перевалило за 50.000

• Оценка в Play Market поднялась до 4.2

• Отрицательные комментарии от старой версии
приложения были на столько сильно заплюсованы
аудиторией прошлой версии приложения, что
продолжали показываться как наиболее актуальные
даже при таких показателях
Navigation Architecture
Component
Как должно было быть
Как было большую часть
времени: 400 строк XML кода
ButterKnife
ButterKnife помогает:
• Сделать код визуально чище

• Сгруппировать View в список или массив и применять
ко всем им одни и те же модификации

• Убрать из кода анонимные классы для Listeners и
забыть о findViewByID
Минусы ButterKnife
• По факту, эта библиотека не привносит в проект
ничего полезного, кроме спорного комфорта
разработчика

• Для каждого класса, который использует аннотации
ButterKnife, генерируется отдельный ViewBinder класс
• Соответственно, цена вызова findViewByID сильно
возрастает

• Сгенерированные классы очень быстро суммируются
в размере конечного APK

• В одном из проектов уход от библиотеки уменьшил
размер APK на 1,5 Мб (притом имплементация
ButterKnife занимает всего 17Кб)

• В большинстве случаев публичные поля (как и поля
вообще) для View не нужны, но они необходимы для
корректной работы библиотеки
Плюсы RxAndroid
• Прекрасное решение для реактивной реакции на
результаты запросов или длительных операций в
фоне

• Огромное количество вспомогательных ресурсов и
ответов на StackOverflow

• Позволяет гранулярно работать с результатами
работы запросов/функций, видоизменять их,
объединять с другими такими же результатами
Минусы RxAndroid
• Высокий порог вхождения

• В большинстве случаев 90% функционала библиотеки
не нужно, а потому можно использовать обычные
Callback

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

• В случае отсутствия адекватной документации,
новому члену команды (или новой команде) сложно
поддерживать проект
• Проект, доставшийся от крупной аутсорсинговой компании

• Больше половины кода – код RxAndroid

• Крайне устаревшие версии библиотек

• Сжатые сроки на фикс багов

• Проблема на экране ввода данный для доставки и оплаты
онлайн заказа, логически разделенного по
сворачивающимся блокам

• После завершения ввода данных в каждом из блоков, новая
информация посылается на сервер для уточнения суммы
заказа

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

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

• Перед открытием третьего блока
первый и второй по очереди
вновь разворачиваются и снова
сворачиваются

• Конечная сумма к оплате не
корректна
• Документации у проекта нет

• Есть четыре разных backend-а, на которые делаются
запросы

• Запросы и кастомный парсинг результатов громоздки
и запутаны

• С точки зрения data flow такого поведения быть не
должно, код перехода из состояния в состояние
должны отрабатывать корректно
В чем была проблема:
• На одном из серверов в ответе на один из запросов было
переименовано поле

• Результат запроса не проходил валидацию и из-за настроек
RxAndroid в массив результатов подставлялся последний корректный

• Экран был имплементирован так, что в одно и то же время мог быть
открыть только один раскрывающийся блок

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

• Каждый разворачивающийся блок проверял на корректность только
свою часть массива результатов, которые указывали на то, что нужно
открыть следующий блок
Из-за запутанности кода
RxAndroid и отсутствия
документации на решение
проблемы ушло полторы недели
Спасибо за внимание
• twitter/instagram: @sromanuk

• email: sromanuk@me.com

Contenu connexe

Tendances

Преждевременная оптимизация архитектуры / Евгений Потапов, Антон Баранов (ITS...
Преждевременная оптимизация архитектуры / Евгений Потапов, Антон Баранов (ITS...Преждевременная оптимизация архитектуры / Евгений Потапов, Антон Баранов (ITS...
Преждевременная оптимизация архитектуры / Евгений Потапов, Антон Баранов (ITS...Ontico
 
Порядок для скорости. Система структурирования фронтендовой части веб-приложе...
Порядок для скорости. Система структурирования фронтендовой части веб-приложе...Порядок для скорости. Система структурирования фронтендовой части веб-приложе...
Порядок для скорости. Система структурирования фронтендовой части веб-приложе...Ontico
 
Сервер «Аллодов Онлайн». Архитектура и особенности разработки.
Сервер «Аллодов Онлайн». Архитектура и особенности разработки. Сервер «Аллодов Онлайн». Архитектура и особенности разработки.
Сервер «Аллодов Онлайн». Архитектура и особенности разработки. Андрей Бростовский
 
Страх и ненависть в мире релиз-инжиниринга
Страх и ненависть в мире релиз-инжинирингаСтрах и ненависть в мире релиз-инжиниринга
Страх и ненависть в мире релиз-инжинирингаMikhail Chinkov
 
Как FB, Apple и Google разрушают традиции в компьютерном бизнесе, и почему эт...
Как FB, Apple и Google разрушают традиции в компьютерном бизнесе, и почему эт...Как FB, Apple и Google разрушают традиции в компьютерном бизнесе, и почему эт...
Как FB, Apple и Google разрушают традиции в компьютерном бизнесе, и почему эт...Ontico
 
Компонентная архитектура игровой механики MMORPG.
Компонентная архитектура игровой механики MMORPG.Компонентная архитектура игровой механики MMORPG.
Компонентная архитектура игровой механики MMORPG.Андрей Бростовский
 
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)Ontico
 
Mind map для «Архитектура А/Б тестирования: сделай сам»
Mind map для «Архитектура А/Б тестирования: сделай сам»Mind map для «Архитектура А/Б тестирования: сделай сам»
Mind map для «Архитектура А/Б тестирования: сделай сам»Sergey Xek
 
"Как дешево переделать традиционное веб-приложение в single-page", Максим Пше...
"Как дешево переделать традиционное веб-приложение в single-page", Максим Пше..."Как дешево переделать традиционное веб-приложение в single-page", Максим Пше...
"Как дешево переделать традиционное веб-приложение в single-page", Максим Пше...MoscowJS
 
"Разрушаем .NET мифы" Сергей Калинец
"Разрушаем .NET мифы" Сергей Калинец"Разрушаем .NET мифы" Сергей Калинец
"Разрушаем .NET мифы" Сергей КалинецFwdays
 
"Архитектурный шаблон Reflex - новый подход к разработке клиент-серверных при...
"Архитектурный шаблон Reflex - новый подход к разработке клиент-серверных при..."Архитектурный шаблон Reflex - новый подход к разработке клиент-серверных при...
"Архитектурный шаблон Reflex - новый подход к разработке клиент-серверных при...Fwdays
 
Макс Волошин: Php + shell = ♥
Макс Волошин: Php + shell = ♥Макс Волошин: Php + shell = ♥
Макс Волошин: Php + shell = ♥Oleg Poludnenko
 
сергей спиридонов
сергей спиридоновсергей спиридонов
сергей спиридоновkuchinskaya
 
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25MoscowJS
 
Алексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHPАлексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHPOleg Poludnenko
 
Редактор Mail.ru, или скорочтение за полчаса, Павел Зиновкин (Mail.Ru)
Редактор Mail.ru, или скорочтение за полчаса, Павел Зиновкин (Mail.Ru)Редактор Mail.ru, или скорочтение за полчаса, Павел Зиновкин (Mail.Ru)
Редактор Mail.ru, или скорочтение за полчаса, Павел Зиновкин (Mail.Ru)Ontico
 
Разработка кроссплатформенного фреймворка на С++ для мобильных платформ / Вла...
Разработка кроссплатформенного фреймворка на С++ для мобильных платформ / Вла...Разработка кроссплатформенного фреймворка на С++ для мобильных платформ / Вла...
Разработка кроссплатформенного фреймворка на С++ для мобильных платформ / Вла...Ontico
 
IT Brunch - Backendless
IT Brunch - BackendlessIT Brunch - Backendless
IT Brunch - Backendlessbackendless
 
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...Ontico
 

Tendances (20)

Преждевременная оптимизация архитектуры / Евгений Потапов, Антон Баранов (ITS...
Преждевременная оптимизация архитектуры / Евгений Потапов, Антон Баранов (ITS...Преждевременная оптимизация архитектуры / Евгений Потапов, Антон Баранов (ITS...
Преждевременная оптимизация архитектуры / Евгений Потапов, Антон Баранов (ITS...
 
Порядок для скорости. Система структурирования фронтендовой части веб-приложе...
Порядок для скорости. Система структурирования фронтендовой части веб-приложе...Порядок для скорости. Система структурирования фронтендовой части веб-приложе...
Порядок для скорости. Система структурирования фронтендовой части веб-приложе...
 
Сервер «Аллодов Онлайн». Архитектура и особенности разработки.
Сервер «Аллодов Онлайн». Архитектура и особенности разработки. Сервер «Аллодов Онлайн». Архитектура и особенности разработки.
Сервер «Аллодов Онлайн». Архитектура и особенности разработки.
 
Страх и ненависть в мире релиз-инжиниринга
Страх и ненависть в мире релиз-инжинирингаСтрах и ненависть в мире релиз-инжиниринга
Страх и ненависть в мире релиз-инжиниринга
 
Как FB, Apple и Google разрушают традиции в компьютерном бизнесе, и почему эт...
Как FB, Apple и Google разрушают традиции в компьютерном бизнесе, и почему эт...Как FB, Apple и Google разрушают традиции в компьютерном бизнесе, и почему эт...
Как FB, Apple и Google разрушают традиции в компьютерном бизнесе, и почему эт...
 
Компонентная архитектура игровой механики MMORPG.
Компонентная архитектура игровой механики MMORPG.Компонентная архитектура игровой механики MMORPG.
Компонентная архитектура игровой механики MMORPG.
 
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)
Цикл разработки и внедрения функционала в Мамбе (Михаил Буйлов)
 
Mind map для «Архитектура А/Б тестирования: сделай сам»
Mind map для «Архитектура А/Б тестирования: сделай сам»Mind map для «Архитектура А/Б тестирования: сделай сам»
Mind map для «Архитектура А/Б тестирования: сделай сам»
 
"Как дешево переделать традиционное веб-приложение в single-page", Максим Пше...
"Как дешево переделать традиционное веб-приложение в single-page", Максим Пше..."Как дешево переделать традиционное веб-приложение в single-page", Максим Пше...
"Как дешево переделать традиционное веб-приложение в single-page", Максим Пше...
 
"Разрушаем .NET мифы" Сергей Калинец
"Разрушаем .NET мифы" Сергей Калинец"Разрушаем .NET мифы" Сергей Калинец
"Разрушаем .NET мифы" Сергей Калинец
 
"Архитектурный шаблон Reflex - новый подход к разработке клиент-серверных при...
"Архитектурный шаблон Reflex - новый подход к разработке клиент-серверных при..."Архитектурный шаблон Reflex - новый подход к разработке клиент-серверных при...
"Архитектурный шаблон Reflex - новый подход к разработке клиент-серверных при...
 
CQRS innovations
CQRS innovationsCQRS innovations
CQRS innovations
 
Макс Волошин: Php + shell = ♥
Макс Волошин: Php + shell = ♥Макс Волошин: Php + shell = ♥
Макс Волошин: Php + shell = ♥
 
сергей спиридонов
сергей спиридоновсергей спиридонов
сергей спиридонов
 
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
 
Алексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHPАлексей Иванкин: Highload + PHP
Алексей Иванкин: Highload + PHP
 
Редактор Mail.ru, или скорочтение за полчаса, Павел Зиновкин (Mail.Ru)
Редактор Mail.ru, или скорочтение за полчаса, Павел Зиновкин (Mail.Ru)Редактор Mail.ru, или скорочтение за полчаса, Павел Зиновкин (Mail.Ru)
Редактор Mail.ru, или скорочтение за полчаса, Павел Зиновкин (Mail.Ru)
 
Разработка кроссплатформенного фреймворка на С++ для мобильных платформ / Вла...
Разработка кроссплатформенного фреймворка на С++ для мобильных платформ / Вла...Разработка кроссплатформенного фреймворка на С++ для мобильных платформ / Вла...
Разработка кроссплатформенного фреймворка на С++ для мобильных платформ / Вла...
 
IT Brunch - Backendless
IT Brunch - BackendlessIT Brunch - Backendless
IT Brunch - Backendless
 
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
Практическая реализация распределенного отказоустойчивого Comet сервера на Er...
 

Similaire à Історія декількох проектів та що в них пішло не так - UA Mobile 2019

Микросервисный фронтенд
Микросервисный фронтендМикросервисный фронтенд
Микросервисный фронтендViacheslav Slinko
 
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)Ontico
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только одинHappyDev
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Ontico
 
Лучшие практики корпоративной разработки. Лекция 0: обзор курса.
Лучшие практики корпоративной разработки. Лекция 0: обзор курса.Лучшие практики корпоративной разработки. Лекция 0: обзор курса.
Лучшие практики корпоративной разработки. Лекция 0: обзор курса.Vadim Martynov
 
Лучшие практики на практике
Лучшие практики на практикеЛучшие практики на практике
Лучшие практики на практикеDenis Tuchin
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyAlex Chistyakov
 
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)Ontico
 
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON
 
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Ontico
 
История проекта, который никогда не падает / Андрей Шетухин
История проекта, который никогда не падает / Андрей ШетухинИстория проекта, который никогда не падает / Андрей Шетухин
История проекта, который никогда не падает / Андрей ШетухинOntico
 
Хорошо поддерживаемое приложение
Хорошо поддерживаемое приложениеХорошо поддерживаемое приложение
Хорошо поддерживаемое приложениеNikolay Sivko
 
Какой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковКакой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковAlex Tumanoff
 
ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production
ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с ProductionThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production
ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с ProductionVladimir Malinin
 
SECON'2016. Алексеев Олег, Живой API
SECON'2016. Алексеев Олег, Живой APISECON'2016. Алексеев Олег, Живой API
SECON'2016. Алексеев Олег, Живой APISECON
 
Wargaming.net: Архитектура современных 3D движков
Wargaming.net: Архитектура современных 3D движковWargaming.net: Архитектура современных 3D движков
Wargaming.net: Архитектура современных 3D движковDevGAMM Conference
 
Изоморфные react-приложения
Изоморфные react-приложенияИзоморфные react-приложения
Изоморфные react-приложенияDenis Izmaylov
 

Similaire à Історія декількох проектів та що в них пішло не так - UA Mobile 2019 (20)

Микросервисный фронтенд
Микросервисный фронтендМикросервисный фронтенд
Микросервисный фронтенд
 
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
Микросервисный фронтенд / Вячеслав Слинько (ЦИАН)
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
 
Лучшие практики корпоративной разработки. Лекция 0: обзор курса.
Лучшие практики корпоративной разработки. Лекция 0: обзор курса.Лучшие практики корпоративной разработки. Лекция 0: обзор курса.
Лучшие практики корпоративной разработки. Лекция 0: обзор курса.
 
Лучшие практики на практике
Лучшие практики на практикеЛучшие практики на практике
Лучшие практики на практике
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на Ruby
 
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
Прогрессивный рендеринг и Catberry.js / Михаил Реенко (2GIS / Flamp)
 
Sivko
SivkoSivko
Sivko
 
YaC 2013 Notes
YaC 2013 NotesYaC 2013 Notes
YaC 2013 Notes
 
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
 
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
 
История проекта, который никогда не падает / Андрей Шетухин
История проекта, который никогда не падает / Андрей ШетухинИстория проекта, который никогда не падает / Андрей Шетухин
История проекта, который никогда не падает / Андрей Шетухин
 
Хорошо поддерживаемое приложение
Хорошо поддерживаемое приложениеХорошо поддерживаемое приложение
Хорошо поддерживаемое приложение
 
Какой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковКакой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис Цыплаков
 
ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production
ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с ProductionThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production
ThinkJavaKharkiv#1 Шеф, все пропало. Проблемы с Production
 
SECON'2016. Алексеев Олег, Живой API
SECON'2016. Алексеев Олег, Живой APISECON'2016. Алексеев Олег, Живой API
SECON'2016. Алексеев Олег, Живой API
 
Wargaming.net: Архитектура современных 3D движков
Wargaming.net: Архитектура современных 3D движковWargaming.net: Архитектура современных 3D движков
Wargaming.net: Архитектура современных 3D движков
 
Изоморфные react-приложения
Изоморфные react-приложенияИзоморфные react-приложения
Изоморфные react-приложения
 

Plus de UA Mobile

Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...UA Mobile
 
Декларативное программирование клиент-серверных приложений на андроид - UA Mo...
Декларативное программирование клиент-серверных приложений на андроид - UA Mo...Декларативное программирование клиент-серверных приложений на андроид - UA Mo...
Декларативное программирование клиент-серверных приложений на андроид - UA Mo...UA Mobile
 
Leave your Room behind - UA Mobile 2019
Leave your Room behind - UA Mobile 2019Leave your Room behind - UA Mobile 2019
Leave your Room behind - UA Mobile 2019UA Mobile
 
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019UA Mobile
 
Google Wear OS watch faces and applications development - UA Mobile 2019
Google Wear OS watch faces and applications development - UA Mobile 2019Google Wear OS watch faces and applications development - UA Mobile 2019
Google Wear OS watch faces and applications development - UA Mobile 2019UA Mobile
 
Working effectively with ViewModels and TDD - UA Mobile 2019
Working effectively with ViewModels and TDD - UA Mobile 2019Working effectively with ViewModels and TDD - UA Mobile 2019
Working effectively with ViewModels and TDD - UA Mobile 2019UA Mobile
 
Managing State in Reactive applications - UA Mobile 2019
Managing State in Reactive applications - UA Mobile 2019Managing State in Reactive applications - UA Mobile 2019
Managing State in Reactive applications - UA Mobile 2019UA Mobile
 
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019UA Mobile
 
Актуальні практики дизайну мобільних додатків - UA Mobile 2019
Актуальні практики дизайну мобільних додатків - UA Mobile 2019Актуальні практики дизайну мобільних додатків - UA Mobile 2019
Актуальні практики дизайну мобільних додатків - UA Mobile 2019UA Mobile
 
До чого прикладати Docker в Android? - UA Mobile 2019
До чого прикладати Docker в Android? - UA Mobile 2019До чого прикладати Docker в Android? - UA Mobile 2019
До чого прикладати Docker в Android? - UA Mobile 2019UA Mobile
 
Building your Flutter apps using Redux - UA Mobile 2019
Building your Flutter apps using Redux - UA Mobile 2019Building your Flutter apps using Redux - UA Mobile 2019
Building your Flutter apps using Redux - UA Mobile 2019UA Mobile
 
Optional. Tips and Tricks - UA Mobile 2019
Optional. Tips and Tricks - UA Mobile 2019Optional. Tips and Tricks - UA Mobile 2019
Optional. Tips and Tricks - UA Mobile 2019UA Mobile
 
Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...UA Mobile
 
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019UA Mobile
 
Flutter: No more boring apps! - UA Mobile 2019
Flutter: No more boring apps! - UA Mobile 2019Flutter: No more boring apps! - UA Mobile 2019
Flutter: No more boring apps! - UA Mobile 2019UA Mobile
 
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019UA Mobile
 
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019UA Mobile
 
Sceneform SDK на практиці - UA Mobile 2019
Sceneform SDK на практиці - UA Mobile 2019Sceneform SDK на практиці - UA Mobile 2019
Sceneform SDK на практиці - UA Mobile 2019UA Mobile
 
Coroutines in Kotlin. UA Mobile 2017.
Coroutines in Kotlin. UA Mobile 2017.Coroutines in Kotlin. UA Mobile 2017.
Coroutines in Kotlin. UA Mobile 2017.UA Mobile
 
Augmented reality on Android. UA Mobile 2017.
Augmented reality on Android. UA Mobile 2017.Augmented reality on Android. UA Mobile 2017.
Augmented reality on Android. UA Mobile 2017.UA Mobile
 

Plus de UA Mobile (20)

Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...
 
Декларативное программирование клиент-серверных приложений на андроид - UA Mo...
Декларативное программирование клиент-серверных приложений на андроид - UA Mo...Декларативное программирование клиент-серверных приложений на андроид - UA Mo...
Декларативное программирование клиент-серверных приложений на андроид - UA Mo...
 
Leave your Room behind - UA Mobile 2019
Leave your Room behind - UA Mobile 2019Leave your Room behind - UA Mobile 2019
Leave your Room behind - UA Mobile 2019
 
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
OpenId and OAuth2: Rear, Medium, Well Done - UA Mobile 2019
 
Google Wear OS watch faces and applications development - UA Mobile 2019
Google Wear OS watch faces and applications development - UA Mobile 2019Google Wear OS watch faces and applications development - UA Mobile 2019
Google Wear OS watch faces and applications development - UA Mobile 2019
 
Working effectively with ViewModels and TDD - UA Mobile 2019
Working effectively with ViewModels and TDD - UA Mobile 2019Working effectively with ViewModels and TDD - UA Mobile 2019
Working effectively with ViewModels and TDD - UA Mobile 2019
 
Managing State in Reactive applications - UA Mobile 2019
Managing State in Reactive applications - UA Mobile 2019Managing State in Reactive applications - UA Mobile 2019
Managing State in Reactive applications - UA Mobile 2019
 
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
Ідіоматична ін'єкція залежностей на Kotlin без фреймворків - UA Mobile2019
 
Актуальні практики дизайну мобільних додатків - UA Mobile 2019
Актуальні практики дизайну мобільних додатків - UA Mobile 2019Актуальні практики дизайну мобільних додатків - UA Mobile 2019
Актуальні практики дизайну мобільних додатків - UA Mobile 2019
 
До чого прикладати Docker в Android? - UA Mobile 2019
До чого прикладати Docker в Android? - UA Mobile 2019До чого прикладати Docker в Android? - UA Mobile 2019
До чого прикладати Docker в Android? - UA Mobile 2019
 
Building your Flutter apps using Redux - UA Mobile 2019
Building your Flutter apps using Redux - UA Mobile 2019Building your Flutter apps using Redux - UA Mobile 2019
Building your Flutter apps using Redux - UA Mobile 2019
 
Optional. Tips and Tricks - UA Mobile 2019
Optional. Tips and Tricks - UA Mobile 2019Optional. Tips and Tricks - UA Mobile 2019
Optional. Tips and Tricks - UA Mobile 2019
 
Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...Designing iOS+Android project without using multiplatform frameworks - UA Mob...
Designing iOS+Android project without using multiplatform frameworks - UA Mob...
 
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
Бібліотеки та Інструменти на сторожі коду - UA Mobile 2019
 
Flutter: No more boring apps! - UA Mobile 2019
Flutter: No more boring apps! - UA Mobile 2019Flutter: No more boring apps! - UA Mobile 2019
Flutter: No more boring apps! - UA Mobile 2019
 
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
Долаючи прірву між дизайнерами та розробниками - UA Mobile 2019
 
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
Multiplatform shared codebase with Kotlin/Native - UA Mobile 2019
 
Sceneform SDK на практиці - UA Mobile 2019
Sceneform SDK на практиці - UA Mobile 2019Sceneform SDK на практиці - UA Mobile 2019
Sceneform SDK на практиці - UA Mobile 2019
 
Coroutines in Kotlin. UA Mobile 2017.
Coroutines in Kotlin. UA Mobile 2017.Coroutines in Kotlin. UA Mobile 2017.
Coroutines in Kotlin. UA Mobile 2017.
 
Augmented reality on Android. UA Mobile 2017.
Augmented reality on Android. UA Mobile 2017.Augmented reality on Android. UA Mobile 2017.
Augmented reality on Android. UA Mobile 2017.
 

Історія декількох проектів та що в них пішло не так - UA Mobile 2019

  • 1. История нескольких проектов и что в них пошло не так Вячеслав Романюк
  • 2. Немного обо мне • В мобильной разработке с 2009 года, в разработке вообще – с 2007 • В Complex Networks работаю уже 5 лет • Среди прочих, создали приложения для двух музыкальных конференции с количеством участников в каждой более 50000 человек в течении двух дней
  • 3. Что мы обсудим сегодня • Случай, когда выбранная технология испортила User Experience и убила проект безвозвратно • Пример технологии, которую адаптировали слишком рано, что усложнило дальнейшую разработку • Пример использования библиотеки ButterKnife, которая принесла вполне ощутимый вред, но не пользу • Реальная ситуация с использованием RxAndroid, которая сделала проект практически неподдерживаемым
  • 4. • Проект был написан контакторами как web view с кодом на основе React.js (React Native был представлен только в 2015 году) • Приложение зависало, показывало ошибки по любому поводу и без него • В Google Play Market было меньше 5000 активных пользователей (с учетом крайне агрессивной рекламы и куче траффика, направлявшегося в магазин), кучи гневных отзывов и оценка 2.3.
  • 5. После полного переписывания кода • Приложение было переписано полностью на Java • В течении 6 месяцев после публикации количество активных установок перевалило за 50.000 • Оценка в Play Market поднялась до 4.2 • Отрицательные комментарии от старой версии приложения были на столько сильно заплюсованы аудиторией прошлой версии приложения, что продолжали показываться как наиболее актуальные даже при таких показателях
  • 6.
  • 9. Как было большую часть времени: 400 строк XML кода
  • 11. ButterKnife помогает: • Сделать код визуально чище • Сгруппировать View в список или массив и применять ко всем им одни и те же модификации • Убрать из кода анонимные классы для Listeners и забыть о findViewByID
  • 12. Минусы ButterKnife • По факту, эта библиотека не привносит в проект ничего полезного, кроме спорного комфорта разработчика • Для каждого класса, который использует аннотации ButterKnife, генерируется отдельный ViewBinder класс
  • 13.
  • 14.
  • 15. • Соответственно, цена вызова findViewByID сильно возрастает • Сгенерированные классы очень быстро суммируются в размере конечного APK • В одном из проектов уход от библиотеки уменьшил размер APK на 1,5 Мб (притом имплементация ButterKnife занимает всего 17Кб) • В большинстве случаев публичные поля (как и поля вообще) для View не нужны, но они необходимы для корректной работы библиотеки
  • 16. Плюсы RxAndroid • Прекрасное решение для реактивной реакции на результаты запросов или длительных операций в фоне • Огромное количество вспомогательных ресурсов и ответов на StackOverflow • Позволяет гранулярно работать с результатами работы запросов/функций, видоизменять их, объединять с другими такими же результатами
  • 17. Минусы RxAndroid • Высокий порог вхождения • В большинстве случаев 90% функционала библиотеки не нужно, а потому можно использовать обычные Callback • Огромное количество кода, необходимого для настройки и правильной обработки результатов • В случае отсутствия адекватной документации, новому члену команды (или новой команде) сложно поддерживать проект
  • 18. • Проект, доставшийся от крупной аутсорсинговой компании • Больше половины кода – код RxAndroid • Крайне устаревшие версии библиотек • Сжатые сроки на фикс багов • Проблема на экране ввода данный для доставки и оплаты онлайн заказа, логически разделенного по сворачивающимся блокам • После завершения ввода данных в каждом из блоков, новая информация посылается на сервер для уточнения суммы заказа • Текущий блок сворачивается автоматически, а следующий таким же образом разворачивается
  • 19. Суть проблемы • После завершения ввода данных в первом блоке данные отправляются на сервер, первый блок сворачивается и открывается второй • После завершения ввода данных во втором блоке происходит то же самое • Перед открытием третьего блока первый и второй по очереди вновь разворачиваются и снова сворачиваются • Конечная сумма к оплате не корректна
  • 20. • Документации у проекта нет • Есть четыре разных backend-а, на которые делаются запросы • Запросы и кастомный парсинг результатов громоздки и запутаны • С точки зрения data flow такого поведения быть не должно, код перехода из состояния в состояние должны отрабатывать корректно
  • 21. В чем была проблема: • На одном из серверов в ответе на один из запросов было переименовано поле • Результат запроса не проходил валидацию и из-за настроек RxAndroid в массив результатов подставлялся последний корректный • Экран был имплементирован так, что в одно и то же время мог быть открыть только один раскрывающийся блок • Триггером для открытия первого блока было как раз отсутствие переименованного поля • Каждый разворачивающийся блок проверял на корректность только свою часть массива результатов, которые указывали на то, что нужно открыть следующий блок
  • 22. Из-за запутанности кода RxAndroid и отсутствия документации на решение проблемы ушло полторы недели
  • 23. Спасибо за внимание • twitter/instagram: @sromanuk • email: sromanuk@me.com