Владислав Тимофеев

Владислав Тимофеев

Разрабатываю backend-приложения от стартапов до highload-решений, помогаю с архитектурой и выстроить процессы разработки.

  • 10+ е-ком проектов;
  • помог 4+ стартапам;
  • 3+ страховые компании в качестве разработчика;
  • обучил 50+ мидлов и синьор;
  • 10+ тимлидов и техлидов.
TIMOFEEV Tech Talk
69 участников
4 июня
В Symfony и Laravel любят настраивать различные компоненты с помощью YAML, ассоциативных массивов, XML.

Когда YAML появился в моей жизни, я думал капец, как это круто! Стильно, модно, молодежно. Но ничего подобного. Радует, что “doctrine” отказались от YAML.

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

Я сейчас повсеместно внедряю конфигурации через объекты. Например, Doctrine Symfony Bundle в конфигурации с YAML выглядит так:


doctrine:
dbal:
dbname: '%env(resolve:APP_DATABASE_NAME)%'
host: '%env(resolve:APP_DATABASE_HOST)%'
port: '%env(resolve:APP_DATABASE_PORT)%'
user: '%env(resolve:APP_DATABASE_USER)%'
password: '%env(resolve:APP_DATABASE_SECRET)%'
logging: false
types:
custom: Acme\HelloBundle\MyCustomType



С конфигурацией через объекты этот же конфиг будет выглядеть так:


<?php

declare(strict_types=1);

return new DoctrineConfig(
dbal: new DbalConfig(
dbname: getenv('APP_DATABASE_NAME'),
host: getenv('APP_DATABASE_HOST'),
port: getenv('APP_DATABASE_PORT'),
user: getenv('APP_DATABASE_USER'),
password: getenv('APP_DATABASE_SECRET'),
logging: false,
types: [
new CustomType('custom', Acme\HelloBundle\MyCustomType::class),
]
)
);


Что это дает:

- не нужна валидация, описание схем, XML и т.д. ;
- есть пред глазами состав полей;
- есть перед глазами типы полей;
- есть ссылки на реальные классы, можно использовать быструю навигацию. В случае рефакторинга, можно увидеть где явно используется класс, можно воспользоваться функционалом Refactoring в PHPStorm, чтобы переименовать класс, или просто перенести его в другой namespace, все автоматически исправится в конфиге, не нужно потом в ручную выискивать.

По последней причине рекомендуется использовать именно способ PHP для конфигурация DI-контейнера. У Symfony три способа на выбор. В Laravel и либа PHP-DI только PHP конфигурация.

Понятное дело, что если использовать готовые адаптеры для пакетов или бандлы, то не везде возможно сконфигурировать предложенным способом. Но там где это возможно, отдаю приоритет в пользу конфигурации через объекты. Это делает процесс конфигурации и сопровождения кода намного приятней 🙂
👍
11
🔥
6
💯
3
🤗
1
78
17:14
17 мая
Datetime and Testing

Одна из основных головных болей в тестах это дата, а особенно “текущая” / now() в тестируемом коде.

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


public function testCreateObject(): void
{
$obj = new ObjectWithDateTime();
assertEquals(new DateTime(), $obj->createdAt);
}


Тест всегда будет падать, потому что, как минимум, будут отличаться микросекунды. При этом использование now() в самих тестах иногда приводят к их дестабилизации.

Первое, с чем нужно разобраться, это понять, как тестировать время, есть 3 варианта:

1️⃣ использовать date_create и date_create_immutable для создание текущий даты, это позволит замокать даты без помощи посторонних пакетов


<?php

namespace {
global $now;

$now = new DateTimeImmutable('2024-05-01 00:00:00');

$obj = new \Module\ObjectModule();

if ($obj->createdAt->getTimestamp() === $now->getTimestamp()) {
echo 'Даты равны' . PHP_EOL;
} else {
echo 'Даты разные' . PHP_EOL;
}
}

namespace Module {
final readonly class ObjectModule {
public \DateTimeImmutable $createdAt;

public function __construct() {
$this->createdAt = date_create_immutable();
}
}
}

