Как стать автором
Обновить

Компания QIWI временно не ведёт блог на Хабре

Сначала показывать

Я создал принтер чеков для issues в GitHub

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

У меня есть много хобби-проектов в GitHub. Некоторые из них довольно популярны, поэтому к ним время от времени постят issues. Проблема в том, что они теряются в куче моих электронных писем или я забываю пройтись по своим репозиториям и добавить новые пункты в список дел.

Иногда я записывал новые issues на стикеры, когда видел уведомления, но всегда хотел найти предлог, чтобы упростить этот процесс. Однажды в кафе я увидел, как принтер чеков выплёвывает заказы, и задался вопросом, можно ли использовать его для печати тикетов каждый раз, когда в один из моих репозиториев добавляют issue.

Спойлер: у меня получилось!
Читать дальше →
Всего голосов 32: ↑30 и ↓2+28
Комментарии12

Оплачиваемые стажировки в QIWI — регистрация до 10 июля

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

Привет! Напоминаем о нашей программе стажировок во всех ключевых направлениях бизнеса по двум трекам: IT и развитие бизнеса. До конца регистрации осталось чуть больше недели, так что, если у вас есть желание — нужно зарегистрироваться до 10 июля.

Читать далее
Всего голосов 13: ↑11 и ↓2+9
Комментарии4

Загадочное дело о Raspberry Pi в шкафу для сетевого оборудования

Время на прочтение4 мин
Количество просмотров56K
Как-то я получил от своего отца (мы вместе с ним работаем на одного клиента) сообщение с приложенной фотографией.


Сообщение от отца

Я попросил его отключить устройство, положить в безопасное место, сфотографировать со всех сторон и сделать образ SD-карты (потому что в основном я работаю удалённо). Я работал над многими проектами с Raspberry Pi и был уверен, что разберусь в назначении этого устройства.

В тот момент ещё никто не думал, что оно может быть зловредным, скорее, все думали, что это экспериментирует кто-то из сотрудников клиента.
Читать дальше →
Всего голосов 160: ↑159 и ↓1+158
Комментарии51

We need to go deeper: диплинки и кодогенерация

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

Привет! Мы написали свою систему диплинков на основе кодогенерации. В этой статье поговорим, как мы упростили работу с диплинками и смогли отловить устаревшие, добавили мониторинг и как собрали все диплинки в одной статье в конфлюенсе.

Диплинк — это uri на конкретный ресурс в приложении. Они нужны бизнесу, чтобы упрощать пользовательский опыт. Так вместо нескольких переходов внутри приложения диплинки позволяют направить пользователя на определённый экран в один клик (польза для пользователя) и снимать статистику (польза для бизнеса). Например: на внешней площадке компания разместила баннер, в котором предлагается заказать виртуальную карту, пользователь может кликнуть по баннеру и сразу попасть на экран заказа карты, а бизнес сможет оценить, какая из площадок более эффективна.  

Самая большая проблема — это проблема безопасности. Объясню на примере активити, которая открывает веб-страницы. Активити открывается по диплинку, в нём указывается URL в качестве параметра. Один из вариантов атаки — когда злоумышленник может заставить пользователя пройти по диплинку с URL на вредоносный сайт и таким образом провести атаку. Ещё одна из возможных проблем — на некоторых экранах нам нужно валидировать параметры, а это иногда занимает значительную часть активити. Было бы хорошо вынести валидацию в отдельное место. 

Ещё у нас бывали случаи, когда маркетинг запускал промо-кампании либо с диплинками, в которых содержались ошибки, либо с устаревшими диплинками, которые уже не поддерживались, и мы могли об этом даже и не узнать. А при заведении новой кампании маркетинг обращался к разработчиками за диплинками и поиск занимал некоторое время. Если разработчик помнил название экрана и диплинк без параметров, то его можно было быстро найти, а если название экрана сразу не вспомнилось, то алгоритм поиска примерно такой: сбилдить проект -> пройти на нужный экран -> посмотреть в логах, какая активити открылась -> пойти в манифест для получения диплинка -> открыть исходных код активити для сбора входных параметров.

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

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

Dashboard as code, или как мы создание дашбордов автоматизировали

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

Привет! Мы в QIWI довольно давно применяем микросервисную архитектуру, но ее понимание не всегда было одинаковым: оно менялось со временем и эволюционировало. Наши первые микросервисы были достаточно большие по объему, но сейчас мы создаем сервисы гораздо меньшего размера с более узкой и ограниченной зоной ответственности. 

