سأحاول من خلال هذا المقال مساعدتك عريزي القارئ على التعرف على عالم البرمجة، وارشادك الى الطريق الصحيح لتعلم البرمجة. سأقوم بنشر المزيد من المقالات ضمن نفس السلسلة للحديث عن المزيد.
سأتحدث في هذه المقالة عن الأساسيات (وبخاصة النظرية) التي يجب على شخص جديد كليا في عالم البرمجة معرفتها قبل البداية. سأقوم في مقالة لاحقة بالحديث عن بعض انواع الادوات والخبرة العملية التي ينبغي عليك اكتسابها للانتقال الى سوق العمل.
لمحة عن أهمية البرمجيات، أنواعها، والوظائف في مجال البرمجيات
الحاجة الماسة الى البرمجيات والمبرمجين
منذ بداية القرن الحالي، بدأت البرمجيات تغزو حياتنا بشكل كبير، حتى باتت اليوم تشكل عمودا فقريا في شتى جوانب الحياة. وقد زاد انتشار الانترنت الواسع من اهمية وسيطرة هذه البرمجيات.
الأمثلة على ذلك كثيرة، من بينها محركات البحث عن المعلومات (Google)، برمجيات التواصل والتواصل الاجتماعي (Skype, Whatsapp, Facebook..)، مواقع وتطبيقات التجارة عبر الانترنت (Amazon)، مواقع وتطبيقات حجوزات الطيران والفنادق وغيرها (Booking.com, Expedia, ..)، تطبيقات الحكومة الالكترونية (كمواقع السفارات، منح التأشيرات عبر الانترنت، مواقع تسديد الضرائب ..)، انظمة الملاحة والتنقل (Google Maps، مواقع وتطبيقات شركات المواصلات المحلية والدولية)، برمجيات المحاسبة وادارة المخازن، برمجيات ادارة المشافي، الخدمات المصرفية عبر الانترنت، وغير ذلك الكثير.
اليوم، معظم الأعمال والمشاريع التجارية الناشئة تحتاج الى البرمجيات (تطبيقات الموبايل، او موقع انترنت) لمساعدتها للوصول الى زبائنها، وتقديم خدماتها عبر الانترنت في معظم الاحيان. وقد بات الحصول على موقع انترنت لمشروعك لا يقل اهمية عن طباعة بطاقات العمل التعريفية. باختصار، ليس بإمكاني أن أتذكر أخر مرة قمت بها بالاتصال بمصفف الشعر الخاص بي لحجز موعد، او بشركة التأمين او المصرف لاجراء اي معاملة، بل أنني اقوم بذلك كله عبر الانترنت.
هذه الحاجة المتزايدة الى البرمجيات - تطويرها، صيانتها وتشغيلها - أدى الى ازدياد الطلب على المبرمجين بشكل كبير، مما أدى الى جعل مهنة البرمجة إحدى أكثر المهن رواجا اليوم في المجتمعات المتقدمة، كذلك ادى الى ارتفاع اجور ورواتب من يعملون في هذا المجال بشكل كبير.
العمل في مجال البرمجيات
يرغب الكثير من الناس بتعلم البرمجة، سواء كهواية او كوسيلة للعيش. على أية حال، هناك العديد من المجالات الفرعية التي تتعلق بالبرمجة، سأحاول المرور على اهمها واوضح الفروقات بينها. لكن قبل الذهاب الى التفاصيل، من المهم جدا أن تدرك بأنه في الواقع، لا أحد يتخصصُ في مجالٍ دون الاخر، بل يحتاج المطوّر -مهما كان تخصصه - الى درجة ما من المعرفة في باقي التخصصات، فهي تتداخل في الواقع.
1- تطوير برمجيات الويب (Web development)
يركز المتخصصون في هذا المجال على هندسة، إنشاء وصيانة مواقع الانترنت وخدمات الويب (مثل الموقع الذي تقوم بتصفحه حاليا -أفق- وغيره الكثير)، مع كل ما يتعلق بذلك. تتدرج هذه المواقع من المواقع الصغيرة، الى المواقع كبيرة الحجم والتي تعمل على مستوى العالم وتخدم ملايين الزوار في وقت واحد.
حتى في مجال تطوير برمجيات الويب، قد تجد المزيد من الفروع والتخصصات، مثل Front-end development اي تطوير برمجيات المتصفحات او القسم الأمامي، Backend development اي تطوير البرمجيات التي تعمل على المخدمات، وغير ذلك.
2- تطوير التطبيقات البرمجية (Software application development)
تعنى بتطوير التطبيقات التي تعمل على الاجهزة المحمولة المختلفة، والتي عادة ماتكون مرافقة لمواقع الويب. من امثلة هذه التطبيقات، تطبيق الفيس بوك وتطبيق الواتس اب، وغير ذلك الكثير.
كما تلاحظ، هذه التطبيقات في معظم الاحيان ليست الا واجهة مختلفة تقدم نفس الخدمات التي تقدمها مواقع الويب الموافقة لها، لذلك فغالبا ما تُستَخدم واجهات برمجة التطبيق APIs (أو الـ Backend) نفسها لتخديم تطبيقات الويب، وتطبيقات الموبايل.
3- هندسة الأنظمة الحاسوبية (Computer systems engineering)
تعنى بفهم احتياجات التطبيقات المعقدة، وايجاد الحلول المناسبة لها، وهذا قد يتضمن امور تتعلق بادارة النظام، ادارة الشبكة وغيرها.
4- إدارة قواعد البيانات (Database adminstration)
يقوم مهندسو قواعد البيانات بتخطيط وتنفيذ الانظمة المسؤولة عن ادارة، تخزين، تنظيم وحماية كميات كبيرة من البيانات في الشركات التي يعملون لصالحها.
5- ضمان جودة البرمجيات (Software quality assurance)
يقوم مهندسو جودة البرمجيات باختبار البرمجيات للتأكد من عملها بالشكل الصحيح، تصميم وتنفيذ الاختبارات الالية المختلفة، وكذلك كتابة ادلة الاستخدام احيانا.
وهناك العديد من المسميات الاخرى التي قد تندرج تحت مظلة البرمجيات (أو تتعلق بها)، على سبيل المثال لا الحصر: مهندسو البيانات (Data engineers)، مهندسو التعلم الالي (Machine learnings engineers)، مديرو الانظمة (System adminstrators)، معماريو النظام (System architects)، وغير ذلك الكثير.
كيف أبدأ بتعلم البرمجة من الصفر؟
من المرجّح أنك متحمس جداً لبناء أول تطبيق موبايل خاص بك، أو ابهار اصدقائك بأول لعبة قمت بتصميمها بنفسك، وهذا شيء جيد ومشوق! لكن كن صبورا قليلا. إن كنت ترغب بتعلم البرمجة بشكل صحيح، احترافها، والمتابعة في هذا المسار، فأنصحك بالتمهل قليلا واستثمار بعض الوقت لتعلم بعض الاساسيات، قبل الخوض في غمار البرمجة الواسع. هذه الأساسيات ستسهل عليك تعلم أي شيء جديد مستقبلا، تابع معي.
ماهي لغة البرمجة التي يجب أن أتعلمها؟
قد يكون أول سؤال يتبادر الى ذهن من يريد تعلم البرمجة: ماهي لغة البرمجة التي يجب أن اتعلمها؟ في الحقيقة، انه المكان الخاطئ للبداية في تعلم البرمجة.
أود أن اجيبك عزيزي القارئ، لغة البرمجة لا تهم. تعلم البرمجة يعني بشكل اساسي تعلم التفكير المنطقي كمبرمج. لغات البرمجة هي إحدى الأدوات التي يستخدمها المبرمجون في عملية صناعة البرمجيات، وعادة ما تحتاج الى عدة لغات برمجة وأدوات أخرى لإتمام مشروع واحد. ما ينبغي عليك اكتسابه هو المهارة في استخدام أي واحدة من هذه اللغات، بعدها يصبح تعلم لغة جديدة اشبه بتعلم قيادة نوع جديد من السيارات لشخص يقود السيارة مسبقا.
مقاربة من الحياة الواقعية: فَكّر بمهنة النجار
يقوم النجار باستخدام العديد من الادوات، من أجل قص الأخشاب، قياس اطوالها، تنعيمها وغير ذلك. النجار يعرف كيف يحسب القياسات الصحيحة، وكيف يجب أن يقص الخشب، لكن يمكن أن يقوم بتغيير اداة القص من واحدة يدوية الى اخرى اوتوماتيكية. كل اداة قص لها طريقة استخدام مختلفة، وقد تناسب حالات مختلفة، فالقصات المتعرجة قد تحتاج ادوات مختلفة عن القصات المستقيمة. الامر شبيه تماما بلغة البرمجة. البرمجة هي عبارة عن طريقة لاخبار الحاسب ما ينبغي فعله، ولدينا العديد من الادوات (لغات البرمجة) للقيام بذلك، كل منها تعمل بشكل أكثر كفاءة في حالات معينة.
لكن بالنسبة للمبتدئين، لغة البرمجة بحد ذاتها غير مهمة كثيرا، فقط اختر ما يحلو لك، ودعنا ننتقل للسؤال الأهم.
ما هي المهارات التي يجب أن أتقنها كي أصبح مبرمجاً؟
هذا هو السؤال الجيد! للعمل في البرمجة، وبغض النظر عن الاختصاص الذي ترغب في التخصص به لاحقا، هناك العديد من الاساسيات التي ينبغي لاي شخص يعمل في المجال أن يعرفها، هذه المهارات ستساعدك في المضي قدما في طريقك في عالم البرمجيات. سأحاول من خلال ما يلي تسليط الضوء على اهمها.
الخوارزميات - وأسلوب التفكير المنطقي
إن كان هناك صفة واحدة يجب أن تتوفر في المبرمج، فهي اسلوب التفكير المنطقي. التفكير المنطقي (ويسمى احيانا بالمنطق التحليلي) هو تفكير رياضي بحت، يعتمد على الحقائق والمنطق ويبتعد عن وجهات النظر الشخصية.
في البرمجة، التفكير المنطقي هو مهارة اساسية يجب تعلمها لتكون قادرا على كتابة الخوارزميات. والخوارزمية هي سلسلة محددة من الخطوات لحل مشكلة ما او تنفيذ مهمة ما.
فلنأخذ كمثال مسألة تحليل عدد صحيح الى عوامله الأوليةـ اي ايجاد مجموعة من الاعداد الأولية التي ينتج عنها العدد المطلوب عندما نقوم بضربها ببعضها.
مثال، يمكننا القول: 18 = 2ْ*3*3، اذن عوامل العدد 18 الاولية هي 2، 2، 3 لان جدائها يساوي 18.
كأشخاص أذكياء، يمكننا ان نقوم بهذه المهمة بشكل بديهي بدون التفكير عميقا بكيفية قيامنا بها. لكن، كي نجعل الحاسوب يقوم بهذه المهمة، فنحن بحاجة الى تعريف خطوات واضحة، دقيقة ومنطقية تسمح له بالقيام بالمهمة. هذه الخطوات تدعى الخوارزمية.
دعنا نحاول أن نفكر في خوارزمية ما لتحليل عدد الى عوامله الاولية. الخوارزمية عموما هي مجموعة خطوات يجب ان تكون عامة بشكل كاف وصحيحة لتعمل على اي مثال (دخل معطى)، وتنتج الخرج (الجواب) الصحيح دائما.
احدى الخوارزميات التي يمكن استخدامها لتحليل عدد الى عوامله الاولية قد تكون كالتالي:
- نفترض ان العدد المطلوب تحليله هو N (الدخل).
- نريد الان اختبار قابلية العدد N للقسمة على كل عامل اولي اصغر منه. دعنا نقم بتعريف عدد آخر P ليمثل العامل الاولي المفترض، ولنعطه القيمة 2 (اصغر عامل اولي ممكن).
- قم بتكرار الخطوات التالية (4-5) مادام العامل الذي وصلنا اليه P اصغر من او مساو للجذر التربيعي للعدد المطلوب تحليله N:
- ان كان العدد N يقبل القسمة على P، فان P هو احد عوامل N، فقم بطباعته (اضافته الى الخرج او النتيجة)، وقم بتقسيم N على P وخزن الناتج في N (اي اننا الان سنتابع في تحليل N/P الى عوامله الاولية). عد للخطوة 3
- أما اذا لم يكن N يقبل القسمة على P، قم بالانتقال الى العامل التالي، واسهل طريقة للقيام بذلك هي اضافة واحد الى P، ثم عد للخطوة 3
- اضف قيمة N الاخيرة الى النتيجة
الصورة التالية هي تمثيل بياني للخوارزمية السابقة (مأخوذة من هذا الموقع)
جرب تطبيق الخوارزمية على المثال:
وفقا للخطوة 1، نعرف العدد المراد تحليله وهو N=18، ووفقا للخطوة 2، نعرف العامل المفترض P=2.
في الخطوة 3، نلاحظ ان العامل المفترض (2) اصغر من الجذر التربيعي ل18 (او ان 2*2 اصغر من 18)، اذا نتابع تنفيذ الخطوات وننتقل للخطوة 4.
في الخطوة 4، نلاحظ ان 18 يقبل القسمة على 2، اذن 2 هو عامل اولي للعدد 18، فنقوم بطباعة 2 الى النتيجة، ونقوم بتقسيم 18 على 2 لنحصل على 9. (الان، المسالة اصبحت عبارة عن تحليل 9 الى عوامله الاولية)، نعود للخطوة 3
في الخطوة 3، نلاحظ ان العامل المفترض (2) لا يزال اصغر من الجذر التربيعي لN=9 (او ان 2*2 اصغر من 9)، اذا نتابع تنفيذ الخطوات.
نلاحظ ان N والذي يساوي 9 الآن لم يعد يقبل القسمة على 2، فننتقل للخطوة 5، و نقوم باضافة 1 الى العامل الاولي P ليصبح 3، ونعود للخطوة 3.
في الخطوة 3، نلاحظ ان العامل المفترض 3 اصغر او يساوي الجذر التربيعي لل9، اذا نتابع التنفيذ وننتقل للخطوة 4 حيث نرى ان 9 تقبل القسمة على العامل المفترض P=3، فنقوم بطباعة 3 الى النتيجة، ونقوم بتقسيم N على 3 لتصبح قيمته الجديدة N=3، وننتقل مجددا ال الخطوة رقم 3.
4- نلاحظ ان العدد P=3 لم يعد اكبر من الجذر التربيعي لـ N=3، اذن نتوقف عن التكرار وننتقل الى نهاية الخوارزمية (الخطوة 6) حيث نقوم بطباعة قيمة N=3 الى النتيجة
أصبخ خرج الخوارزمية السابقة هو 2, 3, 3 اذن ينتج عن تحليل 18 الى عوامله الاولية الاعداد 2,3,3 وفقا لخوارزميتنا، وهذا صحيح.
حاول تتبع الخوارزمية من اجل اي عدد اخر مختلف عن 18، مثلا 100، ستحصل على الجواب الصحيح.
لا أهدف من خلال المثال السابق الى جعلك خبير بالخوارزميات، لكن فقط اطلاعك على ما تعنيه كلمة خوارزمية، وكيف تقوم بكتابة خوارزمية بسيطة.
باعتقادي الشخصي، من الضروري جدا أن تستثمر بعض الوقت لتتعلم أكثر عن الخوارزميات، وتمارس كتابة خوارزميات بسيطة (على الورقة، بدون حاسوب) لحل مشاكل بسيطة. تعلم الخوارزميات سيساهم بشكل كبير في تعزيز التفكير المنطقي التحليلي لديك، وسيساعدك كثيرا عند تعلم لغات البرمجة لاحقا. ليس عليك التعمق كثيرا في المجال منذ البداية، وليس عليك دراسة خوارزميات معقدة حاليا، يمكنك القيام بذلك في مراحل لاحقة.
لغة البرمجة Programming Language
الآن، وبعد أن تعرفت على اساسيات الخوارزميات، اصبحت جاهزا لتعلم أساسيات احدى لغات البرمجةـ بحيث يمكنك تطبيق بعض الخوارزميات التي تعلمتها من خلال برامج حاسوبية.
لغة البرمجة ماهي إلا مجموعة من التعليمات التي تعطى للحاسب للتحكم بتنفيذ البرامج، وهذه التعليمات عادة ما تكون وفق خوارزمية معينة.
ليس من المهم جدا اختيار لغة برمجة دون الاخرى في البداية، فجميعها ستفي بالغرض، ولكن بشكل عام، عادة ما ينصح المبتدئين بتعلم لغة مثل Python لسهولة استخدامها بشكل تفاعلي.
يمكنك كتابة الخوارزمية السابقة لتحليل أي عدد طبيعي الى عوامله الاولية بوساطة لغة Python كالتالي
n = int(input("Enter a number\n"))
p = 2
while(p*p <= n):
if(n%p == 0):
print(p, "*", end=" ")
n = int(n/p)
else:
p = p+1
print(n)
يسمح البرنامج السابق للمستخدم بإدخال قيمة العدد المطلوب تحليله (عبر نافذة موجه الاوامر التي يتم تشغيل البرنامج ضمنها)، ثم يقوم البرنامج بتحليل العدد الى عوامله الاولية وطباعة هذه العوامل الى نفس النافذة.
بنى المعطيات الأساسية (Data structures)
فلنعد بشكل سريع الى القسم النظري، إحدى المفاهيم المهمة جدا لاي مبرمج هي بنى المعطيات.
بنى المعطيات تعبر عن اسلوب تخزين البيانات الذي سوف تستخدمه في برامجك. أنصحك بشدة بالتعرف على بنى المعطيات الاساسية والقاء نظرة سريعة على الية عملها.
من بنى المعطيات الاساسية: المصفوفات Arrays، القوائم المترابطة Linked lists، الارتال Queus، المكدسات Stacks، الاشجار Trees، البيان Graphs، الخرائط Map, HashMap، وغير ذلك الكثير.
مجددا، ليس عليك التعرف على جميع انواع بنى المعطيات، لكن من الجيد الاطلاع على بعضها لفهم حالات استخدام كل منها. معظم لغات البرمجة تحتوي على دعم لبنى المعطيات المعيارية بحيث يمكنك استخدامها عند الحاجة بدون كتابتها من الصفر.
أساسيات علوم الحاسب الأخرى
اذا قررت احتراف البرمجة والمضي قدما للعمل في مجال البرمجيات، فقد يكون من المهم جدا ان تلقي نظرة على بعض المواضيع النظرية الاخرى في علوم الحاسب.
أن كنت ممن يدرسون علوم الحاسب اكاديميا، هندسة البرمجيات ونظم المعلومات، هندسة المعلوماتية او اي من الاختصاصات المشابهة، فلا داعي للقلق، لانك غالبا قمت (أو ستقوم) بدراسة والاطلاع على جميع المفاهيم النظرية التي يحتاجها شخص يعمل في مجال البرمجيات.
أما اذا كانت خلفيتك الاكاديمية مختلفة، فسأحاول هنا اعطاءك بعض العناوين التي يمكنك البحث عنها لاحقا وتعلمها خلال مسيرتك.
هناك العديد من المواضيع -هذا صحيح- لكن لا تقلق بشأن ذلك، ستتعلم جميع هذه المفاهيم خلال مسيرتك البرمجية تدريجيا، ليس عليك تكريس الوقت لتعلم كل هذا منذ البداية (فهذا مستحيل). لكن مع هذا فمن المهم ذكر هذه المواضيع، لتبقى العناوين عالقة في ذاكرتك، فقد تحتاج البحث عنها لاحقا.
الخوارزميات وبنى المعطيات
كما سبق وذكرت، تعد حجر الأساس لاي شخص يريد الدخول في مجال البرمجة. من فضلك، احترفها جيدا! يمكنك ايضا تجربة ما يعرف بالبرمجة التنافسية Competetive Programming لتقوية نفسك في هذا المجال.
هناك العديد من المواقع التي يمكنك التسجيل بها، من ثم قراءة وحل المسائل البرمجية لتقوية خبراتك واكتساب النقاط. كما ويمكنك المشاركة في المسابقات التي تقيمها هذه المواقع
من الجدير بالذكر، ان البرمجة التنافسية احدى أهم المهارات المطلوبة التي تساعدك على العمل في شركات البرمجة الكبرى مثل غوغل، فايس بوك وغيرها. قمت بكتابة مقال منفصل عن البرمجة التنافسية، أهميتها، والطرق والمراجع التي يمكنك استخدامها لتعلمها، قم بالاطلاع عليها
لغات البرمجة
عليك أن تجيد لغة برمجة واحدة على الاقل، وتعرف كيف تتعامل مع لغات اخرى. من أجل البداية، دعنا نركز على لغة واحدة ولاحقا ننتقل لتعلم باقي اللغات عند الحاجة.
تحليل تعقيد الخوارزميات
نظرية التعقيد (Complexity Theory) علم متشعب ومتفرع، لكن ما يهمك هنا هو القدرة على فهم وحساب التعقيد الزمني والمكاني للنصوص البرمجية (اي كم من الزمن مكلف تنفيذ النص البرمجي، وكم من الذاكرة يستهلك تنفيذ النص البرمجي). تعتبر هذه ايضا مهارة اساسية لاي شخص يريد العمل في مجال البرمجة.
نظريات هندسة البرمجيات Software Engineering ونماذج البرمجة
هناك الكثير من الدراسات النظرية (مع تطبيقاتها العملية) عن هندسة البرمجيات، كيف تقوم بهيكلة وبناء التطبيقات الكبيرة.
باختصار، هناك العديد من النماذج المعيارية و "أفضل الممارسات" التي تم تطويرها عبر العقود الماضية واعتمادها في عملية تطوير البرمجيات والتي يجب على اي مبرمج ان يتعرف عليها.
لعل أهم المواضيع التي ينبغي عليك التعلم عنها هو البرمجة غرضية التوجه Object Oriented Programming مع كل ما ينطوي عليه ذلك من مفاهيم اخرى، مثل التغليف Encapsulation، الوراثة Inheritance، تعدد الاشكال Polymorphism، وغير ذلك الكثير.
بالاضافة الى نماذج البرمجة، ينبغي عليك تعلم نماذج التصميم المختلفة Design Patterns المختلفة.
قواعد البيانات
من المهم جدا ايضا التعرف على قواعد البيانات المعيارية، وبخاصة لغة SQL، كيف تعمل قواعد البيانات، كيفية تخزين البيانات، فهرستها، والوصول اليها بشكل فعال، انواع قواعد البيانات المختلفة، وغير ذلك من المواضيع الاخرى المتعلقة بقواعد البيانات.
أنظمة التشغيل، بخاصة ادارة الإجرائيات Process Management
تندرج العديد من المواضيع النظرية تحت مظلة أنظمة التشغيل، ومن اهمها ادارة الاجرائيات: من المهم فهم كيف تقوم انظمة التشغيل بإنشاء (بدء) الاجرائيات المختلفة، ادارتها وانهائها. من المهم ايضا فهم كيفية تواصل هذه الاجرائيات مع بعضها، وكيف يتم تنفيذ البرامج على التوازي، كذلك مفهوم Threads وغير ذلك من المواضيع المتقدمة.
أساسيات الشبكات Computer networks
ليس عليك التعمق في مجال الشبكات كي تكون مهندس برمجيات، لكن من الضروري فهم الاساسيات مثلا كيف يتم عنونة اجهزة الحاسب والاجهزة المختلفة، ماهي البنى المختلفة الموجودة في الشبكات، مفاهيم الـ IP، المنفذ Port، البروتوكولات الاكثر انتشارا Http, TCP, UDP وغير ذلك.
ماذا الآن؟
لقد تلقيت للتو الكثير من المعلومات النظرية. لا تقلق بشأن ذلك، نصيحتي لك الان:
اذا كنت مبتدئ كليا، فابدأ بتعلم الخوارزميات وقم بتثبيت احدى لغات البرمجة (مثل بايثون أو C++) لتطبيق ما تتعلمه، راجع هذه المقالة للحصول على المراجع الضرورية.
اما اذا كان لديك بعض المعرفة في الاساسيات: فحاول الاطلاع على المواضيع الاخرى المنشورة في هذه المقالة واستخدمها كدليل لك لترميم اي نقص قد تراه.
في كلا الحالتين، ترقب المزيد من المقالات حيث سنتطرق الى مواضيع مختلفة في هذا المجال.
في الختام
لا تتردد بتدوين جميع الأسئلة التي تخطر في بالك، وطرحها في التعليقات. كذلك في اخباري عما تحب أن اكتب عنه في المقالات القادمة، سأكون سعيدا بتلقي اقتراحاتكم. قم بالتسجيل بالموقع إن لم تقم بذلك بعد كي تتلقى باقي المقالات من السلسلة.
تم التدقيق من قبل بانة عمر
صورة الغلاف من قبل Galymzhan Abdugalimov، تم التحميل من Unsplash
مقالة سلسة وذات معلومات قيمة وهي بداية رائعة للراغبين بالخوض في هذا المجال..
شكرا لك
مقالة مفيدة كتير و مشجعة
مقالة رائعة و مشجعة كتير