Pair programming con IA con IBM Bob

Usa Bob come assistente AI per il pair programming e costruisci una To-Do API con FastAPI, lavorando dai requisiti a un piano, codice generato, test e documentazione.

Con il pair programming con IA, costruisci software insieme a un assistente che ti aiuta in ogni fase di pianificazione, scrittura del codice, test e documentazione, piuttosto che uno che si limita ad autocompletare le righe. In questo tutorial, fai pair programming con IBM Bob per costruire una To-Do API con FastAPI a partire da un insieme di requisiti.

Parti dai requisiti e percorri le fasi di un piano revisionato, codice generato, una spiegazione dell'implementazione, miglioramenti alla qualità del codice, unit test e documentazione tecnica. Il data store è una lista Python in memoria, quindi non c'è nessun database da configurare.

Alla fine, avrai una To-Do API containerizzata funzionante e avrai praticato il ciclo di revisione del pair programming in ogni fase: pianificazione, generazione, spiegazione, refactoring, test e documentazione.

Questo tutorial è per sviluppatori che conoscono Python e i concetti REST di base e vogliono un ciclo di revisione ripetibile per costruire software con un assistente AI. Non è necessaria esperienza con FastAPI.

Questo tutorial copre l'intero ciclo di build dall'inizio alla fine su un nuovo progetto. Per approfondire la pianificazione e l'implementazione di una funzionalità ampia in una codebase esistente, vedi Pianifica e implementa funzionalità complesse.

Prerequisiti

Per completare questo tutorial, hai bisogno di:

  • Bob IDE installato e configurato.
  • Familiarità con Usa il literate coding per generare codice dai commenti.
  • Aver completato Crea una nuova context window, per poter gestire il contesto di Bob in questo flusso di lavoro multi-step.
  • Docker installato e in esecuzione sulla tua workstation. Bob genera un Dockerfile in modo che tu possa costruire ed eseguire l'API in un container senza installare Python o le sue dipendenze in locale.
  • Conoscenze base di Python.
  • Conoscenza base delle REST API. Non è necessaria esperienza con FastAPI. Bob genera il codice FastAPI e lo spiega su richiesta come parte del flusso di lavoro.

Comprendere il pair programming con IA con Bob

Ogni fase che segue copre pianificazione, generazione, spiegazione, refactoring, test e documentazione. In ogni fase, Bob propone le modifiche e tu le approvi, le rifiuti o le rivedi prima che Bob le applichi.

Flusso di lavoro del pair programming

Questo tutorial usa il seguente flusso di lavoro:

Requisiti

Bob crea un piano

Rivedi e affina il piano

Bob genera il codice

Rivedi l'output

Esegui e valida

Bob spiega l'implementazione

Bob suggerisce miglioramenti alla qualità del codice

Genera i test

Genera la documentazione

Configura il tuo workspace

Avvia Bob, apri una cartella di progetto vuota e configura Bob per richiedere l'approvazione prima di modificare i file.

Avvia IBM Bob

Avvia l'IDE IBM Bob.

Apri l'interfaccia chat di Bob

Se l'interfaccia chat di Bob non è visibile, aprila selezionando l'icona Bob accanto alla barra di navigazione. Puoi anche premere Option + Command + B su Mac, oppure Ctrl + Alt + B su Windows e Linux.

Pannello chat di Bob aperto nell'IDE IBM Bob

Apri una cartella di progetto vuota

Crea una cartella vuota chiamata todo-api, poi aprila in Bob con File > Apri cartella. Se Bob ti chiede se ti fidi degli autori dei file nella cartella, seleziona Sì, mi fido degli autori.

Bob scrive l'applicazione generata in questa cartella. Non hai bisogno di un repository esistente per questo tutorial.

Disabilita l'approvazione automatica

Apri Permessi e conferma che l'approvazione automatica sia disattivata. Con l'approvazione automatica disattivata, Bob ti chiede il permesso prima di leggere file, modificare file o eseguire comandi. In questo tutorial resti in controllo di ogni modifica.

Definisci i requisiti e il piano

