03 — Prompt Engineering untuk Software Developer
Estimasi: 4 jam Tujuan: Praktik prompt engineering khusus konteks software development. Materi setara dengan modul Dicoding 16 jam (kita ringkas, kelas akan perdalam).
Pembukaan
Programmer modern wajib bisa pakai LLM untuk:
- Generate code
- Debug error
- Refactor
- Explain code
- Write tests
- Review code
Yang membedakan junior pakai AI dengan senior pakai AI: kualitas prompt + kemampuan verifikasi output.
Bagian 1 — Code Generation
Prompt yang Buruk
Bikinkan saya function untuk validasi email
Output mungkin:
- Pakai bahasa apa? Asumsi: Python (mungkin)
- Validasi seberapa ketat? Regex sederhana atau RFC compliant?
- Return apa? Bool atau exception?
- Library boleh? Atau pure?
Prompt yang Baik
Bikin function Python untuk validasi email.
Requirement:
- Input: string email
- Output: tuple (is_valid: bool, reason: str | None)
- Validasi: format dasar (local@domain.tld)
- Tanpa external library
- Pakai regex compiled
- Type hints lengkap
- Docstring dengan example
Test cases yang harus lulus:
- "user@example.com" → (True, None)
- "user@example" → (False, "missing TLD")
- "@example.com" → (False, "missing local part")
- "" → (False, "empty input")
Kasih juga example usage di akhir.
Output sekarang predictable.
Pattern Code Generation
[BAHASA & VERSI]
[FUNCTION/CLASS NAME]
[INPUT/OUTPUT SPEC]
[REQUIREMENTS]
[CONSTRAINTS]
[EXAMPLES atau TEST CASES]
[STYLE PREFERENCES]
Tips Pro
- Spesifikasi versi library — "pandas 2.x", "Python 3.11"
- Convention — "PEP 8", "Google docstring style"
- Edge cases — sebut yang harus di-handle
- Don'ts — list anti-pattern yang harus dihindari
Bagian 2 — Debugging
Anti-pattern
Gimana fix error ini?
[paste error]
Pro-pattern
Saya dapat error berikut saat menjalankan code Python:
[paste full traceback]
Code yang menyebabkan error:
```python
[paste relevant code]
Konteks:
- Python 3.11
- pandas 2.0
- Tujuan code: load CSV dan filter rows berdasarkan tanggal
- Sudah cek: file ada di folder yang benar
- Sebelumnya code ini jalan, mulai error setelah saya update pandas
Tolong:
- Identifikasi root cause
- Jelaskan kenapa terjadi
- Berikan fix
- Tips supaya tidak terjadi lagi
### Information yang Wajib Disertakan
1. **Error message lengkap + traceback**
2. **Code yang relevan** (bukan seluruh project)
3. **Versi tools** yang dipakai
4. **Apa yang sudah dicoba**
5. **Expected behavior**
---
## Bagian 3 — Refactoring
### Pattern
Refactor code berikut.
[paste code]
Tujuan refactor:
- Lebih readable
- Pakai pattern Pythonic (comprehension, etc.)
- Kurangi duplication
- Add type hints
- Better naming
Constraints:
- Tidak boleh ubah API public (function signature)
- Backward compatible
- Tidak boleh tambah dependency
Output: code refactored + changelog (apa yang berubah dan kenapa).
### Common Refactoring Asks
- "Convert to OOP"
- "Convert callbacks to async/await"
- "Pakai pattern builder"
- "Pisahkan concern (single responsibility)"
- "Extract function dari kode panjang"
---
## Bagian 4 — Code Explanation
Untuk mengerti code orang lain (open source, codebase baru di kerjaan).
### Pattern
Jelaskan code Python ini secara detail:
[paste code]
Berikan:
- High-level overview (1 paragraf)
- Walkthrough line-by-line untuk bagian non-obvious
- Pattern atau idiom Python yang dipakai
- Potential edge cases atau bugs
- Suggestion untuk improvement (kalau ada)
Audience: Python intermediate developer.
### Tips
- **Tentukan audience level** — beginner/intermediate/advanced
- **Minta analogi** untuk konsep abstract
- **Minta diagram** kalau perlu (bisa ASCII art atau Mermaid)
---
## Bagian 5 — Test Writing
### Generate Unit Tests
Bikin unit tests pytest untuk function berikut:
def calculate_tax(income: float, marital_status: str = "single") -> float:
if income < 0:
raise ValueError("Income cannot be negative")
if marital_status == "single":
if income <= 50_000:
return income * 0.10
else:
return income * 0.20
elif marital_status == "married":
if income <= 80_000:
return income * 0.08
else:
return income * 0.15
else:
raise ValueError(f"Unknown status: {marital_status}")
Coverage requirement:
- Happy path untuk single & married
- Boundary value (income = 50_000, 80_000)
- Edge cases (income = 0)
- Error cases (income < 0, invalid status)
- Use parametrize untuk efisiensi
Output: test file lengkap dengan import dan organization.
### Property-Based Testing
Bikin property-based tests pakai Hypothesis untuk function di atas. Tentukan invariants:
- Tax tidak boleh negatif
- Tax tidak boleh > income
- ...
---
## Bagian 6 — Code Review
LLM bisa jadi reviewer pertama sebelum tim humans.
### Pattern
Lakukan code review pada PR berikut:
[paste code]
Konteks:
- Project: web app e-commerce
- Author: junior dev (2 tahun pengalaman)
- Goal: function untuk apply diskon
Review:
- Correctness — bug atau logic error?
- Style — sesuai convention?
- Performance — bottleneck?
- Security — input validation, SQL injection, etc?
- Maintainability — readable, testable?
- Pythonic — pakai idiom yang tepat?
Untuk tiap finding:
- Severity (critical/major/minor/nit)
- Penjelasan
- Suggested fix
Output: list issues, sorted by severity.
### Checklist Self-Review (Sebelum Push)
Aku sering pakai prompt ini:
Review code saya. Hanya komentari yang penting (skip yang nit).
[paste]
Cek terutama:
- Off-by-one errors
- Null/empty handling
- Race conditions (kalau async)
- Resource leak (file/connection tidak di-close)
- Magic numbers
---
## Bagian 7 — Documentation
### Generate Docstring
Tambahkan docstring Google-style ke function ini:
[paste]
Include:
- One-line summary
- Args dengan tipe dan deskripsi
- Returns
- Raises
- Example usage
### README Generator
Bikin README.md untuk project Python berikut.
Struktur folder: [paste tree]
main.py: [paste]
Tujuan project: [...] Audience: developer yang mau pakai library ini
Format:
Title
Description
Installation
Usage (dengan example code)
API Reference
Contributing
License
---
## Bagian 8 — Migration & Modernization
### Migrasi Code Lama
Modernisasi code Python 2 ini ke Python 3.11:
[old code]
Update:
- print statement → function
- urllib2 → urllib3 atau requests
- dict.iteritems() → .items()
- xrange → range
- Tambah type hints
Tunjukkan diff format (- old, + new).
### Framework Migration
Convert code Flask ini ke FastAPI:
[Flask code]
Pertahankan logic. Pakai feature FastAPI yang relevan:
- Pydantic untuk validation
- Async kalau IO-bound
- Type hints
---
## Bagian 9 — Architecture & Design
### Design Discussion
Saya bikin sistem chat real-time. 100k concurrent users. User kirim message, semua user di room sama dapat update.
Stack saya saat ini:
- Backend: Python (FastAPI)
- DB: PostgreSQL
- Frontend: React
Pertanyaan:
- Pakai apa untuk real-time? WebSocket vs SSE vs polling?
- Bagaimana scale untuk 100k concurrent?
- Apakah perlu message queue (Redis pub/sub, RabbitMQ)?
- Apa concerns architect saya yang mungkin saya lewatkan?
Berikan rekomendasi dengan reasoning + alternative dengan tradeoff.
### LLM sebagai Sparring Partner
LLM TIDAK pengganti senior architect. Tapi bisa:
- Brainstorm partner
- Cek blind spot
- Explore tradeoff
**Selalu validate** dengan riset + experiment + senior input.
---
## Bagian 10 — AI-Assisted Development Workflow
Cara pro pakai AI di daily coding:
### 1. Top-Down
Step 1: Sketsa solution dengan AI (high-level design) Step 2: Write tests dulu (TDD style) — bisa dengan AI Step 3: Implement function-by-function — AI assist Step 4: Review semua dengan AI Step 5: Refactor & polish
### 2. Pair Programming
VS Code + GitHub Copilot atau Cursor:
- AI suggest as you type
- Tab to accept
- Iterate naturally
### 3. AI sebagai Rubber Duck
Stuck? Jelaskan masalah ke AI seakan ke kolega:
- Sering, jawaban muncul saat kamu menjelaskan ("rubber duck debugging")
- AI kadang kasih perspektif baru
### 4. Gunakan AI untuk Boring Stuff
- Generate boilerplate (CRUD)
- Convert format (CSV ↔ JSON ↔ XML)
- Write regex
- SQL query yang ribet
- Convert language A ke B
---
## Bagian 11 — Limitasi yang Harus Diingat
### LLM Tidak Selalu Benar
Kasus nyata:
1. **Outdated info** — kalau library/framework update setelah cutoff
2. **Imaginary functions** — nyebut function yang tidak ada di library
3. **Wrong syntax** — sintaks 2 versi berbeda dicampur
4. **Not actually testing** — kasih test yang lulus tapi tidak meaningful
### Workflow Defensive
1. **Selalu test** code generated, jangan trust buta
2. **Cek dokumentasi resmi** untuk library penting
3. **Run actual tests** — pytest, mypy, lint
4. **Code review** sendiri sebelum commit
5. **Kalau output panjang**, baca dengan teliti, kadang ada placeholder TODO
### Cost Awareness
- API call ada biaya per token
- Untuk task simple, model kecil/cepat (Haiku, Flash, GPT-mini) cukup
- Untuk task kompleks, baru model besar
- Cache hasil yang tidak perlu re-generate
---
## Cek Pemahaman
- [ ] Bisa nulis prompt code generation yang spesifik?
- [ ] Tahu informasi wajib saat tanya debug?
- [ ] Bisa minta refactor dengan constraint jelas?
- [ ] Bisa generate unit test dengan coverage requirement?
- [ ] Bisa pakai LLM untuk code review?
- [ ] Tahu kapan TIDAK trust LLM?
---
## Challenge 3.3
### Challenge 1 — Bug Squashing
Cari 3 bug Python di internet (Stack Overflow, Reddit, GitHub issue). Untuk setiap:
1. Reproduce di laptopmu
2. Tulis prompt debugging dengan format pro
3. Apply fix yang disarankan AI
4. Verifikasi
5. Catat: berapa attempt sampai dapat fix yang benar?
### Challenge 2 — Refactor Marathon
Ambil 1 mini project Fase 2 kamu yang masih jelek. Lakukan refactor session bareng AI:
1. Minta AI identify 5 hal yang bisa di-improve
2. Refactor satu per satu
3. Untuk tiap refactor, tanya AI verifikasi
4. Run tests setelah tiap perubahan
Bandingkan code awal vs akhir. Tulis di jurnal.
### Challenge 3 — Test Coverage
Untuk salah satu function di project kamu:
1. Tulis spec lengkap (input, output, edge cases)
2. Minta AI generate pytest tests
3. Run tests
4. Cek coverage (`pytest --cov`)
5. Tambahkan test untuk yang missing
Target: 90%+ coverage.
### Challenge 4 — Algorithm Generation
Pakai LLM untuk generate solusi 5 problem dari LeetCode (Easy):
1. Tulis problem statement ke LLM
2. Minta solusi dengan complexity analysis
3. Run di LeetCode
4. Kalau gagal, debug bareng LLM
5. Pelajari pattern yang dipakai
### Challenge 5 — Design Discussion
Pilih problem yang menantang:
- "Bikin URL shortener seperti bit.ly"
- "Bikin sistem rate limiting"
- "Bikin notification system"
Diskusi dengan AI:
1. Architecture overview
2. Data model
3. API design
4. Scaling considerations
5. Pitfalls
Catat insight dalam blog/jurnal.
### Challenge 6 — Code Documentation
Ambil 1 file Python kamu yang minim dokumentasi. Pakai AI untuk:
1. Generate docstring untuk semua function
2. Generate README
3. Bikin diagram (ASCII atau Mermaid) untuk flow utama
4. Bikin example usage
### Challenge 7 — Build Coding Prompt Library
Tambah ke `prompts/` folder kamu:
prompts/coding/ ├── debug-template.md ├── refactor-template.md ├── code-review-template.md ├── test-generator.md ├── docstring-generator.md └── architecture-discussion.md
Tiap template: contoh penggunaan + tips.
### Challenge 8 — Compare AI Tools
Test 3 AI coding tools:
- Claude (chat)
- ChatGPT
- GitHub Copilot di VS Code
Lakukan task yang sama di ketiganya:
- Generate function
- Debug code
- Refactor
Mana yang paling sesuai untuk kamu? Tulis di jurnal.
---
**Selanjutnya:** [04-linear-algebra.md](04-linear-algebra.md) — math intuition mulai dari aljabar linear. Fondasi semua deep learning.