namespace Module {
function date_create_immutable(string $datetime = 'now', ?DateTimeZone $timezone = null): \DateTimeImmutable|false {
global $now;

return $now;
}
}


2️⃣использовать пакет, которые позволяет заморозить время , например slope-it/clock-mock


ClockMock::freeze(new \DateTime('1986-06-05'));

// Code executed in here, until ::reset is called, will use the above date and time as "current"
$nowYmd = date('Y-m-d');

ClockMock::reset();

$this->assertEquals('1986-06-05', $nowYmd);


3️⃣ Использовать пакеты/компоненты, которые уже предусматривают мок времени для тестирования

Один из популярных пакетов briannesbitt/Carbon


// Don't really want this to happen so mock now
Carbon::setTestNow(Carbon::createFromDate(2000, 1, 1));

// Phew! Return to normal behaviour
Carbon::setTestNow();


И в прошлом году Symfony обзавелись собственным пакетом symfony/clock , но они предлагают использовать интерфейс ClockInterface как зависимоcть, что может быть непривычно на первый взгляд:


class MyClockSensitiveClass
{
public function __construct(
private ClockInterface $clock,
) {
// Only if you need to force a timezone:
//$this->clock = $clock->withTimeZone('UTC');
}

public function doSomething()
{
$now = $this->clock->now();
// [...] do something with $now, which is a \DateTimeImmutable object

$this->clock->sleep(2.5); // Pause execution for 2.5 seconds
}
}

$clock = new MockClock('2022-11-16 15:20:00');
$service = new MyClockSensitiveClass($clock);
$service->doSomething();


Чтобы не использовать внешние пакеты, можно пойти путем Symfony, и определить свой интерфейс ClockInterface

Второе о чем стоит думать, это то, что нельзя делегировать создание времени в другие системы, чаще всего такое утекает в SQL конструкции по типу


UPDATE order SET status = 'delivered', updated_at = NOW() WHERE id = 1234;



SELECT * FROM order WHERE creaed_at > DATE_SUB(CURDATE(), INTERVAL -5 DAY);


Вместо таких SQL конструкций лучше генерировать дату с помощью приложения, и передавать в качестве параметра. Как минимум ваша логика не будет утекать в БД

“Другими системами” могут ещё выступать классы или модули в вашей системе. Например, иногда в реализации репозитория можно встретить создание даты, но возможно, стоит рассмотреть дату как входящий параметр.
👍
9
🔥
4
1
🥰
1
115
15:24
8 мая
ADR

Три частые проблемы, с которыми я сталкиваюсь с архитектурными решениями:

- приходят разработчики и говорят, что нужно менять технологию X на Y;

- спрашиваешь участников проекта, почему в проекте реализована фича именно так, получаешь ответ “не помню” / "не знаю" / "человек, который принимал решение давно уволился";

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


Когда эти проблемы стали душить меня, вот тогда я открыл для себя ADR.

ADR - Architecture Decision Record, документ, в котором зафиксировано важно решение по архитектуре.

К таким решениям могут относится следующие аспекты:

- добавление в проект новой технологии или замены существующей;

- изменение структуры проекта;

- как компоненты будут взаимодействовать, например, через REST, gRPC, асинхронно и т.п. ;

- решения, которые влияют на функциональные и нефункциональные характеристики;

- переписать с нуля;

- разработка выглядит дорого.


В ADR включается в себя заголовок с порядковым номером, статус и описание решения. Здесь можно найти различные шаблоны https://github.com/joelparkerhenderson/architecture-decision-record

Для меня важно в ADR увидеть:

- проблему которую решает предложение (мотивация);

- само решение;

- рассмотренные альтернативы;

- последствия решения, а именно, что станет проще и какие проблемы появятся;

- значимость, приоритет, и затраты (стоимость обслуживания, человека-часах, story points, и годовая стоимость, если подразумевается приобретение какой-то технологии).


