AI pair programming dengan IBM Bob

Gunakan Bob sebagai asisten AI pair-programming untuk membangun FastAPI To-Do API, mulai dari persyaratan hingga rencana, kode yang dibuat, pengujian, dan dokumentasi.

Dengan AI pair programming, kamu membangun perangkat lunak bersama asisten yang membantu di setiap tahap perencanaan, penulisan kode, pengujian, dan dokumentasi, bukan hanya melengkapi baris kode secara otomatis. Dalam tutorial ini, kamu berpasangan dengan IBM Bob untuk membangun FastAPI To-Do API dari sekumpulan persyaratan.

Kamu mulai dari persyaratan dan bergerak melalui rencana yang telah ditinjau, kode yang dibuat, penjelasan implementasi, peningkatan kualitas kode, unit test, dan dokumentasi teknis. Penyimpanan data menggunakan Python list di memori, sehingga tidak ada database yang perlu disiapkan.

Di akhir tutorial ini, kamu memiliki FastAPI To-Do API yang dikontainerisasi dan telah mempraktikkan siklus tinjauan pair-programming di setiap tahap: plan, generate, explain, refactor, test, dan document.

Tutorial ini ditujukan untuk developer yang memahami dasar Python dan konsep REST dan ingin memiliki siklus tinjauan yang berulang untuk membangun perangkat lunak dengan asisten AI. Pengalaman FastAPI tidak diperlukan.

Tutorial ini mencakup seluruh alur build dari awal hingga akhir pada proyek baru. Untuk mendalami perencanaan dan implementasi fitur besar dalam codebase yang sudah ada, lihat Rencanakan dan implementasikan fitur kompleks.

Prasyarat

Untuk menyelesaikan tutorial ini, kamu memerlukan hal berikut:

  • Bob IDE yang sudah terpasang dan dikonfigurasi.
  • Keakraban dengan Gunakan literate coding untuk membuat kode dari komentar.
  • Penyelesaian Buat context window baru, agar kamu dapat mengelola konteks Bob di seluruh alur kerja multi-langkah ini.
  • Docker yang sudah terpasang dan berjalan di workstation kamu. Bob membuat Dockerfile sehingga kamu dapat membangun dan menjalankan API dalam container tanpa menginstal Python atau dependensinya secara lokal.
  • Pengetahuan dasar Python.
  • Pemahaman dasar tentang REST API. Kamu tidak perlu pengalaman FastAPI sebelumnya. Bob membuat kode FastAPI dan menjelaskannya atas permintaan sebagai bagian dari alur kerja.

Memahami AI pair programming dengan Bob

Setiap tahap berikut mencakup perencanaan, pembuatan, penjelasan, refactoring, pengujian, dan dokumentasi. Di setiap tahap, Bob mengusulkan perubahan dan kamu menyetujui, menolak, atau merevisinya sebelum Bob menerapkannya.

Alur kerja pair programming

Tutorial ini menggunakan alur kerja berikut:

Persyaratan

Bob membuat rencana

Kamu meninjau dan menyempurnakan rencana

Bob membuat kode

Kamu meninjau output

Jalankan dan validasi

Bob menjelaskan implementasi

Bob menyarankan peningkatan kualitas kode

Buat test

Buat dokumentasi

Siapkan workspace kamu

Jalankan Bob, buka folder proyek kosong, dan konfigurasikan Bob untuk meminta persetujuan sebelum mengubah file.

Jalankan IBM Bob

Jalankan IBM Bob IDE.

Buka antarmuka chat Bob

Jika antarmuka chat Bob tidak terlihat, buka dengan memilih ikon Bob di sebelah navigation bar. Kamu juga bisa menekan Option + Command + B di Mac, atau Ctrl + Alt + B di Windows dan Linux.

Panel chat Bob terbuka di IBM Bob IDE

Buka folder proyek kosong

