Satuan 4 / 12

Tinjauan Kode, Refactoring, dan Hutang Teknis

Keuntungan:

  • Kemampuan untuk menggunakan AI sebagai mata kedua dalam peninjauan kode untuk keterbacaan, logika, dan keamanan
  • Kemampuan untuk merencanakan langkah-langkah pemfaktoran ulang dengan dukungan AI tanpa mengganggu perilaku kode yang kompleks
  • Kemampuan untuk memverifikasi ulasan AI dan mengedit rekomendasi dengan pengujian dan perbandingan kontrol versi

Dalam rekayasa perangkat lunak, kode lebih banyak dibaca daripada ditulis. Sebaris kode ditulis satu kali, namun dibaca, dimodifikasi, dan dibuat puluhan kali selama berbulan-bulan. Itu sebabnya peninjauan kode (meninjau kode orang lain atau kode Anda sendiri untuk mengetahui logika, keterbacaan, dan keamanan) dan pemfaktoran ulang (meningkatkan struktur kode tanpa mengubah perilakunya) merupakan inti dari rekayasa. AI menjadi “mata kedua” yang kuat untuk dua tugas ini: AI dengan cepat menyarankan keterbacaan, menunjukkan masalah logika dan keamanan yang diabaikan, dan memecah proses pemfaktoran ulang yang besar menjadi langkah-langkah aman yang lebih kecil. Namun ada aturan penting: pemfaktoran ulang tidak boleh mengubah perilaku, dan satu-satunya hal yang menjamin hal ini adalah pengujian.

Dalam unit ini, kita akan melihat cara menggunakan AI secara terstruktur untuk peninjauan kode, cara memperbaiki kode yang rumit tanpa merusak perilakunya, dan cara mengelola utang teknis (keputusan kode yang cepat namun mahal).

Konsep: Hutang teknis: Keputusan kode yang dibuat hari ini untuk kecepatan yang mempersulit pemeliharaan di masa depan. Bau kode: Pola yang bukan merupakan kesalahan tetapi menunjukkan masalah (fungsi terlalu panjang, kode berulang). Regresi: Ketika suatu perubahan merusak sesuatu yang sebelumnya berfungsi.

Menggunakan AI dalam Tinjauan Kode Terstruktur

Ketika waktu terbatas, maka perlu untuk fokus pada isu-isu dengan risiko tertinggi. Pemformat otomatis menangani masalah pemformatan seperti lekukan dan spasi; Anda harus mencurahkan perhatian manusia pada logika, keamanan, dan perilaku edge case. Saat melakukan tinjauan AI, mintalah daftar yang diprioritaskan, bukan ulasan yang bertubi-tubi.

  1. Berikan ruang lingkupnya. Kode apa, apa yang harus dilakukan, dalam konteks apa kerjanya.
  2. Tentukan sumbu prioritas. Akurasi dan keamanan diutamakan, keterbacaan di urutan kedua.
  3. Mintalah koreksi yang konkrit. “Mengapa menjadi masalah” dan “perbaikan yang disarankan” untuk setiap temuan.
  4. Anda memverifikasi temuannya. AI juga menghasilkan kesalahan positif; Verifikasi setiap temuan terhadap kode dan pengujian.

Permintaan tinjauan terstruktur: "Periksa fungsi berikut seperti seorang insinyur senior. Cantumkan temuan berdasarkan tingkat kepentingannya dan tandai dengan tag berikut: logika/keamanan [KRITIS], kasus/kinerja tepi [SEDANG], keterbacaan/nama [RENDAH]. Untuk setiap temuan: mengapa bertanya, saran perbaikan yang konkrit. JANGAN LEWATKAN masalah pemformatan/indentasi, alat otomatis akan menanganinya. Kode: [kode]"