Каждая записка формирует журнал архитектурных решений (ADL), которому можно обратиться и найти ответ на вопрос, почему мы делаем именно так, а не иначе. А так же оценить решение перед началом его внедрения, и осознано принять решение.
👍
7
🔥
3
👏
3
2
132
12:41
5 апреля
Белый лист

Страх белого листа - страх начать что-то делать.

Это интересная прокрастинация))

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

Художники использую термин "страх белого холста”

У нас, у разработчиков, наверное этот термин назывался бы “страх чистой IDE” 😄  

Я сталкивался с этой проблемой на себе, я мог сидеть и залипать в IDE часами, не написав ни одной строчки. Я выработал для себя подход для преодоления этого страха, сейчас поделюсь им.

Я никогда не думал об этой проблеме и не знал , что она массовая, имеет термин “белый лист” и как её решать. А сегодня посмотрел новый выпуск Топлес о нейронках, и в нем были упомянуты “Диффузионные модели” , их используют Midjourney, DALL-E 2, Stable Diffusion, YandexArt для генерации картинок. Но чтобы нейронки сгенерировали, на вход нужно подать изображения состоящего из рандомных пикселей. Выглядит как шум на старых телеках, когда нет сигнала. Это помогает нейронкам решить проблему белого листа.

И вот здесь я осознал, что делаю точно так же. Но вместо шума я использую говнокод, который сам же и на писал )

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

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

Если хватает насмотренности и/или есть устоявшаяся архитектура в проекте, то начинаю сразу со структуры.

Не нужно бояться ошибаться, написать ужасный код, особенно не нужно сидеть планировать 6 часов как реализовать таск, чтобы с первого раза написать идеальный код.

Just Do It, ide всё стерпит (с) Json Stetmen
🔥
14
3
👍
2
🤔
2
🥰
1
199
10:05
29 марта
Я всегда был в окружении сильных бекендеров, и слабых фронтов, не то чтобы не встречал сильных, но их было единицы. Как все бэкендеры я прошел через фронтовые задачи, даже как-то раз сверстал огромный лендос для красного ретейлера, было и формошлепство, и делал сложные задачи, включающие оптимизацию рендеринга и т.д. Этого опыта мне достаточно, чтобы оценить компетентность фронтенд-специалиста.

Долгое время, моя установка была такова: чтобы сделать классный продукт, нужен сильный бекенд, а фронт уже как приложится, если что научим.

Мировоззрение начало меняться когда я пошел в наставничество, но кардинально всё изменилось, когда я начал управлять продуктами.

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

Пользователю не важен ваш бекенд, но ему важен интерфейс и удобства. Оцените на себе, вам больше нравится Outlook или Gmail ? Telegram или Viber ? Yandex- , VK- или Beeline Music? Youtube или Rutube? Apple TV или Okko ?

Мне лично все равно как там всё внутри устроено, я лично нажимаю на кнопки, и все должно быть удобным и желательно ещё красивым.

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

Вот парочку проектов, которые меня вдохновляют:

1) Всеми любимый Notion - вроде как весь на ts + nodejs + react

2) Miro - отчасти на стеке nodejs + ts + react

3) https://github.com/outline/outline - opensource, крутая вики на ts + nodejs + react

4) https://github.com/twentyhq/twenty - opensource, crm на ts + nodejs + react

5) https://github.com/ever-co/ever-gauzy - opensource, erp, crm , hrm система, также ts + nodejs + react

Оцените, в них есть стиль.

Opensource проекты на PHP, они классные и функциональные , но не захватывают своей красотой и дружелюбностью )

Короче, не забывайте про UI/UX
🔥
10
👍
2
2
190
18:47
18 марта
Забирайте шпаркалку по Low Coupling & High Cohesion
🔥
10
👍
4
1
❤‍🔥
1
205
18:02
4 марта
Три базовые вещи, которые нужно знать, чтобы быстро погружаться в любой фреймворк

Shortpost

1. Жизненный цикл запроса
2. DI / Service Locator
3. Данные: ORM, Query Builder, DBAL

