Penerapan Biru-Hijau vs Canary: Perbedaan, Kompromi, dan Cara Memilih
Kedua strategi tersebut memungkinkan Anda melepaskan tanpa menghapus situs, namun keduanya mengelola risiko dengan cara yang berlawanan. Pelajari cara kerja masing-masing, berapa biaya sebenarnya, cara menangani database, dan mana yang cocok untuk tim Anda.
- Biru-hijau mempertahankan dua lingkungan penuh dan mengalihkan semua lalu lintas sekaligus.
- Canary mengirimkan versi baru ke sebagian kecil pengguna terlebih dahulu, kemudian memperluasnya secara bertahap.
- Biru-hijau menawarkan pengembalian yang sangat cepat. Canary membatasi berapa banyak pengguna yang dapat terpengaruh oleh rilis yang buruk.
- Keduanya bergantung pada perubahan database yang kompatibel dan pemantauan yang baik.
Merilis perangkat lunak biasanya berarti jendela pemeliharaan dan semoga saja. Tim modern menggunakan strategi yang membuat rilis menjadi rutin, dan pilihan penerapan biru-hijau vs kenari adalah salah satu pilihan pertama yang akan Anda hadapi. Keduanya mengurangi risiko, namun melakukannya dengan cara yang berlawanan: yang satu menyiapkan pengganti penuh, sementara yang lain menguji dengan pengguna sebenarnya sedikit demi sedikit.
Panduan ini menjelaskan cara kerja masing-masing dan berapa biaya praktiknya. Kami menjalankan contoh kecil perutean pengguna dan rollback di Python 3.13, dan hasilnya berasal dari proses tersebut. Sampel Kubernetes hanya bersifat ilustratif, dan kami tidak menjalankannya. Perlakukan persentase dan ambang batas sebagai contoh awal untuk beradaptasi.
Jawaban singkatnya
Dengan penerapan biru-hijau, Anda menjalankan dua lingkungan produksi yang identik. Yang satu melayani pengguna saat Anda menerapkan dan menguji versi baru di versi lainnya, lalu Anda mengalihkan semua lalu lintas dalam satu gerakan.
Dengan penerapan canary, versi baru berjalan di samping versi lama. Anda mengirimkannya sebagian kecil dari lalu lintas nyata, membandingkan hasilnya, dan meningkatkan pembagiannya selangkah demi selangkah hingga dapat melayani semua orang. Nama burung kenari ini berasal dari nama burung kenari penambang yang pernah digunakan sebagai peringatan dini akan adanya bahaya.
Biru-hijau vs kenari berdampingan
| Aspek | Biru-hijau | kenari |
|---|---|---|
| Pergeseran lalu lintas | Sekaligus | Bertahap |
| Pengguna terkena rilis yang buruk | Semuanya, sampai Anda beralih kembali | Hanya bagian kenari saja |
| Kembalikan | Alihkan lalu lintas kembali | Atur bagian kenari ke nol |
| Kecepatan rilis | Peralihan cepat | Lebih lambat, secara bertahap |
| Biaya infrastruktur | Hingga dua kali lipat selama rilis | Bagian ekstra kecil |
| Perutean lalu lintas diperlukan | Peralihan sederhana | Perutean berdasarkan persentase |
| Diperlukan pemantauan | Bagus | Luar biasa, dengan metrik per versi |
| Versi hidup bersama | Secara singkat, jika ada | Untuk keseluruhan peluncuran |
| Masukan pengguna nyata sebelum rilis penuh | Tidak | Ya |
Cara kerja penerapan biru-hijau
- Biru aktif dan melayani semua lalu lintas.
- Terapkan versi baru ke hijau, yang tidak menerima lalu lintas pengguna.
- Uji hijau secara menyeluruh, di lingkungan produksi nyata, menggunakan uji asap dan pengguna internal.
- Ganti router, penyeimbang beban, atau DNS untuk mengirim lalu lintas ke warna hijau.
- Perhatikan baik-baik, dengan warna biru masih berjalan dan siap.
- Jika ada yang salah, beralih kembali. Jika semuanya baik-baik saja, warna biru menjadi lingkungan menganggur berikutnya.
Di Kubernetes, Anda dapat melakukan peralihan dengan mengubah pemilih Layanan, sehingga lalu lintas berpindah ke Pod yang diberi label berbeda:
apiVersion: v1
kind: Service
metadata:
name: shop
spec:
selector:
app: shop
version: green # was: blue
ports:
- port: 80
targetPort: 8000
Kelebihan: Konsepnya sederhana, Anda dapat menguji penyiapan produksi yang tepat sebelum pengguna melihatnya, dan rollback hampir seketika. Kelemahan: Infrastruktur duplikat bisa memakan biaya yang mahal, bug yang lolos dari pengujian Anda dapat menjangkau semua orang sekaligus, dan sesi terbuka serta pekerjaan dalam penerbangan memerlukan perhatian selama peralihan. Jika Anda menggunakan DNS untuk peralihan, catatan cache dapat menundanya. Baru mengenal konsepnya? Lihat Tutorial Kubernetes untuk pemula kami.
Cara kerja penerapan canary
- Terapkan versi baru bersama versi stabil.
- Rutekan sebagian kecil lalu lintas, misalnya 5%, ke canary.
- Bandingkan tingkat kesalahan, latensi, dan metrik bisnis dengan versi stabil.
- Kalau sehat naikkan jadi 25%, lalu 50%, lalu 100%.
- Jika ada yang menurun, kembalikan semua lalu lintas ke versi stabil.
Banyak tim memulai proyek dengan staf internal, kemudian wilayah berisiko rendah, dan baru kemudian masyarakat luas.
Kelebihan: Rilis yang buruk hanya memengaruhi sekelompok kecil, dan Anda belajar dari lalu lintas nyata bahwa tidak ada lingkungan pengujian yang dapat direproduksi sepenuhnya. Kelemahan: Anda memerlukan perutean berbasis persentase dan metrik per versi, peluncuran membutuhkan waktu lebih lama, dan dua versi dijalankan bersamaan untuk sementara waktu. Burung kenari kecil juga bisa menjadi terlalu sunyi untuk memberikan sinyal yang berarti, terutama pada saat lalu lintas sepi.
Perutean pengguna yang stabil
Memilih versi secara acak pada setiap permintaan memberikan pengalaman yang membingungkan bagi pengguna, karena mereka mungkin beralih antara versi lama dan baru. Solusi umum adalah dengan meng-hash ID pengguna yang stabil ke dalam keranjang, sehingga setiap pengguna selalu mendapatkan jawaban yang sama:
import hashlib
def bucket(user_id):
digest = hashlib.sha256(user_id.encode()).hexdigest()
return int(digest, 16) % 100
def version_for(user_id, canary_percent):
return "v2" if bucket(user_id) < canary_percent else "v1"
users = [f"user-{i}" for i in range(10000)]
for percent in (5, 25, 50, 100):
share = sum(version_for(u, percent) == "v2" for u in users) / len(users)
print(percent, round(share * 100, 1))
# 5 5.0
# 25 24.5
# 50 49.9
# 100 100.0
Proporsi sebenarnya sudah sesuai dengan target. Metode ini memiliki dua properti yang lebih berguna, dan proses kami mengonfirmasi keduanya. Pengguna yang sama selalu menerima versi yang sama. Dan semua orang di kelompok 5% masih termasuk dalam 25%, jadi tidak ada orang yang sudah memiliki versi baru yang dipindahkan kembali seiring dengan berkembangnya peluncuran.
Dalam sistem nyata, mesh layanan, penyeimbang beban, atau alat seperti Argo Rollouts atau Flagger biasanya menangani perutean ini, jadi Anda tidak perlu menulisnya sendiri. Memahami apa yang mereka lakukan masih bermanfaat.
Mengotomatiskan keputusan
Canary hanya berfungsi jika seseorang benar-benar membandingkan versinya. Pemeriksaan otomatis lebih dapat diandalkan dibandingkan seseorang yang mengamati grafik. Inilah ide intinya, membandingkan tingkat kesalahan canary dengan versi stabil:
def should_rollback(canary_errors, canary_total, base_errors, base_total,
tolerance=1.5, min_requests=500):
if canary_total < min_requests:
return False # not enough data to decide
return (canary_errors / canary_total) > (base_errors / base_total) * tolerance
should_rollback(3, 100, 10, 5000) # False: too few requests
should_rollback(30, 1000, 100, 10000) # True: 3% against 1%
should_rollback(12, 1000, 100, 10000) # False: 1.2% is within tolerance
Perhatikan kasus pertama. Tingkat kesalahannya terlihat tinggi, namun dengan hanya 100 permintaan, itu belum cukup bukti. Alat nyata menerapkan statistik yang lebih cermat, dan alat tersebut melihat beberapa sinyal secara bersamaan:
| Sinyal | Contoh |
|---|---|
| Kesalahan | Rasio 5xx tanggapan |
| Latensi | p95 dan p99, seperti yang dijelaskan dalam uji beban vs pengujian stres |
| Saturasi | CPU, memori, kumpulan koneksi |
| Bisnis | Pendaftaran, pembayaran, pembayaran berhasil |
Kiat: Bandingkan kenari dengan versi stabil dalam jangka waktu yang sama, bukan dengan angka minggu lalu. Lalu lintas dan perilaku berubah setiap jamnya, sehingga perbandingan secara berdampingan memberi Anda sinyal yang lebih adil.
Masalah basis data
Kode aplikasi dapat ditukar dalam hitungan detik, namun data tidak. Kedua strategi tersebut biasanya berbagi satu database, jadi selama peluncuran dan setelah rollback, versi lama dan baru harus bekerja dengan skema yang sama.
Jawaban standarnya adalah pola perluas dan kontrak. Misalkan Anda ingin mengganti nama name menjadi full_name:
- Perluas: tambahkan kolom baru. Kode lama tidak terpengaruh.
- Migrasi: kode rilis yang menulis ke kedua kolom, dan mengisi ulang baris lama.
- Beralih: kode rilis yang dibaca dari kolom baru.
- Kontrak: setelah tidak ada yang menggunakan kolom lama, hapus kolom tersebut di rilis selanjutnya.
Ini memerlukan beberapa rilis, namun setiap langkah dapat dibatalkan dengan aman. Menjalankan RENAME COLUMN sekaligus akan merusak versi mana pun yang diharapkan dari nama lainnya. Berhati-hatilah dengan perubahan skema yang berjalan lama, karena perubahan tersebut dapat mengunci. Untuk mengetahui lebih lanjut mengenai hal ini, baca tentang transaksi SQL.
Bergulir dan strategi lainnya
| Strategi | Bagaimana cara kerjanya | Bagus untuk |
|---|---|---|
| Buat ulang | Hentikan yang lama, lalu mulai yang baru, dengan waktu henti | Alat internal, sistem batch |
| Bergulir | Ganti instance beberapa per satu | Default yang umum, termasuk di Kubernetes |
| Biru-hijau | Beralih di antara dua lingkungan | Peralihan dan pengembalian cepat |
| kenari | Perluas sebagian kecil secara bertahap | Lalu lintas tinggi, risiko tinggi |
| Bayangan | Salin lalu lintas ke versi baru, dan buang tanggapannya | Menguji dengan beban nyata, tanpa dampak pada pengguna |
Deployment Kubernetes melakukan pembaruan berkelanjutan secara default, yang cocok untuk banyak layanan. Pembaruan berkelanjutan juga bergeser secara bertahap, namun bagiannya terkait dengan jumlah contoh, dan tidak dengan sendirinya menganalisis hasil atau berhenti pada metrik yang buruk.
Bagaimana dengan tanda fitur?
Deployment menempatkan kode di server, dan rilis membuat fitur tersedia bagi pengguna. Tanda fitur memisahkannya, dengan memungkinkan Anda mengaktifkan fitur untuk pengguna yang dipilih tanpa menerapkan apa pun. Mereka bekerja sangat baik dengan kedua strategi tersebut: terapkan tanpa tanda, lalu aktifkan secara bertahap. Mereka tidak menggantikan strategi ini, karena sebuah flag tidak dapat melindungi Anda dari rilis yang crash saat startup. Ingatlah untuk menghapus tanda-tanda lama, karena hal itu akan menumpuk sebagai utang teknis.
Bagaimana memilih
| Situasi Anda | Pilihan yang masuk akal |
|---|---|
| Aplikasi sederhana, dan sedikit pengguna | Pembaruan bergulir |
| Perlu peralihan dan pengembalian yang sangat cepat | Biru-hijau |
| Ingin menguji dalam produksi sebelum peralihan | Biru-hijau |
| Lalu lintas tinggi dan biaya kegagalan yang tinggi | kenari |
| Pemantauan yang kuat, dan metrik per versi | kenari |
| Lalu lintas rendah | Biru-hijau, karena sinyal kenari terlalu lemah |
| Anggaran infrastruktur yang ketat | Kenari atau bergulir |
Mereka juga bisa digabungkan. Beberapa tim menerapkan lingkungan hijau, dan kemudian mengalihkan lalu lintas ke sana secara bertahap, mendapatkan lingkungan yang bersih dan radius ledakan terbatas. Apa pun yang Anda pilih, otomatiskan melalui pipa CI/CD Anda, seperti yang dijelaskan dalam panduan Tindakan GitHub kami.
Kesalahan umum
- Membuat perubahan skema yang dapat menyebabkan gangguan. Rollback tidak membantu jika kode lama tidak dapat membaca data.
- Tidak memiliki kriteria rollback. Putuskan apa yang dimaksud dengan “buruk” sebelum rilis dimulai, bukan saat terjadi insiden.
- Membiarkan lingkungan melayang. Jika warna hijau berbeda dengan biru, pengujian Anda kurang membuktikannya. Definisikan keduanya dengan infrastruktur sebagai kode.
- Hanya mengukur metrik teknis. Rilis bisa bebas kesalahan dan tetap membatalkan proses pembayaran.
- Jangan pernah berlatih rollback. Latihlah, agar berhasil saat Anda berada di bawah tekanan.
- Melupakan pekerjaan latar belakang. Pekerja dan tugas terjadwal juga memerlukan rencana selama peralihan.
Penutup
Biru-hijau memberi Anda peralihan yang bersih dan cepat. Canary memberi Anda eksposur kecil dan terukur. Jika pemantauan Anda masih dasar, mulailah dengan pembaruan berkelanjutan atau biru-hijau, dan berinvestasilah pada metrik per versi sebelum Anda mencoba canaries. Kemudian latih rollback pada rilis berikutnya, termasuk database. Latihan tunggal tersebut cenderung mengungkapkan apa yang sebenarnya perlu diperbaiki.
Pertanyaan yang sering diajukan
Apa perbedaan antara penerapan biru-hijau dan kenari?
Biru-hijau mengalihkan semua lalu lintas dari satu lingkungan penuh ke lingkungan lainnya sekaligus. Canary mengirimkan sebagian kecil lalu lintas ke versi baru dan mengembangkannya secara bertahap.
Mana yang lebih aman, biru-hijau atau kenari?
Canary membatasi berapa banyak pengguna yang terkena dampak rilis buruk, dan biru-hijau menawarkan pengembalian yang sangat cepat. Pilihan yang lebih aman bergantung pada lalu lintas, peralatan, dan pemantauan Anda.
Apakah penerapan biru-hijau mahal?
Bisa jadi, karena Anda mungkin menjalankan dua lingkungan penuh selama rilis. Penskalaan otomatis cloud dan mematikan lingkungan yang tidak aktif dapat mengurangi biaya.
Berapa persentase burung kenari yang harus dimulai?
Tim biasanya memulai dengan sekitar 1 hingga 5 persen, selama itu memberikan lalu lintas yang cukup untuk menghasilkan sinyal yang berarti. Sistem dengan lalu lintas rendah mungkin memerlukan bagian yang lebih besar.
Bagaimana canary dan blue-green menangani perubahan database?
Biasanya dengan perubahan yang kompatibel dengan versi sebelumnya seperti perluasan dan kontrak, karena kedua versi mungkin berbagi satu database dan keduanya harus berfungsi selama peluncuran.
Teruslah belajar
Butuh bantuan dengan pengujian, WordPress atau SEO?
Kami membantu tim mengirimkan perangkat lunak yang lebih baik dan mengembangkan situs mereka. Beritahu kami apa yang sedang Anda kerjakan dan kami akan menyarankan langkah selanjutnya yang jelas.
Panduan lebih lanjut tentang pengujian, AI & pengembangan modern
Menikmati artikel ini? Pilih topik dan langsung masuk ke tutorial terbaru kami.
Penjelasan Halusinasi AI: Mengapa Model Bahasa Memperbaiki Masalah dan Cara Menguranginya
Halusinasi AI menjelaskan: apa itu, mengapa model bahasa memproduksinya, tipe umum, cara menguranginya dengan landasan dan petunjuk, dan pemeriksaan…
Baca artikel →DevOpsPenjelasan Variabel Lingkungan: File .env, Rahasia, dan Konfigurasi Dilakukan dengan Benar
Variabel lingkungan dijelaskan dengan contoh Python yang kami jalankan: membaca dan mengaturnya, mengapa setiap nilai berupa string, file .env, pewa…
Baca artikel →Pengembangan perangkat lunakPenjelasan Pembatasan Kecepatan API: Algoritma, Header, dan Penanganan 429 Kesalahan
Pembatasan laju API dijelaskan dengan simulasi yang kami jalankan: keranjang token, jendela tetap, jendela geser, respons 429, header batas laju, pe…
Baca artikel →Otomatisasi pengujianMengejek dengan Python: unittest.mock, patch dan Kesalahan yang Membuat Tes Berbohong
Mengejek dengan Python dengan unittest.mock, menguji: Mock dan return_value, side_effect, menambal di mana nama digunakan, spesifikasi dan autospec,…
Baca artikel →Pengujian perangkat lunakPenjelasan Cakupan Kode: Cakupan Jalur vs Cabang dan Apa Arti 100% Sebenarnya
Cakupan kode dijelaskan dengan coverage.py yang sebenarnya dijalankan: cakupan garis, cabang dan kondisi, membaca laporan, mengapa cakupan 100% masi…
Baca artikel →Basis data & SQLDELETE vs TRUNCATE vs DROP dalam SQL: Perbedaan, Rollback dan Kapan Menggunakan Masing-Masing
DELETE vs TRUNCATE vs DROP dijelaskan dengan SQL yang diuji: apa yang dihapus, rollback, pemicu, reset identitas, kecepatan, dan perbedaan PostgreSQ…
Baca artikel →Basis data & SQLPenjelasan Tampilan SQL: Membuat, Menggunakan, dan Menghindari Kesalahan, Dengan Contoh
Tampilan SQL dijelaskan dengan kueri yang kami jalankan: membuat tampilan, hasil langsung, menyembunyikan kolom, kinerja, tampilan yang dapat diperb…
Baca artikel →Pengembangan perangkat lunakAntarmuka TypeScript vs Tipe: Perbedaan Nyata, Diuji Dengan Kompiler
Antarmuka TypeScript vs tipe, diperiksa dengan kompiler sebenarnya: apa yang bisa dilakukan keduanya, apa yang hanya bisa dilakukan satu orang, peng…
Baca artikel →Pengembangan perangkat lunakPenjelasan Python *args dan **kwargs: Fungsi Fleksibel Dengan Contoh Jelas
Python *args dan **kwargs dijelaskan dengan kode yang kami jalankan: pengepakan dan pembongkaran, urutan parameter, argumen hanya kata kunci dan pos…
Baca artikel →Pengembangan perangkat lunakFungsi Python Lambda: Sintaks, Kegunaan Sebenarnya, dan Kapan Tidak Digunakan
Fungsi python lambda dijelaskan dengan kode yang kami jalankan: sintaksis, pengurutan dengan kunci, peta dan filter, penutupan, jebakan pengikatan a…
Baca artikel →Kecerdasan buatanApa Itu Agen AI? Cara Kerjanya, Dengan Agent Loop Sederhana yang Dapat Anda Jalankan
Apa itu agen AI? Panduan sederhana tentang loop agen, alat, memori, dan pagar pembatas, dengan loop Python kecil yang kami jalankan, risiko nyata da…
Baca artikel →DevOpsPemantauan vs Observabilitas: Perbedaan Nyata, Dengan Log, Metrik, dan Jejak
Penjelasan pemantauan vs observabilitas: kegagalan yang diketahui dan tidak diketahui, log, metrik dan jejak, penelusuran insiden checkout, sinyal e…
Baca artikel →DevOpsVolume Docker vs Bind Mounts: Pertahankan Data Kontainer dengan Cara yang Benar
Volume Docker vs pengikatan pengikat dijelaskan: mengapa data kontainer menghilang, volume yang diberi nama, pengikatan pengikatan, tmpfs, contoh Tu…
Baca artikel →Otomatisasi pengujianTDD vs BDD: Perbedaan Utama, Satu Fitur Dibangun dengan Dua Cara dan Kapan Menggunakan Masing-masing
TDD vs BDD dijelaskan dengan satu fitur diskon yang dibuat dengan dua cara: refactor merah-hijau dengan kode yang kami jalankan, skenario Mengingat-…
Baca artikel →Pengujian perangkat lunakUser Acceptance Testing (UAT): Proses, Checklist dan Contoh Nyata
Pengujian penerimaan pengguna menjelaskan: siapa yang menjalankannya, perbedaannya dengan QA, proses tujuh langkah, templat kasus uji UAT, daftar pe…
Baca artikel →Basis data & SQLPenjelasan Nilai NULL SQL: IS NULL, COALESCE, NULLIF dan Jebakan yang Harus Dihindari
Nilai SQL NULL dijelaskan dengan kueri yang kami jalankan: logika tiga nilai, IS NULL, COALESCE, NULLIF, cara agregat, penggabungan, dan pengurutan …
Baca artikel →Basis data & SQLPernyataan SQL CASE WHEN: Sintaks, Contoh Nyata dan Kesalahan Umum
SQL CASE KETIKA dijelaskan dengan kueri yang kami jalankan: formulir sederhana dan dicari, urutan kondisi, pivot dengan SUM, trik COUNT, pengurutan …
Baca artikel →Pengembangan perangkat lunakApa itu JWT? Token Web JSON Dijelaskan Dengan Contoh Kerja
Apa itu JWT? JSON Web Tokens menjelaskan: tiga bagian, token yang dibuat dan dirusak dalam kode yang kami jalankan, sesi JWT vs, penyimpanan, token …
Baca artikel →Pengembangan perangkat lunakPenjelasan Loop Acara JavaScript: Call Stack, Microtasks, dan Timer Dengan Contoh
Perulangan peristiwa JavaScript dijelaskan dengan kode yang kami jalankan: tumpukan panggilan, antrian tugas dan tugas mikro, mengapa setTimeout 0 t…
Baca artikel →Pengembangan perangkat lunakGenerator Python dan Penjelasan Hasil: Menghemat Memori Dengan Contoh Nyata
Generator dan hasil Python dijelaskan dengan kode yang kami jalankan: bagaimana mereka menjeda dan melanjutkan, mengukur penghematan memori, saluran…
Baca artikel →Kecerdasan buatanApa itu Embedding? Kesamaan Vektor dan Kosinus Dijelaskan Secara Sederhana
Apa itu embeddings? Panduan bahasa sederhana tentang vektor, kesamaan kosinus, dan penelusuran semantik, dengan contoh kecil yang kami jalankan, pen…
Baca artikel →DevOpsPenerapan Biru-Hijau vs Canary: Perbedaan, Kompromi, dan Cara Memilih
Penjelasan penerapan blue-green vs canary: cara kerja masing-masing, biaya, risiko dan rollback, pengelompokan pengguna stabil yang kami uji, migras…
Baca artikel →Otomatisasi pengujianTes Tidak Stabil: Apa Penyebabnya dan Cara Memperbaikinya untuk Kebaikan
Pengujian yang tidak stabil dijelaskan dengan demo yang kami jalankan: penyebab utama, cara mengonfirmasi dan mendiagnosisnya, perbaikan waktu yang …
Baca artikel →Pengujian perangkat lunakLoad Testing vs Stress Testing: Perbedaan, Metrik dan Contoh k6
Penjelasan pengujian beban vs pengujian stres: apa yang dibuktikan masing-masing, pengujian lonjakan dan rendam, metrik yang penting, mengapa rata-r…
Baca artikel →Pengujian perangkat lunakKasus Uji vs Skenario Uji: Perbedaan Utama, Contoh, dan Kapan Menggunakan Masing-masing
Penjelasan kasus uji vs skenario pengujian: definisi yang jelas, tabel berdampingan, satu fitur pengaturan ulang kata sandi yang diambil dari skenar…
Baca artikel →Basis data & SQLOptimasi Kueri SQL: Baca Rencana Eksekusi dan Perbaiki Kueri Lambat, Dengan Pengaturan Waktu
Pengoptimalan kueri SQL diuji pada sejuta baris: membaca rencana eksekusi, menambahkan indeks yang tepat, memperbaiki filter yang tidak dapat disarg…
Baca artikel →Basis data & SQLSQL UNION vs UNION ALL: Perbedaan, Contoh dan Kinerja Diuji
SQL UNION vs UNION ALL dijelaskan dengan kueri yang kami jalankan: duplikat, aturan yang diikuti keduanya, bug data nyata, kinerja terukur, INTERSEC…
Baca artikel →Pengembangan perangkat lunakTutorial API Pengambilan JavaScript: GET, POST, Penanganan Kesalahan, dan Batas Waktu
Tutorial JavaScript Fetch API diuji pada server lokal: GET dan POST, mengapa 404 tidak muncul, bantuan yang dapat digunakan kembali, string kueri, b…
Baca artikel →Pengembangan perangkat lunakPenanganan File Python: Baca, Tulis, CSV, JSON dan pathlib Dengan Contoh
Penanganan file Python dijelaskan dengan kode yang kami jalankan: mode terbuka, dengan, membaca file besar, CSV, JSON, pathlib, file biner, penulisa…
Baca artikel →Pengembangan perangkat lunakKelas dan Objek Python: Tutorial OOP Dengan Contoh Nyata
Kelas dan objek Python dijelaskan dengan kode yang kami jalankan: __init__, metode, atribut kelas vs instance, warisan, properti, metode dunder, kel…
Baca artikel →Kecerdasan buatanApa Itu Model Bahasa Besar? Bagaimana LLM Bekerja, Dijelaskan Tanpa Hype
Apa yang dimaksud dengan model bahasa besar? LLM dijelaskan dalam bahasa sederhana: token, penyematan, perhatian, pelatihan, jendela suhu dan kontek…
Baca artikel →DevOpsPerintah Linux untuk Pemula: Panduan Terminal Penting Dengan Contoh
Perintah Linux untuk pemula, dikelompokkan berdasarkan tugas: navigasi, file, melihat log, grep, pipa, izin, proses dan arsip, dengan contoh analisi…
Baca artikel →Otomatisasi pengujianSelenium vs Penulis Drama: Perbedaan Utama, Perbandingan Kode, dan Mana yang Harus Dipilih
Selenium vs Playwright dibandingkan: arsitektur, menunggu, dukungan browser dan bahasa, debugging, pengujian yang sama di kedua alat, saran migrasi …
Baca artikel →Pengujian perangkat lunakPartisi Ekivalensi: Teknik Desain Tes Dijelaskan Dengan Contoh yang Dikerjakan
Penjelasan partisi ekivalensi: cara menemukan partisi yang valid dan tidak valid, contoh yang berfungsi untuk usia, kata sandi dan kupon, pengujian …
Baca artikel →Pengujian perangkat lunakSeverity vs Priority dalam Pengujian Perangkat Lunak: Perbedaan, Matriks dan Contoh Nyata
Keparahan vs prioritas dalam pengujian perangkat lunak dijelaskan: definisi yang jelas, matriks empat arah dengan contoh, skala level, siapa yang me…
Baca artikel →Basis data & SQLTutorial Subkueri SQL: Jenis, Subkueri yang Berkorelasi, dan ADA Dengan Contoh
Tutorial subkueri SQL dengan kueri yang kami jalankan: subkueri skalar, IN, FROM dan SELECT, subkueri yang berkorelasi, EXISTS, jebakan NOT IN NULL …
Baca artikel →Basis data & SQLPenjelasan Transaksi SQL dan ACID: COMMIT, ROLLBACK dan Tingkat Isolasi
Transaksi SQL dan ACID dijelaskan dengan transfer bank yang kami jalankan: COMMIT, ROLLBACK, savepoint, kunci, tingkat isolasi, pembacaan kotor, keb…
Baca artikel →Pengembangan perangkat lunakGit merge vs rebase: perbedaan, contoh, dan kapan memakai masing-masing
Git merge vs rebase dijelaskan dengan keluaran log nyata, tabel perbandingan, aturan emas rebase, dan alur kerja tim yang aman.
Baca artikel →Pengembangan perangkat lunakList Comprehension Python: Sintaks, Contoh, dan Kapan Harus Dihindari
List comprehension Python dijelaskan: sintaks, filter, if-else, perulangan bersarang, waktu yang diukur, dan kapan perulangan for biasa lebih baik.
Baca artikel →Basis data & SQLPenjelasan SQL JOIN dengan Contoh (Inner, Left, Right, Full)
Pahami SQL JOIN langkah demi langkah dengan tabel dan query contoh: INNER, LEFT, RIGHT, FULL, CROSS, dan SELF, plus kesalahan umum dan tips performa.
Baca artikel →