Przejdź do głównej zawartości

Od planu do kodu

Luka między genialnym planem a działającym oprogramowaniem to miejsce, gdzie większość projektów się potyka. Claude Code łączy tę przepaść autonomicznymi możliwościami implementacji, które mogą przekształcić twoje decyzje architektoniczne w kod produkcyjny z terminalną prędkością. Ta lekcja bada, jak skutecznie wykorzystać te możliwości.

Scenariusz: Właśnie skończyłeś planować złożoną funkcję - system powiadomień w czasie rzeczywistym obejmujący frontend, backend i mobile. Architektura jest solidna, plan jest szczegółowy, ale teraz nadchodzi zniechęcające zadanie implementacji w ponad 50 plikach. Tradycyjne podejście? Dni kodowania, przełączania kontekstu i nieuniknionych niespójności. Z Claude Code? Patrz.

Okno terminala
# Dzień 1: Konfiguracja backendu
- Stwórz modele powiadomień
- Napisz migracje bazy danych
- Zaimplementuj handlery WebSocket
- Dodaj endpointy REST
# Dzień 2: Integracja frontendu
- Stwórz komponenty powiadomień
- Skonfiguruj klienta WebSocket
- Zaimplementuj zarządzanie stanem
- Dodaj interakcje UI
# Dzień 3: Aktualizacje mobile
- Przenieś logikę na mobile
- Obsłuż powiadomienia push
- Testuj na platformach
# Dzień 4-5: Naprawy błędów i integracja
  1. Skonfiguruj tryb Yolo

    Okno terminala
    # Dla maksymalnej autonomii
    claude config set autoApprove true
    # Lub rozpocznij sesję z:
    claude --auto-approve
  2. Ustaw preferencje implementacji Stwórz .claude/settings.json:

    {
    "implementation": {
    "testFirst": true,
    "runTestsAfterChanges": true,
    "commitAfterFeature": true,
    "lintBeforeCommit": true
    },
    "codeStyle": {
    "language": "typescript",
    "framework": "react",
    "testFramework": "jest"
    }
    }
  3. Przygotuj przestrzeń roboczą

    > Przed implementacją, upewnij się że:
    > - Wszystkie zależności są zainstalowane
    > - Testy przechodzą
    > - Jesteśmy na branchu funkcji
    > - Plan jest w docs/notification-plan.md
  4. Stwórz komendy implementacji Zapisz w .claude/commands/implement-feature.md:

    Zaimplementuj funkcję: $ARGUMENTS
    1. Przeczytaj dokument planu
    2. Stwórz niezbędne pliki i foldery
    3. Zaimplementuj backend pierwszy
    4. Dodaj kompleksowe testy
    5. Zaimplementuj frontend
    6. Zaktualizuj dokumentację
    7. Uruchom wszystkie testy
    8. Stwórz opisowe commity

Zacznij od struktury wysokiego poziomu, potem wypełnij szczegóły:

> Zaimplementuj usługę powiadomień odgórnie:
> 1. Stwórz ogólną strukturę plików
> 2. Zdefiniuj interfejsy i typy
> 3. Zaimplementuj podstawową logikę
> 4. Dodaj obsługę błędów
> 5. Napisz testy

Podejście Claude:

Faza 1: Struktura

Tworzenie struktury systemu powiadomień...
src/
notifications/
├── index.ts
├── types.ts
├── service.ts
├── handlers/
│ ├── websocket.ts
│ └── push.ts
├── storage/
│ ├── redis.ts
│ └── postgres.ts
└── __tests__/

Faza 2: Interfejsy

types.ts
export interface Notification {
id: string;
userId: string;
type: NotificationType;
title: string;
body: string;
data?: Record<string, any>;
read: boolean;
createdAt: Date;
}
export interface NotificationService {
send(notification: Notification): Promise<void>;
markAsRead(id: string): Promise<void>;
getUnread(userId: string): Promise<Notification[]>;
}

Faza 3: Implementacja

service.ts
export class NotificationServiceImpl implements NotificationService {
constructor(
private storage: NotificationStorage,
private broadcaster: NotificationBroadcaster
) {}
async send(notification: Notification): Promise<void> {
// Przechowaj powiadomienie
await this.storage.save(notification);
// Rozgłoś do podłączonych klientów
await this.broadcaster.broadcast(notification);
// Kolejkuj powiadomienie push
await this.queuePushNotification(notification);
}
}

