اختيار التكنولوجيا والهندسة المعمارية والتصميم في مشاريع البرمجيات - بدون نقود

أصدقاء! نواصل سلسلة من المنشورات "بدون تخفيضات" حول عمليات التصميم وتقنيات تكنولوجيا المعلومات وكيفية العمل بفعالية. اليوم سوف نتحدث عن موضوع مؤلم للغاية يسبب حرقة في الدماغ - اختيار التقنيات ولغات البرمجة ودور المهندسين المعماريين والمحللين وقادة الفرق وعلماء النفس لحل المشكلة الملحمية: إطلاق حل برمجي ، إن أمكن ، في غضون فترة زمنية معقولة. وسنتطرق بشكل منفصل ، حتى لا نشعر بالملل على الإطلاق ، حول تحليل العلاقة بين أحجام أجزاء الجسم في جزء واحد من الفريق وإنتاجية الدماغ في جزء آخر. صب القهوة ودعنا نذهب!

كيف تصبح خبيرا


من أجل أن نفهم بشكل موضوعي لماذا لا يوجد حتى الآن الوضوح في القضايا المشار إليها ، وهناك الكثير من الخلافات "الدينية" مع التضحيات الإنسانية ، يجب أن تشتت انتباهك وتبتسم وترسم حياة أخصائي تكنولوجيا المعلومات بسكين مطبخ في شكل خط مكسور على طاولة مع مربعات تعني المعرفة المكتسبة.


يبدأ المرح بحقيقة أنه ، عادة ، حتى في الجامعات المتخصصة ، لا توجد معرفة كافية بالبرمجة الاحترافية وتعتمد كفاءة أخصائي بشكل مباشر على الصراع العقلي مع الكسل: احصل على كتاب / كود لبضع ساعات أو قم بإسقاط علبة من البيرة أمام التلفزيون. من الواضح أن جزءًا صغيرًا فقط هو القادر على الصمود أمام الشبكات الاجتماعية والمسلسلات التلفزيونية والألعاب عبر الإنترنت والتعلم بدون أنانية ، لكن حتى لو قاموا ، مثل الرهبان ، بالتضحية المستمرة واليومية كجزء من حياتهم ، يمكنهم بسهولة فهم لغة واحدة ، وأحيانًا ، لغتين للبرمجة الصناعية وعدة لغات التقنيات ذات الصلة. والشارب ، يبدأ المعاش وعندما يزرع النحل.

ولكن مع هذه الصعوبة ، فإن المعرفة المكتسبة للنجاح لا تزال غير كافية ، والتخصص المستمر في مشاريع التنمية مطلوب ، ويفضل أن يكون ذلك في المواعيد النهائية الجهنمية ، لأن مهارات الكتابة بسرعة وبشكل صحيح تضيع في وقت قريب.

نتيجة لذلك ، يمكن قطع عدد قليل من المربعات بالسكين ، والأكثر من ذلك إلى اليمين ، عدد أقل من المربعات ، كقاعدة عامة ، لأن الأطفال يولدون ويظهر معارفهم وهوايات وتريد أن تعيش قليلاً على الأقل قليلاً في الليل وأن تحصل في النهاية على ما يكفي من الدبابات الصغيرة.

تشبيه خبير خبير في تكنولوجيا المعلومات ، ربما يكون أحد أخصائيي فنون الدفاع عن النفس ، بعد أن ترك المدرسة فورونيج إلى الصين وأمضى 10 سنوات في دير ، ملأ المفاصل بأصابع قدميه على كتفيه ، وقطع سيفه التناسلي والقطارات لمدة 20 ساعة في اليوم. سيكون المقاتل لطيفًا في معرفة عدة لهجات صينية ، لكنه سيواجه ذات يوم رجلاً ذو بشرة داكنة كرس نفسه لكابويرا . على الأرجح ، على مستوى العلامات ، سيتفهمون بعضهم بعضًا وسيكونون قادرين على اختيار التكنولوجيا لمشروع برمجيات ، لكن لسوء الحظ ، يتعين عليك في معظم الأحيان مقابلة محبي العدوانية من تأثيري والخيال العلمي - في زي Jedi مع زي من البلاستيك في أيديهم.

نسخ ولصق وأطر وخيال علمي