Buat folder kosong bernama todo-api, lalu buka di Bob dengan File > Open Folder. Jika Bob bertanya apakah kamu mempercayai penulis file dalam folder tersebut, pilih Yes, I trust the authors.

Bob menulis aplikasi yang dibuat ke folder ini. Kamu tidak memerlukan repository yang sudah ada untuk tutorial ini.

Nonaktifkan auto-approval

Buka Permissions dan konfirmasi bahwa auto-approval dimatikan. Dengan auto-approval dimatikan, Bob meminta izinmu sebelum membaca file, mengedit file, atau menjalankan perintah. Kamu tetap memegang kendali atas setiap perubahan dalam tutorial ini.

Tentukan persyaratan dan rencana

Berikan Bob persyaratan untuk To-Do API, lalu tinjau rencana yang diusulkan sebelum Bob menulis kode apa pun.

Beralih ke mode Plan

Buka dropdown mode di bagian bawah sidebar Bob dan pilih Plan.

Dropdown mode IBM Bob dengan mode Plan dipilih

Mode menerapkan prinsip hak akses minimal. Di mode Plan, Bob membaca kodemu dan menulis rencana Markdown. Bob tidak menjalankan perintah atau membuat perubahan implementasi. Kamu meninjau pendekatannya sebelum Bob menulis kode aplikasi apa pun.

Tentukan persyaratan aplikasi

Di antarmuka chat Bob, masukkan prompt berikut:

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.

Untuk membangun rencana, Bob menjalankan skill perencanaan-nya. Saat diminta, pilih Approve skill tools for task dan Approve subagent tools for task agar Bob dapat mengeksplorasi workspace dan menyusun rencana.

Sempurnakan rencana

Kamu dapat mengubah rencana sebelum Bob menulis kode apa pun. Di antarmuka chat Bob, masukkan prompt lanjutan:

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

Bob merevisi rencana untuk menyertakan validasi input tambahan. Tinjau rencana yang diperbarui.

Tinjau rencana

Bob mempresentasikan rencana yang terurut dan mungkin menyimpannya sebagai file Markdown dalam proyek. Tinjau sebelum melanjutkan:

  • Cakupan: rencana mencakup setiap endpoint dan aturan validasi yang kamu tambahkan, dan tidak ada yang tidak kamu minta.
  • File yang disebutkan: setiap langkah menyebutkan file yang dibuat atau diubah.
  • Bahasa yang samar: frasa seperti "handle errors appropriately" menyembunyikan asumsi. Minta Bob untuk membuatnya lebih spesifik.

Kamu tetap bertanggung jawab atas keputusan desain ini. Bob tidak mengimplementasikan apa pun hingga kamu beralih ke mode Agent di Buat dan tinjau aplikasi.

Buat dan tinjau aplikasi

Mulai context window baru, beralih ke mode Agent, dan minta Bob mengimplementasikan rencana yang disetujui.

Mulai context window baru

Pilih New task di kotak chat atau + di bagian atas panel chat untuk memulai context window baru. Lihat Buat context window baru untuk latar belakang. Bob menyimpan rencana di folder plans, sehingga kamu tidak lagi memerlukan percakapan perencanaan dalam konteks. Konteks yang bersih membuat implementasi tetap terfokus pada rencana yang disetujui.

Beralih ke mode Agent dan jalankan rencana

Buka dropdown mode di bagian bawah sidebar Bob dan pilih Agent. Lalu beri tahu Bob untuk mengimplementasikan rencana:

Implement the plan in the plans folder.
@plans/

Mode Agent memungkinkan Bob menulis file dan menjalankan perintah. Bob meminta persetujuan sebelum setiap perubahan karena kamu menonaktifkan auto-approval. Setujui langkah-langkah saat Bob menyelesaikan rencana.

Tinjau aplikasi yang dibuat

Saat implementasi selesai, tinjau kode yang dibuat. Karena output Bob bersifat probabilistik, gaya kode dan nama internal-mu mungkin berbeda dari contoh yang ditampilkan di sini. Aplikasi terdiri dari bagian-bagian berikut.