Longpost

1 Жизненный цикл (ЖЦ) запроса

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

Также стоит знать PSR-7

Популярные библиотеки

- symfony/routing
- Slim
- bramus/router
- nikic/FastRoute

2 DI / Service Locator

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

Нужно знать как работают контейнеры, как конфигурируются, что такое autowire, декораторы, фабрики, основные способы инъекции зависимостей.

Изучить PSR-11

Популярные библиотеки

- symfony/dependency-injection
- PHP-DI/PHP-DI
- Illuminate/Container
- laminas/laminas-servicemanager

3 Данные

Данные в большинстве случаев хранятся в реляционных БД. Фреймворки предоставляют интеграцию библиотек для работы с БД по типу ORM, Query Builder, DBAL .

ORM - паттерн, который связывает данные из БД с вашими объектами-сущностями в коде. Про ORM нужно знать, что существует два типа ActiveRecord (AR) и DataMapper.

QueryBuilder - инструмент, предоставляет удобный способ для составления запросов к БД.

DBAL - создает абстракцию над БД, позволяет писать запросы независимо от конкретной БД, как правило удобная обертка на PDO.

ORM, Query Builder, DBAL не являются взаимозаменяемыми, а некоторые из них основаны на базе других, например, ORM может использовать Query Builder и DBAL , как от собственных вендеров так и сторонних.

Популярные библиотеки

- doctrine/orm
- doctrine/dbal
- cycle/orm
- illuminate/database
- gabordemooij/redbean


Для других типов БД, есть свои инструменты, но они уже как правило общие для всех, либо с какой-то оберткой под конкретный фреймворк.



Понимание этих трех вещей легко даст вам переключаться между Laravel, Symfony, Yii, Spiral, CackePHP. Да, у них разные реализации, свои методы и т.д. , но принципы одни. Так же это и справедливо для других ЯП, например, Java, Go, NodeJs.

Также вы можете собрать свой “фреймворк” выбрав по одной либе в каждой секции, например:

1) slim + php-di + doctrine

2) bramus/router + Illuminate/Container + cycle/orm

3) nikic/FastRoute + laminas/laminas-servicemanager + illuminate/database

4) и т.д. , всё что пожелает ваша душа
🔥
13
4
2
236
09:34
8 февраля
Зацените прикол, словили ошибку при установке composer на pipeline, всё дело в том, что команда composer задеплоили код с ошибкой. Вот это мы везунчики. Решил просто поделиться 😁

p.s. По истории запусков джобы, вы можете заметить, что мы очень настойчивые 😁 главное верить

p.p.s composer , я всё видел 😑😅
😱
4
😁
2
🏆
1
227
16:31
Кейсы
Каталог ИМ электротоваров nda

Интернет-магазин в стандартной связке Bitrix — 1C, управление каталогом происходит в 1С, ежедневный обмен между сайтом и 1С, проблема: во время импорта ИМ начинает тормозить, 1С тяжело работать с товарной базой, 1С долго загружает каталог, из-за чего менеджер тратит 15-20 минут на составления одного документа (накладная, акт и т.д.).
Моя задача была провести аналитику, разработать архитектуру, собрать и организовать команду разработки.
Мы внедрили и доработали под нужды клиента PIM, за основу взяли один из продуктов Ensi, адаптировали схемы кафки под проект. Разработали микросервис «Витрина» с использованием elasticsearach, для отображения, полнотекстового и фасетного поиска товаров на стороне интернет магазина. Реализовали отдельный микросервис для импорта товаров из 1С и RAEC.
Результат: загрузка страницы каталога меньше секунды с товарной базой в 1,5 млн товара. Удобный интерфейс управления товаром. Автоматическое масштабирование сервисов при больших объемах обмена товарами между системами. Техническое задание для 1С разработчиков для интеграции с системой PIM.
Роль: Teamlead, Архитектор
Технологии: PHP 8.1, Symfony, PostgreSQL, Kafka, Redis, Grafana, Elasticsearch, Docker, Filebeat, S3, Roadrunner, DDD