من الواضح أن قلة قليلة فقط يمكنها دراسة الحقيقة وتعلمها بشكل غير أناني ، وفي الواقع ، تحدث الاجتماعات والنزاعات حول التقنيات ولغات البرمجة بشكل أساسي بين محبي "سلسلة" مختلفة وعصرية ، والذين لا يعرفون الفرق بين الملكية الفكرية وبرنامج التعاون الفني في أغلب الأحيان. تتفاقم المشكلة بسبب التسويق الخارجي العدواني - حيث يعمل معظم بائعي تكنولوجيا المعلومات على "تجنيد" المتابعين بنشاط في صفوفهم باستخدام قنوات المعلومات المضخّمة. لا تحتاج إلى الذهاب بعيدًا للحصول على أمثلة - تعمل Mozilla على الترويج لـ Rust و Google تروج لـ Go و Oracle تهتم (؟) بتطوير Java ، تعمل Microsoft على تطوير C # ، و JetBrains هي Kotlin ، والأجانب هم Haskell ، ولا يشعر المجتمع العلمي بسعادة غامرة عندما يكون تحت عنوان AI و ML ، وهي خلية عصبية و datasatanism ، لكثير من المال يتم بيعها ... دورات الأكاديمية المتربة في نظرية الاحتمالات والحاكم والإحصاءات إلى الأبد ، amen :-)


وعندما يبدأ أحد محبي لعبة Game of Thrones بالتجادل مع أحد مشجعي عشيرة السوبرانو حول فوائد البرمجة والخلطات والإغلاقات الموجهة نحو الجانب ، كل ما يتبقى هو الضحك بإخلاص ورش المباحثين بالرمال المقدسة من بطاطس التبت وماكدونالدز. لن تكون قادرًا على انتظار أي استنتاجات مفيدة وموضوعية ، وسوف تشعر بالارتباك أكثر من ذلك - والأسوأ من ذلك ، سوف تصاب ببوبين فيروسي وتبدأ في المشي في معطف مقلم.

التقاليد و "الصواب"


