اذهب إلى المحتوى

لوحة المتصدرين

  1. Ola Saleh

    Ola Saleh

    الأعضاء


    • نقاط

      6

    • المساهمات

      11


  2. محمد عاطف17

    محمد عاطف17

    الأعضاء


    • نقاط

      3

    • المساهمات

      3116


  3. سامح أشرف

    سامح أشرف

    الأعضاء


    • نقاط

      1

    • المساهمات

      2934


  4. Mustafa Suleiman

    Mustafa Suleiman

    الأعضاء


    • نقاط

      1

    • المساهمات

      13183


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 10/19/24 في كل الموقع

  1. السلام عليكم اكادمية حاسوب . لدي مشكلة في الدعم . دائما اسال سؤال لا يتم الاجابة عنه (اساله تحت فيديو ) هل لاني اسال في المكان الغلط ؟ ام هناك سبب اخر ؟
    1 نقطة
  2. صممت موقع خاص بي بلغة html و CSS و JavaScript كيف اطلب من المستخدم الاذونات بسماح الى الوصول الى الصور بل python وهل هي مسموحه لنا ام فقط لشركات
    1 نقطة
  3. لاحظ في السطر الثاني بعد الشرط تقوم بوضع علامة ال ; وبهذا فإن البرنامج يعتقد أن كتلة الشرط فارغة أى لا تريد تنفيذ شئ إذا تحقق الشرط ولذلك لا يجب فتح تلك الأقواس بعد علامة ال ; حيث هنا يعتبر أن جملة if إنتهت ولا يمكن فتح else بعد إنتهائها. لذلك الحل هو حذف علامة ال ; فقط المشار إليها في الصورة السابقة.
    1 نقطة
  4. السلام عليكم يوجد بعض الاشياء ليست موجودة عندي في جهازي مثل خيار Run
    1 نقطة
  5. وعليكم السلام ورحمة الله وبركاته. ستجد أسفل فيديو الدرس صندوق للتعليقات كما هنا يرجى طرح سؤالك أسفل الدرس وليس هنا حيث هنا قسم الأسئلة العامة ولا نقوم بإجابة الأسئلة الخاصة بمحتوى الدورة أو الدرس، وذلك لمعرفة الدرس الذي توجد به مشكلتك و لمساعدتك بشكل أفضل.
    1 نقطة
  6. بعد الانتهاء من دورة بايثون ...ماذا يمكن ان يعمل الحاصل علي الدورة وهل يوجد فرص عمل لمطوري بايثون ؟؟
    1 نقطة
  7. السلام عيلكم هي اي منصه manara ؟
    1 نقطة
  8. وعليكم السلام ورحمة الله وبركاته . منصة "Manara" هي منصة تعليمية متخصصة في تطوير مهارات المبرمجيين وعلماء البيانات في منطقة الشرق الأوسط وشمال إفريقيا.حيث تقوم المنصة بتقديم تدريبات تقنية متقدمة بإشراف خبراء بالإضافة إلى جلسات تقييم ودورات تدريبية وذلك لهدف تمكين المشاركين من الحصول على فرص عمل عالمية وخاصة في الشركات التقنية الكبيرة. ويمكنك زيارة موقعهم الرئيسي لمزيد من المعلومات حول المنصة.
    1 نقطة
  9. وفقًا لمبرهنة النهاية المركزية Central limit theorem في الإحصاء لما تجمع عينات عن مجتمع population كبير وغير معلوم نوع التوزيع ال بيخضع ليه فتم ملاحظة إن كل ما جمعت عينات أكتر متوسط العينات دي هيكون هو المتوسط الخاص بالمجتمع population ك كل أو بيقرب ليه كل ما زودت عدد العينات
    1 نقطة
  10. مرحباً ، كما قال المدرب مصطفى محمود ، وأيضاً في بعض الأحيان تحتاج إلى اضافة http:// ليتم تنفيذ API ، في بعض الأحيان لا يتم تنفيذ URL مالم يتم وضع http او https ، جرب تعديل url ليكون بالشكل التالي : http://localhost:3000/testingDelete او كالتالي في حال قمت بضبته ليكون secure : https://localhost:3000/testingDelete بالتوفيق
    1 نقطة
  11. يمكن أن تخدع صيغة بايثون البسيطة وسهلة التعلم مطوري لغة بايثون Python وخاصة الجدد منهم، مما يؤدي إلى تفويت بعض التفاصيل الدقيقة والتقليل من قوة اللغة، لذا سنقدّم في هذا المقال قائمة بأكثر 10 أخطاء شيوعًا، والتي تكون دقيقة ويصعب اكتشافها ويمكن أن تخدع حتى مطور بايثون الأكثر تقدمًا. مقدمة إلى بايثون تُعَد بايثون لغة برمجة مُفسَّرة Interpreted وكائنية التوجّه Object-oriented وعالية المستوى ولها دلالات Semantics ديناميكية، وتجعل هياكلُ البيانات المُضمَّنة عالية المستوى، والتحقق الديناميكي من الأنواع، والربط الديناميكي من لغة بايثون جذابة للغاية لتطوير التطبيقات بسرعة، بالإضافة إلى استخدامها بوصفها لغة برمجة لكتابة السكربتات أو لغة لاصقة Glue Language لوصل المكونات أو الخدمات الموجودة مسبقًا مع بعضها البعض. كما تدعم لغة بايثون الوحدات والحزم، وبالتالي تشجع التقسيم إلى وحدات Modularity وإعادة استخدام الشيفرة البرمجية. ملاحظة: هذا المقال مخصَّص للمبرمجين المحترفين في بايثون، وليس موجَّهًا للمطورين الجدد الذين قد يكونون أقل دراية بأخطاء بايثون الشائعة. الخطأ 1: استخدام التعابير بوصفها قيمًا افتراضية لوسطاء الدوال بطريقة خاطئة تسمح لغة بايثون بتحديد وسيط الدالة بأنه اختياري من خلال توفير قيمة افتراضية له، ولكن قد تؤدي هذه الميزة إلى بعض الارتباك عندما تكون القيمة الافتراضية متغيرة بالرغم من أن هذه ميزة رائعة لهذه اللغة. إليك تعريف دالة بايثون التالي مثلًا: >>> def foo(bar=[]): # يُعد الوسيط‫ bar اختياريًا وقيمته الافتراضية هي [] عند عدم تحديدها ... bar.append("baz") # ولكن يمكن أن يسبّب هذا السطر مشكلة كما سنرى لاحقًا‫... ... return bar من الأخطاء الشائعة أن نعتقد أن الوسيط الاختياري مضبوط على التعبير الافتراضي المحدَّد في كل مرة تُستدعَى فيها الدالة دون توفير قيمة لهذا الوسيط الاختياري، فمثلًا قد نتوقع في الشيفرة البرمجية السابقة أن استدعاء الدالة foo()‎ بصورة متكررة (أي بدون تحديد الوسيط bar) سيؤدي دائمًا إلى إعادة القيمة 'baz'، بما أننا اعتقدنا أن الوسيط bar مضبوط على القيمة [] (أي قائمة فارغة جديدة) في كل مرة نستدعي فيها الدالة foo()‎ (بدون تحديد الوسيط bar)، ولكن لنلقِ نظرة على ما يحدث فعليًا: >>> foo() ["baz"] >>> foo() ["baz", "baz"] >>> foo() ["baz", "baz", "baz"] لاحظ استمرار إلحاق القيمة الافتراضية "baz" إلى القائمة الموجودة مسبقًا في كل مرة نستدعي فيها الدالة foo()‎ بدلًا من إنشاء قائمة جديدة في كل مرة، إذ تُقيَّم القيمة الافتراضية لوسيط الدالة مرة واحدة فقط في وقت تعريف الدالة، وبالتالي يُهيَّأ الوسيط bar على قيمته الافتراضية (أي قائمة فارغة) عند تعريف الدالة foo()‎ لأول مرة فقط، ولكن ستستمر بعد ذلك استدعاءات الدالة foo()‎ (بدون تحديد الوسيط bar) في استخدام القائمة نفسها التي هيّأنا بها الوسيط bar في الأصل. الحل الشائع لهذه المشكلة هو ما يلي: >>> def foo(bar=None): ... if bar is None: # ‫أو if not bar:‎‫ ... bar = [] ... bar.append("baz") ... return bar ... >>> foo() ["baz"] >>> foo() ["baz"] >>> foo() ["baz"] الخطأ 2: استخدام متغيرات الصنف Class استخدامًا خاطئًا ليكن لدينا المثال التالي: >>> class A(object): ... x = 1 ... >>> class B(A): ... pass ... >>> class C(A): ... pass ... >>> print A.x, B.x, C.x 1 1 1 وبالتالي سيكون لدينا أيضًا ما يلي كما هو متوقع: >>> B.x = 2 >>> print A.x, B.x, C.x 1 2 1 ولكن سيكون لدينا ما يلي: >>> A.x = 3 >>> print A.x, B.x, C.x 3 2 3 لاحظ تغيير قيمة C.x بالرغم من أننا غيرنا قيمة A.x فقط، حيث تُعامَل متغيرات الصنف داخليًا على أنها قواميس في لغة بايثون وتتبع ما يشار إليه غالبًا باسم ترتيب تحليل التوابع أو ترتيب استبيان التوابع Method Resolution Order -أو MRO اختصارًا وهو الآلية التي تستخدمها لغات البرمجة ومن ضمنها بايثون لتحديد ترتيب البحث عن التوابع في التسلسل الهرمي hierarchy الخاص بالكائنات في حالة استخدام الوراثة المتعددة، أي أنه يحدد المسار الذي سيتبعه البرنامج عند محاولة استدعاء دالة معينة موجودة في أكثر من صنف أو الوراثة من عدة أصناف. لذلك سنبحث عن السمة Attribute التي هي x في أصنافها الأساسية (أي الصنف A فقط في المثال السابق بالرغم من أن لغة بايثون تدعم الوراثة المتعددة) بما أننا لم نعثر على هذه السمة في الصنف C. يمكن القول أيضًا أن الصنف C ليس لديه الخاصية x الخاصة به والمستقلة عن الصنف A، وبالتالي لا يُعَد المرجع إلى C.x هو المرجع نفسه إلى A.x، ويؤدي ذلك إلى حدوث مشكلة في بايثون إن لم نتعامل معها بطريقة صحيحة. الخطأ 3: تحديد المعاملات لكتلة الاستثناء Exception بطريقة خاطئة لنفترض أن لدينا الشيفرة البرمجية التالية: >>> try: ... l = ["a", "b"] ... int(l[2]) ... except ValueError, IndexError: # لالتقاط الاستثناءَين ... pass ... Traceback (most recent call last): File "<stdin>", line 3, in <module> IndexError: list index out of range المشكلة في المثال السابق هي أن تعليمة except لا تأخذ قائمة الاستثناءات المُحدَّدة بهذه الطريقة، حيث تستخدم بايثون الصيغة except Exception, e لربط الاستثناء بالمعامل الثاني الاختياري المُحدَّد (هو e في هذه الحالة)، وبالتالي يمكن إتاحته لمزيد من الفحص. لم تلتقط التعليمة except الاستثناء IndexError، بل يُربَط الاستثناء بمعاملٍ اسمه IndexError، وتُعَد مثل هذه الأخطاء شائعة في شيفرة بايثون البرمجية. الطريقة الصحيحة لالتقاط الاستثناءات المتعددة في التعليمة except هي تحديد المعامل الأول بوصفه مجموعة Tuple تحتوي على جميع الاستثناءات المُلتقَطة. يمكن تحقيق أقصى قدر من قابلية النقل من خلال استخدام الكلمة المفتاحية as لأن هذه الصيغة تدعمها Python 2 و Python 3: >>> try: ... l = ["a", "b"] ... int(l[2]) ... except (ValueError, IndexError) as e: ... pass ... >>> الخطأ 4: سوء فهم قواعد نطاق Scope بايثون يعتمد تحليل Resolution نطاق بايثون على قاعدة LEGB، وهي اختصار للكلمات محلي ‎Local وشامل ‎Enclosing وعام ‎Global ومُضمَّن ‎Built-in. توجد بعض التفاصيل الدقيقة للطريقة التي تعمل بها هذه القاعدة في بايثون، مما يقودنا إلى مشكلة برمجة بايثون الشائعة الأكثر تقدمًا التالية، فليكن لدينا ما يلي مثلًا: >>> x = 10 >>> def foo(): ... x += 1 ... print x ... >>> foo() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in foo UnboundLocalError: local variable 'x' referenced before assignment يحدث الخطأ السابق لأنه إذا أسندتَ قيمة إلى متغير في نطاقٍ ما، فستَعُد لغة بايثون هذا المتغير متغيرًا محليًا لذلك النطاق تلقائيًا وتظلّل أيّ متغير يحمل الاسم نفسه في أيّ نطاق خارجي. يتفاجأ الكثير من المبرمجين بالحصول على الخطأ UnboundLocalError في الشيفرة البرمجية التي عملت بنجاح سابقًا عند تعديلها من خلال إضافة تعليمة إسناد في مكانٍ ما من جسم الدالة، فمن الشائع أن يؤدي ذلك إلى أن يخطئ المطورون عند استخدام القوائم خاصةً كما في المثال التالي: >>> lst = [1, 2, 3] >>> def foo1(): ... lst.append(5) # تعمل هذه التعليمة بنجاح ... >>> foo1() >>> lst [1, 2, 3, 5] >>> lst = [1, 2, 3] >>> def foo2(): ... lst += [5] # ولكن تعطي هذه التعليمة خطأً ... >>> foo2() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 2, in foo UnboundLocalError: local variable 'lst' referenced before assignment لاحظ أن الدالة foo1 تعمل بنجاح بينما تعطي الدالة foo2 خطأ، والسبب في ذلك هو مماثل لمشكلة المثال السابق ولكنه أكثر دقة، حيث لا تسند الدالة foo1 قيمة إلى المتغير lst على عكس الدالة foo2، فالتعليمة lst += [5]‎ هي مجرد اختصار للتعليمة lst = lst + [5]‎ التي تمثّل محاولة إسناد قيمة إلى المتغير lst، وبالتالي تفترض لغة بايثون أن هذا المتغير موجود في النطاق المحلي، ولكن تعتمد القيمة التي نريد إسنادها إلى المتغير lst على المتغير lst نفسه الذي يُفترَض وجوده في النطاق المحلي ولم نعرّفه بعد. الخطأ 5: تعديل القائمة أثناء المرور عليها يجب أن تكون مشكلة الشيفرة البرمجية التالية واضحة إلى حدٍ ما: >>> odd = lambda x : bool(x % 2) >>> numbers = [n for n in range(10)] >>> for i in range(len(numbers)): ... if odd(numbers[i]): ... del numbers[i] # تصرف سيء: حذف عنصر من القائمة أثناء المرور عليها ... Traceback (most recent call last): File "<stdin>", line 2, in <module> IndexError: list index out of range يُعَد حذف عنصر من قائمة أو مصفوفة أثناء المرور عليها مشكلةً معروفةً جيدًا في بايثون لمطوري البرمجيات أصحاب الخبرة، ولكن بالرغم من أن المثال السابق قد يكون واضحًا إلى حدٍ ما، إلّا أنه يمكن أن يرتكب حتى المطورون المتقدمون عن غير قصد هذا الخطأ في الشيفرة البرمجية الأكثر تعقيدًا. لحسن الحظ، تتضمن لغة بايثون عددًا من نماذج البرمجة الأنيقة التي يمكن أن تؤدي إلى شيفرة برمجية مبسطة ومنظَّمة بصورة كبيرة عند استخدامها استخدامًا صحيحًا، ممّا يقلل من احتمالية وجود خطأ الحذف غير المقصود لعنصر القائمة أثناء المرور عليها في هذه الشيفرة البرمجية الأبسط. أحد هذه النماذج هو نموذج استيعاب القوائم List Comprehensions الذي يُعَد مفيدًا خاصةً لتجنب هذه المشكلة كما هو موضّح في التطبيق البديل التالي للشيفرة البرمجية السابقة والذي يعمل بطريقة مثالية: >>> odd = lambda x : bool(x % 2) >>> numbers = [n for n in range(10)] >>> numbers[:] = [n for n in numbers if not odd(n)] # الحل هنا >>> numbers [0, 2, 4, 6, 8] الخطأ 6: عدم وضوح كيفية ربط Bind بايثون للمتغيرات في المنغلقات Closures ليكن لدينا المثال التالي: >>> def create_multipliers(): ... return [lambda x : i * x for i in range(5)] >>> for multiplier in create_multipliers(): ... print multiplier(2) ... قد نتوقع الخرج التالي للشيفرة البرمجية السابقة: 0 2 4 6 8 لكننا سنحصل على ما يلي: 8 8 8 8 8 يحدث ذلك بسبب سلوك الربط المتأخر Late Binding لبايثون الذي يبحث عن قيم المتغيرات المُستخدَمة في المنغلقات Closures في وقت استدعاء الدالة الداخلية، لذلك إذا استدعينا أيًا من الدوال المُعادة في المثال السابق، فسيُجرَى البحث عن قيمة المتغير i في النطاق المحيط في وقت استدعائها، حيث ستكون الحلقة قد اكتملت عندها، لذلك أُسنِدت القيمة 4 إلى المتغير i فعليًا. ويكون حل هذه المشكلة الشائعة في بايثون كما يلي: >>> def create_multipliers(): ... return [lambda x, i=i : i * x for i in range(5)] ... >>> for multiplier in create_multipliers(): ... print multiplier(2) ... 0 2 4 6 8 استفدنا من الوسطاء الافتراضية لإنشاء دوال مجهولة لتحقيق السلوك المطلوب. قد يَعُد البعض هذه الطريقة مناسبة، وقد يَعدها البعض رائعة، وقد يكرهها البعض الآخر، ولكن من المهم أن تفهمها إذا كنت مطور بايثون. الخطأ 7: إنشاء اعتماديات Dependencies الوحدات الدائرية لنفترض أن لدينا الملفان a.py و b.py، حيث يستورد كلّ منهما الآخر كما يلي: في الملف a.py: import b def f(): return b.x print f() وفي الملف b.py: import a x = 1 def g(): print a.f() أولًا، لنحاول استيراد الوحدة a.py كما يلي: >>> import a 1 لاحظ أن عملية الاستيراد نجحت، وقد يكون ذلك مفاجأة لك، فلدينا استيراد دائري هنا والذي يُفترَض أن يمثل مشكلة، أليس كذلك؟ ولكن لا يمثّل مجرد وجود استيراد دائري في حد ذاته مشكلة في بايثون، فلغة بايثون ذكية بما يكفي لعدم محاولة إعادة استيراد وحدة إذا كانت مستوردةً فعليًا، ولكنك قد تواجه مشكلات اعتمادًا على النقطة التي تحاول فيها كل وحدة الوصول إلى الدوال أو المتغيرات المُعرَّفة في الوحدة الأخرى. لم يكن هناك مشكلة في استيراد الوحدة b.py لأنها لا تتطلب تعريف أيّ شيء من الوحدة a.py في وقت استيرادها عندما استوردنا الوحدة a.py في المثال السابق، فالإشارة الوحيدة إلى الوحدة a في الملف b.py هو استدعاء الدالة a.f()‎، ولكن هذا الاستدعاء موجود في الدالة g()‎ ولا يوجد شيء في الملفين a.py أو b.py يستدعي الدالة g()‎، لذا لا يوجد شيء يدعو للقلق. ولكن إذا حاولنا استيراد الوحدة b.py دون استيراد الوحدة a.py مسبقًا كما يلي: >>> import b Traceback (most recent call last): File "<stdin>", line 1, in <module> File "b.py", line 1, in <module> import a File "a.py", line 6, in <module> print f() File "a.py", line 4, in f return b.x AttributeError: 'module' object has no attribute 'x' فستظهر مشكلة تتمثّل في أن الوحدة b.py تحاول استيراد الوحدة a.py عند عملية استيراد الوحدة b.py، وتستدعي الوحدة a.py بدورها الدالة f()‎ التي تحاول الوصول إلى المتغير b.x الذي لم نعرّفه بعد، وبالتالي سيظهر الاستثناء AttributeError. توجد حلول مختلفة لهذا الخطأ، وسيكون أحد هذه الحلول على الأقل بسيطًا، فمثلًا عدّل الوحدة b.py لتستورد الوحدة a.py ضمن الدالة g()‎: x = 1 def g(): import a # ستُقيَّم هذه التعليمة عند استدعاء الدالة‫ g()‎ فقط print a.f() وإذا استوردناه هذه الوحدة، فسيكون كل شيء على ما يرام كما يلي: >>> import b >>> b.g() 1 # يُطبَع لأول مرة بسبب استدعاء الوحدة‫ 'a' للتعليمة 'print f()‎' في النهاية 1 # يُطبَع مرة ثانية، حيث يمثّل استدعاء الدالة‫ 'g' الخطأ 8: تعارض الأسماء مع وحدات مكتبة بايثون المعيارية تتميز لغة بايثون بوفرة وحدات المكتبات التي تأتي معها، ولكن قد يؤدي ذلك إلى الوقوع في تعارض في الأسماء بين اسم إحدى الوحدات الخاصة بك ووحدة أخرى تحمل الاسم نفسه في المكتبة المعيارية التي تأتي مع لغة بايثون إن لم تكن حذرًا، فمثلًا قد يكون لديك وحدة بالاسم email.py في شيفرتك البرمجية، والتي قد تتعارض مع وحدة المكتبة المعيارية التي تحمل الاسم نفسه. يمكن أن يؤدي ذلك إلى مشكلات خطيرة مثل استيراد مكتبة أخرى، والتي تحاول بدورها استيراد إصدارٍ من وحدة خاصة بمكتبة بايثون المعيارية، ولكن إذا كان لديك وحدة تحمل الاسم نفسه، فستستورد الحزمة الأخرى الإصدار الخاص بك عن طريق الخطأ بدلًا من الإصدار الموجود في مكتبة بايثون المعيارية، مما يؤدي إلى حدوث أخطاء، لذا يجب توخي الحذر لتجنب استخدام الأسماء نفسها الخاصة بوحدات مكتبة بايثون المعيارية. من الأسهل بالنسبة لك تغيير اسم الوحدة ضمن الحزمة الخاصة بك بدلًا من تقديم اقتراح تحسين بايثون Python Enhancement Proposal -أو PEP اختصارًا- لطلب تغيير الاسم ومحاولة الحصول على الموافقة على ذلك. الخطأ 9: الفشل في معالجة الاختلافات بين الإصدارين Python 2 و Python 3 ليكن لدينا الملف foo.py التالي مثلًا: import sys def bar(i): if i == 1: raise KeyError(1) if i == 2: raise ValueError(2) def bad(): e = None try: bar(int(sys.argv[1])) except KeyError as e: print('key error') except ValueError as e: print('value error') print(e) bad() يعمل ما يلي بنجاح في Python 2: $ python foo.py 1 key error 1 $ python foo.py 2 value error 2 ولكنه يعطي خطأً في Python 3 كما يلي: $ python3 foo.py 1 key error Traceback (most recent call last): File "foo.py", line 19, in <module> bad() File "foo.py", line 17, in bad print(e) UnboundLocalError: local variable 'e' referenced before assignment المشكلة هي أنه لا يمكن الوصول إلى كائن الاستثناء خارج نطاق كتلة التعليمة except في Python 3، وإلّا فيجب الاحتفاظ بدورة مرجعية مع إطار المكدس في الذاكرة حتى تشغيل كانس المهملات Garbage Collector وإزالة المراجع من الذاكرة. إحدى الطرق لتجنب هذه المشكلة هي الاحتفاظ بمرجع إلى كائن الاستثناء خارج نطاق كتلة التعليمة except بحيث يبقى قابلًا للوصول. إليك فيما يلي نسخة من المثال السابق الذي يستخدم هذه التقنية، وبالتالي ستنتج شيفرة برمجية متوافقة مع Python 2 و Python 3: import sys def bar(i): if i == 1: raise KeyError(1) if i == 2: raise ValueError(2) def good(): exception = None try: bar(int(sys.argv[1])) except KeyError as e: exception = e print('key error') except ValueError as e: exception = e print('value error') print(exception) good() لنشغّل هذه الشيفرة البرمجية على الإصدار Py3k: $ python3 foo.py 1 key error 1 $ python3 foo.py 2 value error 2 اطّلع على مقال كيفية ترحيل شيفرة بايثون 2 إلى بايثون 3 لمزيد من المعلومات. الخطأ 10: استخدام التابع del بطريقة خاطئة لنفترض أن لدينا ما يلي في ملفٍ اسمه mod.py: import foo class Bar(object): ... def __del__(self): foo.cleanup(self.myhandle) ثم حاولنا استيراده من الملف another_mod.py كما يلي: import mod mybar = mod.Bar() فسنحصل على الاستثناء AttributeError، والسبب هو ضبط جميع متغيرات الوحدة العامة على القيمة None عند إيقاف تشغيل المفسّر Interpreter، لذلك ضُبِط الاسم foo على القيمة None عند استدعاء التابع __del__ في المثال السابق. الحل لهذه المشكلة هو استخدام الدالة atexit.register()‎ بدلًا من ذلك، وبالتالي ستُشغَّل معالجاتك المسجَّلة قبل إيقاف تشغيل المفسِّر عندما ينتهي برنامجك من التنفيذ (أي عند الخروج منه بطريقة طبيعية). إذًا لنصلِح شيفرة mod.py البرمجية السابقة كما يلي: import foo import atexit def cleanup(handle): foo.cleanup(handle) class Bar(object): def __init__(self): ... atexit.register(cleanup, self.myhandle) يوفّر هذا المثال طريقة نظيفة وموثوقة لاستدعاء أيّ دالة تنظيف مطلوبة عند إنهاء البرنامج العادي، ومن الواضح أن الأمر متروك للدالة foo.cleanup لتحديد ما يجب فعله بالكائن المرتبط بالاسم self.myhandle. مخاطر بايثون يمكن تجنبها من خلال معرفة الفروق الأساسية تُعَد بايثون لغة قوية ومرنة وتحتوي على العديد من الآليات والنماذج التي يمكن أن تحسّن الإنتاجية بصورة كبيرة، ولكن يمكن أن يكون الفهم أو التقدير المحدود لقدراتها في بعض الأحيان عائقًا أكثر من كونه فائدة كما هو الحال مع أيّ أداة أو لغة برمجية، حيث يعتقد الشخص في أن يعلم ما يكفي، ولكنه يشكّل خطرًا. سيساعد التعرف على الفروق الأساسية في لغة بايثون -مثل مشاكل البرمجة المتقدمة التي ذكرناها في هذا المقال- على تحسين استخدام اللغة مع تجنب بعض الأخطاء في بايثون. ترجمة -وبتصرُّف- للمقال The 10 Most Common Python Code Mistakes لصاحبه Martin Chikilian. اقرأ أيضًا مصطلحات شائعة مثيرة للالتباس في بايثون تنقيح أخطاء Debugging شيفرتك البرمجية باستخدام لغة بايثون كيف تستخدم منقح بايثون فهم العمليات المنطقية في بايثون 3 أشهر 10 مشكلات تواجه مبرمجي لغة جافا سكريبت JavaScript
    1 نقطة
  12. في البداية أنصحك بحل المسائل على موقع CodeWars فهو يتيح حل تحديات برمجية تتراوح من المستوى الأساسي إلى المتقدم وسهل استخدامه في البداية. وبعد تقدم مستواك وقرب التقديم على مقابلة عمل، عليك بالإنتقال لحل المسائل على موقع LeetCode، وستجد قوائم خاصة بالمسائل بمختلف المستويات، وستجد شروحات له على اليوتيوب أيضًا. وهناك مواقع أخرى مثل HackerRank وCodeforces.
    1 نقطة
  13. تلعب البرمجة في عصرنا الحالي دورًا حيويًا في كافة مناحي الحياة كالاتصالات والهندسة والتصميم والإدارة والطب وغيرها، ومجالات البرمجة كثيرة ومتنوعة وهي تخدم أغراضًا مختلفة وتتوسع بشكل مستمر كما تعدّ البرمجة من أكثر الوظائف نموًا في سوق العمل. لحسن الحظ، هذا يوفر للمبرمجين الكثير من الخيارات في سوق العمل ويتيح لهم الفرصة للتخصص في مجالات متنوعة كتطوير مواقع الويب أو تطبيقات الجوال أو التخصص في تحليل البيانات أو برمجة الشبكات …إلخ. نسلط الضوء في هذا المقال على أهم مجالات البرمجة ونساعدك في تحديد أهدافك واكتشاف المجال الذي يناسب اهتماماتك وميولك والتعرف على أهم التقنيات التي يتطلبها التخصص في كل مجال. ما هي مجالات البرمجة البرمجة هي أن تطلب من جهاز الحاسوب أو أي جهاز إلكتروني آخر قابل للبرمجة أداء مهمة مت أو حل مشكلة معينة من خلال كتابة مجموعة من التعليمات باستخدام إحدى لغات برمجة. ولغة البرمجة هي لغة خاصة تستخدم للتواصل بينك وبين الحاسوب، ويمكنك من خلالها تطوير مختلف أنواع البرامج والتطبيقات التي تخدم أغراضًا مختلفة، ونتيجة التباين في المهام والمشكلات التي يتم حلها بواسطة الحاسوب تتنوع مجالات البرمجة التي يمكن للمطورين والمبرمجين العمل بها. وقد اخترنا مجموعة من أهم هذه المجالات حسب استطلاع الرأي الذي أجراه موقع Stackoverflow الشهير للعام 2022 والذي يشارك فيه عدد كبير من المطورين والمبرمجين حول العالم: من أشهر مجالات البرمجة نذكر: تطوير الويب بأنواعه الثلاثة: التطوير الكامل وتطوير الواجهة الخلفية وتطوير الواجهة الأمامية تطوير سطح المكتب تطوير تطبيقات الهاتف التخصص في مجال DevOps هندسة البنية التحتية السحابية إدارة قواعد البيانات تحليل البيانات أو الأعمال الأمن السيبراني تطوير الألعاب الذكاء الاصطناعي وتعلم الآلة لنستكشف المزيد من المعلومات حول كل مجال من هذه المجالات ونتعرف معًا على أهم استخداماته وتقنياته في فقراتنا التالية. 1. تطوير الويب هو أحد مجالات البرمجة المفضلة لدى غالبية المبرمجين وهو يحتل المكانة الأولى بين وظائف المبرمجين على مستوى العالم ولا عجب في ذلك فهو مجال سهل التعلم وكثير الطلب في سوق العمل، فلا توجد شركة ناشئة أو نشاط تجاري إلا ويحتاج لإنشاء موقع إلكتروني خاص به ليثبت وجوده في العالم الرقمي، لذا فإن الطلب على المتخصصين في مجال تطوير الويب مرتفع ومستمر في النمو. يشمل تطوير الويب تخطيط وتصميم واجهات موقع الويب، وكتابة الكود البرمجي اللازم لعمل الموقع، كما يشمل صيانة مواقع الويب وتطويرها حسب الحاجة. ويقسم مجال تطوير الويب إلى ثلاث تخصصات هي: تطوير الواجهة الأمامية Frontend تطوير الواجهة الخلفية Backend التطوير الكامل Full-Stack مطور الواجهة الأمامية: هو المسؤول عن الجزء المرئي من الموقع الذي يراه المستخدمون النهائيون فهو الذي يصمم صفحات وأقسام الموقع والقوائم ويحدد أنواع الخطوط والألوان …إلخ. وهذا المجال يتطلب حسًا فنيًا وتفكيرًا إبداعيًا لابتكار تصاميم سهلة الاستخدام وتنفيذها من خلال التقنيات البرمجية المناسبة حيث يحتاج المتخصص في تطوير الواجهات الأمامية للمواقع إلى معرفة عدة تقنيات مثل HTML5 و CSS3 ولغة جافا سكريبت ومعرفة أهم المكتبات وأطر العمل الخاصة بها. دورة تطوير واجهات المستخدم ابدأ عملك الحر بتطوير واجهات المواقع والمتاجر الإلكترونية فور انتهائك من الدورة اشترك الآن مطور الواجهة الخلفية: هو المسؤول عن الجزء التقني من الموقع الذي يعمل على الخادم، وتشمل مسؤولياته إنشاء الوظائف الرئيسية للموقع والتعامل مع قواعد بيانات الموقع ومراقبة أداء الخادم ويحتاج مطور الواجهة الخلفية لامتلاك خبرة باللغات التي تعمل في طرف الخادم مثل جافا Java وروبي Ruby و PHP وبايثون Python والتعامل مع نظم إدارة قواعد البيانات مثل MySQL و MongoDB كما يحتاج إلى الإلمام بأساسيات لغات الواجهة الأمامية والتعاون مع مطوري الواجهة الأمامية. مطور الويب الكامل: أو ما يعرف باسم مطور المكدس الكامل Full-Stack Developer هو المبرمج الذي يمتلك المهارات التي تمكنه من تطوير الواجهة الأمامية والخلفية لموقع الويب فهو مسؤول عن كافة جوانب تطوير الموقع من طرف العميل والخادم. شرحنا هذين المجالين ومجال التطوير الشامل وعرضنا خارطة طريق لتعلم مجال تطوير الويب بالتفصيل في مقال المدخل الشامل لتعلم تطوير الويب وبرمجة المواقع. 2. تطوير سطح المكتب رغم أن مجال تطوير برامج سطح المكتب تراجع في الآونة الأخيرة مقابل تطبيقات الويب والجوال والتطبيقات المستندة إلى السحابة، لا يزال بعض المستخدمين يعتمدون على تطبيقات سطح المكتب لإنجاز المهام الاحترافية لذا فإن تطوير سطح المكتب لا يزال أحد مجالات البرمجة المهمة والمجزية. فإذا كنت تعتقد أن تطوير سطح المكتب قد عفا عليه الزمن ولا جدوى منه فأنت مخطئ، بل على العكس يعد هذا التخصص من أصعب التخصصات وأعلاها أجرًا، لأن تطبيقات سطح المكتب تعمل بشكل أفضل من ناحية القوة والسرعة والموثوقية من تطبيقات الويب أو البرامج المستندة إلى السحابة لذا لا تزال مفضلة للعديد من الشركات وأصحاب الأعمال. مطور سطح المكتب هو المبرمج الذي يكتب الشيفرات البرمجية للبرامج والتطبيقات التي لا تحتاج إلى الاتصال بالإنترنت والمخصصة للعمل على أجهزة الحاسوب التي تعمل بأنظمة تشغيل مثل ويندوز Windows ولينكس Linux وماك MacOS، ويركز عادة على تطوير وإنتاج برامج متقدمة واحترافية كبرامج التصميم باستخدام الحاسوب CAD، وبرامج النمذجة ثلاثية الأبعاد، وبرامج تحرير الصور والفيديو والأصوات …إلخ. ومن أشهر لغات البرمجة المستخدمة في مجال تطوير تطبيقات سطح المكتب: C#‎ C++‎ Python Ruby Objective-C Swift JavaFX Go Scala Python وإضافة لتعلم التقنيات ولغات البرمجة اللازمة لتطوير برامج سطح المكتب يجب أن يمتلك مطور سطح المكتب مهارات مثل التفكير المنطقي والقدرة على حل المشكلات المعقدة بكفاءة ويتمكن من إيجاد حلول مبتكرة تجعل من البرامج أسرع وأسهل في الاستخدام. دورة تطوير التطبيقات باستخدام لغة Python احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة اشترك الآن 3. تطوير تطبيقات الجوال يعد تطوير تطبيقات الجوال والهواتف المحمولة من مجالات البرمجة المهمة والمربحة والمطلوبة بكثرة في سوق العمل، والتخصص في هذا المجال يمكنك من تطوير تطبيقات متنوعة تستخدم على مختلف الأجهزة المحمولة مثل الهواتف الذكية والأجهزة اللوحية والساعات الذكية وكل شخص منا لديه اليوم هاتف ذكي يعتمد عليه لإنجاز معظم المهام اليومية سواء التسوق عبر الإنترنت أو دفع الفواتير أو تصفح وسائل التواصل الاجتماعي …إلخ. بناء على ذلك تحرص غالبية الشركات اليوم على تطوير تطبيقات هواتف ذكية لمنصاتها لتحقيق أقصى استفادة وهذا بدوره يساهم في نمو سوق تطبيقات الهواتف ويوفر الكثير من الفرص الوظيفية لمطوري هذه التطبيقات. كي تصبح مطور تطبيقات جوال عليك أن تتعلم إحدى لغات البرمجة المتخصصة في بناء التطبيقات وتتعلم إدارة قواعد البيانات وتصحيح الأخطاء، ومن الضروري أن تمتلك كذلك مهارات في مجال التصميم لإنشاء تطبيقات جذابة بصريًا وسهلة الاستخدام. تعتمد لغات البرمجة التي تمكنك تعلمها لإنشاء تطبيقات الهاتف المحمول على نظام الهاتف فإذا كنت ترغب في تطوير تطبيقات للأجهزة التي تعمل بنظام Android يمكنك تعلم لغة جافا Java وكوتلن Kotlin، ولتطوير تطبيقات للأجهزة التي تعمل بنظام iOS يمكنك تعلم سويفت Swift أو Objective-C، كما يمكنك تطوير تطبيقات جوال هجينة تعمل على عدة أنظمة من خلال تعلم لغات تعمل مع تقنيات الويب والجوّال مثل HTML5 و CSS3 وجافا سكريبت. من السهل اكتساب الخبرة في مجال تطوير التطبيقات بسبب ظهور العديد من تقنيات التطوير سهلة الاستخدام مؤخرًا، كل ما عليك هو تعلم إحداها وبناء معرض أعمال خاص بك يضم تطبيقات مفيدة بأفكار نافعة تلبي احتياجات المستخدمين فهذا يساعدك في الحصول على فرص عمل مميزة بسرعة. إن أردت المزيد من التفاصيل حول مجال تطوير تطبيقات الجوال، ارجع إلى مقال برمجة تطبيقات الجوال. 4. تخصص DevOps يهدف مجال DevOps أو ما يعرف بالتطوير والعمليات Development and Operations إلى تنظيم التعاون بين كل من فرق تطوير البرامج وفرق تقنية المعلومات وسد الفجوة بينهما من أجل تطوير برمجيات عالية الجودة. رغم حداثة هذا المجال إلا أن الاعتماد عليه يتزايد بسرعة، وقد أصبح متخصصو ومهندسو DevOps يلعبون دورًا أساسيًا في المؤسسات لتأثيرهم الكبير على زيادة قدرة المؤسسات على إصدار المنتجات والخدمات بسرعة وكفاءة وصيانتها بشكل أفضل. والطلب متزايد على محترفي DevOps في سوق العمل، ويتطلب العمل في هذا المجال توفر مجموعة متنوعة من المهارات مثل فهم أساسيات لينكس Linux ومعالجة الملفات وإدارة العمليات وتشغيل خوادم لينكس وإتقان لغات البرمجة مثل بايثون أو جافا Java أو جافا سكربت Javascript أو روبي Ruby …إلخ. إضافة لمهارات قوية في الحوسبة السحابية والتحكم في الإصدارات مثل Git، كما يجب أن يتمتع بمهارات شخصية كالتواصل الفعال والتعاون والتنظيم. للمزيد يمكنك الاطلاع على مجموعة منوعة من المقالات والدروس التي توفرها أكاديمية حسوب حول مفهوم DevOps وأهم أداوته وتقنياته. 5. تخصص هندسة البنية السحابية تسعى معظم الشركات والمنظمات اليوم إلى تغيير الطريقة التقليدية التي تتعامل بها مع مواردها وتتوجه لتحويل كافة خدماتها كالخوادم والتخزين وقواعد البيانات والشبكات والبرمجيات لتعمل عبر الإنترنت أو السحابة مما يوفر لها مرونة وكفاءة أكبر ويخفض تكاليف تشغيل بنيتها التحتية ويساعدها على توسيع نطاق عملها بسهولة عند تغير المتطلبات. لهذا السبب تعتبر هندسة السحابة Cloud infrastructure engineer أحد مجالات البرمجة الهامة، فمعظم الشركات أصبحت تحتاج إلى تعيين مهندس سحابة أو مطور سحابة أو مسؤول عن الأنظمة السحابية ليكون مسؤولًا عن كافة الواجبات التقنية المرتبطة بالحوسبة السحابية مثل تحديد أفضل حلول البنية السحابية التي تلبي الاحتياجات الاستراتيجية للشركة وإدارة هذه البنية السحابية والعمل على صيانتها وإدارة الخوادم والتخزين السحابي …إلخ. من الضروري لمهندس السحابة امتلاك مجموعة من المهارات وأهمها معرفة بخوادم لينكس Linux وصيانتها وإدارتها ومهارات في إدارة قواعد البيانات السحابية، إضافة لمعرفة بلغات البرمجة مثل جافا و بايثون وروبي و Golang و PHP …إلخ. 6. إدارة قواعد البيانات تعد إدارة قواعد البيانات Database administrator أحد مجالات البرمجة المرغوبة في العديد من المؤسسات والشركات وهي تتضمن جمع البيانات وتخزينها واستخدامها بطريقة آمنة وفعالة من حيث التكلفة. فمعظم أصحاب العمل يعتبرون البيانات أحد الأصول الهامة ويحتاجون إلى متخصصين يقومون بإدارة هذه البيانات وتخزينها وتحليلها بنجاح والكشف عن رؤى هامة منها واتخاذ قرارات استراتيجية تصب في صالح هذه الشركات وتساعدهم على تحسين أدائها وزيادة إيراداتها. من المهارات المهمة للعمل في هذا المجال امتلاك القدرة على التنقل في قاعدة البيانات والعثور على السجلات المطلوبة وإعداد التقارير المناسبة واستخدام أدوات الاستعلام وعرض مجموعات البيانات بعدة تنسيقات بهدف تحليلها من عدة وجهات نظر واستخلاص النتائج منها. 7. تحليل الأعمال وتحليل البيانات برزت أهمية هذا المجال مع ظهور مفهوم البيانات الضخمة الواردة من عدد كبير من المصادر واعتبارها أحد الأصول القيمة للشركات لما لها من أثر كبير في مساعدة المؤسسات على اتخاذ قرارات مهمة وتوسيع نطاق عملها، وزيادة المبيعات وإطلاق منتجات أو خدمات جديدة وزيادة كفاءة عملها. يعرف هذا المجال بعدة أسماء أخرى مثل علم البيانات أو التنقيب عن البيانات أو نمذجة البيانات أو تحليل البيانات الضخمة، والهدف الأساسي منه هو توفير آلية للعمل مع كل هذه البيانات ومعالجتها وفهمها باستخدام تقنيات عدة كالتعلم الآلي والإحصاء والاحتمالات للحصول على معلومات مفيدة تساهم في تحسين أداء الأعمال داخل المؤسسات. فمن خلال تحليل الأعمال يمكن للشركة اتخاذ قرارات واستراتيجيات مستقبلية صائبة، مثل هل يجب عليها تطوير خط إنتاج جديد أم لا؟ أو هل هناك تأثير للمناطق الجغرافية أو المواسم على تفضيلات العملاء عند الشراء؟ أو الإجابة على أي سؤال أو مشكلة مستقبلية قد تواجهها الشركة في أي من أقسامها من المبيعات إلى تطوير المنتجات إلى خدمة العملاء …إلخ. للعمل كمحلل أعمال أو محلل بيانات ستحتاج لمجموعة من المهارات أهمها وجود أساس قوي في الاحتمالات والإحصاء ومعرفة لغات البرمجة الإحصائية مثل R أو بايثون التي تمكنك كتابة برامج لإجراء تحليلات متقدمة على البيانات الضخمة، كما أن إتقان مفاهيم الذكاء الصناعي و خوارزميات التعلم الآلي يمنحك ميزة تنافسية. 8. الأمن السيبراني تهتم المؤسسات والشركات بمجال الأمن السيبراني بشكل خاص لحماية المعلومات الحساسة لعملائها وكسب ثقتهم، فهذا المجال هو المسؤول بشكل رئيسي عن حماية المعلومات الرقمية، ومراقبة شبكات الحاسب والتصدي لأي تهديدات أمنية تظهر فيها، ويهتم كذلك بتصميم أنظمة الأمان وتنفيذها وصيانتها وتطوير تطبيقات برمجية آمنة من الثغرات أو تحسين التطبيقات الحالية لتكون أكثر أمانًا. يتطلب هذا المجال معرفة قوية بالحواسيب والشبكات إضافة للبرمجة وعند التخصص فيه يمكنك أن تعمل في عدة أدوار وظيفية. على سبيل المثال يمكن أن تعمل كأخصائي أمن معلومات وتحمي الأجهزة والأنظمة داخل المؤسسة من الهجمات الإلكترونية أو محلل أمن معلومات لمراقبة الوصول إلى البيانات وتشفيرها وتمنع أي استخدام ضار أو غير مقصود للبيانات وتتأكد من وجود إجراءات حماية قوية وهكذا. كما يمكّنك التخصص في هذا المجال أن تعمل في مجال الاختراق الأخلاقي Ethical hacking فالشركات والمؤسسات المهتمة بأمنها توظف اليوم مخترقين أو متسللين أخلاقيين لديها كي يحاولوا اختراق أنظمتها وشبكاتها وكافة أصولها الرقمية بهدف العثور على نقاط الضعف فيها وإصلاح كافة ثغراتها الأمنية قبل أن يكتشفها المتسلل الحقيقي ويستغلها ضدهم. تحدثنا عن هذا المجال وأهميته وفرص العمل فيه بالتفصيل في مقال ما هو الأمن السيبراني وما أهميته؟ فارجع إليه للاستزادة. 9. تطوير الألعاب يعتبر تطوير الألعاب مجالًا مرغوبًا بشكل خاص في أوساط المبرمجين اليافعين. وتطوير الألعاب مجال متقدم يحتاج لعدة مهارات لا تقتصر على كتابة كود اللعبة بل يحتاج إلى تصميم وتحريك الشخصيات أو الكائنات الرسومية للعبة وإعداد الأصوات وتحديد منطق اللعب، وتطوير الذكاء الصناعي الخاص بها وتطوير محرك اللعبة واستكشاف الأخطاء وإصلاحها قبل إطلاق اللعبة. لهذا السبب يحتاج مجال تطوير الألعاب عادة فرقًا من المتخصصين وقد يستغرق تطويرها سنوات عدة ومن الضروري لمطوري الألعاب أن يكونوا على دراية بمحركات الألعاب وتعلم لغات برمجة الألعاب مثل C++‎ و C و Java و Lua …إلخ. وإذا كنت تخطط لتطوير ألعاب تعمل ضمن متصفح الويب سيفيدك تعلم HTML5 وجافا سكربت و WebGL …إلخ. قد يكون من المفيد أيضًا أن يكون لديك معرفة بتطوير قواعد البيانات ومهارات في التصميم ومعرفة بمحركات الألعاب Game engines مثل Godot أو Unity3D أو Unreal أو غيرها من المحركات التي تسهل وتسرع عملك في تطوير الألعاب بشكل كبير. 10. الذكاء الاصطناعي وتعلم الآلة تعلم الآلة هو أحد تطبيقات الذكاء الاصطناعي AI ومن خلاله يمكن للحواسيب اكتساب القدرة على التعلم وتحسين الأداء من خلال التجربة. يركز تعلم الآلة على تطوير برامج وتطبيقات يمكنها الوصول إلى البيانات واستخدامها للتعلم من تلقاء نفسها من خلال خوارزميات مخصصة تحسن أداءها مع زيادة عدد العينات المتاحة للتعلم. يعد هذا التخصص أحد أحدث مجالات البرمجة رواجًا اليوم وهو يستخدم لحل المشكلات واتخاذ قرارات حاسمة في العديد من القطاعات التي تستخدم كمية ضخمة من البيانات كالطب والاتصالات والصناعة وتداول الأسهم …إلخ. ويُعتمد عليه لحل المهام المعقدة التي تتضمن كمية كبيرة من البيانات والمتغيرات والتي لا تملك طريقة ثابتة أو صيغة محددة لحلها، في هذه الحالة يتم الاعتماد على البيانات الحالية لاتخاذ قرارات مستقبلية وكلما زادت البيانات الموجودة سنتمكن من الحصول على إجابات أفضل وأدق. على سبيل المثال عندما تسأل خرائط جوجل عن أقصر وجهة للوصول لهدف ما وتقترح لك الطريق الأسرع فهي في الواقع تستخدم التعلم الآلي وتستنتج الطريق الأسرع بناء على البيانات الضخمة للأشخاص الذين استخدموا خدمة الخرائط مسبقًا وعلى البيانات التي تم جمعها عن هذا المسار وعن كل شخص استخدمه للوصول لهذه الوجهة ومتوسط سرعته وبهذا يمكن لخرائط جوجل التنبؤ بحركة المرور المستقبلية واقتراح المسار الأفضل. كذلك الأمر يمكن استخدام الذكاء الصناعي في اقتراح توصيات للمنتجات لزيادة الإيرادات، على سبيل المثال عندما تتصفح منتجًا ما على أحد المتاجر الإلكترونية دون أن تشتريه ستفاجئ أنك عندما تتصفح الإنترنت أو وسائل التواصل الاجتماعي بظهور إعلان لنفس المنتج. فكيف حدث ذلك؟ الجواب أن جوجل طبق التعلم الآلي وتتبع بيانات سجل البحث الخاص بك وبناء على ذلك قام بالتوصية بالإعلانات المناسبة بناءً على ذلك. وللتخصص في مجال تعلم الآلة تحتاج لمعرفة عدة تقنيات مثل SQL ومبادئ علم الإحصاء ولغات برمجة مثل لغة بايثون التي توفر الكثير من مكتبات معالجة البيانات مثل numpy و pandas ومكتبات تمثيل البيانات مثل Matpotlib و seaborn والعديد من خوارزميات تعلم الآلة، كما يسهّل عليك تعلم MATLAB تطبيق التعلم الآلي من خلال توفير مجموعة من الأدوات والوظائف الخاصة بمعالجة وتحليل البيانات الضخمة. إن أردت الاستزادة عن هذا المجال والتخصص فيه، يمكنك البدء بكتاب مدخل إلى الذكاء الاصطناعي وتعلم الآلة من أكاديمية حسوب، كما ستفيدك دورة الذكاء الاصطناعي التي توفرها الأكاديمية والتي تشرح لك أساسيات تعلم الآلة والتعلم العميق وتمكنك من تطوير مشاريع عملية لأنظمة التنبؤ، وتحليل النصوص، وتصنيف الصور، ومعالجة البيانات، كما تعلمك طريقة دمج النماذج اللغوية الكبيرة مثل GPT من OpenAI و LLaMA 2 من Meta في تطبيقاتك إلى جانب العديد من المواضيع التي تؤهلك بشكل فعّال للمنافسة في مجال الذكاء الاصطناعي. دورة الذكاء الاصطناعي احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة. اشترك الآن الخاتمة تعرفنا في مقال اليوم على أكثر مجالات البرمجة التي يمكن للمبرمجين والمطورين التخصص بها، بالطبع هناك مجالات عديدة أخرى مثل إنترنت الأشياء IoT والبرمجة التنافسية Competitive Programming وبرمجة الشبكات وبرمجة الأنظمة وتطوير البرمجيات حرة المصدر وأتمتة الأعمال والروبوتيك وغيرها الكثير لكن حاولنا أن نسلط الضوء على بعض من أبرز هذه المجالات. وبعد الاطلاع على أشهر مجالات البرمجة نرجو أن يكون هذا المقال قد ساعدك في العثور على مجال اهتمامك الأنسب -إن لم تحدده بعد- والبدء بالتعرف عليه أكثر وبشكل عملي ودراسة أفضل التقنيات ولغات البرمجة التي تناسب هذا المجال لتحقيق طموحك المهني، كما أنصحك بمطالعة مقال أعلى تخصصات البرمجة أجرًا في حال رغبت في معرفة أكثر المجالات دخلًا ومردودًا من بينها. ما هو مجال البرمجة المفضل بالنسبة لك وما هي التقنيات التي تتعلمها في هذا المجال؟ يسرنا أن تشاركنا تجربتك وتساؤلاتك حول هذا الموضوع في التعليقات أسفل المقال. اقرأ أيضًا كيف تتعلم البرمجة تعلم البرمجة لغات البرمجة فوائد البرمجة أسهل لغات البرمجة تعلم لغة بايثون تعلم لغة PHP دليلك الشامل إلى برمجة التطبيقات تعلم الذكاء الصناعي
    1 نقطة
  14. تتنوع لغات البرمجة في أهدافها واستخداماتها، وتتباين فيما بينها في درجة السهولة، فمن لغات البرمجة ما هو سهل التعلم ويستخدم صيغًا مفهومة تحاكي اللغة الطبيعية للتعبير عن التعليمات البرمجية المختلفة، ويتبع قواعد مرنة ومتساهلة مع الأخطاء، ومنها ما صعب التعلم ويملك مفردات صعبة وتراكيب لغوية مقعدة. ونظرًا لوجود المئات من لغات البرمجة المختلفة ومتنوعة الاستخدامات، قد تقع في حيرة من أمرك و تروادك الكثير من التساؤلات مثل: سنحاول في هذا المقال أن نجيبك على كافة هذه التساؤلات، من خلال تسليط الضوء على أسهل لغات برمجة التي يمكنك تعلمها في بداية مشوارك البرمجي، ونوضح أبرز مجالات استخدام كل لغة منها، ونختم المقال بجملة من النصائح التي تساعدك على تعلم البرمجة. ما هي البرمجة؟ قبل البدء في تعلم البرمجة، من المهم أن تعرف ما معنى البرمجة، ولم يجب عليك تعلمها؟ وما الذي يمكنك القيام به في حال تعلمت إحدى لغات البرمجة؟ قد تبدو لك كلمة البرمجة معقدة وصعبة لكنها في الواقع ليست كذلك. فالبرمجة بأبسط تعريف هي عملية التواصل بينك وبين جهاز الحاسوب لتطلب منه حل مشكلة ما أو تنفيذ مهمة معينة، ومن خلال البرمجة يمكنك إرسال الأوامر والتعليمات للحاسوب لينفذها لك. فأجهزة الحاسوب بارعة وسريعة بتنفيذ التعليمات وما تُلقَّن به وعاجزة عن التصرف من تلقاء نفسها، وتحتاج لمن يرشدها لما يجب عليها القيام به، وهي لا تفهم إلا لغة الآلة الثنائية المكونة من أصفار وواحدات فقط وهي لغة غير مقروءة أو مفهومة للبشر، لذا في حال أردت أن تتواصل مع جهاز حاسوب بلغة الآلة سيكون الأمر صعبًا عليك، ولن تتمكن بالمقابل من التخاطب معه بلغتك الأم ولا باللغة الانجليزية لأنه لن يفهمها بالمقابل، فما الحل؟ الحل هو في إيجاد لغة مشتركة للحوار والتواصل وهو ما تقوم به لغات البرمجة التي تشكل لغة وسيطة للتخاطب وتملك قواعد وأسس في الكتابة يمكنك كمبرمج فهمها وتعلمها بسهولة وبالإمكان ترجمتها إلى لغة الآلة ليفهمها الحاسوب بدوره وينفذها لك. لا تقتصر البرمجة على الحواسيب بل تشمل الهواتف المحمولة والأجهزة اللوحية وغيرها من الأجهزة الإلكترونية فكافة هذه الأجهزة تحتاج للتخاطب معها من خلال لغة برمجة مخصصة كي تعمل على النحو المنشود وتؤدي المهام المطلوبة. تشبه عملية تعلم البرمجة عملية تعلم الطبخ إلى حد كبير، فعندما تتعلم طريقة إعداد طبق ما لأول مرة عليك أن تتعرف على كافة المكونات اللازمة وتتبع طريقة الإعداد لكل وصفة وتطبقها واحدة تلو الأخرى لتنجز الطبق المطلوب، ويجب قبل البدء بالطبخ أن تكون على دراية بالمطبخ وأدواته بالطبع! لن تختلف الأمور في البرمجة كثيرًا عن هذا المشهد. من الأفضل قبل أن تخطو خطواتك الأولى في تعلم البرمجة أن تتعلم أساسيات البرمجة وهي مفاهيم تشترك فيها البرمجة وتُطبق في كافة لغات البرمجة ثم تبحث بعد ذلك عن لغة البرمجة المناسبة كي تتعلمها، ويمكنك بدء تعلم البرمجة وتعلم مفاهيم علوم الحاسوب الأساسية على التوازي وإن واجهك أي مفهوم أو مصطلح أثناء رحتلك في تعلم البرمجة، فيمكنك التوقف وتعلمه وإكمال الطريق. للمزيد من المعلومات حول اختصاص علوم الحاسوب ومجالاته وتطبيقاته وأهم فرص العمل المتوفرة في هذا المجال يمكنك مطالعة مقال المدخل الشامل لتعلم علوم الحاسوب. بعدها، ستجد أن هناك العديد من لغات البرمجة التي يمكنك أن تتعلمها لتتخاطب مع الحاسوب، وتتفاوت هذه اللغات في درجة صعوبتها، فمنها ما هو سهل التعلم ومرن في القواعد وقريب بشكل كبير من اللغة الطبيعية، ومنها ما هو صعب ومعقد. وفي بداية تعلم البرمجة يفضل أن تبدأ بلغة سهلة تناسبك كمبتدئ وتتعلم من خلالها مهارات التفكير البرمجي والمنطقي، ومهارات حل المشكلات ثم تبدأ بتعلم تطوير البرامج. والمقصود بالبرامج هنا من التعليمات التي تهدف لتحقيق مهمة معينة والمكتوبة بلغة برمجة معينة. أسهل لغات البرمجة للمبتدئين تعتبر لغات البرمجة التالية من أسهل لغات البرمجة للمبتدئين: بايثون Python جافاسكريبت Javascript روبي Ruby سي C جافا Java جو Go PHP بيرل Perl R ماتلاب Matlab نناقش في الفقرات التالية سمات كل لغة من هذه اللغات، ونوضح أبرز استخداماتها والأسباب وراء اعتبارها من أسهل لغات البرمجة. 1. لغة بايثون تعد لغة بايثون واحدة من لغات البرمجة الأكثر شيوعًا على مستوى العالم، وتزداد شعبيتها بين أوساط المبرمجين مع مرور الوقت لكونها لغة سهلة متعددة الأغراض يمكن من خلالها إنشاء مواقع الويب وتطبيقات الحاسوب والألعاب وتطبيقات الذكاء الصنعي …إلخ. تعتبر لغة بايثون من أسهل لغات البرمجة التي ينصح المبتدئون بتعلمها لكونها تستخدم صيغة بسيطة تحاكي اللغة الإنجليزية في كتابة التعليمات البرمجية، وهي لا تستخدم الأقواس ما يجعل قراءتها وفهمها أسهل من الشيفرات البرمجية للغات البرمجة الأخرى. فضلًا عن كونها لغة مفتوحة المصدر وتملك مجتمع دعم كبير ونشط وتملك عددًا هائلًا من المكتبات التي تخدم أغراضًا مختلفة وتوفر موردًا غنيًا لأي شخص يرغب بالبرمجة باستخدامها. على سبيل المثال لكتابة برنامجك الأول في لغة بايثون والذي يطبع عبارة Hello world على الشاشة كل ما عليك هو كتابة سطر برمجي وحيد كالتالي: print("Hello world") في حين يكون الكود المكافئ للكود أعلاه في لغة أصعب مثل "C#‎" بالشكل التالي: using System; public class HelloWorld { public static void Main(string[] args) { Console.WriteLine ("Hello World"); } } لابد أنك لاحظت من هذا المثال البسيط مدى بساطة لغة بايثون وسهولة كتابة التعليمات فيها ما يجعلها من أسهل لغات البرمجة على الإطلاق. إذا كنت ترغب بتعلم لغة باثيون توفر لك أكاديمية حسوب دورة تطوير التطبيقات باستخدام لغة Python باللغة العربية التي تبدأ معك من أساسيات اللغة وصولًا إلى تطوير تطبيقات ويب احترافية. توفر أكاديمية حسوب أيضًا كتابًا لتعلم لغة بايثون وهو كتاب البرمجة بلغة بايثون كما ستجد في عشرات المقالات والدروس المنوعة حول تعلم بايثون من قسم بايثون. 2. لغة جافاسكربت جافاسكربت هي لغة برمجة مخصصة لتطوير الويب تتيح لك تضمين ميزات متقدمة على صفحات الويب، فمن خلالها يمكنك تحويل صفحات الويب الثابتة إلى صفحات تفاعلية نابضة بالحياة، كإضافة الصور المتحركة والنوافذ المنبثقة والتحكم في الرسومات والوسائط المتعددة …إلخ. تعد جافاسكربت من لغات البرمجة الأكثر شعبية في العالم وهي مطلوبة بشدة في سوق العمل لكونها إحدى التقنيات الأساسية للويب بالاشتراك مع HTML و CSS التي تستخدم في كل مكان على الويب. تعد لغة جافاسكربت من أسهل لغات البرمجة للتعلم لكونها عالية المستوى يمكنك اختبارها وتشغيلها مباشرة وبكل سهولة في متصفح الويب وتجربة تأثيرها على عناصر صفحات الويب. لذا ينصح بها لأي مبتدئ يرغب في تطوير مواقع الويب أن يتعلم تطوير التطبيقات باستخدام لغة JavaScript لاسيما أن استخدامها لم يعد يقتصر على تطوير الواجهات الأمامية Frontend فحسب بل يمكنك من خلال جافاسكربت تطوير الواجهات الخلفية Backend أيضًا وبناء تطبيقات رائعة تعمل على الخادم باستخدام أطر عمل مخصصة مثل Node.js. قبل أن تتعلم لغة جافا سكريبت سيكون من الأفضل أن تتعلم التقنيات البرمجية الأخرى والسهلة التعلم والتي تشكل مع جافاسكربت وحدة متكاملة مثل لغة HTML و CSS. ننصح أيضًا لتعلم جافاسكربت بكتاب البرمجة بلغة جافاسكربت واطلع على توثيق جافاسكربت على موسوعة حسوب. لغة HTML قبل أن نناقش أسباب اعتبار HTML أسهل لغة ينصح بتعلمها للمبتدئين، دعونا نجيب على التساؤل التالي "هل HTML لغة برمجة؟" الجواب لا! HTML ليست لغة برمجة من الناحية الفنية لكونها لغة غير مخصصة لإعطاء التعليمات للحاسوب أو إجراء العمليات الحسابية والمنطقية، بل تعتبر "لغة توصيف" Markup language مستخدمة في تطوير الويب وهي إحدى اللبنات الأساسية لصفحات الويب. تقوم HTML بتوصيف البيانات وتغليفها داخل وسوم خاصة تحدد هذه البيانات وتوضح للمتصفح الغرض منها كي يتمكن المتصفح من قراءة هذه البيانات والتمييز بينها مثل تحديد العناوين والفقرات والصور والروابط والجداول …إلخ. وعرضها بناء على هذا الوصف. وبالرغم من أن HTML لا تعتبر لغة برمجة، إلا أن تعلمها وإنشاء صفحات مواقع الويب باستخدامها يعتبر خطوة أولى سهلة يمكنك القيام بها لبدء تعلم تطوير الويب وتكمن سهولتها في اعتمادها بنية بسيطة تعتمد على الوسوم "tags"، التي تحدد من خلالها كيفية عرض مختلف العناصر على صفحة الويب بطريقة مفهومة لا تتطلب منك أي خبرة فنية مسبقة. على سبيل المثال كود HTML التالي يصف للمتصفح طريقة عرض عنوان بمستوى ثانٍ "Heading 2" وقائمة مرتبة "Ordered list": <H2>أسهل لغات البرمجة</H2> <OL> <LI>HTML <LI>CSS <LI>Python <LI>Ruby <LI>Java <LI>Javascript <LI>PHP <LI>C++ </OL> كما تلاحظ الكود بديهي وسهل الفهم وسيعرضه المتصفح بالشكل التالي: للمزيد، ارجع إلى مقال تعلم لغة HTML. لغة CSS إذا كانت لغة HTML تسمح بتوصيف بنية موقع الويب الخاص بك للمتصفح، فإن لغة CSS هي التي تجعل هذه البنية أنيقة ومنسقة وجميلة المظهر. CSS هي اختصار لـ Cascade Styling Sheets وهي كذلك لا تعد لغة برمجة بالمعنى الدقيق، بل تعد لغة وصفية تستخدم لتنسيق عناصر لغة HTML. حيث تضيف لغة CSS تنسيقات للعناصر التي توصفها لغة HTML مثل تحديد أنواع الخطوط المستخدمة في فقرة ما أو ألوان النصوص في فقرات الموقع أو محاذاة العناصر وتخطيطها مما يجعل الموقع أكثر جمالية. على سبيل المثال، لتغيير لون ونوع الخط المستخدم في عناصر HTML السابقة، وتغيير الهوامش الداخلية والخارجية للقائمة سنكتب بعض قواعد CSS لتنسيقها كالتالي: H2 { color: blue; font-family: 'tahoma', serif; } OL { list-style-type: none; margin:2; padding: 2; color: gray; } ستظهر القائمة أعلاه بعد التنسيق بالشكل التالي: كما ترى من الكود أعلاه فاللغة بسيطة للغاية، وصياغة تعليماتها وقواعدها الأساسية سهلة الفهم لاسيما عند إجراء تنسيقات بسيطة وأساسية لعناصر صفحة الويب، لكن بالطبع إذا أردت التعمق في تصميم الويب وتعلم أكثر من مجرد التنسيقات البسيطة وتطوير واجهات مستخدم احترافية وجذابة بصريًا فستحتاج للغوص في خصائص تفصيلية أكثر صعوبة ودقة ودمجها مع لغة HTML وأيضًا لغة جافاسكربت. دورة تطوير واجهات المستخدم ابدأ عملك الحر بتطوير واجهات المواقع والمتاجر الإلكترونية فور انتهائك من الدورة اشترك الآن 3. روبي Ruby تعد لغة روبي لغة برمجة عالية المستوى وهي مفتوحة المصدر وتدعم نمط البرمجة كائنية التوجه OOP ومرنة للغاية. ولكونها لغة برمجة متعددة الأغراض يمكنك من خلال تعلمها إنشاء تطبيقات منوعة مثل تطبيقات سطح المكتب ومواقع الويب، كما يمكنك استخدامها لاستخلاص بيانات صفحات الويب Web scraping والزحف إليها وهو أمر مهم لتحسين محركات البحث وفهرسة المواقع. تمتلك لغة روبي بنية بسيطة تتطلب كتابة القليل من الشيفرات البرمجية لإنجاز المهام المطلوبة ما يجعلها واحدة من أسهل لغات البرمجة في التعلم والتي ينصح بها للمبتدئين. فلكتابة برنامجك الأول الذي يطبع عبارة Hello World على الشاشة في هذه اللغة كل ما عليك هو كتابة سطر برمجي واحد كما يلي: puts "Hello World" تجدر الإشارة هنا لأن لغة روبي رغم بساطتها وسهولة كتابة تعليماتها، إلا أنها قد تصبح أكثر تعقيدًا عندما تحاول تنفيذ أوامر احترافية ومتقدمة أكثر، بكلام آخر من السهل تعلم روبي لكن من الصعب احترافها. إذا لم تكن لديك أي خلفية برمجية وكنت مهتمًا بتعمل لغة روبي من الصفر وصولًا للاحتراف فيمكنك اتباع دورة تطوير تطبيقات الويب باستخدام لغة Ruby التي توفرها أكاديمية حسوب وبناء تطبيقات متنوعة كالألعاب وتطبيقات إدارة المحتوى والشبكات الاجتماعية. كما ستتعلم إطار عمل Ruby on Rails المكتوب بلغة روبي والذي يساعدك على بناء تطبيقات ويب فعالة واحترافية. 4. سي C تعد لغة C واحدة من أقدم لغات البرمجة وهي لغة برمجة إجرائية متعددة الأغراض تم تطويرها عام 1972 وتتمتع إلى اليوم بشعبية كبيرة. تعتبر لغة C من أسهل لغات البرمجة تعلمًا لكونها تستخدم فقط 32 كلمة وأسلوب بناء الجمل فيها بسيط ومفهوم، كما توفر C مجموعة غنية من المكتبات التي تساعد المبرمج على اختصار كتابة الكثير من الأكواد وتشغيل التعليمات البرمجية بسهولة، ولكونها لغة عريقة ومعروفة على نطاق واسع فإن أي مشكلة تواجهها ستجد حلها بسهولة على شبكة الإنترنت. لهذا السبب يتعلمها معظم المبرمجين قبل الانتقال إلى لغة أكثر تقدمًا. فإذا تعلمت لغة C سيكون السهل عليك تعلم جميع لغات البرمجة الأخرى مهما بلغت درجة صعوبتها بسرعة أكبر، وستتمكن من تطوير وبرمجة تطبيقات سطح المكتب والألعاب وبرامج أنظمة التشغيل واللوحات الإلكترونية الصغيرة مثل أردوينو وراسبيري باي وغيرها من البرامج المنوعة. لكتابة برنامج بلغة "C" يطبع عبارة Hello World على الشاشة سيكون الكود كما يلي: #include <stdio.h> int main() { printf("Hello world"); return 0; } قد تتساءل "ماذا عن تعلم لغة C++‎؟" في الواقع بالرغم من كون C++‎ واحدة من أكثر لغات البرمجة شيوعًا وتتمتع بأداء عالي وميزات قوية وتوسع لغة C وتضيف لها مفاهيم البرمجة كائنية التوجه OOP، وتستخدم من قبل كبرى شركات التكنولوجيا العملاقة إلا أنها لغة صعبة وبناء الجمل فيها معقد لذا لا ينصح للمبتدئين البدء بها لتعلم البرمجة بل تبدأ الخطوات أولًا بتعلم لغة C ثم تنتقل إلى لغة C++‎. 5. جافا Java تعد لغة جافا واحدة من لغات البرمجة الأشهر عالميًا، وهي لغة عالية المستوى ومتعددة الاستخدامات، وتتميز بكونها واضحة ومنظمة بشكل جيد وهي تستند إلى لغة سي في أسلوب كتابة التعليمات البرمجية "C-like". تعتبر جافا خيارًا جيدًا للبدء بتعلم البرمجة فهي تمتلك العديد من الميزات القوية وتملك عددًا كبير من المكتبات مفتوحة المصدر وتستخدم على نطاق واسع، وبتعلمها ستتمكن إنجاز مهام متنوعة مثل برمجة مواقع الويب وتطبيقات الجوال والأنظمة المصرفية وأنظمة إدارة علاقات العملاء "CRM" وتطبيقات البيانات الضخمة. سيكون برنامجك الأول بلغة جافا لطباعة عبارة الترحيب Hello World على الشاشة كما يلي: class MyClass{ public static void main(String args[]) { System.out.println("Hello World"); } } ما يجعل لغة جافا سهلة التعلم هو كونها تشبه لغة C وهي لغة مستقرة تعتمد البرمجة كائنية التوجه التي تستخدم الأصناف والكائنات بشكل أساسي لتنفيذ المهام، كما أنها لغة واسعة الانتشار وتوفر الكثير من الموارد للمتعلمين الجدد، ففي حال قررت تعلم هذه اللغة ستجد مجتمع دعم كبير من المطورين عبر الإنترنت وستحظى بالكثير من موارد التعلم المجانية. لغة كوتلن Kotlin إذا كنت لا تفضل تعلم لغة جافا وتجد تعليماتها طويلة وعصية على الفهم، فيمكنك بدلًا من ذلك تعلم لغة البرمجة كوتلن Kotlin، فلغة كوتلن هي من أسهل لغات البرمجة الحديثة نسبيًا فقد ظهرت عام 2011 من قبل شركة JetBrains وهي ذات الشركة التي طورت بيئة التطوير المتكاملة IntelliJ IDEA لتطوير جافا. لاحظ هنا أن برنامج طباعة Hello World على الشاشة بلغة كوتلن يكتب بشكل أكثر اختصارًا من مكافئة في جافا: fun main(args:Array){ println("Hello World"); } من أبرز الفروقات بين لغة جافا ولغة كوتلن هو أن الشيفرات البرمجية في كوتلن أكثر إيجازًا وتعبيرًا من نظيرتها في جافا، كما أن جافا هي في الأساس لغة كائنية التوجه بينما تدعم كوتلن مفهوم البرمجة الوظيفية وهي تعتبر اليوم منافسًا حديثًا لجافا لاسيما في تطوير تطبيقات أندرويد. ولكونها حديثة فهي لا تملك نفس المستوى من الدعم الذي تتلقاه جافا وقد لا تجد الكثير من مصادر التعلم العربية لها، ورغم ذلك تكتسب كوتلن شهرة وشعبية بالتدريج بين المبرمجين العرب في الآونة الأخيرة ولها مستقبل واعد ويمكنك البدء بتعلمها وتطوير مشاريعك البرمجية بها لاسيما إذا كنت تنوي التخصص في مجال تطوير تطبيقات الهاتف الجوال. يمكنك الاطلاع على الدروس والمقالات حول لغة كوتلن التي توفرها أكاديمية حسوب وتقرر إن كانت لغة مناسبة لأهدافك في التعلم وعلى توثيق لغة كوتلن في موسوعة حسوب. 6. لغة GO لغة GO أو Golang هي لغة برمجة حديثة نسبيًا طورتها جوجل عام 2007 من أجل تطوير البرامج بسهولة وسرعة، وهي تستخدم بشكل أساسي لتطوير تطبيقات الويب وواجهات برمجة التطبيقات. اكتسبت اللغة شعبية كبيرة بسرعة في أوساط المبرمجين لكونها بسيطة وسهلة القراءة وتملك قواعد سهلة وميزات بسيطة وبحسب المطورين تعتبر لغة GO هي لغة C للقرن الحادي والعشرين، وهي منتشرة اليوم مدعومة على نطاق واسع، وتستخدمها شركات كبيرة ومعروفة مثل جوجل ودروب بوكس Dropbox وأوبر بفضل أدائها السريع والاحترافي. ما يجعل لغة جو واحدة من أسهل لغات البرمجة هو أن عدد الكلمات المفتاحية في اللغة ضئيل مقارنة بباقي اللغات، كما أنها لا تحتوي على حلقة while ولا تدعم البرمجة الكائنية التوجه بالطريقة المعهودة في باقي لغات البرمجة، والهدف من هذه المحدودية جعلها لغة بسيطة ومباشرة وسريعة الإنتاجية. ورغم بساطتها فهي قادرة على تلبية احتياجات المبرمجين كما أنها سريعة جدًا في التشغيل والتنفيذ. يمكنك كتابة برنامجك الأول لطباعة عبارة Hello World بلغة GO بعبارات بسيطة ومفهومة كما يلي: package main import "fmt" func main() { fmt.Printf("Hello World!") } من السهل تعلم لغة جو إذا كنت معتادًا بالفعل على لغات مثل Java و C#‎‎ ،بالرغم من أن بناء الجمل سيختلف قليلًا في بعض المواضع عن لغات البرمجة المعروفة لكنك ستألف هذه الاختلافات وتعتادها بسرعة. إذا كنت مهتمًا بتعلم لغة جو، يمكنك مطالعة العديد من الدروس المفيدة حول لغة GO. ومنها سلسلة مقالات البرمجة بلغة Go 7. لغة PHP لغة PHP هي لغة برمجة مفتوحة المصدر ظهرت عام 1990 وتستخدم بشكل أساسي في تطوير الويب فمعظم مواقع وتطبيقات الإنترنت اليوم تعتمد في تطوير واجهاتها الخلفية على لغة PHP. تعتبر PHP لغة سهلة التعلم للمطورين المبتدئين فهي بسيطة ومرنة في الاتصال مع قاعدة البيانات وسيكون تعلمها بديهيًا إذا كانت لديك خلفية سابقة في لغات البرمجة. ولكونها تحظى بشعبية كبيرة بين مطوري الويب فهي تمتلك العديد من مجتمعات الدعم عبر الإنترنت وتوفر الكثير من موارد التعلم المجانية مما يساعدك على العثور على إجابات على كافة الأسئلة التي تواجهك في رحلة التعلم. تجدر الإشارة إلى أن لغة PHP قد تكون غير مناسبة لتطبيقات الويب الكبيرة، كما أن شعبيتها قد انخفضت قليلًا في السنوات الأخيرة، لكنها لا زالت تستحق التعلم، فهي تتطور باستمرار وتضاف إليها ميزات جديدة مثل البرمجة كائنية التوجه، وتدعم أطر عمل رائعة مثل Laravel و Symfony وتستخدم في بناء نظم إدارة المحتوى الأكثر شهرة عالميًا مثل ووردبريس WordPress ودروبال Drupal والتي يوفر لك تعلمها فرص عمل كبيرة في مجال تطوير الويب. توفر أكاديمية حسوب دورة تطوير تطبيقات الويب باستخدام لغة PHP التي تمكنك من تعلم تطوير مواقع ويب احترافية بتقنيات وأطر عمل مختلفة كما تتضمن العديد من المقالات الاحترافية المفيدة حول تعلم لغة PHP. 8.لغة بيرل Perl لغة البرمجة بيرل هي لغة برمجة عالية المستوى ومفتوحة المصدر مشتقة من لغة البرمجة C، طُوِّرت اللغة بداية لمعالجة الملفات والنصوص، لكنها أصبحت تستخدم اليوم كلغة عامة الأغراض وتصلح لإنجاز مجموعة واسعة من المهام. تعتبر لغة بيرل من أسهل لغات البرمجة للتعلم لكونها مرنة وقابلة للتوسع ويمكن استخدامها في تطوير أي نوع من التطبيقات البرمجية. وتعتمد بيرل شعارًا خاصَا بها وهو "There's More Than One Way To Do It" والذي يعني أن لدى المبرمج أكثر من طريقة للقيام بالأمر. سيكون برنامجك الأول بلغة "بيرل" لطباعة Hello World على الشاشة بسيطًا جدًا كما يلي: print "Hello World!"; بتعلم لغة بيرل ستتمكن من تطوير أي برامج ترغب بها كتطبيقات إدارة النظم وقواعد البيانات وتطبيقات الواجهات الرسومية والشبكات وتطبيقات الويب …إلخ. 9. لغة R طورت لغة R عام 1993 وهي لغة مخصصة للدارسين والباحثين في مجال تحليل البيانات والإحصاء وتدعم خوارزميات تعلم الآلة مثل الانحدار والتصنيف وأشجار القرار …إلخ. تكمن قوة هذه اللغة في كونها مفتوحة المصدر ومتوافقة مع جميع أنظمة التشغيل وتوفر الكثير من المكتبات والحزم المتعلقة بالإحصاء وتساعد على اختصار الكثير من التعليمات البرمجية، وهي لغة تتطور وتحدث باستمرار وتملك مجتمع دعم قوي. لذلك ينصح بتعلم هذه اللغة للمبرمجين الراغبين بتطوير الأدوات الرياضية والإحصائية أو تطيقات الذكاء الصناعي أو تطبيقات تحليل البيانات على وجه الخصوص، وليست الخيار الأسهل للبدء بتعلم البرمجة إذا كانت لك أهداف أخرى للتعلم. على سبيل المثال لطباعة عبارة Hello World بلغة "R" كل ما عليك هو كتابة السطر البرمجي التالي: print("Hello World!") لكن سهولة وقوة اللغة لا تكمن هنا فحسب، بل تبرز عند الحاجة لتنفيذ العمليات الرياضية، على سبيل المثال لاحظ سهولة كتابة كود برمجي بلغة "R" يقوم بفرز عناصر متجه تصاعديًا وتنازليًا ويجد أكبر وأصغر عنصر في هذا المتجه: x<- c(4,7,10,8,30,6,5,2,4) sort(x) sort(x,decreasing=TRUE) max(x) min(x) يمكنك تعلم المزيد عن هذه اللغة من خلال سلسلة مقالات ودورس أكاديمية حسوب التي تشرح البرمجة باحترافية باستخدام لغة R. 10. لغة Matlab تستخدم لغة ماتلاب بشكل أساسي في التطبيقات الهندسية والعلمية مثل تطبيقات تحليل البيانات ومعالجة الإشارات والصور وأنظمة التحكم والاتصالات اللاسلكية والروبوتات. وهي لغة برمجة مخصصة للاستخدام من قبل الباحثين والدارسين لحل المشكلات الهندسية والعلمية بأسهل طريقة، ويعتمدها ملايين طلاب الدراسات في الكليات والجامعات وكبرى المؤسسات مثل آبل وجوجل و تسلا لكونها تساهم في تسريع وتيرة أعمالهم. توفر ماتلاب ميزات رائعة مثل التوثيق الجيد وامتلاك عدد كبير من المكتبات الخارجية وإمكانية تطوير الأكواد الحسابية وتنفيذ واختبار الخوارزميات الخاصة بك بسهولة، كما أنها تملك قاعدة بيانات كبيرة من الخوارزميات المضمنة التي تسهل معالجة الصور وإنشاء مقاطع فيديو للمحاكاة إضافة لتسهيل مهام تحليل وتمثيل البيانات وغيرها من الميزات التي تجعل منها لغة البرمجة الأولى وربما الوحيدة في مجال الدراسات والأبحاث. تعلم أسهل لغة برمجة مقابل لغة البرمجة التي أريد تعملها قد تقرر تعلم واحدة من أسهل لغات البرمجة التي ذكرناها أعلاه ولكنك تكتشف بعد فترة وجيزة أنها لا تلبي متطلباتك! لذا قبل أن تحدد أسهل لغة برمجة كي تتعلمها من الضروري أن تحدد سبب رغبتك في تعلم البرمجة، وما الذي تريد أن تحققه من تعلمها، وما هي الأهداف التي تريد الوصول لها. فتحديد أهدافك يساعدك على تحديد مسار التعلم الصحيح واختيار اللغة المناسبة التي تمكنك من تحقيق هذه الأهداف. فإذا كنت ترغب على سبيل المثال في تطوير تطبيقات للهاتف الجوال، فعليك أن تتعلم لغة البرمجة المناسبة لهذا الغرض مثل جافا أو دارت، كما يتوجب عليك كذلك أن تمتلك المعرفة الكافية عن نظامي التشغيل iOS و Android. أما في حال كنت تريد أن تصبح مطور مواقع ويب، فعليك أن تتعلم أولًا لغة HTML ولغة CSS وإن كانت هذه التقنيات ليست لغات برمجة بالمعنى الدقيق كما سنشرح بعد قليل، إلا أن تعلمها يعتبر أحد المتطلبات الأساسية لتعلم تطوير المواقع ثم تتعلم لغات برمجة المواقع المناسبة مثل جافاسكربت أو PHP. وتذكر أن صعود السلم يكون درجة درجة! لذا بعد أن تقرر اللغة التي تريد تعلمها احرص على إتقان أساسيات البرمجة بهذه اللغة، وابدأ بكتابة برامج وتطبيقات بسيطة، ثم انتقل بالتدريج إلى مواضيع أكثر تعقيدًا ولا تستعجل تحقيق نتائج مبهرة وإنجاز تطبيقات احترافية من بداية تعلمك. وبكل تأكيد لن تتعلم إن لم تطبق! فمهما قرأت من دروس واستمتعت لمقاطع تعليمية حول البرمجة سيكون هذا جيدًا بلا شك لكن لمرحلة معينة فلن تتقن ما تعلمته إلا إذا وضعت كل هذه المعلومات في حيز التنفيذ وتعلمت كيف تصحح الأخطاء البرمجية. وللمزيد يمكنك مطالعة مقال كيف تتعلم البرمجة: نصائح وأدوات لرحلتك في عالم البرمجة. في الختام تذكر أن تعلم البرمجة قد لا يكون أمرًا سهلًا في البداية. كما أن أول لغة برمجة تتعلمها ستكون بالنسبة لك أصعب لغة حتى لو كانت من أسهل لغات البرمجة في العالم، لذا يتطلب منك تعلمها التحلي بالصبر والتدرب على طريقة التفكير كمبرمج واكتساب مهارات حل المشكلات، بعدها يكون أمر الانتقال إلى أي لغة برمجة وتعلمها أكثر سهولة. لذا من الأفضل عندما تبدأ تعلم أي لغة برمجة أن تختار أسهل لغة برمجة تلبي أهدافك من التعلم، وتمتلك مجتمع دعم كبير وموارد تعلم جيدة. وتذكر أنك لست مضطرًا للبقاء أسيرًا لأي لغة برمجة، ويمكنك التبديل إلى أي لغة أخرى في أي وقت. اقرأ أيضًا مجالات البرمجة تعرف على أعلى تخصصات البرمجة أجرا قواعد البرمجة ببساطة للمبتدئين تعرف على أشهر لغات برمجة الألعاب
    1 نقطة
  15. لغات البرمجة هي وسيلتنا للتواصل مع الحواسيب وطلب الأوامر منها، وبالرغم من وجود مئات لغات البرمجة التي تشترك في أنها تحول أفكارنا البشرية إلى ترميز يفهمه الحاسوب إلا أن هذه اللغات تختلف وتتفاوت فيما بينها في عدة أوجه ولهذا السبب يتم تصنيف لغات البرمجة من قبل المختصين والمطورين وفق أنواع مختلفة بحيث تشترك اللغات التي تندرج تحت كل نوع في مجموعة سمات مشتركة فيما بينها. وفي مقال اليوم سوف نعرفكم على مختلف أنواع لغات البرمجة والسمات المميزة لكل نوع وندعم شرحنا بأمثلة عملية على كل نوع منها كي تتمكن من التمييز بينها وتختار لغة البرمجة الأنسب لمتطلبات عملك. أنواع لغات البرمجة تصنَّف لغات البرمجة وفق الأنواع التالية كما هو موضح في الصورة أعلاه كما يلي: أنواع لغات البرمجة وفق مستوى الترميز: لغات البرمجة منخفضة المستوى Low level Programming Languages لغة الآلة Machine language. لغات التجميع Assembly languages. لغات البرمجة عالية المستوى High level languages. أنواع لغات البرمجة وفق طريقة معالجة التعليمات: اللغات المُصرَّفة Compiled Languages. اللغات المُفسَّرة Interpreted languages. اللغات الهجينة المصرّفة المفسّرة أنواع لغات البرمجة وفق أسلوب تنظيم الشيفرة: لغات البرمجة الوظيفية Functional Programming. لغات البرمجة الإجرائية Procedural Programing. لغات البرمجة الكائنية Object-oriented Programming. أنواع لغات البرمجة وفق مجالات الاستخدام: لغات البرمجة عامة الغرض General Purpose programming Languages. لغات البرمجة خاصة الغرض Special Programing Languages. نشرح في الفقرات التالية كل نوع من أنواع لغات البرمجة ونوضح أبرز السمات المشتركة لكل نوع منها وأمثلة توضيحية عليها. أنواع لغات البرمجة وفق مستوى الترميز يُقصد بمستوى الترميز قدرتنا على فهم واستخدام الرموز في كتابة شيفرات لغة البرمجة وبمدى قرب لغة البرمجة من لغة الآلة أو بعدها عنها وقربها من لغة البشر، وبناء على هذا المعيار نجد مستويات لغات البرمجة التالية: لغات البرمجة منخفضة المستوى لغات البرمجة عالية المستوى لغات برمجة متوسطة المستوى سنشرح كل واحدة منها تباعًا. لغات البرمجة منخفضة المستوى Low level Programming Languages تُدعى لغات التجميع assembly languages ولغة الآلة machine language لغات البرمجة منخفضة المستوى لأنها تُنفِّذ فقط مجموعات الأوامر الأساسية للتعامل مع الآلة دون أية وظائف (أو القليل القليل منها في حالة لغات التجميع) جاهزة للتعامل مع البيانات أو تنفيذ حلقات أو عبارات شرطية أو إدارة تلقائية للذاكرة. لغة الآلة Machine Language: وهي اللغة الأصيلة التي يفهمها الحاسوب أو الآلة المخاطبة وتمثل سلسلة من الأحرف والأرقام المتداخلة التي يصعب جدًا فهم المطلوب منها للأشخاص غير المختصين في هذا المجال من البرمجة. إليك مثالًا: ;123+25 برنامج بلغة الآلة لجمع العددين B82301 052500 لغة التجميع Assembly Languages: لا تبتعد هذه اللغة كثيرًا عن لغة الآلة لكنها تستخدم عددًا محدودًا من التعليمات التي تمتلك مدلولًا وتنفذ عملًا بسيطا جدًا كنقل قيمة من مكان لآخر أو إضافة قيمة إلى قيمة وهكذا. إليك المثال السابق مكتوبًا بلغة تجميع: ;برنامج بلغة التجميع العددين 123+25 MOV AX,123 ADD AX,25 يمكن أن نتوقع أن التعليمة MOV تضع القيمة 123 ضمن AX ومن ثم تجمع التعليمة ADD القيمة 25 إلى قيمة AX. وكما ترى فمن الصعب كتابة برمجيات طويلة وخوارزميات معقدة باستخدام هذه اللغات لأنها ستستغرق وقتًا طويلًا وكمًا هائلًا من الشيفرة التي يصعب تنقيحها وصيانتها. ويقتصر استخدامها حاليًا على برمجة بعض الوظائف الأساسية المرتبطة بالتعامل المباشر مع العتاد الصلب والتجهيزات الإلكترونية القابلة للبرمجة. لغات البرمجة عالية المستوى High level languages لغات البرمجة عالية المستوى هي إحدى أشهر مستويات لغات البرمجة وهي أكثر لغات البرمجة استخدامًا حاليًا لأنها تمتلك صياغة واضحة يمكن فهمها والتعامل معها بسهولة لإنجاز المطلوب بيسر وبأقل عدد ممكن من التعليمات. هذه اللغة عالية التنظيم إذ يمكن فصل الشيفرات التي تؤدي عملًا محددًا ضمن إجرائية خاصة بها نستدعي هذه الإجرائية في المكان الذي نشاء في الشيفرة دون الحاجة إلى كتابة تعليماتها مجددًا بالإضافة إلى الكثير من نقاط القوة كاستخدام الأنواع والحلقات والتعابير الشرطية مما يجعلها الهدف الأساسي لمن يريد تعلم البرمجة. من أمثلة لغات البرمجة عالية المستوى نجد جافا JAVA وبايثون Python و ++C وغيرها الكثير. إليك المثال السابق الذي رأيناه بلغة الآلة ولغة التجميع مكتوبًا بلغة ++C: // 25+123 لجمع العددين C++ برنامج بلغة int num= 25+123 //num اجمع العددين وأسندهما إلى المتغير الصحيح لغات برمجة متوسطة المستوى توجد حاليًا عدة معايير حديثة لاعتبار لغة البرمجة منخفضة المستوى أو عالية المستوى تتعلق بوظيفة اللغة أي قدرتها على تنفيذ مهام متعددة وقدرتها على إدارة الذاكرة وتعاملها مع العتاد الصلب مباشرة. ووفقًا لهذه المعايير يعتبر بعض المتخصصين أن لغات مثل C و ++C هي لغات منخفضة المستوى علمًا أنها تُعد لغات عالية المستوى! والسبب في ذلك هو قدرتها على إدارة الذاكرة يدويًا وكذلك إمكانية التعامل مباشرة مع لغة التجميع. لهذا يقترح بعض العاملين في مجال علوم الحاسب وجود لغات متوسطة المستوى تتمتع بميزات المستويين السابقين، وتساعد الكثير من المصممين ومهندسى معمارية الحواسب ومهندس الإلكترونيات على التخاطب مع التجهيزات وبرمجتها بطريقة أكثر فعالية. للمزيد من المعلومات يمكنك مطالعة مقال مستويات لغات البرمجة. أنواع لغات البرمجة وفق طريقة معالجة التعليمات يُقصد بذلك هو تصنيف لغات البرمجة بناءً على طريقتها في معالجة شيفراتها وتحويلها إلى لغة التجميع أو لغة الآلة وهنا نتحدث عن اللغات عالية المستوى نوعًا ما وهذا التصنيف يشمل: اللغات المُصرَّفة Compiled Languages اللغات المُفسَّرة Interpreted languages اللغات الهجينة المصرّفة المفسّرة اللغات المصرفة Compiled Languages تستخدم هذه اللغات برنامجًا يُدعى المصرّف Compiler لنقل الشيفرة المكتوبة بلغة برمجة عالية المستوى إلى لغة الآلة. تجري عملية التصريف عادة بمسح الشيفرة ثم تحليلها ونقلها إلى لغة وسطية Intermediate Representation ثم تُطبق عليها تحسينات مما يجعل البرامج أكثر فعالية وأسرع في التنفيذ وأقل حجمًا ثم تُنقل أخيرًا إلى لغة الآلة (لغة الأصفار و الواحدات). من أمثلة لغات البرمجة المصرّفة نجد: C ++C Go Ada Fortran COBOL Lisp Objective-C Swift تتميز هذه اللغات بإمكانية التقاط الأخطاء أثناء عملية التصريف ومعالجتها، وقليلًا ما يخفق تنفيذ البرنامج بعد التصريف. لا يمكن أن يسمح المصّرف بتنفيذ البرنامج إن كانت هناك أخطاء في الصياغة لكن الأخطاء الدلالية أو المنطقية التي تحدثنا عنها في الفقرة السابقة قد تمر. عمومًا، تُعد البرامج المكتوبة بلغات برمجة مصرّفة أسرع تنفيذًا بعد الانتهاء من تصريفها موازنة بغيرها. اللغات المفسّرة Interpreted languages تستخدم هذه اللغات برنامجًا يُدعى المفسّر Interpreter الذي يقرأ كل سطر من أسطر الشيفرة ويحلله وينفّذه مباشرة وبالتالي سيعمل البرنامج إن كتب بلغة مفسّرة قبل أن يبدأ نفس البرنامج العمل إن كُتب بلغة مصرّفة. سيتوقف البرنامج عن العمل في اللغات المفسّرة بمجرد أن يُصادف الخطأ وعلى المبرمج حينها إصلاح الخطأ وإعادة تنفيذ البرنامج من البداية. من أمثلة لغات البرمجة المفسّرة نجد: Python JavaScript Perl MATLAB BASIC يمكن تشبيه آلية التصريف والتفسير بآلية الترجمة النصية والترجمة الشفهية، ففي الأولى يُعطى المترجم نصًا ثم يسلمه مترجمًا كاملًا إلى لغة أخرى بعد فترة، أما في الثانية فيكون المترجم حاضرًا ويترجم النص الذي يُقال مباشرةً كلمة بكلمة. اللغات الهجينة المصرّفة المفسّرة تستخدم هذه اللغات مصرّفًا لتحويل الشيفرة المكتوبة إلى لغة منخفضة المستوى ثم يُستخدم المفسر في تحليل وتفسير شيفرة هذه اللغة وتنفيذها. إذ تُصرّف شيفرة جافا JAVA مثلًا إلى لغة جافا بايت كود bytecode ليأتي المفسر الذي يُدعى JIT ويحسّن الشيفرة بناء على المعالج المستهدف ثم ينفّذها. وهكذا نضمن سرعة الأداء وقلة الأخطاء أثناء التنفيذ. من أمثلة اللغات الهجينة نجد: Java #C Visual Basic Erlang #F مفهوم وقت التنفيذ Runtime يُقصد بوقت التنفيذ runtime ببساطة الزمن الحقيقي لتنفيذ التعليمات في برنامج معين. لا يبدأ زمن التنفيذ في اللغات المصرّفة إلا عند انتهاء المصرّف من تنقيح الشيفرة وتقفي الأخطاء وتحويل البرنامج إلى لغة الآلة، لهذا السبب تجد أن أخطاء زمن التنفيذ قليلة. أما في حال اللغات المفسرّة فزمن التنفيذ هو نفسه زمن بناء البرنامج إذ يقرأ المفسّر كل سطر من الأسطر البرمجية وينفذه مباشرة، وهذا ما يجعل البرامج المفسّرة أسرع تشغيلًا من مثيلاتها المصرّفة، لكن أية أخطاء سواءً أخطاء الصياغة أو الأخطاء الدلالية ستوقف عمل البرنامج بأكمله وعلى المبرمج أن يعود إلى نقطة الصفر من جديد. أنواع لغات البرمجة وفق أسلوب هيكلة الشيفرة وتنظيمها يُقصد بذلك تصنيف لغات البرمجة وفقًا لتنظيم المتغيرات والإجرائيات وتسلسل العمليات التي تؤدي في النهاية إلى تنفيذ البرنامج: لغات البرمجة الوظيفية Functional Programming لغات البرمجة الإجرائية Procedural Programing لغات البرمجة الكائنية Object-oriented Programming لغات البرمجة الوظيفية Functional Programming تجمع التعليمات التي تؤدي وظيفة معينة ضمن دالة function تقبل وسطاء لحمل المعلومات إليها وتعيد قيمًا. تُستخدم الدوال في كل مكان: كمتغيرات ووسطاء وقيم معادة ولا تستخدم هذه اللغات حلقات التكرار أو العبارات الشرطية بل الدوال التعاودية Recursive function. تُعد لغات البرمجة هذه معدومة الثغرات تقريبًا وفعالة جدًا في البرمجة المتوازية Parallel Programing. من أمثلة لغات البرمجة بالدوال نجد: Elixir Erlang Common Lisp Haskell #F Clojure Elm Racket فيما يلي مثال على طباعة عبارة Hello World بلغة البرمجة الوظيفية "#F" printfn "Hello, world!" لغات البرمجة الإجرائية Procedural Programing تُجمع التعليمات التي تؤدي إلى وظيفة معينة ضمن إجرائية Procedural (شبيهة بفكرة الدوال) تقبل وسطاء لحمل المعلومات إليها. تنفذ الإجرائية التعليمات التي تضمها ويمكن استدعائها في أي مكان من الشيفرة وضمن أي إجرائية أخرى. ولا تمنع هذه اللغات استخدام الحلقات والعبارات الشرطية ضمن الإجراءات. من أمثلة لغات البرمجة الإجرائية نجد: C Pascal Fortran BASIC إليك مثالًا بسيطًا على طباعة عبارة Hello World بلغة البرمجة الإجرائية "C": #include <stdio.h> int main() { printf("Hello, world!"); return 0; } لغات البرمجة الكائنية Object-oriented Programming جاءت فكرة لغات البرمجة كائنية التوجه من أن كل شيء في الطبيعة هو كائن له أعضاء تنفذ وظائف معينة ليكون مستقلًا بذاته متفاعلًا مع غيره. ووفق هذه الرؤية يجري تغليف المتغيرات والثوابت والعمليات التي تؤدي وظيفة معينة في لغات البرمجة هذه ضمن وحدة برمجية مستقلة تُدعى كائن Object، ويمكن أن نعيد استخدام نسخ عن هذا الكائن كلما احتجنا. كما تسمح هذه اللغات بتقليد الطبيعة من ناحية الوراثة إذ يمكن لبعض الكائنات أن ترث بعض الصفات من كائن آخر يكون بمثابة أب له. وكمثال على ذلك نفترض وجود كائن يُدعى "مركبات" له خصائص ووظائف معينة، وكائن آخر هو "سيارة" وآخر "زورق". يمكن أن يشترك "الزورق" و"السيارة" مع الكائن "مركبات" ببعض الصفات مثل وجود محرك وهيكل وعجلة قيادة لهذا يمكن أن نجعل الكائن "مركبات" أبًا يرث منه الكائنان "سيارة" و"زورق" الصفات العامة ويكون لهما صفات خاصة تتعلق بطريقة عملهما. وتتميز أيضًا لغات البرمجة هذه بفكرة تعدد الأشكال، أي إن اشتركت مجموعة كائنات بوظيفة ما يمكن أن نستخدم نفس الإجرائية لطلب هذه الوظيفة، فإن كان لدينا كائنان هما قط يتحرك وسمكة تسبح يمكن لكليهما أن يتحرك، أي يمكن أن نستخدم إجرائية واحدة بنفس الاسم لتحريك كلا الكائنين بالطريقة الصحيحة على اختلاف كيفية التنفيذ لكل منهما. تُستخدم هذه اللغات بكثرة في تطوير الأنظمة المعلوماتية والبرمجيات حاليًا. من أمثلة لغات البرمجة بالكائنات نجد: JAVA Python ++C #C Visual Basic Ruby Swift لنستعرض مثالًا على طباعة عبارة Hello World بلغة البرمجة الكائنية "#C": using System; class Program { static void Main(string[] args) { Console.WriteLine("Hello, world!"); } } أنواع لغات البرمجة وفق مجالات الاستخدام ذكرنا في المقدمة وجود عدد كبير من اللغات التي تُستخدم لتحقيق طريقة تواصل بين البشر وأجهزة محددة أطلقنا عليها اسم الأجهزة القابلة للبرمجة. وبناء على ذلك يمكن تصنيف لغات البرمجة وفق الغاية المطلوبة منها وهي: لغات البرمجة عامة الغرض لغات برمجة خاصة الغرض لغات البرمجة عامة الغرض General Purpose programming Languages يمكن استخدام هذه اللغات لبرمجة أي شيء تقريبًا كالحواسب والتجهيزات الإلكترونية والروبوتات وأن تؤدي شتى الوظائف مثل تطوير الويب وتحليل البيانات والتنقيب عنها وتطوير البرمجيات لبيئات عمل مختلفة. من أمثلة لغات البرمجة عامة الغرض نجد: JAVA Python Ruby ++C C تستخدم بعض اللوحات الإلكترونية القابلة للبرمجة مثلًا (وهي بمثابة حواسيب خاصة) لغات البرمجة العامة الأغراض، إذ تستخدم منصات أردوينو Arduino لغات C و ++C و Java لكتابة برامجها ضمن بيئة عمل مخصصة ومكتبات مخصصة، كما تستخدم حواسب راسبيري باي الشهيرة لغة Python ضمن نظام تشغيل راسبيان الخاص بها. لغات برمجة خاصة الغرض Special Programing Languages تُستخدم هذه اللغات لكتابة تطبيقات لأنظمة تشغيل محددة أو لتجهيزات محددة. من أمثلة لغات البرمجة الخاصة نجد: Kotlin: لبرمجة تطبيقات على نظام أندرويد Android. Swift: لبرمجة تطبيقات على نظام أي أو إس iOS. Objective-C تستخدم نُسخ منها لبرمجة تطبيقات ماك أو إس Mac OS ونُسخ أخرى لبرمجة التجهيزات التي تعتمد على المتحكمات الصغرية Micro Controllers. ASP.Net: لغة سكربت تعمل على الخادم لتطوير تطبيقات ويب فقط. PHP: لغة سكربت تعمل على الخادم فقط لتطوير تطبيقات ويب. أنواع اللغات وفق طريقة كتابة شيفراتها يمكن تصنيف لغات البرمجة بناءً على طريقة كتابة شيفرتها وهي إما لغة برمجة نصية مكتوبة أو لغة برمجة رسومية مرئية تشبه صياغتها عملية تركيب قطع المكعبات. لغات برمجة مكتوبة Written programming Languages وهي الأغلبية الساحقة من لغات البرمجة إذ تكتب الشيفرة فيها على شكل تعليمات نصية متتالية. لغات برمجة رسومية أو مرئية Visual programming Languages وتستخدم هذه اللغات كتلًا رسومية تُسحب إلى منطقة بناء البرنامج، ولهذه الكتل وظيفة معينة مثل كتل المتغيرات وكتل الحلقات وكتل الإدخال والإخراج والكتل الشرطية وكتل العمليات الحسابية وغيرها، صم تُربط هذه الكتل مع بعضها لتكوين البرنامج النهائي. من أمثلة لغات البرمجة الرسومية نجد سكراتش Scratch التي تُستخدم لبرمجة التطبيقات على منصات مختلفة مثل ويندوز ولينكس (نسخة محدودة) وكذلك لبرمجة تجهيزات راسبيري باي. كما يمكن أن نشير إلى اللغتين Ladder و FBD وتستخدمان في برمجة تجهيزات إلكترونية تُدعى المتحكمات المنطقية القابلة للبرمجة PLC. الخلاصة تعرفنا في مقال اليوم على أنواع لغات البرمجة وشرحنا أهم المعايير التي يتم بناء عليها تصنيف لغات البرمجة وفق مستواها وقربها من لغة البشر أو طريقة معالجة تعليماتها أو أسلوب هيكلة شيفراتها أو مجالات استخداماتها وتطبيقاتها أو وفق الطريقة التي تكتب بها تعليمات هذه اللغات وبينا كيف أن لغات البرمجة قد تندرج تحت أكثر من تصنيف واحد بذات الوقت. ما هي لغات البرمجة التي تستخدمها، وما هي التصنيفات التي تندرج تحتها؟ وما أهم التطبيقات التي تستخدمها باستخدام هذه اللغة؟ شاركنا تجربتك في التعليقات أسفل المقال. وللمزيد من المعلومات يمكنك مطالعة مقال دليلك الشامل لتعلم البرمجة. اقرأ أيضًا أسهل لغات البرمجة تعرف على أشهر لغات برمجة الألعاب
    1 نقطة
  16. مستويات لغات البرمجة موضوع مهم ولطالما حاول المبرمج معرفة مستوى لغة البرمجة التي يريد تعلمها، لذا سنوضح في هذا المقال مستويات لغات البرمجة وفق طريقة ترميزها وكتابتها، ونوضح سبب إنشاء هذه المستويات وأهم الفروقات بين اللغات منخفضة المستوى وعالية المستوى، ونُبيِّن مزايا وعيوب كل منها وكيف يتم التعامل معها عندما نكتب برامجنا المختلفة. تجدر الإشارة أن مستوى لغة البرمجة يكون أكثر ارتفاعًا كلما كان أكثر تجريدًا وأقرب لفهمنا نحن البشر، ويكون أكثر انخفاضًا كلما كان مُفصَّلًا وقريبًا من مستوى فهم الحواسيب والأجهزة الإلكترونية القابلة للبرمجة كالهواتف الذكية والأجهزة اللوحية والروبوتات وغيرها. ما هي البرمجة؟ البرمجة باختصار هي عملية ضبط الحواسيب وبرمجتها على إنجاز مهام معينة عادة ما تكون تكرارية روتينية وهذا ينطبق على كل الحواسيب والأجهزة الحاسوبية الإلكترونية باختلافها وأحجامها مثل الحاسوب والجوال والساعة وكل الإلكترونيات التي يُطلق عليها وصف "ذكية". ويعرف قاموس صخر المعاصر كلمة البرمجة بأنها عملية منهجية لوضع الإجراءات والخطوات الواجب اتخاذها لتحقيق أهداف محدَّدة بصورة فعَّالة. ما الحاجة إلى لغة البرمجة؟ ولا تقوم تلك العملية إلى عبر وسيلة تخاطب بين الإنسان والحاسوب لإخباره بالأوامر التي يتوجب عليه القيام بها، ولكن الحاسوب لا يفهم سوى لغة وحيدة تسمى لغة الآلة تتضمن بيانات ثنائية مكونة من مجموعة من الأصفار والواحدات فقط مرتبة وفق نمط معين وهي لغة صعبة علينا نحن البشر لأننا نستخدم لغة تسمى أحيانًا لغة طبيعية تستعمل حروف أبجدية وتبدو بالنسبة لغة الآلة لنا مجرد سلسلة مبهمة من الأرقام. بالمقابل لا تستطيع الحواسيب فهم لغتنا البشرية ولا معرفة دلالات كلامنا، ومن هنا أتت فكرة إيجاد لغة برمجة تكون قريبة للغتنا لنتخاطب بها مع الحواسيب ونرسل من خلالها الأوامر والتعليمات للحاسوب ليفهمها الحاسوب، ولكن لا يأخذها الحاسوب مباشرة بل تُعالج التعليمات المكتوبة بلغة برمجة وتُحول إلى لغة الآلة من خلال أدوات مخصصة تعرف باسم المترجم Compiler أو المفسر Interpreter. لعلك تتساءل لماذا لا يفهم الحاسوب لغتي البشرية أو اللغة الإنجليزية ويضطرني للتخاطب معه بإحدى لغات البرمجة؟ والجواب هو أن لغات البرمجة تكتب وفق صياغة معينة ولا تسمح بوجود أي أخطاء فيها، فعندما نتحدث نحن البشر فيما بيننا بلغتنا يمكننا أن نستدرك وقوع بعض الأخطاء النحوية الطفيفة ونصحح سوء الفهم لبعض الأخطاء غير المقصودة و نفهم دلالات الكلمات المتشابهة من السياق بصورة تلقائية بفضل قدرات أدمغتنا البشرية. لكن الحواسيب ليست بهذا الذكاء -ولا تملك ذرة من الذكاء- لذا يجب التخاطب معها بلغات برمجة لها قواعد وصيغ محددة وثابتة وبأوامر واضحة لا تحتمل الخطأ أو التأويل، فلغات البرمجة لن تنفذ في حال وجود أي خطأ بسيط واحد في كتابتها حتى لو كان الخطأ فاصلة واحدة فقط أو نقطة! دورة علوم الحاسوب دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب اشترك الآن لماذا ظهرت مستويات لغات البرمجة؟ مثلما توجد أنواع مختلفة من لغات البشر تستخدم أبجدية ورموزًا مختلفة وتحكمها قواعد وطرق كتابة مختلفة، توجد بشكل مشابه أنواع كثيرة من لغات البرمجة تختلف في ميزاتها ومستوياتها وطريقة كتابتها وتتنوع في استخداماتها وتطبيقاتها. تصنف لغات البرمجة وفق عدة تصنيفات وتنقسم إلى عدة أنواع ذكرناها في مقال دليلك الشامل إلى لغات البرمجة وسنركز في فقراتنا التالية على أحد التصنيفات الرئيسية للغات البرمجة، وهو تمييزها إلى مستويات حسب طريقة ترميزها ونشرح أهم الفروقات في كل مستوى. ما هي مستويات لغات البرمجة يقصد بمستوى لغة البرمجة مقدار تفاصيل الرموز البرمجية التي تستخدمها هذه اللغة، فكلما قلت التفاصيل ارتفع مستوى لغة البرمجة وزادت سهولتها والقدرة على فهم تعليماتها من قبل البشر، وكلما زادات التفاصيل الدقيقة كلما انخفض مستوى اللغة واقتربت أكثر من فهم الآلة. توجد المئات من لغات البرمجة في العالم، وتصنف لغات البرمجة بناء على درجة تجريدها إلى ثلاثة مستويات هي: لغات البرمجة منخفضة المستوى Low level Programming Languages لغات البرمجة متوسطة المستوى Medium Level Programming Language لغات البرمجة عالية المستوى High level Programming Languages لغات البرمجة فائقة المستوى Very High-level programming language نشرح في الفقرات التالية كل مستوى من هذه المستويات بمزيد من التفصيل. لغات البرمجة منخفضة المستوى Low level Programming Languages لغات البرمجة منخفضة المستوى هي أحد مستويات لغات البرمجة المكتوبة بطريقة يسهل على أجهزة الحواسيب فهمها وتفسيرها، ويمكن من خلالها التخاطب مباشرة مع أجهزة الحاسوب، وإنجاز العمليات على مستوى وحدة المعالجة المركزية CPU والوصول المباشر إلى ذاكرة الحاسوب وإدارتها والتحكم في عمليات الإدخال والإخراج. تعد كل من لغة الآلة Machine language التي تستخدم بيانات رقمية مكونة من 0 و 1 فقط، ولغة التجميع Assembly language أبرز الأمثلة على لغات البرمجة منخفضة المستوى. تتميز اللغات منخفضة المستوى بسرعة التنفيذ وأداء أفضل من اللغات عالية المستوى لأن الكود البرمجي المكتوب بها لا يحتاج إلى تفسير أو ترجمة لينفذ ويمكن للحاسوب فهمه وتنفيذه مباشرة، كما أنها تنفذ بأقل قدر ممكن من مساحة الذاكرة. تستخدم اللغات منخفضة المستوى عادة في كتابة نواة نظام التشغيل أو برامج تعريف العتاد وتشغيله device driver أو التطبيقات المخصصة التي تتطلب التعامل المباشر مع عتاد الحاسوب، ولا تستخدم من قبل المطورين بشكل مباشر لأغراض البرمجة المعروفة مثل تصميم مواقع الويب أو تطبيقات الجوال أو تطوير الألعاب وما شابه. لغة الآلة Machine Language لغة الآلة هي أدنى مستوى من مستويات لغات البرمجة وهي تكتب بتنسيق مكون من سلسلة من البتات أو من الأصفار والواحدات التي تمثل ترميزًا للعمليات التي يجب أن تتم في وحدة المعالجة المركزية وهو تنسيق يصعب على البشر قراءته وكتابته مباشرة. يمكن تفسير لغة الآلة وتنفيذها مباشرة من قبل الحاسوب أو بعبارة أدق من قبل وحدة المعالجة المركزية للحاسوب، وفي بداية اختراع الحاسوب كانت هذه اللغة هي الوسيلة الوحيدة للاتصال بين البشر والحواسيب وكانت تُكتب على بطاقات مثقبة تمثل الأصفار والواحدات، ونظرًا لأن لغة الآلة هي لغة تعطي تعليمات مباشرة إلى المعالج فيمكنك من خلال هذه اللغة استخدام جميع الوظائف التي يمتلكها المعالج. صورة مثقبة تعبر عن تعليمات مكتوبة بلغة الآلة لبرمجة الحاسوب قديمًا تبدو أوامر لغة الآلة بشكل سلسلة من الأرقام الثنائية أو الست عشرية وهي تعتمد على بنية معالج الحاسب وتختلف من نوع معالج لآخر، ويتسبب كل أمر منها بجعل ينفذ مهمة محددة للغاية مثل تحميل قيمة في سجل وحدة المعالجة المركزية أو تخزين قيمة في الذاكرة أو الانتقال لموضع معين فيها. وتتكون الأوامر بلغة الآلة من جزأين الأول هو جزء التعليمات القابلة للتنفيذ والثاني هو جزء العناوين، على سبيل المثال الكود التالي يمثل كودًا برمجيًّا مكتوبًا بلغة الآلة: 10100011 10110111 11000101 AZ B7 C5 وتملك كل عائلة من المعالجات مجموعة من التعليمات الخاصة بها للتعامل مع العمليات المختلفة مثل الحصول على مدخلات من لوحة المفاتيح، وعرض المعلومات على الشاشة، وأداء العديد من المهام الأخرى التي تعرف باسم تعليمات لغة الآلة. لغة التجميع Assembly Language لغة التجميع هي لغة برمجة منخفضة المستوى تم تطويرها للتقليل من صعوبة فهم لغة الآلة، فهي تعتمد في ترميزها على استخدام تعليمات وأوامر مكونة من كلمات قصيرة ومفهومة بدلًا من استخدام التعليمات الرقمية التي يصعب على البشر حفظها وكتابة البرامج مباشرة بها. في هذه اللغة يتم ربط كل رقم بسلسلة من الأحرف لسهولة تذكره ومعرفة معناه واستخدامه في كتابة البرنامج، حيث تتضمن لغة التجميع أوامر بسيطة مثل ADD لإضافة قيمة إلى قيمة، والأمر SUB لطرح قيمة من قيمة، والأمر MOV لنقل قيمة من موضع لآخر …إلخ. ومن خلال هذه الأوامر البسيطة يمكنك تنفيذ أوامر أكثر تقدمًا كالعمليات الحسابية والرياضية المختلفة. على سبيل المثال البرنامج البسيط التالي يقوم بجمع العددين 30 و40 باستخدام لغة التجميع: .data sum DWORD ? .code main proc MOV eax,30 ADD eax,40 MOV sum,eax في الكود السابق يدل القسم ‎.data على منطقة البرنامج التي تحتوي على المتغيرات وهنا كما تلاحظ عرفنا متغيرًا باسم sum لتخزين ناتج الجمع. ويدل القسم ‎.code على منطقة البرنامج الأساسية التي تحتوي على التعليمات المخصصة لجمع هذين العددين. يمكن أن تخمن من الكود السابق أن أول تعلمية MOV وضعت القيمة 30 ضمن السجل eax والتعليمة ADD أضافت القيمة 40 إلى القيمة المخزنة في السجل eax وأخيرًا قامت التعليمة MOV بوضع قيمة eax ضمن المتغير sum. بعد كتابة التعليمات بلغة التجميع يمكن تحويلها بسهولة إلى لغة آلة قابلة للتنفيذ بواسطة برنامج خاص يسمى "المُجمِّع" Assembler. تستخدم لغة التجميع لكتابة برامج قصيرة وبسيطة ولكنها غير مناسبة للبرامج الكبيرة والمعقدة، لهذا السبب يقتصر استخدامها على البرامج التي تحتاج إلى التواصل المباشر مع عتاد الحاسب كمكبرات الصوت ولوحة المفاتيح والشاشات وما شابه، وعلى الحالات التي تتطلب سرعات تنفيذ عالية أو إجراءات خاصة غير ممكنة التحقيق في اللغات الأعلى مستوى. لغات البرمجة عالية المستوى High level Programming Languages. تعد لغات البرمجة عالية المستوى أكثر لغات البرمجة استخدامًا وشيوعًا ومن أهم مستويات لغات البرمجة، فقد تم تصميمها لتكون مفهومة من قبل البشر وهي تحاكي اللغة الإنجليزية إلى حد ما وتستخدم صياغة واضحة وكلمات محددة ومفهومة ورموزًا رياضية شائعة مما يمكن المبرمجين من تطوير برامجهم بسرعة أكبر ويقلل احتمالية حدوث الأخطاء. هناك المئات من لغات البرمجة عالية المستوى المتفاوتة في درجة صعوبتها لكنها بالمجمل تبقى سهلة التعلم والتنفيذ ومن أشهر الأمثلة على اللغات عالية المستوى جافاسكربت وبايثون وروبي و C++‎ و PHP …إلخ. يعد هذا النوع من لغات البرمجة صديقًا للمبرمجين لكونها سهلة الفهم والاستخدام والصيانة، وهي تصلح لتطوير مختلف أنواع التطبيقات والبرامج كتطبيقات سطح المكتب ومواقع الويب والألعاب وتطبيقات الذكاء الصنعي …إلخ. على سبيل المثال البرنامج التالي مكتوب بلغة "بايثون" لجمع العددين 30 و 40، وكما تلاحظ فهو مكتوب بشيفرة أسهل في الفهم بكثير من شيفرة لغة التجميع. x = 30 y = 40 sum=x+y print(sum) بالمقارنة مع اللغات منخفضة المستوى تتميز لغات البرمجة عالية المستوى بكونها أفضل منها في الإنتاجية، لكنها أبطأ في التنفيذ وتستغرق وقتًا إضافيًا من أجل ترجمة تعليماتها وشيفراتها المصدرية إلى كود الآلة. لغات البرمجة متوسطة المستوى Medium Level Programming Language نظرًا للتطور الهائل الذي شهدته لغات البرمجة فقد ظهرت في الآونة الأخيرة لغات برمجة مرنة ومختصرة الصياغة وأسهل في الفهم وفي طريقة التنفيذ كلغة بايثون أو روبي …إلخ. أتاحت هذه اللغات للمبرمجين الاستغناء عن كتابة الكثير من التفاصيل عند تطوير البرامج لذا تم تصنيفها من مستويات لغات البرمجة على أنها هي اللغات العالية المستوى وتمت إضافة تصنيف جديد للغات البرمجة هو لغات البرمجة متوسطة المستوى لتصنيف لغات البرمجة الأقدم التي ظهرت في البدايات مثل C ولغة Ada ولغة جافا بأنها لغات متوسطة المستوى. علمًا أن هذه اللغات لاتزال تعتبر لغات عالية المستوى لكونها مفهومة من قبل البشر وتستخدم تعليمات بسيطة وقريبة من اللغة الإنجليزية ويمكن استخدامها لتطوير التطبيقات المختلفة بسهولة لكن التصنيف وضع لإنشاء بنية تنظيمية تستوعب كافة لغات البرمجة. على سبيل المثال تعتبر لغة بايثون أعلى مستوى من لغة جافا لأن جافا أصعب في التعلم والاستخدام ولأنك تستطيع إعادة كتابة برنامج مكتوب بلغة جافا باستخدام كود أبسط وأقل حجمًا في لغة بايثون. يمكن القول أن لغات البرمجة متوسطة المستوى تجمع بين أفضل إمكانيات اللغات عالية المستوى وإمكانيات اللغات منخفضة المستوى مثل لغة التجميع، فهي تسمح بإدارة الذاكرة يدويًا ومعالجة البيانات والتعامل مع البتات والبايتات والمؤشرات مباشرة لذا تعد لغات البرمجة الأنسب للتخاطب مع التجهيزات وبرمجة الأنظمة. لغات البرمجة فائقة المستوى Very high-level programming language ظهرت كذلك في التسعينيات مستويات أخرى للغات البرمجة عرفت باسم اللغات فائقة المستوى وهو مصطلح يستخدم لوصف لغات عالية المستوى جدًا والقريبة بشكل كبير من لغة البشر هذه اللغات تتمتع بأعلى مستوى من التجريد وهي مصممة لاستخدامات وتطبيقات محدودة. على سبيل المثال تصنف لغة برولوغ Prolog على أنها لغة برمجة فائقة المستوى وهي لغة منطقية تعريفية declarative تستخدم بشكل أساسي في مجالات الذكاء الاصطناعي. ولا بد أنك سمعت بلا شك بروبوت ChatGPT المدعوم بالذكاء الاصطناعي والذي يعتمد على لغة GPT-3 الخاصة بـ OpenAI والذي يمكنك من التحدث إليه بلغتك كما تتحدث مع أي إنسان حقيقي ويفهمك ويجيبك على أي أسئلة برمجية أو غير برمجية وبطرق ولغات مختلفة، وهذا من شأنه أن يجعلنا ننتقل في مجال البرمجة لمستويات جديدة لم نعهدها من قبل في المستقبل القريب. تعتمد لغات البرمجة فائقة المستوى مثل برولوغ على تنفيذ الأوامر وحل المشكلات بناء على مجموعة القواعد Rules وعلى حقائق Facts أو قاعدة بيانات معروفة يمكننا الاعتماد عليها لاتخاذ القرارات المناسبة والحصول على إجابات لأسئلة غير معروفة ولا تحتاج هذه اللغة إلى ترجمة تعليماتها إلى لغة الآلة كما في حال اللغات العالية المستوى والمتوسطة المستوى. على سبيل المثال يمكنك كتابة برنامج باستخدام لغة برولوغ لاختبار ما إذا كانت X هي أخت شقيقة لـY من خلال كتابة قواعد الحل أو منطق الحل كالتالي: كي تكون X هي أخت Y يجب أن تكون أنثى ويكون لكل من X و Y نفس الوالدين ونضيف لها شرطًا وهو لا تكون قيمة X هي نفسها قيمة Y كل لا تكون أخت نفسها. Rules: sisterof(X, Y) :- female(X), parent(Z, X), parent(Z, Y), not(X = Y). بعدها ننشئ قاعدة بيانات تتضمن مجموعة من الحقائق مثل: male(Ali). male(Ahmad). female(Ola). female(Maryem). parents(Ali, Ola, Ahmad). parents(Maryem, Ola, Ahmad). الآن يمكننا أن نسأل البرنامج أسئلة مثل "هل علا أخت علي؟" سوف يجبنا بالنفي بناء على القواعد والحقائق التي يملكها. sisterof(Ali, Ola). الخاتمة بهذا نكون وصلنا لنهاية هذه المقالة التي تعرفنا فيها على مفهوم برمجي يستخدم كثيرًا في علوم الحاسوب وهي مستويات لغات البرمجة، وميزنا بين مفهوم اللغات عالية المستوى ومنخفضة المستوى ومتوسطة المستوى وبينا ميزاتها ومجالات استخدام كل منها وأهم الفروقات فيما بينها. وللمزيد من المعلومات حول لغات البرمجة وأهم أنواعها وتطبيقاتها يمكنك مطالعة مقال دليلك الشامل لتعلم البرمجة احصل على موقع إلكتروني مخصص لأعمالك أبهر زوارك بموقع احترافي ومميز بالاستعانة بأفضل خدمات تطوير وتحسين المواقع على خمسات أنشئ موقعك الآن اقرأ أيضًا تعلم البرمجة دليلك إلى أنواع لغات البرمجة أسهل لغات البرمجة برمجة الحاسوب للمبتدئين تعرف على أشهر لغات برمجة الألعاب
    1 نقطة
  17. لا يختلف اثنان على أهمية تعلم أساسيات البرمجة، فالبرمجة هي مهنة الحاضر والمستقبل، وهي تعتبر أحد المهارات الأساسية في عصرنا الذي بات يعتمد على التقانة في جميع جوانبه، فضلًا عن أن البرمجة قد أصبحت مادة أساسية في المناهج الدراسية في العديد من الدول بدءًا من المراحل الابتدائية. إذا اتخذت قررًا بتعلم أساسيات البرمجة من الصفر للاحتراف فهذا بلا شك قرار صائب، فالبرمجة توفر لك الكثير من فرص العمل، وتوسع مداركك، وتعزز تفكيرك النقدي، كما أنها تكسبك القدرة على حل المشكلات التي تواجهك بكفاءة أكبر، والأمر الجيد أن البرمجة تتميز عن غيرها من المجالات بكونها متاحة للجميع، ويمكنك تعلمها بشكل ذاتي بعيدًا عن أروقة الجامعات الطويلة. نشرح في مقال اليوم أساسيات البرمجة، ونستعرض أهم الأدوات التي تحتاجها كمبرمج، ونبين مفاهيم البرمجة الأساسية التي تشترك فيها معظم لغات البرمجة، وأهم المبادئ التي يمكنك اتباعها لتبرمج كالمحترفين. ما هي البرمجة؟ البرمجة باختصار هي إعطاء التعليمات لجهاز الحاسوب لينفذها باستخدام إحدى لغات البرمجة، ويتلقى الحاسوب هذه التعليمات ويترجمها ويفهمها وينفذها، ويُطلق على تسلسل التعليمات المكتوبة باستخدام لغة برمجة والتي تنجز مهمة محددة اسم برنامج. فنحن البشر نتواصل فيما بيننا بلغاتنا الطبيعية كالعربية أو الإنجليزية، أما الحاسوب فيحتاج لاستخدام لغة برمجة خاصة للتواصل معه، وعالم لغات البرمجة شامل ومنوع فهناك المئات من لغات البرمجة حاليًا، ونشير إلى أن لغة البرمجة هي لغة وسيطة بيننا وبين الحاسوب فحتى الحاسوب لا يفهم لغة البرمجة التي نكتبها بل تُحول كل لغة نكتبها إلى لغة يفهمها الحاسوب عبر أداة تحويل وتدعى اللغة التي يفهمها الحاسوب بلغة الآلة Machine Language التي تتكون من أصفار وواحدات. قبل أن تتعلم أساسيات البرمجة: حدد وجهتك قد تكون حددت لغة البرمجة التي تريد تعلمها وتبحث عن تعلم أساسيات هذه اللغة لذا وصلت إلى هنا، أو لم تحددها بعد، ولكن عمومًا تشترك كل لغات البرمجة بأساسيات واحدة إن تعلمتها سيسهل عليك التعامل مع أي لغة برمجة. قرار تعلم أساسيات البرمجة يشبه قرار الذهاب في إجازة، فأنت لن تذهب في إجازة دون أن تحدد الوجهة التي تريد الذهاب لها، وبناء على وجهتك تحدد مسارك الذي ستسلكه وتجهز مستلزماتك. وبالتالي السؤال الذي يجب أن تطرحه قبل أن تقرر تعلم أي لغة برمجة هو ما هو هدفي النهائي من تعلم البرمجة؟ وبناء على إجابتك تحدد مسار التعلم الصحيح واللغات والأدوات التي عليك تعلمها. ركز في البداية على لغة رئيسية واحدة تتعلم بها أساسيات البرمجة، ثم سيسهل عليك تعلم لغات أخرى حسب الضرورة، حيث الأساسيات والمفاهيم واحدة ولن تختلف من لغة إلى أخرى بل ما يختلف هو طريقة كتابة كل لغة والميزات التي توفرها للمبرمج، وبعبارة أخرى، الخطوة الصعبة هي الخطوة الأولى وهي خطوة تعلم أساسيات البرمجة. وتذكر أن تعلم البرمجة يحتاج لبعض الصبر والجهد، لا سيما عند تعلم إحدى لغات البرمجة لأول مرة كما أشرنا ويحتاج إلى تطبيق أيضًا لأن التعلم النظري شيء والتطبيق شيء آخر ففيه ستواجه الكثير من المشكلات وستتعلم بها حلها وتفاديها تدريجيًا حتى تكون مبرمجًا محترفًا. دورة علوم الحاسوب دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب اشترك الآن أهمية تعلم أساسيات البرمجة تعلم أساسيات البرمجة للمبتدئين يشبه إلى حد كبير تعلم قيادة السيارة، فعندما تجلس خلف مقود السيارة لأول مرة لن تكون قادرًا على القيادة بسلاسة على الفور، بالطبع! تذكَّر كيف تبدأ آنذاك باستكشاف أجزاء السيارة كالفرامل ودواسة البنزين وناقل الحركة، ثم التعرف على المفاهيم والمصطلحات الأساسية المرتبطة بالقيادة، وتلقي الكثير من التعليمات والملاحظات النظرية حول آلية القيادة أكثر من التركيز على القيادة بحد ذاتها. وبعدها تبدأ عملية التدريب على تنفيذ أوامر بسيطة مثل تشغيل السيارة وتحريكها رويدًا رويدًا في مكان مفتوح إلى أن تزداد التعليمات تعقيدًا وتصبح قادرًا على التحكم بالسيارة وقيادتها في كافة الظروف والطرق. بنفس الطريقة ستتعلم البرمجة، حيث عليك أن تتعلم بداية أساسيات البرمجة النظرية، ثم تكتب برامج باستخدام تعليمات بسيطة، ثم تتعلم كيف تكتب التعليمات بطريقة أكثر احترافية، ومع الممارسة والتطبيق ستتمكن من احتراف البرمجة وتطوير برامج متقدمة. وقد شرح مقال كيف تتعلم البرمجة: نصائح وأدوات لرحلتك في عالم البرمجة رحلة تعلم البرمجة بالتفصيل وقدم نصائح مهمة وأجاب على أسئلة شائعة حول تعلم البرمجة فارجع إليه للاستزدادة في هذا الموضوع. احصل على موقع إلكتروني مخصص لأعمالك أبهر زوارك بموقع احترافي ومميز بالاستعانة بأفضل خدمات تطوير وتحسين المواقع على خمسات أنشئ موقعك الآن أدوات مهمة لتعلم أساسيات البرمجة بعد أن تحدد اللغة التي ستتعلمها، تحتاج كخطوة أولى إلى إعداد بيئة التطوير لديك حتى تتمكن من كتابة شيفرة برمجية وتنفيذها كي تتواصل مع الحاسوب بتلك اللغة، والأدوات اللازمة لتعلم أساسيات البرمجة في البداية هي أداتين يحتاج إليهما كل مبرمج: محرر الشيفرة البرمجية أداة تحويل الشيفرة وتنفيذها محرر الشيفرة البرمجية تعتمد معظم لغات البرمجة على أوامر نصية، لذا ستحتاج إلى محرر أكواد لكتابتها، ومحرر الكود هو برنامج لتحرير النصوص مصمم خصيصًا لكتابة وتحرير الشيفرة المصدرية للبرامج، وتتميز بعض المحررات بأنها تتضمن ميزات تسهل كتابة الكود كتمييز الكلمات حسب بناء الجملة، ووضع مسافة بادئة لأسطر التعليمات البرمجية بشكل صحيح. ومن الأمثلة على محررات أكواد Notepad++‎ لنظام تشغيل ويندوز و gedit أو kate لنظام التشغيل لينكس. ملاحظة: بعض لغات البرمجة الموجهة للمبتدئين تعتمد على واجهات رسومية ولا تحتاج لمحررات نصية مثل لغة سكراتش والتي تدعى أحيانًا لغات برمجة رسومية، وللمزيد يمكنك الرجوع إلى مقال البرمجة باستخدام سكراتش. أداة تحويل الشيفرة وتنفيذها نكتب الكود المصدري عادة بلغة برمجة لا يفهمها جهاز الحاسوب مباشرة كما أشرنا، لذا يجب تثبيت برنامجًا يُحوِّل الشيفرة المصدرية للغة البرمجة بأكملها إلى لغة آلة Machine Code يفهمها الحاسوب ثم ينفذها، ويختلف هذا المُحول من لغة برمجة إلى أخرى ويُسمى إما مُصرِّف Compiler أو مُفسِّر Interpreter وبعض اللغات تحتاج إلى تصريف وآخر إلى تفسير وبعضها يحتاج إلى كلا العمليتين لتحويلها إلى لغة الآلة ثم تنفيذها. لتفهم الفرق بين المُصرِّف والمُفسِّر تخيل أن لديك وصفة مكتوبة باللغة التركية وأنت لا تعرف التركية وتريد أن تحضّرها. في هذه الحالة يمكن أن تطلب من أحدهم أن يترجم لك الوصفة بالكامل للغة العربية ويعطيها لك لتعدها متى ما أردت مستعينًا بهذه النسخة المترجمة Compiled، أو يمكنك أن تكلمه في كل مرة تريد فيها أن تحضر هذه الوصفة وتطلب منه أن يقرأها ويفسرها لك خطوة بخطوة Interpreted. بيئة التطوير المتكاملة IDE يمكنك أن تحصل على المحرر وأداة التحويل والتنفيذ على حدة وتثبتهما على جهازك، أو يمكنك بشكل بديل أن تعتمد على بيئة تطوير متكاملة IDE وهي اختصار العبارة Integrated Development Environment تتضمن كافة الأدوات اللازمة للتعامل مع لغة البرمجة. أمثلة على بيئات تطوير متكاملة: Microsoft Visual Studio NetBeans IntelliJ IDEA يمكنك في بيئة التطوير المتكاملة كتابة التعليمات البرمجية وتعديلها وتصحيحها وتحويلها ثم تنفيذها بسرعة وسهولة كل ذلك من مكان واحد، إذ توفر لك كافة الأدوات اللازمة لتكتب وتنفذ برامج بلغة معينة، كما توفر ميزات تساعدك في تطوير البرامج مثل تصحيح الأخطاء البرمجية، والإكمال التلقائي للتعليمات، وللتعرف أكثر على بيئة التطوير المتكاملة، يمكنك الرجوع إلى مقال مدخل إلى بيئة التطوير المتكاملة IDE. ملاحظة: يمكنك الاعتماد على مترجمات أو بيئات عمل برمجية متوفرة على الإنترنت، حيث توفر العديد من المنصات إمكانية كتابة وتنفيذ البرامج على متصفح الويب بدلًا من تثبيت وإعداد البرامج على الحاسوب المحلي. أساسيات البرمجة للمبتدئين تتنوع لغات البرمجة وتعدد استخداماتها إلا أنها تشترك في مجموعة من الأساسيات والمفاهيم، وتعلم هذه المفاهيم يمكّنك من التآلف من أي لغة برمجة، وإنجاز البرامج باستخدامها بمرونة أكبر، وأهم هذه الأساسيات: المتغيرات Variables الثوابت Constants أنواع البيانات Data types الكلمات المفتاحية Keywords التعليقات Comments بنى التحكم Control Structures الدوال Functions هياكل البيانات Data structure التكرار Iteration التعاود Recursion الكائنات Objects والأصناف Classes الوحدات Modules والمكتبات Libraries نشرح في الفقرات التالية كلًا من هذه الأساسيات البرمجية بمزيد من التفصيل، ونرفق بعض الأمثلة التوضيحية بلغات برمجة مختلفة. المتغيرات تستخدم المتغيرات Variables في البرمجة بشكل مشابه لاستخدامها في الرياضيات، فهي تخزن قيم البيانات من نوع محدد، ويمكن للمتغير احتواء قيمة واحدة في المرة الواحدة، فمتى ما وضعت فيه قيمة جديدة فإن القيمة السابقة المخزنة فيه سوف تحذف تلقائيًا. يمكن تشبيه المتغير بصندوق مفتوح في ذاكرة الحاسوب له اسم وعنوان خاص به، حيث يمكن إدخال القيم وإخراجها من هذا الصندوق حسب الطلب. وتسمى عملية وضع قيمة في المتغير بشكل مباشر الإدخال Input أو الإسناد Assignment أو أحيانًا الضبط Set، كما تسمى عملية الحصول على هذه القيمة وعرضها الإخراج Output أو الجلب Get. وتجدر الإشارة لأن بعض أنواع المتغيرات تكون محدودة الوصول، بمعنى أنها لا تسمح لك بالوصول المباشر لها سواء لتخزين البيانات ضمنها أو الحصول على القيم المخزنة فيها إلا عبر وسيط ويُسمى هذا الوسيط باسم ضابط setter وجالب getter على التوالي، والغرض من هذه العملية حماية المتغيرات من تعديلات غير مرغوبة كما سنوضح لاحقًا في فقرة الكائنات والأصناف التي أكثر ما تُستخدم فيها. لتعريف متغير في لغة البرمجة C++‎ عليك ذكر اسم المتغير ونوع البيانات التي تريد تخزينها في هذا المتغير وإسناد قيمة أولية فيه، على سبيل المثال لتعريف متغير باسم a لتخزين العدد الصحيح 10 بداخله نكتب ما يلي: int a = 10; كما يمكنك تعريف المتغير دون إسناد القيمة له في البداية وإسنادها لاحقًا بالشكل التالي: int a; a = 10; في حين لا تملك لغة بايثون أمرًا محددًا لتعريف المتغيرات، كل ما عليك هو كتابة اسم المتغير واستخدام علامة مساواة متبوعة بقيمة المتغير، وسوف تكتشف اللغة تلقائيًا نوع المتغير وحجم الذاكرة المناسب له كما يلي: a = 10 الثوابت تشير الثوابت Constants إلى قيمة أو كمية ثابتة لا نحتاج لأن نغيرها أو نعدلها أبدًا أثناء تنفيذ البرنامج، مثل سرعة الضوء، وعدد الدقائق في الساعة، والعدد Pi الذي يمثل نسبة محيط الدائرة إلى قطرها، وتسارع الجاذبية الأرضية، ومعدل نجاح الطالب وما إلى ذلك. فالثوابت البرمجية بمثابة صندوق تغلقه بإحكام بعد وضع قيمة فيه ولا يسمح لك بتغييرها في كود البرنامج، فبعد تحديد قيمة الثابت يسمح لك فقط بالوصول إلى قيمته، بخلاف المتغير الذي يمكنك الوصول إلى قيمته وإعادة تعيينها وتعديلها حسب حاجتك. لتعريف الثوابت في لغة C++‎ نستخدم الكلمة المفتاحية const ثم نكتب نوع البيانات واسم الثابت وقيمته كما يلي: const float PI = 3.14; const float GRAVITY = 9.8; const float SUCC_RATE = 0.5; في حين لا تميز بعض اللغات مثل لغة بايثون بين تعريف الثوابت والمتغيرات، حيث يمكنك تعريف الثوابت والتعامل معها كما تعرّف أي متغير، وتلتزم أنت بعدم تغيير قيمتها في سياق البرنامج، كما يمكنك التصريح الثوابت في ملف مختلف واستيرادها في برنامجك لتمييزها عن المتغيرات. PI = 3.14 GRAVITY = 9.8 ملاحظة: يشيع في أوساط المبرمجين تسمية الثوابت بحروف أجنبية كبيرة لتمييزها عن المتغيرات كما فعلنا في الأمثلة السابقة. أنواع البيانات أنواع البيانات Data types في لغات البرمجة هي عملية تحديد نوع وحجم القيمة التي يمكن أن تخزن في المتغير والتي يترتب عليها تحديد العمليات التي يمكن تطبيقها على هذه المتغير من طرف لغة البرمجة مثلًا السماح بتطبيق عملية الجمع والطرح على نوع الأعداد والسماح بعملية البحث والاستبدال على النصوص وهكذا. توفر لغات البرمجة العديد من أنواع البيانات مثل: الأعداد التي تنقسم إلى أعداد صحيحة integer numbers وأعداد عشرية floating point numbers، والمحارف Characters، والسلاسل النصية Strings، والقيم المنطقية Boolean …إلخ. على سبيل المثال في لغة البرمجة C++"‎" إذا كنت تحتاج في برنامجك إلى تخزين العمر، ستحتاج لمتغير من نوع بيانات عدد صحيح، ويمكنك تعريف هذا المتغير أو التصريح عنه باستعمال الكلمة المفتاحية int كما يلي: int age; فعندما استخدمنا الكلمة int هنا أخبرنا مترجم اللغة أن هذا المتغير مخصص لتخزين أعداد صحيحة فقط، ليحجز الحجم المناسب له في ذاكرة الحاسوب وينتظر منا إدخال قيم صحيحة فيه فقط، فإذا جربت تخزين نص أو عدد عشري فيه فستحصل على خطأ من أداة التحويل أثناء تحويل البرنامج إلى لغة الآلة وهذا ينطبق على الأمثلة الآتية أيضًا. وإذا احتجت لمتغير مخصص لتخزين قيمة عشرية مثل متوسط درجات الطالب، أو مساحة دائرة استخدم نوع البيانات float لهذا المتغير كما يلي: float avg; ولتعريف متغير مخصص لتخزين محارف مفردة يمكنك أن تستخدم نوع البيانات char كما يلي: char x; x = 'A'; أما لتخزين السلاسل النصية المكونة من عدة محارف فاستخدم نوع البيانات string كما يلي: string str = "This is a C++ string"; ولتخزين القيم المنطقية التي يمكنها أن تحتوي القيمة صواب true أو خطأ false والتي تفيد في اختبار الشروط، استخدم نوع البيانات bool كما يلي: bool con1 = false; bool con1 = true; إن التعامل مع أنواع البيانات أبسط في لغات أخرى مثل لغة بايثون، فأنت لا تحتاج لتحديد نوع بيانات للمتغير قبل استخدامه، لكون اللغة قادرة على استنباط وتعيين نوع بيانات المتغير تلقائيًا بمجرد أن تسند له قيمة ما، فبحسب نوع القيمة التي تسندها تحدد اللغة نوع البيانات المناسب له. إليك بعض الأمثلة على تعريف متغيرات من أنواع بيانات مختلفة في بايثون: v1 = "This is a Python string" #string v2 = 10 #int v3 = 10.33 #float v4 = True #bool لمزيد من المعلومات حول أنواع البيانات في لغات البرمجة، اطلع على مقال دليلك الشامل إلى أنواع البيانات. الكلمات المفتاحية تتضمن أي لغة برمجة مجموعة من الكلمات المفتاحية Keywords أو الكلمات المحجوزة Reserved Words، وهذه الكلمات لها معنى خاص ولا يمكن للمبرمج استخدامها لتعريف المتغيرات مثلًا. ولعلك انتبهت إلى قولنا كلمة مفتاحية على const وعلى int في الأمثلة السابقة في لغة C++‎ التي كانت كلمات محجوزة مخصصة لتعريف الثوابت البرمجية وأنواع البيانات، كما تعد الكلمتان True و False محجوزتين في بايثون لتمثيل القيمتين المنطقيتين صواب وخطأ على التوالي وقس على ذلك في أي لغة برمجة. وعليك أن تطلع على الكلمات المفتاحية ودلالة كل كلمة وطريقة استخدامها في اللغة التي تريد تعلمها ويكون عادة عددها محدود وبسيطة وقد تتكون من كلمة إنجليزية واضحة أو اختصار لها مثل الاختصار const لكلمة constants ثابت والاختصار init لكلمة integer عدد صحيح ومعرفة مما يتشكل الاختصار يُسهل عليك حفظ الكلمة خصوصًا وبما أن عددها محدود وبسيطة فلا تخف إن كانت لغتك الإنجليزية ضعيفة. التعليقات تعد التعليقات Comments من أساسيات البرمجة، والتعليقات هي عبارة عن نصوص وصفية تضاف للكود البرمجي لتسهيل فهمه وقراءته ويمكن أن تكون بأي لغة مثل اللغة العربية، وهي لا تنفذ في البرنامج حيث أن مترجم اللغة يتجاهلها ويعتبرها فراغات، لكنها مفيدة للمبرمج نفسه ليتذكر ما كتبه عند العودة للبرنامج لاحقًا، كما أنها تساعد أي شخص يقرأ الكود الذي كتبه المبرمج في فهم سير عمل البرنامج والهدف من كتابة تعليمات معينة فيه. تستخدم لغات البرمجة المختلفة أساليب مختلفة لكتابة التعليقات تنحصر عادة بالرموز الثلاثة # أو // أو /* */، على سبيل المثال في لغة C++‎ يمكنك كتابة التعليقات على سطر واحد بعد الرمز // وكتابة التعليقات متعددة الأسطر بين الرمزين /* */ كما يلي: /* هذا تعليق مكون من عدة أسطر */ //هذا تعليق مكون من سطر واحد أما في لغة بايثون فيمكنك كتابة التعليق أحادي السطر بعد الرمز # وكتابة التعليقات متعددة الأسطر بعد علامتي اقتباس أو ثلاث علامات اقتباس مفردة كما يلي: ''' هذا تعليق مكون من عدة أسطر ''' #هذا تعليق مكون من سطر واحد بنى التحكم تنفذ البرامج عادة بشكل متتابع من بداية الشيفرة إلى نهايتها تعليمة تلو الأخرى، لكن قد تحتاج في بعض الحالات لتغيير مسار التنفيذ وتجاوز بعض التعليمات أو تكرارها، وهنا يأتي دور بنى التحكم Control Structures التي تعتبر من أساسيات البرمجة لكونها تفيد المبرمجين في تحديد الاتجاه أو المسار الذي يجب الانتقال له بناء على عوامل معينة. بالعودة إلى مثال تعلم القيادة الذي ذكرناه بداية، تخيل أنك تسير في طريقك نحو مقر عملك، وصادفت إشارة حمراء أو اعترضتك سيارة إسعاف، ألن تحتاج عندها للتوقف لحين عودة الإشارة إلى اللون الأخضر أو التنحي لجانب الطريق لحين مرور الإسعاف ثم تتابع طريقك المعتاد. بنفس الطريقة تعمل بنى التحكم في الكود البرمجي، فهي تسمح للمبرمج بالتحكم في تدفق تنفيذ البرامج وفق حالات معينة، ومن أهم بنى التحكم البنى الشرطية if statement والبنى التكرارية loop statement. البنى الشرطية أما البنى الشرطية فتمكنك من اختبار شروط محددة قبل تنفيذ الكود البرمجي وتقوم بتنفيذه فقط عند تحقق هذه الشروط، مثلًا إذا كان لديك تعليمات برمجية تتضمن عملية قسمة، يمكنك اشتراط عدم تنفيذ هذه التعليمات عند محاولة القسمة على صفر. على سبيل المثال يقوم البرنامج التالي بلغة C++‎ بقسمة عددين عشريين ويختبر شرط القسمة على صفر: #include <iostream> using namespace std; int main() { float num1, num2, result; num1=18; num2=0; if (num2 == 0) { cout << "خطأ رياضي أنت تحاول القسمة على صفر"<<endl; } else { result=num1/num2; cout << "The result is "<< result << endl; } return 0; } تختبر التعليمة الشرطية if في الكود أعلاه إن كان المقسوم عليه num2 مساويًا للصفر (الذي يمكن أن يأتي من مواضع مختلفة مثل الطلب من المستخدم تزويدنا بقيمته)، وفي هذه الحالة تعرض العبارة "خطأ رياضي أنت تحاول القسمة على صفر" ولا تنفذ عملية القسمة num1/num2. الكود التالي كود مكافئ للكود السابق لكنه مكتوب بلغة بايثون: num1 = 18 num2 = 3 if num2 == 0: print("خطأ رياضي أنت تحاول القسمة على صفر") else: result = num1/num2 print(result) الأمثلة أعلاه كانت لشروط بسيطة، وستجد في لغات البرمجة أنواعًا عديدة من التعليمات الشرطية مثل if-else التي تمكنك من اختبار الشرط وعكسه، وتعليمة if المتداخلة التي تتضمن شرطًا فرعيًا داخل شرط رئيسي، وتعليمة switch التي تختبر شروط معتمدة على قيمة واحدة. كما ستتمكن من اختبار شروط مركبة من خلال المعاملات المنطقية مثل and و or و not. البنى التكرارية وأما البنى التكرارية أو حلقات التكرار فتمكنك من تكرار تنفيذ تعليمات معينة لعدد محدد أو مشروط من المرات، وتوفر على المبرمجين الكثير من الوقت في كتابة الكود. ستجد في أي لغة برمجة أنواعًا مختلفة من الحلقات مثل حلقات for التي تستخدم عندما تعرف عدد المرات التي تريد فيها تكرار التعليمات قبل التوقف، وحلقات while أو repeat التي تتشابه مع حلقات for لكنها تكرر مجموعة من التعليمات بعدد غير محدد من المرات يعتمد على استيفاء شرط معين. على سبيل المثال، إذا طلب منك أن تكتب برنامج لعرض ناتج ضرب العدد 5 بالأعداد من 1 إلى 10 فلا حاجة لأن تضرب العدد 5 في العدد 1 ثم في العدد 2 وهكذا وصولًا للعدد 10، يمكنك ببساطة كتابة حلقة تكرارية for كما في المثالين التاليين: حلقة for بلغة C++‎: int num=5; for (int i = 1; i < 11 ;i++) cout << num <<"X" << i << "="<< num*i << "\n"; حلقة for بلغة بايثون: num = 5 for i in range(1, 10): print(num, 'x', i, '=', num*i) الدوال الدوال Functions هي أجزاء مستقلة من الكود البرمجي لها اسم خاص بها وتشبه المصنع في عملها فتأخذ ممن يستخدمها دخلًا (إن وُجد) ثم تجري عمليات معالجة وتعيد إليه الناتج، ويدعى ما يُمرَّر إليها باسم المعاملات Parameters. تُكتب الدالة أو تعرّف مرة واحدة وتصبح بعدها قابلة لإعادة الاستخدام، حيث يمكن للمبرمج استدعاء أو مناداة الدالة في أي موضع في البرنامج مع تمرير قيم بيانات لها أو بدون، على سبيل المثال في حال أردت كتابة كود برمجي يعرض ناتج الضرب لعدد ما في الأعداد من 1 إلى 10 يمكنك تحويل الكود إلى دالة باسم displayMul وسيطها هو العدد المراد ضربه كما يلي: #include <iostream> using namespace std; // تعريف دالة لحساب نانج ضرب أي عدد في الأعداد من واحد لعشرة void displayMul(int num){ for (int i = 1; i < 11 ;i++) cout << num <<"X" << i << "="<< num*i << "\n"; } //استدعاء الدالة في البرنامج الرئيسي int main() { int num1 = 5; displayMul(num1); int num2 = 9; displayMul(num2); return 0; } عرفنا الدالة displayMul في المثال السابق بلغة C++‎ بكتابة نوع البيانات الذي تعيده الدالة وهو void أي لا شيء لأن الدالة تطبع القيمة ولا تعيد شيئًا، ثم اسمها ثم المعاملات الخاصة بها بين قوسين ()، ثم كتبنا التعليمات التي تقوم بها بين قوسين { }، ولاحظ أن الدالة لا تعيد شيئًا فلا يُشترط أن تأخذ أو تعيد شيئًا بل المهم أن تُنفِّذ عمليةً ما منوطة بها عند استدعائها. إليك أيضًا تعريف الدالة displayMul السابقة نفسها ولكن بلغة بايثون: def displayMul(num): for i in range(1, 10): print(num, 'x', i, '=', num*i) num = 5 displayMul(num) displayMul(9) ملاحظة: لا يمكنك استدعاء أو مناداة دالة في برنامجك إذا لم تقم بتعريفها أولًا، لأنك تحاول استخدام شيء غير موجود، لكن بعض الدوال تكون مضمنة ومعرفة مسبقًا في اللغة Built-in functions، ويمكنك استخدام هذه الدوال فورًا دون الحاجة لتعريفها بنفسك، على سبيل المثال الدالة "getline()‎"هي دالة جاهزة معرفة في لغة C++‎ تستخدم لإدخال السلاسل النصية من لوحة المفاتيح، والدالة print()‎ هي دالة جاهزة في لغة بايثون تستخدم لطباعة قيم المتغيرات على الشاشة. هياكل البيانات هياكل البيانات Data Structures هي بنى برمجية مصممة لتضم مجموعة من البيانات أو المتغيرات، وقد تكون هياكل أولية كالأعداد الصحيحة والأعداد العشرية والمحارف كما شرحنا في أنواع البيانات، أو هياكل مركبة يمكن تشبيهها بمجموعة صناديق متلاصقة في ذاكرة الحاسوب باستطاعتها تخزين عناصر أو متغيرات متعددة من نفس نوع البيانات ويمكن لبعض هياكل البيانات أن تتضمن مزيجًا من أنواع بيانات مختلفة. فالمصفوفة Array، والقاموس Dictionary والكائن Object وغيرها أحد أنواع هياكل البيانات الشهيرة، على سبيل المثال يمكنك استخدام المصفوفات عندما تحتاج إلى تخزين مجموعة مكونة من عدة قيم لها نفس النوع في متغير واحد بدلًا من تخزين كل قيمة في متغير منفصل، ويمكنك بعدها تحديد أي عنصر من العناصر الموجودة في المصفوفة والوصول له من خلال موقعه أو فهرسه داخل هذه المصفوفة، وإليك مثال على تعريف مصفوفة لتخزين 5 أعداد صحيحة: في لغة C++‎: int marks[5] = {50,99,78,66,59}; في لغة بايثون: marks=[50,99,78,66,59] ملاحظة: قد تختلف أسماء هياكل البيانات من لغة برمجة إلى أخرى ففي لغة بايثون لا يُطلق عليها اسم مصفوفة array كما في لغة C++‎ بل اسم قائمة list حيث تختلف التسميات والمعنى واحد. هنالك العديد من هياكل البيانات التي لا يتسع المقال الحالي لذكرها، لذا ارجع إلى مقال هياكل البيانات لمزيد من التفاصيل. التكرار يعتبر مفهوم التكرار Iteration أحد أهم مفاهيم أساسيات البرمجة، وستحتاج له لاسيما عند التعامل مع هياكل بيانات مركبة في شيفراتك البرمجية مثل المصفوفات، فالتكرار يعني المرور على كل عنصر من عناصر البيانات المركبة على حدة وعلى التوالي لتنفيذ عملية أو مهام محددة عليه، وستجد أن التكرار صفة أيضًا تُسمى iterable تُطلق على أي متغير أو نوع بيانات يمكن المرور عليه وستراها غالبًا في التوثيقات. يمكنك تنفيذ التكرار في لغات البرمجة بطرق مختلفة، لكنه يعتمد بشكل أساسي على استخدام الحلقات التكرارية بأنواعها المختلفة، كما توفر بعض اللغات مكررات Iterators وهي عبارة عن دوال أو عمليات مخصصة تمكنك من المرور على جميع عناصر هياكل البيانات بطريقة منهجية وسهلة. على سبيل المثال للمرور عبر عناصر المصفوفة marks التي عرفناها في الفقرة السابقة وطباعتها في لغة C++‎ يمكن أن نكتب حلقة for مع استخدام متغير i يمثل تعدادًا نستخدمه كفهرس للوصول إلى كل عنصر من عناصر المصفوفة كما يلي: #include <iostream> using namespace std; int main () { int marks[5] = {50,99,78,66,59}; cout << "The marks are:"; for (int i = 0; i < 5; ++i) { cout << marks[i] << " "; } } أما في لغة بايثون يمكنك المرور عبر عناصر المصفوفة وطباعتها كما يلي: marks=[50,99,78,66,59] for m in marks: print(m) التعاود يعتبر التعاود Recursion أحد المفاهيم البرمجية الأساسية، وهو يعتمد على تقسيم المشكلات البرمجية إلى مشكلات أصغر يمكن حلها بسهولة، ويرتبط هذا المفهوم بالدوال البرمجية، حيث أن الدالة التي تكرر استدعاء نفسها حتى تصل لحالة حدية أو أساسية Base case تجعلها تتوقف عن عملية استدعاء نفسها وتعيد نتيجة معروفة عند هذه القيمة تعرف باسم الدالة التعاودية Recursive Function، وإذا لم تكن هناك حالة حدية تصل لها الدالة فهذا يعني أن الدالة ستكرر استدعاء نفسها إلى مالا نهاية. هذا الأسلوب البرمجي يصلح لحل المسائل التي تملك نمطًا هرميًا والتي يمكن حلها بسهولة عن طريق تحويلها لمسائل فرعية مشابهة أصغر. لكن في حال كان بإمكانك حل مسألة معينة عن طريق الحلقات التكرارية بسهولة فلا توجد ضرورة لاستخدام أسلوب التعاود في هذه الحالة، ولا تقلق إن لم تفهم شيئًا فقد أضفنا مثالًا مع مخطط يوضح لك المفهوم تاليًا. على سبيل المثال مسألة حساب عاملي أو مضروب عدد ما "n!‎" هي أشهر مسألة تعاودية بطبيعتها، فكما تعرف مضروب العدد 0 هو قيمة معروفة تساوي 1، وبالتالي يمكن اعتبار n=0 هو الحالة الحدية التي يمكن من خلالها حل مسألة المضروب لأي عدد بناء على القاعدة التالية: n! = n * (n - 1) عندما تبلغ قيمة العدد n=0 فسوف يعيد القيمة 1 للدالة وينتهي الاستدعاء المتكرر أو التعاودي لها. إليك مثال على إيجاد مضروب أو عاملي العدد n: بلغة C++‎: #include <iostream> using namespace std; int factorial(int n) { if (n < 0) { return 0; } else if (n == 0) { return 1; } else { return factorial(n - 1) * n; } } // استدعاء الدالة في البرنامج الرئيسي int main() { cout<< factorial(4); } بلغة بايثون: def factorial(n): if n < 0: return 0 elif n == 1: return 1 else: return n * factorial(n-1) print (factorial(4)) المخطط التالي يوضح طريقة استدعاء الدالة التعاودية وإعادتها للقيمة عند وصولها للحالة الحدية لا تقلق مرة أخرى إن لم تفهمه فهو من المفاهيم المعقدة والمرعبة للمبرمجين المبتدئين، وستفهمه تدريجيًا ولا يمكن أن يتضح بالكامل إلا إن طبقته وحتى رسمته على ورقة أو مخطط كما المخطط السابق. الكائنات والأصناف تعتبر الكائنات Objects والأصناف Classes أحد أساسيات البرمجة كائنية التوجه "OOP" حيث أن الكائنات تعتبر وحدات تتضمن مجموعة من المتغيرات ومجموعة الدوال البرمجية. والصنف Class هو بمثابة نموذج أو مخطط عام لتمثيل الكائنات، يمكن تعريفه واستخدامه لاشتقاق العديد من الأمثلة أو الحالات المختلفة من هذه الكائنات، ولهذا السبب يسمى الكائن نسخة من الصنف "instance". لنأخذ مثالًا من الواقع، يمكنك تعريف صنف يسمى Car لتمثيل السيارة، سيكون لهذه السيارة خصائص مختلفة تميزها كاللون والنوع والطراز وسنة التصنيع والسعر …إلخ. كما سيكون لها أفعال أو سلوكيات تقوم بها كفعل التشغيل وزيادة السرعة وتغيير الاتجاه والتوقف …إلخ. لذا نعرف صنفًا خاصًا يمثل السيارة ونشتق منه نسخ لسيارات مختلفة. برمجيًا يعرف الصنف بداخله متغيرات ودوال، وتحدد المتغيرات الخاصة بالصنف مميزات هذا الصنف بينما تحدد دوال الصنف "class functions" ما الذي يمكن للكائنات القيام به كما يحوي الصنف على دوال خاصة منها دالة تُدعى الدالة البانية "constructor" التي تُستدعى تلقائيًا عند إنشاء واستنساخ كائن من الصنف المُعرَّف ويمكن عبرها تمرير قيم تضبط الكائن الجديد الناتج مثلًا تضبط متغيراته وإليك مثال لتوضيح ذلك. على سبيل المثال، يمكن تعريف صنف يمثل هيكل دائرة، سنعرف لهذا الصنف متغير خاص به أو خاصية تمثل قيمة نصف قطر الدائرة، ودالة بناء تضبط قيمة نصف القطر أثناء إنشاء كل دائرة، ودالة لحساب مساحة الدائرة، ودالة أخرى لحساب محيط الدائرة يمكن استدعاءهما بعد إنشاء كل كائن من الصنف دائرة. المثال التالي يعرف صنف يمثل دائرة بلغة البرمجة C++‎ ويشتق نسختين أو كائنين مختلفين من هذا الصنف لكل كائن نصف قطر مختلف: #include<iostream> using namespace std; class Circle { const float PI = 3.14; // data members float radius; public: // contractor Circle(float radius) { this->radius = radius; } // member function float Area() { return radius*radius*PI; } float Perimeter() { return 2*radius*PI; } }; int main() { Circle circle1(3); cout << circle1.Area() << endl; cout << circle1.Perimeter() << endl; Circle circle2(4); cout << circle2.Area() << endl; cout << circle2.Perimeter() << endl; return 0; } والمثال المكافئ التالي بلغة بايثون يعرف صنف دائرة ويشتق كائنين منه: #تعريف صنف يمثل دائرة class Circle(): def __init__(self, radius): self.radius = radius def get_area(self): return (self.radius ** 2) * pi def get_perimeter(self): return self.radius * 2 * pi # إنشاء كائنات من الصنف Circle pi = 3.14 circle1 = Circle(3) print(circle1.get_area()) print(circle1.get_perimeter()) circle2 = Circle(4) print(circle2.get_area()) print(circle2.get_perimeter()) لا تقلق إن لم تفهم شيئًا مما سبق فمهوم الأصناف والكائنات مفهوم دسم معقد على المبتدئين، ولكن حاول إعادة قراءة الفقرة وتطبيق الأمثلة أو يمكنك تخطيه ببساطة فالمهم أنك تعرفت على المفهوم، أما إن أردت المزيد من التفاصيل، فارجع إلى مقال البرمجة كائنية التوجه من سلسلة تعلم البرمجة. الوحدات والمكتبات لعلك لاحظت عبارات تبدأ بالكلمة using أو include أو import في الأمثلة البرمجية السابقة وتساءلت عن أهمية وجودها! هذه العبارات ليست سوى أمثلة على استخدام وحدات ومكتبات جاهزة مختلفة في لغات البرمجة. تعتبر الوحدات Modules والمكتبات Libraries أحد مفاهيم أساسيات البرمجة التي من الضروري أن تعيها جيدًا، والهدف الأساسي من وجودها تسهيل كتابة التعليمات البرمجية وتمكين المبرمج من إعادة استخدامها دون الحاجة إلى كتابة التعليمات البرمجية الخاصة بها في الكود من جديد. فالمكتبات والوحدات توفر على المبرمجين إعادة اختراع العجلة وتمكنهم من التركيز على حل المشكلة بسهولة ومرونة أكبر. توفر كل لغة برمجة العديد من المكتبات التي تضم مجموعة من الدوال والأصناف والوحدات التي يمكنك استخدامها مرارًا وتكرارًا في التعليمات البرمجية الخاصة بك لأداء مجموعة من الوظائف المفيدة دون الحاجة لإنشائها من البداية، كما يمكنك تعريف الوحدات الخاصة بك. هناك العديد من الوحدات المضمنة في لغة بايثون مثلًا والتي يمكنك استيرادها بكتابة التعليمة import ولنضرب مثلًا باستيراد الوحدة math للاستفادة من الدوال الرياضية التي توفرها بالشكل التالي: import math print (math.sqrt(25)) print (math.pi) print (math.degrees(2)) print (math.radians(90)) print (math.sin(2)) print (math.cos(0.5)) إلى هنا نكون قد انتهينا من شرح أساسيات البرمجة للمبتدئين والتي تناولنا فيها أهم المفاهيم التي ستتعرف عليها بالتفصيل في أي لغة برمجية تنوي تعلمها قبل أن تتمكن من تطوير برامجك وتطبيقاتك بهذه اللغة. ونختم مقالنا بأهم النصائح والتوصيات التي تساعدك على تعلم هذه الأساسيات. 10 نصائح لتعلم أساسيات البرمجة إليك مجموعة نصائح سريعة تساعدك في رحلة تعلم البرمجة: حدد هدفك من تعلم البرمجة، ثم تعلم ما يلزمك من تقنيات لتحققه. لا تشتت نفسك بكثرة اللغات والتنقل بينها وركز على المفاهيم وطبقها بلغة واحدة بإتقان وتركيز. ضع خطة للتعلم والتزم بها دون تسويف. لا تضيع وقتك في البحث عن أفضل المصادر التعليمية والتنقل بينها بل اختر واحدًا فقط والتزم به للنهاية. طور مهارات البحث الفعال فهذا سيوفر عليك وقتًا كبيرًا ويساعدك في إيجاد حلول لمشاكلك البرمجية. رافق المجدين ومن يشاركونك الهدف والاهتمام نفسه فإن الصاحب ساحب كما يُقال. لا تتوقف عن التعلم وطور نفسك باستمرار. تحلَّ بالصبر والأناة فإن العلم بالتعلّم والحلم بالتحلّم. تقبل الفشل والخطأ فالفشل هو وسيلة للنجاح. طبق ثم طبق ثم طبق ما تتعلمه. الخلاصة تطرقنا في مقال اليوم لشرح أساسيات البرمجة للمبتدئين وتعرفنا على أهم المفاهيم البرمجية التي ستصادفك عند تعلم أي لغة من لغات البرمجة وذكرنا في الختام أهم الأسس والنصائح التي تساعد أي مبرمج لتعلم أساسيات البرمجة من الصفر حتى الاحتراف. قد لا تتمكن من هضم جميع المفاهيم مرة واحدة خصوصًا إن كنت مبتدئًا، لذا ارجع للمقال مرة ومرتين حتى تتأكد من استيعابك لتلك المفاهيم وضعه ضمن قائمتك المفضلة وطبق الأمثلة بلغة البرمجة التي تتعلمها أو تريد تعلمها. وإذا كان لديك أي تساؤلات حول أي شيء مر معك في المقال أو كنت قد بدأت فعلا بتعلم إحدى لغات البرمجة ولديك نصائح مفيدة تود أن توجهها للمبتدئين في تعلم البرمجة، نرحب بأن تشاركنا بها في التعليقات أسفل المقال. اقرأ أيضًا أسهل لغات البرمجة البرمجة كائنية التوجه دليلك الشامل إلى: برمجة التطبيقات فوائد تعلم البرمجة
    1 نقطة
  18. لكل مهنة قواعد تنظمها وتضمن إنجاز الأعمال فيها بأفضل صورة ممكنة، ومهنة البرمجة ليست استثناء! حيث تعد قواعد البرمجة من الأمور التي ينبغي على أي مبرمج تعلمها، والحرص على اتباعها عند تطوير البرامج والتطبيقات المختلفة. نضعك في مقال اليوم على بداية الطريق، ونعرفك على أهم قواعد البرمجة، ونوضح لك أهمية استخدامها وكيف يمكنك تحقيقها، وبالتدريب والممارسة ستتمكن من اتباعها عندما تطور برامجك وتطبيقاتك. ما هي قواعد البرمجة؟ قواعد البرمجة هي مجموعة من التوصيات والإرشادات التي ينبغي للمبرمجين اتباعها والالتزام بها عند استخدام أي لغة من لغات البرمجة للحصول على كود برمجي عالي الجودة وسهل الصيانة. يضمن لك تطبيق قواعد البرمجة إنتاج برامج مفهومة وواضحة وسهلة القراءة والتعديل، وهو أمر مهم لأي مبرمج لاسيما عندما يعمل ضمن فريق عمل ويتشارك مع عدة مبرمجين أو مطورين على تطوير نفس المشروع. لاشك أن تطبيق قواعد البرمجة ليس بالأمر السهل ولن يتحقق بسرعة، فتطبيق القواعد يأتي في مرحلة لاحقة، فبعد أن تتمكن من أساسيات البرمجة، وتتدرب على طريقة التفكير البرمجي، وحل المشكلات، عليك أن تتقدم خطوة للأمام وتتعلم كيف تحسن من برامجك من خلال تطبيق القواعد البرمجية عليها. سنعرض الآن عددًا من أهم قواعد البرمجة فكن جاهزًا! أهم قواعد البرمجة إليك أهم ثمان قواعد أساسية ينبغي عليك اتباعها لتبرمج كالمحترفين: اتبع القواعد العرفية للغة التي تبرمج بها وثق الكود الذي تكتبه حافظ على البساطة KISS لا تكرر نفسك DRY ادمج الأجزاء الصغيرة لإنجاز الأعمال الكبيرة لا تبرمج ما لا تحتاجه افصل الأكواد في أجزاء مستقلة اكتب أكوادًا نظيفة نشرح في الفقرات التالية كل قاعدة من قواعد البرمجة هذه بمزيد من التفصيل ونوضح أهميتها وكيفية تطبيقها عند تطوير البرامج والتطبيقات. اتبع القواعد العرفية للغة التي تبرمج بها لكل لغة من لغات البرمجة قواعد كتابة خاصة بها تعرف باسم صياغة، واتباع هذه القواعد عند كتابة الكود البرمجي ليس خيارًا للمبرمج، لأن الكود البرمجي لن يعمل بشكل صحيح إذا لم يكن مكتوبًا وفق هذه القواعد. فليس المقصود هنا صياغة اللغة وقواعدها، ولكن ما أقصده هو مراعاة اصطلاحات اللغة المتعارف عليها أو ما يسمى في أوساط المبرمجين باسم "العرف" Conventions، فلكل لغة قواعد اصطلاحية متعارف عليها بين مبرمجي تلك اللغة، مثل ضرورة كتابة كل تعليمة على سطر جديد، ومراعاة قواعد التباعد، وأماكن وضع الأقواس مثل () و {} ضمن البرنامج، ووضع المسافات البادئة في كل سطر، وقواعد تسمية المتغيرات والدوال والأصناف …إلخ. هذه الأمور تتغير من لغة إلى لغة وليس لها معيار موحد، لذا عليك التعرف على اصطلاحات اللغة التي تبرمج بها وتحرص على اتباعها، فإن انتقلنا مثلًا إلى لغة جافاسكربت، فيعرض مقال نمط كتابة شيفرة جافاسكربت هذا الموضوع بالتفصيل ويتحدث عن العرف المتبع بين مبرمجي لغة جافاسكربت كما يشير أخيرًا في فقرة "شروحات لأنماط كتابة الشيفرة" أشهر المعايير والأعراف العالمية للغة جافاسكربت منها أسلوب Google وأسلوب Airbnb والأسلوب المعياري الرسمي وغيرها، فلا حاجة لكل فريق أي يخترع عرفًا ومعيارًا يسير عليه بل يقتدي بعرف شهير شائع منظم موجود مسبقًا. أضرب مثلًا عن أسلوب Airbnb في تعريف المتغيرات في لغة جافاسكربت بالشكل التالي: // سيء const items = getItems(), goSportsTeam = true; // جيد const items = getItems(); const goSportsTeam = true; لاحظ أن تعريف متغير واحد في كل سطر هو الأسلوب المتبع ويجب تجنب تعريف عدة متغيرات في سطر واحد رغم أنه لا فرق في التنفيذ بينهما. أتريد مثلًا آخر؟ خذ هذا المثال أيضًا من أسلوب PEP8 في لغة بايثون: # Line Break with Binary Operator # سيء income = (gross_wages + taxable_interest - student_loan_interest) # جيد income = (gross_wages + taxable_interest - student_loan_interest) # Imports # سيء import sys, os # جيد import os import sys قد تجد أن الاختلاف بسيط أحيانًا بين العُرف الجيد المتبع وبين الأسلوب السيء في كتابة الشيفرة وهذا صحيح، ولكن تذكر أن الشيفرة لا تُكتب مرة واحدة فقط ولن يعمل عليها شخص واحد فقط، بل ستُعدل مرارًا وتكرارًا ويمر عليها عشرات المبرمجين فإن اتبع كل مبرمج أسلوبه الخاص فُقد التنظيم وسادت العشوائية وأصبحت الشيفرة عرضة للخطأ عند تعديلها. وتذكر دومًا أن العُرف هذا يضعه مبرمجون أصحاب خبرة بعشرات السنوات يحاولون به نقل خبرتهم أفضل طريقة لكتابة شيفرة متسقة سهلة القراءة والتعديل وأقل عرضة للأخطاء. دورة علوم الحاسوب دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب اشترك الآن وثق الكود الذي تكتبه هذه القاعدة على بساطتها مفيدة للغاية، فمن الضروري أن تعتاد على كتابة تعليقات توضيحية في الأكواد التي تكتبها لتوثيق عملك، وتشرح ما الذي تقوم به، وتوضح وظائف الدوال والأصناف والمكتبات المختلفة. التعليقات أمر مهم لكل مبرمج، فهي من جهة تساعده على فهم ما كتبه عند العودة له لاحقًا لأن المبرمج سينسى الكثير مما كتبته ولماذا كتبته بعد مرور فترة من الزمن، كما أن التعليقات تفيد أي مبرمج آخر يقرأ الكود في فهمه بسرعة في حال احتاج إلى تطويره أو التعديل عليه. ومن الضروري أن تتعلم أفضل ممارسات كتابة التعليقات على الكود الخاص بك، وتعرف متى وأين يتوجب عليك كتابة التعليقات ومتى لا يلزمك ذلك. اكتب التعليقات عندما تحتاج لوصف أي ميزة غير واضحة في التعليمات البرمجية، وفي أي موضع ترى أنه يتطلب المزيد من الشرح والتوضيح للآخرين، أما عندما يكون الهدف من الكود واضحًا ومفهومًا فيمكنك الاستغناء عن كتابتها. باختصار التعليقات تساعد المبرمجين على فهم المشكلات التي كنت تحاول حلها في تعليماتك البرمجية دون الحاجة لبذل كثير من الجهد لفهم واستنباط ما كتبته ولكن الأفضل من كتابة التعليقات أن تكتب شيفرة مفهومة بدون تعليقات وهذه هي القاعدة دومًا. حافظ على البساطة KISS قاعدة KISS هي اختصار لعبارة "Keep It Simple, Sweetie" التي تعني أبقها بسيطة يا عزيزي! أو أبقِ أكوادك بسيطة ومباشرة، وهذه القاعدة تطبق عند تصميم كافة الأنظمة البرمجية فقد تبين أن هذه الأنظمة تعمل بشكل أفضل إذا كانت بسيطة وخالية من التعقيد. فإذا كنت تستطيع أن تحل مشكلة ما بعشرة أسطر من الكود البرمجي لا داعي لأن تكتب خمسين سطرًا لحلها، وإذا كنت تحتاج لبرمجة نموذج ما يحتوي 10 حقول، فلا تضع فيه 20 حقلًا من البيانات التي لن تقدم أي فائدة في سير عمل برنامجك. الخلاصة، إذا كنت تطور أحد البرامج وكنت تستطيع تجنب التعقيد في كتابة الكود، فتجنبه قدر الإمكان، واحرص على إبقاء الأكواد البرمجية التي تكتبها فيه بسيطة، وتلبي المتطلبات قدر المستطاع. لا تكرر نفسك DRY من قواعد البرمجة الهامة قاعدة DRY وهي اختصار للعبارة "Don't Repeat Yourself" التي تعني لا تكرر نفسك، والتي تؤكد على المبرمج أن لا يكرر كتابة نفس الكود البرمجي مرارًا وتكرارًا، وينبغي عليه عند وجود هذه الحالة أن يتخلص من هذا التكرار بطريقة ما. لا مشكلة من تكرار نفس الكود مرة واحدة، ولكن عندما تستخدم نفس الكود عدة مرات في مواضع مختلفة من برنامجك فعليك أن تفكر في تعديله، وتجد طريقة ذكية لكتابة الكود مرة واحدة وإعادة استخدامه كلما احتجت له لتكون مطبقًا لهذه القاعدة. من المنهجيات البرمجية التي تساعدك على تقليل الكود البرمجي المكرر وجعل برامجك سهلة القراءة والصيانة هي استخدام الحلقات التكرارية التي تجنبك تكرار نفس التعليمات البرمجية وتجعل الكود البرمجي أقصر، وأيضًا استخدام الدوال والإجراءات البرمجية، وتعريف المكتبات والوحدات البرمجية التي تغلف شيفراتك البرمجية وتمكنك من إعادة استعمالها كلما أردت. ستدرك أهمية هذه القاعدة البرمجية إذا احتجت لإجراء تعديل ما في هذا الكود البرمجي المكرر، أو اكتشفت فيه خطأً ما وأردت تصحيحه، عندها سيتوجب عليك إجراء التعديلات في جميع الأماكن التي قمت فيها بإدراج هذا الكود وسيكون الأمر مرهقًا وغالبًا ستنسى ما قد كتبته حقًا، و قد لا تعدله أنت بل يعدله مبرمج آخر قد لا يفطن للتكرار مما يولد أخطاء مستقبلية. وبالتالي عندما تطور برنامجًا لحل مشكلة ما، وتجد أنك تقوم بالكثير من عمليات النسخ واللصق لنفس الكود لاستخدامه في أكثر من موضع، فابحث عن طريقة أخرى لكتابة هذا الكود، وفكر كيف يمكن أن تتجنب تكرار نفسك. ادمج الأجزاء الصغيرة لإنجاز أعمال أكبر يعتبر الدمج Composition من قواعد البرمجة المهمة، وهو يعني تجزئة المسائل البرمجية إلى مجموعة عناصر أصغر، كل جزء يقوم بمهمة محددة وواضحة، بعدها يتم دمج هذه الأجزاء لتشكيل جزء أكبر وأكثر تعقيدًا ينجز العمل بأكمله. يمكنك على سبيل المثال تطبيق هذه القاعدة إذا كنت مطور واجهة أمامية وتريد تطوير واجهة تطبيق ما وكتابة الكود البرمجي اللازم لتحقيق تصميم معين، حيث يمكنك تحويل كل عنصر من عناصر التصميم إلى مكون مستقل له الكود الخاص به، ثم تجمع هذه المكونات مع بعضها في النهاية لتحصل على التصميم الكامل. كما يتم تطبيق هذا المبدأ بشكل واضح في البرمجة كائنية التوجه OOP، من خلال تعريف صنف Class مستقل لكل جزء أو سلوك محدد من نظامك البرمجي، وجعل هذه الأصناف تتعاون مع بعضها لتنجز العمل المطلوب. باتباع هذه القاعدة ستوفر على نفسك كتابة أكواد ضخمة ومعقدة وصعبة الفهم. وتركز على برمجة كل مكون ليقوم بشيء واحد فقط، وإذا احتجت لتعديل جزء ما في برامجك فستعدل فقط الأجزاء التي طرأ عليها التعديل بكل سلاسة. فإذا كانت لديك شيفرة برمجية ضخمة لمكون ما في أحد برامجك تنجز عدة أمور مختلفة في نفس الوقت، فكر إن كان بالإمكان تقسيمها لأجزاء منفصلة أكثر تحديدًا. لا تبرمج ما لا تحتاجه من أهم قواعد البرمجة التي عليك اتباعها قاعدة YAGNI وهي اختصار للعبارة "You Aren't Gonna Need It" التي تعني أنت لن تحتاجها! لذا لا تقم ببرمجتها. فلا ينبغي عليك أن تكتب في برامجك أي أكواد لإنجاز مهام أو وظائف معينة تحل من خلالها مشكلة غير موجودة بالأساس، أو تضيف ميزة لا تحتاجها الآن لكنك تتوقع أنك ستحتاجها في مرحلة لاحقة. فإذا طلب منك على سبيل المثال كتابة كود برمجي يتحقق من صحة البريد الإلكتروني وكلمة المرور عند تسجيل دخول المستخدمين، فلا داعي لأن تتحقق أيضًا من صحة اسم المستخدم ورقم هاتفه لأنك قد لا تحتاج لهذا أبدًا. باختصار، كي تطبق هذه القاعدة ركز فقط على كتابة القدر المطلوب من الكود البرمجي الذي يحقق متطلباتك الحالية بالضبط بلا زيادة ولا نقصان، ولا داعي لأن تستشرف المستقبل. افصل الأكواد في أجزاء مستقلة يطلق على هذه القاعدة اسم فصل الاهتمامات "Separation of Interests" وهي من قواعد البرمجة الضرورية، وتؤكد على أهمية تصميم البرنامج ضمن وحدات أو أجزاء فريدة معزولة عن بعضها البعض. يعتبر أسلوب نموذج وعرض ومتحكم MVC من أوضح الأمثلة على تطبيق هذه القاعدة، ففي هذا النموذج يتم تنظيم كود البرامج ضمن ثلاثة أجزاء هي: النموذج Model الذي يتفاعل مع البيانات ويجلبها من قاعدة البيانات، والعرض View الذي يمثل الواجهة المرئية التي يتفاعل معها المستخدم بشكل مباشر، والمتحكم Controller الذي يمثل الوسيط بين العرض والنموذج ويربط بينهما. فالمتحكم يتلقى طلبات المستخدم من العرض أو واجهة المستخدم، ويعالجها، ثم يتصل بالنموذج ويطلب منه جلب ما يريده المستخدم من قاعدة البيانات، ثم يعيد النتيجة مرة أخرى إلى العرض ويظهرها على واجهة المستخدم. عند كتابة برامجك بهذا الأسلوب لن يحتاج الكود البرمجي الذي يتعامل مع قاعدة البيانات إلى معرفة تفاصبل عمل كود عرض البيانات، فكود العرض يحصل على المدخلات من المستخدم، وكود المتحكم يعالج هذه البيانات، وبهذا يكون كل جزء من الكود مستقلًا تمامًا. إن اتباع هذه القاعدة في البرمجة يمكنك من الحصول على كود برمجي سهل التطوير والصيانة، فإذا احتجت على سبيل المثال إلى إعادة كتابة كود العرض، فيمكنك القيام بذلك أن يتأثر أي شيء في كود حفظ ومعالجة البيانات. هذا الأسلوب يستخدم في العديد لغات البرمجة وأطر العمل، فمن لغات البرمجة التي تستخدم نموذج MVC لغة C++‎ و‎C# ‎ و Java و Ruby …إلخ. ومن أطر العمل التي تستخدم نموذج MVC إطار العمل أنجولر Angular وجانغو Django وفلاسك Flask ولارافيل Laravel …إلخ.‏‏‏‏‏ اكتب أكوادًا نظيفة تعد قاعدة كتابة الأكواد البرمجية النظيفة والمفهومة وسهلة الصيانة مهارة ضرورية على كل مبرمج إتقانها، ويشير مصطلح الكود النظيف Clean Code ببساطة إلى الكود سهل القراءة والفهم من قبل المبرمجين الآخرين، وعادةً عندما تتبع كافة قواعد البرمجة التي وردت أعلاه ستحصل بالنتيجة على كود نظيف بصورة تلقائية. احرص كذلك على تنظيف أكوادك من كافة التعليمات لن تستخدم عند تنفيذ البرنامج، واحذف المتغيرات التي صرحت عنها لكنك لم تستخدمها، والدوال البرمجية التي عرفتها لكنها لم تنادها على الإطلاق، والأصناف التي لم تشتق منها أي كائنات برمجية، وكذلك الأكواد التي كتبتها ثم حولتها إلى تعليقات ضمن الكود لإبطال عملها …إلخ. فهذه كلها أكواد ميّتة وأنت لا تريد أن تجعل برنامجك مقبرة! وكي تعرف بسهولة إن كان الكود الذي تكتبه نظيفًا، اعرضه على مبرمج آخر لم يسبق له أن اطلع عليه واطلب منه تعديل أمر ما فيه، فإذا تمكن المبرمج من فهم الغرض من التعليمات البرمجية الخاصة بك، وعدلها وأضاف أكواده الخاصة عليها بسهولة ومرونة، فهذا يعني أن كتبت بالفعل كودًا نظيفًا. وتذكر أن كتابة الكود النظيف ليس مهارة يمكن اكتسابها بين عشيّة وضحاها بل هو ميزة يتم تطويرها بالممارسة والتدرب على تطبيق كافة هذه القواعد كلما قمت بكتابة كود برمجي ما حتى تكتسب الخبرة المطلوبة. ملخص لأهم قواعد البرمجة التي ينبغي للمبرمج اتباعها نعرض ما يلي ملخص قواعد البرمجة التي ذكرناها ليسهل عليك تذكرها وحفظها: احرص على كتابة كود سهل القراءة والفهم مع إضافة التعليقات التوضيحية إن لزم فهي ضرورية لتوثيق وتسهيل فهم الكود وصيانته عند العودة له لاحقًا. اكتب أكوادًا بسيطة ومباشرة والمقصود هنا أن تصمم برامجك ببساطة، وتحذف أي ميزة لا تحتاجها، فالأنظمة البرمجية تعمل بشكل أفضل وتكون أسهل في الصيانة كلما كانت أبسط. افصل الأكواد في أجزاء معزولة بحيث يكون كل جزء مسؤولًا على إنجاز مهمة محددة. لا تكرر نفسك ولا تنسخ وتلصق نفس الكود في أكثر من موضع، بل اكتبه مرة وأعد استخدامه كلما دعت الحاجة. لا تضف ما لن تحتاجه كي لا تهدر وقتك ومالك على أشياء لمجرد أنك تتوقع أنك ستحتاجها لاحقًا، فقد لا تحتاجها أبدًا. اكتب كودًا نظيفًا غير مكرر أو معقد، وهو ما ستحصل عليه إذا اتبعت كل القواعد السابقة. ماذا سيحصل لو لم أتبع قواعد البرمجة؟ عندما تبدأ تعلم البرمجة ستكون سعيدًا عندما يعمل أي برنامج بالشكل الصحيح، وقد لا تعير اهتمامًا لمدى أهمية اتباع قواعد البرمجة، لكن يجب أن تضع في الحسبان أنك إذا لم تعتد على اتباع القواعد الصحيحة في كتابة أكوادك البرمجية، فإن هذا سينعكس سلبًا على أداء برامجك على المدى البعيد. في تلك الحالة قد تحصل على كود سيء وفوضوي وغير مفهوم، وصحيح أن برنامجك يعمل، لكنه سيكون مكتظَا بالأكواد البرمجية المكررة، أو الوظائف غير المستخدمة، أو المتغيرات التي لا فائدة من وجودها، وبرنامج كهذا قد يتعطل أو يفشل بعد أول تعديل أو تطوير مطلوب. فتعلم هذه القواعد وتطبيقها من شأنه أن يحسِّن من خبرتك ويطور أسلوب كتابة شيفراتك البرمجية، وأغلب أصحاب الأعمال سيطلعون على عينة من كود كتبته سابقًا وسيفضلون مبرمجًا محترفًا يتبع هذه القواعد عمن لا يتبعها. وتذكر أن البرمجة لا تقتصر على كتابة تعليمات برمجية تعمل فحسب، بل هي كتابة تعليمات برمجية فعالة ذات جودة عالية ويمكن صيانتها وتعديلها بكل مرونة سواء من قبلك أو من قبل أي مبرمج آخر، لذا احرص على اتباع هذه القواعد البرمجية والتدرب على تطبيقها قدر المستطاع لأنها سبيلك لتكون مبرمجًا ناجحًا ومتميزًا. ماذا بعد تعلم قواعد البرمجة؟ بعد أن تتقن أساسيات البرمجة وتتعلم تطبيق قواعد البرمجة قد تتساءل: كيف يمكنني المضي قدمًا وتطوير مهاراتي البرمجية بصورة أكبر؟ سؤال جيد، سأجيبك! من الأمور التي ينبغي عليك تعلمها في رحلتك لاحتراف البرمجة مهارات إعادة التصميم لمشاريعك الحالية، والتعرف على مفهوم أنماط التصميم وتطبيقها لحل المشكلات التقنية التي تواجهك مستقبلًا. يشير مفهوم إعادة التصميم "Refactoring" إلى الخطوات التي ينبغي للمبرمج اتباعها لتعديل الشيفرات البرمجية وإعادة هيكلتها وتحسينها والعثور على أي أخطاء أو ثغرات كامنة فيها، مع المحافظة على وظائفها الأساسية. أما أنماط التصميم "Design Patterns"، فهي عبارة عن نماذج يضعها المطورون لحل المشكلات المتكررة والمتشابهة، وستكتسب من خلال تعلمها القدرة على إعادة استخدام نفس الأنماط في كل مرة تظهر فيها نفس المشكلة، ويمكنك اعتبارها بمثابة فكرة مجردة توضح طريقة حل المشكلة وتسهل عليك تحقيقها برمجيًا. الخلاصة تعرفنا في مقال اليوم على أهم قواعد البرمجة التي على المبرمج اتباعها، فلا ينبغي أن تتعلم أساسيات البرمجة فقط، بل عليك أن تتقدم خطوة للأمام وتحرص على اتباع أفضل الممارسات البرمجية عند كتابة الكود كي يكون المنتج الرقمي الذي تنشؤه أكثر كفاءة وموثوقية واحترافية. وتذكر أنه يمكن للجميع كتابة كود برمجي يفهمه الحاسوب لكن القليلين فقط يمكنهم كتابة كود جيد يفهمه الإنسان أيضًا، ومن خلال حرصك على اتباع قواعد البرمجة التي شرحناها تضمن أن تكون من هذه الفئة القليلة من المبرمجين المحترفين، كل ما تحتاجه هو التدريب الجيد على كتابة الأكواد والبرامج بصورة محسنة تراعي هذه القواعد بأفضل طريقة. اقرأ أيضًا تعلم تطوير الويب دليلك الشامل إلى لغات البرمجة أسهل لغات البرمجة ما هي فوائد تعلم البرمجة؟
    1 نقطة
  19. إن كنت مطور ويب أو أحد المهتمين بتطوير الأنظمة المعلوماتية المختلفة في بيئة الويب، فإنك تعلم حجم التنوع الكبير للغات البرمجة المستخدمة في تطوير مواقع الويب وخدماته، ولربما كنت أحد مطوري هذه الخدمات وترغب بأن تكون خدماتك سريعة الانتشار وسهلة الاستخدام من قبل التطبيقات المختلفة ، وكما تعلم فإن كثرة لغات البرمجة المستخدمة في تطوير خدمات الويب تجعل من الصعب التواصل والتكامل بين هذه التطبيقات. إن المصطلح REST وهو اختصار لـ Representational state transfer يعبر عن المعمارية المستخدمة في تطوير خدمات الويب، التي تهدف إلى وضع معايير تضبط إدارة موارد الأنظمة resources وتحدد كيفية عنونتها ونقلها عبر بروتوكل HTTP إلى طيف واسع من التطبيقات المختلفة بغض النظر عن لغات البرمجة التي طورت بها تلك التطبيقات، وتعد معمارية REST أكثر معماريات تصميم الويب هيمنة خلال السنوات الماضية وذلك لسهولة استخدامها والتعامل معها. بعد التعرف على RESTful ستكون قادر على الانطلاق لتصميم الخدمة الخاصة بك دون القلق بشأن من سيستخدم الخدمة الخاصة بك.
    1 نقطة
  20. المواقع التي تقدم تمارين برمجية قليلة، والمواقع العربية التي تقدم تمارين برمجية شبه منعدمة، هنا قائمة تحتوي على أشهر المواقع التي تقدم تمارين في كل اللغات (ومع حلها في بعض الأحيان): Hacker Rank Coder Byte Hacker Earth Exercism Sphere Online Judge Codility Code Forces Project Euler Leet Code يمكنك أن تستعين بخدمات الترجمة مثل Google Translate ، حيث أن أغلب التحديات البرمجية لا تحتوي على كثير من النصوص لشرح المشكلة وسيكون من السهل ترجمة التحدي آليًا. قد تساعدك أيضًا هذه المقالة هنا: تستطيع أيضًا أن تقوم بعمل تمارين بنفسك وأسئلة بنفسك وسوف يساعدك هذا الأمر كثيرًا، أو يمكنك أن تحاول أن تقوم بإنشاء مشاريع كاملة مثل موقع أو تطبيق موجود بالفعل، وتقوم أنت بمحاولة تقليده، وهذا الأمر سوف يفيدك في محرفة نقاط القوة والضعف لديك، كما سيكون بأمكانك إضافة مثل هذه المشاريع في سيرتك الذاتية أو معرض أعمالك (إن كان لديك معرض أعمال مستقل أو على أحد مواقع العمل الحر).
    1 نقطة
  21. إذا كنت مهتما بتعلم البرمجة، فعلى الأرجح أنك رأيت هذا الاقتباس من قبل: في الحقيقة لا أبالغ إن قلت أن البرمجة أصبحت من أهم المهارات في عصرنا الحالي، وذلك لأنها دخلت في جميع مجالات حياتنا سواءً كنا ندرك ذلك أم لا فانطلاقًا من الهواتف المحمولة ومرورًا بالمنازل والشاشات الذكية وانتهاءً بالسيارات ذاتية القيادة. كل شيء من حولنا لم نكن لنراه بهذا الشكل لولا البرمجة، فأنا على سبيل المثال أكتب وأعدل هذا الموضوع من خلال برنامج بُرمج عبر لغة برمجة وأنت تقرأه على الإنترنت باستخدام برنامج (المتصفح) وربما رأيته على مواقع التواصل الاجتماعي وكُلها برامج أيضًا. ومما لا شك فيه أن تعلم البرمجة أصبح ضرورة مُلحة في هذا العصر بل إن تعلمك لها سيزيد من فرصك بشكل كبير في الحصول على عمل. ولقد تحدثنا في مقالٍ سابق عن كيفية تعلم البرمجة والدخول إلى هذا المجال من أوسع أبوابه (إن كنت حديث عهدٍ في البرمجة أو تخطط للبدء بها، فننصحك بقراءته قبل إكمال هذا المقال) وسوف نتحدث في هذا المقال عن أكثر المهارات صعوبةً في احتراف البرمجة ألا وهي «حل المشاكل». حل المشكلات وارتباطها بالبرمجة لطالما وقفنا حائرين أمام مشكلةٍ ما ونسأل أنفسنا ماهي الطريقة الصحيحة للخروج من هذا المأزق؟ هل ستكون طريقة الحلّ التي أتبعها مشابهة للطريقة التي يتبعها المبرمجين المحترفين؟ كيف أستطيع أن أفكر مثلما يفكر المبرمجين المحترفين؟ في البداية وقبل الخوض في التفاصيل دعنا نُعرف البرمجة بحد ذاتها ولنذهب للمقال السابق ونلقي نظرة سريعة عليها: نلاحظ أن التعريف السابق صحيح ولكنه مُقْتضَب ولا يقدم لنا المعنى الكامل والدقيق للبرمجة لذا لابدّ لنا من تعريفٍ أكثر دقة وموضوعية يساعدنا في فهم هذا المقال. يعرف موقع HackerRank في تقريره عن مهارات المطورين بعام 2018: نستنتج مما سبق أن البرمجة تعتمد اعتمادًا أساسيًا على التفكير المنطقي والرياضي والقدرة على حلّ المشاكل وإن لغات البرمجة ما هي إلا وسيلة للتخاطب مع الحاسوب. إذن الأمر كله يتعلق بتطوير قدرتك في حلّ المشاكل وجعل هذه العملية سهلة وسلسة بنفس الوقت لذا فاسمح لي بأن آخذك معي برحلة صغيرة في هذا المقال نتعرف فيها على أهمية حلّ المشاكل وضرورتها في مشوارك البرمجي. دورة علوم الحاسوب دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب اشترك الآن لماذا حلّ المشاكل مهم؟ تأتي أهمية حل المشاكل من كونها من أكثر المهارات المطلوبة عالميًا فوفقًا لتقرير أصدره موقع HackerRank جاء فيه: احتلت مهارة حلّ المشاكلالمرتبة الأولى بنسبة 94.9% لأكثر مهارة مطلوبة لأصحاب الشركات سواء الصغيرة منها أو الكبيرة. وعلى الصعيد العملي، إن عملية بناء أي شيء من الصفر سواء أكانت آلة معينة أو أي مُنتج جديد ستواجه الكثير من المشاكل في البداية، فعلى سبيل المثال بناء خدمات أمازون السحابية (AWS)، والّتي جاءت حلًا لمشكلة النفقات العالية للبنية التحتية لتجارتها الإلكترونية بالإضافة إلى الوقت الطويل الّتي تحتاجه في عملية البناء والذي شكل تحدي كبير في إمكانية توسع الشركة، إلى أن جاء آندي جاسي كبير مستشاري جيف بيزوس في ذلك الوقت والذي استطاع إيجاد حلّ لهذه المشكلة ولم يتوقف عند ذلك الحد وإنما أختار تحويل هذا الحلّ إلى خط أعمال جديد تحت أسم خدمات أمازون السحابية والّتي بلغت عائداتها السنوية لعام 2018 قيمة تناهز 25 مليار دولار. نجد من التجربة السابقة أنه حصلت مشكلة فأُوجِد لها حلًا وأثناء خلق حل للمشكلة ظهرت الكثير من المشاكل الأخرى لتقع في سلسلة من المشاكل لا تنتهي. وبعد حلّ جميع المشاكل سيصبح المنتج جاهزًا للعمل، أي أن دورة حياة أي منتج سواءً أكان برمجيًا أو ماديًا ستحتوي على المشاكل، وبناءً على ذلك تكون مهارة حل المشاكل اللَبِنَة الأساسية في بناء مشوارك البرمجي، والّتي يجب علينا الإهتمام بها عند الإقدام على تعلّم البرمجة. تكون طريقة تعاملنا مع المشاكل غير منظمة وعشوائية في أغلب الأحيان، فمعظمُ المبرمجين الجُدد يَبْدَؤُونَ بحلّ أي مشكلة تُواجهُهُم بالطريقة التالية: جرّب أي حلّ للمشكلة. إذا لم ينجح الحلّ الأول حاول أن تجرّب أي حلّ آخر. إذا لم يفلح الحلّ كرر الخطوة الثانية إلى أن تصل إلى الحلّ. لا يحصل هذا الأمر مع المبرمجين فقط، وإنما يحصل مع أي شخص يواجه مشكلة ولا يستعن على حلها بالتحليل والتفكير المنطقي. في الحقيقة، قد يحالفك الحظ أحيانًا ويتم حلّ المشكلة ولكن كن حذرًا! فهذه هي الطريقة الأسوأ لحلّ المشكلات بل وإنها ستهدر وقتك بشكل كبير لذا من الأفضل استخدام طريقة منظمة توصلنا للحلّ، واسمح لي بأن أشاركك طريقة شاملة توصلك إلى حلّ أي مشكلة قد تواجهك. بناء خطة حلّ شاملة إن خطة الحلّ الشاملة هي مجموعة من الخطوات الَّتي تتبعها لحلّ أي مشكلة تواجهك، حيث تكون هذه الخطة عامة وتخصص بحسب المشكلة، وهي ليست تعليمات ثابتة وإنما مبادئ ننطلق منها جميعًا، وكلٌ منا يطبقها بأسلوبه الخاص، وفي نهاية المطاف إذا انطلقنا جميعًا من نفس المبادئ، فسنصل حكمًا على نفس جودة الحلّ أيضًا. إن هذه الخطة مؤلفة من عدة أجزاء ويناقش كلّ جزء فيها جانبًا معينًا من المشكلة إلى أن نصل للحلّ، وهي على الشكل التالي: 1. فهم المشكلة إن فهمنا للمشكلة المطروحة هي الخطوة الأكثر صعوبة في طريقنا لحلّها، بل إن أكثر المشاكل تأتي صعوبتها من عدم تمكننا من فهم عميق لها. ولكن متى تعلم بأنك استطعت فهم المشكلة؟ إذا كنت قادرًا على شرحها بكلمات واضحة وسهلة بحيث يستطيع أي شخص فهمها عندها تكون بالفعل قد فهمت المشكلة. هل تذكر عندما كنت عالقًا في مشكلة وبدأت بشرحها فوجدت أخطاء منطقية كثيرة لم تكن قد انتبهت لها من قبل؟ أغلب المبرمجين قد مروا بهذه الحالة من قبل، لذلك من الأفضل دومًا أن تكتب المشكلة الَّتي تواجهك باستخدام مخططات الحالة (State diagram وهي نوع من المخططات الَّتي تستخدم لتوصيف سلوك نظام ما) أو بأن تخبر شخص آخر عن المشكلة سواءً أكان زميل لك في الشركة أو عضو في الفريق أو أي شخص أخر. شاع بين المبرمجين استخدام البطة المطاطية في شرح أجزاء المشكلة لها لفهمها وإيجاد حل لها. يعد أسلوب البطة المطاطية في تنقيح الأخطاء من أكثر الأساليب سهولة وبساطة، إذ يضع المبرمج بطةً بجوار حاسوبه، وعند مواجهته لأي مشكلة يشرع في شرح الشيفرة البرمجية للبطة وما هي النتيجة المرتقبة من الشيفرة وموازنتها مع النتيجة الحالية وغالبًا ما يجد الخطأ أثناء شرحه. وخلاصة لهذه الخطوة أنقل إليك مقولة ألبرت أينشتاين: 2. تحليل المشكلة إن تقسيم المشكلة يلعب دورًا مهمًا في طريقك لإيجاد الحلّ، لذا حاول أن تقسّمها إلى أجزاء صغيرة ثمّ حُلّ كلَّ جزء منها على حدة ويُنصح في البداية بحلّ أسهل جزء منها ومن ثمّ الأصعب فالأصعب وهكذا إلى أن يتمّ حلّ جميع أجزائها، وبعدها إجمع هذه الأجزاء مع بعضها للحصول على الحلّ النهائي للمشكلة الأصلية (الكبيرة). منذ فترة كنا بصدد برمجة إضافة لمتصفح غوغل كروم بهدف تسهيل مهمة لموقع ما، فقررنا تجربة هذه الطريقة وبدأنا بتقسّيم المهمة على أجزاء ثم عملنا على حلّ كل جزء منها، وبعدها جمعنا هذه الأجزاء مع بعضها بعضًا لبناء الإضافة، وبالفعل كان العمل بهذه الطريقة سهلًا جدًا ومريحًا كما لم نعهده من قبل. في بعض الأحيان عندما تواجه شيفرات برمجية كتبها مبرمجون لا يتبعون مبادئ SOLID (وهي مجموعة من العادات والمبادئ الَّتي يتبعها المبرمجون للحصول على شيفرة برمجية قابلة للصيانة وسهلة التعديل والتكيف مع متطلبات المشروع المتغيرة)، وغالبًا ما تكون شيفرات أولئك المبرمجين غيرمفهمومة ومتشابكة ويطلق عليها اسم Spaghetti code (تكون هذه الشيفرات ذات بنية معقدة ومتشابكة وصعبة القراءة وغير مرتبة أي تكون مثل المعكرونة ملتوية ومتشابكة) ولنفرض أنه طُلبَ منك تعديل هذه الشيفرة أو إضافة وظائف جديدة إليها،عندها حتمًا ستواجه العديد من المشاكل في عملية تقسيم المشكلة ومعرفة أي جزء من الشيفرة البرمجية المُسبب للخطأ لذا كان الحصول على شيفرات برمجية مرنة وقابلة للتعديل هي الأرضية المشتركة بين العديد من تقنيات تبسيط الشيفرات البرمجية مثل مبادئ SOLID أو مبدأ MVC والذي ينص على تقسيم الوحدات من حيث طبيعة مهمتها إلى ثلاثة أقسام (Model-View-Controller) والبرمجة كائنية التوجه OOP (Object-Oriented Programming)، إذ أن جميعهم يهدفون إلى فصل الأكواد إلى أقسام ليسهل تطويرها وتنقيحها وصيانتها. 3. إعداد خطة للحل بعد أن فهمت وحللت المشكلة، يأتي دور وضع الخطة المناسبة للحلّ بحيث تغطي كافة الجوانب والتفاصيل للمشكلة، ولا تشرع في الحلّ من دون خطة (على أمل أن تجد الحلّ بطريقة ما) لأن المفتاح الرئيسي للوصول للحلّ هي الخطة الواضحة والمنظمة والتي تضمن وصولنا للحلّ النهائي. أعط لنفسك وقتًا لتحلّيل المشكلة وربط المعلومات المدخلة إلى البرنامج ونوعها والمعلومات الَّتي ستظهر كخرج للبرنامج وفهم سياقها وللحصول على خطة جيدة يجب عليك الإجابة على السؤال التالي: إذا أُعطي للبرنامج الدخل س، ما هي الخطوات اللازمة للحصول على الخرج ع؟ إن إجابتك على هذا السؤال سوف يحدد ماهي الخطوات اللازمة لحلّ المشكلة ومن ثَمَّ تقوم بترتيبها في خطة واضحة ومنظمة من أجل الحصول على الخرج الذي تريده. 4. مواجهة حالة السكتة البرمجية ماذا لو فرضنا أنك لم تستطع حلّ أي جزء من المشكلة، ولا حتى الأجزاء السهلة منها (وهذا قد يحدث في بعض الأحيان)، إن كثير من المبرمجين يقعون في هذه الحالة فلا يستطيعون أن يُحرزوا أي تقدم يذكر في تطوير الشيفرة البرمجية وهذا أشبه ما يمكن بالسكتة الدماغية (حيث لا يستطيع المريض القيام بأي حركة)، في الحقيقة إن هذه الحالة طبيعية جدًا ومعظمنا قد تعرض لها في بداية مشواره والاختلاف الوحيد هو أن المبرمج المحترف لديه فضول أكثر حول المشكلة ومعرفة سبب حدوثها بدلًا من أن يكون منزعجًا أو غاضبًا منها. وفي هذه الحالة هنالك حلّين يمكنك تجربتهما للخروج من هذا المأزق: 1-4. تنقيح الأخطاء (Debug) ليس المقصود هنا الأخطاء الكتابية في صياغة اللغة (Syntax errors) مثل نسيان فاصلة منقوطة أو أي خطأ في استخدام المتغيرات أو الدوال أو ما شابه ذلك من أخطاء والَّتي تقوم باكتشافها أي بيئة تطوير متكاملة (IDE وهي عبارة عن محرر شيفرة برمجية مدمج مع نظام ذكي لإكمال الكود ومصحح أخطاء). وبالطبع ليست أيضًا الأخطاء الّتي تظهر أثناء التنفيذ (Runtime Errors) والّتي تكون عادة نتيجة لفشلٍ في فتح ملف ما أو محاولة القسمة على صفر أو مثل هذه الأخطاء، وإنما المقصود هنا هو أخطاء المنطق البرمجي (Logic errors) الّتي ينفِّذ فيها البرنامج أمرًا غير الَّذي بُرمج من أجله، لذا من الأفضل أن تحاول أن تفحص الشيفرة البرمجية سطرًا سطرًا لعلك تجد هذا الخطأ، أوإذا كنت تعمل على لغاتٍ مثل (C++, C) والّتي تدعم استخدام المُنقِّح Debugger (الذي يراقب عمل البرنامج ويتحكم في تنفيذه بطريقة تستطيع فيها إيقاف تنفيذ البرنامج أو حتى تغييره في أي موضع من الشيفرة وذلك من خلال مجموعة من الأدوات الّتي يقدمها المُنقِّح، مثل: GNU Debugger) فيمكنك استخدامه لإيجاد الخطأ ومن ثَمّ إصلاحه. ملاحظة : من المنهجيات البرمجية الجيدة هي كتابة تعليقات توضيحية قبل كلّ دالة (Function) أو صنف (Class) برمجي وخُصوصًا تلك الأجزاء المعقدة منها لأن ذلك سوف يساعدك كثيرًا في عملية مراجعة الشيفرة البرمجية وتنقيحها. 2-4. مراجعة وتقييم الحلّ في كثير من الأحيان عند مواجهتنا للمشاكل وخصوصًا للكبيرة منها قد نضيع في التفاصيل الصغيرة للمشكلة الَّتي نواجهها وننسى المشكلة الرئيسية ولذلك من الأفضل دومًا أن نسأل أنفسنا هل هذه هي الطريقة الأفضل للحلّ؟ هل هنالك حلًّا عموميًا أفضل من الموجود؟ هل الشيفرة البرمجية أمثلية؟ هل الحلّ يخرق معايير الجودة المطلوبة؟ ارجع خطوة إلى الوراء وحاول أن تراها من منظور مختلف، وحتمًا ستلاحظ العديد من المشاكل التي غفلت عنها أثناء انشغالك بالتفاصيل الصغيرة. ملاحظة : هنالك طريقة أخرى يتبعها بعض المبرمجين لإعادة تقييم الحلّ وهي حذف الشيفرة البرمجية الخاطئة بالكامل وإعادة كتابتها من جديد فكثير ما يأخذ ذلك وقتًا أقل من تتبع المشكلة ذاتها وحلها. 5. البحث عن حلول عبر الإنترنت إن أغلب المشاريع البرمجية تكون متشابهة بكثيرٍ من الوظائف والخصائص، ونادرًا ما نرى مشروع ذو أفكارٍ جديدة بالكامل لذا فإن أي مشكلة برمجية تواجهها قد واجهها عدد كبير من المبرمجين من قبلك وأوجدوا لها حلولًا وشاركوها مع غيرهم، وكل ما عليك فعله هو أن تتعلم كيف تبحث عن المشكلة. وبالطبع صديقنا stackoverflow والذي يعد من أشهر منصات مشاركة الحلول البرمجية الّذي يقدم لك الحلّ الَّذي أجمع عليه أغلب، المبرمجين، ويوجد العديد من المنصات الأخرى المشابهة مثل AskUbuntu وهو النسخة العربية من موقع stackoverflow والكثير غيرهم، وحتى لو أنك قد حللت المشكلة أنصحك بتصفح الحلول الموجودة لأنك سوف تتعلم طرقًا أُخرى لحلّها قد تكون أسهل وأفضل بكثير من الحلّ الَّذي وصلت اليه. إلى الآن نكون قد ناقشنا الخطوة الأولى من الطريقة الشاملة لحلّ المشاكل والآن لننتقل إلى الخطوة الثانية. التدرب على هذه الخطة إن أي مهارة جديدة تحتاج إلى تدريبٍ مُمنهجٍ ومستمرٍ حتى تتقنها. لذا لا بدّ لك من وضع خطة واضحة للتدريب وتخصيص زمن محدد وثابت تقضيه في صقل تلك المهارة.يمكنك البدء مثلًا بتخصيص ساعة للتدريب يوميًا لمدة شهر كامل، وبعدها توازن نفسك مع ما كنت عليه في السابق من سرعةٍ في تحديد المشكلة وجودةٍ الحل المطروح والوقت الإجمالي لحل المشكلة وبكل تأكيد ستلاحظ تحسنًا واضحًا في أدائك. وقد تساءل نفسك كيف يمكنني التدرب على حلّ المشاكل؟ في الحقيقة هنالك طريقة مفيدة جدًا أنصحك بها لتكوين قاعدة صلبة تنطلق منها، وهي على الشكل التالي. 1. التدرب على المسائل البرمجية تعد المسابقات البرمجية سواءً على مستوى الجامعة أو على مستوى القطر أو حتى على مستوى العالم مثل مسابقة ACM ICPC من أفضل الفرص للتدريب في مجال البرمجة وصقل هذه المهارة بل وتعتبر دفعة كبيرة لك في رحلتك كمبرمج ولمستقبلك المهني أيضًا، إذ تبادر العديد من الشركات العالمية لِضمّ أولئك المنافسين المتميزين إليها بعد أن أثبتوا بالفعل أنهم النخبة في مجالهم. فإن كنت تخطط للانضمام إلى هذه المسابقة فلا تتردد وبادر بالتحضير لها من الآن. ويقدم لنا الكاتب Steven Halim في كتابه Competitive Programming بعض الفوائد الَّتي نجنيها من التدرب على حلّ المشاكل البرمجية في المسابقات. السرعة في كتابة الشيفرة البرمجية كتابة الشيفرة البرمجية بسرعة في المسابقات يوفر لك الكثير من الوقت للتفكير في بقية المشاكل واختبارها لذلك نرى أغلب المبرمجين يتدربون على سرعة الكتابة على لوحة المفاتيح لينصب تركيزهم على حلّ المشكلة فقط، ولذلك من المنطقي أن تفضل الشركات الموظفين الَّذين سَبق إن شاركوا في المسابقات البرمجية لمعرفتها بسرعة إنتاجيتهم وقدرتهم على تطوير وإيصال منتج برمجي بسرعة عالية بِالْمُوازنة مع أقرانهم ممن لم يشاركوا في المسابقات. العصف الذهني وحصر الخوارزميات الممكنة لا بدّ من تحسين قدرتك على تحديد نوع المسألة بسرعة وأن تمتلك المعرفة الكافية بالخوارزميات لتتمكن من تطبيقها مباشرة على المسألة المطروحة، لذلك ينبغي على المبرمج الَّذي ينوي الانضمام إلى المسابقة أن يتمكن من جميع الخوارزميات الشائعة في المسائل البرمجية. العمل الجماعي وروح الفريق تعتمد المسابقة البرمجية على ترتيب الفرق بحسب عدد المسائل الَّتي أجابوا عليها، والوقت الَّذي استهلكوه لحلّ كُلَ مشكلة، وعدد الحلول الخاطئة الَّتي أُرسلت للحكم. وانطلاقًا من ذلك تكون فوائد العمل كفريق واحد متعددة منها إمكانية توزيع المسائل على كلّ عضو في الفريق بحيث يزداد العدد الكلي للمسائل المحلولة بتوزيعها بين بعضهم بعضًا، ومناقشة حلّ كلّ مسألة وبذلك ينقص عدد الحلول الخاطئة الَّتي قد تُرسل للحكم، وحُكمًا سينقص الوقت المستغرق لحلّ المسائل. وعلى الصعيد العملي أيضًا نجد أن طبيعة عمل المبرمجين سواءً في الشركات الصغيرة أو الكبيرة، يُطلب منهم العمل كفريق واحد، فعلى سبيل المثال منذ فترة طَلَبَ مني أحد العملاء بناء موقع ويب، وكنت عندها قد أنتهيت من بناء فريقي البرمجي. وبالفعل بدأنا العمل على الموقع و قسّمنا العمل على أجزاء فعكف كلُّ واحد منا على تطوير جزئه الخاص من الموقع، إذ استلمتُ جزء الواجهات الخلفية، وقام أحد أعضاء الفريق باستلام الواجهات الأمامية، والآخَر استلم بناء تطبيق للهواتف الّتي تعمل بنظام أندرويد وفي نهاية الأسبوع جمعنا كل الأجزاء مع بعضها بعضًا وأنهينا المشروع بوقتٍ قياسي لم نكن لنستطيع بلوغهُ لو أننا لم نعمل كفريقٍ واحد، ولذا فإن انضمامك إلى المسابقة البرمجية يجعلك تتدرب على العمل ضمن فريق قبل أن تواجهها في سوق العمل في حال أردت العمل مع أي شركة مستقبلًا. المرونة العصبية إن تدريبك المستمر على المسائل البرمجية سيؤدي إلى زيادة منطقة الحصين (المنطقة المسؤولة عن الذاكرة والتوجيهات) في الدماغ وهذا ما أثبتته الباحثة اليانور ماجواير من كلية لندن الجامعية عندما أجرت دراسة على سائقي الأجرة في مدينة لندن فقاموا بإجراء فحص بالرنين المغناطيسي الوظيفي fMRI لأدمغة السائقين الذين قضوا قرابة عامين من التدريب في سبيل تعلم كيفية التنقل في منعطفات المدينة وذلك من أجل الحصول على رخصة القيادة ومقارنتها بصور لأدمغة رجال أصحاء من نفس العمر ولا يعملون كسائقي أجرة فتبين أن منطقة الحصين أصبحت أكبر لدى السائقين، كما لاحظوا أنه كلما أمضى سائق الأجرة فترة أطول في التدريب، زاد حجم الحصين، وذلك استجابة إلى الخبرة الّتي يكتسبها السائق. والآن تخيل معي ما سيحدث في حال تدربك على حل المشاكل لمدة عام أو أكثر، سيصبح حلّك للمشاكل البرمجية عادة سهلة ومسلية خلاف ما كانت عليه من صعوبة وتعقيد. يوجد العديد من المواقع الَّتي تقدم المسائل البرمجية مثل HackerRank أو موقع TopCoder والكثير غيرهم. 2. التدرب باستخدام الألعاب نعم أنت لم تخطئ القراءة إنها الألعاب! تعد الألعاب أداة قوية جدًا لتنمية المهارات العقلية والقدرات الدماغية على التفكير والتذكر وربط المعلومات ببعضها بعضًا، حيث أن غالبية الألعاب تحتاج لتجميع المعلومات وتنظيمها بحيث تستطيع الاستفادة منها وجعلها مفتاحًا للحلّ، بل إن الركيزة الأساسية الَّتي تشترك بها كافة الألعاب هي حلّ المشاكل! بالتأكيد نحن لا نقصد هنا ألعاب الفيديو فقط وإنما ألعاب الذكاء أيضًا مثل : لعبة الشطرنج، والألغاز الرياضية، ولعبة سودوكو، ولعبة Go، والكثير من الألعاب الَّتي تندرج تحت هذا السياق تعد ألعاب مفيدة. فعند محاولتك حلّ الألغاز في Saw أنت فعليًا تقوم بحلّ المشاكل (ولكن بإطار مختلف). وتساعدنا أيضًا في انشاء سيناريوهات للحلّ وهذه المهارة مفيدة في عالم البرمجة في حال تعثرت في أسلوب حلّ معين فتغير سيناريو الحلّ وتبدأ من جديد. في الحقيقة إن الشيء المشترك بين جميع الناس الناجحين هي اكتسابهم لعادات يومية لحلّ المشاكل الصغيرة على سبيل المثال بيتر تيل (أحد مؤسسي شركة باي بال والمصنف كرابع أغنى شخص على مستوى العالم لعام 2014 بميزانية تفوق $2.2 بليون دولار) صرح بشكل رسمي أنه يلعب الشطرنج يوميًا بل وشارك في بطولات الشطرنج مرات عديدة، وإيلون ماسك (رائد الأعمال والرئيس التنفيذي لعدة شركات مثل: سبيس إكس لتصنيع مركبات الفضاء وتسلا لصناعة السيارات الكهربائية وغيرها)أكد بأنه يلعب ألعاب الفيديو والكثير غيرهم كرسوا جزءًا من وقتهم اليومي لتنمية مهارة حلّ المشاكل. ولكن يجب أن تكون حذرًا في إدارة وقت اللعب ويُفضل أن تختار الأوقات المناسبة للعب ووضع مدة زمنية مخصصة لها، وذلك لأن الهدف ليس إضاعة الوقت والتسلية فقط وإنما التدرب على حل المشاكل ولكي لا ينتهِ بك المطاف إلى قضاء اليوم بأكمله على الألعاب. الخلاصة اعتقد أنك قد كونت فكرة جيدة عن أهمية حلّ المشاكل وضرورتها في مشوارك البرمجي وكيفية بناء خطة حلّ شاملة انطلاقًا من فهم المشكلة وتحليلها ومرورًا بإعداد خطة مخصصة لكلّ مشكلة وتقسيم المشكلة إلى أجزاء ليسهل حلّها ومواجهة حالة السكتة البرمجية وكيفية التغلب عليها من خلال تنقيح الأخطاء أو مراجعة وتقييم الحلّ، وأهمية البحث عن حلول على الإنترنت لنفس المشكلة وانتهاءً بالأسلوب الصحيح للتدرب على حل المشاكل وما هي أفضل الوسائل لتحقيق ذلك سواءً بالانضمام إلى المسابقات البرمجية أو بالتدرب بإستخدام الألعاب. وختامًا، لا تتوقع أن تصبح مبرمجًا محترفًا في غضون أسبوعٍ أو شهر واحد فهذا ضرب من الخيال بل ستحتاج لحلّ الكثير من المشاكل لبناء قاعدة معرفية صلبة تمكنك من مواجهة أي مشكلة مهما كانت صعوبتها وعندها بالتأكيد سوف تستحق لقب مبرمج محترف. اقرأ أيضًا تعلم لغة PHP تعلم لغة بايثون
    1 نقطة
×
×
  • أضف...