اجعل C ++ رائعًا مرة أخرى! .. في Tula

منذ وقت ليس ببعيد ، على أساس مكتبنا ، أجرينا دورة مجانية من المحاضرات "C ++ الحديثة والفعالة" وقمنا بتسجيلها على الفيديو. تم تصميم الدورة التدريبية للوافدين حديثًا إلى فريق من المبرمجين والمتدربين وجميع القادمين. في هذه المقالة ، نود أن نبرز الغرض من هذه الدورة ، وهي عملية التحضير لها ، لتلخيصها. نأمل أن يكون بعض محاضراتنا مثيراً للاهتمام بالنسبة إليك ، وسوف نقدر عملنا. نتمنى لكم مشاهدة ممتعة للتقارير!


كيف جاءت الفكرة؟


تقوم شركتنا PVS-Studio بتطوير محلل أكواد ثابت يحدد الأخطاء ونقاط الضعف المحتملة في الكود المصدري للبرامج المكتوبة بلغات C و C ++ و C # و Java. وليس سراً بالنسبة لأي شخص أننا مهتمون بجذب المتخصصين الشباب. غالبًا ما يحدث أن الطلاب الذين يرغبون في اكتساب خبرة مهنية في مجال البرمجة والذين ما زالوا يفتقرون إلى المعرفة في هذا المجال يتلقون تدريبات عملية. بالإضافة إلى ذلك ، يحتاج متخصصونا الذين وصلوا حديثًا إلى مساعدة في النمو المهني. في ضوء ما تقدم ، تقرر إعداد دورة من المحاضرات حول البرمجة وإجرائها. سعت هذه الفكرة إلى تحقيق ثلاثة أهداف على الأقل: إظهار المهنيين الشباب والمتدربين كيفية كتابة التعليمات البرمجية بشكل أكثر دقة وكفاءة وأمان. تعميم لغة C ++ خارج المكتب وإظهار أن اللغة واعدة من وجهة نظر التعلم ومواصلة العمل معها ؛ للترويج لشركتنا كصاحب عمل مثير للاهتمام. بعد تحديد الأهداف والمستوحاة من الفكرة ، بدأنا في جعل الحلم حقيقة.

تدريب


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

وهكذا ، عندما "تتم مزامنة" أفكار وأفكار الجميع ، تقرر أن يتم تصميم الدورة لـ 12 محاضرة مرتين في الأسبوع من 9 يوليو إلى 15 أغسطس. تم اختيار أندريه كاربوف وفيليب هاندليانتس كمحاضرين.

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

دعنا نتناول مواضيع المحاضرات ومحتواها.

C ++ 11 الابتكارات القياسية


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

  • التهيئة العالمية ؛
  • نقل دلالات.
  • تعبيرات ثابتة معممة (constexpr) ؛
  • تغييرات في تعريف نوع POD ؛
  • قوائم التهيئة (std :: initializer_list <T>) ؛
  • اكتب الاستدلال عبر السيارات و dectype .
  • مجموعة ل ؛
  • وظائف لامدا.
  • بناء جملة الوظيفة البديلة ؛
  • وظيفة الانتاج عودة النوع ؛
  • تفويض البنائين
  • المحددات الافتراضية / حذف للوظائف ؛
  • تجاوز / التصفيات النهائية عند العمل مع تعدد الأشكال ؛
  • nullptr_t و nullptr ؛
  • وأكثر من ذلك بكثير.

