Go dari Nol sampai Enterprise
Dari go run pertama sampai website yang melayani banyak orang di produksi โ dengan
arsitektur yang masih bisa dipahami setelah dua tahun, keamanan yang tidak bocor, query yang tidak
menghabiskan database, dan deploy tanpa jeda.
Tiga hal yang sering dicari duluan tapi jarang dibahas tuntas dibahas penuh di sini: alur lengkap satu request dari CDN sampai baris database, keamanan sistemnya, dan bagaimana persisnya semua ini di-deploy di AWS.
- Durasi
- ~19 minggu
- Beban
- ~8 jam/minggu
- Prasyarat
- Pernah ngoding, paham HTTP
- Target akhir
- Website enterprise di AWS
Untuk siapa roadmap ini
"Dari nol" di sini berarti nol Go, bukan nol pemrograman. Kamu diasumsikan sudah pernah menulis kode di bahasa apa pun dan paham dasar HTTP. Sintaks Go dibahas ringkas di Fase 0 dan 1 โ cukup untuk membaca seluruh kode di roadmap ini, tanpa berpura-pura ini kursus pemrograman dasar.
Kalau kamu belum pernah ngoding sama sekali, mulai dari Python Dasar untuk Pemula dulu. Konsepnya โ variabel, percabangan, fungsi, struktur data โ sama di semua bahasa, dan jauh lebih mudah dipelajari tanpa urusan tipe dan concurrency di atasnya.
Versi acuan: Go 1.26 (rilis Februari 2026). Beberapa hal yang dipakai di roadmap ini baru
ada di rilis-rilis terakhir dan mengubah cara kode ditulis: routing bawaan ServeMux
(1.22), variabel loop per iterasi (1.22), direktif tool di go.mod (1.24),
GOMAXPROCS yang sadar container dan testing/synctest (1.25), serta
go fix sebagai pemodernisasi kode dan Green Tea GC (1.26). Kalau sebuah tutorial
menyuruhmu memasang router pihak ketiga hanya untuk mencocokkan metode HTTP, tutorial itu ditulis
sebelum 2024.
Yang sengaja dilewati
| Topik | Alasan |
|---|---|
| Pemrograman dari nol | Diasumsikan bisa ngoding; Fase 0โ1 memetakan yang berbeda di Go |
GOPATH dan pola sebelum Go Modules | Tidak berlaku sejak 2018; hanya menyesatkan |
| Terraform & CDK | Konsep AWS-nya yang diajarkan; alat IaC bisa menyusul |
| Kubernetes | ECS Fargate cukup, dan jauh lebih sedikit yang harus dioperasikan |
| Microservice sebagai titik awal | Dibahas kenapa biasanya bukan jawabannya di Fase 11 |
| SPA React/Vue mendalam | Dibahas kapan memilihnya; fokusnya sisi Go |
| Framework berbasis refleksi berat | Bertentangan dengan alasan memilih Go |
Bentuk roadmap ini
| Bagian | Fase | Menjawab |
|---|---|---|
| Bahasanya | 0 โ 2 | Cara Go mengungkapkan hal yang sudah kamu tahu โ termasuk concurrency |
| Alur satu request | 3 โ 4 | Dari klien menekan Enter sampai baris database kembali |
| Cara menulis aplikasi nyata | 5 โ 8 | Arsitektur, keamanan, framework, dan bukti bahwa semuanya masih benar |
| Menjalankannya untuk orang lain | 9 โ 11 | Performa, AWS, dan bertahan bertahun-tahun |
Urutannya disengaja. Fase 10 adalah bagian yang paling sering dicari duluan โ tapi deploy ke AWS tanpa tes hanya mempercepat penyebaran bug, dan menambah container di atas query N+1 hanya memindahkan masalah ke database. Jangan lompat ke Fase 10.
Fondasi Go & Tooling
Tujuan: punya proyek Go yang berjalan, bisa membaca kode Go tanpa tersandung sintaks, dan
paham kenapa hasil go build cuma satu berkas.
Setup sekali jalan
rm -rf /usr/local/go
curl -fsSLO https://go.dev/dl/go1.26.5.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.26.5.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
mkdir toko && cd toko
go mod init contoh.com/toko
go run .
Empat hal yang harus benar sejak hari pertama
| Hal | Kenapa |
|---|---|
Format on save lewat gopls | Setelah itu format kode tidak pernah jadi bahan review lagi |
Semua kode aplikasi di internal/ | Satu-satunya batas modul yang ditegakkan compiler |
go.mod dan go.sum di-commit | go.mod adalah berkas lock-nya |
go vet ./... masuk kebiasaan | Ia menangkap yang lolos compiler, dan sudah ikut di go test |
Materi
-
Memasang Go & program pertamaResmiSatu toolchain, satu binari, tanpa manajer versi. Termasuk kenapa
go rundango buildmenghasilkan hal yang berbeda.go.devBaca rangkuman โ -
Sintaks Go untuk pendatangResmiPeta cepat sintaks Go untuk yang sudah bisa ngoding di bahasa lain โ termasuk lima hal yang bikin pendatang tersandung di jam pertama.go.devBaca rangkuman โ
-
Go Modules โ dependensi & versiResmi
go.mod,go.sum, dan pemilihan versi yang bekerja berbeda dari npm maupun Composer โ dengan akibat yang bagus untuk kamu.go.devBaca rangkuman โ -
Perkakas bawaan: fmt, vet, test, fixResmiFormatter, linter, test runner, dan pemodernisasi kode โ semuanya sudah terpasang. Tidak ada yang perlu dipilih atau diperdebatkan.pkg.go.devBaca rangkuman โ
-
Struktur proyek & paketResmi
cmd/,internal/, dan aturan paket yang dipaksa compiler โ plus kenapa "golang-standards/project-layout" bukan standar.go.devBaca rangkuman โ -
Slice, map, string, dan nilai nolResmiStruktur data yang dipakai di setiap berkas Go โ beserta dua perilaku slice yang menghasilkan bug diam-diam.go.devBaca rangkuman โ
Kamu punya modul Go dengan cmd/ dan internal/, bisa menjelaskan apa yang
dilakukan Minimal Version Selection, dan bisa membangun binari Linux dari laptopmu tanpa
memasang apa pun yang berbau Linux.
Tipe, Interface & Error
Tujuan: bisa merancang tipe dan interface secara idiomatik โ dan menulis penanganan error yang tidak kehilangan konteks maupun membocorkan detail internal.
Fase ini yang membuat sisa roadmap masuk akal. Interface implisit menjelaskan kenapa arah ketergantungan di Go bisa dibalik tanpa framework apa pun. Error sebagai nilai menjelaskan kenapa setiap jalur kegagalan terlihat di kode. Dan keduanya adalah fondasi dari arsitektur di Fase 5 dan tes di Fase 8.
Satu aturan yang menghapus banyak kebingungan: deklarasikan interface di paket yang memakainya, bukan di paket yang mengimplementasikannya โ dan isi hanya dengan method yang benar-benar dipanggil. Pola ini yang membuat paket domainmu tidak perlu tahu apa itu database.
Peta keputusan
| Kebutuhan | Pakai | Kenapa |
|---|---|---|
| Method mengubah isi | Receiver pointer *T | Receiver nilai menerima salinan |
| Perilaku berbeda per tipe | Interface | Polimorfisme Go datang dari sini |
| Algoritma sama, tipe data berbeda | Generic | Tanpa kehilangan pemeriksaan compiler |
| Kegagalan yang diperkirakan | error | Input pengguna salah bukan alasan panic |
| Bug programmer saat startup | panic | Lebih baik mati sekarang daripada salah melayani |
| Uang | int64 satuan terkecil | Jangan pernah float |
Materi
-
Struct, method & receiverResmiGo tidak punya kelas. Yang ada struct, method, dan satu keputusan yang muncul di setiap method: receiver nilai atau pointer.go.devBaca rangkuman โ
-
Interface โ kontrak yang implisitResmiTidak ada kata
implements. Tipe memenuhi interface hanya dengan punya method-nya โ dan itu mengubah arah ketergantungan seluruh aplikasimu.go.devBaca rangkuman โ -
Error sebagai nilaiResmi
if err != nilyang terkenal itu โ dan cara membungkus, memeriksa, serta memetakan error jadi respons HTTP tanpa kehilangan konteks.go.devBaca rangkuman โ -
panic, recover & deferResmiPanic bukan exception, dan
recoverbukancatch. Kapan keduanya sah dipakai โ dan kenapa satu handler HTTP wajib memakainya.go.devBaca rangkuman โ -
Generic โ dan kapan sebaiknya tidakResmiParameter tipe sejak Go 1.18: sintaksnya, batasan tipenya, dan tiga tanda bahwa kamu sedang memakainya untuk hal yang salah.go.devBaca rangkuman โ
-
encoding/json & struct tagResmiBentuk JSON API-mu ditentukan struct tag โ beserta tiga perilaku default yang mengejutkan dan satu risiko keamanan.pkg.go.devBaca rangkuman โ
-
Penamaan, komentar & API yang enak dipakaiResmiKonvensi yang membuat kode Go dari tim mana pun terasa sama โ dan aturan komentar yang langsung jadi dokumentasi.go.devBaca rangkuman โ
Kamu punya paket domain dengan error sentinel yang dibungkus %w di setiap lapisan dan
dipetakan jadi status HTTP di satu tempat, dan kamu bisa menjelaskan kenapa interface yang berisi
pointer nil tidak sama dengan nil.
Concurrency
Tujuan: bisa memakai concurrency saat ia benar-benar membantu โ dan tahu persis kapan sebuah goroutine akan berhenti.
Yang perlu diluruskan lebih dulu: di aplikasi web, sebagian besar kodemu tidak
perlu menulis concurrency sama sekali. net/http sudah menjalankan tiap permintaan di
goroutine sendiri, dan pool database sudah aman dipakai bersamaan. Goroutine eksplisit dibutuhkan
untuk dua hal: memanggil beberapa layanan sekaligus di dalam satu permintaan, dan pekerjaan latar.
Aturan yang menghindarkan hampir semua bug concurrency
- Setiap goroutine punya pemilik yang tahu kapan ia berhenti โ lewat
WaitGroup,errgroup, atau context. - Setiap goroutine berumur panjang punya
recoversendiri. Satu panic di sana mematikan seluruh container. - Hampir setiap
selectpunyacase <-ctx.Done(). - Batasi jumlahnya. "Satu goroutine per item" pada sejuta item akan menjatuhkan database duluan.
go test -racedi CI. Setiap laporan race adalah bug nyata.
Materi
-
Goroutine โ concurrency yang murahResmiSatu kata kunci menjalankan fungsi secara bersamaan. Yang tidak diceritakan brosur: siapa yang menghentikannya, dan ke mana errornya pergi.go.devBaca rangkuman โ
-
Channel & selectResmiCara goroutine berbicara: antrean bertipe dengan aturan blokir yang ketat โ dan aturan siapa yang boleh menutupnya.go.devBaca rangkuman โ
-
Mutex, atomic & syncResmiMelindungi keadaan bersama tanpa channel โ
Mutex,RWMutex,Once, dan aturan yang membuat lock benar-benar bekerja.pkg.go.devBaca rangkuman โ -
Context โ pembatalan & tenggatResmiSatu nilai yang dibawa lewat seluruh call stack โ membawa tenggat, pembatalan, dan sedikit data permintaan. Ini tulang punggung setiap aplikasi Go yang serius.pkg.go.devBaca rangkuman โ
-
Data race & detektornyaResmiBug yang muncul satu kali dari sepuluh ribu permintaan โ dan satu flag yang menemukannya sebelum sampai produksi.go.devBaca rangkuman โ
-
errgroup & pola concurrency praktisResmiPola yang benar-benar dipakai di aplikasi web: fan-out panggilan, batas paralelisme, timeout, dan penggabungan permintaan kembar.pkg.go.devBaca rangkuman โ
Kamu bisa menulis fan-out ke tiga layanan dengan errgroup berikut batas paralelismenya,
suite tesmu berjalan bersih dengan -race, dan kamu bisa menunjukkan kebocoran goroutine
lewat profil pprof.
HTTP โ Request sampai Response
Tujuan: punya server HTTP yang layak produksi, dan bisa menggambar sendiri seluruh jalur satu permintaan dari load balancer sampai handler.
Bentuk yang akan kamu tulis berulang kali
mux.HandleFunc("GET /produk/{id}", h.AmbilProduk)
func (h *Handler) AmbilProduk(w http.ResponseWriter, r *http.Request) {
id, err := strconv.ParseInt(r.PathValue("id"), 10, 64)
if err != nil {
h.tulisError(w, r, ErrIDTidakValid)
return
}
p, err := h.produk.Ambil(r.Context(), id) // ctx diteruskan ke bawah
if err != nil {
h.tulisError(w, r, err) // errors.Is memetakan ke status
return
}
h.tulisJSON(w, http.StatusOK, keProdukResp(p))
}
Satu baris yang tidak boleh sampai produksi: http.ListenAndServe(":8080", mux).
Ia memakai server tanpa satu pun timeout, sehingga klien yang membuka koneksi lalu diam bisa menahan
goroutine selamanya. Sepuluh ribu koneksi seperti itu โ mudah dibuat siapa saja dari satu laptop โ
cukup untuk menjatuhkan servermu.
Empat lapis yang harus kamu bedakan
| Lapis | Tugasnya | Bukan tugasnya |
|---|---|---|
| Middleware | Syarat yang berlaku untuk sekelompok rute | Logika bisnis |
| Handler | Menerjemahkan HTTP ke domain dan sebaliknya | Query, aturan bisnis |
| Service | Aturan bisnis, transaksi, cache | Tahu apa itu status HTTP |
| Repository | Bicara ke database | Memutuskan aturan bisnis |
Materi
-
Server HTTP dari pustaka standarResmiServer produksi dalam sepuluh baris โ dan kenapa di Go pustaka standar sudah cukup untuk hal yang di bahasa lain butuh framework.pkg.go.devBaca rangkuman โ
-
Routing dengan ServeMuxResmiSejak Go 1.22, router bawaan mengerti metode dan parameter jalur โ dan itu menghapus alasan utama memakai framework.pkg.go.devBaca rangkuman โ
-
Handler & middlewareResmiSatu interface satu method yang menopang seluruh ekosistem web Go โ dan pola pembungkus yang menggantikan seluruh sistem middleware framework.pkg.go.devBaca rangkuman โ
-
Anatomi satu request โ dari klien sampai baris databaseResmiPeta lengkap satu permintaan HTTP: CDN, load balancer, goroutine, middleware, handler, service, connection pool, sampai baris database โ dan kembali.pkg.go.devBaca rangkuman โ
-
Timeout & batas serverResmiLima field yang membedakan server contoh dari server produksi โ dan serangan sederhana yang bisa menjatuhkan server tanpa timeout.pkg.go.devBaca rangkuman โ
-
HTTP client โ timeout, retry & poolResmiMemanggil layanan lain tanpa membuat aplikasimu ikut mati saat mereka lambat โ termasuk satu default yang harus selalu kamu ubah.pkg.go.devBaca rangkuman โ
-
Graceful shutdownResmiDeploy tanpa satu pun permintaan yang terpotong โ urutan yang benar antara sinyal, load balancer, dan pekerjaan latar.pkg.go.devBaca rangkuman โ
-
html/template โ HTML yang aman secara defaultResmiTemplate server-side dengan escaping yang sadar konteks โ pertahanan XSS yang bekerja tanpa kamu memikirkannya.pkg.go.devBaca rangkuman โ
Servermu punya kelima timeout, rantai middleware dengan pemulih panic dan request_id,
graceful shutdown yang tidak memotong permintaan berjalan, dan kamu bisa menggambar peta lengkap satu
request dari CDN sampai baris database beserta anggaran waktunya.
Database & Persistensi
Tujuan: bisa menulis lapisan data yang aman, cepat, dan tidak menghabiskan koneksi โ serta mengubah skema di tabel yang sedang dipakai tanpa jeda.
Dua baris yang paling sering hilang, dan paling mahal akibatnya:
defer rows.Close() // tanpa ini, koneksi tidak pernah kembali
// โ seluruh aplikasi membeku setelah N permintaan
if err := rows.Err(); err != nil { // tanpa ini, kegagalan di tengah pembacaan
return nil, err // terlihat seperti "hasilnya memang segitu"
}
Peta keputusan
| Kebutuhan | Pakai | Kenapa |
|---|---|---|
| Aplikasi baru, sudah pasti Postgres | pgx + sqlc | SQL tetap terlihat, tipenya dijaga compiler |
| Panel admin, CRUD membosankan | GORM | Kecepatan menulis lebih berharga di sana |
| Perubahan skema | Berkas migrasi | AutoMigrate tidak layak produksi |
| Memuat ribuan baris | CopyFrom | Satu aliran, bukan ribuan perjalanan jaringan |
| Cek "sudah ada?" sebelum simpan | Unique constraint + kode 23505 | Pemeriksaan terpisah selalu mengandung balapan |
| Paginasi API | Keyset, bukan OFFSET | Biayanya tetap sedalam apa pun halamannya |
Materi
-
database/sql โ pola dasarResmiAntarmuka database bawaan Go: query, scan, null, dan tiga kesalahan yang membuat aplikasi berhenti melayani.pkg.go.devBaca rangkuman โ
-
Connection pool โ angka yang menentukan skalaResmiEmpat setelan yang menentukan apakah aplikasimu bertahan saat trafik naik โ dan aritmetika sederhana yang menghubungkannya dengan RDS.pkg.go.devBaca rangkuman โ
-
Transaksi & konsistensiResmiPola
defer tx.Rollback(), tingkat isolasi yang benar-benar berbeda, dan cara menghindari deadlock di dua tabel.pkg.go.devBaca rangkuman โ -
pgx โ driver Postgres yang layak dipakaiResmiDriver Postgres paling matang di Go, dengan dua mode pemakaian โ dan alasan memilih salah satunya sejak awal.pkg.go.devBaca rangkuman โ
-
sqlc โ SQL jadi kode bertipeResmiTulis SQL, dapatkan fungsi Go bertipe. Kesalahan kueri jadi error kompilasi, bukan panic saat runtime.docs.sqlc.devBaca rangkuman โ
-
Migrasi skemaResmiPerubahan skema sebagai berkas berurutan โ dan aturan yang membuat deploy tanpa jeda tetap mungkin saat tabelnya punya jutaan baris.pkg.go.devBaca rangkuman โ
-
GORM โ dan kapan ORM masuk akalResmiORM paling populer di Go: apa yang dipercepatnya, apa yang disembunyikannya, dan tiga jebakan performa yang khas.gorm.ioBaca rangkuman โ
-
Index, EXPLAIN & kueri yang lambatResmiMembaca rencana kueri, memilih urutan kolom index, dan mengubah pencarian yang memindai jutaan baris jadi milidetik.www.postgresql.orgBaca rangkuman โ
Halaman daftarmu menjalankan jumlah kueri yang tetap berapa pun jumlah barisnya,
MaxOpenConns-mu dihitung dari kapasitas database untuk jumlah task maksimum, dan kamu bisa
menulis rencana tiga-deploy untuk mengganti nama kolom di tabel yang sedang dipakai.
Arsitektur Aplikasi
Tujuan: tahu ke mana sebuah kode seharusnya diletakkan โ dan bisa memindahkan pekerjaan berat keluar dari siklus permintaan pengguna tanpa kehilangan pekerjaannya saat deploy.
Arah panah
cmd/server/main.go โ merakit semuanya (satu-satunya yang tahu segalanya)
โ
โผ
internal/http โ transport: parse, validasi bentuk, tulis respons
โ
โผ
internal/produk โ DOMAIN: tipe, aturan, interface penyimpanan
โฒ TIDAK tahu apa itu HTTP maupun SQL
โ
internal/produk/postgres โ infrastruktur: memenuhi interface domain
Uji satu kalimat yang menentukan apakah lapisanmu benar: buka blok import di
paket domainmu. Kalau ada net/http atau database/sql di sana, lapisannya
sudah bocor. Dan go list -deps plus linter depguard bisa menjadikan aturan
ini kegagalan CI, bukan sekadar kesepakatan.
Yang tidak boleh jadi variabel global
| Dependensi | Kalau global |
|---|---|
*sql.DB / pool | Tidak bisa diganti di tes; tidak ada tempat untuk Close() |
| Logger | Tidak bisa menangkap keluaran di tes |
| Konfigurasi | Kesalahan konfigurasi jadi crash di init() tanpa konteks |
time.Now | "Kedaluwarsa setelah 30 hari" jadi tidak bisa diuji |
| Klien HTTP | Tidak bisa diarahkan ke httptest.Server |
Materi
-
Lapisan & arah ketergantunganResmiHandler, service, repository โ dan satu aturan arah panah yang membuat aplikasi tetap bisa diubah setelah dua tahun.go.devBaca rangkuman โ
-
Dependency injection tanpa frameworkResmiKonstruktor eksplisit, satu titik perakitan di
main, dan kenapa Go jarang butuh container DI.go.devBaca rangkuman โ -
Konfigurasi & rahasiaResmiBaca environment sekali, validasi di awal, dan pastikan container mati saat konfigurasinya salah โ bukan melayani setengah benar.pkg.go.devBaca rangkuman โ
-
log/slog โ log terstrukturResmiLogger terstruktur bawaan Go sejak 1.21 โ dan cara membuat setiap baris log bisa dihubungkan ke satu permintaan.pkg.go.devBaca rangkuman โ
-
Pekerjaan latar & antreanResmiMemindahkan pekerjaan berat keluar dari permintaan pengguna โ dengan jaminan bahwa pekerjaan itu tidak hilang saat container restart.pkg.go.devBaca rangkuman โ
-
main.go โ merakit seluruh aplikasiResmiSatu berkas yang menyatukan semuanya: konfigurasi, logger, database, service, server, dan penutupan yang rapi โ dalam urutan yang benar.pkg.go.devBaca rangkuman โ
Nol variabel global yang bisa berubah, seluruh log membawa request_id yang sama dalam
satu permintaan, pekerjaan berat sudah pindah ke antrean yang bertahan melewati restart, dan setiap
job-mu aman kalau dijalankan dua kali.
Keamanan
Tujuan: aturan "siapa boleh menyentuh apa" tinggal di satu tempat dan tidak bisa dilewati โ termasuk oleh orang yang mengetik ID orang lain di URL.
Pertahanan berlapis, dari yang paling lemah
| Lapisan | Cukup sendirian? |
|---|---|
| Menyembunyikan tombol di UI | Tidak โ cuma urusan tampilan |
| Middleware per grup rute | Untuk peran, ya. Untuk objek, tidak |
| Pemeriksaan kebijakan di service | Ya, kalau tidak ada jalur yang melewatinya |
| Kueri dibatasi kepemilikan | Terkuat โ yang bukan miliknya tidak pernah ditemukan |
Yang paling sering bocor bukan autentikasi, melainkan otorisasi objek.
/api/faktur/1002 yang menampilkan faktur milik orang lain, endpoint daftar yang
lupa WHERE pengguna_id padahal endpoint detailnya sudah aman, atau kunci cache tanpa ID
pengguna. Kelas bug ini tidak akan ditemukan tes yang cuma menguji jalur bahagia โ ia butuh tes dari
kedua sisi.
Yang wajib dibatasi lajunya
| Endpoint | Saran | Kunci |
|---|---|---|
| Login | 5 / menit | email + IP |
| Lupa sandi, pendaftaran | 3 / menit | IP |
| Kirim OTP / SMS | 3 / jam | nomor telepon โ ini biaya langsung |
| Pencarian | 30 / menit | pengguna atau IP |
| API publik | 60 / menit | kunci API |
Materi
-
Validasi input โ gerbang data tidak tepercayaResmiSetiap byte dari luar adalah data tidak tepercaya โ termasuk header, parameter jalur, dan respons API pihak ketiga.pkg.go.devBaca rangkuman โ
-
Hashing sandiResmibcrypt atau Argon2id, biaya yang tepat, dan kesalahan pembandingan yang membocorkan apakah sebuah email terdaftar.pkg.go.devBaca rangkuman โ
-
Sesi & cookieResmiEmpat atribut cookie yang menentukan aman atau tidaknya sesi โ dan kenapa sesi di sisi server tetap pilihan default yang baik.pkg.go.devBaca rangkuman โ
-
JWT โ kapan dipakai, kapan tidakResmiToken yang bisa diverifikasi tanpa database โ beserta harga yang jarang disebut: ia tidak bisa dicabut.datatracker.ietf.orgBaca rangkuman โ
-
Otorisasi โ siapa boleh apaArtikelKerentanan yang paling sering ditemukan di aplikasi web nyata bukan autentikasi, melainkan otorisasi objek โ dan obatnya ada di kueri.cheatsheetseries.owasp.orgBaca rangkuman โ
-
CSRF, XSS & header keamananArtikelTiga serangan lewat browser dan pertahanan berlapis yang sebagian besar berupa header โ beberapa baris middleware.cheatsheetseries.owasp.orgBaca rangkuman โ
-
Rate limitingResmiMembatasi laju permintaan per IP, per pengguna, atau per apa pun โ pertahanan pertama terhadap penyalahgunaan dan tagihan tak terduga.pkg.go.devBaca rangkuman โ
-
TLS, enkripsi & rahasiaResmiKapan hash, kapan enkripsi, kapan tanda tangan โ dan cara menyimpan data sensitif supaya kunci bisa diputar.pkg.go.devBaca rangkuman โ
Setiap sumber daya punya kebijakan dengan tes dari kedua sisi, endpoint daftar terbukti tidak bocor
antar pengguna, rute login dibatasi lajunya, header keamanan terpasang, dan kamu bisa menjelaskan
kenapa endpoint webhook-mu memakai hmac.Equal alih-alih ==.
Framework Web & Frontend
Tujuan: bisa memilih framework โ atau memilih tidak memakainya โ dengan alasan yang bisa dijelaskan, dan tahu bentuk frontend apa yang cocok untuk aplikasimu.
Di Go, pertanyaannya berbalik dari ekosistem lain. Pustaka standar sudah menutup routing,
middleware, template, klien HTTP, dan testing โ jadi yang ditanyakan bukan "framework mana", melainkan
"apa yang belum ada, dan apakah aku memerlukannya". Semua framework Go berdiri di atas
http.Handler yang sama, jadi berpindah bukan penulisan ulang.
Memilih pendekatan frontend
| html/template | templ + htmx | SPA + API JSON | |
|---|---|---|---|
| Kesalahan template ketahuan saat | Runtime | Kompilasi | โ |
| Interaksi | Muat ulang halaman | Ganti sebagian halaman | State di klien |
| Bisa di-cache penuh di CDN | Ya | Halaman ya, fragmen tidak | Tidak |
| SEO | Bawaan | Bawaan | Perlu SSR |
| Paling cocok untuk | Halaman baca publik | Panel admin, form, filter | Antarmuka kaya, mobile |
Tidak perlu memilih satu untuk seluruh aplikasi. Pola paling sehat untuk situs bertrafik baca tinggi: halaman publik dirender server dan disajikan penuh dari CloudFront, dengan htmx hanya di bagian yang memang interaktif โ pencarian, filter, komentar. Panel admin boleh jadi SPA penuh; ia dipakai sedikit orang dan tidak perlu di-cache.
Materi
-
Butuh framework, atau tidak?ResmiGo 1.22 memindahkan routing ke pustaka standar. Materi ini memetakan apa yang masih kurang โ dan siapa yang benar-benar membutuhkannya.go.devBaca rangkuman โ
-
chi โ router yang tetap net/httpResmiGrup rute dan middleware bersarang, dengan tipe pustaka standar yang sama persis. Rekomendasi default roadmap ini.pkg.go.devBaca rangkuman โ
-
Echo โ bind, validasi & error terpusatResmiFramework menengah dengan pengikatan permintaan dan penanganan error di satu tempat โ pilihan wajar untuk API dengan banyak endpoint.echo.labstack.comBaca rangkuman โ
-
Gin โ populer, dan hal yang perlu diwaspadaiResmiFramework Go paling banyak dipakai โ dengan dua jebakan yang khas:
ShouldBindversusBind, dan context yang bocor ke goroutine.gin-gonic.comBaca rangkuman โ -
Fiber โ cepat, dengan konsekuensiResmiDibangun di atas fasthttp, bukan
net/http. Itu sumber kecepatannya sekaligus sumber semua batasannya.docs.gofiber.ioBaca rangkuman โ -
templ & htmx โ interaktif tanpa SPAResmiTemplate yang diperiksa compiler, plus htmx untuk interaktivitas โ pendekatan yang mengembalikan HTML ke pusat dan menjaga halaman tetap bisa di-cache.templ.guideBaca rangkuman โ
-
OpenAPI โ kontrak API yang dijaga compilerResmiTulis spesifikasi lebih dulu, hasilkan tipe dan antarmuka server โ supaya dokumentasi tidak pernah berbeda dari kode.pkg.go.devBaca rangkuman โ
Kamu bisa menjelaskan kenapa memilih (atau tidak memilih) framework tertentu dalam dua kalimat, handler-mu tidak terikat tipe konteks milik framework mana pun, dan kontrak API-mu tertulis di satu tempat yang dijaga compiler.
Testing & Kualitas Kode
Tujuan: berani men-deploy pada Jumat sore โ karena ada yang memeriksa selain matamu sendiri.
| Alat | Menangkap | Yang tidak bisa ditangkapnya |
|---|---|---|
| Tes tabel | Perilaku salah pada kasus yang diuji | Kasus yang tidak terpikirkan |
httptest | Kontrak HTTP, otorisasi, bentuk respons | Perilaku di bawah beban |
| Testcontainers | SQL, migrasi, constraint yang sungguhan | Aturan bisnis yang salah |
-race | Data race yang benar-benar terjadi | Race di jalur yang tidak diuji |
synctest | Goroutine yang tidak pernah selesai | โ |
golangci-lint | Body/rows tidak ditutup, error diabaikan, batas modul | Kode yang jelek tapi patuh |
govulncheck | CVE yang bisa dijangkau kodemu | Kerentanan di kodemu sendiri |
Yang wajib punya tes
- Setiap aturan otorisasi โ dari sisi yang boleh dan yang tidak boleh.
- Setiap alur yang menyentuh uang atau data pribadi.
- Bentuk respons setiap endpoint API publik.
- Setiap bug yang pernah terjadi โ tesnya ditulis sebelum perbaikannya.
- Jumlah kueri pada halaman daftar โ pagar terhadap N+1.
- Perilaku saat gagal: database mati, API luar timeout, context dibatalkan.
Cakupan 100% tidak membuktikan apa pun. Tes yang memanggil setiap fungsi tanpa memeriksa hasilnya menghasilkan cakupan penuh dan nol jaminan. Daftar enam baris di atas jauh lebih pendek โ dan justru di situlah kegagalan paling mahal.
Materi
-
Testing di Go โ pustaka standar sudah cukupResmiTanpa framework, tanpa assertion DSL โ dan tiga alat bawaan yang sering tidak diketahui:
t.Cleanup,t.Helper, dan cakupan tes.pkg.go.devBaca rangkuman โ -
Tes tabel & test doubleResmiPola tes paling khas di Go โ dan cara membuat pengganti untuk database dan API luar tanpa satu pun pustaka mocking.go.devBaca rangkuman โ
-
httptest โ menguji handler & klienResmiMenguji seluruh rantai HTTP tanpa menjalankan server โ dan membuat server tiruan untuk API luar dalam tiga baris.pkg.go.devBaca rangkuman โ
-
testing/synctest โ menguji concurrencyResmiWaktu palsu dan deteksi kebuntuan untuk tes berbasis goroutine โ stabil di Go 1.25, dan penghapus tes flaky terbesar.pkg.go.devBaca rangkuman โ
-
Testcontainers โ tes integrasi dengan database sungguhanResmiPostgres asli di dalam tesmu, dijalankan dan dibersihkan otomatis โ supaya perbedaan antara SQLite dan produksi berhenti jadi kejutan.golang.testcontainers.orgBaca rangkuman โ
-
golangci-lint & gerbang CIResmiPuluhan linter dalam satu perintah โ dan konfigurasi yang menangkap bug nyata, bukan sekadar gaya kode.golangci-lint.runBaca rangkuman โ
-
Benchmark & fuzzingResmiMengukur sebelum mengoptimalkan, dan membiarkan komputer mencari input yang merusak kodemu.go.devBaca rangkuman โ
CI-mu menjalankan fmt, go mod tidy, vet, lint, govulncheck, dan
go test -race sebagai gerbang; ada tes yang membuktikan pengguna lain mendapat 404; dan
suite lengkapnya selesai di bawah dua menit.
Performa & Observability
Tujuan: bisa menjawab "kenapa lambat?" dengan data dalam sepuluh menit โ dan tahu urutan perbaikan yang benar.
Kalau lalu lintas naik, periksa dalam urutan ini
- Rasio hit CDN. Di bawah 90% untuk situs konten berarti ada yang salah di kunci cache โ biasanya query pelacakan atau cookie yang ikut masuk kunci.
- Kueri per permintaan. Kalau bertambah seiring jumlah baris, itu N+1.
- p95 database. Kueri teratas di Performance Insights biasanya menunjuk index yang hilang.
- Antrean pool database.
WaitCount> 0 berarti setiap permintaan menghabiskan waktunya menunggu giliran. - Profil CPU dan alokasi.
mallocgcbesar berarti terlalu banyak alokasi. - Baru tambah task โ dan baru pikirkan arsitektur.
Pengungkit terbesar hampir selalu yang pertama. Untuk halaman yang sama bagi semua pembaca,
satu header Cache-Control: public, s-maxage=300, stale-while-revalidate=3600 memindahkan
sebagian besar lalu lintas ke CloudFront โ permintaan yang tidak pernah menyentuh proses Go, tidak
pernah menyentuh database, dan tidak menambah satu pun kelas bug.
Dua variabel yang menentukan perilaku memori di Fargate
| Variabel | Nilai | Kalau tidak diset |
|---|---|---|
GOMEMLIMIT | ~80% batas memori container | Container di-OOM-kill tanpa satu pun log |
GOMAXPROCS | Otomatis sejak Go 1.25 | Di versi lama: throttling parah di task kecil |
Materi
-
pprof โ menemukan di mana waktunya habisResmiProfiler bawaan Go: CPU, memori, goroutine, dan blocking โ bisa diambil dari proses produksi yang sedang berjalan.pkg.go.devBaca rangkuman โ
-
GC, memori & GOMAXPROCS di containerResmiDua variabel yang menentukan perilaku memori aplikasimu di Fargate โ dan kenapa
GOMEMLIMITmencegah OOM kill.go.devBaca rangkuman โ -
Cache aplikasi dengan RedisResmiCara termurah membuat aplikasi terasa cepat โ dan cara termudah menyajikan data basi atau membocorkan data antar pengguna.pkg.go.devBaca rangkuman โ
-
Cache HTTP & CDN โ pengungkit terbesarResmiPermintaan tercepat adalah yang tidak pernah sampai ke servermu. Satu header
Cache-Controlyang benar memindahkan sebagian besar trafik ke CDN.www.rfc-editor.orgBaca rangkuman โ -
OpenTelemetry โ trace, metrik & korelasiResmiMelihat ke dalam satu permintaan yang lambat: berapa lama di handler, di kueri, di API luar โ dan menghubungkannya dengan log.opentelemetry.ioBaca rangkuman โ
-
Skala: dari satu container ke banyakResmiApa yang harus benar sebelum menambah container โ dan mana yang sebenarnya butuh mesin lebih besar, bukan lebih banyak.pkg.go.devBaca rangkuman โ
Kamu punya dasbor p95 per endpoint, trace yang tersambung ke log lewat trace_id,
rasio hit cache yang terpantau, dan kamu pernah menemukan satu perbaikan nyata lewat flame graph
pprof.
Deploy di AWS
Tujuan: git push ke main menghasilkan aplikasi baru di produksi
tanpa satu pun respons non-200 selama deploy โ dan tanpa satu pun access key AWS tersimpan di mana
pun.
Bentuk infrastrukturnya
Route 53 โ CloudFront (+ WAF) โโฌโโ ALB โ ECS Fargate (subnet privat)
โ โโโ service server (4 task, ALB)
โ โโโ service worker (2 task)
โ โโโ service cron (1 task)
โ โ
โโโ S3 (media, โโโ Aurora PostgreSQL
aset statis) โ writer + reader
lewat OAC โโโ ElastiCache Redis
โโโ SQS
โโโ Secrets Manager
Angka yang harus selaras
| Setelan | Nilai | Harus |
|---|---|---|
| ALB idle timeout | 60 dtk | < IdleTimeout Go (65 dtk) |
| Deregistration delay | 30 dtk | โฅ durasi permintaan terpanjang |
stopTimeout ECS | 60 dtk | > jeda + Shutdown + worker |
GOMEMLIMIT | 800 MiB | ~80% dari memori task (1024 MB) |
MaxOpenConns ร task maks | < max_connections | sisakan ruang untuk migrasi & admin |
Ketidakcocokan baris pertama adalah penyebab paling umum "502 acak yang tidak ada di log aplikasi". Kalau server Go menutup koneksi keep-alive lebih dulu daripada ALB menyadarinya, ALB mengirim permintaan ke koneksi yang sedang ditutup โ dan permintaan itu tidak pernah sampai ke kodemu, sehingga log aplikasimu bersih total.
Materi
-
Image Docker: multi-stage & distrolessResmiDari 900 MB jadi 15 MB โ dan container produksi yang benar-benar tidak punya shell untuk dipakai penyerang.docs.docker.comBaca rangkuman โ
-
ECR โ registry imageResmiTempat image tinggal sebelum dijalankan โ dengan pemindaian kerentanan, kebijakan umur, dan satu aturan penamaan tag yang menyelamatkan rollback.docs.aws.amazon.comBaca rangkuman โ
-
ECS Fargate โ menjalankan containerResmiContainer tanpa server yang harus dikelola: task definition, service, dan tiga setelan yang menentukan apakah deploy-mu mulus.docs.aws.amazon.comBaca rangkuman โ
-
Application Load BalancerResmiPintu masuk trafik ke task-mu โ dan empat setelan yang menentukan apakah deploy menghasilkan 502 atau tidak.docs.aws.amazon.comBaca rangkuman โ
-
RDS & Aurora untuk aplikasi GoResmiWriter, reader, dan failover โ beserta setelan pool Go yang harus menyertainya agar aplikasi pulih sendiri.docs.aws.amazon.comBaca rangkuman โ
-
Secrets Manager & IAM untuk taskResmiRahasia yang tidak pernah masuk image maupun repositori โ disuntikkan saat runtime, dengan izin IAM yang sesempit mungkin.docs.aws.amazon.comBaca rangkuman โ
-
CloudFront & S3ResmiCDN di depan aplikasi dan S3 untuk media โ pengungkit performa terbesar untuk situs bertrafik baca tinggi.docs.aws.amazon.comBaca rangkuman โ
-
CI/CD dengan GitHub Actions & OIDCResmiDeploy dari
git pushtanpa satu pun access key AWS tersimpan di GitHub.docs.aws.amazon.comBaca rangkuman โ -
Deploy tanpa jeda & observability produksiResmiRolling update yang benar-benar mulus, circuit breaker yang mengembalikan versi lama, dan alarm yang berbunyi sebelum pengguna mengeluh.docs.aws.amazon.comBaca rangkuman โ
-
Go di Lambda โ kapan masuk akalResmiCold start Go di bawah 100 ms membuat Lambda benar-benar layak โ dengan satu batasan besar: koneksi database.docs.aws.amazon.comBaca rangkuman โ
Deploy berjalan dari git push lewat OIDC tanpa access key, migrasi jalan sebagai task
terpisah yang exit code-nya diperiksa, circuit breaker mengembalikan deploy yang gagal, rollback
pernah kamu uji sungguhan, dan hey -z 120s selama deploy menghasilkan nol respons
non-200.
Enterprise & Capstone
Tujuan: aplikasimu tetap bisa dipahami, diubah, dan di-upgrade setelah dua tahun dan lima orang yang berbeda menyentuhnya.
Fase-fase sebelumnya membuat aplikasi yang benar dan cepat. Fase ini tentang sifat yang baru terasa belakangan: apakah orang baru bisa menemukan kode yang dicarinya, apakah fitur bisa dimatikan tanpa deploy, apakah data satu pelanggan benar-benar terpisah dari yang lain, dan apakah kamu masih bisa naik versi tahun depan.
Materi
-
Monolit modular โ dan kenapa biasanya bukan microserviceResmiMenjaga aplikasi besar tetap bisa dipahami tanpa membayar ongkos jaringan, transaksi terdistribusi, dan lima pipeline deploy.go.devBaca rangkuman โ
-
Multi-tenancyResmiSatu aplikasi melayani banyak pelanggan โ tiga pola isolasi, dan satu kelalaian yang membocorkan data antar pelanggan.docs.aws.amazon.comBaca rangkuman โ
-
Feature flag โ melepas kode tanpa menyalakan fiturResmiMemisahkan "kode sudah di produksi" dari "fitur aktif" โ supaya deploy berhenti terasa seperti taruhan.docs.aws.amazon.comBaca rangkuman โ
-
gRPC untuk komunikasi antar layananResmiKontrak bertipe antar layanan internal โ dan alasan ia jarang tepat untuk API yang menghadap publik.grpc.ioBaca rangkuman โ
-
Versi, kompatibilitas & strategi upgradeResmiJanji kompatibilitas Go, jadwal rilis dua kali setahun, dan cara menjadikan upgrade pekerjaan sehari โ bukan proyek setahun.go.devBaca rangkuman โ
Capstone: portal konten bertrafik baca tinggi
Bangun satu aplikasi yang menyentuh seluruh fase. Proyek yang paling tepat adalah yang didominasi pembaca anonim dengan sedikit penulis โ karena bentuk beban itu memaksamu memakai hampir semua yang dipelajari di sini.
- Domain โ artikel, kategori, penulis, komentar. Tipe bernama untuk ID dan uang, error sentinel per domain.
- Alur request โ middleware lengkap,
request_iddi semua log, anggaran waktu berlapis dari ALB sampai kueri. - Data โ sqlc + pgx, migrasi kompatibel dua arah, index dari
EXPLAIN, keyset pagination. - Redaksi โ alur draf โ tinjau โ terbit, kebijakan per peran dengan tes dari kedua sisi.
- Media โ unggahan langsung ke S3 lewat presigned URL, varian ukuran dibuat worker, disajikan lewat CloudFront.
- Halaman publik โ dirender server, tanpa JavaScript yang tidak perlu, dengan
s-maxagedanstale-while-revalidate. - Interaktivitas โ pencarian dan komentar dengan htmx; endpoint fragmen tetap punya auth dan rate limit sendiri.
- API โ kontrak OpenAPI, cursor pagination, sesi untuk web dan token untuk integrasi.
- Kualitas โ tes tabel,
httptestlewat router lengkap, testcontainers,-race, golangci-lint, govulncheck โ semuanya gerbang CI. - Performa โ cache Redis dengan
singleflight, anggaran kueri di dalam tes, profil pprof yang pernah dibaca. - Infrastruktur โ ECS Fargate tiga service, Aurora writer + reader, ElastiCache, SQS, Secrets Manager, CloudFront + WAF.
- Deploy โ GitHub Actions lewat OIDC, migrasi sebagai task terpisah, circuit breaker, nol respons non-200.
- Observability โ log JSON, trace tersambung ke log, delapan alarm, dasbor p95 dan rasio hit CDN.
Kenapa proyek ini: ia memaksa setiap keputusan yang dibahas di roadmap. Beban baca tinggi menuntut strategi cache berlapis; alur redaksi menuntut otorisasi yang benar; media menuntut antrean dan penyimpanan objek; dan target tanpa jeda menuntut migrasi yang kompatibel dua arah. Kalau kamu bisa menjelaskan setiap keputusan di proyek ini, kamu bisa menjalankan aplikasi Go di produksi.
Aplikasi berjalan end-to-end di AWS, di-deploy dari pipeline, punya dasbor yang menunjukkan p95 dan rasio hit CDN, batas modulnya dijaga uji arsitektur, dan kamu bisa mematikan satu fitur tanpa deploy.
Rekomendasi best practice
Ringkasan keputusan yang, kalau harus memilih satu jawaban, inilah jawabannya. Konteksnya: aplikasi Go dengan lalu lintas baca yang jauh lebih besar daripada tulis โ situs konten, katalog, portal. Setiap baris punya materi yang membahas alasannya.
Tumpukan yang direkomendasikan
| Lapisan | Pilihan | Alasan singkat |
|---|---|---|
| Bahasa | Go 1.26 | Didukung sampai Feb 2027; naik tiap rilis |
| Routing | net/http + chi | Grup middleware ringkas, tetap http.Handler |
| Database | pgx + sqlc | SQL tetap terlihat, tipenya dijaga compiler |
| Migrasi | Berkas SQL, di-embed ke binari | Satu image berisi server dan migrasinya |
| Template | templ (+ htmx untuk interaktif) | Kesalahan template jadi error kompilasi |
| Log | log/slog, JSON ke stdout | Nol dependensi; bisa dikueri di Logs Insights |
| Observability | OpenTelemetry | Trace tersambung ke log lewat trace_id |
| Basis image | distroless/static, non-root | ~17 MB, tanpa shell sama sekali |
| Compute | ECS Fargate ARM64, tiga service | Tanpa server yang dikelola; ~20% lebih murah |
| Database terkelola | Aurora PostgreSQL, writer + reader | Beban baca pindah ke replica |
| Cache & sesi | ElastiCache Redis | Wajib bersama begitu ada container kedua |
| Antrean | Postgres dulu, SQS saat volumenya besar | Outbox membuatnya atomik dengan data |
| Aset & media | S3 di belakang CloudFront (OAC) | Bucket tidak pernah publik |
| Halaman publik | Dirender server, di-cache CloudFront | Permintaan yang tidak pernah menyentuh Go |
| Rahasia | Secrets Manager lewat secrets ECS | Tidak ada rahasia di image maupun repositori |
| CI/CD | GitHub Actions + OIDC | Tanpa access key jangka panjang |
Sepuluh yang paling menentukan
- Pindahkan sebanyak mungkin ke CDN. Untuk halaman yang sama bagi semua pembaca,
s-maxageplusstale-while-revalidatememangkas beban server berkali-kali lipat โ dan tidak menambah satu pun kelas bug. Ini pengungkit terbesar, dan yang paling sering dilewati. - Batasi kueri dengan kepemilikan, bukan dengan
if.WHERE id = $1 AND pengguna_id = $2membuat data orang lain tidak pernah ditemukan โ pertahanan yang tidak bisa lupa dipasang. - Setiap goroutine punya pemilik dan punya
recover. Goroutine latar tanpa pemulih adalah penyebab container mati tanpa jejak. defer rows.Close()danrows.Err(), selalu. Yang pertama mencegah aplikasi membeku; yang kedua mencegah data tidak lengkap yang tidak melaporkan error.- Timeout di setiap lapisan, mengecil ke dalam. ALB > server > middleware > kueri. Kalau lapisan dalam lebih longgar, klien menyerah sementara kuerinya tetap memegang koneksi.
- Hitung
MaxOpenConnsuntuk jumlah task maksimum. Autoscaling yang tidak memperhitungkan ini akan menjatuhkan database, bukan menyelamatkan aplikasi. - Migrasi harus kompatibel dua arah. Selama rolling update, kode lama dan baru berjalan bersamaan. Ganti nama kolom = tiga deploy, bukan satu.
- Job harus idempoten. Ia akan berjalan dua kali โ worker bisa mati setelah pekerjaan selesai tapi sebelum sempat menandainya.
- Setel
GOMEMLIMIT. Tanpa itu, container di-OOM-kill oleh kernel tanpa satu pun baris log yang menjelaskan. - Ukur p95, bukan rata-rata. Rata-rata menyembunyikan satu dari sepuluh pengguna yang menunggu tiga detik.
Kesalahan yang paling mahal
| Kesalahan | Akibatnya | Dibahas di |
|---|---|---|
Halaman personal ditandai public di CDN | Data satu pengguna tersaji ke pengguna lain | Fase 9, 10 |
| Kunci cache tanpa ID pengguna atau tenant | Kebocoran antar pengguna / pelanggan | Fase 6, 9, 11 |
rows.Close() yang hilang | Aplikasi membeku total setelah beberapa jam | Fase 4 |
Server tanpa ReadHeaderTimeout | Satu laptop cukup untuk menjatuhkannya | Fase 3 |
| Endpoint daftar lupa membatasi kepemilikan | Semua data terlihat oleh semua orang | Fase 6 |
| Decode JSON langsung ke struct domain | Pengguna bisa mengirim {"peran":"admin"} | Fase 1 |
math/rand untuk token atau ID sesi | Sesi bisa ditebak dan dibajak | Fase 6 |
| Sesi di memori dengan lebih dari satu task | Pengguna ter-logout acak | Fase 6, 9 |
Image tag latest | Rollback tidak mengembalikan apa pun | Fase 10 |
| Migrasi di entrypoint container web | Sepuluh task menjalankannya bersamaan saat scale-out | Fase 4, 10 |
| Health check ALB menyentuh database | Gangguan sebagian berubah jadi pemadaman total | Fase 3, 10 |
IdleTimeout Go lebih kecil dari ALB | 502 acak tanpa jejak di log aplikasi | Fase 3, 10 |
| Cron di dalam service web | Job berjalan sebanyak jumlah task | Fase 9, 10 |
Satu hal yang tidak akan diselesaikan infrastruktur: halaman yang butuh empat puluh kueri dan mengirim dua megabita HTML tetap mahal di runtime mana pun, di kelas instans apa pun, di belakang CDN mana pun. Ukur dulu, baru belanja.
Aturan main
- Bangun, jangan cuma baca. Hampir semua materi di sini punya latihan konkret di akhirnya; latihan itu yang membuatnya melekat.
- Ukur sebelum dan sesudah. Setiap klaim performa di roadmap ini bisa kamu buktikan sendiri dalam sepuluh menit โ lakukan.
- Satu perubahan pada satu waktu. Menaikkan versi Go dan menaikkan dependensi bersamaan membuat hasilnya tidak bisa dibaca.
- Baca pesan error sampai habis. Compiler Go termasuk yang paling jelas; sebagian besar jawabannya sudah ada di sana.
- Jangan lompat ke Fase 10. Godaannya besar. Deploy ke AWS tanpa tes hanya mempercepat penyebaran bug.
- Hapus resource AWS setelah berlatih. Aurora, ElastiCache, dan NAT Gateway ditagih per jam, dipakai atau tidak.
- Tulis tes untuk setiap bug. Sebelum memperbaikinya, bukan sesudah.
Sebelum & sesudah ini
Roadmap ini mengandaikan kamu sudah pernah menulis kode di bahasa apa pun dan paham dasar HTTP. Kalau belum pernah ngoding sama sekali, mulai dari Python Dasar untuk Pemula. Kalau kamu ingin mendalami sisi AWS-nya lebih jauh โ IAM, IaC, observability โ AWS untuk AI Engineer membahasnya dengan sudut pandang berbeda. Dan kalau kamu penasaran bagaimana bahasa lain menyelesaikan masalah yang sama, Laravel dari Nol sampai Enterprise menempuh jalur yang paralel dengan pertukaran yang sangat berbeda.