Portal/Notes πŸ“
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 panic atau log.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 err tanpa 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 KEPUTUSAN

README 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 :8080

API

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 warning
Edit on GitHub

Last updated on

Take-Home Assignment Strategy | Faisal Affan