والحقيقة هي أن تجميع ، على سبيل المثال ، سيارة مصنوعة من الحديد مهمة باهظة الثمن وطويلة: تحتاج إلى مواد ، ولحام ، ومعرفة ، وغرفة ، ملصق للفتاة بالأشكال الصحيحة ، إلخ. إن كتابة برنامج ، وخاصةً ليس وحده ، أمر شائع جدًا. إبداع افتراضي - انفجر ويستمر في سحق العالم. بحر من المحتوى الرقمي ، غالبًا ما يكون جاهلًا وبدائيًا ، حيث غمر جميع الكتاب والفنانين الويب. نتيجة للبساطة النسبية لـ "التعبير عن الذات" ، في العالم ، في فترة زمنية قصيرة نسبيًا ، بعد الحرب العالمية الثانية ، ظهر عدد كبير من البرامج ليس فقط ، ولكن أيضًا لغات البرمجة. كتابة لغة برمجة جديدة ليست صعبة ، أكثر صعوبة - جعلها تكتسب شعبية. لقد حدث تاريخيا أن اللغات التي تعلمت "كتابتها بشكل صحيح" (على سبيل المثال C ++ و Java و ECMA262) أصبحت شائعة الآن ، واللغات "صُنعت فيما بعد ويبدو أنها أفضل" (على سبيل المثال C # و Python3 و Rust و Kotlin) هي أقل شعبية بكثير. عند اختيار لغة "أكثر صحة" ، فإنك تخاطر بعدم العثور على عدد كافٍ من المطورين الذين يعرفونها ، أو قد يحدث أن تتوقف اللغة عن التطور أو تصعد إلى الأبد ، مثل هاسكل. لذلك ، يسترشدون بالفطرة السليمة ، غالبًا ما يختارون التقنيات التقليدية ، إذا جاز التعبير ، حتى لو لم تكن "صحيحة" ومتسقة ، ومليئة بالعكازات وآثار النمو ، ولكن تم اختبارها وشعبتها وتطويرها.


في سياق الرسم البياني للتنمية النشطة (وخاصة في اتجاه الواجهة الأمامية ، على الرغم من أن npm ممتعة أيضًا) ، أود أن أحذر من الاستخدام غير المدروس للمكتبات والأطر . من المهم أن ننظر إلى تاريخ تطور الإطار ، ووحدة المطورين (كلما كانت التكنولوجيا أكثر بساطة ، والمزيد من المفاجآت) ومدة دعم الإصدار.

عادة ، في المشاريع مفتوحة المصدر ، ليس من المعتاد الحفاظ على الإطار لفترة طويلة ، على سبيل المثال 3-5 سنوات أو أكثر - وهذا هو مبتذل ومكلفة ومملة. لذلك ، عادةً ، بعد الحصول على كتلة حرجة من "العكازات" ، يتم إنشاء الإصدار التالي ، في غضون عام أو عامين ، وأوصي بأن يقوم مستخدمو إصداراتهم السابقة بنقل مشروعهم ... قموا به بنفسك ، لأن الإصدار السابق لن يتم تحديثه بعد الآن ولن يتم إصلاح أخطاء الأمان فيه. أمثلة على "عدم المسؤولية" هي ببساطة البحر.

لا تعاني المكتبات والأُطُر التجارية ، كقاعدة عامة ، من مرض طفولة مماثل (وإن لم يكن جميعها ، تحتاج إلى النظر بعناية في الوثائق ودراسة هذه المسألة بدقة) والحفاظ على التوافق مع الإصدارات السابقة لمدة 5 سنوات أو أكثر. يرجى إيلاء اهتمام خاص لهذا ، وإلا فسيتعين عليك إعادة كتابة حل الويب الخاص بك من البداية!

بشكل عام ، في هذه المرحلة ، من الأفضل استخدام المثل حول الحلمة والرافعة.

جديد أو ... انتهى


هناك مشكلة نفسية شائعة جدًا في التطور وهي الاختيار بين "القيام بذلك من الصفر" و "استعد". سأخبرك سرا - الكل يريد أن يكون آلهة ، مطورين مبتدئين ، وهو أمر طبيعي ، بالمناسبة ، إنهم يريدون الضخ والحصول على مدخل في السيرة الذاتية واختيار "القيام بذلك من نقطة الصفر". ولكن بعد ذلك ، عادةً ما يغادرون بسبب الملل بعد ستة أشهر أو سنة ، وغالبًا بسبب قلة الخبرة ، يجب إعادة كتابة إبداعاتهم مرارًا وتكرارًا من نقطة الصفر. رهبان شاولين ذوي الخبرة ، عادةً ، يؤمنون أنفسهم ضد أخطاء ومفاجآت الأطفال ، ويختارون الحلول والمكتبات الجاهزة ، ويقضون وقت الفراغ المتبقي في تطوير غير قياسي وحصري لوظائف مشروع الويب هذه. ولن تكون مملة!


قد يكون هناك ارتباط جيد باختيار قاعدة بيانات - ما يجب أخذه لمشروع ويب أو قاعدة بيانات Oracle أو قاعدة بيانات MySQL (نعم ، أعلم أنه يتم الآن تطويرها بواسطة شركة واحدة). وفقًا للتجربة - يتم حل 99٪ من مهام تطوير الويب ، حتى في ظل الأحمال الكبيرة ، بشكل ممتاز وبسرعة عالية في MySQL. وإذا كانت النتيجة لا تختلف ، لماذا ...؟ :-)

لذلك ، عادةً ما يتكون مشروع البرنامج الآن من مجموعة من المكتبات والأطر الجاهزة والمُختبرة ، مع فترة دعم جيدة وجزء صغير فقط من الوظيفة الخاصة لمشروع معين. وهذا ، IMHO ، هو الصحيح.

صعب وطويل أو ... سريع وسهل؟


هذا أيضًا سبب معروف للنزاعات العديدة التي لا تنتهي. في الواقع ، يتم تقسيم تقنيات تكنولوجيا المعلومات الحديثة ولغات البرمجة ، تقريبًا ، إلى قسمين: بسيط بالنسبة للأغلبية (لا حاجة إلى الخوض بعمق ، بضعة أيام لفهمها) ويصعب على الأقلية (يحتاج إلى تخصص جدي وطويل ، أشهر لفهمها). كما رأينا أعلاه ، فإن معظم الناس لا يرغبون في التعلم ، لذلك إذا طبقت التكنولوجيا الصحيحة والموثوقة ، فلن تنجح لأن لا أحد يستطيع أن يفهمها تمامًا وسوف تلعب لعبة الروليت الروسية مع صندوق أسود. مثال شائع: الاختيار بين redis أو cassandra - منتجات ذات ترتيب مختلف من التعقيد. أو مثال آخر: python أو C ++.

