Satuan 5 / 12

Debugging dan Pemecahan Masalah

Keuntungan:

  • Kemampuan untuk mendeskripsikan bug secara efektif pada AI dengan pesan kesalahan, pelacakan tumpukan, dan instance reproduksi terkecil
  • Kemampuan untuk menjalankan alur proses debug sistematis dengan AI untuk menemukan akar permasalahan dengan membuat hipotesis dan mempersempitnya langkah demi langkah
  • Kemampuan untuk memverifikasi bahwa perbaikan yang disarankan AI benar-benar memperbaiki masalah dengan mereproduksi dan menguji regresi

Debugging adalah tugas untuk mencari tahu mengapa suatu program berperilaku berbeda dari yang diharapkan dan memperbaikinya, dan ini menghabiskan banyak waktu bagi sebagian besar insinyur. Proses debug yang baik tidak didasarkan pada permainan tebak-tebakan, namun pada penyempitan sistematis: memperjelas gejala, membuat hipotesis, menguji hipotesis, mencari akar permasalahan. AI adalah mitra yang sangat kuat dalam siklus ini; Tapi hanya jika Anda memberinya informasi yang benar. Mengatakan "kode tidak berfungsi, perbaiki" memaksa AI untuk menebak dan memberikan saran menyeluruh. Berikan pesan kesalahan lengkap, jejak tumpukan, dan sampel reproduksi terkecil, dan bersama-sama Anda akan menemukan akar masalahnya.

Dalam unit ini kita akan melihat cara mendeskripsikan bug pada AI secara efektif, mempersempit hipotesis langkah demi langkah, dan memverifikasi melalui pengujian regresi bahwa perbaikan yang diusulkan benar-benar menyelesaikan masalah. Ingat: "memperbaiki" bug dan "menekan gejala bug" adalah dua hal yang berbeda; Koreksi yang dilakukan tanpa menemukan akar permasalahan akan memindahkan kesalahan ke tempat lain.

Konsep: Pelacakan tumpukan: Sebuah dump yang menunjukkan fungsi mana yang dipanggil dalam urutan apa pada saat terjadi kesalahan. Repro minimal: Kode/input paling sederhana dan terpendek yang memicu kesalahan. Akar penyebab: Sumber masalah sebenarnya, bukan gejalanya. Pengujian regresi: Pengujian yang memastikan bahwa kesalahan yang sama tidak terulang kembali.

Menjelaskan Bug pada AI

Kemungkinan AI menemukan akar permasalahan berbanding lurus dengan kualitas informasi yang Anda berikan. Deskripsi kesalahan yang baik mencakup: apa yang Anda coba lakukan, apa yang Anda harapkan, apa yang terjadi, teks kesalahan sebenarnya dan jejak tumpukan, kode yang terlibat, lingkungan (bahasa/versi/OS), dan sampel terkecil yang menghasilkan kesalahan.

  1. Perjelas gejalanya. Dalam format "X yang diharapkan, Y yang diaktualisasikan".
  2. Tempelkan teks kesalahan lengkap dan jejak tumpukan. Jangan memperpendeknya, menyensornya, tapi jangan merusak strukturnya.
  3. Berikan reproduksi terkecil. Input dan kode minimum yang memicu kesalahan.
  4. Tentukan lingkungan. Versi bahasa, versi perpustakaan, lingkungan runtime.

Prompt deskripsi kesalahan yang efektif: "Saya sedang men-debug bug. Informasi:- Apa yang saya coba lakukan: [X]- Perilaku yang diharapkan: [Y]- Perilaku sebenarnya: [Z]- Pesan kesalahan lengkap dan pelacakan tumpukan: [tempel]- Lingkungan: [bahasa/versi, perpustakaan/versi]- Kode minimum yang terlibat: [kode] Jangan beri saya perbaikan langsung. Pertama, buat daftar 3 akar penyebab yang paling mungkin dalam urutan probabilitas dan beri tahu saya pemeriksaan apa yang harus diverifikasi untuk masing-masing."