Permintaan tinjauan yang berfokus pada keamanan: "Tinjau kode ini hanya untuk tujuan keamanan: kurangnya validasi input, risiko injeksi, kurangnya kontrol otorisasi, kebocoran informasi rahasia, default yang tidak aman. Tambahkan contoh skenario serangan ke setiap temuan. Jika tidak ada masalah keamanan, nyatakan dengan jelas 'Saya tidak menemukan masalah keamanan kritis apa pun'. Kode: [kode]"

Perhatian: Hanya karena AI mengatakan "tidak ada masalah" bukan berarti tidak ada masalah. AI dapat menghasilkan negatif palsu; dapat melewati masalah keamanan nyata. Ulasan AI melengkapi, bukan menggantikan, ulasan manusia dan pengujian keamanan. Dalam kode keamanan kritis, insinyur yang kompeten memiliki keputusan akhir.

Refactoring yang Dipertahankan Uji

Aturan emas refactoring: uji dulu, ubah nanti. Sebelum memperbaiki kode, harus ada tes yang mengunci perilaku saat ini sehingga Anda segera mengetahui jika perubahan tersebut merusak sesuatu. Jangan merusak pesanan saat melakukan refactoring AI.

  1. Uji perilaku saat ini. Jika tidak, mintalah AI melakukan “tes karakterisasi” (tes yang menangkap perilaku saat ini sebagaimana adanya).
  2. Perbaiki dalam langkah-langkah kecil. Pengujian harus tetap ramah lingkungan di setiap langkah.
  3. Jalankan setelah setiap langkah. Tangkap regresi sejak dini.

Perintah rencana pemfaktoran ulang yang aman: "Fungsi 60 baris berikut melakukan terlalu banyak hal dan sulit dibaca. Saya ingin melakukan pemfaktoran ulang TANPA mengubah perilakunya. Pertama: buat daftar kasus pengujian apa yang saya perlukan untuk mengunci perilaku saat ini. Kemudian: bagi pemfaktoran ulang menjadi langkah-langkah kecil, yang masing-masing dapat dijalankan saat pengujian berwarna hijau. Jangan tulis kodenya dulu, berikan rencananya terlebih dahulu. Kode: [kode]"

Prompt Lemah / Prompt Kuat

LEMAH: "Jadikan kode ini lebih baik." (Hasil: tidak jelas apa yang harus ditingkatkan; AI membuat perubahan sewenang-wenang, dapat mengubah perilaku secara diam-diam.) KUAT: "Refaktorkan fungsi penghitungan pembayaran ini agar mudah dibaca. KENDALA: perilaku harus tetap sama, nilai kembalian tidak boleh berubah. Pisahkan fungsi panjang menjadi fungsi utilitas yang berarti, tingkatkan angka ajaib menjadi konstanta bernama. Buat daftar perubahan item demi item dan jelaskan MENGAPA setiap item tidak mengubah perilaku. Kode: [kode]"

Perintah yang kuat dengan jelas menyatakan batasan "perilaku harus tetap sama" dan apa yang perlu ditingkatkan. Tanpa batasan ini, AI dapat mengubah logika atas nama “perbaikan” dan menghasilkan regresi diam-diam.

Mengelola Hutang Teknis

Pendekatan

Dalam jangka pendek

dalam jangka panjang

mengabaikan hutang

kemajuan yang cepat

Kelumpuhan pemeliharaan, tim melambat

menulis ulang semuanya

Pengembangan fitur berdiri

Return tidak pasti, risiko tinggi

Pemfaktoran ulang yang terukur dan terlindungi dari pengujian

perlambatan kecil

Kecepatan berkelanjutan

Cara paling sehat adalah yang ketiga: buat utangnya terlihat (lacak dalam daftar), mulai dari tempat yang paling menyakitkan, dan uji setiap perbaikannya. AI sangat membantu dalam mengidentifikasi dan memprioritaskan item utang, namun utang mana yang harus dibayar adalah keputusan bisnis.

Kasus Mini

