Как стать автором
Обновить
22
0
Sergey Buvaka @s-buvaka

Android Software Engineer at Yandex

Отправить сообщение

Тестирование From Zero to Hero. Пролог к части 2, или Как мы пилили монолит

Время на прочтение12 мин
Количество просмотров3K

Меня зовут Сергей, я тимлид команды андроид Тинькофф. 

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

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

Здесь я хочу рассказать о том, что мы имели ДО и что получилось сейчас. 

Давайте разбираться
Всего голосов 12: ↑12 и ↓0+12
Комментарии2

Почему мы делимся знаниями

Время на прочтение7 мин
Количество просмотров6.8K

Привет! Меня зовут Сергей, и я работаю в команде Тинькофф. В этой статье я хочу поговорить об обучении и о том, почему в разработке принято просто так делиться знаниями. А также о том, почему многие разработчики активно тратят свое время на то, чтобы обучать других.

Вперед разбираться
Всего голосов 16: ↑16 и ↓0+16
Комментарии19

Тестирование From Zero to Hero. Часть 1

Время на прочтение6 мин
Количество просмотров15K

Всем привет! Меня зовут Сергей, я работаю в команде Тинькофф. Сегодня я хочу рассказать, как мы в Тинькофф приходили к классической пирамиде тестирования. 

Рассказ будет в трех частях:

- Трудности, с которыми нам пришлось столкнуться, и как мы их преодолевали.

- Конкретные решения по некоторым распространенным кейсам при написании интеграционных тестов.

- Подход к написанию E2E-тестов (тестов, покрывающих взаимодействие всех систем приложения, включая back-end и пользовательский интерфейс) с использованием паттерна PageObject, пришедшего к нам из мира веб-разработки.

Читать далее
Всего голосов 19: ↑19 и ↓0+19
Комментарии6

Обзор DataStore Library. Прощаемся с SharedPreference?

Время на прочтение8 мин
Количество просмотров27K

Привет, меня зовут Сергей, я работаю в команде Мобильного Банка Тинькофф. Недавно Google представила очередной инструмент для хранения данных. На этот раз это библиотека DataStore. В официальном блоге Google пишут, что она должна заменить SharedPreference. 

Читать далее
Всего голосов 24: ↑24 и ↓0+24
Комментарии13

Android Fragment Result Listener

Время на прочтение5 мин
Количество просмотров33K


В Android передача данных между фрагментами может осуществляться разными способами: передача через родительскую Activity, используя ViewModel или даже Fragments API. Fragment Target API с недавних пор получил статус Deprecated и вместо него Google рекомендует использовать Fragment result API.


Что такое Fragment result API? Это новый инструмент от Google который позволяет передавать данные между фрагментами по ключу. Для этого используется FragmentManager, который в свою очередь реализует интерфейс FragmentResultOwner. FragmentResultOwner выступает в качестве центрального хранилища для данных, которые мы передаем между фрагментами.


Как это работает?


image

Как упоминалось выше, наш FragmentManager реализует интерфейс FragmentResultOwner, который хранит в себе ConcurrentHashMap<String, Bundle>. Эта HashMap хранит наши Bundle-ы по строковому ключу. Как только один из фрагментов подписывается (или уже подписан) то он получает результат по тому самому ключу.

Читать дальше →
Всего голосов 10: ↑10 и ↓0+10
Комментарии4

Хочу в IT. Рекомендации на тему того как научиться чему-то новому

Время на прочтение9 мин
Количество просмотров18K

image


Довольно часто на разных ресурсах вроде Stack Overflow я вижу вопросы в стиле: “Как стать разработчиком?”, “Какой язык программирования лучше учить?”, “А не поздно ли в IT после 30. И хотя в интернете уже вероятно огромное количество подобных статей, я все же хочу поделиться своей историей и советами, которые как мне кажется, могут помочь ребятам которые хотят в своей жизни попробовать что-то новое, но по разным причинам боятся.


