Di masa lalu, saya telah bekerja di berbagai lingkungan. Aplikasi desktop, game, barang yang disematkan, layanan web, pekerjaan baris perintah, situs web, pelaporan basis data, dan sebagainya. Semua lingkungan ini memiliki sifat yang sama: tidak masalah kompleksitasnya, tidak masalah ukurannya, saya selalu dapat memiliki subset atau potongan aplikasi pada mesin saya atau dalam lingkungan pengembang untuk diuji.
Hari ini saya tidak. Hari ini saya menemukan diri saya dalam lingkungan yang fokus utamanya adalah skalabilitas. Mereproduksi lingkungan sangatlah mahal. Mengambil sepotong lingkungan, sementara masuk akal (beberapa bagian perlu disimulasikan, atau digunakan dalam mode satu-contoh yang tidak dibuat untuk dilakukan), agak mengalahkan tujuan karena mengaburkan konkurensi dan memuat yang sistem nyata bertemu. Bahkan sistem "tes" kecil memiliki kekurangannya. Hal-hal akan berperilaku berbeda ketika Anda punya 2 node dan ketika Anda memiliki 64 node.
Pendekatan saya yang biasa untuk optimasi (mengukur, mencoba sesuatu, memverifikasi kebenaran, mengukur perbedaan, mengulangi) tidak benar-benar bekerja di sini karena saya tidak dapat secara efektif melakukan langkah 2 dan 3 untuk bagian-bagian dari masalah yang penting (ketahanan konkurensi dan kinerja di bawah beban). Skenario ini sepertinya tidak unik. Apa pendekatan umum untuk melakukan tugas semacam ini di lingkungan seperti ini?
Ada beberapa pertanyaan terkait:
sumber
Reproducing the environment is prohibitively costly.
- Berapa harga bug produksi yang terhenti? Bagaimana dengan 2 bug? Pada waktu yang tidak dapat diprediksi (kemungkinan besar ketika Anda memiliki mayoritas pengguna Anda memasukkan beban pada sistem pada saat yang sama). Timbang bahwa dengan biaya mendirikan lingkungan reproduksi minimal - Anda mungkin menemukan itu tidak terlalu mahal.prohibitively costly
.Jawaban:
Sebenarnya ini sulit, tapi saya yakin dalam banyak situasi yang sebanding itu terutama merupakan masalah organisasi. Satu-satunya pendekatan yang mungkin adalah campuran tindakan gabungan, bukan hanya "satu peluru perak". Beberapa hal yang dapat Anda coba:
logging: seperti yang saya tulis dalam komentar, waktu yang berlebihan dan logging sumber daya (yang merupakan semacam profiling) dapat membantu Anda untuk mengidentifikasi hambatan nyata dalam produksi. Ini mungkin tidak memberi tahu Anda jika implementasi alternatif akan bekerja lebih baik, tetapi pasti akan membantu Anda untuk menghindari mengoptimalkan bagian aplikasi Anda yang sepenuhnya salah.
uji apa yang dapat Anda uji sebelumnya - secara menyeluruh, dengan banyak perencanaan di muka. Tentu, hal-hal akan berperilaku berbeda dalam produksi, tetapi tidak semua hal. Kebenaran dari suatu implementasi yang berbeda seringkali dapat diperiksa sebelumnya - jika suatu implementasi berskala dengan baik, adalah pertanyaan yang berbeda. Tetapi perencanaan dapat banyak membantu. Berpikir keras tentang masalah yang dapat dipecahkan oleh lingkungan pengujian Anda untuk Anda, dan mana yang tidak. Hampir selalu ada hal-hal di mana Anda percaya pada pandangan pertama "itu tidak dapat diuji sebelumnya", tetapi jika Anda berpikir dua kali, sering kali lebih mungkin.
Bekerja sebagai tim. Saat mencoba pendekatan atau ide baru, diskusikan dengan setidaknya satu orang lain dari tim Anda. Saat Anda menerapkan algo yang berbeda, bersikeras tentang inspeksi kode dan QA. Semakin banyak bug dan masalah yang dapat Anda hindari sebelumnya, semakin sedikit masalah serius yang harus Anda selesaikan dalam produksi.
Karena Anda tidak dapat menguji semuanya sebelumnya, mengharapkan masalah muncul dalam produksi. Maka cobalah untuk menyiapkan strategi mundur yang sangat baik ketika membawa kode baru ke dalam produksi. Ketika kode baru Anda memiliki risiko beeing lebih lambat daripada solusi yang lama, atau jika memiliki risiko crash, pastikan Anda dapat mengubah ke versi ASAP sebelumnya. Jika memiliki risiko menghancurkan data produksi, pastikan Anda memiliki cadangan / pemulihan yang baik. Dan pastikan Anda mendeteksi kegagalan tersebut dengan menambahkan beberapa mekanisme validasi ke sistem Anda.
simpan buku harian proyek atau log solusi - dengan serius. Setiap hari Anda menemukan sesuatu yang baru tentang lingkungan, menuliskannya - kisah sukses serta kisah kegagalan. Jangan membuat kegagalan yang sama dua kali.
Jadi intinya adalah - ketika Anda tidak bisa menggunakan try-and-error, opsi terbaik Anda adalah konservatif, perencanaan awal yang klasik dan teknik QA.
sumber
Jika Anda tidak dapat mereproduksi lingkungan hidup, kenyataan yang tidak menyenangkan adalah bahwa apa pun yang Anda lakukan, itu tidak akan cukup diuji.
Jadi, apa yang bisa kamu lakukan?
Nah, apa pun yang harus skala, baik itu proses, cluster server atau volume database harus diuji dengan nol, satu, aturan tak terhingga dalam pikiran untuk mencari tahu di mana kemacetan potensial / keterbatasan adalah IO, CPU, beban CPU, antar -Proses komunikasi dll.
Setelah Anda memiliki ini, Anda harus merasakan apa jenis pengujian yang terpengaruh. Jika ini adalah unit testing, maka ini secara tradisional duduk dengan pengembang, jika itu adalah integrasi / pengujian sistem maka mungkin ada titik sentuh dengan tim lain yang mungkin dapat membantu dengan keahlian tambahan atau alat yang lebih baik lagi.
Berbicara tentang alat, sebenarnya bukan hak pengembang untuk memuat pengujian sistem di luar apa yang mungkin dalam lingkungan pengembangan mereka. Ini harus didorong ke departemen pengujian atau pihak ke-3 lainnya.
Gajah di ruangan itu tentu saja adalah bahwa sistem tidak selalu berskala dengan cara yang dapat diprediksi!
Dalam kehidupan sebelumnya, saya adalah DBA untuk database bank dengan miliaran baris dan dipersenjatai dengan rencana eksekusi yang secara umum dapat memprediksi berapa lama permintaan akan dilakukan pada database yang tidak digunakan mengingat volume input. Namun, setelah volume ini mencapai ukuran tertentu, rencana eksekusi akan berubah dan kinerja akan cepat memburuk kecuali permintaan / database disetel.
sumber
Saya menyarankan eksperimen.
Penebangan akan menemukan hambatan. Anda kemudian dapat mencoba implementasi alternatif pada beberapa mesin, atau bahkan pada semua mesin dengan probabilitas tertentu, atau untuk jangka waktu terbatas. Kemudian bandingkan lagi log untuk memeriksa peningkatan.
Ini adalah siklus ukuran percobaan-teori yang sama dengan yang biasa Anda gunakan, tetapi lebih mahal untuk dibuat - karena hipotesis harus dijalankan dalam produksi - dan tergantung pada volume Anda, menerima data signifikan dari produksi mungkin lambat juga.
sumber