От оптимизаций до Machine Learning: интервью с автором Android High Performance Programming

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

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

    Итак, в гостях у нас
    Enrique López Mañas (Энрике Лопес Маньяс) — независимый 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, которая пройдет в начале ноября. Кроме того, вас наверняка заинтересуют доклады других спикеров про мобильную разработку, среди которых:

    • +24
    • 5,4k
    • 7
    JUG.ru Group 1 358,03
    Конференции для взрослых. Java, .NET, JS и др. 18+
    Поделиться публикацией
    Комментарии 7
    • +1
      Как далеко мы сейчас находимся от того момента, когда программирование под мобильные устройства станет таким же простым, как и HTML?

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

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

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

          • 0
            Я просто думаю, ведь к такой штуке очень легко написать рисователь формочек, в том числе онлайновый. Смотреть морду приложения на симуляторе. Тулов для работы с JSON видимо-невидимо, совершенно все можно делать на клиенте, перфоманс у клиента будет бешеный из-за нативной поддержки JSON в браузере.
      • 0
        del
        • 0
          Причем тут machine learning к мобильным приложениям? Все равно все на сервере происходит.
          «Machine learning в большинстве случаев ассоциируется с распознаванием изображений и интеллектуальным обучением» — если гугл уже умеет распознавать, что на картинке две собаки бегут по пляжу, то становится страшно жить))
          • 0
            тут речь именно о запуске ML на самих устройствах, а не на сервере.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое