Почти год назад вышла книга Android High Performance Programming. Книжка классная – но требующая комментариев. Скоро автор прилетит в Россию на конференцию Mobius 2017 Moscow, и с ним можно будет пообщаться вживую. Чтобы скоротать ожидание, давайте пообщаемся с Энрике в формате хабро-интервью.

Java или Kotlin? Как писать быстрый код? Можно ли в мобильном приложении использовать Tensorflow и другое машинное обучение? Срочно жмите кнопку «читать дальше»! ?

Итак, в гостях у нас
Enrique Lopez Manas (Энрике Лопес Маньяс) — независимый IT-консультант и разработчик, обладатель звания Android Google Developer Expert. Занимается мобильными технологиями и программированием более 10 лет, входит в десятку самых активных в Германии участников сообщества Java Open Source. Последнее время «заболел» Big Data и ML-технологиями, о чем мы с ним тоже сейчас кратко поговорим.




— Есть множество различных рекомендаций по оптимизации Android-приложений. Одни касаются кода, другие и вовсе относятся не только к платформе Android. Что, по вашему мнению, является самой распространенной ошибкой?

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

— Есть ли у вас какая-то любимая настройка в компиляторе или IDE, которую вы могли бы порекомендовать установить «по умолчанию»?

Энрике Маньяс: Первым делом это Dracula mode. Я не могу работать с ярким экраном — глаза сразу устают.

Кроме этого, есть еще пара трюков. Можно исключить из поиска директории temp и build. Это позволит сразу сэкономить много времени.

Установка «Constant Conditions & Exceptions» вместе со строгими установками Error и Nullable — это хорошая отправная точка для того, чтобы избавится от багов. А семантическая подсветка помогает работать продуктивнее.

— Есть ли у вас какая-то любимая утилита? Отладчик Lint или что-то вроде gfxinfo, systrace?

Энрике Маньяс: Lint — это для каждодневного использования. Мне нравится SourceTree. Не только для визуализации бренчей и истории, но и для основных операций (add, commit, diff, и т.п.).

Еще я обнаружил, что с консолью работать эффективнее. Да и весь Performance Profiling Tools kit от Android полезен, когда дело доходит до отладки. Думаю, что и battery profiling многие недооценивают зря.

— Был очень удивлен, узнав, что ENUM-ы на Android занимают гораздо больше памяти, чем static-константы. Можете удивить чем-нибудь еще?

Энрике Маньяс: Вот это еще может стать для вас сюрпризом: когда вы строите свой layout и добавляете его к activity, используя метод Activity.setContentView(), множество других представлений также добавляются к иерархии для создания желаемого UI. Владелец вьюшки (DecorView), как правило, не нужен, так как он перекрывается вашим собственным лейаутом. Вы можете избавиться от него и повысить производительность.

— Можете ли вы разделить советы по улучшению производительности на какие-то группы? Что-то вроде: утечки памяти, многопоточность, верстка макета, работа с сетью/предварительная выборка данных…

Энрике Маньяс: В своей книге я разделил рекомендации по оптимизации производительности на разные категории. Их можно взять за основу. Создание макета и построение эффективных представлений — это одна из групп. Память (включая, но не ограничиваясь утечками, JVM, JIT,  лучшие практические приемы), многопоточность в Android, работа с сетью, безопасность. Закончить этот список можно работой с батареей.

— Не хайпа ради. Просто интересны ваши предпочтения: Java/Kotlin, Kotlin или чистый Java. Что вы предпочитаете для разработки под Android и почему?

Энрике Маньяс: Java родилась в 1995. После этого в свет вышло несколько версий, в которых наращивались и улучшались все первоначальные возможности. Сейчас мы имеем восьмую версию. 22 года для языка программирования можно считать вечностью, учитывая то, как сейчас развиваются технологии. И на данный момент некоторые его флаги трудно игнорировать. Как разработчик, я часто экспериментирую с разными языками. Scala является самым подходящим примером того, как язык может разрешить некоторые проблемы с флагами Java. Переломным моментом был тот, когда я увидел в действии Swift.

Android нативно поддерживает весь набор функций Java 7, а Java 8 — лишь частично. И это не добавляет ему очков в сравнении с другими платформами. Однако этот пробел способен заполнить Kotlin.

Kotlin — это современный язык (версия 1.0 была выпущена только в феврале 2016). Основной его задачей было не только закрыть недостатки Java, как это делает Scala, но и решить некоторые из текущих проблемных моментов (например, скорость компиляции). Если говорить о моих предпочтениях, то для Android это Kotlin. К сожалению, в реальном мире существует множество таких вещей как legacy-код, дедлайны… Потому не всегда есть возможность полноценного выбора.

— Одна из официальных рекомендаций — выбор static вместо virtual. В этом случае вызовы будут на 15-20% быстрее. Но статические классы плохо подходят для тестирования и для последующих архитектурных изменений. Выходит, что static является совсем не злом, если говорить о разработке под Android?