Mempersempit Aliran berdasarkan Hipotesis

Debug sistematis adalah seni menghilangkan kemungkinan satu per satu. Gunakan AI untuk menghasilkan hipotesis dan merancang eksperimen untuk menguji setiap hipotesis; Kemudian jalankan eksperimen dan kembalikan hasilnya. Siklus ini jauh lebih cepat daripada kebiasaan melakukan perubahan acak dan berhenti, yang disebut "shotgun debugging".

Permintaan bantuan pencarian biner (bagi dua): "Kesalahan ini tidak ada kemarin, melainkan ada hari ini. Saya ingin mencari tahu yang mana dari 20 perubahan terakhir yang membawa kesalahan dengan membagi dua. Beri saya rencana langkah demi langkah: titik mana yang harus saya uji, bagian mana yang harus saya tuju tergantung pada hasilnya. Juga beri tahu saya apa yang harus diperiksa pada setiap langkah."

Perintah strategi penyisipan log: "Saya tidak dapat menemukan kesalahan karena saya tidak dapat melihat nilai perantara dalam fungsi ini. Beri tahu saya di titik mana saya perlu menambahkan baris log yang mencetak variabel mana. Tambahkan penjelasan 'apa yang akan saya pelajari dari log ini' untuk setiap log. Tentukan juga peringatan yang akan mencegah saya mencatat data rahasia."

Tip: Jika Anda tidak dapat mengatasi kesalahan, sering kali masalahnya terletak pada asumsi Anda yang salah. Tanyakan kepada AI “asumsi saya apa yang mungkin salah?” Meminta akan mematahkan kebutaanmu. Kesalahan terberat tersembunyi di tempat Anda mengatakan "Saya yakin ini berhasil".

Prompt Lemah / Prompt Kuat

LEMAH:"Kode saya memberikan kesalahan, perbaiki: [200 baris kode]"(Hasil: AI tidak mengetahui kesalahan apa itu, apa yang diharapkan; ia memberikan saran umum berdasarkan tebakan, sebagian besar tidak berguna.)KUAT:"Saya mendapatkan NullPointerException. Diharapkan: daftar pengguna harus dikembalikan. Aktual: Meledak saat panggilan ke getUsers(). Jejak tumpukan: [paste].Lingkungan: Java 17. Pengulangan minimum: Ini terjadi ketika daftar pengguna adalah kosong, tetapi tidak jika sudah penuh. 15 baris terkait: [kode]. Jelaskan akar permasalahan dan mengapa daftar kosong dipicu, lalu sarankan perbaikan."

Prompt yang kuat menempatkan kesalahan dalam konteks: dalam hal ini terjadi (daftar kosong), dalam hal ini tidak terjadi (daftar lengkap). Petunjuk tunggal ini ("terjadi ketika kosong") hampir secara langsung menunjuk pada akar permasalahan. Karena informasi ini tidak tersedia pada prompt yang lemah, AI membuat tebakan buta.

Memverifikasi Perbaikan

Suatu perbaikan hanya merupakan perbaikan nyata jika perbaikan tersebut melakukan tiga hal:

kontrol

Pertanyaan

Bagaimana cara memverifikasi

Apakah kesalahannya sudah hilang?

Apakah entri yang sama berfungsi sekarang?

Jalankan repro minimal lagi

Tidak ada kesalahan baru?

Apa ada lagi yang rusak?

Jalankan seluruh rangkaian pengujian

Bukankah itu akan terulang kembali?

Apakah kesalahan yang sama akan terulang kembali?

Tambahkan uji regresi untuk skenario ini

Koreksi yang dilakukan tanpa menemukan akar permasalahan sering kali menekan gejalanya. Misalnya, mengabaikan kesalahan nol dengan "lewati jika nol" membuat alasan sebenarnya, "mengapa datanya menjadi nol?" tidak terlihat, dan kesalahan terulang kembali di tempat lain.