Model data. Bob menghasilkan dua model Pydantic: satu untuk request body saat membuat tugas, dan satu untuk tugas yang disimpan. Model create menerapkan aturan panjang yang kamu tambahkan saat perencanaan:

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


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

Path endpoint dan status code sesuai dengan persyaratan yang kamu berikan kepada Bob, tetapi nama class model dan tata letak file bisa bervariasi. Tutorial ini mengasumsikan model Task dan TaskCreate. Sesuaikan prompt berikut jika Bob memilih nama yang berbeda.

Penyimpanan data di memori. Bob menyimpan tugas dalam Python list kosong dan memberikan setiap tugas baru id yang bertambah:

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

Operasi API. Aplikasi menyediakan endpoint berikut:

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

POST /tasks hanya menerima task_name dalam request body dan mengembalikan 201 beserta tugas yang dibuat. DELETE /tasks/{task_id} mengembalikan 204 saat berhasil dan 404 ketika tidak ada tugas dengan task_id tersebut.

Dependensi. Bob menghasilkan file requirements.txt yang mencantumkan FastAPI, Uvicorn, dan Pydantic.

Container. Bob menghasilkan Dockerfile yang menginstal dependensi dan menjalankan API di port 8000 dengan Uvicorn.

Kontrak HTTP mengikuti prompt persyaratan, termasuk metode, path, dan status code. Langkah validasi berikut berlaku sebagaimana ditulis.

Tambahkan endpoint dengan literate coding

Gunakan mode literate coding untuk menambahkan endpoint update langsung dari instruksi bahasa alami di editor, tanpa beralih ke jendela chat.

Mode literate coding menghasilkan kode dari instruksi bahasa alami yang ditulis langsung di editor.

Buka file aplikasi

Buka file main.py yang dibuat Bob dan tempatkan kursor di baris kosong di akhir file, setelah route handler terakhir.

Aktifkan mode literate coding

Tekan Command + I di Mac, atau Ctrl + I di Windows dan Linux. Kamu juga bisa memilih ikon magic wand di toolbar editor.

Tulis instruksinya

Masukkan instruksi berikut di baris kosong. Instruksi tersebut muncul disorot dengan warna berbeda dari sisa kode.

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 menyimpulkan nama parameter, model request, dan penanganan error dari kode di sekitarnya, sehingga kamu hanya perlu menentukan metode dan path.

Buat dan terima kode

Pilih Generate, atau tekan Command + Enter di Mac, atau Ctrl + Enter di Windows dan Linux. Bob menggantikan instruksimu dengan implementasi dan menampilkan inline diff.

Tinjau diff tersebut, lalu pilih Accept All untuk menerapkan perubahan. Tekan Command + I di Mac, atau Ctrl + I di Windows dan Linux lagi untuk keluar dari mode literate coding.

Jelaskan, jalankan, dan validasi

Minta Bob menjelaskan implementasi, lalu jalankan aplikasi dan validasi perilakunya.

Minta Bob menjelaskan kode

Mulai context window baru dengan New task, lalu pilih Ask dari dropdown mode. Mode Ask menjawab pertanyaan dan menganalisis kode tanpa mengedit file. Gunakan mode ini saat kamu ingin penjelasan tanpa perubahan.

Memahami kode yang dibuat adalah bagian penting dari AI pair programming. Tanyakan kepada Bob:

Explain the generated To-Do API.

Bob dapat menjelaskan arsitektur aplikasi, alur data, komponen FastAPI, model Pydantic, perilaku endpoint, dan keputusan desain. Gunakan penjelasan ini untuk mengonfirmasi bahwa kode melakukan apa yang kamu harapkan sebelum kamu mengubah atau memperluas-nya.

Jalankan aplikasi

Beralih kembali ke mode Agent agar Bob dapat menjalankan perintah. Minta Bob untuk membangun dan menjalankan API dalam container:

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

