Привет! Мы участники программы Tinkoff Internship, и в этой статье хотим рассказать об отборе, внутренней обстановке, задачах и наших впечатлениях. Надеемся, это будет полезно и будущим интернам, и тем, кому просто интересна компания.
Отбор на программу Tinkoff Internship проходил в два этапа.
Первая часть — онлайн-экзамены. В зависимости от направления предлагается несколько алгоритмических задач, тест на знание SQL или олимпиадные задачи по математике, а также тестовое приложение для тех ребят, кто подается на мобильную разработку. Вступительные испытания не совсем стандартны и требуют некоторой подготовки. По истечении срока сдачи экзаменов условия задач выкладываются в группу во Вконтакте, где их можно попробовать решить и обсудить. Так же есть бот в Telegram — там тоже можно потренироваться решать задачи.
Всех тех, кто успешно справился с онлайн-этапом, приглашают на очные встречи с кураторами в офис.
Встречи проходили в разных форматах: давали задачки на логику, язык программирования, спрашивали о предпочтениях в технологиях и обо всем том, что тебя интересует в мире ИТ.
Спустя некоторое время тем, кто был принят на программу, пришло приглашение с условиями программы. И речь не только о деньгах. Интерны бесплатно обедают в Тинькофф Кафе и ходят в фитнес-зал в офисе. На нас также распространяются корпоративные скидки и предложения от партнеров компании.
В отборе участвовали 1299 человек, из которых 412 были приглашены на финальный этап, 98 получили приглашения на программу. Итоговый конкурс — более 13 человек на место.
В первый день организаторы проводят ознакомительную лекцию, после которой интерны расходятся по своим командам.
Их уже ждет ноутбук, монитор, мышь и внутренний телефон. При желании можно запросить любое нужное оборудование.
Мы, например, просили дополнительный монитор, коврик для мыши, наушники и гарнитуру.
Как только вы обосновались на новом месте, кураторы рассказывают о своих командах и проектах. Кстати нам сразу же дали «боевые» задачи.
Каждый из соавторов статьи недавно завершил свое участие в программе Tinkoff Internship и расскажет о своем опыте.
Я занимался улучшением ценообразования страховых полисов.
У ментора возникла идея, что, проанализировав рынок, мы сможем ввести в модель цены новый параметр, который позволит в конечном счете повысить прибыль. Для этого нужно было собрать имеющиеся данные, получить информацию о рынке, провести конечную аналитику и выяснить, полезен ли новый параметр.
В начале самым сложным было освоиться с SQL и библиотекой для работы с данными Pandas, так как до этого я мало их использовал. Целую неделю я писал скрипты для получения и складирования данных о рынке.
Параллельно работал тест эластичности, где мы меняли наши цены и смотрели на конверсию — вероятность покупки полиса. Используя данные этого теста, мы смогли построить модель, предсказывающую конверсию по нашей цене и полям полиса, а новый параметр увеличил качество работы модели.
ROC-кривая модели. Чем больше площадь под графиком, тем лучше модель
Получать данные о рынке при каждом обращении пользователя слишком долго, поэтому мы попытались предсказывать новый параметр — и поначалу нам удавалось хорошо это делать. Но с какого-то момента модель на обновленных данных стала обучаться хуже и ошибаться сильнее.
Оказалось, что причина тому — резкая «просадка» курса рубля к основным валютам, поэтому по одному набору параметров она должна была выдавать различные ответы, чего модель, конечно же, делать не могла. Логичным решением стало добавление курса валюты в модель.
Уже казалось, что мы имеем хорошую конверсионную модель. Зафиксировав остальные параметры для конкретного полиса, мы можем изменять нашу цену и, используя предсказанную конверсию, получать точку максимальной ожидаемой прибыли. Но тут оказалось, что модель плохо отображает динамику изменения конверсии от изменения цены и, как следствие, наиболее выигрышной стратегией становится повышение цены настолько, насколько это возможно. Думаю, если провести более тонкие тесты изменения цены, мы сможем избавиться от этой проблемы и внедрить эту модель ценообразования.
В будущем мы хотим создать полноценный RL-агент, который сможет адаптироваться под изменяющиеся условия окружающей среды и максимизировать прибыль. Для знакомства с SQL рекомендую решать задачки по SQL и параллельно смотреть необходимую теорию. Что касается библиотеки Pandas — есть замечательный пример использования Pandas в House Prices.
Я занимался разработкой мобильной CRM-системы, позволяющей владельцам малого и среднего бизнеса более эффективно вести свой продукт.
Мне повезло с командой: была полная свобода действий, а разработка полна экспериментами и необычными решениями. С каждым днем я все глубже погружался в проект и уже через месяц после фиксов небольших багов и написания автотестов приступил к разработке фичей. Помимо этого мне давали участвовать почти во всех процессах развития продукта: я присутствовал на встречах с клиентами, слушал их пожелания и предложения. Каждый из членов команды мог вносить что-то новое в проект, предлагать свои идеи.
Мне удалось решить несколько важных технических задач, в числе которых была навигация по приложению. Мы не хотели завязываться на библиотеках, поэтому было принято решение написать свой роутер. «Под капотом» он содержит несколько оптимизаций, которые позволяют более эффективно по времени и памяти выполнять транзакции на фрагментах.
Также однажды мы заметили довольно большую утечку памяти, которая приводила к падению приложения на слабых устройствах. Посмотрев логи в LeakCanary, мы увидели, что во всем виноват стандартный гугловский Snackbar. Решили переписать его и немного улучшить, в итоге никаких утечек больше не возникало.
Еще одной проблемой для нас был вес приложения: мы заметили, что в какой-то момент оно стало весить чуть ли не в три раза больше. Проанализировав apk через
Android-приложение мы писали, используя собственную архитектуру, что сначала было для меня совсем непривычным, однако через некоторое время я освоился, и даже принял ее как свою основную, ведь она показалась мне наиболее естественной для написания ПО.
Все это время со мной на связи был мой куратор, он же тимлид, который в режиме 24/7 отвечал на все мои вопросы и нещадно ревьювил мои пулл-реквесты :).
Во время программы я смог внести некоторый вклад в развитие Финтех-школы — помогал выстраивать процесс записи прогонов лекций, чтобы в будущем это было легче масштабировать и лекторы из других городов могли понять, о чем была презентация. Также я помогал с донесением информации до студентов, так как понимал, в чем у них могут быть сложности с восприятием.
Стоит учесть, что на момент Tinkoff Internship у меня уже был некоторый опыт разработки. Однако здесь ценится не только опыт, но и умение быстро разбираться в сложных вещах. Для этого, мне кажется, стоит уделять время алгоритмическим задачам, которые развивают абстрактное мышление. Задачки настоятельно рекомендую решать на leetcode.
Также не стоит забывать про техническую литературу и вообще быть в курсе того, что происходит в мире мобильной разработки. Для этого есть шикарный ресурс с тысячами полезных статей о том, как можно писать код.
Ребятам, изучающим Android, хотелось бы посоветовать прочесть следующие книги:
Чтение книг и нарешивание задач принесут пользу только в том случае, когда вы каждый день применяете новые знания на практике. Поэтому я рекомендую придумать какую-нибудь идею для своего проекта — например, написать простенький мессенджер, музыкальный плеер, галерею для просмотра фото — и начать все это дело реализовывать. Верьте в себя, много читайте, пишите код каждый день — и тогда у вас все получится!
Я два раза проходила Internship в Tinkoff в команде Process Mining, которая занимается анализом бизнес-процессов в компании. Анализ бизнес-процессов позволяет увидеть, как на самом деле работает процесс, насколько он близок к «идеалу» и где его узкие места.
Так как коллектив компании молодой, было достаточно легко найти общий язык. Все обращаются друг к другу на ты, иерархия сотрудников никак не проявляется в общении. Первый раз в моей команде было трое интернов, все мы занимались разными задачами с разными наставниками. Также была возможность поменять задачу в течение программы. Но моя мне понравилась с самого начала.
В основном я занималась анализом процесса обработки запросов от сотрудников и клиентов Tinkoff.ru. В моей задаче было две части: подготовка требуемой модели данных с помощью SQL (основные команды и правила языка можно посмотреть на этом ресурсе) и построение аналитики на основе этих данных.
Первай раз я участвовала в программе с частичной занятостью, 20 часов в неделю. Моя основная задача состояла в том, чтобы добавить информацию о соблюдении SLA — соглашения об уровне обслуживания — к существующему варианту анализа процесса. Некоторое время ушло на знакомство с инфраструктурой компании и инструментами, с помощью которых выгружались и обрабатывались данные. В итоге в текущий анализ бизнес-процесса я добавила два новых дашборда с аналитикой.
Во второй раз передо мной стояла более сложная задача — собрать неиспользуемые ранее данные из хранилища в определенной форме и сделать по ним новую аналитику. Кстати, в книге В. Савельева «Статистика и котики» простым языком описаны основные статистические характеристики и методы их применения.
Несколько раз я ходила на встречу с заказчиком, где мы обсуждали требования и текущие наработки. Изначально планировалось, что моим результатом станут три дополнительные страницы с аналитикой, но в ходе обсуждений мы пришли к выводу, что нужно сделать абсолютно новую версию отчета. Когда все данные были собраны и дашборды готовы, я запустила новый проект на тестовую группу. Спустя неделю собрала от них фидбек и внесла некоторые доработки. К окончанию программы мой отчет был доступен всем сотрудникам компании.
В рамках Tinkoff Internship я попал в команду речевых технологий.
Еще на втором этапе отбора я познакомился с Настей, моим будущим куратором, и Вадимом — нашим менеджером по продукту. Настя дала несколько алгоритмических задачек, а Вадим рассказал о работе над голосовым помощником, роботами и аналитикой колл-центров. Вопреки расхожему мнению, мы отвечаем не только за голос и уши голосового помощника Олега, У нас есть множество других интересных задач по интеграции голосовых технологий для различных клиентов. После Tinkoff Internship я остался в команде, сейчас мы ищем как профессионалов, так и мотивированных новичков.
Во время программы я занимался оптимизацией инференса. Дело в том, инференс нейронных сетей довольно часто сводится к операциям с плотными матрицами. При этом для авторегрессионных моделей, например для WaveNet, его выгоднее выполнять на CPU, чтобы можно было поддерживать больше одновременных потоков инференса.
Однако производительность «наивной» реализации матричного умножения с автоматической оптимизацией средствами компилятора редко достигает 10% от максимально возможной для отдельно взятого CPU. Для большей производительности необходимо использовать более тонкую оптимизацию. Существует много различных подходов к оптимизации матричных умножений для инференса нейросетей на CPU. У Насти были серьезные наработки по данному вопросу, мне же предстояло собрать их всех в единую библиотеку GEMM на C++. Такие библиотеки используются в популярных фреймворках: в TensorFlow это Eigen, в PyTorch — FBGEMM.
Кроме Register Blocking, Cache Blocking и SIMD-расширений процессора в библиотеке активно используются возможности C++: статический полиморфизм (CRTP) и генерация кода на этапе компиляции. Забавный факт: в определенный момент пришлось ненадолго переключиться с оптимизации матричных умножений на оптимизацию компиляции кода, использующего библиотеку. В итоге наша библиотека обгоняет Eigen (многократно) и FBGEMM на большинстве тестов. Дальнейшая работа будет направлена на внедрение библиотеки в наш движок для инференса.
Один из стандартных бенчмарков FBGEMM: произведение матриц
[M × 512] и [512 × 512]
От Tinkoff Internship у нас остались только положительные впечатления. Круто, что нас считают полноценными участниками команды, дают реальные задачи и позволяют решать их самостоятельно. Если возникают трудности, наставники помогают, но не просто озвучивают советы, а дают возможность самому найти решение.
Решать задачи с людьми, не лишенными чувства юмора, которые могут профессионально руководить и писать крутой код, всегда дает отличный шанс развивать свои хард- и софт-скилы, набираться опыта и начинать свою работу в ИТ.
На Tinkoff Internship сейчас открыт новый набор — записаться и пройти экзамены можно до 8 декабря на сайте fintech.tinkoff.ru/internships/about
Отбор
Отбор на программу Tinkoff Internship проходил в два этапа.
Первая часть — онлайн-экзамены. В зависимости от направления предлагается несколько алгоритмических задач, тест на знание SQL или олимпиадные задачи по математике, а также тестовое приложение для тех ребят, кто подается на мобильную разработку. Вступительные испытания не совсем стандартны и требуют некоторой подготовки. По истечении срока сдачи экзаменов условия задач выкладываются в группу во Вконтакте, где их можно попробовать решить и обсудить. Так же есть бот в Telegram — там тоже можно потренироваться решать задачи.
Всех тех, кто успешно справился с онлайн-этапом, приглашают на очные встречи с кураторами в офис.
Встречи проходили в разных форматах: давали задачки на логику, язык программирования, спрашивали о предпочтениях в технологиях и обо всем том, что тебя интересует в мире ИТ.
Спустя некоторое время тем, кто был принят на программу, пришло приглашение с условиями программы. И речь не только о деньгах. Интерны бесплатно обедают в Тинькофф Кафе и ходят в фитнес-зал в офисе. На нас также распространяются корпоративные скидки и предложения от партнеров компании.
В отборе участвовали 1299 человек, из которых 412 были приглашены на финальный этап, 98 получили приглашения на программу. Итоговый конкурс — более 13 человек на место.
Первое впечатление
В первый день организаторы проводят ознакомительную лекцию, после которой интерны расходятся по своим командам.
Их уже ждет ноутбук, монитор, мышь и внутренний телефон. При желании можно запросить любое нужное оборудование.
Мы, например, просили дополнительный монитор, коврик для мыши, наушники и гарнитуру.
Как только вы обосновались на новом месте, кураторы рассказывают о своих командах и проектах. Кстати нам сразу же дали «боевые» задачи.
Каждый из соавторов статьи недавно завершил свое участие в программе Tinkoff Internship и расскажет о своем опыте.
Витя. Направление — аналитика
Я занимался улучшением ценообразования страховых полисов.
У ментора возникла идея, что, проанализировав рынок, мы сможем ввести в модель цены новый параметр, который позволит в конечном счете повысить прибыль. Для этого нужно было собрать имеющиеся данные, получить информацию о рынке, провести конечную аналитику и выяснить, полезен ли новый параметр.
В начале самым сложным было освоиться с SQL и библиотекой для работы с данными Pandas, так как до этого я мало их использовал. Целую неделю я писал скрипты для получения и складирования данных о рынке.
Параллельно работал тест эластичности, где мы меняли наши цены и смотрели на конверсию — вероятность покупки полиса. Используя данные этого теста, мы смогли построить модель, предсказывающую конверсию по нашей цене и полям полиса, а новый параметр увеличил качество работы модели.
ROC-кривая модели. Чем больше площадь под графиком, тем лучше модель
Получать данные о рынке при каждом обращении пользователя слишком долго, поэтому мы попытались предсказывать новый параметр — и поначалу нам удавалось хорошо это делать. Но с какого-то момента модель на обновленных данных стала обучаться хуже и ошибаться сильнее.
Оказалось, что причина тому — резкая «просадка» курса рубля к основным валютам, поэтому по одному набору параметров она должна была выдавать различные ответы, чего модель, конечно же, делать не могла. Логичным решением стало добавление курса валюты в модель.
Уже казалось, что мы имеем хорошую конверсионную модель. Зафиксировав остальные параметры для конкретного полиса, мы можем изменять нашу цену и, используя предсказанную конверсию, получать точку максимальной ожидаемой прибыли. Но тут оказалось, что модель плохо отображает динамику изменения конверсии от изменения цены и, как следствие, наиболее выигрышной стратегией становится повышение цены настолько, насколько это возможно. Думаю, если провести более тонкие тесты изменения цены, мы сможем избавиться от этой проблемы и внедрить эту модель ценообразования.
В будущем мы хотим создать полноценный RL-агент, который сможет адаптироваться под изменяющиеся условия окружающей среды и максимизировать прибыль. Для знакомства с SQL рекомендую решать задачки по SQL и параллельно смотреть необходимую теорию. Что касается библиотеки Pandas — есть замечательный пример использования Pandas в House Prices.
Максим. Направление — Android-разработка
Я занимался разработкой мобильной CRM-системы, позволяющей владельцам малого и среднего бизнеса более эффективно вести свой продукт.
Мне повезло с командой: была полная свобода действий, а разработка полна экспериментами и необычными решениями. С каждым днем я все глубже погружался в проект и уже через месяц после фиксов небольших багов и написания автотестов приступил к разработке фичей. Помимо этого мне давали участвовать почти во всех процессах развития продукта: я присутствовал на встречах с клиентами, слушал их пожелания и предложения. Каждый из членов команды мог вносить что-то новое в проект, предлагать свои идеи.
Мне удалось решить несколько важных технических задач, в числе которых была навигация по приложению. Мы не хотели завязываться на библиотеках, поэтому было принято решение написать свой роутер. «Под капотом» он содержит несколько оптимизаций, которые позволяют более эффективно по времени и памяти выполнять транзакции на фрагментах.
Также однажды мы заметили довольно большую утечку памяти, которая приводила к падению приложения на слабых устройствах. Посмотрев логи в LeakCanary, мы увидели, что во всем виноват стандартный гугловский Snackbar. Решили переписать его и немного улучшить, в итоге никаких утечек больше не возникало.
Еще одной проблемой для нас был вес приложения: мы заметили, что в какой-то момент оно стало весить чуть ли не в три раза больше. Проанализировав apk через
apkanalyzer
, увидели, что все дело в нативных библиотеках: приложение собирается под все типы процессоров, из-за чего один .so
-файл может увеличить вес приложения не на 2,5 Мб, а на 12 Мб. Чтобы этого избежать, решили разделить итоговый apk на каждый из типов процессоров. Таким образом мы получили четыре релизные сборки вместо одной, но весили они примерно в 2,5 раза меньше.Android-приложение мы писали, используя собственную архитектуру, что сначала было для меня совсем непривычным, однако через некоторое время я освоился, и даже принял ее как свою основную, ведь она показалась мне наиболее естественной для написания ПО.
Все это время со мной на связи был мой куратор, он же тимлид, который в режиме 24/7 отвечал на все мои вопросы и нещадно ревьювил мои пулл-реквесты :).
Во время программы я смог внести некоторый вклад в развитие Финтех-школы — помогал выстраивать процесс записи прогонов лекций, чтобы в будущем это было легче масштабировать и лекторы из других городов могли понять, о чем была презентация. Также я помогал с донесением информации до студентов, так как понимал, в чем у них могут быть сложности с восприятием.
Стоит учесть, что на момент Tinkoff Internship у меня уже был некоторый опыт разработки. Однако здесь ценится не только опыт, но и умение быстро разбираться в сложных вещах. Для этого, мне кажется, стоит уделять время алгоритмическим задачам, которые развивают абстрактное мышление. Задачки настоятельно рекомендую решать на leetcode.
Также не стоит забывать про техническую литературу и вообще быть в курсе того, что происходит в мире мобильной разработки. Для этого есть шикарный ресурс с тысячами полезных статей о том, как можно писать код.
Ребятам, изучающим Android, хотелось бы посоветовать прочесть следующие книги:
- Kotlin in Action. Довольно простая, отлично написанная книга, прочитав которую можно очень быстро влиться в разработку на Kotlin.
- Effective Java. Мастхэв — сборник советов и приемов, которые должен знать любой Kotlin-/Java-разработчик.
- Efficient Android Threading. Отличная книга — умеренно глубоко рассказывает о том, как устроено многопоточное взаимодействие в Android.
Чтение книг и нарешивание задач принесут пользу только в том случае, когда вы каждый день применяете новые знания на практике. Поэтому я рекомендую придумать какую-нибудь идею для своего проекта — например, написать простенький мессенджер, музыкальный плеер, галерею для просмотра фото — и начать все это дело реализовывать. Верьте в себя, много читайте, пишите код каждый день — и тогда у вас все получится!
Маша. Направление — аналитика
Я два раза проходила Internship в Tinkoff в команде Process Mining, которая занимается анализом бизнес-процессов в компании. Анализ бизнес-процессов позволяет увидеть, как на самом деле работает процесс, насколько он близок к «идеалу» и где его узкие места.
Так как коллектив компании молодой, было достаточно легко найти общий язык. Все обращаются друг к другу на ты, иерархия сотрудников никак не проявляется в общении. Первый раз в моей команде было трое интернов, все мы занимались разными задачами с разными наставниками. Также была возможность поменять задачу в течение программы. Но моя мне понравилась с самого начала.
В основном я занималась анализом процесса обработки запросов от сотрудников и клиентов Tinkoff.ru. В моей задаче было две части: подготовка требуемой модели данных с помощью SQL (основные команды и правила языка можно посмотреть на этом ресурсе) и построение аналитики на основе этих данных.
Первай раз я участвовала в программе с частичной занятостью, 20 часов в неделю. Моя основная задача состояла в том, чтобы добавить информацию о соблюдении SLA — соглашения об уровне обслуживания — к существующему варианту анализа процесса. Некоторое время ушло на знакомство с инфраструктурой компании и инструментами, с помощью которых выгружались и обрабатывались данные. В итоге в текущий анализ бизнес-процесса я добавила два новых дашборда с аналитикой.
Во второй раз передо мной стояла более сложная задача — собрать неиспользуемые ранее данные из хранилища в определенной форме и сделать по ним новую аналитику. Кстати, в книге В. Савельева «Статистика и котики» простым языком описаны основные статистические характеристики и методы их применения.
Несколько раз я ходила на встречу с заказчиком, где мы обсуждали требования и текущие наработки. Изначально планировалось, что моим результатом станут три дополнительные страницы с аналитикой, но в ходе обсуждений мы пришли к выводу, что нужно сделать абсолютно новую версию отчета. Когда все данные были собраны и дашборды готовы, я запустила новый проект на тестовую группу. Спустя неделю собрала от них фидбек и внесла некоторые доработки. К окончанию программы мой отчет был доступен всем сотрудникам компании.
Коля. Направление — ML
В рамках Tinkoff Internship я попал в команду речевых технологий.
Еще на втором этапе отбора я познакомился с Настей, моим будущим куратором, и Вадимом — нашим менеджером по продукту. Настя дала несколько алгоритмических задачек, а Вадим рассказал о работе над голосовым помощником, роботами и аналитикой колл-центров. Вопреки расхожему мнению, мы отвечаем не только за голос и уши голосового помощника Олега, У нас есть множество других интересных задач по интеграции голосовых технологий для различных клиентов. После Tinkoff Internship я остался в команде, сейчас мы ищем как профессионалов, так и мотивированных новичков.
Во время программы я занимался оптимизацией инференса. Дело в том, инференс нейронных сетей довольно часто сводится к операциям с плотными матрицами. При этом для авторегрессионных моделей, например для WaveNet, его выгоднее выполнять на CPU, чтобы можно было поддерживать больше одновременных потоков инференса.
Однако производительность «наивной» реализации матричного умножения с автоматической оптимизацией средствами компилятора редко достигает 10% от максимально возможной для отдельно взятого CPU. Для большей производительности необходимо использовать более тонкую оптимизацию. Существует много различных подходов к оптимизации матричных умножений для инференса нейросетей на CPU. У Насти были серьезные наработки по данному вопросу, мне же предстояло собрать их всех в единую библиотеку GEMM на C++. Такие библиотеки используются в популярных фреймворках: в TensorFlow это Eigen, в PyTorch — FBGEMM.
Кроме Register Blocking, Cache Blocking и SIMD-расширений процессора в библиотеке активно используются возможности C++: статический полиморфизм (CRTP) и генерация кода на этапе компиляции. Забавный факт: в определенный момент пришлось ненадолго переключиться с оптимизации матричных умножений на оптимизацию компиляции кода, использующего библиотеку. В итоге наша библиотека обгоняет Eigen (многократно) и FBGEMM на большинстве тестов. Дальнейшая работа будет направлена на внедрение библиотеки в наш движок для инференса.
Один из стандартных бенчмарков FBGEMM: произведение матриц
[M × 512] и [512 × 512]
Итоги
От Tinkoff Internship у нас остались только положительные впечатления. Круто, что нас считают полноценными участниками команды, дают реальные задачи и позволяют решать их самостоятельно. Если возникают трудности, наставники помогают, но не просто озвучивают советы, а дают возможность самому найти решение.
Решать задачи с людьми, не лишенными чувства юмора, которые могут профессионально руководить и писать крутой код, всегда дает отличный шанс развивать свои хард- и софт-скилы, набираться опыта и начинать свою работу в ИТ.
На Tinkoff Internship сейчас открыт новый набор — записаться и пройти экзамены можно до 8 декабря на сайте fintech.tinkoff.ru/internships/about