Kasus Mini

Kasus 1 — Perangkap penekan gejala. Sebuah tim membungkam kesalahan nol sesekali dengan try-catch; Errornya hilang tapi setelah 2 minggu datanya hilang. Alasan sebenarnya adalah bahwa layanan mengembalikan null pada waktu habis. Saat Anda bertanya kepada AI "mengapa nilainya menjadi nol?", akar permasalahannya muncul; Perbaikan sebenarnya membutuhkan waktu 1 jam tetapi bersifat permanen.

Kasus 2 — Kekuatan repro minimal. Pengembang tidak dapat memperbaiki bug yang mengatakan "itu crash sesekali." Ini mengurangi kesalahan hingga input terkecil dengan saran AI: masalah hanya terjadi dengan nama file yang mengandung karakter Turki (kesalahan pengkodean). Ketika 300 baris ketidakpastian dikurangi menjadi 5 baris repro definitif, solusinya menjadi jelas.

Kasus 3 — Uji anti-regresi. AI memperbaiki kesalahan penghitungan tanggal. Insinyur tidak puas dengan hal ini; menambahkan uji regresi untuk skenario yang salah (akhir bulan, 31 Januari + 1 bulan). Ketika perubahan lain menyentuh area yang sama 4 bulan kemudian, pengujian berubah menjadi merah dan bug ditangkap sebelum mencapai produksi.

Kesalahan umum

  • Artinya "tidak berfungsi, perbaiki". Tanpa teks kesalahan, ekspektasi dan repro, AI menebak.
  • Tidak memberikan jejak tumpukan. Pelacakan tumpukan sering kali secara langsung menunjukkan akar permasalahan.
  • Terus lakukan perubahan acak. Eksperimen tanpa membuat hipotesis hanya membuang-buang waktu.
  • Menekan gejala dan menghilangkan akar permasalahannya. Kesalahan muncul kembali di tempat lain.
  • Tidak mengamankan perbaikan dengan pengujian regresi. Kesalahan yang sama muncul kembali secara diam-diam di masa depan.

Singkatnya

Proses debug yang efektif adalah penyempitan sistematis, bukan menebak-nebak. Memberi AI teks kesalahan lengkap, pelacakan tumpukan, reproduksi minimal, dan informasi lingkungan secara eksponensial meningkatkan kemungkinan menemukan akar permasalahan. Gunakan AI untuk menghasilkan hipotesis dan merancang eksperimen untuk menguji setiap hipotesis; Anda menjalankan eksperimen. Pertimbangkan perbaikan "selesai" hanya ketika Anda melihat bahwa bug telah hilang, tidak ada bug baru yang muncul, dan dilindungi oleh pengujian regresi.

Tugas aplikasi

Pertimbangkan kesalahan nyata atau buatan. Pertama-tama kurangi kesalahan ke reproduksi terkecil (di input mana terjadi, di mana tidak). Dengan menggunakan prompt resep bug yang efektif, tanyakan kepada AI 3 hipotesis akar penyebab dan langkah verifikasi untuk masing-masing hipotesis. Temukan akar permasalahan dengan menguji hipotesis satu per satu, memperbaikinya, lalu menulis dan menjalankan uji regresi untuk skenario ini guna menunjukkan bahwa bug telah hilang dan pengujian tersebut memberikan perlindungan.

daftar periksa

  • [ ] Saya mengklarifikasi gejala tersebut sebagai "yang diharapkan vs yang disadari".
  • [ ] Saya memberikan teks kesalahan lengkap dan jejak tumpukan ke AI.
  • [ ] Saya mengurangi kesalahan ke reproduksi terkecil.
  • [ ] Dengan menguji hipotesis satu per satu, saya menemukan akar masalahnya.
  • [ ] Alih-alih menekan gejalanya, saya memperbaiki akar masalahnya.
  • [] Saya menambahkan dan menjalankan tes regresi untuk kesalahan yang sama.