Bob menjalankan perintah build dan start serta melaporkan saat container berjalan.

Buka http://localhost:8000/docs di browser kamu.

FastAPI menyajikan Swagger UI interaktif di /docs. Gunakan untuk menjelajahi setiap endpoint, memeriksa skema request dan response, dan menjalankan panggilan API dari browser.

Validasi API

Gunakan Swagger UI di /docs untuk menjalankan setiap operasi. Untuk setiap endpoint:

  1. Perluas barisnya dan pilih Try it out.
  2. Masukkan parameter path atau request body yang diperlukan.
  3. Pilih Execute.
  4. Periksa kode dan body Server response.

Tambah tugas

  1. Perluas POST /tasks dan pilih Try it out.

  2. Ganti request body dengan:

    {
      "task_name": "My first API item!"
    }
  3. Pilih Execute. Konfirmasi kode respons adalah 201 dan body respons menampilkan tugas yang dibuat dengan id yang ditetapkan.

Ambil tugas

  1. Perluas GET /tasks dan pilih Try it out.
  2. Pilih Execute. Konfirmasi kode respons adalah 200 dan body respons mencantumkan tugas My first API item! dengan id yang ditetapkan saat kamu menambahkannya.

Update tugas

  1. Perluas PUT /tasks/{task_id} dan pilih Try it out.

  2. Masukkan task_id dari tugas yang kamu buat.

  3. Ganti request body dengan:

    {
      "task_name": "Build and ship a To-Do API"
    }
  4. Pilih Execute. Konfirmasi kode respons adalah 200 dan tugas yang dikembalikan menampilkan task_name yang diperbarui.

  5. Ubah task_id ke nilai yang tidak ada dan pilih Execute lagi. Konfirmasi kode respons adalah 404.

Hapus tugas

  1. Perluas DELETE /tasks/{task_id} dan pilih Try it out.
  2. Masukkan task_id dari tugas yang kamu buat dan pilih Execute. Konfirmasi kode respons adalah 204.
  3. Perluas GET /tasks, pilih Execute, dan konfirmasi tugas tidak lagi muncul dalam respons.
  4. Perluas DELETE /tasks/{task_id} lagi, masukkan task_id yang sama, dan pilih Execute. Konfirmasi kode respons adalah 404.

Implementasi memenuhi persyaratan asli, termasuk endpoint update yang kamu tambahkan dengan literate coding.

Tingkatkan kualitas kode

Minta Bob meninjau kode yang dibuat untuk masalah kualitas, lalu terapkan perubahan yang kamu setujui. Langkah ini menggunakan Bob sebagai reviewer, bukan hanya sebagai pembuat kode.

Minta Bob memberikan saran peningkatan

Mulai context window baru dengan New task, lalu masukkan:

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

Bob mengidentifikasi kekurangan seperti endpoint yang hilang untuk mengambil satu tugas, penyimpanan di memori yang menyimpan dictionary biasa alih-alih model Task yang tervalidasi, dan id_counter di level modul yang sulit direset atau diuji.

Terapkan peningkatan

Minta Bob mengimplementasikan saran yang ingin kamu pertahankan:

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.

Tinjau perubahan yang diusulkan dan setujui untuk menerapkannya. Minta Bob membangun ulang image dan me-restart container, lalu ulangi langkah validasi. Konfirmasi bahwa GET /tasks/{task_id} mengembalikan 200 beserta tugas untuk ID yang valid dan 404 untuk ID yang tidak dikenal, dan endpoint yang ada tetap berperilaku seperti sebelumnya.

Buat test dan dokumentasi

Minta Bob membuat suite test dan dokumentasi teknis untuk API.

Buat unit test

Mulai context window baru dengan New task, lalu tanyakan kepada 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 menambahkan dependensi test pytest dan httpx, membangun image yang menyertakannya, menjalankan suite dalam container, dan melaporkan hasilnya. Menjalankan test dalam container berarti kamu tidak memerlukan lingkungan Python lokal. Tinjau dan sempurnakan test yang dibuat.