Kasus 1 — Regresi senyap. Seorang pengembang memberi tahu AI untuk “menyederhanakan fungsi ini”; AI salah menerjemahkan suatu kondisi dan perhitungan pengembalian rusak. Karena tidak ada pengujian, kesalahan terjadi setelah 3 minggu dengan keluhan pelanggan. Tim melakukan pekerjaan yang sama dengan terlebih dahulu menulis tes karakterisasi dan menemukan kesalahan dengan tes merah pada percobaan pertama.

Kasus 2 — Mata kedua yang berguna. Dalam tinjauan kode, AI menyadari bahwa otorisasi pengguna hanya diperiksa di antarmuka dan bukan di server. Ini adalah kerentanan akses yang tidak sah. Insinyur menambahkan pemeriksaan otorisasi sisi server; Inspeksi AI mencegah insiden keamanan yang sebenarnya.

Kasus 3 — Positif palsu. AI mengatakan "variabel ini tidak pernah digunakan, hapus"; Namun digunakan secara tidak langsung melalui mekanisme refleksi variabel. Jika teknisi tidak memverifikasi saran terhadap pengujian, saran tersebut akan dihapus dan kesalahan runtime akan terjadi. Setiap temuan AI harus dikonfirmasi sebelum implementasi.

Kesalahan umum

  • Refactoring tanpa pengujian. Tidak ada yang tersisa untuk memastikan bahwa perilaku tersebut dipertahankan.
  • Menerapkan temuan AI tanpa memvalidasinya. Positif palsu dan negatif palsu keduanya terjadi.
  • Membuang waktu manusia untuk masalah format. Berfokus pada tugas-tugas yang dapat diselesaikan dengan alat otomatis menutupi risiko sebenarnya.
  • Mengambil jawaban "Tidak masalah" sebagai jaminan. AI dapat melewati kerentanan; tinjauan manusia diperlukan.
  • Berusaha melunasi seluruh utangnya sekaligus. Penulisan ulang besar-besaran berisiko; Langkah-langkah yang diukur dan dilindungi dengan pengujian lebih disukai.

Singkatnya

Peninjauan kode dan pemfaktoran ulang menentukan umur panjang kode. AI adalah penghasil rencana dan mata kedua yang kuat: menyediakan temuan yang diprioritaskan, skenario keamanan, dan rencana pemfaktoran ulang langkah kecil. Namun pemfaktoran ulang tidak seharusnya mengubah perilaku, dan hanya pengujian yang menjamin hal ini. Validasi setiap temuan AI terhadap kode dan pengujian; Jangan menganggap jawaban "tidak masalah" sebagai bukti. Jadikan utang teknis terlihat dan lunasi dengan langkah-langkah yang terukur dan terlindungi dari ujian.

Tugas aplikasi

Ambil baris 40-70, fungsi agak rumit yang Anda miliki (atau hasilkan AI). Pertama, ikuti perintah tinjauan terstruktur dan urutkan temuan sebagai [KRITIS]/[SEDANG]/[RENDAH]; Verifikasi secara manual setidaknya satu temuan terhadap kode. Kemudian, dengan perintah rencana pemfaktoran ulang yang aman, pertama-tama buat dan jalankan pengujian karakterisasi, kemudian terapkan pemfaktoran ulang dalam langkah-langkah kecil dan verifikasi bahwa pengujian tetap ramah lingkungan di setiap langkah.

daftar periksa

  • [ ] Saya menyusun ulasan dengan tag prioritas (kritis/sedang/rendah).
  • [ ] Saya telah memverifikasi setidaknya satu temuan AI terhadap kode/pengujian.
  • [] Saya menguji perilaku saat ini sebelum melakukan refactoring.
  • [ ] Saya membuat perubahan dalam langkah-langkah kecil dan menjalankan tes di setiap langkah.
  • [] Saya menetapkan batasan "Perilaku harus tetap sama" di prompt.
  • [ ] Saya telah mengonfirmasi bahwa temuan keamanan memerlukan konfirmasi manusia.