Interview prep
Take-Home Assignment Strategy
Strategi mengerjakan take-home assignment: struktur project, checklist penilaian, dokumentasi keputusan teknis, dan cara presentasi hasil.
Take-Home Assignment
Format Umum
- Durasi: 3-7 hari
- Scope: API + database schema + tests + README
- Ekspektasi: Production-quality code dalam skala kecil
Yang Bikin Lolos vs Gak Lolos
Bikin Lolos
- README yang jelas: cara run, tech decision, trade-off
- Tests buat happy path + edge case
- Error handling yang proper (bukan cuma
panicataulog.Fatal) - Code structure yang clean (bukan semua di
main.go) - Database migration (bukan auto-migrate)
- Logging + tracing (walaupun sederhana)
Bikin Gagal
- Gak ada README atau README cuma 2 baris
- Gak ada tests ("saya gak sempat nulis test")
- Error handling cuma
return errtanpa context - Hardcode config (DB URL, port, secret)
- Commit message "fix", "update", "wip"
Struktur Project Go yang Direkomendasikan
project/
βββ cmd/
β βββ server/
β βββ main.go # entry point, wiring dependencies
βββ internal/
β βββ handler/ # HTTP handlers (thin layer)
β β βββ payment.go
β β βββ payment_test.go
β βββ service/ # business logic
β β βββ payment.go
β β βββ payment_test.go
β βββ repository/ # data access
β β βββ payment.go
β β βββ payment_test.go
β βββ model/ # domain types
β β βββ payment.go
β βββ middleware/ # auth, logging, rate limit
β βββ ratelimit.go
βββ migrations/ # database migrations
β βββ 001_create_payments.sql
βββ docker-compose.yml # infra dependencies
βββ Makefile # run, test, migrate
βββ README.md # DOCUMENTASI KEPUTUSANREADME Template
# Payment Service β Take-Home Assignment
## Cara Run
```bash
docker-compose up -d # Start PostgreSQL + Redis
make migrate # Run database migrations
make run # Start server on :8080API
POST /api/v1/payments β Create payment GET /api/v1/payments/:id β Get payment status
Technical Decisions
Kenapa PostgreSQL bukan MySQL?
PostgreSQL punya advisory lock + SKIP LOCKED untuk queue processing. Ini kritis buat mencegah double-processing payment.
Kenapa Redis buat idempotency key?
TTL built-in, atomic SET NX, dan latency <1ms. Database bisa, tapi Redis lebih cocok buat caching short-lived state.
Kenapa structured logging (slog)?
Debug payment issue butuh tracing. Slog structured + context propagation lebih gampang di-debug dibanding fmt.Println.
Trade-offs
- Saat ini idempotency key disimpan di Redis (bukan DB). Pros: fast. Cons: kalau Redis down, idempotency check gagal.
- Solusi: fallback ke database query untuk idempotency check kalau Redis unreachable.
Kalau Ada Waktu Lebih
- Circuit breaker untuk downstream service
- Retry dengan exponential backoff
- Metrics + Prometheus endpoint
- Graceful shutdown dengan drain in-flight requests
## Checklist Sebelum Submit
- [ ] `docker-compose up` langsung jalan tanpa error
- [ ] README jelas, ada trade-off discussion
- [ ] Ada unit test + integration test
- [ ] Error message informatif (bukan "an error occurred")
- [ ] Config via environment variable, bukan hardcode
- [ ] Database migration, bukan auto-migrate
- [ ] Health check endpoint (`/health`)
- [ ] `.gitignore` β gak commit binary, `.env`, IDE files
- [ ] Commit history bersih (squash sebelum submit)
- [ ] Run `go vet` dan `golangci-lint` β zero warningEdit on GitHub
Last updated on