Meninjau dan memelihara test yang dibuat tetap menjadi tanggung jawabmu.

Buat dokumentasi teknis

Tanyakan kepada Bob:

Generate technical documentation for this To-Do API.

Bob dapat menghasilkan gambaran umum aplikasi, deskripsi arsitektur, ringkasan endpoint, contoh request dan response, serta petunjuk penggunaan. Dokumentasi ini melengkapi dokumentasi API yang dihasilkan FastAPI secara otomatis.

Pemecahan masalah

Gunakan solusi berikut untuk masalah umum:

  • Cannot connect to the Docker daemon: Jalankan Docker Desktop atau layanan Docker sebelum kamu membangun image.
  • Container berjalan tetapi http://localhost:8000/docs tidak dapat dimuat: Dockerfile mengikat API ke 127.0.0.1 di dalam container, yang tidak dapat dijangkau oleh port yang dipublikasikan. Pastikan Dockerfile menjalankan Uvicorn dengan --host 0.0.0.0, lalu bangun ulang image.
  • Bind for 0.0.0.0:8000 failed: port is already allocated: Hentikan proses yang menggunakan port 8000, atau petakan port host lain dengan docker run -d --name todo-api -p 8080:8000 todo-api dan buka http://localhost:8080/docs.
  • The container name "/todo-api" is already in use: Jalankan docker rm -f todo-api, lalu mulai container lagi.
  • pytest is missing when the tests run: Image aplikasi tidak menyertakan dependensi test. Minta Bob menambahkan pytest dan httpx ke dev requirements file dan membangun image test terpisah.

Pembersihan

Hentikan dan hapus container untuk melepaskan port 8000:

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

API hanya menyimpan tugas di memori, sehingga menghapus container akan membuang semua data. Tidak ada yang perlu dibersihkan lagi.

Langkah selanjutnya

Dalam tutorial ini, kamu membangun dan memvalidasi FastAPI To-Do API yang dikontainerisasi dengan berpasangan bersama Bob di setiap tahap dan meninjau setiap perubahan sebelum menerapkannya.

FAQ

Apakah saya perlu mengetahui FastAPI? Tidak. Bob membuat kode FastAPI dan Pydantic serta menjelaskannya atas permintaan. Pengetahuan dasar Python dan REST sudah cukup.

Mengapa beralih mode di setiap tahap? Mode menerapkan hak akses minimal. Mode Plan membaca kode dan menulis rencana tetapi tidak menjalankan apa pun; mode Agent dapat mengedit file dan menjalankan perintah; mode Ask menjawab pertanyaan tanpa mengubah file. Pergantian mode memastikan kemampuan Bob sesuai dengan tugas yang sedang dikerjakan.

Bagaimana jika Bob memberi nama file atau model berbeda? Kontrak HTTP dikunci oleh prompt persyaratan, sehingga path dan status code akan sesuai. Nama class dan tata letak file bisa bervariasi. Tutorial ini mengasumsikan model Task dan TaskCreate; sesuaikan prompt berikutnya jika Bob memilih nama yang berbeda.

Mengapa memulai context window baru di setiap tahap? Bob menyimpan rencana ke folder plans, sehingga percakapan sebelumnya tidak lagi diperlukan dalam konteks. Konteks yang bersih membuat setiap tahap tetap terfokus dan mengontrol biaya token.

Bisakah saya melakukan ini tanpa Docker? Secara teknis kamu bisa melakukan tutorial ini tanpa Docker, tetapi kamu perlu mengedit rencana dan prompt ke Bob.

Apakah mode Plan mengubah file? Tidak. Dalam mode Plan, Bob hanya membaca kodemu dan menulis rencana Markdown. Tidak ada perubahan kode aplikasi sampai kamu beralih ke mode Agent.

Bagaimana topik ini?