Lewati ke isi

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

Tulis function untuk validate email.

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
[SPEC] Function: hitung_diskon Input: - harga (float, > 0) - persen_diskon (float, 0-100) - max_diskon (float, optional)

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.

Output: function ready-to-merge dengan tests.

### Generate dari Existing Code
[CONTEKS] Saya punya function ini di Python:

{{ existing_code }}

[TASK] Tulis versi JavaScript-nya. Semantics sama persis. Pakai modern ES6+.

[CONSTRAINT] - camelCase - Pakai async/await jika ada async di Python - JSDoc untuk type

## 11.4. Pattern: Debugging

### Debug Error Message
[ERROR]
{{ paste full error & traceback }}

[KODE YANG ERROR]

{{ paste kode }}

[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.

Output: penjelasan + fix yang clear.

### Debug Behavior (Bukan Error)
[KODE]
{{ 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.

Output: 3 hipotesis terstruktur — kamu bisa investigasi sistematik.

## 11.5. Pattern: Refactoring
[CURRENT CODE]
{{ kode lama }}

[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.

## 11.6. Pattern: Test Generation
[FUNCTION TO TEST]
{{ function }}

[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__ - Comments untuk test yang tidak obvious - Group dengan class kalau cocok

Output: test suite yang kamu bisa langsung run.

## 11.7. Pattern: Code Review
[KODE PR]
{{ paste diff }}

[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.

Jelaskan kode di atas line-by-line. Asumsi saya tidak familiar dengan
[concept yang dipakai].

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

Anti-Pattern Prompt

"Tulis kode untuk X"  ← terlalu vague

Pattern Prompt

[KONTEKS] stack, convention, existing code
[TASK] spec + test cases
[CONSTRAINT] limit yang harus dipatuhi
[FORMAT] cara output

← Bab 10 Lanjut Bab 12 →

Diadaptasi dari modul "Coding with AI" dari Learn Prompting. Dilisensikan Apache 2.0.