Faza 4: Testowanie

__tests__/service.test.ts
describe('NotificationService', () => {
it('wysyła powiadomienia do storage i broadcastera', async () => {
const mockStorage = createMockStorage();
const mockBroadcaster = createMockBroadcaster();
const service = new NotificationServiceImpl(
mockStorage,
mockBroadcaster
);
await service.send(testNotification);
expect(mockStorage.save).toHaveBeenCalledWith(testNotification);
expect(mockBroadcaster.broadcast).toHaveBeenCalledWith(testNotification);
});
});

Implementuj kompletne wertykalne kawałki:

> Zaimplementuj system powiadomień funkcja po funkcji:
> 1. Użytkownik otrzymuje powiadomienie (full stack)
> 2. Użytkownik oznacza jako przeczytane (full stack)
> 3. Aktualizacje w czasie rzeczywistym (full stack)
> Każda funkcja powinna działać end-to-end przed przejściem do następnej

To podejście zapewnia, że każda funkcja jest w pełni funkcjonalna przed przejściem dalej.

Dla mikroserwisów lub wielu repozytoriów:

> Musimy zaimplementować wsparcie powiadomień w usługach:
> - API Gateway: Dodaj endpointy powiadomień
> - Usługa użytkowników: Dodaj preferencje powiadomień
> - Usługa powiadomień: Podstawowa implementacja
> - Frontend: Komponenty UI
>
> Skoordynuj zmiany, aby utrzymać kompatybilność

Claude obsługuje to przez:

  1. Tworzenie kontraktów najpierw

    shared/contracts/notification.ts
    export interface NotificationAPI {
    '/notifications': {
    GET: {
    response: Notification[];
    query: { unreadOnly?: boolean };
    };
    POST: {
    body: CreateNotificationDto;
    response: Notification;
    };
    };
    }
  2. Implementację usług Każda usługa implementuje swoją część kontraktu

  3. Utrzymanie kompatybilności Używa flag funkcji lub wersjonowania podczas wdrażania

Wyzwanie: Migracja z pojedynczego PostgreSQL do konfiguracji podzielonej z utrzymaniem działającej usługi.

> Zaimplementuj migrację bazy danych bez przestojów:
> - Obecne: Pojedynczy PostgreSQL z 10M rekordów
> - Cel: Podzielone na 4 instancje według user_id
> - Wymaganie: Bez przestojów, odwracalne

Strategia implementacji Claude:

  1. Faza podwójnego zapisu

    class DualWriteRepository implements UserRepository {
    constructor(
    private oldDb: PostgresClient,
    private shardedDb: ShardedPostgresClient
    ) {}
    async save(user: User): Promise<void> {
    // Zapisz do obu baz danych
    await Promise.all([
    this.oldDb.save(user),
    this.shardedDb.save(user)
    ]);
    }
    async findById(id: string): Promise<User> {
    // Czytaj ze starej bazy, fallback do nowej
    try {
    return await this.oldDb.findById(id);
    } catch (error) {
    return await this.shardedDb.findById(id);
    }
    }
    }
  2. Migracja w tle

    class MigrationWorker {
    async migrateInBatches() {
    let lastId = '';
    while (true) {
    const batch = await this.oldDb.query(`
    SELECT * FROM users
    WHERE id > $1
    ORDER BY id
    LIMIT 1000
    `, [lastId]);
    if (batch.length === 0) break;
    await this.shardedDb.insertBatch(batch);
    lastId = batch[batch.length - 1].id;
    // Śledzenie postępu
    await this.updateProgress(lastId);
    }
    }
    }
  3. Logika przełączenia

    class MigrationController {
    async switchToSharded() {
    // Zweryfikuj spójność danych
    const isConsistent = await this.verifyDataConsistency();
    if (!isConsistent) {
    throw new Error('Wykryto niespójność danych');
    }
    // Zaktualizuj flagę funkcji
    await this.featureFlags.enable('use_sharded_db');
    // Monitoruj problemy
    this.startHealthChecks();
    }
    }

