Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Джедайские приемы в разработке

MOSDROID
August 25, 2018

Джедайские приемы в разработке

Сергей Митрофанов, Cargopull – MOSDROID 10 #NEON

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

MOSDROID

August 25, 2018
Tweet

More Decks by MOSDROID

Other Decks in Programming

Transcript

  1. Вне темы • Детали архитектуры UI (MVP, MVVM, MVI и

    др. MV*)
 • Технологии и библиотеки (Rx, LiveData, Architecture Components и др.)
 • Подходы в построении UI и навигации (активити, фрагменты, Conductor и пр.)
  2. По теме • Убийцы идеального кода
 • Планы написания кода


    • «Дежурный» план для идеального кода
 • «Джедайский» план для идеального кода
  3. Идеальный код • Запускается и работает без багов
 • Понятный

    чистый
 • Четкая архитектура
 • Покрыт тестами
  4. Идеальный код • Запускается и работает без багов
 • Понятный

    чистый
 • Четкая архитектура
 • Покрыт тестами
 • Документирован
  5. Убийцы идеального кода • Произвол в требованиях (к фичам)
 


    • Избыток полномочий
 (и ответственности в коде)
  6. Убийцы идеального кода • Произвол в требованиях (к фичам)
 


    • Избыток полномочий
 (и ответственности в коде)
  7. Что попало под рефакторинг View карты View шторки представление карты

    Представление шторки Бизнес-логика карты Бизнес-логика шторки Data source карты Data sourceшторки
  8. Что попало под рефакторинг View карты View шторки представление карты

    Представление шторки Бизнес-логика карты Бизнес-логика шторки Data source карты Data sourceшторки
  9. Что попало под рефакторинг View карты View шторки представление карты

    Представление шторки Бизнес-логика карты Бизнес-логика шторки Data source карты Data sourceшторки
  10. Что попало под рефакторинг View карты View шторки представление карты

    Представление шторки Бизнес-логика карты Бизнес-логика шторки Data source карты Data sourceшторки
  11. Что попало под рефакторинг View карты View шторки представление карты

    Представление шторки Бизнес-логика карты Бизнес-логика шторки Data source карты Data sourceшторки
  12. Что попало под рефакторинг View карты View шторки представление карты

    Представление шторки Бизнес-логика карты Бизнес-логика шторки Data source карты Data sourceшторки
  13. Что попало под рефакторинг View карты View шторки представление карты

    Представление шторки Бизнес-логика карты Бизнес-логика шторки Data source карты Data sourceшторки
  14. Что попало под рефакторинг View карты View шторки представление карты

    Представление шторки Бизнес-логика карты Бизнес-логика шторки Data source карты Data sourceшторки
  15. Что попало под рефакторинг View карты View шторки представление карты

    Представление шторки Бизнес-логика карты Бизнес-логика шторки Data source карты Data sourceшторки
  16. Дежурный план 1.Изучаем ТЗ
 2.Пишем (одноразовый) код
 3.Если код готов

    для staging, его можно покрыть тестами
 [зависит от соглашений в команде]
  17. Дежурный план 1.Изучаем ТЗ
 2.Пишем (одноразовый) код
 3.Если код готов

    для staging, его можно покрыть тестами
 4.Если код выжил после релиза, планируем его рефакторинг в backlog
  18. Дежурный план 1.Изучаем ТЗ
 2.Пишем (одноразовый) код
 3.Если код готов

    для staging, его можно покрыть тестами
 4.Если код выжил после релиза, планируем его рефакторинг в backlog
 5.После этого код можно документировать ?
  19. 1.Изучаем ТЗ
 2.Пишем (одноразовый) код
 3.Если код готов для staging,

    его можно покрыть тестами
 4.Если код выжил после релиза, планируем его рефакторинг в backlog
 5.После этого код можно документировать Дежурный план
  20. Дежурные минусы Множество багов по недосмотру
 Долгие проверки работы кода

    на устройстве
 Поддержка и изменения отнимают много сил и времени
 [Улыбаемся, и отлаживаем]
  21. Дежурные минусы Множество багов по недосмотру
 Долгие проверки работы кода

    на устройстве
 Поддержка и изменения отнимают много сил и времени
 Копятся технические долги
 [тесты, рефакторинг, документирование]
  22. 1.Изучаем ТЗ
 2.Пишем (одноразовый) код
 3.Если код готов для staging,

    его можно покрыть тестами
 4.Если код выжил после релиза, планируем его рефакторинг в backlog
 5.После этого код можно документировать Дежурный план
  23. 1.Изучаем ТЗ
 2.Пишем (одноразовый) код
 3.Если код готов для staging,

    его можно покрыть тестами
 4.Если код выжил после релиза, планируем его рефакторинг в backlog
 5.После этого код можно документировать Дежурный план
  24. 1.Изучаем ТЗ
 2.Пишем (одноразовый) код
 3.Если код готов для staging,

    его можно покрыть тестами
 4.Если код выжил после релиза, планируем его рефакторинг в backlog
 5.После этого код можно документировать Дежурный план 
 Долгий ящик
 ? ?
  25. Джедайский план 1.Ознакомиться и уточнить тест-кейсы и ТЗ
 2.Максимально разграничить

    ответственность
 3.Описать бизнес-объекты и контракты компонентов
 4.Написать юнит-тесты
 5.Написать код
 6.Тюнинг-полировка кода
  26. Ознакомление и уточнение ТЗ и тест-кейсов • Полностью ознакомиться с

    ТЗ и тест-кейсами • Выявить неоднозначности и ограничения
 [сеть, заряд, разрешения] • Разрешить неоднозначности вместе с Продактом, дизайнером и командой • Зафиксировать результат письменно
  27. Джедайский план 1.Ознакомиться и уточнить тест-кейсы и ТЗ
 2.Максимально разграничить

    ответственность
 3.Описать бизнес-объекты и контракты компонентов
 4.Написать юнит-тесты
 5.Написать код
 6.Тюнинг-полировка кода
  28. Максимальный SRP
 View карты View шторки Маршрут Маршрут Маршрут Таймер

    Таймер Таймер «Отмена» «Отмена» «Отмена» «Где я?» «Где я?» «Где я?» Машина Машина Машина «Открыть» «Открыть» «Открыть» «Моргать» «Моргать» «Моргать» «Прогреть» «Прогреть» «Прогреть» «Звонок» «Звонок» «Звонок» Представление Бизнес-логика Data-source
  29. View карты View шторки Маршрут Маршрут Маршрут Таймер Таймер Таймер

    «Отмена» «Отмена» «Отмена» «Где я?» «Где я?» «Где я?» Машина Машина Машина «Открыть» «Открыть» «Открыть» «Моргать» «Моргать» «Моргать» «Прогреть» «Прогреть» «Прогреть» «Звонок» «Звонок» «Звонок» Представление Бизнес-логика Data-source Что попало под рефакторинг
  30. View карты View шторки Маршрут Маршрут Маршрут Таймер Таймер Таймер

    «Отмена» «Отмена» «Отмена» «Где я?» «Где я?» «Где я?» Машина Машина Машина «Открыть» «Открыть» «Открыть» «Моргать» «Моргать» «Моргать» «Прогреть» «Прогреть» «Прогреть» «Звонок» «Звонок» «Звонок» Представление Бизнес-логика Data-source Что попало под рефакторинг
  31. View карты View шторки Маршрут Маршрут Маршрут Таймер Таймер Таймер

    «Отмена» «Отмена» «Отмена» «Где я?» «Где я?» «Где я?» Машина Машина Машина «Открыть» «Открыть» «Открыть» «Прогреть» «Прогреть» «Прогреть» «Звонок» «Звонок» «Звонок» Представление Бизнес-логика Data-source «Моргать» «Моргать» «Моргать» «Хитрый план»
  32. View карты View шторки Маршрут Маршрут Маршрут Таймер Таймер Таймер

    «Отмена» «Отмена» «Отмена» «Где я?» «Где я?» «Где я?» Машина Машина Машина «Открыть» «Открыть» «Открыть» «Прогреть» «Прогреть» «Прогреть» «Звонок» «Звонок» «Звонок» Представление Бизнес-логика Data-source «Хитрый план» «Моргать» «Моргать» «Моргать»
  33. View карты View шторки Маршрут Маршрут Маршрут Таймер Таймер Таймер

    «Отмена» «Отмена» «Отмена» «Где я?» «Где я?» «Где я?» Машина Машина Машина «Открыть» «Открыть» «Открыть» «Прогреть» «Прогреть» «Прогреть» «Звонок» «Звонок» «Звонок» Представление Бизнес-логика Data-source Ловкость рук и никакого… «Моргать» «Моргать» «Моргать»
  34. Джедайский план 1.Ознакомиться и уточнить тест-кейсы и ТЗ
 2.Максимально разграничить

    ответственность
 3.Описать бизнес-объекты и контракты компонентов
 4.Написать юнит-тесты
 5.Написать код
 6.Тюнинг-полировка кода
  35. Контракты (интерфейсы) есть везде • Любые публичные методы и поля

    классов
 • Для бизнес-объектов java-интерфейсы не обязательны
 • Помогают зафиксировать абстрактную архитектуру
 • Их нужно документировать
  36. Бизнес-объект с документацией Это просто /** * Неизменная бизнес сущность

    геопозиции. Содержит в себе долготу, широту * и временной штамп своего получения. */ public class GeoLocation { private final double latitude; private final double longitude; private final long timestamp; public GeoLocation(double latitude, double longitude, long timestamp) { this.latitude = latitude; this.longitude = longitude; this.timestamp = timestamp; } public double getLatitude() { return latitude; } public double getLongitude() { return longitude; } public long getTimestamp() { return timestamp; } }
  37. Интерфейс с документацией Piece of cake import android.support.annotation.NonNull; import com.cargopull.executor_driver.entity.GeoLocation;

    import io.reactivex.Flowable; /** * Гейтвей получения геопозиции пользователя. */ public interface GeoLocationGateway { /** * Возвращает текущие геопозиции пользователя. * * @param interval задержка между значениями. * @return {@link Flowable<GeoLocation>} полученные геопозиции. */ @NonNull Flowable<GeoLocation> getGeoLocations(long interval); }
  38. Джедайский план 1.Ознакомиться и уточнить тест-кейсы и ТЗ
 2.Максимально разграничить

    ответственность
 3.Описать бизнес-объекты и контракты компонентов
 4.Написать юнит-тесты
 5.Написать код
 6.Тюнинг-полировка кода
  39. Немного о тестах • Это не код, это - документация


    • Помогают разгрузить голову и предусмотреть баги
 • В десятки раз быстрее проверок на устройстве
 [1,5 тыс. тестов за 6 секунд]
 • Необходимо тестировать контракты (интерфейсы)
  40. Тест бизнес-объекта Ничего сложного import static org.junit.Assert.assertEquals; import org.junit.Test; public

    class GeoLocationTest { /** * Проверяем конструктор и геттеры */ @Test public void testConstructorAndGetters() { // Given: GeoLocation geoLocation; // When: GeoLocation geoLocation = new GeoLocation(12.1, 14.5, 12309); // Then: assertEquals(geoLocation.getLatitude(), 12.1, 0); assertEquals(geoLocation.getLongitude(), 14.5, 0); assertEquals(geoLocation.getTimestamp(), 12309); } }
  41. Тест интерфейса Чуть сложнее @RunWith(MockitoJUnitRunner.class) public class GeoLocationGatewayTest { private

    GeoLocationGateway gateway; @Mock private GeolocationCenter geolocationCenter; @Before public void setUp() { … } /* Проверяем взаимодействие с центром геолокации */ // Должен запросить у центра геолокации текущие геопозиции пользователя. @Test public void askGeolocationCenterForLocations() { … } /* Проверяем ответы на запрос геопозиций */ // Должен ответить ошибкой доступа. @Test public void answerSecurityError() { … } // Должен отвечать геопозициями. @Test public void answerWithGeoLocationData() { … } }
  42. Джедайский план 1.Ознакомиться и уточнить тест-кейсы и ТЗ
 2.Максимально разграничить

    ответственность
 3.Описать бизнес-объекты и контракты компонентов
 4.Написать юнит-тесты
 5.Написать код
 6.Тюнинг-полировка кода
  43. Джедайский план 1.Ознакомиться и уточнить тест-кейсы и ТЗ
 2.Максимально разграничить

    ответственность
 3.Описать бизнес-объекты и контракты компонентов
 4.Написать юнит-тесты
 5.Написать код
 6.Тюнинг-полировка кода
  44. Лайфхак: последовательность разработки архитектуры View маршрута представление маршрута Бизнес-логика маршрута

    Data source
 маршрута Бизнес-объект маршрута DTO и маппер маршрута объекты состояний
 UI маршрута
  45. Лайфхак: последовательность разработки архитектуры View маршрута представление маршрута Бизнес-логика маршрута

    Data source
 маршрута Бизнес-объект маршрута DTO и маппер маршрута объекты состояний
 UI маршрута 1. 2. 3. 4. 5.
  46. Джедайские плюсы Документация «из коробки» Тесты «из коробки» Стабильность кода

    Гибкость в композиции дешево Разработку легко делегировать на большую команду
  47. Джедайские плюсы Документация «из коробки» Тесты «из коробки» Стабильность кода

    Гибкость в композиции дешево Разработку легко делегировать на большую команду Код компонентов короткий и простой
 [Меньше поведения - меньше вариаций]
  48. Джедайские плюсы Документация «из коробки» Тесты «из коробки» Стабильность кода

    Гибкость в композиции дешево Разработку легко делегировать на большую команду Код компонентов короткий и простой F**K YEA.
  49. Джедайские минусы Написание кода занимает немного больше времени
 [Теряем на

    написании тестов, но выигрываем на проверках работы кода]
  50. Джедайские минусы Написание кода занимает немного больше времени
 Порог вхождения

    выше
 Есть опасность оверинжинирига
 После полного освоения трудно работать по-старому
  51. Джедайские минусы Написание кода занимает немного больше времени
 Порог вхождения

    выше
 Есть опасность оверинжинирига
 После полного освоения трудно работать по-старому
  52. Заключение • Произвол в требованиях (к фичам) • Избыток полномочий

    (и ответственности в коде) Убийцы идеального кода
  53. Заключение 1.Изучаем ТЗ 2.Одноразовый код 3.Код staging покрыть тестами* 4.Код

    релиза под рефакториинг* 5.Код документируем* • Произвол в требованиях (к фичам) • Избыток полномочий (и ответственности в коде) Убийцы идеального кода
  54. Заключение 1.Уточняем ТЗ и тест-кейсы 2.Максимальный SRP 3.бизнес-объекты и контракты

    4.Пишем юнит-тесты 5.Пишем код по тестам 6.Тюнинг-полировка • Произвол в требованиях (к фичам) • Избыток полномочий (и ответственности в коде) Убийцы идеального кода 1.Изучаем ТЗ 2.Одноразовый код 3.Код staging покрыть тестами* 4.Код релиза под рефакториинг* 5.Код документируем*
  55. Ссылки на полезные ресурсы • https://soundcloud.com/podlodka/podlodka-27-obektno-orientirovannoe-programmirovanie - Подкаст обсуждения ООП

    • https://soundcloud.com/podlodka/podlodka-34-mikroservisnaya-arkhitektury - Подкаст обсуждения микросервисной архитектуры • https://www.youtube.com/watch?v=3OTg3_q18qs - Доклад «Жизнь без QA» Александра Смирнова • https://martinfowler.com - Блог Мартина Фаулера • https://blog.cleancoder.com - Блог Роберта Мартина • https://www.google.com - если этого мало =)