Proyek Lingualeo sudah berumur 10 tahun. Lebih dari 23 juta orang dari Rusia, Turki, Spanyol, dan Amerika Latin belajar bahasa Inggris menggunakan layanan kami.
LinguaLeo dibuat pada akhir 2000-an dan awal 10-an dan menggunakan teknologi dan metode paling canggih pada saat itu. Tapi waktu berlalu, dan mereka menjadi sangat ketinggalan jaman. Jadi kami memutuskan sudah waktunya untuk memperbarui sistem.
Kami meminta pemimpin pengembangan backend kami, Oleg Pravdin, untuk berbicara tentang bagaimana dia dan timnya, secara paralel dengan dukungan produk utama, menyusun struktur layanan modular baru berdasarkan PostgreSQL, mentransfer logika bisnis ke database dan bermigrasi dengan jutaan pengguna.
Masalah produk yang matang
“Saya datang ke Lingualeo pada Agustus 2018 untuk memimpin pengembangan backend. Saat itu, dukungan dilakukan oleh tim yang terdiri dari 8 pengembang dan 2 admin, yang mempertahankan monolit 1 juta baris kode, sebagian besar dalam PHP. Perlu waktu 2 bulan untuk menerapkan fitur baru yang kecil sekalipun. Dan biaya infrastruktur per 10.000 pengguna aktif melebihi $ 1.000 per tahun.
Bagaimana ini bisa terjadi? Faktanya adalah bahwa selama 10 tahun beberapa tim pengembangan telah berubah dalam proyek tersebut. Orang baru datang, seperti saya, mereka menambahkan modul dan fitur baru dengan cara mereka sendiri. Tim berubah, pendatang baru tidak selalu memahami cara kerja bagian lama sistem, akibatnya, kode Lingualeo secara bertahap berubah menjadi kotak hitam: logika buram di bagian belakang, bagian depan yang kelebihan beban, banyak kruk, celah besar dalam dokumentasi.
Secara total, kami memiliki 20 pengembang di staf kami, tetapi tidak mungkin untuk mengembangkan produk: jika ada sesuatu yang ditambahkan, masalah tak terduga muncul. Tim butuh waktu 2-3 minggu untuk memperbaiki semuanya. Pengembang mempertahankan kode dari 2013, dan tidak ada sumber daya untuk memperbarui fungsionalitas.
Ini adalah tantangan yang dihadapi oleh sejumlah besar perusahaan yang mengembangkan produk TI yang matang yang ditulis dalam teknologi dari satu dekade lalu. Tren berubah, tetapi karena arsitektur lama, tidak semua item baru dapat digunakan.
Produk berkembang dan menjadi penuh dengan fungsi, tetapi mereka tidak punya waktu untuk mendokumentasikannya secara rinci. Masalah ini diselesaikan dengan cara yang berbeda, tetapi kami memutuskan dengan cara ini: Anda perlu membangun sistem baru dari awal dan mempertahankan logika produk maksimum sehingga pengalaman pengguna di Lingualeo tidak berubah.
Langkah 1. Merakit prototipe arsitektur baru
Kami harus memikirkan cara memperbarui komponen teknis layanan dan membangun kembali Lingualeo menggunakan teknologi modern. Saya menyarankan kepada manajemen untuk sepenuhnya mengubah filosofi backend: transfer logika bisnis ke database, dan ganti database MySQL dengan PostgreSQL.
Saya mulai dengan prototipe di atas kertas: Saya menggambar arsitektur baru, menjelaskan bagaimana saya dapat meningkatkan kinerja dan berapa banyak sumber daya yang diperlukan untuk mempersiapkan. Sulit untuk melindungi proyek, karena tidak ada kisah sukses yang jelas: tidak ada yang menulis tentang cara memigrasi layanan dengan 20 juta pengguna tanpa menghentikan bisnis. Tetapi Lingualeo memutuskan untuk mengambil risiko dan menyetujui rencana perubahan tersebut.
Diagram arsitektur pra-migrasi
PHP, , MySQL . JSON
SQL PostgreSQL, JSON. -, , JSON
2.
Saat kami membagikan rencana kami dengan pengembang, terlihat jelas bahwa tim belum siap untuk perubahan. Sebagian besar orang meninggalkan perusahaan: hanya mereka yang datang baru-baru ini yang tersisa. Untuk melakukan migrasi, kami memutuskan untuk menyusun kembali tim pengembangan.
Kami mencari ambisius dan siap untuk perubahan, profesional dan bertanggung jawab. Kami mencoba memperhatikan tidak hanya kualitas kode, tetapi juga soft skill. Kami sedang membangun kembali arsitektur layanan, jadi kami membutuhkan orang-orang yang tidak akan takut dengan proyek yang rumit dan akan siap untuk menyelesaikan masalah yang belum pernah mereka hadapi sebelumnya.
Beberapa orang ditemukan secara kebetulan, seperti saya, misalnya: Saya bertemu dengan CEO Lingualeo Vladimir Sirotinsky di pesawat. Vladimir bertemu pemimpin front-end masa depan pada konsultasi dengan startup lain. Tapi kami merekrut sebagian besar pengembang baru dari pasar. Untuk mengisi 8 lowongan, kami mempelajari 1.118 aplikasi dan melakukan 124 wawancara:
Corong kandidat untuk lowongan developer baru di Lingualeo.
Langkah 3. Menyederhanakan struktur organisasi
Kami memiliki tiga area pengembangan: web, backend, dan aplikasi seluler, kami juga memiliki departemen penguji. Menemukan seseorang yang memahami semua industri sekaligus sangatlah sulit dalam waktu singkat. Oleh karena itu, kami memutuskan untuk meninggalkan direktur teknis dan membuat struktur organisasi tim baru serata mungkin. Perusahaan hanya memiliki satu tingkat manajemen yang tersisa - satu pemimpin di setiap arah.
Kami mengadakan pertemuan rutin dan berkomunikasi secara langsung, sehingga perkembangan menjadi lebih dapat diprediksi, kerangka waktu telah berkurang. CTO dapat membuat keputusan yang tidak rasional, seperti salah mengalokasikan tanggung jawab antar tim. Dalam sistem di mana pemimpin berkomunikasi tanpa lapisan manajer tambahan, kemungkinan keputusan irasional berkurang: kita selalu dapat mendiskusikan masalah apa pun dalam percakapan pribadi.
Misalnya, jika saya memahami bahwa akan lebih logis untuk mengimplementasikan fungsi dalam struktur baru di database, dan bukan di depan, saya menulis ke obrolan dan mendiskusikan ide dengan pemimpin front-end. Tidak perlu membuat janji dengan CTO atau menyiapkan presentasi untuk mendukung ide Anda.
Struktur organisasi sebelum dan sesudah perubahan: kami menghentikan CTO dalam pengembangan dan menyederhanakan struktur di departemen produk. Saat ini, seorang desainer produk tidak perlu berkomunikasi dengan dua tingkat manajer untuk mendapatkan ide ke depan.
Langkah 4. Logika bisnis yang ditransfer ke database
Sebelumnya, logika bisnis Lingualeo berada di depan dan dalam aplikasi. Fungsi produk diselesaikan oleh sistem yang tidak dirancang untuk memproses data, misalnya, dalam kode JavaScript atau PHP. Oleh karena itu, kami telah memindahkan logika bisnis Lingualeo ke database PostgreSQL.
Hutan
Salah satu dari 4 bagian utama dari layanan Lingualeo adalah Hutan . Ini adalah sekumpulan materi dalam bahasa asing - teks, audio dan video - di mana Anda dapat mengenali terjemahan untuk kata apa pun. Artinya, pengguna mempelajari konten nyata dalam bahasa Inggris, dan jika ada sesuatu yang tidak jelas, mereka dapat mengklik kata dalam teks atau subtitle untuk video dan melihat terjemahannya.
Teks di Video Hutan
di Hutan
Agar fungsi penerjemahan kata dengan sekali klik berfungsi, teks harus dibagi menjadi kata, ekspresi, dan frasa. Kemudian - lihat kamus dan tampilkan terjemahannya di jendela baru melalui teks kepada pengguna. Agak sulit untuk memecah teks untuk terjemahan: ada ekspresi tetap dan kata kerja frasa yang tidak masuk akal untuk dibagi menjadi dua kata. Misalnya, take off and take adalah unit konten yang berbeda, meskipun mereka menyertakan kata yang sama.
Semua logika fungsi ini, bersama dengan pengecualian dan aturan pembagian teks kompleks, sebelumnya ditulis dalam JavaScript di bagian depan. Fungsinya sangat rumit dan terjemahannya bisa memakan waktu lama.
Kami telah mengimplementasikan fitur ini di database. Backing mengirim JSON yang sudah jadi ke depan, yang teksnya sudah dipecah menjadi kata dan ekspresi. Setiap kata dan ekspresi dalam database diberi ID, yang memudahkan untuk menemukan terjemahan. JSON juga memperhitungkan kata mana yang dimiliki pengguna di kamus, dan mana yang belum. Di depan, yang tersisa hanyalah menampilkan informasi dan menyoroti kata-kata dengan tanda-tanda tertentu.
Kamus
Kami melakukan hal yang sama dengan Kamus bagian : semua pekerjaan sekarang berlangsung dalam database. Kami memiliki pengguna yang memiliki lebih dari 100.000 kata dan ungkapan dalam kamus mereka. Dalam kamus, Anda perlu menyediakan pencarian yang mudah, membagi kata ke dalam kelompok, dan memberi pengguna berbagai filter.
Sebelumnya, logika kamus berada di sisi depan atau di lapisan PHP, tetapi sekarang sistem memiliki API lengkap antara front dan backend. Anda dapat mengirim satu permintaan dengan sejumlah besar parameter ke database, dan JSON yang sudah jadi akan datang dari sana:
Filter kamus: cari berdasarkan kata, pilihan kata berdasarkan jenis pelatihan, pilihan antara kata dan frasa, filter berdasarkan kata yang dipelajari dan baru
Kursus
Transfer logika bisnis ke database secara signifikan mengurangi jumlah kode dan mempercepat layanan. Misalnya, kode backend halaman Kursus berubah setelah migrasi. Itu dilihat oleh pengguna terdaftar, dan kursus di sana dipilih oleh sistem sesuai dengan sepuluh kriteria. Sebelumnya, halaman seperti itu dibentuk selama 600 ms dan mengirim 12 permintaan ke database, sekarang hanya ada satu:
Langkah 5. Pertimbangkan umpan balik pengguna setelah rilis
Perlu waktu sekitar enam bulan untuk mengembangkannya: kami mulai memperbarui pada akhir 2018, dan perilisannya dilakukan pada Mei 2019. Sebagian besar pengguna merasa bahwa layanan mulai bekerja lebih cepat. Sebelumnya, Lingualeo dapat melatih tidak lebih dari 2.000 orang secara bersamaan tanpa kehilangan kecepatan, tetapi sekarang sistem tersebut dapat menahan lebih dari 100.000 pengguna.
Beberapa orang juga memperhatikan konsekuensi negatif. Bermigrasi dengan kotak hitam, sulit untuk memastikan keamanan seratus persen data, jadi beberapa dari mereka kehilangan kata-kata dari kamus, yang lain - kemajuan dalam kursus tidak ditampilkan dengan benar.
Secara bertahap, tim saya dan saya memperbaiki semua masalah. Hasil utama dari perubahan tersebut adalah bahwa sekarang kami bekerja bukan dengan kotak hitam, tetapi dengan sistem yang sederhana dan transparan, jadi lebih mudah untuk mengerjakan umpan balik.
Lingualeo
Pada April 2020, selama isolasi diri, beban di Lingualeo lima kali lebih besar dari periode yang sama tahun lalu. Ini tidak menimbulkan masalah: kecepatan layanan tidak turun, pengguna tidak melihat apa pun. Saya yakin jika kami tidak memperbarui sistem, layanan akan gagal begitu saja.
Produk ini tidak hanya lebih cepat bagi pengguna, tetapi juga lebih mudah digunakan: kini lebih mudah bagi tim untuk memperkenalkan dan menguji fitur baru. Kami telah merapikan dokumentasi, dan kodenya menjadi sekitar 40 kali lebih kecil, sehingga pengembang baru dapat dengan mudah mengetahui cara kerja layanan.
Produk menjadi lebih murah, jadi lebih sedikit daya komputasi yang perlu disewa untuk itu. Biaya per pengguna aktif di Lingualeo telah menurun lebih dari 50 kali lipat, meskipun jumlah pengguna aktif telah berlipat ganda setelah pembaruan.
Terakhir, produk lebih aman. Sebelumnya, ketika semua logika bisnis berada di lapisan PHP, permintaan ke database dikirim dari sana dari fungsi yang berbeda. Basis data yang terbuka untuk kueri SQL adalah masalah: Anda dapat membuat injeksi SQL dan memaksanya untuk mengeksekusi kode berbahaya, seperti menghapus data. Sekarang tidak ada satu pun kueri SQL yang berasal dari luar, karena kami telah memindahkan semua logika di dalamnya. "
Kami ingin terus secara teratur membuat blog tentang cara kerja pengembangan di Lingualeo yang diperbarui. Tulis di komentar apa yang perlu dibicarakan pertama kali: tim kami telah berubah, dan struktur manajemen, dan teknologi. Kami akan dengan senang hati menjawab semua pertanyaan Anda.