Wyzwanie: Modernizacja frontendu opartego na jQuery do React z zachowaniem wszystkich funkcji.

> Zmodernizuj nasz legacy dashboard jQuery do React:
> - 50+ plików jQuery ze złożonymi interakcjami
> - Musi działać obok legacy kodu podczas migracji
> - Zachowaj wszystkie obecne funkcje
> - Dodaj TypeScript i nowoczesne narzędzia

Podejście stopniowe Claude:

// 1. Stwórz wrapper React dla legacy stron
const LegacyWrapper: React.FC = () => {
useEffect(() => {
// Zainicjalizuj komponenty jQuery
window.initializeLegacyDashboard();
return () => {
// Wyczyść handlery jQuery
window.cleanupLegacyDashboard();
};
}, []);
return <div id="legacy-mount-point" />;
};
// 2. Skonfiguruj hybrydowy routing
const App = () => {
return (
<Router>
<Route path="/dashboard" component={ModernDashboard} />
<Route path="/legacy/*" component={LegacyWrapper} />
</Router>
);
};

Wykorzystaj zdolność Claude do pracy nad wieloma aspektami jednocześnie:

> Użyj subagentów do implementacji tych funkcji równolegle:
> 1. Endpointy REST API
> 2. Schemat GraphQL i resolvery
> 3. Migracje bazy danych
> 4. Komponenty frontendu
> 5. Aktualizacje aplikacji mobilnej
>
> Skoordynuj wyniki w spójną implementację

Claude nie tylko pisze kod - rozumie wzorce:

> Zaimplementuj operacje CRUD dla naszego modelu Product.
> Podążaj za naszymi istniejącymi wzorcami z modeli User i Order.
> Dołącz:
> - Endpointy REST z walidacją
> - Warstwę usług z logiką biznesową
> - Repozytorium z cache'owaniem
> - Kompleksowe testy
> - Dokumentację API

Claude analizuje istniejące wzorce i generuje spójny kod:

// Rozpoznaje i podąża za twoimi wzorcami
@Controller('/products')
export class ProductController {
constructor(private productService: ProductService) {}
@Get()
@UseGuards(AuthGuard)
@ApiOperation({ summary: 'Wylistuj wszystkie produkty' })
async findAll(@Query() query: ListProductsDto) {
// Podąża za tym samym wzorcem co UserController
return this.productService.findAll(query);
}
@Post()
@UseGuards(AuthGuard, RoleGuard('admin'))
@ApiOperation({ summary: 'Stwórz nowy produkt' })
async create(@Body() dto: CreateProductDto) {
// Zawiera to samo podejście walidacji
return this.productService.create(dto);
}
}

Implementacja nie zawsze przebiega gładko. Claude obsługuje awarie elegancko:

> Implementacja nie powiodła się z błędem TypeScript.
> Napraw to i kontynuuj z pozostałymi zadaniami.
Claude: Widzę problem. Definicja typu dla NotificationPayload
brakuje pola 'priority'. Pozwól mi to naprawić i kontynuować...
[Naprawia błąd]
[Ponownie uruchamia testy]
[Kontynuuje implementację]

Podziel duże implementacje na możliwe do przejrzenia kawałki:

> Zaimplementuj system płatności etapami:
> 1. Podstawowa logika przetwarzania płatności (stop na przegląd)
> 2. Integracja z providerami płatności (stop na przegląd)
> 3. Przepływ checkout frontendu (stop na przegląd)
> 4. Dashboard admina (stop na przegląd)
> Dla każdego komponentu:
> 1. Napisz testy najpierw na podstawie wymagań
> 2. Zaimplementuj minimalny kod do przejścia testów
> 3. Refaktoryzuj dla jakości
> 4. Dodaj obsługę przypadków brzegowych
> Podczas implementacji również:
> - Dodaj komentarze JSDoc do wszystkich publicznych metod
> - Zaktualizuj README z instrukcjami konfiguracji
> - Stwórz dokumentację API
> - Dodaj komentarze inline dla złożonej logiki
> Po każdym głównym komponencie:
> - Uruchom pakiet testów
> - Sprawdź reguły lintingu
> - Zweryfikuj względem wymagań
> - Testuj ręcznie jeśli potrzeba
> Zaimplementuj system rozproszonej kolejki zadań:
> - Redis do przechowywania kolejki
> - Wiele procesów workerów
> - Obsługa awarii i ponowne próby
> - Monitorowanie i metryki
> - Kolejka martwych listów

