التعرف على عالم البرمجةسأقوم بنشر المزيد من المقالات ضمن نفس السلسلة.
سأتحدث في هذه المقالة عن الأساسيات (وبخاصة النظرية) التي يجب على شخص جديد كليا في عالم البرمجة معرفتها قبل البداية. سأقوم في مقالة لاحقة بالحديث عن بعض انواع الادوات والخبرة العملية التي ينبغي عليك اكتسابها للانتقال الى سوق العمل.
لمحة عن أهمية البرمجيات، أنواعها، والوظائف في مجال البرمجيات
- نفترض ان العدد المطلوب تحليله هو N (الدخل).
- نريد الان اختبار قابلية العدد N للقسمة على كل عامل اولي اصغر منه. دعنا نقم بتعريف عدد آخر P ليمثل العامل الاولي المفترض، ولنعطه القيمة 2 (اصغر عامل اولي ممكن).
- قم بتكرار الخطوات التالية (4-5) مادام العامل الذي وصلنا اليه P اصغر من او مساو للجذر التربيعي للعدد المطلوب تحليله N:
- ان كان العدد N يقبل القسمة على P، فان P هو احد عوامل N، فقم بطباعته (اضافته الى الخرج او النتيجة)، وقم بتقسيم N على P وخزن الناتج في N (اي اننا الان سنتابع في تحليل N/P الى عوامله الاولية). عد للخطوة 3
- أما اذا لم يكن N يقبل القسمة على P، قم بالانتقال الى العامل التالي، واسهل طريقة للقيام بذلك هي اضافة واحد الى P، ثم عد للخطوة 3
- اضف قيمة N الاخيرة الى النتيجة
- لغه البرمجة Programming Language
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)
منذ بداية القرن الحالي، بدأت البرمجيات تغزو حياتنا بشكل كبير، حتى باتت اليوم تشكل عمودا فقريا في شتى جوانب الحياة.
وقد زاد انتشار الانترنت الواسع من اهمية وسيطرة هذه البرمجيات.
الأمثلة على ذلك كثيرة، من بينها محركات البحث عن المعلومات (Google)، برمجيات التواصل والتواصل الاجتماعي (Skype, Whatsapp, Facebook..)،
مواقع وتطبيقات التجارة عبر الانترنت (Amazon)، مواقع وتطبيقات حجوزات الطيران والفنادق وغيرها (Booking.com, Expedia, ..)، تطبيقات الحكومة الالكترونية :
(كمواقع السفارات، منح التأشيرات عبر الانترنت، مواقع تسديد الضرائب ..)،
انظمة الملاحة والتنقل (Google Maps، مواقع وتطبيقات شركات المواصلات المحلية والدولية)،
يرغب الكثير من الناس بتعلم البرمجة، سواء كهواية او كوسيلة للعيش. على أية حال، هناك العديد من المجالات الفرعية التي تتعلق بالبرمجة، سأحاول المرور على اهمها واوضح الفروقات بينها.
لكن قبل الذهاب الى التفاصيل، من المهم جدا أن تدرك بأنه في الواقع، لا أحد يتخصصُ في مجالٍ دون الاخر، بل يحتاج المطوّر -مهما كان تخصصه - الى درجة ما من المعرفة في باقي التخصصات، فهي تتداخل في الواقع.
يركز المتخصصون في هذا المجال على هندسة، إنشاء وصيانة مواقع الانترنت وخدمات الويب (مثل الموقع الذي تقوم بتصفحه حاليا " منصة أمل للبرمجة ). تتدرج هذه المواقع من المواقع الصغيرة، الى المواقع كبيرة الحجم والتي تعمل على مستوى العالم وتخدم ملايين الزوار في وقت واحد.
حتى في مجال تطوير برمجيات الويب، قد تجد المزيد من الفروع والتخصصات، مثل Front-end development اي تطوير برمجيات المتصفحات او القسم الأمامي، Backend development اي تطوير البرمجيات التي تعمل على المخدمات، وغير ذلك.
يقوم مهندسو قواعد البيانات بتخطيط وتنفيذ الانظمة المسؤولة عن ادارة، تخزين، تنظيم وحماية كميات كبيرة من البيانات في الشركات التي يعملون لصالحها.
يقوم مهندسو جودة البرمجيات باختبار البرمجيات للتأكد من عملها بالشكل الصحيح، تصميم وتنفيذ الاختبارات الالية المختلفة، وكذلك كتابة ادلة الاستخدام احيانا.
وهناك العديد من المسميات الاخرى التي قد تندرج تحت مظلة البرمجيات (أو تتعلق بها)، على سبيل المثال لا الحصر: مهندسو البيانات (Data engineers)، مهندسو التعلم الالي (Machine learnings engineers)، مديرو الانظمة (System adminstrators)، معماريو النظام (System architects)، وغير ذلك الكثير.
ماهي لغة البرمجة التي يجب أن اتعلمها؟
هذا هو السؤال الجيد! للعمل في البرمجة، وبغض النظر عن الاختصاص الذي ترغب في التخصص به لاحقا، هناك العديد من الاساسيات التي ينبغي لاي شخص يعمل في المجال أن يعرفها، هذه المهارات ستساعدك في المضي قدما في طريقك في عالم البرمجيات.
إن كان هناك صفة واحدة يجب أن تتوفر في المبرمج، فهي اسلوب التفكير المنطقي. التفكير المنطقي (ويسمى احيانا بالمنطق التحليلي) هو تفكير رياضي بحت، يعتمد على الحقائق والمنطق ويبتعد عن وجهات النظر الشخصية.
في البرمجة، التفكير المنطقي هو مهارة اساسية يجب تعلمها لتكون قادرا على كتابة الخوارزميات. والخوارزمية هي سلسلة محددة من الخطوات لحل مشكلة ما او تنفيذ مهمة ما.
فلنأخذ كمثال مسألة تحليل عدد صحيح الى عوامله الأوليةـ اي ايجاد مجموعة من الاعداد الأولية التي ينتج عنها العدد المطلوب عندما نقوم بضربها ببعضها.
مثال، يمكننا القول: 18 = 2ْ*3*3، اذن عوامل العدد 18 الاولية هي 2، 2، 3 لان جدائها يساوي 18.
كأشخاص أذكياء، يمكننا ان نقوم بهذه المهمة بشكل بديهي بدون التفكير عميقا بكيفية قيامنا بها. لكن، كي نجعل الحاسوب يقوم بهذه المهمة، فنحن بحاجة الى تعريف خطوات واضحة، دقيقة ومنطقية تسمح له بالقيام بالمهمة. هذه الخطوات تدعى الخوارزمية.
دعنا نحاول أن نفكر في خوارزمية ما لتحليل عدد الى عوامله الاولية. الخوارزمية عموما هي مجموعة خطوات يجب ان تكون عامة بشكل كاف وصحيحة لتعمل على اي مثال (دخل معطى)، وتنتج الخرج (الجواب) الصحيح دائما.
احدى الخوارزميات التي يمكن استخدامها لتحليل عدد الى عوامله الاولية قد تكون كالتالي:
الصورة التالية هي تمثيل بياني للخوارزمية السابقة (مأخوذة من هذا الموقع)
جرب تطبيق الخوارزمية على المثال:
وفقا للخطوة 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، ستحصل على الجواب الصحيح.
لا أهدف من خلال المثال السابق الى جعلك خبير بالخوارزميات، لكن فقط اطلاعك على ما تعنيه كلمة خوارزمية، وكيف تقوم بكتابة خوارزمية بسيطة.
باعتقادي الشخصي، من الضروري جدا أن تستثمر بعض الوقت لتتعلم أكثر عن الخوارزميات، وتمارس كتابة خوارزميات بسيطة (على الورقة، بدون حاسوب) لحل مشاكل بسيطة. تعلم الخوارزميات سيساهم بشكل كبير في تعزيز التفكير المنطقي التحليلي لديك، وسيساعدك كثيرا عند تعلم لغات البرمجة لاحقا. ليس عليك التعمق كثيرا في المجال منذ البداية، وليس عليك دراسة خوارزميات معقدة حاليا، يمكنك القيام بذلك في مراحل لاحقة.
الآن، وبعد أن تعرفت على اساسيات الخوارزميات، اصبحت جاهزا لتعلم أساسيات احدى لغات البرمجةـ بحيث يمكنك تطبيق بعض الخوارزميات التي تعلمتها من خلال برامج حاسوبية.
لغة البرمجة ماهي إلا مجموعة من التعليمات التي تعطى للحاسب للتحكم بتنفيذ البرامج، وهذه التعليمات عادة ما تكون وفق خوارزمية معينة.
ليس من المهم جدا اختيار لغة برمجة دون الاخرى في البداية، فجميعها ستفي بالغرض، ولكن بشكل عام، عادة ما ينصح المبتدئين بتعلم لغة مثل Python لسهولة استخدامها بشكل تفاعلي.
يمكنك كتابة الخوارزمية السابقة لتحليل أي عدد طبيعي الى عوامله الاولية بوساطة لغة Python كالتالي
يسمح البرنامج السابق للمستخدم بإدخال قيمة العدد المطلوب تحليله (عبر نافذة موجه الاوامر التي يتم تشغيل البرنامج ضمنها)، ثم يقوم البرنامج بتحليل العدد الى عوامله الاولية وطباعة هذه العوامل الى نفس النافذة.
فلنعد بشكل سريع الى القسم النظري، إحدى المفاهيم المهمة جدا لاي مبرمج هي بنى المعطيات.
بنى المعطيات تعبر عن اسلوب تخزين البيانات الذي سوف تستخدمه في برامجك. أنصحك بشدة بالتعرف على بنى المعطيات الاساسية والقاء نظرة سريعة على الية عملها.
من بنى المعطيات الاساسية:
المصفوفات 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 وغير ذلك.
ماذا الآن؟
لقد تلقيت للتو الكثير من المعلومات النظرية. لا تقلق بشأن ذلك، نصيحتي لك الان:
اذا كنت مبتدئ كليا، فابدأ بتعلم الخوارزميات وقم بتثبيت احدى لغات البرمجة (مثل بايثون) لتطبيق ما تتعلمه.
اما اذا كان لديك بعض المعرفة في الاساسيات: فحاول الاطلاع على المواضيع الاخرى المنشورة في هذه المقالة واستخدمها كدليل لك لترميم اي نقص قد تراه.
في كلا الحالتين، ترقب المزيد من المقالات حيث سنتطرق الى مواضيع مختلفة في هذا المجال.
لا تتردد بتدوين جميع الأسئلة التي تخطر في بالك، وطرحها في التعليقات.
دمتم في حفظ الله ورعايته
كتبه وحرره: 《G7TECHNOAPPS 》
تعليقات
إرسال تعليق