Часто такой сервис отвечает за конкретную небольшую фичу в нашем продукте (или вообще за часть фичи), или же за часть какого-то большого процесса. Нам такой подход нравится, поскольку микросервисы имеют независимые жизненные и релизные циклы, мы можем релизить фичи независимо друг от друга. Кроме того, различные команды могут работать в рамках одного продукта параллельно над разными фичами, не мешая друг другу и не сталкиваясь лбами. Это даёт нам возможность независимо масштабировать микросервисы и гораздо быстрее проверять гипотезы. В общем, плюсов много. 

Сейчас будет «Но», правда?

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

Читать далее
Всего голосов 27: ↑26 и ↓1+25
Комментарии6

Как мы мигрировали критичную БД с Oracle в CockroachDB

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

… простите, мигрировали куда? Туда!


CockroachDB — PostgreSQL-совместимая (по SQL-синтаксису DML) распределенная СУБД с открытым кодом (ну, почти). Ее название символизирует, что она, как таракан, выживает в любых экстремальных ситуациях. Лично мне крайне импонирует такая СУБД с привычным SQL-интерфейсом, настройка которой занимает 5 минут, которая хранит данные — как Kafka — на нескольких узлах в нескольких ЦОДах сразу, имеет настраиваемый replication factor на уровне конкретных таблиц, легко переживает потерю как одного узла, так и целого ЦОДа, использует для этого механизм распределенного консенсуса Raft и при этом еще и имеет строгую консистентность и уровень изоляции serializable. Разработчики CockroachDB — выходцы из компании Google, которые решили коммерциализировать архитектуру распределенной СУБД Spanner.



Недостатки тоже есть, не переживайте, но про них лучше в другой раз :)

Почему именно CockroachDB?


Среди распределенных SQL-СУБД есть альтернативы в виде Yugabyte и TiDB, и с прошлого месяца YDB. Вопрос «Почему?» связан в первую очередь с тем, зачем вообще нужна БД. Как мне кажется, БД нужна для того, чтобы надежно хранить данные и доставать их через стандартный язык SQL, а удобство ее использования — приятный, но вторичный фактор. Тут надо заметить, что я почти 9 лет проработал в техподдержке Oracle, и видел достаточно случаев порчи БД, как из-за дисковых сбоев и ошибок администраторов, так и из-за багов в приложении и даже в коде самой СУБД.

Ключевыми критериями выбора были:
Читать дальше →
Всего голосов 28: ↑27 и ↓1+26
Комментарии21

Security awareness — больше, чем просто фишинг. Часть 2

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

В прошлой части я рассказала про три активности в рамках security awareness — CTF, quiz и квесты. Сегодня рассказ пойдет о не совсем классических вариантах обучения, но не менее интересных, при этом затрону провальные истории.

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

Машина Тьюринга в Doom

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

DOOM (игра 1993 года для DOS) полон по Тьюрингу. Это значит, что можно запустить DOOM в DOOM. В статье приводятся подробности реализации.

Предисловие


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

Что такое полнота по Тьюрингу?


Итак, какую-то видеоигру можно назвать универсальной, полной по Тьюрингу или программируемой. Что это означает? По сути, это значит, что в этой игре можно реализовать компьютер. Но тут есть свои тонкости: если для этого игроку придётся делать слишком много, то это будет уже не так интересно.
Читать дальше →
Всего голосов 36: ↑35 и ↓1+34
Комментарии9

Сказ о том, как мы Python-микросервисы для облака шаблонизировали

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

Большая боль разработчиков, которые приходят на новый проект — для развертывания сервиса локально нужно пообщаться минимум с десятком людей, не говоря уже про интеграцию с CI/CD-сервером. В один момент мы решили реализовать это удобнее, заодно сократив время онбординга новых сотрудников. 

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

Меня зовут Олег Чуркин. Я больше 10 лет занимаюсь разработкой на Python и сейчас руковожу разработкой нового процессинга платежей в QIWI. Расскажу, как мы реализовали boilerplate-шаблон для сервисов — на примере небольшого стартапа внутри нашей большой компании.

Читать далее
Всего голосов 35: ↑34 и ↓1+33
Комментарии8

Как мы используем фича-флаги в мобильном приложении QIWI Кошелек

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

Привет, Хабр! 

Меня зовут Василий Материкин, я — Android-разработчик в QIWI. В этом посте я расскажу о применении фича-флагов в QIWI Кошельке.

Внедрение Trunk-Based Development и Feature Flags

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

