Strona główna / Artykuły / Kto pisze kod, gdy agenci dołączają do procesu pracy?

Kto pisze kod, gdy agenci dołączają do procesu pracy?

Asystenci kodowania map od autodopowiadania po zgrupy, a także dopasowywanie poziomów do zasięgu eksplozji, testów i bramek recenzji.

2200 słów

Narzędzia do programowania oparte na AI nie kończą się już tylko funkcją autodopisywania. Obejmują one programistów współpracujących w trybie reaktywnym, agenty zadaniowe, które wykonywają konkretne polecenia, autonomiczne agenty projektowe zarządzające gałęziami kodu, a także eksperymentalne systemy, w których wiele agentów wzajemnie krytykuje i naprawia błędy. Kluczowe pytanie brzmi nie o to, jaką markę narzędzia zainstalować, ale o to, jaki poziom odpowiada ryzyku wprowadzanych zmian.

Pierwotne asystenty uzupełniały tekst pod kursorem. Nowsze agenty otwierają pliki, uruchamiają testy i wysyłają prośby o połączenie kodu. Im większy zasięg działania agenta, tym większa musi być głębokość przeglądu zmian, zabezpieczenia w środowisku testowym oraz jasność określonego celu, który im przydzielamy.

Narzędzia do autodopisywania i rozmów w środowisku IDE. Ty kontrolujesz każdą zmianę. Najlepsze do tworzenia szablonów, przemiany nazw i wyjaśniania nieznajomego kodu. Słabe w refaktoryzacji wielu plików bez dodatkowych wskazówek.

# Conceptual representation of a Tier 3 agent's execution loop
def execute_project_goal(goal: str):
    plan = agent.generate_plan(goal)
    while not plan.is_complete():
        action = plan.get_next_action()
        result = workspace.run(action)      # Runs commands, edits files
        if result.has_errors():
            plan.replan(result.logs)       # Self-correction loop
        else:
            plan.mark_step_done()

Eksekutorzy zorientowani na cele: „dodaj logowanie do tego obsługiwacza”, „napisz testy dla tego modułu”. Planują krótkie pętle narzędziowe i przestają, gdy sprawdzenie celu się powiedzie. Mimo to fuzja wymaga ludzkiego zatwierdzenia.

import time
from typing import Dict, Any

def run_agent_loop(task_prompt: str, max_iterations: int = 15) -> bool:
    # Initialize the agent's state, workspace, and execution context
    state: Dict[str, Any] = {
        "task": task_prompt,
        "workspace_files": get_project_files(),
        "history": [],
        "completed": False
    }

    for step in range(max_iterations):
        # 1. Perception: Observe current system state and tool outputs
        observation = observe_environment(state)

        # 2. Planning: Reason through the current state to generate a thought and next action
        thought, action = LLM_reasoning_engine(state, observation)
        state["history"].append({"step": step, "thought": thought, "action": action})

        if action.name == "task_complete":
            print(f"Task successfully completed in {step} steps.")
            return True

        # 3. Action: Execute the tool and capture the side effects
        try:
            action_result = execute_action(action)
            state = update_state(state, action_result)
        except Exception as execution_error:
            # Feed the error back to the LLM to allow for self-correction
            state = update_state(state, {"error": str(execution_error)})

        time.sleep(1) # Implement rate limiting and token management

    print("Agent failed: Reached maximum iteration budget.")
    return False

Poziom 3 — autonomiczne agenty projektowe

Inżynierowie end-to-end dla określonego projektu: tworzenie szkieletu, implementacja, testowanie, iteracje. Potrzebują jasnych testów akceptacyjnych oraz zamkniętego środowiska. Bez testów działają chaotycznie.

import subprocess
import json
import sys

def execute_agentic_workflow(specification_path: str) -> bool:
    """
    Orchestrates an agent by feeding it a structured specification,
    applying the generated code changes, and running unit tests to verify correctness.
    """
    # Step 1: Load the structured technical specification
    with open(specification_path, "r") as f:
        spec = json.load(f)

    print(f"🤖 Agent starting task: {spec['task_id']} - {spec['description']}")

    # Step 2: Agent generates code based on spec (simulated here)
    generated_code_diff = simulate_agent_generation(spec)

    # Step 3: Apply the generated patches to the codebase
    if not apply_patch(generated_code_diff):
        print("❌ Critical: Agent-generated patch failed to apply cleanly.")
        return False

    # Step 4: Run automated validation suites
    print("🧪 Running verification test suite...")
    test_result = subprocess.run(["pytest", "tests/test_agent_features.py"], capture_output=True, text=True)

    if test_result.returncode == 0:
        print("✅ Success: Agent changes verified successfully.")
        return True
    else:
        print("❌ Failure: Automated tests failed. Raw stderr output:")
        print(test_result.stderr)
        return False

def simulate_agent_generation(spec: dict) -> str:
    # Simulates returning a git patch block matching the spec constraints
    return "diff --git a/app.py b/app.py..."

def apply_patch(diff: str) -> bool:
    # Logic to apply git patch
    return True

if __name__ == "__main__":
    execute_agentic_workflow("specs/new_feature_spec.json")

