Od 15 lat zamieniam problemy biznesowe w systemy, które da się rozwijać latami. Zaczynam od zrozumienia domeny, dobieram architekturę do skali i do zespołu, a potem prowadzę ludzi przez jej wdrożenie — aż do produkcji i dalej.
final classStartOnboardingHandler
{
public function__construct(
privateProcessRepository$processes,
privateMessageBusInterface$bus,
) {}
public function__invoke(StartOnboarding$command): void
{
$process = Process::start(
$command->employeeId,
$command->template,
);
$this->processes->save($process);
$this->bus->dispatch(newProcessStarted($process->id()));
}
}
Behat 2300+ scenariosPHPStanPHP CS Fixer
Umiejętności
Najwięcej czasu spędzam w backendzie, ale funkcję oddaję całą: od modelu domeny, przez API i frontend, po konfigurację wdrożenia.
Backend
PHP 8+
Symfony 7 (Messenger, Doctrine)
Laravel
REST API
RabbitMQ
legacy Symfony 3.4
Piszę backend, który działa w produkcji latami: asynchroniczne przetwarzanie przez kolejki, pilnowane granice modułów i aktualne wersje frameworków i bibliotek.
Architektura
DDD
CQRS
Event Sourcing
Event Storming
modularny monolit
mikroserwisy
SOLID
TDD
Zaprojektowałem silnik procesów na DDD i CQRS od zera i współprojektowałem migrację monolitu do 36 mikroserwisów.
Frontend
React 18
Next.js
TypeScript
React Hook Form
Od półtora roku dowożę frontend swoich funkcji w panelu administracyjnym; własne produkty buduję w Next.js.
Bazy danych
PostgreSQL
MySQL
MongoDB
Redis
Elasticsearch
Doctrine
Prisma
W architekturze mikroserwisów ponad 30 baz: każda usługa z własną bazą i własną kopią danych.
Integracje
EasyCart
Stripe
Allegro
HubSpot
SMSAPI
EmailLabs
Brevo
Mailgun
Integracje, na których stoi biznes: płatności i subskrypcje w Stripe z obsługą webhooków, CRM w HubSpocie, SMS i e-mail transakcyjny.
Testy i jakość
Behat
PHPUnit
PHPStan
PHPArkitect
PHP CS Fixer
ESLint
Jest
Wprowadziłem Behat jako standard testowania w zespole — zestaw urósł do ponad 2300 scenariuszy.
Infrastruktura i CI/CD
Kubernetes (manifesty, kubectl, k9s)
Docker
Azure (AKS)
AWS (ECS/EKS, RDS, Lambda)
OVH
Bitbucket Pipelines
GitHub Actions
GitLab CI
Definicje Kubernetes dopisuję razem z funkcją — zmiana wychodzi z konfiguracją wdrożenia w jednym pull requeście.
Programowanie z AI
Claude Code
Codex
Gemini CLI
własne skille
integracje MCP
refaktoryzacja i testy z AI
Wprowadziłem Claude Code do pracy zespołu: skille do cyklu Jira → branch → pull request → review.
Prowadzenie zespołu
zespół 4–6 osób
tech lead od 2015
mentoring
code review
estymacje
standardy jakości i testów
Event Storming z biznesem
wdrażanie narzędzi w zespole
Jeden z sześciu tech leadów, gdy firma rosła z 6 do 30 inżynierów; prowadziłem zespół 5–6 seniorów i testerów.
Języki: polski (ojczysty), angielski B2: codzienna komunikacja techniczna
Case study
Najciekawsze problemy, które rozwiązywałem. Bez nazw firm — liczy się, co i jak zrobiłem.
Modularny monolit na DDD i CQRS
Silnik procesów HR w platformie SaaS do onboardingu pracowników — preboarding, onboarding i offboarding dla około 170 aplikacji klientów.
Moja rola: architekt i główny autor
Zaprojektowałem system od pustego repozytorium jako modularny monolit: moduły z własną domeną, granice i warstwy pilnowane automatycznie przez PHPArkitect.
Rozdzieliłem zapis od odczytu (CQRS) i zbudowałem mechanizm asynchronicznych command handlerów — ciężkie operacje idą przez kolejkę, a nie blokują żądań użytkownika.
Zaplanowane akcje, terminy, przypomnienia i alerty działają jako zdarzenia domenowe, więc nowe kroki procesu dodaje się bez ruszania istniejących.
Behat jako standard testowania każdej funkcji; system przeszedł wszystkie aktualizacje od Symfony 5.3 / PHP 8.0 do Symfony 7.4 / PHP 8.5.
Efekt: Ponad 7000 commitów i 2300+ scenariuszy Behat.
DDD
CQRS
Symfony Messenger
RabbitMQ
PHPArkitect
Behat
AI jako usługa w produkcie
Funkcje oparte na modelach językowych: dla klientów platformy, dla pracowników firmy i we własnych produktach.
Moja rola: projektant i wykonawca
Funkcja generowania pytań do ankiet na podstawie materiałów dostarczonych przez klienta: wgrywasz dokumenty, dostajesz gotowy zestaw pytań do przejrzenia.
Wewnętrzny chatbot z wiedzą z firmowego wiki — każdy pracownik może zadać pytanie i dostać odpowiedź opartą na dokumentacji firmy.
Serwer MCP otwierający API platformy dla asystentów AI: tokeny access i refresh wydawane per klient, przełącznik w panelu administratora.
Chatbot do wydawania poleceń naturalnym językiem we własnej aplikacji do zarządzania kalendarzem, zadaniami i powiadomieniami.
OpenAI
LLM
chatbot
MCP
Symfony
Z monolitu do 36 mikroserwisów
Platforma zakupu reklam w zewnętrznych sieciach reklamowych, która codziennie padała przy 50 tys. aktywnych użytkowników dziennie.
Moja rola: tech lead
W trzyosobowym zespole, z CTO i głównym administratorem, zaprojektowaliśmy nową architekturę całego ekosystemu: monolit w Laravelu zastąpiło 36 autonomicznych usług napisanych w różnych językach (PHP, Java, Python).
Później zespół, którym kierowałem, odpowiadał za 16 z tych usług.
Komunikacja asynchroniczna przez RabbitMQ, każda usługa z własną bazą i własną kopią danych; synchroniczne API tylko tam, gdzie chodziło o pieniądze.
Około 120 instancji i ponad 30 baz: Elasticsearch do dopasowań, MongoDB do statystyk, Redis, ELK.
Byłem jednym z sześciu tech leadów, gdy zespół rósł z 6 do 30 osób.
Efekt: Z 50 tys. do 3 milionów aktywnych użytkowników dziennie.
mikroserwisy
event-driven
RabbitMQ
Elasticsearch
MongoDB
Redis
Platforma, którą klient konfiguruje sam
Ta sama platforma SaaS — działy HR klientów modelują w niej własne procesy bez udziału programistów.
Moja rola: projektant modelu danych
Model danych dla pól i formularzy własnych, raportów, reguł dostępu do dokumentów, segmentów pracowników, wydarzeń i spotkań.
Integracje, na których stoi biznes: rozliczenia w Stripe (subskrypcje, linki płatności, webhooki), HubSpot CRM, wysyłka SMS.
Frontend tych funkcji w panelu administracyjnym na React 18 i TypeScript.
modelowanie danych
Stripe
HubSpot
webhooki
React
Programowanie z AI w zespole
Zespół produktowy 8–10 inżynierów.
Moja rola: inicjator i autor narzędzi
Przyniosłem Claude Code do codziennej pracy zespołu.
Napisałem skille do cyklu Jira → branch → pull request → review.
Współtworzyłem dokumentację CLAUDE.md dla modułów, żeby agent znał reguły architektury i testów.
Efekt: Zespół przyjął skille jako standard pracy.
Claude Code
skille
CLAUDE.md
code review
Zespół i CI/CD od zera
Aplikacja PWA do zwiększania motywacji pracowników do pracy, dla polskiego klienta.
Moja rola: lider zespołu
Prowadziłem zespół dwóch backendowców, frontendowca i testera; backend w Symfony, frontend w React.
Zbudowałem CI/CD w Bitbucket Pipelines: build, PHPUnit, PHPStan i PHP CS Fixer przy każdym commicie.
Wdrożenie na serwery dedykowane tylko po zielonym pipelinie.
systemami do pośrednictwa w sprzedaży kredytów i ubezpieczeń
usługami dla szkół jazdy, konfiguratorem diet i grami dla dzieci na Androida
oprogramowaniem miejskich kiosków informacyjnych
VibeAudit Audyt aplikacji zbudowanych z AI
Paweł Maj — Jestem twórcą tej usługi i osobiście prowadzę każdy audyt.
Twoja aplikacja powstała w kilka dni. Sprawdzam ją, zanim zrobi to ktoś inny.
Lovable, Bolt, Replit, Cursor, Claude Code — z nimi aplikacja powstaje szybko, ale nikt nie patrzy, gdzie leży baza, kto widzi sekrety i czy logowanie da się obejść. Przeglądam kod i infrastrukturę według 85 punktów kontrolnych w 8 obszarach, opartych na OWASP Top 10 i ASVS.
Każde znalezisko sprawdzam w kodzie, zanim trafi do raportu. Płacisz za ocenę seniora: co naprawdę Cię dotyczy, co jest groźne dziś, a co może poczekać.
W cenie audytu
raport po polsku w HTML i PDF
30-minutowa rozmowa o wynikach
jeden retest w ciągu 30 dni
przykładowy pipeline CI/CD dla Twojego repozytorium