Поэтому мы решили перейти на Trunk-Based Development (TBD). TBD предлагает работать в небольших ветках и, желательно, чтобы они как можно быстрее были влиты основную ветку. Для этого, конечно же, реализацию нового функционала нужно оформлять небольшими пулл-реквестами, чтобы они быстро проходили ревью и были влиты в основную ветку. Это, в свою очередь, создает другую проблему — когда в главной ветке может появиться код, который ещё не готов к релизу, но при этом нам нужно как-то релизить с этим кодом приложение. Мы же релизы выпускаем достаточно часто. И для этого TBD предлагает пользоваться такими подходами, как Branch by Abstraction (BBA) и Feature Flags (FF).

BBA позволяет выделить какой-либо функционал в отдельную абстракцию. Для этого создается интерфейс, который описывает контракт для работы с этим функционалом. Сразу же можно создать его текущую реализацию, просто скопировав код, который сейчас в продакшене. Также создается другая реализация (уже с новым функционалом) и с ней уже начинается работа. То есть обычно первый пулл-реквест при работе с фичей — это выделение кода, создается две реализации, эти изменения вливаются в главную ветку и далее продолжаем работать уже над новой реализацией. При этом в проекте (в продакшене) используется всё ещё старая реализация, пока мы не закончим работать над фичей.

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

Как мы в QIWI внедряли Kotlin Multiplatform Mobile Часть 2: Смотрим шире

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

Это продолжение нашего рассказа о внедрении Kotlin Multiplatform Mobile в QIWI. Если хотите узнать больше про технику, посмотреть на код, переходите в первую часть. В этой статье будет больше контекста про то, как мы принимали решение, готовили прототип и внедряли технологию в команды. Наш опыт может помочь вам “продать” KMM в вашей компании и вашим стейкхолдерам. Я расскажу о плюсах и сложностях, с которыми мы столкнулись на нашем пути.

Немного истории

В QIWI мы часто пробуем что-то новое в наших процессах и в разработке. За последние 5 лет мы создали несколько приложений с нуля, используя разнообразные подходы. Например, мы впервые попробовали кросс-платформу, когда делали приложение QIWI Инвестор. Мы использовали инструмент J2ObjC, чтобы конвертировать общий модуль с кодом на Java на Objective-c для iOS. Это решение было смелым, но не самым надежным. По ходу использования было много проблем, самые большие — с конвертацией кода сторонних библиотек. В итоге проект закрылся, как и этот эксперимент. Кросс-платформенный подход оказался рабочим, но мы отложили его в сторону пока не появился более надежный инструмент.

В 2018 году мы перешли от платформенных команд к кросс-функциональным. Это стало самым большим изменением в процессе разработки c внедрения скрама. “Совместное владение кодом” стало нашей новой ценностью. Границы между платформами начали размываться, мы стали внимательнее изучать код на других платформах, вместе принимали решения и делились лучшими практиками.

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

Как мы в QIWI внедряли Kotlin Multiplatform Mobile (KMM)

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

Привет, Хабр!

Меня зовут Кирилл Васильев, и я хотел бы рассказать, как мы в QIWI внедряли Kotlin Multiplatform Mobile (KMM). 

КММ — это технология кроссплатформенной разработки, позволяющая писать общий код под основные платформы за исключением UI-слоя. Все продукты со временем накапливают очень большой технологический контекст; КММ, в свою очередь, позволяет его облегчить, делая компоненты технологического стека общими для команд и платформ. Такие технологии дают неоспоримые преимущества — возможность использовать ресурс каждого разработчика при создании новых фич, единый набор тестов, улучшение инженерных практик в командах и прочее.

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

5% из 666 репозиториев Python содержат ошибки из-за запятых (в том числе Tensorflow, PyTorch, Sentry и V8)

Время на прочтение3 мин
Количество просмотров5.7K
Мы выяснили, что в 5% из 666 исследованных нами репозиториев Python с открытым исходным кодом на GitHub есть три бага, вызванных ошибочным использованием запятых.

Слишком мало запятых


Случайно пропущенная запятая в строке списка/кортежа/множества, приводящая к ненужной конкатенации строк.

Читать дальше →
Всего голосов 27: ↑26 и ↓1+25
Комментарии8

9 декабря — QIWI Server Party 7.0, онлайн

Время на прочтение1 мин
Количество просмотров684

Привет! В следующий четверг, 9 декабря, мы проведём наш седьмой QIWI Server Party.

Обсудим оптимизацию приложений на MongoDB, поделимся опытом проведения интеграционного тестирования в условиях множества сторонних API. Кроме этого — рассмотрим проблему с распределенными транзакциями в микросервисной архитектуре и поговорим об автоматизации создания дашбордов. В этот раз — всё в формате онлайн-трансляции на нашем Youtube-канале.

Зарегистрироваться можно на этой странице.

Под катом — программа митапа.

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