Энрике Маньяс: Идея предпочтительного использования static основана на том, что если ваша функция не может изменить какой-либо объект, то вы вполне можете сделать ее статичной, так как она не изменяет внутреннее состояние. Это также сказывается и на скорости исполнения.  

— Если у меня есть какое-то обычное мобильное приложение (не игра или какое-то приложение со своей собственной графикой). Должна ли меня как-то волновать поддержка 60 FPS?

Энрике Маньяс: Вы всегда должны добиваться скорости отрисовки в 60 FPS в вашем мобильном приложении. Это означает, что экран должен обновляться с частотой 60 раз в секунду или раз в 16,6667 мс. Сложность может вызвать слишком частая прорисовка иерархии — то есть большое количество циклов CPU. Есть несколько вещей, которых мы должны придерживаться, и частота обновления — как раз одна из них.

— В фильме «Сфера» была показана возможность найти любого человека на земле с помощью социальной сети. Как по мне, этот сценарий был актуален году эдак в двухтысячном. Как вы думаете, можно ли обучать машины с помощью социальной сети? Можете рассказать что-нибудь о интересных способах тренировки NN с ML или о том, что мы можем получить в будущем?

Энрике Маньяс: Я нахожусь в восторге от тех художественных элементов, какие выдает, например, фреймворк Magenta. ML и NN всегда были сфокусированы на практических задачах, таких как распознавание изображений. Теперь же они начинают справляться с задачами, которые ранее были под силу только людям. В некоторых экспериментах (тут я рекомендую вам ознакомиться с книгой «Хомо Деус: Краткая история завтрашнего дня» за авторством Юваль Ной Харари) многие люди не могут отличить музыку, созданную машиной, от музыки, написанной человеком. Тот момент, когда машина сможет пройти тест Тьюринга в области художественной деятельности, можно смело называть наступлением сингулярности.

— Как далеко мы сейчас находимся от того момента, когда программирование под мобильные устройства станет таким же простым, как и HTML? Что Вы думаете о приложениях, которые полностью состоят из интентов или используют облачные сервисы? О том способе создания приложений, когда разработчик просто комбинирует несколько сервисов и получает готовое приложение. Иногда встречаются приложения, которые на 80% состоят из библиотек, и только оставшиеся 20% — это код. Как перемещение в облако может затронуть производительность мобильных приложений?

Энрике Маньяс: По мере появления новых возможностей и требований, а также увеличения мощностей аппаратных средств, процесс разработки становится все более сложным. Хотя, как и было сказано, компании, производящие софт, делают свое дело довольно хорошо (здесь я думаю в первую очередь о IntelliJ и их первоклассных инструментах).

— Machine learning в большинстве случаев ассоциируется с распознаванием изображений и интеллектуальным обучением. Однако его потенциал гораздо шире. Какие сценарии вы считаете более подходящими под мобильные возможности Tensorflow?

Энрике Маньяс: Использовать TensorFlow на мобильных устройствах имеет смысл, если вы хотите получить интерактивный эффект вместо отправки необходимых для обработки данных через REST API куда-то еще. Основные примеры, которые предоставляет Google, — это изображения. И в TensorFlow появляется смысл, когда файлы изображений имеют большой объем. Иначе их приходится отправлять на обработку (и получать обратно) через интернет — а это замедляет работу с ними. Если вы сможете обработать их на мобильном устройстве, будет эффективнее.

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



Если вы жаждете узнать больше деталей про работу с TensorFlow, приходите послушать доклад Энрике Маньяса TensorFlow for mobile devs на нашей конференции Mobius 2017 Moscow, которая пройдет в начале ноября. Кроме того, вас наверняка заинтересуют доклады других спикеров про мобильную разработку, среди которых:

Комментарии (5)


  1. Kondra007
    24.10.2017 16:21
    +1

    Как далеко мы сейчас находимся от того момента, когда программирование под мобильные устройства станет таким же простым, как и HTML?

    Сразу вспоминается проект Jasonette, позволяющий "генерировать" Android/iOS-приложения при из JSON-кода.


    1. olegchir
      24.10.2017 16:32

      а вы уже попробовали? какие впечатления?


      1. Kondra007
        24.10.2017 19:53

        Пробовал, да. Очень своеобразная вещь, я бы даже сказал, затянувшийся эксперимент (опять же, имхо). Что-то всеобъемлющее сделать вряд ли получится. Задумка очень крутая. Лучше попробуйте сами, у них есть свой JSON-хостинг, который отдаёт прямые ссылки, которые, в свою очередь, можно скармливать их Android-приложению, чтобы быстро видеть результат изменений.


        1. olegchir
          25.10.2017 11:12

          Я просто думаю, ведь к такой штуке очень легко написать рисователь формочек, в том числе онлайновый. Смотреть морду приложения на симуляторе. Тулов для работы с JSON видимо-невидимо, совершенно все можно делать на клиенте, перфоманс у клиента будет бешеный из-за нативной поддержки JSON в браузере.


  1. olegchir
    24.10.2017 16:32

    del