Claude tworzy kompletny system:

// Implementacja kolejki
export class DistributedQueue<T> {
constructor(
private redis: Redis,
private config: QueueConfig
) {}
async enqueue(task: T): Promise<string> {
const taskId = generateId();
const taskData = {
id: taskId,
payload: task,
attempts: 0,
createdAt: Date.now()
};
await this.redis.lpush(
this.config.queueName,
JSON.stringify(taskData)
);
await this.emitMetric('task.enqueued');
return taskId;
}
async processQueue() {
while (this.running) {
const task = await this.dequeue();
if (!task) {
await sleep(this.config.pollInterval);
continue;
}
try {
await this.processTask(task);
await this.emitMetric('task.completed');
} catch (error) {
await this.handleFailure(task, error);
}
}
}
}
> Zaimplementuj wysokowydajny pipeline przetwarzania danych:
> - Musi obsłużyć 100k rekordów/sekundę
> - Wymaganie opóźnienia sub-milisekundowego
> - Minimalizuj alokację pamięci
> - Użyj streamingu gdzie możliwe

Claude optymalizuje dla wydajności:

// Zoptymalizowany procesor streamingowy
export class StreamProcessor {
private readonly bufferPool: BufferPool;
private readonly workerPool: WorkerPool;
constructor(config: ProcessorConfig) {
// Pre-alokuj zasoby
this.bufferPool = new BufferPool(config.bufferSize);
this.workerPool = new WorkerPool(config.workers);
}
async processStream(input: ReadableStream): Promise<void> {
const pipeline = input
.pipe(this.createParser())
.pipe(this.createTransformer())
.pipe(this.createBatcher(1000))
.pipe(this.createParallelProcessor());
await pipeline.run();
}
private createParallelProcessor() {
return new Transform({
objectMode: true,
transform: async (batch, encoding, callback) => {
// Przetwórz batch równolegle
const promises = batch.map(item =>
this.workerPool.process(item)
);
const results = await Promise.all(promises);
callback(null, results);
}
});
}
}

Śledź te podczas implementacji:

Pokrycie kodu

> Po implementacji, jakie jest nasze pokrycie testów?
Claude: Uruchamianie analizy pokrycia...
- Instrukcje: 94%
- Gałęzie: 89%
- Funkcje: 96%
- Linie: 93%

Wydajność

> Uruchom benchmarki wydajności na nowym kodzie
Claude: Wyniki benchmarku:
- Czas odpowiedzi API: 45ms (p95)
- Użycie pamięci: 128MB stabilnie
- Użycie CPU: 15% średnio
- Przepustowość: 1200 req/s

Jakość kodu

> Przeanalizuj metryki jakości kodu
Claude: Analiza kodu:
- Złożoność cyklomatyczna: 3.2 średnio
- Duplikacja: 0.8%
- Problemy lintingu: 0
- Pokrycie typów: 98%

Wymagania

> Zweryfikuj, czy wszystkie wymagania są spełnione
Claude: Lista kontrolna wymagań:
✅ Powiadomienia w czasie rzeczywistym
✅ Wsparcie offline
✅ Powiadomienia push mobile
✅ Integracja z analityką
✅ Dashboard admina

Nauczyłeś się, jak wykorzystać autonomiczne możliwości implementacji Claude Code do przekształcania planów w kod gotowy do produkcji z niespotykaną szybkością. Kluczem jest zrównoważenie automatyzacji z nadzorem - pozwól Claude obsłużyć mechaniczne aspekty, podczas gdy ty skupiasz się na architekturze, jakości i logice biznesowej.

Pamiętaj: Implementacja to nie tylko szybkie pisanie kodu. To pisanie właściwego kodu, dobrze. Zdolność Claude Code do rozumienia wzorców, utrzymywania spójności i obsługi złożonych operacji wieloplikowych czyni go nieocenionym partnerem implementacji. Używaj tych możliwości mądrze, a będziesz dostarczać funkcje szybciej bez poświęcania jakości.