Fornisci a Bob i requisiti per la To-Do API, poi revisiona il piano che propone prima che Bob scriva qualsiasi codice.

Passa alla modalità Plan

Apri il menu a tendina della modalità in fondo alla sidebar di Bob e seleziona Plan.

Menu a tendina della modalità IBM Bob con la modalità Plan selezionata

Le modalità applicano il principio del privilegio minimo. In modalità Plan, Bob legge il tuo codice e scrive un piano in Markdown. Bob non esegue comandi né apporta modifiche all'implementazione. Revisioni l'approccio prima che Bob scriva il codice dell'applicazione.

Definisci i requisiti dell'applicazione

Nell'interfaccia chat di Bob, inserisci il seguente prompt:

Create a simple FastAPI To-Do API.

Requirements:

- Store tasks in a Python list.
- Each task should contain:
    - id
    - task_name

Implement these endpoints with explicit HTTP status codes:

- GET /tasks: list all tasks. Return 200.
- POST /tasks: create a task from a JSON body containing only task_name. Return 201 with the created task.
- DELETE /tasks/{task_id}: delete a task. Return 204 on success and 404 if no task has that id.

Use FastAPI and Pydantic. Use Pydantic model validation so an invalid request body returns 422.

Include a requirements.txt and a Dockerfile. The Dockerfile must start Uvicorn bound to 0.0.0.0 on port 8000 so the API is reachable through a published container port.

Save the plan as Markdown files in a folder named `plans`.

Put the FastAPI application in a single file named `main.py` at the project root.

Keep the implementation simple.

Don't install any dependencies locally or run local tests. Everything will run in a Docker container.

Per costruire il piano, Bob esegue la sua skill di pianificazione. Quando richiesto, seleziona Approva strumenti skill per il task e Approva strumenti subagent per il task così Bob può esaminare il workspace e redigere il piano.

Affina il piano

Puoi modificare il piano prima che Bob scriva qualsiasi codice. Nell'interfaccia chat di Bob, inserisci un prompt di follow-up:

Update the plan to reject a task whose task_name is empty or longer than 200 characters.

Bob rivede il piano per includere la validazione aggiuntiva dell'input. Revisiona il piano aggiornato.

Revisiona il piano

Bob presenta un piano ordinato e potrebbe salvarlo come file Markdown nel progetto. Revisionalo prima di continuare:

  • Ambito: il piano copre ogni endpoint e la regola di validazione che hai aggiunto, e niente che non hai richiesto.
  • File nominati: ogni passaggio indica il file che crea o modifica.
  • Linguaggio vago: frasi come "gestisci gli errori in modo appropriato" nascondono assunzioni. Chiedi a Bob di renderle specifiche.

Sei tu il responsabile di queste decisioni di progettazione. Bob non implementa nulla finché non passi alla modalità Agent in Genera e revisiona l'applicazione.

Genera e revisiona l'applicazione

Avvia una nuova context window, passa alla modalità Agent e fai implementare il piano approvato a Bob.

Avvia una nuova context window

Seleziona Nuovo task nella casella della chat oppure + in cima al pannello della chat per avviare una nuova context window. Consulta Crea una nuova context window per ulteriori informazioni. Bob ha salvato il piano nella cartella plans, quindi non hai più bisogno della conversazione di pianificazione nel contesto. Un contesto pulito mantiene l'implementazione focalizzata sul piano approvato.

Passa alla modalità Agent ed esegui il piano

Apri il menu a tendina della modalità in fondo alla sidebar di Bob e seleziona Agent. Poi di' a Bob di implementare il piano:

Implement the plan in the plans folder.
@plans/

La modalità Agent permette a Bob di scrivere file ed eseguire comandi. Bob chiede l'approvazione prima di ogni modifica perché hai disabilitato l'approvazione automatica. Approva i passaggi mentre Bob lavora attraverso il piano.

Revisiona l'applicazione generata

Quando l'implementazione è completa, revisiona il codice generato. Poiché l'output di Bob è probabilistico, lo stile del codice e i nomi interni potrebbero differire dagli esempi mostrati qui. L'applicazione è composta dalle seguenti parti.