في اللغات البسيطة ، في الواقع ، تكون البرمجة في كثير من الأحيان أسرع بكثير ، مقارنة النص البرمجي بيثون بـ 5 أسطر ورمز C مماثل مع 100 سطر. لكن ، عادةً ما تعمل اللغات "البسيطة" والتقنيات العالمية بشكل أبطأ كثيرًا وتستهلك ذاكرة RAM أكبر بكثير :-) بعد كل شيء ، عليك أن تدفع مقابل كل شيء.


ومع ذلك ، يتم استخدام اللغات "البسيطة" بشكل متزايد لحل معظم مهام مشروع البرنامج ، حيث لا تكون هناك حاجة لمتطلبات خاصة للسرعة الفائقة وذاكرة الوصول العشوائي. ويصبح الحديد أرخص وأرخص. أصبح PHP الآن مشهورًا جدًا لتطوير سريع للويب ، وبيثون ، بصيغته الواضحة والقابلة للقراءة ، للمهام العامة والتعلم الآلي. JavaScript مناسب جدًا لأتمتة ليس فقط واجهة الويب ، ولكن أيضًا ... إنشاء تطبيقات خادم سريعة على Node.js. تتيح لك Go ، حتى مع بناءها البدائي ، الاستغناء عن أكثر قوة ، ولكن من الصعب عليك فهم Java في مهام النظام ، ويمكن إنشاء تطبيق محمول بسرعة بترتيب من الضخامة أسهل وأكثر سهولة للمبتدئين لتطوير Kotlin. من الممكن بمخاطر أقل بكثير تشغيل تطبيق ذي حمل كبير في Rust دون الخوض في تعقيدات إدارة الذاكرة في C ++. لكن لا أحد في عقله الصحيح سيكتب لعبة في Java ، يتذكر ماين كرافت الصغيرة ، والتي يمكن لعبها فقط على مسافة 10 أمتار من الشاشة ، التحديق :-)

لكل مهمة ، لذلك ، من المستحسن اختيار أداة محددة وشائعة شحذ بها. أكثر الأدوات الجاهزة المستخدمة ، كان ذلك أفضل.

إنه أمر هزلي ، ولكن في الواقع الحالي ، لا حتى اختيار اللغة ، ولكن اختيار الميزات اللغوية يمكن أن يكون له تأثير حاسم على النجاح. على سبيل المثال ، بوجود فريق لا يمتلك أي خبرة في البرمجة الموجهة للكائنات ومعرفة أنماط التصميم ، يمكنك كتابة حديقة حيوانات صارخة بحيث قد يكون من الأسهل حل المشكلة باستخدام 100 وظيفة في ملف واحد متجانس ، وهو أمر يمكن للجميع فهمه من الاختباء من مئات الكائنات في مكتب الوحوش مع موقف بدلا من الرأس والأذنين بدلا من الساقين. هذا هو السبب في أن اللغات البسيطة (مثل python و php و javascript و ruby) غالبًا ما لا توفر فرصًا زائدة عن تطوير الرسوم البيانية والكمال ، والتي تركز على الوضوح والغموض (python) والدقة (php) ، تجعل من الممكن تحقيق النجاح بشكل متزايد. ليس لشيء أن القصص تحظى بشعبية كبيرة عندما تم إنشاء موقع على شبكة الإنترنت في C ++ وما كابوس تحولت في وقت لاحق.

تشبيه جيد هنا هو مثال على فرسان القرون الوسطى المكلفين والصعبين و ... مثيري الشغب بالأسلحة النارية. يمكنك تدريب حياتك كلها وتصبح جافا الساموراي متعدد الخيوط ، ولكن يمكنك إنهاء حياتك فجأة عندما تقابل طالبًا بحل مشابه وبسيط جدًا في بيثون أو جو.

العمارة والهندسة المعمارية


