• Как работает Android, часть 4


      Всем привет! Мы нашли время продолжить серию статей про внутреннее устройство Android. В этой статье я расскажу о процессе загрузки Android, о содержимом файловой системы, о том, как хранятся данные пользователя и приложений, о root-доступе, о переносимости сборок Android и о проблеме фрагментации.

      Читать дальше →
    • Принципы SOLID, о которых должен знать каждый разработчик

      • Translation
      Объектно-ориентированное программирование принесло в разработку ПО новые подходы к проектированию приложений. В частности, ООП позволило программистам комбинировать сущности, объединённые некоей общей целью или функционалом, в отдельных классах, рассчитанных на решение самостоятельных задач и независимых от других частей приложения. Однако само по себе применение ООП не означает, что разработчик застрахован от возможности создания непонятного, запутанного кода, который тяжело поддерживать. Роберт Мартин, для того, чтобы помочь всем желающим разрабатывать качественные ООП-приложения, разработал пять принципов объектно-ориентированного программирования и проектирования, говоря о которых, с подачи Майкла Фэзерса, используют акроним SOLID.



      Материал, перевод которого мы сегодня публикуем, посвящён основам SOLID и предназначен для начинающих разработчиков.
      Читать дальше →
    • Нестыдные вопросы про жизненный цикл



        Каждый разработчик сталкивался с вопросами про жизненный цикл Activity: что такое bind-сервис, как сохранить состояние интерфейса при повороте экрана и чем Fragment отличается от Activity.
        У нас в FunCorp накопился список вопросов на похожие темы, но с определёнными нюансами. Некоторыми из них я и хочу с вами поделиться.

        Читать дальше →
      • Патчим AndroidX


          На Google I/O 2018 была представлена замена существующим support-библиотекам — AndroidX


          Изначально, support-библиотеки разрабатывались для обратной совместимости новых API-интерфейсов и были тесно связаны с операционной системой. Разработка support-библиотек велась во внутренних ветках, которые периодически вливались в Android Open Source Project (AOSP). Такой подход ограничивал мерж пулл-реквестов от сообщества небольшими отрезками времени когда код AOSP и внутренний код гугла были синхронизированы. Кроме того, для работы с support библиотеками необходимо было выкачивать весь код платформы, а это более 40ГБ исходного кода. Для моего диска объемом 250 ГБ это достаточно много.

          Читать дальше →
          • +20
          • 8.6k
          • 7
        • Как я заменил RxJava на корутины в своем проекте и почему вам вероятно также стоит это сделать

          Привет, Хабр! Представляю вам перевод статьи автора Paulo Sato на тему использования Kotlin Coroutines вместо RxJava в своих Android проектах.

          RxJava как базука, большинство приложений не использует и половины её огневой мощи. В статье пойдет речь о том, как заменить её корутинами (сопрограммами) Kotlin.

          Я работал с RxJava в течении нескольких лет. Это определенно одна из лучших библиотек для любого Android проекта, которая и сегодня в ударе, особенно, если вы программируете на Java. Если же вы используете Kotlin, то можно сказать, что в городе новый шериф.

          Большинство использует RxJava только для того, чтобы контролировать потоки и для предотвращения callback hell (если вы не знаете, что это такое, считайте себя счастливчиком и вот почему). Дело в том, что мы должны иметь ввиду, что реальная мощь RxJava — это реактивное программирование и backpressure. Если вы используете её для контроля асинхронных запросов, вы используете базуку, чтобы убить паука. Она будет делать свою работу, но это перебор.

          Одним заметным недостатком RxJava является количество методов. Оно огромно и имеет тенденцию расползаться по всему коду. В Kotlin вы можете использовать корутины для реализации большей части поведения, которое вы ранее создавали, используя RxJava.

          Но… что такое корутины?

          Корутин — это способ обработки конкурентных задач в потоке. Поток будет работать пока не остановлен и контекст будет меняться для каждого корутина без создания нового потока.
          Корутины в Kotlin всё еще являются эксперементальными, но они вошли в Kotlin 1.3, так что я написал ниже новый класс UseCase (для clean architecture), использующий их. В этом примере, вызов корутин инкапсулирован в одном файле. Таким образом, другие слои не будут зависеть от выполняемых сопрограмм, обеспечивая более разъединенную архитектуру.
          Читать дальше →
          • +9
          • 19.6k
          • 9
        • Тяжёлая правда о тяжести обучения

          • Translation
          Как можно научиться тому, чему тебя никто не может научить?

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

          Во время структурированного обучения (такого, как в школе) существуют упражнения, учителя, способные вами руководить, и проторённая дорожка из точки А в точку Я. Самое тяжёлое здесь – ежедневно заниматься работой.

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

          В реальном мире нет никаких учебников или учебных планов. Нет возможности практиковаться. Нет источника постоянной обратной связи. Нет учителей – есть только вы, и те люди, которых вы можете убедить помогать вам.
          Читать дальше →
        • Пишем Java-френдли Kotlin-код

            Со стороны может показаться, что Kotlin упростил Android-разработку, вообще не принеся при этом новых сложностей: язык ведь Java-совместимый, так что даже большой Java-проект можно постепенно переводить на него, не забивая ничем голову, так? Но если заглядывать глубже, в каждой шкатулке найдётся двойное дно, а в трюмо — потайная дверца. Языки программирования — слишком сложные проекты, чтобы их совмещение обходилось без хитрых нюансов.

            Разумеется, это не означает «всё плохо и использовать Kotlin вместе с Java не надо», а означает, что стоит знать о нюансах и учитывать их. На нашей конференции Mobius Сергей Рябов рассказал, как писать на Kotlin такой код, к которому будет комфортно обращаться из Java. И доклад так понравился зрителям, что мы не только решили разместить видеозапись, но и сделали для Хабра текстовую версию:

            текстовая версия
            • +27
            • 8.9k
            • 4
          • Иконка со счётчиком в верхнем тулбаре: пример разнообразия подходов к одной задаче


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

              Но бывает и совсем по-другому: ты видишь реализацию чего-то в каждом втором приложении, а когда доходит до реализации того же у себя — оказывается, что лёгких решений для этого, как ни странно, до сих пор нет…

              Так и случилось со мной, когда возникла необходимость добавить в верхнюю панель иконку со счётчиком. Я был очень удивлён, когда выяснилось, что для реализации такого привычного и востребованного элемента UI нет простого решения. Но так бывает, к сожалению. И я решил обратиться к знаниям всемирной сети. Вопрос размещения иконки со счётчиком в верхнем тулбаре, как выяснилось, волновал довольно многих. Проведя на просторах интернета некоторое время, я нашёл массу разных решений. В целом все они рабочие и имеют право на жизнь. Более того, результат моего исследования наглядно показывает, как по-разному можно подойти к решению задач в Android.

              В этой статье я расскажу о нескольких реализациях иконки со счётчиком. Здесь представлено 4 примера. Если мыслить чуть шире, то речь пойдёт о практически любом кастомном элементе, который мы хотим разместить в верхнем тулбаре. Итак, начнём.
              Читать дальше →
            • Алан Кей: «Компьютеры — это инструменты, музыка которых — идеи»

              • Translation
              Самое большое препятствие улучшения образования для детей (с компьютерами или без них) — это совершенно обедневшее воображение большинства взрослых.
              — Алан Кей
              image

              Откопал статью Алана Кея 2009 года. Содержание — бомба и напалм, особенно на фоне большинства сегодняшних ИБД в области образования.

              Вопрос: Вы часто говорите, что компьютерная революция еще не произошла. Что вы имеете в виду?

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

              Большинство школ определяют компьютерную грамотность как умение использовать Microsoft Office и, возможно, немного заниматься веб-дизайном. Они упускают суть. Это все равно что сказать: «Если вы знаете, за какой конец книги нужно держаться, и вы знаете, как перейти к третьей главе, тогда вы грамотны».

              Литература — это прежде всего наличие достаточно важных идей для обсуждения и записи в той или иной форме. Поэтому вы должны задать себе вопрос: «Какая литература лучше всего подходит для записи на компьютере?» Один из ответов — создание динамического моделирования некоторой идеи, которая, по вашему мнению, важна, симуляции, с которой вы можете играть, и на основе которой вы можете учиться.
              Читать дальше →
            • Kotlin performance on Android

                Поговорим сегодня о производительности Kotlin на Android в production. Посмотрим под капот, реализуем хитрые оптимизаци, сравним байт-код. Наконец, серьезно подойдем к сравнению и замерим бенчмарки.

                Эта статья основана на докладе Александра Смирнова на AppsConf 2017 и поможет разобраться, можно ли написать код на Kotlin, который не будет уступать Java по скорости.


                О спикере: Александр Смирнов CTO в компании PapaJobs, ведет видеоблог «Android в лицах», а также является одним из организаторов сообщества Mosdroid.
                Читать дальше →
              • Шпаргалки Java программиста 9: Java SE — Шпаргалка для собеседований и повторений

                • Tutorial
                Данная статья в первую очередь предназначена для подготовки к собеседованиям на позицию Java разработчика (на самом деле, это шпаргалка, которую я писал для себя в течении многих лет, и повторяю при каждом новом поиске работы).

                Предполагается. что вы знакомы с многими функциями из Java SE, поэтому в основном информация дается кратко. Конечно, можно использовать эту статью и просто для обучения основам Java SE платформы (но в этом случае, после чтения статьи вам скорее всего придется обратиться к другим источникам).

                image

                Итак, вы пытаетесь вспомнить все, что знаете перед собеседованием и не важно сколько лет опыта, без подготовки вас все равно могут поймать на том вопросе, который вы вроде бы помнили, но именно на собеседовании забыли. Это шпаргалка позволит вам освежить некоторые из ваших знаний.

                Внимание: я не буду касаться вопросов по самому языку Java (вроде для чего нужно слово final или чем overriding отличается от overloading), это потребует отдельной статьи, это вопросы именно по Java SE (6-9) платформе.
                Читать дальше →
              • ViewModel и LiveData: паттерны и антипаттерны

                Привет, Хабр! Представляю вашему вниманию перевод статьи ViewModels and LiveData: Patterns + AntiPatterns автора Jose Alcérreca.

                View и ViewModel


                Распределение ответственностей


                Типичное взаимодействие объектов приложения, построенное с помощью Архитектурных Компонентов:

                image

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

                Читать дальше →
                • +7
                • 33.2k
                • 5
              • Реактивные приложения с Model-View-Intent. Часть 2: View и Intent

                • Translation
                В первой части мы обсудили что такое модель, ее связь с состоянием и то, как правильно спроектированная модель помогает решить некоторые проблемы в разработке под Android. В этой статье мы продолжим наш путь к созданию реактивных приложений с помощью паттерна Model-View-Intent.

                Прежде, чем начать, вкратце обсудим основную идею MVI.

                Model-View-Intent (MVI)


                Этот паттерн был описан Андре Штальтцем (André Staltz) для JavaScript-фреймворка cycle.js. С теоретической и математической точки зрения MVI можно описать следующим образом:

                image

                Читать дальше →
                • +11
                • 17.4k
                • 4
              • Итоги Школы и все материалы по архитектуре клиент-серверных приложений

                  image

                  Больше трех месяцев назад мы анонсировали набор в школу для Android-разработчиков в Казани, месяц назад подвели итоги отбора и пообещали после окончания Школы поделиться всеми материалами курса. Время пришло.

                  Что выкладываем:
                  Читать дальше →
                  • +16
                  • 10.3k
                  • 6
                • Основы реактивного программирования под Android на практическом примере

                  1. Введение в реактивное программирование


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

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

                  RxJava — реализация ReactiveX с открытым исходным кодом на Java. Базовыми строительными блоками реактивного кода являются Observables и Subscribers. Подробнее с базовой основой можно ознакомиться в статье Грокаем* RxJava, часть первая: основы.

                  RxAndroid — расширение к RxJava, которое позволяет планировщику запускать код в основном и дополнительных потоках Android приложения и обеспечивает передачу результатов из созданных дополнительных потоках в основное для агрегации и взаимодействия с интерфейсом пользователя.
                  С целью более полного понимания основных принципов реактивного программирования рассмотрим практический пример для платформы Android. И начнем с настройки окружения для разработки.
                  Читать дальше →
                • Как прочитать 40 книг за год

                    В прошлом году я поставил себе задачу прочитать 40 книг. В целом это удалось, включая такую книгу-мастодонт как «Атлант расправил плечи». При этом у меня работа, семья с 2 малышами и свой pet-project. В этой статье я расскажу, какие небольшие лайфхаки помогли мне всё это сделать.

                    Big data Первый и самый главный вопрос — зачем. Поскольку я развиваю свой образовательный проект (вот мы на Хабре), стоит задача проработать массу учебного материала. Например, чтобы разобраться со статистикой и теорией вероятности так, чтобы её можно было объяснить любому человеку, что называется, на пальцах, мне пришлось прочитать десяток научно-популярных книг, включая «Чёрный лебедь», «Удовольствие от X», «Бизнес-статистика» и «Big data» (в итоге это вылилось в вебинар «Зачем в жизни нужна теория вероятностей»).

                    Примерно оценив объём работы и свои силы, я сделал вывод, что нужно осваивать где-то 3 книги в месяц. Как задача-максимум это округлилось до 40 книг в год.

                    Пацан сказал — пацан сделал


                    Первое, что я сделал — это commitment (не уверен, что в русском есть подходящее слово — это «обязательство перед самим собой», чтоб не спрыгнуть и потом не говорить себе «если бы я правда захотел, я бы и сто книг осилил». Плавали, знаем.)

                    Технически это просто. На сайте goodreads.com можно отмечать прочитанные тобой книги и ставить им оценку и отзыв (сайт выглядит как что-то из 90х, но для наших целей годится). Недавно они добавили фичу «Reading challenge», где ты можешь указать, сколько книг собираешься прочесть за год — в итоге оно будет мониторить, на сколько книг ты опережаешь план или отстаёшь от него. Удобно.

                    Reading challenge

                    Пожиратели времени


                    Когда цель амбициозна, начинаешь по-новому оценивать своё время. Другими словами, можно по-новому структурировать новогодние и майские «каникулы». Так получилось, что Новый год мы встретили в трезвости и покое, поэтому за первые 3 дня года я проглотил 5 небольших книг по 150 страниц. Настрой был серьёзный.
                    Читать дальше →
                  • Книги для тимлидов и руководителей проектов

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

                      В отечественном IT я часто наблюдаю следующую картину: тимлидом часто становился лучший (?) разработчик из команды (aka 23-летний сеньор). А чтобы стать руководителем проекта (project manager) иногда достаточно просто знать английский и «павэрпойнт» на уровне пользователя. Это реалии отечественного аутсорсинга и с этим нужно как-то жить.

                      В итоге часто получается как-то так:
                      Потому что на десять сеньоров по статистике девять тупят.
                      Читать дальше →
                    • Java по-русски. Часть первая: Книги

                        Не так давно я проводил опрос «Какие материалы о Java вас интересуют на русском языке?» среди посетителей Хабра. Вторым этапом моего исследования будет обзор существующих русско-язычных ресурсов.

                        Книги


                        За 2009 на Ozon.ru можно найти 8 книг по Java (всего за последние 3 года их вышло 22 — примерно по 7 в год, на books.ru набор примерно такой же, так что наша выборка довольно репрезентативна). Посмотрим, что это за книги?
                        Читать дальше →