Prompt Engineering untuk Developer: Cara Dapat Kode yang Bersih, Bukan Spaghetti
Prompt Engineering untuk Developer: Cara Dapat Kode yang Bersih, Bukan Spaghetti
Kamu pernah minta AI buatkan kode, hasilnya berantakan — tidak ada error handling, nama variabel tidak konsisten, atau strukturnya sama sekali tidak cocok dengan codebase yang sudah ada? Masalahnya bukan di AI-nya. Masalahnya ada di promptnya.
Prompt engineering untuk developer berbeda dari prompt untuk menulis artikel atau membuat gambar. Ada teknik spesifik yang membuat perbedaan antara kode yang langsung bisa dipakai versus kode yang butuh ditulis ulang setengahnya.
1. Anatomi Prompt yang Menghasilkan Kode Berkualitas
Prompt yang baik untuk coding memiliki 5 komponen:
┌─────────────────────────────────────────────────────┐
│ 1. KONTEKS → Stack, framework, konvensi proyek │
│ 2. TUJUAN → Apa yang ingin dicapai (bisnis) │
│ 3. CONSTRAINT → Batasan teknis dan non-teknis │
│ 4. FORMAT → Struktur output yang diinginkan │
│ 5. CONTOH → Kode existing sebagai referensi │
└─────────────────────────────────────────────────────┘
Tidak semua komponen harus ada di setiap prompt, tapi semakin lengkap, semakin baik hasilnya.
2. Teknik Dasar: Dari Prompt Buruk ke Prompt Baik
Contoh 1: Membuat Fungsi
// ❌ Prompt buruk
"Buat fungsi untuk validasi email"
// Hasilnya: fungsi sederhana tanpa edge case, mungkin pakai regex yang salah
// ✅ Prompt baik
"Buat fungsi TypeScript validateEmail(email: string): boolean
- Gunakan regex yang sesuai RFC 5322 (bukan yang terlalu strict)
- Handle edge case: null, undefined, string kosong → return false
- Maksimal panjang email 254 karakter (standar RFC)
- Jangan izinkan spasi di manapun
- Sertakan JSDoc comment
- Sertakan 5 test case sebagai komentar (valid dan invalid)"
Contoh 2: Membuat API Endpoint
// ❌ Prompt buruk
"Buat endpoint untuk upload file"
// ✅ Prompt baik
"Buat Express.js endpoint POST /api/upload dengan spesifikasi:
- Stack: Express + TypeScript + Multer + AWS S3 SDK v3
- Validasi: hanya terima image/jpeg, image/png, image/webp
- Batas ukuran: 5MB per file, maksimal 10 file per request
- Proses: resize ke max 1920px (pakai sharp), upload ke S3 bucket 'user-uploads'
- Response: { success: true, urls: string[] } atau { success: false, error: string }
- Error handling: file terlalu besar, format tidak didukung, S3 error
- Gunakan async/await, bukan callback
- Middleware auth sudah ada di req.user.id
Contoh struktur response yang sudah ada di proyek ini:
return res.status(200).json({ success: true, data: result });"
3. Teknik Lanjutan: Prompt Patterns untuk Developer
Pattern 1: "Act As" dengan Spesifikasi Ketat
"Kamu adalah senior backend engineer dengan 10 tahun pengalaman di Node.js.
Kamu sangat peduli dengan:
- Clean code dan SOLID principles
- Security (tidak pernah trust user input)
- Performance (selalu pertimbangkan N+1 query)
- Maintainability (kode harus mudah dibaca junior developer)
Dengan mindset itu, review dan refactor kode berikut:
[paste kode]"
Pattern 2: Chain of Thought untuk Bug Kompleks
"Aku punya bug yang aneh. Tolong analisis step by step:
1. Jelaskan apa yang seharusnya dilakukan kode ini
2. Trace eksekusi untuk input yang menyebabkan bug
3. Identifikasi di baris mana logika mulai salah
4. Jelaskan root cause-nya
5. Berikan fix dengan penjelasan mengapa fix itu benar
Kode:
[paste kode]
Input yang menyebabkan bug:
[paste input]
Error yang muncul:
[paste error message]"
Pattern 3: Constraint-First untuk Kode Aman
"Buat fungsi untuk query database dengan constraint keamanan berikut
(ini TIDAK BOLEH dilanggar):
- WAJIB gunakan parameterized query, tidak boleh string concatenation
- WAJIB validasi dan sanitasi semua input sebelum query
- WAJIB handle database error tanpa expose detail ke caller
- WAJIB ada timeout 5 detik untuk setiap query
- TIDAK BOLEH log nilai password atau token
Setelah constraint terpenuhi, implementasikan:
getUserByEmail(email: string): Promise"
Pattern 4: Contoh Input-Output untuk Presisi
"Buat fungsi formatCurrency dengan behavior berikut:
Input → Output yang diharapkan:
1000 → 'Rp 1.000'
1500.5 → 'Rp 1.500,50'
1000000 → 'Rp 1.000.000'
-500 → '-Rp 500'
0 → 'Rp 0'
null → 'Rp 0'
undefined → 'Rp 0'
'abc' → throw Error('Invalid amount')
Gunakan TypeScript. Jangan gunakan library eksternal."
4. Prompt untuk Situasi Spesifik
Debugging
"Debug kode ini. Jangan langsung kasih solusi.
Pertama, tanyakan 3 pertanyaan klarifikasi yang paling penting
untuk memahami konteks bug ini sebelum memberikan diagnosis."
// Teknik ini memaksa AI berpikir lebih dalam sebelum menjawab
Code Review
"Review PR ini dengan format:
🔴 CRITICAL (harus diperbaiki sebelum merge):
- [masalah] → [saran perbaikan]
🟡 WARNING (sebaiknya diperbaiki):
- [masalah] → [saran perbaikan]
🟢 SUGGESTION (nice to have):
- [saran improvement]
ℹ️ PRAISE (yang sudah bagus):
- [hal positif]
Fokus pada: security, performance, maintainability, dan test coverage.
[paste diff atau kode]"
Arsitektur
"Aku mau desain sistem [deskripsi sistem].
Sebelum memberikan rekomendasi arsitektur, tanyakan dulu:
- Berapa estimasi user concurrent?
- Apa SLA yang dibutuhkan (uptime, latency)?
- Apa budget infrastruktur per bulan?
- Apakah tim familiar dengan teknologi tertentu?
Setelah aku jawab, berikan 2-3 opsi arsitektur dengan trade-off masing-masing."
5. Kesalahan Prompt yang Sering Dilakukan Developer
| Kesalahan | Dampak | Solusi |
|---|---|---|
| Prompt terlalu singkat | Kode generik, tidak sesuai konteks | Tambahkan stack, konvensi, dan contoh |
| Tidak menyebut bahasa/framework | AI menebak, sering salah | Selalu sebutkan secara eksplisit |
| Minta terlalu banyak sekaligus | Kode panjang tapi banyak yang salah | Pecah menjadi prompt-prompt kecil |
| Tidak berikan contoh kode existing | Style tidak konsisten dengan codebase | Paste 1-2 fungsi sebagai referensi style |
| Tidak sebutkan edge case | Kode tidak handle null, empty, error | Eksplisit sebutkan edge case yang perlu di-handle |
6. Template Prompt Siap Pakai
// === TEMPLATE: Membuat Fitur Baru ===
"Stack: [bahasa] + [framework] + [database/ORM]
Konvensi: [naming convention, error format, dll]
Buat [nama fitur] dengan requirements:
- [requirement 1]
- [requirement 2]
- [requirement 3]
Constraint:
- [constraint keamanan/performa]
Edge case yang harus di-handle:
- [edge case 1]
- [edge case 2]
Referensi style dari kode existing:
[paste 1 fungsi sebagai contoh]"
// === TEMPLATE: Debugging ===
"Bahasa/Framework: [stack]
Bug: [deskripsi singkat]
Kode yang bermasalah:
[paste kode]
Input yang menyebabkan bug:
[paste input]
Error message:
[paste error]
Yang sudah aku coba:
- [langkah 1]
- [langkah 2]
Tolong analisis root cause dan berikan fix dengan penjelasan."
Kesimpulan
Prompt engineering untuk developer bukan seni mistis — ini skill yang bisa dipelajari dan dilatih. Investasi 2-3 menit untuk menulis prompt yang baik bisa menghemat 30-60 menit debugging dan refactoring kode yang dihasilkan AI.
Mulai dengan selalu menyertakan stack dan konvensi, berikan contoh kode existing sebagai referensi, dan pecah permintaan besar menjadi langkah-langkah kecil. Dalam beberapa minggu, kamu akan punya library prompt sendiri yang bisa dipakai berulang kali.