Отдел разработки веб-приложений аутсорс-компании

Руководил отделом разработки аутсорс компании с оборотом 50+ млн в год.

HR и рекрутинг

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

Обучил HR-менеджера стеку компании и взаимозаменяемым технологиям.

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

Проработали ограничивающую мотивацию, она включала в себя кодекс поведения, например, где разрешено курить, а где нет и чем это карается, рекомендации по коммуникациям (например, тл, не любят, когда их отвлекают оффлайн, они могли готовиться к собеседованиям или созвону с клиентам, им комфортнее, когда им предварительно пишут в личку), соблюдение порядка на кухне и т.д. Это позволило быстрее адаптироваться новым сотрудникам, а старые сотрудники меньше испытывали дискомфорт от пополнения команды. После этого, мы разработали Playbook, куда вошла ограничивающая мотивация, а также информация о компании, кейсы компании, раздел who is who, вопросы ЗП, больничных и отпусков, FAQ. Что способствовало ещё скорой адаптации новых сотрудников и знакомству с компанией.

Внедрил на постоянную основу анализ рынка, какие ЗП и бенефиты предлагают другие компании.

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

Программа обучения для стажеров

Курировал программу обучения стажеров направление Bitrix:

  • найм стажеров;
  • подготовка менторов;
  • актуализация программы обучения;
  • отслеживания темпов прохождения обучение стажеров;
  • выявление узких мест и их закрытие.

Разработал программу обучения Laravel.

Курировал разработку программы обучения фронтенд-разработчиков React , и запустил 3 потока стажеров.

People management
  • занимался организацией внутренних митапов, выступал сам;
  • разработал систему грейдов и организовал аттестацию сотрудников по защите грейдов;
  • составлял ИПР;
  • проводил one-to-one встречи;
  • отвечал за ЗП и премии;
  • отвечал за мотивацию сотрудников и климат в командах;
  • менторил тимлидов;
  • внедрил roadmap для тимлидов и менторов.
Инженерная культура

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

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

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

Проектное управление
  • занимался построением цикла разработки (прием задач/оценка/сроки/сдача/раскатка/приёмка), внедрял в команды готовые решения Kanban/Scrum, упрощенные и смешанные типы на их базе;
  • занимается генерацией бэклога и его приотизацией;
  • интегрировал клиентов в процесс разработки, чтобы сделать процесс прозрачнее, помогал с продуктовой стратегией как технический специалист, участвовал в составлении роадмапа продукта;
  • управлял рисками проектов;
  • занимался подбором команды под проект.
Продажи
  • участвовал в пресейлах, составлении сметы, изучение требований и рисков;
  • составлял роадмап проекта;
  • занимался подготовкой коммерческого предложения и проводил его защиту;
  • внедрил систему критериев оценки лидов;
  • развивал аутстаф канал, общение и знакомство с партнерами, подбор разработчиков.
Экосистема аутсорс-компании

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

Корпоративный портал

Корп. портал предоставлял функционал для управления списками сотрудников, создание учетных записей сотрудников при найме, и блокировки при увольнении; интеграция с Yandex360 для создания корпоративной почты. На базе Btirix 24 оцифровал бизнес-процесс для стажировки разработчиков в компании, включал в себя автоматическое создание задач, трек времени, контрольные точки и сбор метрики для повышения качества стажировки, интеграция с gitlab для автоматического создания шаблонного репозитория стажера. Основной функционал реализован на базе Bitrix 24. Мы с командой придумали как внедрить React-компоненты в стандартные шаблоны битрикса, это позволило нам получать обновления битрикса без проблем. Проектом занималась команда из 4 человек: Тимлид, два Backend и один Frontend разработчики. Ну и я пятый, в качестве Product owner.

Результат: был автоматизирован процесс онбординга, hr-менеджер мог самостоятельно заводить сотрудников, и проводить увольнения, назначать программу стажировки и менторов. Руководители и менторы получили инструмент для отслеживания прогресса стажера, а так же возможность находить слабые места в программе стажировки.