Security awareness — больше, чем просто фишинг. Часть 1

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

Чаще всего, когда читаешь про security awareness или повышение киберграмотности, то речь идет о фишинговых атаках - поддельные письма, сайты, странные вложения и прочее. Конечно, фишинг по-прежнему остается одним из основных сценариев атаки на сотрудников, но повышение осведомленности не должно ограничиваться только этим.

Мы в QIWI на протяжении последних 7 лет проводим недели безопасности, в рамках которых освещаем различные аспекты информационной безопасности. Расскажу про разные форматы заданий, которые мы проводили, какие плюсы и минусы были в каждом и почему. Надеюсь, что этот опыт будет полезен при проведении аналогичных активностей.

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

Developer Experience — как упростить себе жизнь с помощью правильных инструментов

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

Привет!

Продолжаем публиковать текстовые версии докладов с QIWI Server Party 6.0, в этом посте — Александр Прокопьев и Developer Experience. Про инструменты, их качество и развитие инструментов разработчиков в QIWI.

Если предпочитаете формат видео — держите.

А вот и текст.

У меня есть любимая притча. Мужик пилит дерево. Другой к нему подходит и спрашивает: 

— Как дела? Давно пилишь?
— Три дня уже.
— Что-то долго. Может, тебе стоит пилу заточить?
— Не, некогда точить, нужно дерево пилить. 

И в IT такое бывает часто. Работаешь над какой-нибудь рутинной задачей и думаешь, что вот наверняка есть какой-то инструмент, который может автоматизировать эту работу. Но сроки горят, и мы говорим себе: «Не в этот раз». И оставляем на потом. А когда работа завершается, мы быстро забываем про эту боль. 

Я, например, до сих пор использую старый SQL Developer для работы с базой данных, хотя все коллеги давно перешли на DataGrip. И они периодически подталкивают меня, а мне все лень. Кто-то пользуется Git-ом и никак не соберется с силами, чтобы изучить его поглубже, добавить в свой багаж более глубокие команды. А кто-то использует IDE и не изучает горячие клавиши или плагины, которые могут помочь в работе.

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

Безопасность Kubernetes — это просто

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

Привет, Хабр!

Эта статья - расшифровка доклада с QIWI Server Party

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

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

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

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

6 правил, которые пригодились бы мне, когда я осваивал программирование

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

В кодинге главное — не кодинг


Как вы думаете, что такое программирование?

Написание кода?

Написание хорошего кода?

Нет.

Это только часть истины.

Программирование — это не про кодинг. Программирование — это о решении задач при помощи кодинга.

Конечного пользователя не волнуют используемые вами технологии, языки, фреймворки и методологии. Их беспокоит только одно: решает ли ваш продукт их задачу.

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

Это самое важное, что я бы хотел знать, когда учился программированию.
Читать дальше →
Всего голосов 52: ↑45 и ↓7+38
Комментарии51

Компромисс скорости и качества разработки в agile. Как найти баланс

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

Привет!

Меня зовут Тимофей, и я продуктовый разработчик. О продуктовой разработке подробнее можно почитать тут

В моей работе многое строится на трейдоффах и компромиссах. В этой статье речь пойдёт о балансе между сроками и качеством разработки.

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

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

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

Читать далее
Всего голосов 14: ↑12 и ↓2+10
Комментарии6

PlantUML — инструмент продуктового разработчика

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

Я дико люблю ковыряться в чужом коде. Это одна из моих любимых специализаций. То есть я просто беру чужой код, анализирую его, читаю. Как я читал его раньше: я переводил код в русский язык. Описывал, что происходит по флоу кода, и пытался понять, что там происходит. Эти записи я в дальнейшем использовал как для написания статей в Confluence, так и для общего понимания происходящего.

С одной стороны, решение работающее. С другой, буквально через неделю-две я уже начинал сомневаться, достаточно точно ли я «перевел» с кода на русский язык? И тогда вспомнил про UML-диаграммы. И вместо того, чтобы записывать текст, стал визуализировать его и исписал неимоверное количество тетрадей. 

Но в какой-то момент подумал, что хорошо бы перевести все это в электронный вид, чтобы какой-то инкремент оставался. Не фоткать же, например, для документации, свою тетрадь с каракулями. Так я нашел инструмент PlantUML — opensource-решение, которое использует графическую библиотеку graphviz, превращающее код в наглядные схемы.

Давайте вспомним, что такое Unified Modeling Language. Чаще всего в университете UML используется для описания диаграммы классов.

Читать далее
Всего голосов 28: ↑28 и ↓0+28
Комментарии18
Изменить настройки темы