Modelli dati. Bob genera due modelli Pydantic: uno per il corpo della richiesta durante la creazione di un task e uno per un task salvato. Il modello di creazione applica la regola di lunghezza aggiunta durante la pianificazione:

class TaskCreate(BaseModel):
    task_name: Annotated[str, Field(min_length=1, max_length=200)]


class Task(BaseModel):
    id: int
    task_name: str

I percorsi degli endpoint e i codici di stato corrispondono ai requisiti forniti a Bob, ma i nomi delle classi dei modelli e il layout dei file possono variare. Questo tutorial assume i modelli Task e TaskCreate. Adatta i prompt che seguono se Bob ha scelto nomi diversi.

Data store in memoria. Bob salva i task in una lista Python vuota e assegna a ogni nuovo task un id incrementale:

tasks: list[dict] = []
id_counter = 0

Operazioni API. L'applicazione fornisce i seguenti endpoint:

  • GET /tasks
  • POST /tasks
  • DELETE /tasks/{task_id}

POST /tasks prende solo task_name nel corpo della richiesta e restituisce 201 con il task creato. DELETE /tasks/{task_id} restituisce 204 in caso di successo e 404 quando nessun task ha quel task_id.

Dipendenze. Bob genera un file requirements.txt che elenca FastAPI, Uvicorn e Pydantic.

Container. Bob genera un Dockerfile che installa le dipendenze ed esegue l'API sulla porta 8000 con Uvicorn.

Il contratto HTTP segue il prompt dei requisiti, inclusi metodi, percorsi e codici di stato. I seguenti passaggi di validazione si applicano come scritto.

Aggiungi un endpoint con il literate coding

Usa la modalità literate coding per aggiungere un endpoint di aggiornamento direttamente da un'istruzione in linguaggio naturale nell'editor, senza passare alla finestra della chat.

La modalità literate coding genera codice da istruzioni in linguaggio naturale scritte direttamente nell'editor.

Apri il file dell'applicazione

Apri il file main.py generato da Bob e posiziona il cursore su una riga vuota alla fine del file, dopo l'ultimo route handler.

Attiva la modalità literate coding

Premi Command + I su Mac, oppure Ctrl + I su Windows e Linux. Puoi anche selezionare l'icona della bacchetta magica nella toolbar dell'editor.

Scrivi l'istruzione

Inserisci la seguente istruzione sulla riga vuota. Appare evidenziata in un colore diverso rispetto al resto del codice.

Add a PUT /tasks/{task_id} endpoint that updates the task_name of an existing task, matching the style and conventions of the existing routes. Return 200 with the updated task, or 404 if no task has that id.

Bob deduce il nome del parametro, il modello della richiesta e la gestione degli errori dal codice circostante, quindi devi specificare solo il metodo e il percorso.

Genera e accetta il codice

Seleziona Genera, oppure premi Command + Enter su Mac, oppure Ctrl + Enter su Windows e Linux. Bob sostituisce la tua istruzione con un'implementazione e mostra un diff inline.

Revisiona il diff, poi seleziona Accetta tutto per applicare la modifica. Premi di nuovo Command + I su Mac, oppure Ctrl + I su Windows e Linux per uscire dalla modalità literate coding.

Spiega, esegui e valida

Chiedi a Bob di spiegare l'implementazione, poi esegui l'applicazione e valida il suo comportamento.

Chiedi a Bob di spiegare il codice

Avvia una nuova context window con Nuovo task, poi seleziona Ask dal menu a tendina della modalità. La modalità Ask risponde alle domande e analizza il codice senza modificare i file. Usala quando vuoi una spiegazione senza modifiche.

Capire il codice generato è una parte importante del pair programming con IA. Chiedi a Bob:

Explain the generated To-Do API.

Bob può spiegare l'architettura dell'applicazione, il flusso dei dati, i componenti FastAPI, i modelli Pydantic, il comportamento degli endpoint e le decisioni di progettazione. Usa la spiegazione per confermare che il codice fa ciò che ti aspetti prima di modificarlo o estenderlo.