Poziom 4 — rój agentów

Kolaboracyjne sieci wielu agentów: badacz, implementator, recenzent. Potężne, ale drogie. Błędy koordynacji stają się nowym modelem awarii.

+----------------+      +-----------------+      +-----------------+      +-----------------+
|     Define     | ---> |     Prompt      | ---> |      Test       | ---> |     Verify      |
|  (Requirements |      | (Context, Specs |      |   (Automated    |      | (Human Approves |
|  & Interfaces) |      |   & Constraints)|      |  Suites & Runs) |      |   Final Diffs)  |
+----------------+      +-----------------+      +-----------------+      +-----------------+

Anatomia agenta programistycznego

Percepcja (narzędzia repozytorium), planowanie (dekompozycja zadań), działanie (edytowanie/polecenia) oraz pamięć (notatniki, kontekst PR). Brak któregokolwiek z tych elementów powoduje upadek danego poziomu.

Generated by AI Agent: Provisions a secure, auto-scaling AWS ECS Fargate service
resource "aws_ecs_task_definition" "app" {
  family                   = "production-api"
  requires_compatibilities = ["FARGATE"]
  network_mode             = "awsvpc"
  cpu                      = "256"
  memory                   = "512"

  container_definitions = jsonencode([{
    name      = "api-service"
    image     = "backend-service:latest"
    essential = true
    portMappings = [{
      containerPort = 8080
      hostPort      = 8080
    }]
  }])
}

Wybór poziomu

Dołącz poziom dopasowania do stopnia krytyczności repozytorium, siły testów oraz stopnia odwracalności zmiany. Preferuj poziomy 1–2 w ścieżkach płatności, dopóki nie będą dostępne narzędzia do oceny. Używaj poziomu 3 tam, gdzie procedury CI są ścisłe, a środowisko testowe nie może uzyskać dostępu do tajemnic produkcyjnych.

# safe_executor.py
import ast

# An allowlist of pre-approved libraries prevents hallucinated dependency injection.
ALLOWED_PACKAGES = {"requests", "pandas", "numpy", "json", "pydantic"}

def verify_agent_imports(agent_code: str) -> bool:
    """Parses agent code into an AST to audit imports before execution."""
    try:
        tree = ast.parse(agent_code)
        for node in ast.walk(tree):
            if isinstance(node, ast.Import):
                for alias in node.names:
                    base_package = alias.name.split('.')[0]
                    if base_package not in ALLOWED_PACKAGES:
                        raise SecurityError(f"Blocked unapproved import: {alias.name}")
            elif isinstance(node, ast.ImportFrom) and node.module:
                base_package = node.module.split('.')[0]
                if base_package not in ALLOWED_PACKAGES:
                    raise SecurityError(f"Blocked unapproved import from: {node.module}")
        return True
    except (SyntaxError, SecurityError) as e:
        print(f"Safety Gate Tripped: {e}")
        return False

class SecurityError(Exception):
    pass

# Example of agent output containing a hallucinated or malicious library.
untrusted_code = "import requests\nimport fast_json_validator_fake_pkg"
is_safe = verify_agent_imports(untrusted_code)
print(f"Is code safe to execute? {is_safe}") # Prints: Is code safe to execute? False

Nawyki pracy, które pozwalają ludziom zachować kontrolę

Napisz sprawdzenia akceptacji przed uruchomieniem agenta. Wymagaj prezentacji różnic w przetwarzalnych fragmentach. Rejestruj każde wezwanie narzędzia. Zabronij niekontrolowanego używania wiersza poleceń na hostach zawierających dane wrażliwe. Traktuj szybkość działania agenta jako wskaźnik ryzyka, gdy wzrasta liczba błędów.

Przyszłość kwestii „kto pisze kod” leży w wspólnym autorstwie z wyraźnymi kontrolami – a nie w beznadzorowanych komitach do głównej gałęzi. Utrzymuj testy w stanie poprawnym, mierz każdy etap oddzielnie i unikaj wypuszczania produktu opartego wyłącznie na intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Utrzymuj testy w stanie poprawnym, mierz każdy etap oddzielnie i unikaj wypuszczania produktu opartego wyłącznie na intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Utrzymuj testy w stanie poprawnym, mierz każdy etap oddzielnie i unikaj wypuszczania produktu opartego wyłącznie na intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Utrzymuj testy w stanie poprawnym, mierz każdy etap oddzielnie i unikaj wypuszczania produktu opartego wyłącznie na intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Utrzymuj testy w stanie poprawnym, mierz każdy etap oddzielnie i unikaj wypuszczania produktu opartego wyłącznie na intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą.

