Jika Anda mengunjungi toko kami lebih sering dari sekali setahun untuk barang-barang olahraga atau pakaian, kemungkinan besar Anda memiliki kartu klub kami (biru, perak atau emas). Nama saya Maxim, saya adalah wakil direktur departemen pengembangan, implementasi, dan pemeliharaan perangkat lunak, dan dalam posting ini kami akan berbicara dengan kolega tentang pendirian program klub Sportmaster, tentang koleksi rake yang kami kumpulkan dalam proses dan bagaimana program klub kami berbeda dari kartu diskon yang biasa digunakan orang lain jaringan perdagangan.

Lalu
Tahun 2004 berada di halaman. Apa yang terjadi adalah program klub Sportmaster dan masing-masing 27 rubel. Apa yang tidak - Internet normal di lapangan dan saluran komunikasi yang stabil di toko-toko.
Pada tahun-tahun itu, kami sendiri menulis sistem loyalitas yang biasanya dapat melacak poin bonus masing-masing pengguna. Tetapi karena kami sudah memiliki banyak toko, berbeda dengan fasilitas pemrosesan data, seluruh basis data bonus kami terletak di satu file, yang hanya dikirim ke toko dan dilayani secara lokal, dan perubahan untuk hari itu dikembalikan. Ngomong-ngomong, ini adalah alasan utama bahwa bonus dapat dihabiskan hanya sehari setelah pembelian, dan bukan persyaratan bisnis dan ketentuan pengembalian pelanggan - pada siang hari semua ini tidak punya waktu untuk diperbarui dan diceritakan dengan benar.
Dengan kata lain, pada saat itu bonus dapat mulai bekerja dan secara umum hari kelima - sampai tabel ini dengan bonus yang baru dihitung mencapai semua toko.
Kartu-kartu itu sendiri bekerja cukup sederhana - masing-masing kartu hanya mengakumulasikan sejumlah bonus yang bisa dihabiskan pemiliknya dengan gembira dan penuh perasaan. Artinya, untuk pangkalan itu terlihat sederhana, secara kasar, satu kartu - satu digit. Dengan kartu emas itu sedikit lebih rumit - di sana, selain jumlah dengan bonus, ada juga poin layanan. Ini adalah ketika Anda membeli sepeda, dan setelah enam bulan Anda ingin mengencangkan rantai, memeriksa rem, bel mulai menghangatkan jiwa Anda dan menakut-nakuti orang yang lewat dan seterusnya (atau mempertajam sepatu roda untuk musim baru dan memperbaiki papan seluncur salju, misalnya).
Pada saat yang sama, bonus dihitung menggunakan kemampuan solusi berdasarkan kecerdasan alami - kami memiliki karyawan khusus yang menulis pilihan dan membuat pilihan, kemudian menambahkan bonus dalam piring khusus, dan sistem menarik pelat ini ke atas. Dan ya, jika orang ini tiba-tiba memutuskan untuk bersorak sedikit atau apa lagi - beberapa pelanggan dapat dibiarkan tanpa bonus di hari-hari sulit ini.
Tentu saja, situasi ini cukup mahal untuk bisnis, dan memang berbahaya dan tidak dapat diprediksi, dan bisnis ingin mentransfer sistem ke rel normal (otomatis).
Pertama, kami memutuskan untuk mempelajari pasar. Kami menyadari bahwa ada beberapa sistem luar biasa dengan fitur hebat dan label harga yang lebih unggul daripada fitur ini. Apalagi dengan sistem perizinan seperti itu, yang menurutnya seharusnya mengumpulkan suap tidak hanya untuk penggunaan kapasitas atau untuk perangkat lunak itu sendiri, tetapi untuk setiap pengguna aktif dalam sistem bonus semacam itu. Apa yang tidak bisa tidak tetapi bersukacita penulis sistem. Tapi bisnis kami sedih.
Masalah kedua adalah fakta bahwa dengan pertumbuhan basis pelanggan dan jumlah toko, ada situasi di mana basis yang semakin besar harus dikirim ke semakin banyak toko. Dan suatu hari, pangkalan ini berhenti merangkak melalui saluran komunikasi yang ada. Itu juga ditinjau di semua toko dalam waktu singkat dengan derit besar.
Pangkalan tidak punya waktu untuk berbelanja, kadang-kadang karena ini toko lupa untuk memperbaruinya, dan mereka mendapat bubur jujur โโ- di toko Seseorang membeli sesuatu yang bermanfaat dan menerima bonus, dan toko B setelah beberapa hari masih tidak sadar bahwa seseorang dapat dan mengurangi bonus dari pembelian baru.
Dan kemudian Alexander Afanasyev
(sekarang direktur TI perusahaan lain) menemukan cara untuk melakukan semua ini sendiri tanpa membeli perangkat lunak pihak ketiga. Saya mengumpulkan dari bisnis sejumlah persyaratan untuk sistem ini di pihak mereka dan mendaftarkan peluang baru. Pada awalnya itu hanya dalam bentuk fitur yang menyenangkan - misalnya, sekarang bonus bukan hanya satu angka, tetapi sistem yang kompleks. Anda dapat memberikan bonus kepada seseorang untuk ulang tahun, Anda dapat secara terpisah memberikan bonus hanya pada peralatan ski dan produk terkait, Anda dapat menawarkan bonus hanya pada produk merek Columbia dan pada periode waktu tertentu - dan semua ini, kombinasikan, kombinasikan, kombinasikan.
Untungnya, perkembangan jaringan telah mencapai titik di mana Internet telah muncul hampir di mana-mana, dan itu mungkin untuk membawa solusi online. Yaitu, skema kerjanya menjadi seperti ini - ada toko dengan saluran jaringan yang stabil, ia menghubungi basis data untuk sisanya (dan sekarang database adalah yang paling segar dan paling enak), mengambil sisa bonus dari database dan bekerja dengannya. Dan semua ini, sementara pembeli dengan senang hati berkomunikasi dengan penjual yang ramah.
Masalah ketiga adalah kinerja operasi pembakaran bonus. Kami memiliki hal yang sama - Anda bisa mendapatkan poin sepanjang tahun dengan sungguh-sungguh, tetapi pada tanggal 1 Maret mereka selalu terbakar habis jika Anda tidak berhasil membelanjakannya.
Versi pertama dari sistem (disebut CARD) biasanya dapat memperhitungkannya, tetapi ketika beralih ke mode instalasi insinerator bonus, masalah dimulai. Bagaimanapun, bonus pembakaran adalah bagian penuh melalui seluruh basis dengan perubahan. Mengingat ukuran pangkalan, ini bisa memakan waktu 3-4 hari. Dan dalam prosesnya, dia sangat melambat dan bodoh, karena itu kadang-kadang bonus terganggu, dan ternyata di beberapa toko, Kamerad Petrov, yang datang untuk bola ping-pong baru, masih memiliki bonus, dan Sidorov, yang telah pergi untuk sayangnya, tidak ada yang bagus baru.
Versi baru dari sistem
Kami membuat prototipe di suatu tempat dalam 3-4 hari, lalu beberapa hari kami mengujinya dengan cek langsung. Ternyata sistem itu cukup fungsional untuk dirinya sendiri, dan Anda dapat menggunakannya untuk menghasilkan kondisi bonus yang berbeda dan menghasilkan teks komunikasi.
Ngomong-ngomong, tentang komunikasi - sejak awal kami membuatnya sehingga sistem loyalitas itu sendiri pada waktu yang tepat membentuk teks komunikasi dengan pelanggan, mengekstraksi poin bonus dari database, dan mengirimkannya ke pelanggan sendiri. Kami memiliki banyak pelanggan, jadi kami menggunakan penyedia pihak ketiga pada saat itu untuk mengirim SMS.
Interaksi dengan mereka berlangsung seperti ini:
- penyedia mengerti bahwa dia adalah klien utama, dan mulai bersukacita
- klien utama dalam bentuk kami menentukan apakah penyedia akan benar-benar menangani pengiriman seperti itu
- penyedia mengatakan bahwa itu akan dikuasai, tentu saja
- penyedia menerima tugas mengirim sejumlah besar SMS dalam waktu singkat dan memutuskan untuk berbaring
Jadi, soal prototipe. Pada prinsipnya, seluruh sistem diputuskan untuk direkayasa ulang, karena pada awalnya sistem ini diasah hanya untuk bonus, dan bukan untuk kerja online, sehingga diharapkan tidak lagi menangani pengembalian. Selain itu, jatuh, tentu saja, pada saat-saat beban tinggi. Artinya, pada waktu yang paling lezat untuk toko - Tahun Baru, 8 Maret, 23 Februari dan tanggal menyenangkan lainnya.
Sistem jatuh -> mood bisnis jatuh -> mood semua orang jatuh.
Bersama dengan seorang kolega, kami menulis ulang sistem sesuai dengan prinsip berikut.
Komponen 1. Preprocessing yang memberikan jawaban ke toko secepat mungkin.
Komponen 2. Pemrosesan, kotak ajaib yang sama, bonus kredit yang sulit dan cerdik pada cek komoditas.
Komponen 3. Pemasaran, mengumpulkan semua ini bersama-sama dan membentuk teks komunikasi.
Plus, kami memecahkan masalah membakar bonus. Sistem baru itu tidak membakar mereka. Lagi pula, jika Anda tidak memaksa sistem untuk membakar bonus - Anda tidak memiliki masalah dengan membakar bonus.
Dalam versi baru, sistem hanya menyimpan bonus dari masing-masing klien dalam database, tetapi pada beberapa titik waktu berhenti menganggapnya aktif. Artinya, sekarang selalu ada bonus, tetapi masing-masing dengan periode aktivitasnya sendiri. Yang, secara kebetulan, memungkinkan pengenalan promosi dan kampanye yang lebih akurat dan lebih mendesak.
Sistem lama sebenarnya hanya menyimpan catatan kartu dan bonus pada kartu ini. Sistem baru tidak memprioritaskan kartu, tetapi akun seseorang. Kami dapat mengidentifikasinya berdasarkan nomor telepon (hal ini berlaku untuk kami sejak awal, kami adalah salah satu yang pertama yang menerapkan otorisasi berdasarkan nomor telepon).
Fitur tambahan dari sistem baru ini adalah apa yang disebut bonus produk, kerjanya seperti ini:
- setiap produk memiliki atribut (nama, kategori produk, ukuran, warna, olahraga, lainnya, lainnya, lainnya).
- sistem menggabungkan atribut-atribut ini, membentuk kondisi logis untuk memperoleh bonus.
- ketika cek tiba, kondisi ini selalu diperiksa.
Kami menunjukkan prototipe ini dalam pekerjaan bisnis. Bisnis memberi lampu hijau.
Kami mulai menulis sistem pada 1 Maret, mulai beroperasi pada 27 Oktober 2013 (kami menulis bersama, ya). Bahkan, tanggal pengiriman yang direncanakan adalah 1 September, tetapi rekanan utama sistem tidak memiliki waktu - toko ritel. Toko tidak punya waktu karena sejumlah alasan, plus tidak semua orang memperbarui perangkat lunak mesin kasir (dan memperbarui perangkat lunak mesin kasir pada jaringan yang agak besar masih menyusahkan). Karena itu, mereka menunda, menunggu, dan mulai pada 27 Oktober.
Ideologi sistem
Mereka meletakkan ide utama - baik toko, maupun perangkat lunak mesin kasir tidak lagi berfungsi dengan logika bonus. Toko sekarang hanya mengirimkan keranjang pelanggan ke Center, Center memproses semuanya, memberi toko perhitungan bonus.
Sekarang bonus tersebar seperti ini:
- Pertama-tama, bonus tersebar di seluruh cek secara merata, untuk semua barang komoditas. Ini berguna untuk analitik, dan membantu dalam hal pengembalian barang.
- Kami memperkenalkan konsep bonus prioritas. Bonus adalah komoditas, ada bonus untuk ulang tahun, yang memiliki masa berlaku pendek, ada yang reguler (paling ulet). Karenanya, pertama-tama kami menghapus bonus tertentu. Artinya, seseorang datang untuk bermain ski - kita terutama akan menghapus bonus yang dia miliki di alat ski. Dan ternyata dia datang untuk bermain ski, kami menghapus bonus reguler. Seminggu kemudian dia akan datang untuk jaket, dan kami akan memberinya seorang pria, Anda hanya memiliki bonus untuk bermain ski. Anda ingin main ski? Hal yang sama dengan pembelian selama periode ulang tahun, pertama-tama hapuskan, dan kemudian yang teratur.
- Kami menjalankan kembali operasi kantor dan bagian depan. Sekarang, toko yang datang dengan permintaan tidak memengaruhi pekerjaan dan kinerja layanan yang menghitung bonus, dan sebaliknya
Secara umum, itu mungkin untuk menyumbat semua masalah lama, dan bukannya masalah baru menambahkan fitur baru.
Alih-alih menumpuk, kami memiliki notebook Alexander ini.