Esegui l'applicazione

Torna alla modalità Agent in modo che Bob possa eseguire comandi. Chiedi a Bob di costruire ed eseguire l'API in un container:

Build the Docker image and run the container with port 8000 mapped to the host. Confirm the API is reachable.

Bob esegue i comandi di build e avvio e segnala quando il container è in esecuzione.

Apri http://localhost:8000/docs nel tuo browser.

FastAPI serve un'interfaccia Swagger UI interattiva su /docs. Usala per esplorare ogni endpoint, ispezionare gli schemi di richiesta e risposta, ed eseguire chiamate API dal browser.

Valida l'API

Usa la Swagger UI su /docs per esercitare ogni operazione. Per ogni endpoint:

  1. Espandi la sua riga e seleziona Try it out.
  2. Inserisci eventuali parametri di percorso o corpo della richiesta.
  3. Seleziona Execute.
  4. Controlla il codice e il corpo della Server response.

Aggiungi un task

  1. Espandi POST /tasks e seleziona Try it out.

  2. Sostituisci il corpo della richiesta con:

    {
      "task_name": "My first API item!"
    }
  3. Seleziona Execute. Conferma che il codice di risposta sia 201 e che il corpo della risposta mostri il task creato con un id assegnato.

Recupera i task

  1. Espandi GET /tasks e seleziona Try it out.
  2. Seleziona Execute. Conferma che il codice di risposta sia 200 e che il corpo della risposta elenci il task My first API item! con l'id assegnato quando l'hai aggiunto.

Aggiorna un task

  1. Espandi PUT /tasks/{task_id} e seleziona Try it out.

  2. Inserisci il task_id del task che hai creato.

  3. Sostituisci il corpo della richiesta con:

    {
      "task_name": "Build and ship a To-Do API"
    }
  4. Seleziona Execute. Conferma che il codice di risposta sia 200 e che il task restituito mostri il task_name aggiornato.

  5. Cambia task_id con un valore che non esiste e seleziona di nuovo Execute. Conferma che il codice di risposta sia 404.

Elimina un task

  1. Espandi DELETE /tasks/{task_id} e seleziona Try it out.
  2. Inserisci il task_id del task che hai creato e seleziona Execute. Conferma che il codice di risposta sia 204.
  3. Espandi GET /tasks, seleziona Execute e conferma che il task non appaia più nella risposta.
  4. Espandi di nuovo DELETE /tasks/{task_id}, inserisci lo stesso task_id e seleziona Execute. Conferma che il codice di risposta sia 404.

L'implementazione soddisfa i requisiti originali, incluso l'endpoint di aggiornamento aggiunto con il literate coding.

Migliora la qualità del codice

Chiedi a Bob di revisionare il codice generato per problemi di qualità, poi applica le modifiche con cui sei d'accordo. Questo passaggio usa Bob come revisore piuttosto che solo come generatore di codice.

Chiedi a Bob suggerimenti di miglioramento

Avvia una nuova context window con Nuovo task, poi inserisci:

Review the To-Do API and suggest improvements to code quality, error handling, and HTTP status codes.

Bob identifica lacune come un endpoint mancante per recuperare un singolo task, un data store in memoria che contiene dizionari plain invece di modelli Task validati e un id_counter a livello di modulo difficile da reimpostare o testare.

Applica i miglioramenti

Chiedi a Bob di implementare i suggerimenti che vuoi mantenere:

Add a GET /tasks/{task_id} endpoint that returns 404 when the task ID does not exist, and store tasks as Task models instead of dictionaries.

Revisiona le modifiche proposte e approva per applicarle. Chiedi a Bob di ricostruire l'immagine e riavviare il container, poi ripeti i passaggi di validazione. Conferma che GET /tasks/{task_id} restituisca 200 con il task per un ID valido e 404 per un ID sconosciuto, e che gli endpoint esistenti si comportino come prima.

Genera test e documentazione

