مشروع Lingualeo هو بالفعل 10 سنوات. أكثر من 23 مليون شخص من روسيا وتركيا وإسبانيا وأمريكا اللاتينية يتعلمون اللغة الإنجليزية باستخدام خدمتنا.
تم إنشاء LinguaLeo في أواخر 2000 وأوائل 10s واستخدمت التقنيات والطرق الأكثر تقدمًا في ذلك الوقت. لكن الوقت مضى وأصبحوا عفا عليهم الزمن. لذلك قررنا أن الوقت قد حان لتحديث النظام.
طلبنا من قائد تطوير الواجهة الخلفية لدينا ، أوليج برافدين ، التحدث عن كيفية قيامه وفريقه ، بالتوازي مع دعم المنتج الرئيسي ، بتجميع هيكل خدمة معياري جديد قائم على PostgreSQL ، ونقل منطق العمل إلى قواعد البيانات وترحيله مع ملايين المستخدمين.
مشاكل المنتج الناضج
"جئت إلى Lingualeo في أغسطس 2018 لقيادة تطوير الواجهة الخلفية. في ذلك الوقت ، كان الدعم يقوم به فريق مكون من 8 مطورين ومسؤولين اثنين ، والذين احتفظوا بمجموعة من مليون سطر من التعليمات البرمجية ، معظمها بلغة PHP. استغرق الأمر شهرين لتنفيذ حتى ميزة جديدة صغيرة. وتجاوزت تكاليف البنية التحتية لكل 10000 مستخدم نشط 1000 دولار في السنة.
كيف حدث هذا؟ الحقيقة هي أنه على مدى 10 سنوات تغيرت العديد من فرق التطوير في المشروع. جاء أشخاص جدد ، مثلي ، أضافوا وحدات وميزات جديدة بطريقتهم الخاصة. تغيرت الفرق ، ولم يفهم القادمون الجدد دائمًا كيفية عمل الأجزاء القديمة من النظام ، ونتيجة لذلك ، تحول رمز Lingualeo تدريجيًا إلى صندوق أسود: منطق معتم في الواجهة الخلفية ، وجبهة مثقلة ، ووفرة من العكازات ، وفجوات كبيرة في التوثيق.
في المجموع ، كان لدينا 20 مطورًا في فريق العمل لدينا ، لكن كان من المستحيل تطوير المنتج: إذا تمت إضافة شيء ما ، فستظهر مشاكل غير متوقعة. استغرق الأمر من الفريق 2-3 أسابيع لإصلاح كل شيء. كان المطورون يحتفظون بالشفرة منذ عام 2013 ، ولم تكن هناك موارد لتحديث الوظيفة.
هذه هي التحديات التي يواجهها عدد كبير من الشركات التي تطور منتجات تقنية معلومات ناضجة مكتوبة بتقنيات منذ عقد مضى. تتغير الاتجاهات ، ولكن بسبب العمارة القديمة ، لا يمكن استخدام جميع العناصر الجديدة.
يتطور المنتج ويصبح متضخمًا بالوظائف ، لكن ليس لديهم الوقت لتوثيقها بالتفصيل. تم حل هذه المشكلات بطرق مختلفة ، لكننا قررنا بهذه الطريقة: تحتاج إلى بناء نظام جديد من الصفر والاحتفاظ بأكبر قدر ممكن من منطق المنتج حتى لا تتغير تجربة المستخدم في Lingualeo.
الخطوة 1. تجميع نموذج أولي للهندسة المعمارية الجديدة
كان علينا معرفة كيفية تحديث المكون الفني للخدمة وإعادة بناء Lingualeo باستخدام التقنيات الحديثة. اقترحت أن تغير الإدارة فلسفة الواجهة الخلفية تمامًا: نقل منطق الأعمال إلى قاعدة البيانات ، واستبدال قاعدة بيانات MySQL بـ PostgreSQL.
لقد بدأت بنموذج أولي على الورق: رسمت بنية جديدة ، وشرحت كيف يمكنني زيادة الأداء ومقدار الموارد التي سأحتاجها للتحضير. كان من الصعب حماية المشروع ، لأنه لم تكن هناك قصص نجاح واضحة في متناول اليد: لا أحد يكتب عن كيفية ترحيل خدمة بها 20 مليون مستخدم دون إيقاف العمل. لكن Lingualeo قررت المخاطرة ووافقت على خطة التغيير.
مخطط هندسة ما قبل الهجرة
PHP, , MySQL . JSON
SQL PostgreSQL, JSON. -, , JSON
2.
عندما شاركنا خططنا مع المطورين ، أصبح من الواضح أن الفريق لم يكن جاهزًا للتغييرات. غادر معظم الأشخاص الشركة ، ولم يبق منهم سوى الذين جاءوا مؤخرًا. لتنفيذ الترحيل ، قررنا إعادة تجميع فريق التطوير.
كنا نبحث عن طموح وجاهز للتغيير ، محترف ومسؤول. حاولنا الانتباه ليس فقط إلى جودة الكود ، ولكن أيضًا إلى المهارات الشخصية. كنا نعيد بناء بنية الخدمة ، لذلك كنا بحاجة إلى أشخاص لا يخافون من المشاريع المعقدة وسيكونون مستعدين لحل المشكلات التي لم يواجهوها من قبل.
تم العثور على بعض الأشخاص بالصدفة ، مثلي ، على سبيل المثال: التقيت بالرئيس التنفيذي لشركة Lingualeo Vladimir Sirotinsky على متن الطائرة. التقى فلاديمير بقائد الواجهة الأمامية المستقبلي في استشارة مع شركة ناشئة أخرى. لكننا قمنا بتوظيف معظم المطورين الجدد من السوق. من أجل ملء 8 وظائف شاغرة ، درسنا 1118 طلبًا وأجرينا 124 مقابلة:
مسار من المرشحين للوظائف الشاغرة للمطورين الجدد في Lingualeo.
الخطوة 3. تبسيط الهيكل التنظيمي
لدينا ثلاثة مجالات للتطوير: الويب والخلفية وتطبيقات الهاتف المحمول ، ولدينا أيضًا قسم من المختبرين. إن العثور على شخص يفهم جميع الصناعات في وقت واحد أمر صعب للغاية في وقت قصير. لذلك ، قررنا التخلي عن المدير الفني وجعل الهيكل التنظيمي للفريق الجديد مسطحًا قدر الإمكان. الشركة لديها مستوى إدارة واحد فقط - قائد واحد في كل اتجاه.
نعقد اجتماعات منتظمة ونتواصل بشكل مباشر ، لذلك أصبح التطوير أكثر قابلية للتنبؤ ، وتم تقليل الإطار الزمني. قد يتخذ CTO قرارات غير منطقية ، مثل سوء توزيع المسؤوليات بين الفرق. في نظام يتواصل فيه العملاء المحتملون بدون طبقة إضافية من المديرين ، تقل احتمالية اتخاذ قرارات غير عقلانية: يمكننا دائمًا مناقشة أي مشكلة في محادثة شخصية.
على سبيل المثال ، إذا فهمت أنه سيكون من المنطقي أكثر تنفيذ وظيفة في الهيكل الجديد في قاعدة البيانات ، وليس في المقدمة ، أكتب إلى الدردشة وأناقش الفكرة مع قائد الواجهة الأمامية. لا حاجة لتحديد موعد مع كبير التكنولوجيا أو إعداد عرض تقديمي لدعم فكرتك.
الهيكل التنظيمي قبل التغييرات وبعدها: قمنا بإسقاط مدير التكنولوجيا في التطوير وتبسيط الهيكل في قسم المنتجات. في الوقت الحاضر ، لا يحتاج مصمم المنتج إلى التحدث إلى مستويين من المديرين للحصول على فكرة في المقدمة.
الخطوة 4. نقل منطق الأعمال إلى قواعد البيانات
في الماضي ، كان منطق أعمال Lingualeo في المقدمة وفي التطبيقات. تم حل وظائف المنتج من خلال أنظمة غير مصممة لمعالجة البيانات ، على سبيل المثال ، في JavaScript أو PHP code. لذلك ، قمنا بنقل منطق أعمال Lingualeo إلى قواعد بيانات PostgreSQL.
الغابة
يعد Jungle أحد الأقسام الأربعة الرئيسية لخدمة Lingualeo . هذه مجموعة من المواد بلغة أجنبية - نصوص وصوت وفيديو - يمكنك من خلالها التعرف على ترجمة أي كلمة. أي أن المستخدمين يدرسون المحتوى الحقيقي باللغة الإنجليزية ، وإذا كان هناك شيء غير واضح ، فيمكنهم النقر فوق كلمة في النص أو في ترجمات لمقطع فيديو ومشاهدة الترجمة.
نص في فيديو الغابة
في الغابة
لوظيفة ترجمة الكلمات بنقرة للعمل ، يجب تقسيم النص إلى كلمات وتعبيرات وعبارات. ثم - ارجع إلى القاموس واعرض الترجمة في نافذة جديدة فوق النص للمستخدم. من الصعب إلى حد ما تفكيك النص للترجمة: فهناك تعابير ثابتة وأفعال أشباه الجمل لا معنى لتقسيمها إلى كلمتين. على سبيل المثال ، تعتبر وحدات مختلفة من المحتوى ، على الرغم من أنها تحتوي على نفس الكلمة.
تمت كتابة كل منطق هذه الوظيفة ، إلى جانب الاستثناءات وقواعد تقسيم النص المعقدة ، مسبقًا بلغة JavaScript في المقدمة. كانت الوظيفة مرهقة للغاية وقد تستغرق الترجمة وقتًا طويلاً.
لقد قمنا بتنفيذ هذه الميزة في قاعدة البيانات. يرسل الدعم JSON جاهزًا إلى المقدمة ، حيث يتم تقسيم النص بالفعل إلى كلمات وتعبيرات. يتم تعيين معرف لكل كلمة وتعبير في قاعدة البيانات ، مما يسهل العثور على الترجمة. يأخذ JSON أيضًا في الاعتبار الكلمات التي يمتلكها المستخدم في القاموس وأيها لم يتم إدخالها بعد. في المقدمة ، كل ما تبقى هو عرض المعلومات وتمييز الكلمات بعلامات معينة.
قواميس
لقد فعلنا الشيء نفسه مع قسم القواميس : كل الأعمال تتم الآن في قاعدة البيانات. لدينا مستخدمين لديهم أكثر من 100000 كلمة وتعبير في قاموسهم. في القاموس ، تحتاج إلى توفير بحث مناسب ، وتقسيم الكلمات إلى مجموعات ، ومنح المستخدم نطاقًا واسعًا من المرشحات.
في السابق ، كان منطق القواميس موجودًا في الجانب الأمامي أو في طبقة PHP ، ولكن النظام الآن يحتوي على واجهة برمجة تطبيقات كاملة بين الواجهة الأمامية والخلفية. يمكنك إرسال طلب واحد مع عدد كبير من المعلمات إلى قاعدة البيانات ، وسيأتي JSON جاهز من هناك:
مرشحات القاموس: البحث بالكلمات ، واختيار الكلمات حسب نوع التدريب ، والاختيار بين الكلمات والعبارات ، والتصفية حسب الكلمات المكتسبة والجديدة
الدورات
أدى نقل منطق الأعمال إلى قاعدة البيانات إلى تقليل مقدار الرمز بشكل كبير وتسريع الخدمة. على سبيل المثال ، تم تغيير رمز الواجهة الخلفية لصفحة الدورات التدريبية بعد الترحيل. يراه المستخدمون المسجلون ، ويتم اختيار الدورات من قبل النظام وفقًا لعشرة معايير. في السابق ، تم تكوين مثل هذه الصفحة لمدة 600 مللي ثانية وإرسال 12 طلبًا إلى قاعدة البيانات ، والآن يوجد طلب واحد فقط:
الخطوة 5. النظر في ملاحظات المستخدم بعد الإصدار
استغرق تطويره حوالي ستة أشهر: بدأنا التحديث في نهاية عام 2018 ، وصدر الإصدار في مايو 2019. شعر معظم المستخدمين أن الخدمة بدأت في العمل بشكل أسرع. في السابق ، لم يكن بإمكان Lingualeo تدريب أكثر من 2000 شخص في وقت واحد دون أن تفقد السرعة ، ولكن الآن يمكن للنظام أن يتحمل قمم أكثر من 100000 مستخدم.
لاحظ بعض الناس أيضًا عواقب سلبية. عند الترحيل باستخدام صندوق أسود ، من الصعب ضمان سلامة مائة بالمائة من البيانات ، لذلك فقد البعض كلمات من القاموس ، وعرض البعض التقدم بشكل غير صحيح في الدورات.
تدريجيًا ، قمت أنا وفريقي بإصلاح جميع المشكلات. النتيجة الرئيسية للتغييرات هي أننا لا نعمل الآن مع الصندوق الأسود ، ولكن بنظام بسيط وشفاف ، لذلك كان من الأسهل بكثير العمل على التعليقات.
Lingualeo
في أبريل 2020 ، أثناء العزلة الذاتية ، كان الحمل على Lingualeo أكبر بخمس مرات من نفس الفترة من العام الماضي. هذا لم يسبب مشاكل: سرعة الخدمة لم تنخفض ، ولم يلاحظ المستخدمون أي شيء. أنا متأكد من أنه إذا لم نقم بتحديث النظام ، فإن الخدمة ستفشل ببساطة.
لم يصبح المنتج أسرع للمستخدمين فحسب ، بل أصبح أيضًا أسهل في العمل معه: أصبح من السهل الآن على الفريق تقديم ميزات جديدة واختبارها. لقد قمنا بترتيب الوثائق ، وأصبح الرمز أصغر بنحو 40 مرة ، بحيث يمكن للمطورين الجدد بسهولة معرفة كيفية عمل الخدمة.
أصبح المنتج أرخص ، لذلك يجب استئجار طاقة حوسبة أقل من أجله. انخفضت تكلفة كل مستخدم نشط في Lingualeo بأكثر من 50 مرة ، على الرغم من أن عدد المستخدمين النشطين قد تضاعف بالفعل بعد التحديثات.
أخيرًا ، المنتج أكثر أمانًا. في السابق ، عندما كان منطق الأعمال موجودًا في طبقة PHP ، تم إرسال الطلبات إلى قاعدة البيانات من هناك من وظائف مختلفة. تعد قاعدة البيانات المفتوحة لاستعلامات SQL مشكلة: يمكنك إجراء حقن SQL وإجباره على تنفيذ تعليمات برمجية خطيرة ، مثل حذف البيانات. الآن لا يأتي استعلام SQL واحد من الخارج ، لأننا نقلنا كل المنطق إلى الداخل. "
نريد الاستمرار في التدوين بانتظام حول كيفية عمل التطوير في Lingualeo المحدث. اكتب في التعليقات ما يستحق الحديث عنه أولاً: لقد تغير فريقنا ، وهيكل الإدارة والتكنولوجيا. سنكون سعداء للإجابة على جميع أسئلتك.