Вкратце расскажу о себе, 3 года назад я понятия не имел, что такое программирование и что это за черная магия за которую готовы создавать такие условия для разработчиков. Я был обычным рабочим в автомастерской. Мне повезло и я познакомился с парнишкой который предложил мне научиться. Я имел упаковку комплексов: “Это не мое”, “Я уже слишком стар для того чтоб войти в IT” (мне тогда было 28), “Для этого надо было заканчивать универ” и т.д. в том же духе. Сейчас я Android разработчик в Tinkoff, участвую в разработке основного приложения банка. В свободное время помогаю некоторым ребятам учиться и в целом доволен своим выбором.


Наверное в любой сфере есть куча страшных слов которыми пугают все вокруг: Сопромат в инженерном деле, Коллоидная Химия, Сольфеджо в музыке, Матанализ и т.д. Так же и в программировании есть “Алгоритмы и структуры данных”, какие-то “Паттерны проектирования” от которых человека незначащего бросает в пот, а еще в добавок все эти мифы о том, что для того чтоб программировать надо знать чуть ли не высшую математику. Короче все эти вещи дико отпугивают людей когда они начинают читать форумы. А еще есть целая гора людей которые это все приправят тем, что вот тебе надо прочесть вот эти 20 томов по 1000 листов нудной теории, рассказы про то что надо уметь писать код чуть ли не в блокноте. В общем большое количество страшных историй которые отбивают все желание начинать.

Читать дальше →
Всего голосов 13: ↑6 и ↓7+2
Комментарии36

Зачем ходить на собеседования

Время на прочтение4 мин
Количество просмотров28K
image

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

Когда я начал ходить на собесы, мои знания наверное не составляли даже четверти того, что знает этот парнишка. Когда меня взяли на работу, я не знал и половины того, что знает он. Я ходил на собеседования каждую неделю, получал тестовое задание, делал его и шел на следующее. (К слову у меня был годовалый ребенок и работа, которая не способствовала обучению, и каждое задание занимало много времени). Я получил более двадцати отказов, некоторые мои знакомые даже подшучивали надо мной: «Что, опять перезвонят?». И все же однажды перезвонили.

Так вот к чему я это все? Не к тому, чтобы похвастаться какой я классный, а к тому, что на собесы ходить просто необходимо. Здесь я поделюсь своими соображениями почему.
Читать дальше →
Всего голосов 43: ↑35 и ↓8+27
Комментарии80

Generic Recycler View или как не писать шаблонный код

Время на прочтение4 мин
Количество просмотров8.2K
Все мы пишем приложения и у всех нас есть списки. И самое очевидное решение это RecyclerView. Сама по себе реализация не сложна и писать гайд по RecyclerView уже не актуально. Но есть одно но. Каждый раз когда нам нужен список мы создаем класс, в нем прописываем шаблонный методы, создаем шаблонные классы. Когда у нас 2-3 списка то ничего страшного в этом нет. Но когда их 10 или того более, то этого делать уже не хочется.

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

Первое что нам необходимо сделать это создать адаптер.

abstract class GenericAdapter<T> : RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private var itemList = mutableListOf<T>()

    constructor()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return getViewHolder(
            LayoutInflater.from(parent.context)
                .inflate(viewType, parent, false)
            , viewType
        )
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        (holder as Binder<T>).bind(itemList[position], itemClickListener)
    }

    override fun getItemCount(): Int = itemList.size

    override fun getItemViewType(position: Int): Int = getLayoutId(position, itemList[position])

    fun update(items: List<T>) {
            itemList = items.toMutableList()
            notifyDataSetChanged()
    }

    protected abstract fun getLayoutId(position: Int, obj: T): Int

   protected open fun getViewHolder(view: View, viewType: Int): RecyclerView.ViewHolder {
        return ViewHolderFactory.create(view, viewType)
    }

    internal interface Binder<T> {
        fun bind(data: T)
    }
}
Читать дальше →
Всего голосов 19: ↑16 и ↓3+13
Комментарии9

Информация

В рейтинге
Не участвует
Дата рождения
Зарегистрирован
Активность