Chiedi a Bob di generare una suite di test e documentazione tecnica per l'API.

Genera unit test

Avvia una nuova context window con Nuovo task, poi chiedi a Bob:

Generate pytest unit tests for this application. Add pytest and httpx to a dev requirements file, build a test image, and run the suite in a container.

Bob aggiunge le dipendenze di test pytest e httpx, costruisce un'immagine che le include, esegue la suite in un container e riporta i risultati. Eseguire i test in un container significa che non hai bisogno di un ambiente Python locale. Revisiona e affina i test generati.

La revisione e la manutenzione dei test generati rimangono una tua responsabilità.

Genera documentazione tecnica

Chiedi a Bob:

Generate technical documentation for this To-Do API.

Bob può generare una panoramica dell'applicazione, una descrizione dell'architettura, riepiloghi degli endpoint, esempi di richiesta e risposta e istruzioni d'uso. Questa documentazione integra la documentazione API che FastAPI genera automaticamente.

Risoluzione dei problemi

Usa le seguenti soluzioni per i problemi più comuni:

  • Impossibile connettersi al daemon Docker: Avvia Docker Desktop o il servizio Docker prima di costruire l'immagine.
  • Il container si avvia ma http://localhost:8000/docs non si carica: Il Dockerfile collega l'API a 127.0.0.1 all'interno del container, che la porta pubblicata non riesce a raggiungere. Assicurati che il Dockerfile avvii Uvicorn con --host 0.0.0.0, poi ricostruisci l'immagine.
  • Bind for 0.0.0.0:8000 failed: port is already allocated: Arresta il processo che usa la porta 8000, oppure mappa un'altra porta host con docker run -d --name todo-api -p 8080:8000 todo-api e apri http://localhost:8080/docs.
  • The container name "/todo-api" is already in use: Esegui docker rm -f todo-api, poi avvia di nuovo il container.
  • pytest is missing when the tests run: L'immagine dell'applicazione non include le dipendenze di test. Chiedi a Bob di aggiungere pytest e httpx a un file di requisiti dev e di costruire un'immagine di test separata.

Pulizia

Arresta e rimuovi il container per liberare la porta 8000:

Stop and remove the To-Do API and test container and image.

L'API mantiene i task solo in memoria, quindi rimuovere il container elimina tutti i dati. Non c'è altro da pulire.

Prossimi passi

In questo tutorial, hai costruito e validato una To-Do API FastAPI containerizzata facendo pair programming con Bob in ogni fase e revisionando ogni modifica prima di applicarla.

FAQ

Devo conoscere FastAPI? No. Bob genera il codice FastAPI e Pydantic e lo spiega su richiesta. È sufficiente una conoscenza base di Python e REST.

Perché cambiare modalità tra le fasi? Le modalità applicano il privilegio minimo. La modalità Plan legge il codice e scrive un piano ma non esegue nulla; la modalità Agent può modificare file ed eseguire comandi; la modalità Ask risponde alle domande senza modificare i file. Cambiare modalità mantiene le capacità di Bob allineate al task in corso.

Cosa succede se Bob nomina file o modelli in modo diverso? Il contratto HTTP è definito dal prompt dei requisiti, quindi percorsi e codici di stato corrispondono. I nomi delle classi e il layout dei file possono variare. Questo tutorial assume i modelli Task e TaskCreate; adatta i prompt successivi se Bob ha scelto nomi diversi.

Perché avviare una nuova context window ad ogni fase? Bob salva il piano nella cartella plans, quindi la conversazione precedente non è più necessaria nel contesto. Un contesto pulito mantiene ogni fase focalizzata e controlla il costo dei token.

Posso fare questo tutorial senza Docker? Tecnicamente puoi fare questo tutorial senza Docker, ma dovrai modificare il piano e i prompt inviati a Bob.

La modalità Plan modifica i file? No. In modalità Plan Bob legge il tuo codice e scrive solo un piano in Markdown. Nessuna modifica al codice dell'applicazione finché non passi alla modalità Agent.

Come valuti questo argomento?