Технологии: Bitrix24, ReactJs

Outstaff направление
  • я спроектировал микросервис для оформления резюме сотрудников, команда реализовала сервис с помощью laravel + react, в команда было 3 человека: TL, Backend и Frontend разработчики;
  • мы разработали телеграмм-бота, который собирал запросы поиска разработчиков из телеграмм каналов и добавлял задачи в jira. Это помогло аккаунт-менеджеру и сейлеру не пропускать актуальные заявки из большого числа чатов.
Планирование и учет прибыли

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

С командой разработчиком создали MVP планирование на базе Bitrix24.

Был проработан бизнес-процесс по учету времени и формирование актов. В результате аккаунт-менеджер стал справляться за 2 часа вместо 16 часов, и стало меньше ошибок в документах. Выполнен был анализ будущей системы для автоматизации процесса, по плану было сократить время работы аккаунт менеджера с 2 часов до одного щелчка мыши. Мое участие в проекте закончилось после формирование проектной документации.

Внедрил SSO на базе Keycloak для всех сервисов компании.

Кол-во сервисов росло, и становилось всё тяжелее управлять пользователями, потому что при устройстве новых сотрудников или увольнении текущий вносить изменения почти в десяток сервисов, Keycloak позволил организовать единое место для управления учетными записями сотрудников.

Внедрил Outline для ведения документации компании.

Outline/Outline - крутой инструмент для документации, использовали его как для проектной документации, так и для внутренних регламентов.

Внедрил Jira для отдела разработки и сейлеров
YouTravel.me - площадка для организации путешествий

С этим проектом я познакомился в начале своей карьеры, занимался разработкой и сопровождением площадки, работал над локализацией проекта, автоматическим переводом контента через deepl, выполнил интеграцию телефонии Vox Implement, принимал участие в разработке функционала платежей и мини crm для турооператоров. Разработал интеграцию с MailChimp.
Сегодня я консультирую разработку бекенд части одного из сервисов YouTravel.me. Мы решаем вопросы распила монолита на битрикса, способы коммуникации между сервисами, работаем над качеством проекта. Помогаю подобрать сотрудников и построить крутой skillmap для развития компетенций разработчиков в штате.
Роль: Консалтинг
Технологии: Vue, Laravel, RabbitMQ, Bitrix, MySql, VoxImplant, Stripe, Deepl

Калькулятор расчета пошлин nda

Клиент обратился за помощью запустить MVP для показа инвесторам. Я занимался сбором требований, функциональный и нефункциональных требований, мы с командой разработали прототипы, реализовали базовый функционал и уложились в 2 недели.
Роль: Teamlead
Технологии: PHP 8.1, Laravel, Docker, ReactJs, PostgreSQL

CRM для торговых сетей по продаже бытовой техники и электроники nda

У заказчика две торговых сети и два интернет-магазина. Задача нашей команды была разработать модуль интеграции с интернет-магазинами для обмена данными по B2B сегменту: контакты, заказы, сделки. Все сущности проходили этапы валидации, а компании проверяли в реестре ЕГРЮЛ. Я выступал в качестве техлида, занимался архитектурой модуля, интеграцией с репликой и кафкой. В моменте мы выгрузили около 180к действующих компаний и 800к контактов.
Роль: Techlead
Технологии: PHP, Битрикс 24, Kafkа, MySql

Интернет-магазин электроники, цифровой и бытовой техники федерального уровня nda

Я принимал участие в проекте в качестве бекенд-разработчика, занимался развитием жизненного цикла заказа, системой лояльности покупателей, поддержкой механики скидок, интеграции с CRM и системой управления заказами. Принял участие в разработке API для мобильного приложения. Одна из интересных задач - необходимо было перевести проект с PHP 7.4 на 8.0.
Роль: Developer
Технологии: PHP 8, 1С-Битрикс, RabbitMQ, Kafkа, REST, SOAP, Rector

😎