في الواقع ، قبل 10-15 سنة كان من الضروري دراسة وقراءة الكتب السميكة لفترة طويلة من أجل فهم مبادئ وضع الأشياء وتفاعلها على خوادم ومجموعات منفصلة (j2ee ، corba ، com). لا يزال من الممكن العثور على أصداء هذه الطفرة على الهندسة المعمارية والمهندسين المعماريين في إبداعات وحشية مثل Spring . لكن الأوقات تتغير ، أصبحت التكنولوجيا أكثر قوة وبأسعار معقولة. من خلال نشر اثنين من خوادم الويب Apache المجانية وقاعدة بيانات MySQL وقائمة الانتظار RabbitMQ في مكان ما في Amazon ، يمكنك حل معظم المشكلات التي كانت متاحة سابقًا في تكوينات خادم التطبيقات المفهومة للأقلية الساحقة.


إذا كانت المهمة هي دعم اتصالات الشبكة الهائلة ، فيمكنك رفع مجموعة من آلات Node.js أو ، بدلاً من ذلك ، أجهزة أفضل مع Erlang والنوم بسلام من كتابة حل الخادم الخاص بك في ، على سبيل المثال ، Go أو C ++.

إذا كنت بحاجة إلى إجراء بحث ، باستمرار ، في التدفق ، فاختيار أحد نماذج التعلم الآلي من 10-20 ونشرها بسرعة في السحابة لخدمة العملاء ، ثم ، بالطبع ، سيكون الثعبان مع عدد كبير من المكتبات حلاً مناسبًا وعمليًا للغاية ، وهكذا.

بطبيعة الحال ، في مشاريع متخصصة ضيقة ، ومعرفة متعمقة من OOP ، FP ، والهندسة المعمارية ، لا تزال علوم الكمبيوتر مطلوبة بالطبع ، ولكن في كثير من الأحيان يكفي أن نعرف أكثر من أي كتل لتجميع الحل ، وهذا غالبا ما يؤدي نظام البرمجيات إلى الهدف.

فريق المطابقة


بناءً على ما تقدم ، من الواضح أن الفريق سوف يتطور على الأرجح فقط ضمن الإطار المحدود لمجموعة التقنيات المختارة للمشروع. ستبدأ الوحدات في حفر الموضوعات ذات الصلة ، وسوف تقرأ نسبة صغيرة منها الأدب المتخصص ، لكن هذا ، للأسف ، حالة استثنائية. لذلك ، يوصى باختيار أولئك الذين لديهم خبرة في اللغات / المكتبات المشار إليها ، والتي يمكن التحقق منها في السيرة الذاتية وفي المقابلات. ولا يمكن الاستغناء عن أولئك الذين لا يستطيعون حقًا أن تتعرض لهم البرامج التلفزيونية والشبكات الاجتماعية من أجل "النمو" بعد تلقيهم عقدًا تم توقيعه مسبقًا بواسطة دم شرياني :-)

ومع ذلك ، في المشروعات غير القياسية ، سيتعين عليك العثور على مطور واحد على الأقل يعرف شيئًا آخر وممتازًا ، باستثناء python و ruby ​​و php و javascript و go و perl و bash و chanson. لقد تحسنت بشكل كبير الفرص التي يعرفها المقاتل للخوارزميات وأنماط التصميم ومعايير الشبكة.


إذا كان المشروع مرتبطًا بالتعلم الآلي وتحتاج إلى البحث عن شيء ما بعمق ، فسوف يتعين عليك العثور على محلل رياضيات حقيقي ، ويفضل أن يكون ذلك على درجة علمية ومعرفة بيثون. أنا جاد - بالنسبة للتعلم الآلي ، بدون تعليم متخصص ، فأنت بحاجة إلى الدراسة بجد لعدة ساعات في اليوم (نظرية الاحتمالات ، الجبر الخطي ، طريقة المربعات الصغرى ، الإحصاء ، نظرية بايز وتقنيه) لعدة أشهر ، إن لم يكن سنوات.

العمليات أم التقنيات؟


يمكنك غالبًا العثور على مشاريع برامج طويلة العمر وكبيرة مكتوبة بلغات برمجة أو مجموعات مكتبات تبدو غير ملائمة. على سبيل المثال ، يصادف المرء غالبًا نصوصًا ضخمة للتحكم في bash أو مكتبات وأطر علمية ضخمة لإجراء عمليات حسابية دقيقة على ... python with Dodbyba duck typing . السر في عمليات وممارسات صارمة. باستخدام:

  • التصميم الأولي ، اختبار الإجهاد وتحليل المخاطر
  • وحدة آلية واختبار التكامل (يفضل تغطية 100 ٪)
  • معايير الترميز المشتركة
  • توثيق جيد لمكونات الكود والنظام
  • أقصى اتصال شفاف داخل الفريق
  • رصد وتحليل بيئة الخادم