Meluncurkan versi baru dari sistem
Karena sistem baru berbeda dari yang lama tidak hanya secara teknis, tetapi juga secara ideologis, kami tidak dapat menggelindingkannya entah bagaimana sebagian, ke setengah dari toko atau entah bagaimana. Kami hanya harus mematikan yang lama dan menyalakan yang baru.
Kedengarannya bagus, tetapi sebenarnya ada beberapa keterbatasan.
Pertama, karena banyaknya toko (1200+), kami harus melakukan semuanya dalam 3 jam. Sementara satu toko tutup pada tengah malam di satu zona waktu, yang lain memiliki waktu yang sama sekali berbeda, dan kemudian ada juga toko serba ada. Secara umum, untuk mengonversi semua data dari sistem lama, masukkan yang baru, mulai dari tiga server sekaligus - 3 jam.
Perangkap seperti ini:
- Sistem langsung terpotong di seluruh jaringan. Jika semuanya baik di mana saja - semuanya berfungsi di seluruh jaringan. Jika sesuatu jatuh, ya, itu jatuh di seluruh jaringan.
- Ketika Anda menghidupkan sistem baru, itu harus berisi semua data yang ada di sistem lama pada saat toko ditutup dan bonus terbaru dikeluarkan. Kami diluncurkan ke 4 negara sekaligus. Basis data lebih dari satu terabyte dan menyimpan ratusan miliar catatan.
- Pukul 23.00 kami harus mematikan sistem. Konversi segalanya. Tuang ke dalam sistem baru. Sertakan semuanya. Dalam hal ini, semuanya harus berfungsi.
Kami dilatih untuk waktu yang lama, tergantung pada skrip yang paling memanjakan. Setelah tes panjang dan upaya untuk melakukan semuanya secepat mungkin, kami mencapai hasil terbaik pada jam 9.
Yang sedikit berbeda dari angka yang direncanakan 3 jam.
Kemudian kami memutuskan untuk terlebih dahulu melakukan preprocessing, yang menyimpan sisa-sisa dalam diri kita. Mengangkat server utama, ia menghubungi toko-toko. Pada saat yang sama, dia tidak tahu bahwa seluruh sistem belum bangkit, dan pada saat itu kami dengan berani menggulirkan semua yang lain.
Namun demikian, volume data seperti itu pada mesin standar tidak dapat dilakukan pada waktu yang tepat.
Dan di sini perlu dicatat Oracle Exadata. Orang-orang dari Oracle membuat perangkat keras khusus yang bekerja sangat baik dengan database sendiri, dan bahkan pada flash drive. Secara umum, keputusan yang kuat dibuat untuk menggunakan Exadata. Dengan bantuannya pada tes, kami menguasai melakukan semua yang Anda butuhkan dalam 2 jam, bukan 9 dan menyadari - kami perlu menerimanya.
Karena kami adalah orang-orang yang sangat teliti, dalam proses mengatur dan bekerja, kami mengumpulkan banyak bug dan gagal mendapatkan dukungan dari Oracle dengan selisih. Sebagai contoh, ada satu bug yang menarik - karena kesalahan dalam pemrosesan internal permintaan, Oracle mulai mengkonsumsi TEMP secara intensif. Kami memperhatikan hal ini tepat waktu, dan melemparkannya file TEMP'ovyh, sangat menarik ketika ia mabuk. Tetapi karena potongan besi itu ternyata sangat masuk akal dan luas, dia menggunakan 3 Tb TEMP dengan perasaan selama 10 menit, menyadari bahwa dia sudah tidak ada lagi, dan pergi tidur. Saya harus menemukan solusi.
Di satu sisi, itu keren bahwa semuanya dalam hal konversi kami lakukan dalam 2 jam. Di sisi lain, dalam seluruh proses konversi bersih, 2 jam, dan kami juga merencanakan:
- muat ulang semua data dari server sistem lama ke exadata, karena ini menghitung semuanya dengan sangat cepat.
- Konversi data dari struktur lama ke yang baru.
- Tuangkan semua ini dikonversi menjadi tiga server yang berbeda.
Pada saat yang sama, di setiap basis data ada banyak informasi layanan yang berguna seperti indeks yang sama yang dapat membantu selama pembangunan kembali, tetapi kami menilai hal ini dan memutuskan untuk membangun kembali semuanya lagi di server pertempuran.
Persiapan
Kami siap dengan kekuatan dan main. Kami sedang tidur di tempat kerja. Kami menggantung diri tidak hanya dengan skrip, tetapi juga dengan banyak metrik.
Pukul 23.00 setiap hari kami memulai proses dan memantau metrik. Kami melakukan perubahan yang diperlukan, sebagai hasilnya, kami mengatur semuanya sehingga tidak ada yang salah sama sekali.
Tentu saja, pada hari peluncuran ada yang tidak beres.
Demi kehormatan kami, cant tidak ada di pihak kami. Di suatu tempat jaringan itu berkedip bodoh. Artinya, Anda duduk sendiri seperti itu, Anda menyesuaikan semuanya sehingga nyamuk tidak hanya merusak hidungnya, tetapi bahkan tidak punya waktu untuk memikirkannya - dan di suatu tempat, seseorang hanya menarik kabel yang salah.
Bagaimanapun, kami berhasil memulai server pertama tepat waktu. Batas waktu umum adalah jam 5 pagi, pada saat ini semua server harus ceria dan ceria, karena toko pertama di Timur Jauh buka pukul 10 tepat pada waktunya.
Jadi server terakhir dimulai pukul 11 โโpagi. Tetapi karena kami membangun sistem sedemikian rupa sehingga semuanya terisolasi, semuanya bekerja dengan baik.
Sekarang
Saat ini, 14 pengembang dan 8 analis sedang mengerjakan sistem klub. Mengingat semua barang yang kami mainkan, ini bukan lagi kartu yang memberi Anda sejumlah bonus yang tersedia untuk belanja di toko.
Kami mulai menggabungkan bonus sepenuhnya. Kriteria utama untuk kombinasi yang sukses untuk sistem adalah manfaat maksimum bagi pembeli. Mungkin ada banyak utilitas dan promosi, misalnya:
- pengguna telah mengumpulkan sejumlah bonus reguler;
- ditambah sekarang periode ketika ada tindakan pada merek tertentu;
- plus sekarang diskon juga pada grup produk dan subkelompok produk tertentu;
- dan mungkin juga ada diskon di kota tertentu atau di toko tertentu.
Kami menulis algoritme yang menerima cek dari toko, memeriksa item produk dalam cek, menerapkan semua kemungkinan promosi dan diskon pada tanggal dan kota tertentu, dan memberikan hasil yang paling bermanfaat bagi pengguna. Lalu dia mengembalikan semuanya ke toko. Dan masih ada arah pengembangan:
- Pengembangan mekanisme untuk meluncurkan kampanye pemasaran multi-arah yang kompleks, termasuk pengiriman surat, pemberian bonus, diskon, dan penawaran personalisasi untuk klien
- Koneksi saluran komunikasi baru, seperti pengirim pesan instan, jejaring sosial, dll.
Seorang klien yang bersyukur pada saat ini dapat mengingat bahwa ia juga ingin membeli kaus kaki, dan meminta untuk menambahkannya ke cek. Tentu saja, menambahkan kaus kaki (atau apa pun) membutuhkan penghitungan ulang yang lengkap.
Tapi kami juga akan menangani ini. Dan di salah satu posting di masa depan kami akan menceritakan kisah penciptaan situs Sportmaster.