Można ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Zachowaj urządzenia w dobrym stanie, mierz każdy etap osobno i unikaj wysyłki opartej wyłącznie na intuicji, gdy następna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Zachowaj urządzenia w dobrym stanie, mierz każdy etap osobno i unikaj wysyłki opartej wyłącznie na intuicji, gdy następna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Zachowaj urządzenia w dobrym stanie, mierz każdy etap osobno i unikaj wysyłki opartej wyłącznie na intuicji, gdy następna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Zachowaj urządzenia w dobrym stanie, mierz każdy etap osobno i unikaj wysyłki opartej wyłącznie na intuicji, gdy następna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Zachowaj urządzenia w dobrym stanie, mierz każdy etap osobno i unikaj wysyłki opartej wyłącznie na intuicji, gdy następna wersja może ponownie wprowadzić ten sam niewidoczny problem.przenieś to pod nową nazwą. Utrzymuj urządzenia w dobrym stanie, mierz każdy etap oddzielnie i unikaj wypuszczania produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Utrzymuj urządzenia w dobrym stanie, mierz każdy etap oddzielnie i unikaj wypuszczania produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Utrzymuj urządzenia w dobrym stanie, mierz każdy etap oddzielnie i unikaj wypuszczania produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Utrzymuj urządzenia w dobrym stanie, mierz każdy etap oddzielnie i unikaj wypuszczania produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Utrzymuj urządzenia w dobrym stanie, mierz każdy etap oddzielnie i unikaj wypuszczania produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Utrzymuj urządzenia w dobrym stanie, mierz każdy etap oddzielnie i unikaj wypuszczania produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą.Traktuj każdy etap oddzielnie i unikaj wypuszczania produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Zachowaj urządzenia w dobrym stanie, mierz każdy etap oddzielnie i unikaj wypuszczania produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Zachowaj urządzenia w dobrym stanie, mierz każdy etap oddzielnie i unikaj wypuszczania produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Zachowaj urządzenia w dobrym stanie, mierz każdy etap oddzielnie i unikaj wypuszczania produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Zachowaj urządzenia w dobrym stanie, mierz każdy etap oddzielnie i unikaj wypuszczania produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Zachowaj urządzenia w dobrym stanie, mierz każdy etap oddzielnie i unikaj wypuszczania produktu na podstawie jedynie intuicji.Trzymaj urządzenia w dobrym stanie, mierz każdy etap osobno i odmawiaj wypuszczenia produktu wyłącznie na podstawie intuicji, gdy następna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą.wprowadzać ten sam niewidoczny problem pod nową nazwą. Utrzymywać narzędzia w dobrym stanie, mierzyć każdy etap oddzielnie i odmawiać wypuszczenia produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Utrzymywać narzędzia w dobrym stanie, mierzyć każdy etap oddzielnie i odmawiać wypuszczenia produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Utrzymywać narzędzia w dobrym stanie, mierzyć każdy etap oddzielnie i odmawiać wypuszczenia produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Utrzymywać narzędzia w dobrym stanie, mierzyć każdy etap oddzielnie i odmawiać wypuszczenia produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Utrzymywać narzędzia w dobrym stanie, mierzyć każdy etap oddzielnie i odmawiać wypuszczenia produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem podnowa nazwa. Utrzymuj urządzenia w stanie sprawnym, mierz każdy etap oddzielnie i unikaj wypuszczania produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Utrzymuj urządzenia w stanie sprawnym, mierz każdy etap oddzielnie i unikaj wypuszczania produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Utrzymuj urządzenia w stanie sprawnym, mierz każdy etap oddzielnie i unikaj wypuszczania produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Utrzymuj urządzenia w stanie sprawnym, mierz każdy etap oddzielnie i unikaj wypuszczania produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Utrzymuj urządzenia w stanie sprawnym, mierz każdy etap oddzielnie i unikaj wypuszczania produktu na podstawie jedynie intuicji, gdy kolejna wersja może ponownie wprowadzić ten sam niewidoczny problem pod nową nazwą. Utrzymuj urządzenia w stanie sprawnym, mierz każdy etap oddzielnieTłumacz każdy etap osobno i unikaj wypuszczania produktu na podstawie jedynie wrażeń, gdy kolejna wersja może ponownie wprowadzić ten sam ukryty problem pod nową nazwą. Zachowuj urządzenia w dobrym stanie, mierz każdy etap oddzielnie i unikaj wypuszczania produktu na podstawie jedynie wrażeń, gdy kolejna wersja może ponownie wprowadzić ten sam ukryty problem pod nową nazwą.

Literatura pokrewna

  • Gdy sztuczna inteligencja pisze twoje React App, ale pomija zasady czystego kodu — Poznaj siedem nawyków pisania czystego kodu – DRY, jedna odpowiedzialność, klauzule ochronne i inne – które często są łamane w kodzie React generowanym przez AI oraz sposoby ich naprawy.
  • Wysyłaj plugini agentów, a nie gołe serwery MCP — Pakuj narzędzia MCP wraz z umiejętnościami, uprawnieniami i metadanymi instalacji, aby hostowie otrzymywali pełne funkcjonalności zamiast nieukończonych adapterów.
  • Po codegen: umiejętności, które nadal są ważne dla inżynierów — Gdy modele tworzą szkice kodu, decyzje przenoszą się na specyfikacje, przeglądy, architekturę oraz nawyki weryfikacji.
  • Pięć plugini Claude Code, które rozwiązują częste problemy — Praktyczne rekomendacje plugini do radzenia sobie z kwestiami kontekstu, uprawnień i luk w procesach pracy bez konieczności przepisywania hosta.