يمكنك إنشاء حل برنامج ، من حيث المبدأ ، على أي تقنية ستعيش لسنوات وتسعد العملاء. والعكس بالعكس ، من خلال العمل مع "المواجهات" المبالغ فيها مع الصناديق السوداء ، وعدم الخوض في تفاصيل التكنولوجيا ، وتشجيع الإهمال والمصالح الشخصية بدلاً من الاهتمامات الجماعية ، يمكنك محاولة بدء مشروع لعدة أشهر ، وتصحيح خطأ واحد وإثارة العشرات - لسوء الحظ ، هذا الموقف شائع جدًا.


ملخص


لتلخيص وتحديد الأولويات:

  • على نحو متزايد ، يمكن للمرء أن يلاحظ الموقف عندما تكون سرعة إطلاق مشروع برمجيات عاملاً حاسماً في النجاح. إن القيام بشيء طويل وبصعوبة لا داعي له هو أسوأ من سرعة الإفراج عن حل مفيد للعملاء وجمع الملاحظات للنطر التالي
  • لا يمكن بدء التشغيل السريع إلا عند استخدام الحد الأقصى من المكونات الجاهزة والأطر والمكتبات مع فترة دعم كافية (مع مراعاة العمر المتوقع لنظام الويب الخاص بك)
  • لسوء الحظ ، فإن المعرفة الحسابية والهندسية في الطلب أقل. في كثير من الأحيان ، نرحب بتجربة حل المشكلات المماثلة وممارسة استخدام صناديق الأدوات ونقاط القوة لمقدمي الخدمات السحابية.
  • ليست هناك حاجة لتقييد نفسك وفعل كل شيء على تقنية واحدة ولغة برمجة واحدة فقط هي الأفضل - السلاح الناري في يد الطفل هو أكثر فعالية من دراسة فنون الدفاع عن النفس مع الساموراي طوال حياة واعية وغير واعية. الكمالية والكمال تقتل أنظمة البرمجيات. اختر السلاح المناسب لكل مهمة في المشروع. انتهي من التركيز وتركيز الجهود المتبقية على غير قياسي.
  • يجب أن تكون التقنيات المختارة بسيطة وواضحة ومتاحة لغالبية الفريق. انظر إلى ما يكتبونه في مشروع مشابه على الصفحة الرئيسية واتخاذ هذه التقنية مكدس لنفسك. لا تقم بأتمتة الاستضافة باستخدام Haskell ولا تكتب مواقع الويب بلغة C ++ :-) إذا كان مشروعك "ينطلق" ويبدأ التطوير ، عندها فقط يمكنك التفكير في إعادة كتابة أجزائه الصغيرة بتكنولوجيات ولغات برمجة أكثر تعقيدًا. لكن في العادة ، لا تصل مشاريع البرامج إلى هذه المرحلة أو تصل بعد سنوات قليلة.
  • يتيح لك إطار العمل تسريع إطلاق مشروع برنامج بأوامر ضخمة. تأكد من التحقق من توفر وثائق جيدة وتحديد فترة الدعم للإطار بحيث لا توجد مشكلة في إعادة كتابة كاملة في 2-3 سنوات. هذه حالة متكررة جدًا لعملائنا.
  • لا تؤمن بقدرة الفريق على التعلم - فهناك الكثير من الانحرافات في الحياة والوضع يزداد سوءًا. دراسة سيرتك الذاتية بعناية ، والتحقق من الشهادات والامتحانات ومحاولة التركيز قدر الإمكان على النتيجة العملية. ضع الممارسة فوق النظرية ، على الأقل في وقت إنشاء الإصدار الأول من الحل العملي.
  • لغة (لغات) التكنولوجيا والبرمجة ليست عوامل نجاح حاسمة. ركز على بناء أكثر العمليات الضرورية وتنفيذ ممارسات التطوير والتصميم الرئيسية. العمليات الصحيحة ، كقاعدة عامة ، مضمونة لتؤدي إلى النتيجة "الصحيحة". « » « », . , 2-3 .

, , !

Source: https://habr.com/ru/post/ar436460/


All Articles