Bab 11: Coding & Debugging dengan AI¶
AI bukan menggantikan programmer. AI adalah programmer 10× yang bantu kamu tulis kode lebih cepat, lebih bersih, dan dengan bug lebih sedikit — kalau kamu tahu cara prompt-nya.
Selamat datang di Bagian 3 — Aplikasi Praktis. Sampai Bab 10, kita pelajari prinsip. Mulai Bab 11, kita aplikasikan ke domain spesifik. Bab ini fokus ke yang paling kepakai: coding.
Setelah Bab 11, kamu akan bisa:
- Pakai AI untuk write code yang clean, bukan hacky
- Debug error message dengan AI sebagai partner
- Refactor legacy code dengan aman
- Generate test cases yang comprehensive
- Hindari pitfalls: AI yang "halusinasi" library, copy-paste tanpa paham
11.1. Prinsip Dasar: AI sebagai Pair Programmer¶
Mindset penting: AI bukan Stack Overflow yang lebih cepat. Dia adalah junior dev pintar yang bisa ngetik 1000 kata per menit, tapi:
- ✅ Hafal banyak library/framework
- ✅ Bisa generate boilerplate cepat
- ✅ Sabar dijelasin masalah berkali-kali
- ❌ Bisa mengarang library yang tidak ada (hallucination)
- ❌ Bisa salah di edge case yang tidak obvious
- ❌ Tidak tahu konteks codebase kamu
Treat dia seperti junior dev: review semua yang dia tulis.
11.2. Konteks: Kunci Code Quality¶
Single biggest factor: konteks. AI tanpa konteks = output generic.
❌ Prompt Tanpa Konteks¶
Output: function generic, mungkin pakai library yang tidak kamu pakai, mungkin terlalu kompleks.
✅ Prompt dengan Konteks¶
[KONTEKS]
- Bahasa: Python 3.11
- Framework: FastAPI
- Existing utility: kita punya `utils/validators.py` yang sudah punya
validate_phone(), validate_address()
- Convention: snake_case, type hints, docstring Google-style
[TASK]
Tambah fungsi `validate_email(email: str) -> bool` di file yang sama.
- Pakai library standard saja (re module)
- Reject: empty string, no @, no dot di domain, spasi
- Edge case: support email panjang sampai 254 char
- Pakai pattern yang konsisten dengan validate_phone yang ada
[FILE EXISTING]
```python
{{ paste isi utils/validators.py }}
Output: function yang fit codebase, ngikut convention, langsung paste-able.
## 11.3. Pattern: Code Generation
### Generate dengan Spec Lengkap
Output: harga setelah diskon (float)
Behavior: - Hitung diskon = harga × (persen / 100) - Kalau ada max_diskon, cap diskon di nilai itu - Kalau persen di luar 0-100, raise ValueError - Kalau harga ≤ 0, raise ValueError
Test cases yang harus pass: - hitung_diskon(100000, 10) → 90000 - hitung_diskon(100000, 50, max_diskon=30000) → 70000 - hitung_diskon(0, 10) → ValueError - hitung_diskon(100, 150) → ValueError
[FORMAT] - Python 3.10+ - Type hints - Docstring (Google style) - Include 5+ test case dengan pytest
Generate function lengkap.
[CONTEKS] Saya punya function ini di Python:[TASK] Tulis versi JavaScript-nya. Semantics sama persis. Pakai modern ES6+.
[CONSTRAINT] - camelCase - Pakai async/await jika ada async di Python - JSDoc untuk type
[ERROR][KODE YANG ERROR]
[KONTEKS] - Apa yang saya coba lakukan: [deskripsi] - Saya sudah coba: [list things kamu sudah test]
Analisis: 1. Apa root cause error ini? 2. Kenapa kode saya trigger error? 3. Bagaimana fix-nya?
Jelaskan pelan-pelan, asumsi saya pemula yang bingung sama traceback.
[KODE][EXPECTED] Saya expect output: [...]
[ACTUAL] Yang keluar: [...]
[OBSERVATIONS] - Saya sudah cek: [1, 2, 3] - Yang aneh: [observasi spesifik]
Tolong analisis kemungkinan penyebab. Berikan 3 hipotesis dari yang paling mungkin ke paling tidak mungkin. Untuk tiap hipotesis, sebutkan cara verify-nya.
[CURRENT CODE][REASON FOR REFACTOR] - Kode terlalu nested - Susah di-test - Performance issue di [bagian]
[CONSTRAINT] - Behavior harus 100% sama (tidak boleh break tests existing) - Preserve function signatures public - Tidak boleh introduce dependency baru
[GOAL] Refactor jadi: 1. Lebih readable 2. Mudah di-test 3. Better separation of concerns
Jelaskan reasoning di tiap refactoring step.
[FUNCTION TO TEST][TASK] Generate test suite comprehensive pakai pytest.
Cover: - Happy path: 3+ test case dengan input typical - Edge cases: empty, null, max value, min value - Error cases: invalid input, expected exception - Boundary: tepat di limit
[FORMAT]
- pytest, dengan parametrize untuk test cases similar
- Naming: test_
[KONTEKS] - PR ini: [tujuan] - Bagian critical yang saya khawatir: [...]
[REVIEW REQUEST] Review kode dengan checklist: 1. Logic correctness — ada bug? 2. Edge case yang missed 3. Performance issues 4. Security concerns (SQL injection, XSS, dll) 5. Readability — bagian yang susah dipahami 6. Test coverage — apa yang harus ada test-nya tapi belum
[FORMAT] Severity per issue: critical / major / minor / nit Sertakan suggested fix untuk critical & major.
## 11.8. Pitfalls — Hati-hati
### Pitfall 1: Hallucinated Library
AI bisa tulis:
```python
import super_amazing_validator
result = super_amazing_validator.validate(email)
Library ini tidak ada. AI mengarang.
Fix: cek setiap import. Kalau ragu, search di PyPI (Python) atau npm (JS).
Pitfall 2: Outdated API¶
AI training data punya cutoff. API yang berubah setelah cutoff = AI pakai versi lama.
Fix: cek di official docs, terutama untuk library yang fast-moving (React, AI/ML libraries).
Pitfall 3: Security Issues¶
AI sering generate kode dengan bug security: - SQL injection (string concat ke query) - XSS (innerHTML user input) - Hardcoded credentials - Missing input validation
Fix: review dengan security checklist untuk kode yang handle user input.
Pitfall 4: Copy-Paste Tanpa Paham¶
AI generate kode → kamu paste → "berhasil" → next task.
Bahaya: kalau ada bug nanti, kamu tidak tahu kenapa kode itu ditulis seperti itu. Susah debug.
Fix: minta AI jelaskan kode yang dia generate. Atau minta versi simpler kalau kamu tidak paham.
Pitfall 5: Over-Engineering¶
AI cenderung tambah: - Class yang tidak perlu - Abstract pattern untuk problem simple - Library tambahan untuk one-liner
Fix: kasih constraint eksplisit:
Pakai pendekatan paling simple. Tidak perlu class kalau function cukup.
Tidak perlu library eksternal kalau standard library bisa.
11.9. Project: Coding Workflow¶
Build workflow personal kamu:
[PERSONA]
Kamu adalah senior software engineer yang pragmatic.
Filosofi: simplicity > cleverness. Readable code > short code.
[CONTEXT]
- Stack saya: {{ Python 3.11, FastAPI, PostgreSQL, dll }}
- Convention: {{ PEP 8, type hints, snake_case }}
- Project type: {{ web API, scripts, data processing, dll }}
[INSTRUKSI UMUM]
Setiap saya minta kode:
1. Tanya konteks kalau tidak clear
2. Generate kode lengkap (bukan snippet)
3. Include error handling untuk failure mode obvious
4. Tambah comment cuma kalau non-obvious
5. Setelah kasih kode, jelaskan trade-off dan limitasinya
[KARAKTER]
- Skeptis terhadap over-engineering
- Tanya "apakah benar-benar butuh ini?" sebelum generate
- Kalau ada cara lebih simple, kasih tau dulu
Save ini sebagai system prompt di custom GPT atau Claude project.
11.10. Latihan¶
11.1 — Build Workflow Pribadi¶
Customize template di section 11.9 sesuai stack kamu. Test dengan 5 task coding harian.
11.2 — Debug Real Error¶
Lain kali kamu dapat error confusing, pakai pattern di 11.4. Catat: berapa lama di-debug dengan AI vs tanpa?
11.3 — Refactor Legacy¶
Pilih function jelek di codebase kamu (yang sudah ada). Refactor pakai pattern 11.5. Compare quality.
11.4 — Test Coverage¶
Pilih function tanpa test. Generate test suite pakai pattern 11.6. Run di CI — semua pass?
11.5 — Tantangan: Code Review Bot¶
Build prompt untuk auto-review PR (pattern 11.7). Test di 5 PR baru-baru ini di repo kamu. Apakah review-nya useful?
Wajib Sertakan Konteks¶
- Bahasa & versi
- Framework & library
- Convention codebase
- Existing code yang relevan
Pattern Common¶
| Task | Pattern |
|---|---|
| Generate code | Spec lengkap + test cases |
| Debug error | Error + kode + konteks |
| Refactor | Current + reason + constraint |
| Test gen | Function + scenarios |
| Code review | Diff + checklist |
Pitfalls¶
- ❌ Hallucinated library — cek imports
- ❌ Outdated API — verify di docs
- ❌ Security issues — review user input
- ❌ Copy-paste blind — minta penjelasan
- ❌ Over-engineering — set constraint simple