بعد مناقشة امتدادات kernel ، تحدثت Philip عن الامتدادات إلى المكتبة القياسية ، والتي تشمل:

  • تحديث المكتبة القياسية لتعكس التغييرات في اللغة الأساسية ؛
  • multithreading: مؤشرات الترابط ( std :: thread ) ، mutexes ( std :: mutex، ... ) ، والمتغيرات الشرطية ( std :: conditional_variable، ...
  • مغلفات RAII ( std :: lock_guard، std :: unique_lock ) ؛
  • tuples ( std :: tuple) ؛
  • hash tables ( std :: unordered (_set / _multiset / _map / _multimap
  • التعبيرات العادية ( std :: regex ) ؛
  • المؤشرات الذكية ( std :: unique_ptr، std :: shared_ptr، std ::ضعف_ptr
  • مولدات الأرقام العشوائية الزائفة بدلاً من rand () ؛
  • wrappers link ( std :: reference_wrapper
  • المجمع المعمم للوظائف ( الأمراض المنقولة جنسيا :: وظيفة ) ؛
  • الصفات ( type_traits ).

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


C ++ 14 الابتكارات القياسية


تم تكريس المحاضرة الثانية لمراجعة ابتكارات C ++ 14 القياسية. لم تكن هناك تغييرات كثيرة ، لذلك "عانى" المستمعون ليس لمدة ساعتين ، لكن فقط 40 دقيقة :-). كما في المحاضرة الأولى ، تم إيلاء الاهتمام لنقطتين رئيسيتين: تغيير نواة C ++ وتغيير المكتبة القياسية.

إليك ما تحدثوا عنه:

  • إخراج نوع الإرجاع للوظائف دون تحديد الإعلان النهائي لنوع الإرجاع بشكل صريح ( نوع الإرجاع الخلفي ) ؛
  • Dectype (تلقائي) ؛
  • تخفيف القيود المفروضة على constexpr .
  • المتغيرات المتغيرة
  • التهيئة الإجمالية ؛
  • حرفية ثنائية
  • فواصل الأرقام ؛
  • لامداس معممة ؛
  • القبض على لامدا قائمة الوظائف مع التهيئة.
  • السمة [[deprecated]] ، std :: shared_timed_mutex؛
  • البحث غير المتجانسة عن الحاويات الترابطية ؛
  • القيم الحرفية للمستخدم القياسية (s for std :: string ؛ h، min ، s ، ms ، us ، ns for std :: المدة ، إذا ، i ، il للجزء التخيلي من std :: complex ) ؛
  • std :: get يمكن الآن الحصول على القيمة من std :: tuple حسب النوع؛
  • الأمراض المنقولة جنسيا :: make_unique ؛
  • الأمراض المنقولة جنسيا :: integer_sequence ؛
  • وظائف مجانية std :: start، std :: end، std :: cbegin، std :: cend، std :: rbegin، std :: rend، std :: crbegin، std :: crend ؛
  • الأمراض المنقولة جنسيا :: الصرف .


اكتب الاستدلال في C ++


بعد أن أبرزنا ابتكارات معايير C ++ 11 و C ++ 14 ، ركزنا على موضوع الاستدلال النوعي في C ++. لماذا كان حول هذا الموضوع؟ قبل الإصدار C ++ 11 ، كان عدد قليل من الناس يفكرون جيدًا في ماهية هذه الطريقة وكيف تعمل ، باستثناء كتاب "القالب السحري" ومطوري برامج التحويل البرمجي.

تمر الأوقات ، والآن يحتاج مبرمج C ++ إلى مراعاة الابتكارات المقبولة وفقًا للمعايير: السيارات ، روابط إعادة التوجيه ، فك التشفير ، قائمة التقاط لامب ، نوع الاستدلال حسب قيمة الإرجاع ، إلخ.

لقد بدأ المطورون في استخدام الابتكارات بفعالية في التعليمات البرمجية الجديدة ، ومن المهم للغاية فهم ما يعنيه هذا وما الذي سيفعله المجمع في هذا الموقف.


C ++ 17 الابتكارات القياسية


عند الحديث عن C ++ الحديثة ، كان من المستحيل عدم ذكر آخر معيار C ++ موجود. تم تقديم السرد وفقًا للمخطط المعمول به بالفعل: تم النظر في التغييرات في النواة ، ثم في المكتبة القياسية. وبالتالي ، نظرنا في:

  • إخراج أنواع فئات القوالب من الصانعين ؛
  • يعتبر رمي () noexcept ويتسم بأنه مخفض ؛
  • أصبح noexcept جزءًا من نظام الكتابة ويؤخذ الآن في الاعتبار عند اختيار الأحمال الزائدة للوظائف ؛
  • نسخة elision .
  • الالتواء ( التعبير أضعاف ) ؛
  • إذا / التبديل مع مهيئ ؛
  • إذا constexpr ، الارتباطات المنظمة ؛
  • مساحات الأسماء المتداخلة؛
  • سمات جديدة [[ fallthrough ]] و [[ ربما_unused ]] و [[ nodiscard ]] ؛
  • حرفي الست عشري الحقيقي ؛
  • يقبل static_assert الرسالة كمعلمة اختيارية بدلاً من المعلمة المطلوبة ؛
  • typename مسموح به الآن في خيارات قالب القالب ؛
  • قاعدة أخرى جديدة لصناعة السيارات في الإخراج مع قائمة هدفين-- مهيئ ؛
  • المتغيرات المضمنة .
  • السيارات يمكن استخدامها في قالب المعلمات.
  • التوجيه المسبق __has_include ؛
  • أصبح السجل كلمة محجوزة ولم يستخدم بعد ؛
  • std :: string_view ؛
  • الأمراض المنقولة جنسيا :: اختياري ؛
  • الأمراض المنقولة جنسيا :: أي ؛
  • الأمراض المنقولة جنسيا :: البديل .
  • الأمراض المنقولة جنسيا :: بايت ؛
  • std :: uncaught_exceptions بدلاً من std :: uncaught_exception ؛
  • boost :: filesystem مع التغييرات التي غمرت المياه مثل std :: filesystem ؛
  • try_emplace و insert_or_assign للصفائف الترابطية ؛
  • وظائف حرة الأمراض المنقولة جنسيا :: الحجم ، الأمراض المنقولة جنسيا :: فارغة و الأمراض المنقولة جنسيا :: البيانات ؛
  • متغيرات القالب type_traits ( std :: * _ v <T ...> ).


المحكمة الخاصة بلبنان: المفهوم ، الحاويات ، التكرارات


تم تخصيص المحاضرة الخامسة بالكامل لمكتبة القوالب القياسية. ناقشنا تاريخ المحكمة الخاصة بلبنان ، ومضمونها وكيفية البدء في استخدامها. تحدثنا بمزيد من التفاصيل حول الحاويات القياسية ( ناقل ، قائمة ، قائمة أمامية ، deque ، ...) ، حاويات المهايئ ( المكدس ، قائمة الانتظار ، الأولوية_ que ، الكومة ) وأنواع التكرار ( المدخلات ، الإخراج ، الأمام ، ثنائية الاتجاه ، عشوائية ، متجاورة ).


STL: الخوارزميات والأغلفة والأشياء الوظيفية


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


التحليل الثابت كجزء لا يتجزأ من التطوير عند كتابة برامج C ++


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


PVS-Studio ترميز التقنيات القياسية والعامة لتطوير التشخيص C ++ فعالة


لا يزال Philip يستريح ، وألقى Andrei وطلابه نظرة سريعة على مطبخ PVS-Studio الداخلي ، مع مراعاة موضوعين.

أولاً ، تحدثنا قليلاً عن معيار الترميز الذي اعتمده فريقنا ، ولماذا قررنا تصميم الكود بهذه الطريقة ، وليس بطريقة أخرى.

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

كانت المحاضرة موجهة أساسًا للمتدربين في شركتنا وأولئك الذين يريدون أن يصبحوا في النهاية. فيما يتعلق بالمحتوى ، تمت مناقشة هذه اللحظات في معيار الترميز PVS-Studio هنا:

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


Metaprogramming في C ++: القوالب ، حسابات constexpr ، إلخ.


استمتعت Philip بالراحة واكتسبت القوة وقلت لـ "قالب السحر". يعلم الجميع أن البرمجة الأفقية مع كل إصدار من المعيار الجديد أصبحت أكثر تعقيدًا وغير مفهومة ، في قواعد البيانات تتزايد باستمرار كمية "قالب السحر". حددت المحاضرة المهمة التي يجب تحديثها ، مع توضيح الجوانب الرئيسية لعملية البرمجة:

  • وظائف القالب ؛
  • الطبقات القالب
  • التخصص الكامل والجزئي للقوالب.
  • قوالب متغيرة
  • الإلتواء.

المستمعين بعد 30 دقيقة:


لكن هذا لم يكن كل شيء! قررت Philip إتمامها بنقاش أخير حول الحساب والتلاعب بالكتابة في مرحلة التجميع ، ونمط CRTP (نموذج القالب المتكرر بشكل غريب) ، و SFINAE ، والكاشفات.


تجميع مشاريع C / C ++ وتحسينها


قيل للناجين من المحاضرة السابقة كيف يشربون كمية أقل من القهوة ويقاتلون بالسيوف أثناء تجميع مشروعهم.


تم رفع الجوانب التالية:

  • مراحل الترجمة في C / C ++ ؛
  • التبعية،
  • قوالب خارجية
  • رؤوس المترجمة مسبقا.
  • تجميع متوازي وموزع ؛
  • ذاكرة التخزين المؤقت
  • استبدال مكونات الترجمة: المعالج المسبق ، المترجم ، رابط ؛
  • وحدة تجميع واحدة (SCU) ؛
  • وحدات.


سلوك غير محدد ، أو كيفية إطلاق النار على نفسك في القدم


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

  • سلوك غير محدد وغير محدد ؛
  • الذهاب إلى الصفيف ؛
  • نقص المدمر الظاهري ؛
  • حذف المشغل
  • مؤشرات فارغة.
  • التحولات.
  • تجاوز عدد صحيح (أخطاء 64 بت) ؛
  • تجاوز عدد صحيح (المجموع الاختباري).


C ++ 20 والمستقبل المنظور


لم نتمكن من إنهاء دورة المحاضرات لدينا بقصة حول الإصدار الوشيك لأحدث معايير C ++ 20. تم التركيز بشكل رئيسي على المفاهيم ( Concepts ) ، مكتبة النطاقات ( النطاقات ) ، coroutines ( Coroutines ) ، الوحدات النمطية ( الوحدات النمطية ) ، العقود ( العقود ) ، مشغل مشغل المقارنة الثلاثية <=> ( مشغل Spaceship ) ، وحدات الماكرو لاختبار الوظائف ( اختبار الميزات) وحدات الماكرو ) ، سمات ( سمات ) ، الأمراض المنقولة جنسيا :: الشكل ، الأمراض المنقولة جنسيا :: jthread وأكثر من ذلك بكثير ...


وهكذا ، عندما تم حل جميع القضايا التنظيمية ، جاءت اللحظة لإدراك الفكرة.

تطبيق


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

الآن دعنا نتحدث عن بداية الدورة. اشترك حوالي 20 مشاركًا في المحاضرة الأولى ، ولكن في الواقع حضر 11 طالبًا. بالطبع ، لقد فهمنا أن الحكم على الحدث الأول أمر غبي ، وقررنا مشاهدة ما سيحدث بعد ذلك. كان عدد الطلاب للدورة بأكملها يتغير باستمرار: لقد كان في تزايد أو تناقص. ومع ذلك ، فقد أحببنا وجود "عمود فقري" معين من المجموعة ، والذي كان حاضراً في كل محاضرة. من الايجابيات ، يمكنك أيضا تسليط الضوء على نشاط المشاركين. كما هو الحال في أي مجموعة جديدة ، في البداية كان الجميع يشعرون بالحرج والاستماع بصمت إلى المحاضرة ، ولكن في مكان ما بين 3-4 محاضرات مرت هذه القيود ، واصلت الدروس في شكل أكثر نشاطًا - أسئلة ، مناقشات ، مجرد اتصال مباشر بعد المحاضرة - وكانت هناك حالات ، عندما استمر شخص في التواصل مع المحاضر لمدة 40-50 دقيقة أخرى ، لأنه مهتم جدًا بالموضوع ويريد حقًا أن يتطور في هذا الاتجاه. لا يمكن أن نفرح هذا ، لأننا فهمنا أننا ساهمنا جزئيًا في هذه الحقيقة (+ 100 إلى الكرمة).


الأكثر استمرار تم منح الشهادات.


النتائج


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

  1. كان أساس CA الطلاب ، وربما ، بعد الاشتراك في الدورة ، كان لديهم فكرة معينة حول هذا الموضوع ، ولكن توقعاتهم لم تتزامن مع الواقع ، لأنه على الرغم من حقيقة أن الدورة تغطي الجوانب العامة للبرمجة في C / C ++ ، الكثير من القضايا ذات التركيز الضيق والمتخصص.
  2. تم عقد الدورة في ذروة الصيف (نعم ، نحن نعلم أن هذا العام ليس حجة ، خاصة إذا كنت تعيش في وسط روسيا). غادر الكثير من المدينة ولم يتمكنوا من حضور الدورة ، حتى لو كانوا مهتمين بها.
  3. كان هناك مبرمجين في مجال العمل يعرفون كل شيء دون مسارنا :)

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

إذا كانت لديك أي أسئلة ، أو حتى اقتراحات أو أفكار ، فلا تتردد في ترك تعليقات - سنتحدث :). ونعم ، شكرا لقراءة هذا المقال.

رابط لاختيار التقارير: "الحديث والفعال C ++" فكونتاكتي ويوتيوب . سنكون ممتنين إذا كنت تشاركها على الشبكات الاجتماعية.

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


All Articles