W 2024 napisałem pierwszy wpis o AI w pracy PHP developera. Minęły dwa lata i obraz zmienił się radykalnie. Nie chodzi już o pytanie „czy używać AI” – chodzi o to jak wbudować narzędzia w workflow żeby nie traciły czasu a go oszczędzały. Po dwóch latach codziennego użycia mam precyzyjny obraz co działa, co nie działa i jak zorganizować pracę żeby wyciągnąć maksimum bez polegania na narzędziu więcej niż powinno.
Stack AI tools w 2026 – co zostało, co odpadło
| Narzędzie | Status 2024 | Status 2026 | Powód zmiany |
|---|---|---|---|
| GitHub Copilot | Eksperyment | Codziennie | Nowy model znacznie lepszy przy PHP 8.x i Magento patterns |
| ChatGPT | Regularnie | Rzadko | Zastąpiony przez Claude z dłuższym kontekstem |
| Claude | Regularnie | Codziennie (główne narzędzie) | 200k tokenów – cały moduł Magento do kontekstu |
| Cursor IDE | Beta test | Projekt po projekcie | Refaktoring z kontekstem projektu jest realnie użyteczny |
| Ollama (lokalne) | Eksperyment | Dla klientów z wymogami NDA | DeepSeek V3 lokalnie dorównuje GPT-4o sprzed roku |
Codzienny workflow – szczegółowo
# Typowy dzień - kiedy sięgam po AI # 1. Implementacja nowej funkcjonalności # Copilot w IDE przez cały czas # Claude przy projektowaniu API/interfejsów # 2. Code review (własnego kodu przed PR) # diff | claude "review this PHP Magento 2 code for: # - type safety issues # - missing null checks # - Magento 2 anti-patterns (direct model usage, no page size limit) # - missing tests for edge cases" # 3. Debugowanie # Stack trace + kontekst -> Claude # "Mam ten błąd w Magento 2 przy składaniu zamówienia z MSI. # Oto stack trace [...] # Oto kod pluginu [...]. # Co może powodować ten błąd?" # 4. Pisanie testów # "Napisz testy PHPUnit dla tej klasy. # Pokryj happy path i następujące edge cases: [lista]" # 5. Dokumentacja / PHPDoc # Copilot Chat lub Claude # "Napisz kompletny PHPDoc dla tej metody"
Gdzie Claude 200k kontekstu zmienia grę
<?php // Przykład promptu który nie był możliwy 2 lata temu przez limit tokenów /* Prompt do Claude (rzeczywisty, skrócony): "Mam moduł Magento 2 do integracji z systemem ERP. Wklejam wszystkie klasy modułu (12 plików, ~1500 linii). [...całe 12 plików kodu...] Pytania: 1. Gdzie w tym kodzie może być problem z N+1 queries? 2. Czy jest coś co narusza Magento 2 service contracts? 3. Jakie edge cases nie są pokryte przez testy? 4. Jak zrefaktorować ErpSyncService żeby lepiej obsługiwał błędy? " Odpowiedź Claude (fragment): - "W linii 147 ErpProductMapper::mapAttributes() iterujesz po $product->getAttributes() i dla każdego atrybutu wywołujesz $this->attributeRepository->get($code). To klasyczny N+1 – załaduj wszystkie atrybuty z kolekcją przed pętlą." - "W OrderService::createErpOrder() nie używasz OrderRepositoryInterface::save() ale bezpośrednio $order->save() – omijasz pluginy i service contracts." - "Brakuje testów dla przypadku gdy ERP API zwraca HTTP 429 (rate limiting)" */ // Stary workflow (bez dużego kontekstu): // Kopiuj-wklej jedną klasę -> pytaj -> zmień kontekst -> kopiuj-wklej następną // = 45 minut analizy // Nowy workflow (z 200k tokenów): // Wklej wszystko raz -> kompletna analiza całego modułu // = 5 minut
AI do generowania testów – mój aktualny flow
<?php
declare(strict_types=1);
// Klasa do przetestowania
class PriceRuleService
{
public function __construct(
private CustomerGroupRepository $groupRepo,
private ProductRepository $productRepo
) {}
public function getCustomerPrice(int $productId, int $customerId): float
{
$product = $this->productRepo->getById($productId);
$group = $this->groupRepo->getByCustomerId($customerId);
$basePrice = $product->getPrice();
$discount = match($group->getCode()) {
'vip' => 0.20,
'wholesale' => 0.15,
'loyal' => 0.05,
default => 0.0,
};
$finalPrice = $basePrice * (1 - $discount);
// Minimum price floor
return max($finalPrice, $product->getMinAllowedPrice() ?? 0.0);
}
}
// Prompt do Claude:
// "Napisz kompletne testy PHPUnit dla PriceRuleService.
// Pokryj wszystkie grupy klientów, edge case z minimum price,
// i przypadek gdy produkt lub klient nie istnieje (rzuca wyjątek).
// Użyj MockObject do mockowania zależności."
<?php
// Wygenerowane przez Claude - lekko zedytowane
declare(strict_types=1);
class PriceRuleServiceTest extends TestCase
{
private MockObject $groupRepo;
private MockObject $productRepo;
private PriceRuleService $service;
protected function setUp(): void
{
$this->groupRepo = $this->createMock(CustomerGroupRepository::class);
$this->productRepo = $this->createMock(ProductRepository::class);
$this->service = new PriceRuleService($this->groupRepo, $this->productRepo);
}
/** @dataProvider customerGroupProvider */
public function testAppliesCorrectDiscount(
string $group, float $basePrice, float $expected
): void {
$product = $this->createMock(Product::class);
$product->method('getPrice')->willReturn($basePrice);
$product->method('getMinAllowedPrice')->willReturn(null);
$customerGroup = $this->createMock(CustomerGroup::class);
$customerGroup->method('getCode')->willReturn($group);
$this->productRepo->method('getById')->willReturn($product);
$this->groupRepo->method('getByCustomerId')->willReturn($customerGroup);
$this->assertEqualsWithDelta($expected, $this->service->getCustomerPrice(1, 1), 0.01);
}
public static function customerGroupProvider(): array
{
return [
'vip 20% off' => ['vip', 100.0, 80.0],
'wholesale 15% off' => ['wholesale', 100.0, 85.0],
'loyal 5% off' => ['loyal', 100.0, 95.0],
'retail no discount' => ['retail', 100.0, 100.0],
'unknown no discount'=> ['guest', 100.0, 100.0],
];
}
public function testRespectsMinimumPriceFloor(): void
{
$product = $this->createMock(Product::class);
$product->method('getPrice')->willReturn(10.0);
$product->method('getMinAllowedPrice')->willReturn(9.5);
$group = $this->createMock(CustomerGroup::class);
$group->method('getCode')->willReturn('vip'); // 20% off = 8.0 PLN
$this->productRepo->method('getById')->willReturn($product);
$this->groupRepo->method('getByCustomerId')->willReturn($group);
// Po rabacie 20% = 8.0, ale minimum to 9.5 -> zwróć 9.5
$this->assertEquals(9.5, $this->service->getCustomerPrice(1, 1));
}
}
Czego AI NIE robi dobrze – updated 2026
Dwa lata późniejsza, uczciwa lista ograniczeń:
- Decyzje architektoniczne – AI sugeruje wzorce, ale nie zna Twojego długu technicznego, ograniczeń teamowych i historii projektu. Tu własna głowa jest niezbędna.
- Specyficzne wersje Magento i moduły zewnętrzne – Claude i Copilot nie wiedzą że Twój vendor X zrobił breaking change w wersji 3.2.1. Knowledge cutoff jest realnym ograniczeniem.
- Złożone problemy z cache Magento – „Dlaczego FPC nie cachuje tej strony dla zalogowanych” wymaga znajomości całego stosu, nie tylko kodu.
- Security audit – AI wskazuje oczywiste problemy (SQL injection, brak sanityzacji), ale subtelne podatności w logice biznesowej wymagają ludzkiego oczu.
- Performance profiling – Blackfire i EXPLAIN muszą być interpretowane przez człowieka który rozumie kontekst projektu.
Prompt engineering dla PHP developera – co działa
# Efektywne prompty dla PHP/Magento 2 kodu # Dobry: "Mam klasę Magento 2 która pobiera produkty przez Service Contracts. Kod: [...] PHPStan level 8 raportuje błąd: [...] Jak naprawić zachowując kompatybilność z PHP 8.4?" # Zły: "Napraw ten kod PHP" # zbyt mało kontekstu # Dobry: "Napisz testy PHPUnit dla metody XYZ. Pokryj przypadki: - happy path z poprawnym wejściem - null jako parametr opcjonalny - wyjątek gdy produkt nie istnieje Użyj MockObject dla zależności, nie twórz prawdziwych obiektów Magento." # Zły: "Napisz testy" # bez specyfikacji co testować # Dobry przy code review: "Przejrzyj ten plugin Magento 2 pod kątem: 1. Czy around plugin jest niezbędny czy wystarczy before/after? 2. Czy są potencjalne problemy z wydajnością? 3. Czy obsługa błędów jest kompletna? Wersja Magento: 2.4.8, PHP 8.4" # Szablon który używam przy większości code review: "Magento 2.4.8, PHP 8.5 Kontekst: [opis co moduł robi] Kod: [...] Sprawdź: - Typowanie i null safety - Service Contracts (Repository zamiast Model) - Potencjalne N+1 queries - Missing edge cases w testach"
Podsumowanie
Dwa lata z AI tools dały mi klarowny obraz: to nie jest narzędzie które zastępuje wiedzę, to narzędzie które amplifikuje prędkość pracy osoby z wiedzą. Mój junior who-knows-the-patterns stał się szybszym senior-with-AI. Kluczowe zasady 2026: Claude z dużym kontekstem do analizy całego modułu, Copilot inline do boilerplate, lokalne modele (Ollama) dla kodu NDA, zawsze weryfikuj każdą sugestię przez własne rozumienie. Czas zaoszczędzony na mechanicznych zadaniach idzie na architekturę i debugging – obszary gdzie wiedza domenowa wciąż dominuje.
