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

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

  1. Ola Saleh

    Ola Saleh

    الأعضاء


    • نقاط

      59

    • المساهمات

      10


  2. هدى جبور

    هدى جبور

    الأعضاء


    • نقاط

      20

    • المساهمات

      26


  3. جميل بيلوني

    جميل بيلوني

    الأعضاء


    • نقاط

      12

    • المساهمات

      175


  4. ابراهيم الخضور

    • نقاط

      10

    • المساهمات

      164


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

عرض المحتوى الحاصل على سمعة أكبر منذ 05/19/23 in مقالات البرمجة

  1. سنتعرف في هذا المقال على مفهوم واجهة برمجية التطبيقات Application Programming Interface، هذا المصطلح السهل المعقد حيث سنحاول فهمه وكيفية بناء مواقع الويب والتطبيقات الحديثة في يومنا هذا بالاعتماد على الواجهات البرمجية ونجيب على سؤال مهم وهو كيف ترتبط الواجهة الأمامية مع الواجهة الخلفية لتطبيق الويب أو الموقع الإلكتروني. هذا المقال هو جزء من سلسلة مقالات حول الواجهة البرمجية API وكيفية الاستفادة منها في بناء تطبيق ويب: مدخل إلى الواجهات البرمجية API الاتصال بواجهة زد البرمجية وفهم عملية الاستيثاق والتصريح أمثلة عملية لاستخدام واجهة برمجة متاجر زد zid API تطوير تطبيق عملي يزيد من احتفاظ العملاء عبر واجهة زد البرمجية مفهوم الواجهة البرمجية للتطبيقات API قبل أن ندخل في أية تفاصيل تقنية عن موضوعنا اليوم، سأحكي لك يومًا في حياة علي. علي هو مبرمج تطبيقات ويب يعمل في إحدى الشركات التقنية العربية، علي يحب تجربة المأكوﻻت المختلفة، بحيث يجرب في كل يوم أكلة جديدة في المطاعم المحيطة وإن سمع بافتتاح مطعم جديد بالقرب من مكان عمله، فإنه ﻻ يتوانى في زيارته وتذوق مختلف اﻷطباق التي يقدمها. ذهب علي ﻷحد المطاعم التي فتحت أبوابها مؤخرا، واختار مكانا هادئًا ونادى النادل يسأله عن اﻷطباق التي يقدمونها من أجل أن يأخذ طلبيته إلى الطباخ لتحضير ما طلبه علي. دوَّن النادل ما يريد علي تناوله من مأكوﻻت وذهب بها إلى الطباخ من أجل تحضيرها، بعد مدة وجيزة، عاد النادل إلى علي وهو يحمل كل ما طلبه وقدمها متمنيا أنه يعجبه اﻷكل، تذوق علي المأكوﻻت وأبدى إعجابه اﻷولي بها، وبدأ في اﻷكل إلى أن أنهى كل ما في الصحون، دفع الحساب، وخرج من المطعم شاكرا النادل على حسن اﻷستقبال. هل تتساءل اﻵن، ما علاقة هذه القصة بالواجهات البرمجية؟ وهل تساءلت يومًا عن طريقة عمل تطبيقات الهواتف الذكية، وكيف تتصل بخوادم الشركات المطورة لها، هل استطعت الوصول إلى إجابات كافية عن ذلك؟ سأبين لك ما العلاقة بين المثال السابق والواجهات البرمجية وكيف أن الواجهات البرمجية ماهي إﻻ تطبيق لمثالنا باختلاف بسيط وهو مكان التطبيق فقط، فمثالنا هو من الواقع الذي نعيشه يوميًا ونراه دائمًا حتى تعودنا عليه حتى أصبحنا ﻻ ندركه، أما الواجهات البرمجية، فقد أصبحت جزءًا ﻻ يتجزأ من حياة مبرمج المواقع وتطبيقات الويب المهنية. كنت قد نوهتك ﻷن تسأل نفسك عن طريقة ربط تطبيقات الهواتف الذكية مع خوادم الشركات. هنالك طريقتين لربط تطبيقات الهواتف الذكية مع خوادم الشركات المطورة، الطريقة اﻷقدم تسمى SOAP وهي اختصار لجملة Simple Object Access Protocol، أما الطريقة اﻷحدث فهي الواجهة البرمجيةللتطبيقات API وهي اختصار لجملة Application Programming Interface، وهي التي سأركز عليها، ولكن باختصار، API هي طريقة لتواصل البرمجيات في ما بينها باستخدام صيغة JavaScript Object Notation والتي تعرف اختصارا بـ JSON. لن أدخل في التفاصيل التاريخية وسأبقى مركزا على الجانب التقني فقط، لهذا أتوقع منك أن تحاول البحث عن تاريخ ابتكار وتطوير تقنية API والتقنية المكملة لها REST والتي هي اختصار لجملة REpresentational State Transfer. مصطلحات وجب معرفتها سنسرد بعض المصطلحات باللغة الإنجليزية والعربية الضروري على كل مطور ويب أن يعرفها: Backend: الواجهة الخلفية، هي المسؤولة عن العمليات المنطقية للنظام، تتعامل مع الملفات أيضا ومع قواعد البيانات. Frontend: الواجهات الأمامية، كل ما يراه المستخدم ويتعامل معه بشكل مباشر، ويتم ربطها مع النظم الخلفية بما يعرف بالواجهة البرمجية للتطبيقات API. API: الواجهة البرمجية للتطبيقات، هي حلقة الوصل ما بين النظم أو الواجهة الخلفية والواجهات الأمامية. Request: الطلب الذي يرسله العميل (قد تكون الواجهة الأمامية) إلى الخادم Server الموجود في الواجهة الخلفية. Header: ترويسة الطلب Request المرسل والذي يحوي بعض البيانات الوصفية التي تصف الطلبية وحالها وأية معلومات إضافية مطلوبة. Body: جسم أو متن الطلب المرسل والذي يحوي غالبًا على البيانات المتبادلة في الطلبية. Response: استجابة أو رد الخادم وهي المعلومات الراجعة من الخادم إلى العميل مقدم الطلب ردًا على طلبه. تحوي المعلومات الراجعة من الخادم إلى العميل على ترويسة Header وأيضا على متن Body. Endpoint: نقطة الوصول، وهي نقطة اتصال الواجهات الأمامية مع موقع محدد في الواجهة الخلفية أي نقطة محددة تتصل عبرها الواجهة الأمامية مع الواجهة الخلفية لغرض محدَّد. HTTP Client Software: عميل خادم HTTP وهو برنامج يساعد على تسريع التعامل مع الواجهات البرمجية بتوفير آلية واضحة في عملية إرسال واستقبال الطلبيات والردود. هل تعرفت على أي من المصطلحات التي ذكرناها قبل قليل؟ لا بأس إن لم تفعل، فسنشرحها لك حتى تكون لديك معرفة مبدئية بموضوع الواجهات البرمجية. لماذا نستخدم الواجهات البرمجية للتطبيقات APIs وما هي فائدتها؟ تُعَد الواجهات البرمجية للتطبيقات طبقة الحماية الأولى First Security Layer للبرمجية الموجودة على خادم الويب، بسبب أنها تفصل ما بين النظم الخلفية والعمليات الجارية على قواعد البيانات عن الواجهات الأمامية سواءً كانت صفحات ويب عادية أو تطبيقات هواتف ذكية. أي أن أي تطبيق ويب أو موقع اليوم يتألف من واجهة خلفية وواجهة أمامية وواجهة برمجية تعد وصلة وصل بينهما. أما الواجهة الخلفية، فتحوي على كامل العمليات والإجراءات والخدمات التي يوفرها التطبيق أو الموقع مثل معالجة صورة أو بيانات أو حتى تقديم خدمة الطقس. أما الواجهة الأمامية فهي الواجهة التي يراها المستخدم والمسؤولة عن عرض البيانات القادمة من الواجهة الخلفية للمستخدم بصورة مناسبة ومتناسقة مع إرسال البيانات من المستخدم إلى الخادم بالشكل الذي يطلبها، فالبيانات المتبادلة تلك تكون بشكلها الخام (تستعمل غالبًا صيغة JSON أو حتى صيغة XML)، أما الواجهة البرمجية للتطبيقات API فهي صلة الوصل كما ذكرنا ووظيفتها استلام البيانات من الواجهة الأمامية وتسلميها للواجهة الخلفية وإرسال البيانات من الواجهة الخلفية إلى الأمامية بطريقة وأسلوب موحد أي هي التي تؤمن عملية التفاهم بين الواجهة الأمامية والخلفية لتأمين التخاطب فيما بينهما. كيف تعمل الواجهات البرمجية للتطبيقات API سأحاول قدر اﻹمكان تبسيط آلية عمل الواجهات البرمجية بمثال عملي من حياتنا اليومية، وليكن مثلا منصة فيسبوك. كما تعلم أنه بإمكانك الدخول إلى حسابك في فيسبوك من أي جهاز تريد، سواءً من هاتفك الذكي أو من جهازك اللوحي أو من جهاز الحاسوب بل بإمكانك الدخول منها مجتمعة وفي نفس الوقت، وهنا يجب أن تطرح سؤاﻻ مهمًا، كيف تتم مزامنة حسابك في كل تلك اﻷجهزة؟ هنا تأتي أهمية الواجهة البرمجية، بحيث أن كل تلك اﻷجهزة متصلة بنظام خلفي واحد وكلها تتصل بالواجهة البرمجية التي تكون حلقة الوصل ما بين كل اﻷجهزة المتصلة و النظام الخلفي. سنأخذ مثاﻻ من حياتنا اليومية وهو موقع فيسبوك، سنقوم بالدخول إلى حسابنا باستخدام الأجهزة التي بحوزتنا، إن لم تكن لديك أجهزة غير جهاز الحاسوب، افتح أكثر من متصفح، ليس نفس المتصفح، مثلا متصفح كروم Google Chrome ومتصفح فايرفوكس Mozilla Firefox، في هذه الحالة يمكنك فتح حسابك 4 مرات باستخدام التصفح الخفي، في متصفح كروم يسمى Incognito Mode أما في متصفح فايرفوكس فيسمى Private Mode. هل قمت بذلك؟ كيف تستطيع إرسال رسائل إلى أصدقائك من أي متصفح وتشاهدها في نفس الوقت من بقية المتصفحات؟ قم بالدخول إلى حسابك على فيسبوك من هاتفك الذكي، من التطبيق الرسمي أو من المتصفح، هل تستطيع أن ترى الرسائل التي قمت بإرسالها على هاتفك أيضا، كيف يحدث ذلك؟ كيف تستطيع الدخول إلى حسابك من أماكن مختلفة في نفس الوقت؟ سأشرح العملية بأكملها بشكل بسيط وبالمقارنة مع مثالنا في بداية المقال وبدون الدخول في التفاصيل الدقيقة في الوقت الحالي. عند دخول علي مطور الويب إلى المطعم، كان عليه أن يختار طاولة محددة برقم حتى يعلم النادل موقعه وأنه يريد تناول الطعام وبالتالي يستطيع تقديم مختلف الخدمات التي يعرضها المطعم. هنا الطاولة وتفاصيلها (من رقم وحجم وغيرهما) تعتبر المكان المتفق عليه من أجل اﻹستفادة من خدمات المطعم، ويمكن القول أنها نقطة الوصول إلى خدمات المطعم Endpoint. في حالة موقع فيسبوك، وعند قيامك فتح التطبيق مثلا، سيتصل تطبيقك بخادم الشركة، في نقطة متفق عليها ومحددة مسبقًا في التطبيق وفيها فقط يستطيع الخادم أن يقدم خدماته للتطبيق. جاء النادل إلى عليٍ والذي يسمى العميل client ليأخذ الطلبات منه، ودون أية ملاحظات أو أي خدمات أخرى، وبعدها ذهب إلى المطبخ ليخبر الطباخ بالطلبات من أجل تحضيرها. هنا نسمي العملية: إرسال طلب Send Request من العميل علي إلى الطباخ في المطعم مقدمة الخدمة. في حالة موقع فيسبوك، أقرب عملية لذلك المثال عملية تسجيل الدخول حيث تُدخل اسم المستخدم الخاص بك مع كلمة المرور، تأخذ الواجهة الأمامية منك هذه المعلومات وترسلها للواجهة الخلفية لموقع فيسبوك لتتحقق منها ومن الطلب الخاص بك، طلب تسجيل الدخول. يستلم الطباخ الطلبية ويتأكد من أنها طلبية صالحة ويمكنك تحضيرها (أي ليست طلبية شراء ملابس مثلًا) ثم يبدأ بتحضيرها وعندما ينتهي منها، يعطيها للنادل الذي يرتبها بدوره في صينية ويأخذها إلى علي ليضعها على طاولته حتى يتسنى له البدء في تذوقها. هذه العملية تسمى: اﻹستجابة Send Response أي استجاب الطباخ لطلبية علي وقدم له ما يريد. وفي حالة موقع فيسبوك، إن كانت المعلومات المقدمة صالحة، سيقوم خادم فيسبوك بالسماح لك بالدخول واستعراض مختلف الصفحات واﻷجزاء الخاصة به والاستفادة من خدمته التي يقدمها. هل اتضحت الصورة العامة اﻵن؟ ببساطة، الواجهة البرمجية تنفذ عمل النادل في المطعم، حيث أن النادل يقوم بأخذ طلبات الزبائن إلى الطباخ وفريقه لتحضيرها وبعد ذلك، يقوم بأخذ تلك استجابة الطباخ لتلك الطلبات إلى أصحابها، أي أن الواجهة البرمجية تأخذ الطلبات من المستخدمين (الواجهة الأمامية) إلى النظام الخلفي لتقوم بعمل محدد ومن ثم تعيد النتائج المتحصل عليها إلى طالبيها أي تعيدها للواجهة الأمامية مرةً أخرى. خاتمة تعرفنا على ماهية الواجهة البرمجية للتطبيقات وأهم المصطلحات فيها وكيف يستفيد منها المطورون في بناء تطبيقات الويب الحديثة واستثمارها في التواصل ما بين الواجهة الأمامية والخلفية لتطبيقات الويب والمواقع الحالية، فالتعامل مع الواجهة البرمجية للتطبيقات ضروري لأي مبرمج متخصص في تطوير الويب، وعليه أن يعي مفهوم الواجهة البرمجة تمامًا إذ أصبح هذا المفهوم هو المفهوم الحديث في التواصل ما بين الواجهة البرمجية الخلفية والأمامية للمواقع وتطبيقات الويب، أضف إلى ذلك أن الكثير من الخدمات والمواقع أصبحت تتيح واجهتها البرمجية (مثل الواجهة البرمجية للمطورين من فيسبوك وتويتر وغيرهما) للاستفادة منها أو حتى هنالك واجهة برمجية مخصصة فقط لتقديم خدمات محددة (مثل واجهة برمجية للحصول على معلومات الطقس) وتقدمها للمطورين للاستفادة من تلك الخدمات في مختلف المشاريع. اقرأ أيضًا المقال التالي: الاتصال بواجهة زد البرمجية وفهم عملية الاستيثاق والتصريح كيفية إنشاء متجر إلكتروني متكامل باستعمال منصة زد الواجهة البرمجية Fetch API في جافاسكريبت
    5 نقاط
  2. هياكل البيانات data structures -أو تدعى بنى المعطيات أحيانًا- مصطلح يتكرر كثيرًا في علوم الحاسوب خصوصًا والبرمجة عمومًا ويعد من المصطلحات المعقدة البسيطة أو السهلة الممتنعة كما أن الكثير يخلط بينه وبين أنواع البيانات أو لا يكاد يميز بينهما، ولابد على أي داخل لمجال علوم الحاسوب ومن يريد تعلم البرمجة أن يفهم هذا المصطلح جيدًا لأنه الأساس الذي سيستند عليه في بناء بقية المفاهيم الأخرى اللاحقة. بناء على ذلك، جاء هذا المقال ليكون تعريفًا بهياكل البيانات وأنواعها بأسلوب بسيط سهل مدعوم بالصور التوضيحية كل هيكل بيانات بالإضافة إلى ذكر ميزات وعيوب بعض الأنواع، كما يتناول هذا المقال التعريف بأهمية هياكل البيانات وأهم تطبيقاتها والفرق بينها وبين أنواع البيانات، لذا لنبدأ! ما هي هياكل البيانات؟ تُعَدّ هياكل البيانات data structures من أهم المفاهيم التأسيسية في مجال علوم الحاسوب، فهي ببساطة مجموعة من الوسائل والطرق المستعملة في ترتيب البيانات في ذاكرة الحاسوب بهدف التعامل معها بكفاءة وفعالية وتسهيل إجراء العمليات عليها، وتوجد هناك أنواع أساسية ومتطورة من هياكل البيانات وجميعها مصمَّمة لتنظيم البيانات لاستخدامها في هدف محدَّد. أهمية هياكل البيانات data structures أحب بداية ضرب مثال يوضح هياكل البيانات وأهميتها وهو أننا نستعمل هذا المفهوم في حياتنا اليومية بصورة أو بأخرى، لنفترض أن البيانات تمثل ملابسنا، فهل نرمي الملابس في خزانة واحدة كلها؟ لا بالطبع لأن إخراج بنطال معين آنذاك سيستغرق وقتًا من البحث للعثور عليه وإخراج بل نضع الألبسة بطريقة معينة في عدة خزانات وسحابات وبطرق مختلفة بحيث نصل إلى بنطال أو قميص محدد بمجرد طلبه فورًا آنيًا دون تأخير. الأمر نفسه مع ترتيب البهارات وأوعية المطبخ والكتب وكل شيء حولنا تقريبًا. هذا بالضبط ما يحصل عند كتابة كلمة في محرك البحث لتظهر لك اقتراحات عد قد تطابق تمامًا ما تنوي كتابته في غضون أجزاء من الثانية، فهل تساءلت كيف تمكن محرك البحث من البحث في كم البيانات الضخم الموجودة في الإنترنت ووصل إلى النتيجة؟ لا يمكن ذلك بآلية الرمي العشوائي في مكان واحد التي ذكرناها في ترتيب الملابس تلك بل بتنظيم البيانات ضمن هياكل بيانات تشبه الأوعية والخزانات تسهل الوصول إليها بأسرع ما يمكن. نظرًا لتطور التطبيقات وازدياد تعقيدها وازدياد كمية البيانات الضخم يومًا بعد يوم والذي تتطلب عملية معالجتها معالجات هائلة السرعة، فكان لا بد من تنظيم البيانات وإدارتها بكفاءة في هياكل البيانات تمثل أوعية تخزين وتنظيم لها، إذ يمكن أن يساعد استخدام هياكل البيانات المناسبة في توفير قدر كبير من الوقت أثناء إجراء عمليات عليها مثل تخزين البيانات أو استرجاعها أو معالجتها، وبالتالي وصول أسرع إلى الذاكرة وتوفير في استهلاك العتاد من عمليات معالجة وطاقة للحاسوب. من الجدير بالذكر أيضًا أنّ هياكل البيانات ضرورية لتصميم خوارزميات فعالة والتي سنراها في تطبيقات هياكل البيانات ضمن هذا المقال. الفرق بين أنواع البيانات وهياكل البيانات يبدو لك أنّ أنواع البيانات Data Types وهياكل البيانات Data Structures وجهان لعملة واحدة لأنّ كلاهما يتعامل مع طبيعة البيانات وتنظيمها، ولكن في الحقيقة الأول يشرح نوع وطبيعة البيانات في حين يمثِّل الآخر التجميعات التي تُخزَّن تلك البيانات فيها، وفيما يلي الفروق الأساسية بين نوع البيانات وهيكل البيانات. يمثِّل نوع البيانات ماهية البيانات التي سيجري التعامل معها مثل أن تكون البيانات أعداد أو سلاسل نصية أو رموز …إلخ. في حين يُعَدّ هيكل البيانات تجميعةً collection تحوي تلك البيانات وهناك عدة أنواع من الهياكل تناسب مختلف أنواع البيانات. يحدد نوع البيانات ما يترتب عليه من عمليات تطبق على تلك البيانات مثل العمليات الرياضية على الأعداد وعمليات المعالجة على النصوص وهكذا أما هياكل البيانات فتحدد كيفية تخزين البيانات والوصول إليها والبحث فيها وغيرها من العمليات كما تدرس كيفية تحسين الأداء في تلك العمليات. يأخذ نوع البيانات شكل التنفيذ المجرد abstract implementation الذي يُعرَّف من خلال لغات البرمجة نفسها، في حين يُنفَّذ هيكل البيانات تنفيذًا حقيقيًا concrete implementation بحيث يُنشأ ليكون متوافقًا مع التصميم الذي يحتاجه المبرمج بالحجم الذي يريده وبنوع البيانات التي سيحتويها ضمن تطبيقه. يسمى نوع البيانات بأنه عديم القيمة dataless لأنه لا يخزِّن قيمة البيانات وإنما يمثِّل فقط نوع البيانات التي يمكن تخزينها، في حين يستطيع هيكل البيانات الاحتفاظ بأنواع مختلفة من البيانات مع قيمتها في كائن واحد. تحدد أنواع البيانات مع المتغيرات مثلًا في لغات البرمجة عند تعريفها، في حين تحتاج إلى كتابة بعض الخوارزميات لإسناد قيم البيانات إلى المتغيرات عند استخدام هيكل بيانات مثل عمليتَي الإضافة Push والجلب Pop للبيانات. لا يُكترث للزمن عند استخدام نوع البيانات، في حين يؤخذ بالحسبان عند استخدام هيكل البيانات (يطلق عليه تعقيد زمني BigO). تطبيقات هياكل البيانات يكاد لا يخلو أي تطبيق أو برنامج أو خوارزمية برمجية من وجود هيكل بيانات أو بنية معطيات تساعده في تحقيق الهدف المرجو منه، ومن هذه التطبيقات ما يلي: تنظيم البيانات في ذاكرة الحاسوب. تمثيل المعلومات في قواعد البيانات. خوارزميات معالجة البيانات مثل معالجة النصوص. خوارزميات تحليل البيانات مثل data minar. خوارزميات البحث في البيانات مثل محرك البحث. خورزميات توليد البيانات مثل مولِّد الأعداد العشوائية. خوارزميات ضغط البيانات وتفك ضغطها مثل المعتمدَة في برنامج zip. خوارزميات تشفير البيانات وتفك تشفيرها مثل المعتمدَة في نظام الأمان. البرامج التي تدير الملفات والمجلدات مثل مدير الملفات. دورة تطوير التطبيقات باستخدام لغة Python احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة اشترك الآن أنواع هياكل البيانات في لغات البرمجة تنقسم هياكل البيانات إلى هياكل بيانات أولية Primitive وهياكل بيانات غير أولية Non Primitive أو هياكل بيانات معقدة وكل منها يضم عدة أقسام سنشرحها تباعًا. هياكل البيانات الأولية Primitive هي هياكل البيانات الأساسية والبسيطة والتي تُستخدَم لتخزين قيمة من جزء واحد فقط ذات نوع محدَّد، ويندرج تحت هذا النوع ما يلي: integer: من أجل الأعداد الصحيحة مثل العدد 15. character: من أجل محرف واحد فقط. float: من أجل الأعداد العشرية. real: من أجل الأعداد الحقيقية. boolean: من أجل القيم البوليانية والذي يأخذ إحدى القيمتين؛ إما محققة true أو غير محققة false. ملاحظة: قد تتساءل عن هياكل تخزين النصوص، وهي في الحقيقة تدخل ضمن الهياكل الغير أولية أن النصوص مجموعة من الحروف والرموز التي تدعى محارف characters لذا تخزن عادة ضمن مصفوفة وأحيانًا تضيف لغات البرمجة نوعًا خاصًا لها يدعى string سلسلة نصية أو لا يضيف وتكون بالشكل char[]‎ وما تراه [] يدل على هيكل مصفوفة. يوجد شيء خاص يدعى مؤشر pointer والمشهور في بعض اللغات البرمجية مثل سي C وسي بلس بلس ++C، إذ يُعَدّ مكانًا في الذاكرة ويخزِّن عنوان المتغير الذي يشير إليه والشي الخاص فيه أنه يملك نوع بيانات والذي يجب أن يطابق نوع البيانات الذي يشير إليها. ملاحظة: ممكن تسمية هياكل البيانات التي تخزن الأعداد العشرية باسم double (عدد عشري مضاعف الدقة) أو float (عدد عشري) عوضًا عن real بصورة عامة ويكمن الاختلاف حسب اللغة البرمجية في عدد الخانات العشرية الممكن تخزينها، أي عدد الخانات بعد الفاصلة العشرية، بالإضافة إلى الحجم في الذاكرة وأخيرًا طريقة التعريف declaration، ففي لغة سي شارب #C يكون تعريف المتغير من نمط float كما يلي: float x = 1.5f; أما تعريفه عندما يكون من نمط double، فيكون كما يلي: double x = 1.5; ملاحظة: يطلق أحيانًا على هياكل البيانات الأولية أنواع البيانات Data Type. هياكل البيانات غير الأولية هي هياكل البيانات التي تُستخدَم من أجل التخزين المعقّد والتي يمكنها أن تحمل أكثر من قيمة في بنيتها، وتنقسم إلى هياكل بيانات خطية Linear وهياكل بيانات غير خطية Non Linear. هياكل البيانات الخطية تكون هياكل البيانات خطيّةً إذا كانت عناصرها تشكل تسلسلًا فيما بينها بحيث يرتبط كل عنصر فيها بعنصر سابق وعنصر لاحق ضمن مستوى واحد وفي مسار واحد، ومن هذه الهياكل ما يلي: المصفوفة Array القائمة المترابطة Linked List المكدس Stack الرتل Queue المصفوفة تُعَدّ المصفوفة الخطية array أو المصفوفة ذات البعد الواحد أبسط أنواع الهياكل الخطية، ويمكن تشبيهها بقائمة من عدد محدود من العناصر التي تمتلك النوع ذاته، ويكون بعدها -أو طولها- هو عدد العناصر التي تملكها، كما تُخزّن في الذاكرة بحجم ثابت وبمواقع متجاورة. كل عنصر من عناصر هذه المصفوفة الخطية يملك فهرسًا للوصول إليه، وعادةً ما يبدأ الفهرس بالعدد 0 أي يكون فهرس العنصر الأخير هو n-1 في مصفوفة بعدها n، وفي بعض لغات البرمجة يكون فهرس البداية هو العدد 1 مثل لغة باسكال، وفيما يلي صورة توضِّح هذه البنية: ملاحظات: يُنظَر إلى السلسلة النصية string على أنها مصفوفة أحادية من المحارف، أي كلمة Hello هي سلسلة نصية وهي مصفوفة طولها 5 مكوّنة من خمسة عناصر بحيث يمثِّل كل عنصر محرفًا من المحارف كما أشرنا سابقًا. المصفوفة ثنائية البعد هي أيضًا مجموعة من المتغيرات المفهرسة التي تحتوي على النوع نفسه من البيانات ولكن تخزين البيانات فيها يكون على صورة جدول له أعمدة وأسطر، بحيث يمكن الوصول إلى العنصر في هذه المصفوفة من خلال فهرسين أحدهما يحدِّد السطر والآخر يحدِّد العمود. من الجدير بالذكر أنّ بُعد المصفوفة ثابت في بعض لغات البرمجة وبالتالي يجب معرفة عدد العناصر قبل تعريفها فإذا أردت تغيير البُعد وإضافة عناصر جديدة، فستحتاج إلى مصفوفة جديدة ببُعد جديد لتنقل إليها العناصر السابقة وبعدها تضيف العناصر الجديدة إليها، كما أنّ إضافة عنصر ما في مكان ما مملوء مسبقًا أي في وسط المصفوفة مثلًا سيستهلك الكثير من العمليات، إذ ستحتاج إلى إزاحة العناصر اللاحقة ليصبح له مكانًا فارغًا، ويُعَدّ ذلك من عيوب استخدام المصفوفات. هنالك لغات أخرى لا تشترط تحديد عدد عناصر المصفوفة ولكنها تستهلك آنذاك عمليات كثيرة وتكون مكلفة لعمليات المعالجة أما تلك التي تحدد عدد العناصر مسبقًا فذلك عائد إلى توفير عمليات المعالجة. ملاحظة: قد تجد كلمة static ساكن وكلمة dynamic متحرك لتصنيف الأنواع الغير خطية ولكن شرحهما متقدم جدًا يحتاج إلى مقال بأكمله وستحتاج إليه عند التعمق كثيرًا وليس في البداية. القائمة المترابطة تُعَدّ القائمة المترابطة linked list مجموعةً من العقد التي تخزَّن في الذاكرة بمواقع غير متجاورة، وكل عقدة من عقد القائمة مرتبطة بالعقدة المجاورة لها بمؤشر عدا العقدة الأخيرة التي يكون المؤشر فيها عبارة عن Null. تسمح هذه البنية بإدراج عناصر جديدة أو حذف عناصر موجودة سابقًا بسهولة وهذا ما يميزها عن المصفوفات؛ أما سرعة الوصول، فتُعَدّ المصفوفات أسرع لأنه يكفي ذكر الفهرس الرابع على عكس القائمة المترابطة التي يجب البدء فيها من الرأس ثم المرور على العناصر بالتتالي إلى حين الوصول إلى العنصر الرابع. من الجدير بالذكر أنّ القائمة المترابطة تحتاج إلى مساحة إضافية في الذاكرة من أجل المؤشر الذي يرتبط بالعنصر، وهذا عيب آخر من عيوب القوائم المترابطة. يوجد نوع متطور من القوائم المترابطة وهو القوائم المترابطة المزدوجة Doubly Linked List، إذ ترتبط كل عقدة بمؤشرَين أحدهما يربطها بالعقدة السابقة ويسمى عادةً prev والآخر يربطها بالعقدة التالية ويسمى عادةً next، وبالتالي تحتاج هذه القائمة إلى مساحة إضافية في الذاكرة لامتلاكها على مؤشر إضافي، وبالمثل يكون المؤشر prev في عقدة الرأس Null ومؤشر next في العقدة الأخيرة هو Null. يوجد نوع أخير من القوائم المترابطة وهو القوائم المترابطة الدائرية Circular Linked Lists والتي تُعَدّ تطويرًا عن المفردة بحيث يشير مؤشر next الخاص بعقدة النهاية إلى عقدة الرأس. كما توجد القوائم الدائرية المزدوجة بحيث يشير مؤشر prev الخاص بعقدة الرأس إلى عقدة النهاية ويشير مؤشر next الخاص بعقدة النهاية إلى عقدة الرأس، وبالتالي لا تحتوي القوائم المترابطة الدائرية على مؤشرات Null. المكدس يُعَدّ المكدِّس stack هيكل بيانات خطية يتبع ترتيبًا محددًا في تنفيذ عمليات الحذف والإضافة، والترتيب يكون LIFO أي الذي يدخل آخرًا يخرج أولًا Last In First Out، والذي يميز المكدس هنا هو دخول العناصر وخروجها من قمة المكدِّس أي من جهة واحدة. تدخل -أو تُضاف- العناصر إلى المكدِّس عن طريق عملية وحيدة وخاصة وهي دفع Push وبالمثل فإنها تخرج منه -أو تُحذَف- عن طريق عملية وحيدة وخاصة أيضًا وتدعى إخراج Pop، وتوجد أيضًا عمليتان خاصتان بالمكدِّس وهما Top -أو Peek- التي تعيد القيمة الموجودة في قمة المكدِّس دون حذفها، والعملية الأخرى هي عملية IsEmpty التي تُعيد القيمة true إذا كان المكدِّس فارغًا. عند إضافة عنصر إلى مكدِّس ممتلئ لا يستوعب المزيد من العناصر فستحصل حالة طفحان المكدِّس overflow؛ أما عند إجراء عملية الحذف من مكدِّس فارغ، فسنواجه حالة طفحان أو تجاوز الحد الأدنى underflow (قعر المكدس). الرتل يُعَدّ الرتل queue أحد هياكل البيانات الخطية شبيه بالمكدس لامتلاكه عمليات خاصة للحذف والإضافة ولكنه يختلف عنه في مكان الحذف والإضافة كما سنرى. يدعى الرتل أو الطابور بـ FIFO أي الذي يدخل أولًا يخرج أولًا First In First Out بحيث يكون الدخول -أو الإضافة- من الجهة الخلفية rear والخروج -أو الحذف- من الجهة الأخرى أي الأمامية front (كما يحصل عند الوقوف ضمن الطوابير تمامًا لشراء شيء ما)، وتحدث الإضافة عن طريق عملية ENQUEUE أما عملية الحذف فتكون عن طريق عملية DEQUEUE. يتميز الرتل أيضًا بامتلاكه عمليات خاصة وهي العملية IsFull التي تُعيد true إذا كان الرتل ممتلئًا، والعملية IsEmpty التي تُعيد true إذا كان الرتل فارغًا، والعملية Front التي تُعيد العنصر الأمامي من الرتل، بالإضافة إلى العملية Rear التي تُعيد العنصر الخلفي من الرتل. هياكل البيانات غير الخطية لا تحتوي هياكل البيانات غير الخطية -أو المتشعبة- على أيّ تسلسل محدد يربط جميع عناصرها، إذ يمكن أن يكون لكل عنصر أكثر من مسار ليرتبط بالعناصر الأخرى، كما أنّ العناصر الموجودة ضمن هذه الهياكل لا يمكن اجتيازها أو المرور عليها في جولة واحدة أو باستخدام حلقة برمجية واحدة. وأهم ما يميّز هذا النوع على الرغم من صعوبة التنفيذ موازنةً بالهياكل الخطية التي يزداد فيها تعقيد الوقت مع ازدياد حجم البيانات أنه يُعد أكثر كفاءة في استخدام الذاكرة وأكثر سرعة في تطبيق العمليات مثل عمليات البحث، ومن هذه الهياكل: الشجرة الرسم البياني الشجرة تُعَدّ الشجرة tree هيكل بيانات متعدد المستويات وتُعرَّف على أنها مجموعة من العقد التي تحتوي فيما بينها على علاقة هرمية بحيث تسمى العقدة العليا بالعقدة الجذر، كما تحتوي كل عقدة على أب وحيد، في حين يمكن أن يكون لها أكثر من ابن أو تابع. تسمى العقد التي تتفرع من عقدة معينة بأبناء children تلك العقدة والتي بدورها تدعى بالعقدة الأب parent، في حين تسمى العقد التي لا تمتلك أبناء بالأوراق leaves. تمتلك الشجرة عدة أنواع وهي: الشجرة الثنائية binary tree شجرة البحث الثنائية binary search tree شجرة AVL شجرة R-B شجرة البادئات الشجرة الثنائية الشجرة الثنائية binary tree هي شجرة بيانات تمتلك كل عقدة فيها -ما عدا الأوراق- على عقدَتي ابن فقط وهما الابن الأيمن والابن الأيسر. شجرة البحث الثنائية شجرة البحث الثنائية binary search tree أو BST اختصارًا هي شجرة ثنائية تحقق خاصيتان أساسيتان وهما أنّ العقد الواقعة في الفرع اليميني تكون أكبر من العقدة الأب والعقد الواقعة في الفرع اليساري تكون أصغر من العقدة الأب، مع ضمان وجود ابنَين لكل عقدة وعدم تكرار العقد. شجرة AVL تُعَدّ اختصارًا لـ Adelson-Velskii Tree إذ يُعَدّ أديسون Adelson وفيلسكي Velskii مخترعَيها للحفاظ على توازن شجرة البحث الثنائي وذلك لمنع تدهورها إلى قائمة مرتبطة عندما تحتوي الشجرة بأكملها على الشجرة الفرعية اليسرى فقط أو على الشجرة اليمنى فقط مما سينعكس سلبًا على أداء الشجرة، إذ يمكن استخدام سلسلة من عمليات التدوير بحيث تُحدَّد في كل عملية عقدة جذر إلى حين الوصول إلى شجرة بعقدة جذر معينة بحيث تكون متوازنة أي ارتفاع الشجرة اليسرى مساويًا لارتفاع الشجرة اليمنى، ويمكن القول هنا أنّ شجرة AVL هي شجرة BST تحقق شرط التوازن، علمًا أنّ ارتفاع الشجرة هو أكبر عمق موجود لها. شجرة R-B تعني الشجرة الحمراء والسوداء Red-Black tree وهي شجرة بحث ثنائية لها خصائص تميزها بحيث تحتوي كل عقدة فيها على بت تخزين يشير إلى لون العقدة والتي يمكن أن تكون حمراء أو سوداء فقط، كما أنّ عقدة الجذر والعقد الأوراق سوداء دائمًا، وإذا كانت العقدة حمراء فيجب أن يكون أبناءها سود، وأخيرًا يجب أن تحتوي جميع المسارات من عقدة إلى أحفادها العدد نفسه من العقد السوداء، فإذا تحقق ما سبق، فستكون الشجرة شجرة بحث ثنائية متوازنة. شجرة البادئات تُعَدّ شجرة البادئات Prefix tree نوعًا من أشجار البحث وتعرف أيضًا بالشجرة الرقمية أو tri كما تُعرَف بشجرة القاموس وتُستخدَم في البحث عن الكلمات بصورة عامة بما أنها مكوَّنة من أحرف الهجاء، وأهم ما يميزها أنّ جذرها لا يحتوي على أيّ محرف. الكومة تُعَدّ الكومة Heap بنية معطيات شجرية تمتلك خاصة الكومة وهي وجود أسلوب ترتيب متَّبع بين العقد الآباء والعقد الأبناء مثل أن يكون كل أب أكبر من جميع أبنائه وتسمى حينها بالكومة العظمى Max-Heap أو أن يكون كل أب أصغر من جميع أبنائه وتسمى حينها بالكومة الصغرى Min-Heap، وتُستخدَم الكومة بكثرة في خوارزميات الترتيب، كما تتميز الكومة بأنّ جميع مستوياتها ممتلئة بالكامل عدا المستوى الأخير، وفيما يلي صورة توضِّح كومة صغرى. الرسم البياني يختلف الرسم البياني graph أو المبيان عن الشجرة في عدم احتوائه على جذر ومن الممكن أن تتصل العقد مع بعضها باتجاه واحد directed graph أو بالاتجاهين معًا Bi-directional أو بدون اتجاه undirected، كما أنّ طبيعة العلاقات بين العقد في هذا النوع ليست ذات طبيعة هرمية، كما تسمى العقد بالرؤوس vertices والروابط التي بينها تسمى بالحواف أو الأضلاع edges ويكون عدد كل من الرؤوس والأضلاع محدودًا. يكون الزوج (1,2) في الرسم البياني الموجَّه والذي يدل على وجود اتجاه من الرأس 1 إلى الرأس 2 مختلفًا عن الزوج (2,1)، كما تُرمَز مجموعة الرؤوس في هذا النوع بالرمز V ومجموعة الأضلاع بالرمز E ويُستخدَم هذا النوع من البنى في تمثيل الشبكات الواقعية مثل شبكة الهاتف المحمول أو شبكات التواصل الاجتماعي مثل الفيسبوك على سبيل المثال. التقطيع Hashing يُعَدّ التقطيع Hashing أو التجزئة تحسينًا لهياكل البيانات السابقة في بعض التطبيقات التي تحتاج إلى ترتيب بياناتها بواسطة أعداد كبيرة وفريدة موجودة ضمن هذه البيانات مثل ترتيب سجلات المرضى ضمن المستشفيات بناءً على أرقام هواتفهم والتي تُعَدّ مفاتيحًا فريدةً unique لهذه السجلات، ويكون ذلك من خلال الاستعانة بدالة تدعى دالة التقطيع hashing function والتي تحوِّل هذا المفتاح الفريد إلى عدد صغير وصحيح بحيث يكون فهرسًا لجدول جديد يدعى جدول التقطيع hashing table. من الممكن أن يكون فهرس جدول التقطيع هو ذاته رقم هاتف المريض بحيث يكون طوله هو أكبر رقم هاتف موجود ضمن السجلات زائد واحد بما أنّ الفهرسة تبدأ من الصفر، وبالتالي نحصل على سرعة وصول عالية لأيّ سجل من خلال رقم الهاتف الخاص به، ولكن سيتسبب ذلك بتواجد فجوات gaps بين العناصر لعدم الحاجة لوجود جميع أرقام الهواتف المحتملة وبالتالي زيادة حجم التخزين في الذاكرة، لذا تُستخدَم دالة التقطيع لحل هذه المشكلة، وعندها يكون جدول التقطيع مصفوفةً يمثِّل كل عنصر فيها مؤشرًا على السجل الذي يحتوي على رقم الهاتف -في مثالنا- والذي تكون نتيجة تطبيق دالة التقطيع عليه هي فهرس هذا العنصر. من الضروري التأكد من أنّ دالة التقطيع لا تعطي النتيجة ذاتها لأكثر من مفتاح، فإذا كانت دالة التقطيع مثلًا هي تأخذ فقط الرقم الأخير من رقم الهاتف، فسيكون لرقمَي الهاتف 45451 و 56561 على سبيل المثال النتيجة نفسها أي العدد 1 وبالتالي سيحدث تصادم في جدول التقطيع الذي فهرسه العدد 1، وأحد حلول هذه المشكلة أن يكون كل عنصر من جدول التقطيع مؤشرًا على قائمة مترابطة تحتوي على السجلات التي نتيجة تطبيق دالة التقطيع على أرقام هواتفها هي ذاتها. ليكن لدينا الأعداد التالية 12 – 17 – 29 – 6 – 30 – 31 – 4 – 8، فإذا كان فهرس جدول التقطيع هو ذاته العدد المعطى، فسنحتاج إلى جدول بحجم 32، ولكن فعليًا نحتاج إلى 8 أماكن للتخزين وبالتالي سنحصل على فجوات وهدر في الذاكرة، لذا سنلجأ إلى دالة التقطيع والتي ستعطي آحاد العدد المُعطى، وبالتالي ستكون نتيجتها 2 – 7 – 9 – 6 – 0 – 1 – 4 – 8 عند تطبيقها على الأعداد السابقة على الترتيب، بحيث يُخزَّن العدد 12 في العنصر الذي فهرسه هو العدد 2 وهكذا، وبالتالي سنحتاج إلى جدول تقطيع بحجم 8 بدلًا من 32 كما يلي: 12 17 29 6 30 31 4 8 2 7 9 6 0 1 4 8 يمكن تقليص حجم هذا الجدول ليصبح 4 بتحسين دالة التقطيع، بحيث يكون الفهرس هو باقي قسمة كل عدد من الأعداد المعطاة على العدد 4، ولكن ستكون نتيجة الأعداد 17 و 19 هي الفهرس 1، أي سيحدث تصادم، ويمكن حل هذه المشكلة بجعل كل عنصر من عناصر جدول التقطيع مؤشرًا على قائمة مترابطة من الأعداد التي باقي قسمتها على العدد 4 هو فهرس هذا العنصر، أي كما في الشكل التالي: يمكن زيادة حجم جدول التقطيع في المستقبل، كما أنّ هذه التقنية هي الأكثر استخدامًا في جوجل google. الخاتمة تعرَّفنا في هذا المقال على هياكل البيانات بكافة أنواعها مع إعطاء أمثلة توضيحية تساعدك على تخيل هذه البنى، بالإضافة إلى التطرق إلى ذكر أهميتها والفرق بينها وبين أنواع البيانات مع ذكر أهم تطبيقاتها. اقرأ أيضًا مقدمة إلى مفهوم البيانات الضخمة Big Data هياكل البيانات: القوائم المترابطة Linked lists والأشجار Trees في لغة سي C هياكل البيانات: الكائنات والمصفوفات في جافاسكريبت تصميم قواعد البيانات table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; }
    5 نقاط
  3. تعد بايثون Python واحدة من أشهر لغات البرمجة وأكثرها استخدامًا، وهي لغة ممتازة ليبدأ بها المبرمجون الجدد. يمكن استخدامها في كل المجالات، بدءًا من ألعاب الفيديو ومعالجة اللغات، وصولًا لتحليل البيانات والتعلم الآلي. بايثون هي لغة برمجة عالية المستوى، ومُفسرة interpreted وتفاعلية وكائنية، وتتمتع بمقروئية عالية، إذ تستخدم كلمات إنجليزية بسيطة، على خلاف اللغات الأخرى التي تستخدم الرموز، كما أنّ قواعدها الإملائية والصياغية بسيطة ومفهومة، ما يجعل تعلم لغة بايثون سهلًا مقارنةً بلغات برمجة أخرى. هذا المقال هو دليلك الشامل إلى التعرف على كل ما يخص لغة بايثون وكيفية تعلمها بأقصر السبل. جدول المحتويات حرصًا على تنظيم المقالة ولتسهيل الوصول إلى القسم الذي تريده بسهولة، سنذكر هنا جدول المحتويات باختصار: تاريخ بايثون مميزات لغة بايثون تطبيقات ومجالات استخدام لغة بايثون لماذا بايثون؟ أهمية تعلم لغة بايثون كيفية تعلم لغة بايثون نصائح لتعلم لغة بايثون تاريخ بايثون ظهرت لغة بايثون في أواخر الثمانينيات على يد المبرمج الهولندي جايدو فان روسم Guido van Rossum، وقد عُدَّت خليفة للغة ABC. كما استفادت من الكثير من اللغات السابقة لها، مثل Modula-3 و C و C++‎ و Algol-68 و SmallTalk، وغيرها من اللغات وأحدثت ثورة في عالم البرمجة لسهولتها وتعدد استخداماتها. نُشِر الإصدار 2.0 من لغة بايثون عام 2000، وقدّم العديد من الميزات الجديدة التي سهلت كتابة الكود على المبرمجين، مثل القوائم الفهمية List Comprehensions، ونظام كنس المُهملات garbage collection إلا أن هناك بعض العيوب التصميمية وأوجه القصور التي لم تتمكن سلسلة إصدارات ‎2.x‎ من تداركها. أطلق بعدها الإصدار 3.0 من لغة بايثون المعروف أيضًا باسم Python 3000 أو Py3k في عام 2008، والذي شكّل طفرة في اللغة وصحح العديد من عيوبها، لكنه لم يكن متوافقًا تمامًا مع الإصدارات السابقة)، ولهذا السبب قرر فريق التطوير الاستمرار ودعم إصدار أخير من سلسلة بايثون ‎2.x‎، وهو بايثون 2.7 لغاية عام 2020 وبعدها توقف الدعم ولم يعد الإصدار يتلقى أي تحديثات أو ميزات جديدة. النسخة الحالية من بايثون هي Python 3.11 وقد صدرت في السادس من ديسمبر/كانون الأول عام 2022، وتضمنت عدة تحسينات أبرزها تحسين سرعة التنفيذ، وتحسين رسائل الخطأ لتساعد المبرمج على تحديد الموقع الدقيق للخطأ ضمن البرنامج والعمل على تصحيحه بسرعة أكبر. مميزات لغة بايثون تتميز بايثون بعدة أمور عن غيرها من لغات البرمجة، من أبرزها: سهولة التعلم: يسهل تعلم لغة بايثون، إذ تتألف من عدد قليل من الكلمات المفتاحية، وتتميز بصياغة بسيطة وواضحة. المقروئية: شيفرة لغة بايثون واضحة ومنظمة وسهلة القراءة وتحاكي اللغة الطبيعية. سهولة الصيانة: شيفرة بايثون سهلة الصيانة إلى حد بعيد. مفتوحة المصدر حيث يمكن لأي شخص الاطلاع على شيفرة بايثون وإضافة تعديلات و ميزات جديدة عليها أو تطوير مكتبات تلبي مختلف المتطلبات. مكتبة قياسية واسعة: تحتوي مكتبة بايثون القياسية على عدد كبير من الحزم المحمولة التي تتوافق مع الأنظمة الشبيهة بيونكس و Windows و macOS. الوضع التفاعلي: تدعم بايثون الوضع التفاعلي، مما يتيح إمكانية تنفيذ الشيفرات مباشرةً على سطر الأوامر وتنقيح هذه الشيفرات بسهولة. محمولية بايثون: يمكن تشغيل لغة بايثون على طيف واسع من المنصات والأجهزة، مع الاحتفاظ بنفس الواجهة على جميع تلك المنصات. التوسعية: من أهم مميزات بايثون هو توفرها على عدد هائل من الوحدات والمكتبات، التي يمكنها توسيع قدرات اللغة في كل المجالات. دعم البرمجة الكائنية OOP: وهذا يمكن المبرمجين من كتابة تعليمات برمجية قابلة لإعادة الاستخدام ويسرع وتيرة عملهم. قواعد البيانات: توفر بايثون واجهات لجميع قواعد البيانات الأساسية. الرسوميات: تدعم بايثون التطبيقات الرسومية. دعم البرامج الكبيرة: بايثون مناسبة للبرامج الكبيرة والمعقدة. سأضرب مثالًا على الميزتين الأكثر شيوعًا بين الداخلين الجدد على المجال تعلم البرمجة وهما سهولة التعلم والمقروئية العالية بما أنهما تسهلان طريق التعلم ولتوضيح هاتين الميزتين، لذا إليك المثال البسيط التالي الذي يطبع كلمة مرحبًا على الشاشة: print('مرحبًا') لاحظ كيف يبدو البرنامج بلغة بايثون في حين يكون البرنامج نفسه الذي يقوم بطباعة هذه الكلمة بلغة أخرى مثل C كما يلي: #include <stdio.h> int main() { printf("مرحبًا"); return 0; } كما تلاحظ التعليمة في لغة بايثون واضحة ومباشرة في حين تتضمن لغة C كلمات ورموزًا غريبة وصعبة الفهم على المبتدئين مثل ‎#include‎ ووجود حرف f ملحقًا بكلمة print التي تعني "اطبع". رغم بساطة هذا المثال إلا أنه يعطيك فكرة عن مدى البساطة في كتابة شيفرات لغة بايثون ما يجعلها لغة مثالية للأشخاص الذين يبدأون للتو في تعلم البرمجة، وستدرك الفرق في سرعة كتابة الأكواد وسهولة الصيانة واكتشاف وتصحيح الخطأ بشكل أوضح عند كتابة برامج أكثر تعقيدًا. دورة تطوير التطبيقات باستخدام لغة Python احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة اشترك الآن تطبيقات ومجالات استخدام لغة بايثون تُستخدم لغة بايثون في شتى المجالات، فهي لغة برمجة متعددة الأغراض General Purpose ولها عدة تطبيقات لا يتسع المقال لذكرها لذا سنكتفي هنا بذكر أبرز مجالات استخدام لغة بايثون وهي: تحليل البيانات تطوير مواقع الويب واستخراج بيانات المواقع الذكاء الاصطناعي وتعلم الآلة تطوير تطبيقات سطح المكتب والألعاب برمجة العتاد واللوحات الإلكترونية دعنا نستكشف المزيد عن كل مجال من هذه المجالات ونتعرف على أهميته ومساهمة لغة بايثون فيه. 1. تحليل البيانات أصبحت لغة بايثون إحدى اللغات البارزة في مجال علم البيانات لما توفره من مكتبات متخصصة مثل NumPy و Pandas و Matplotlib التي تسهل على المبرمجين تطوير برامج لتحليل البيانات والتعلم الآلي وتمكن علماء ومحللي البيانات من معالجة هذه البيانات وإجراء الحسابات الإحصائية المعقدة عليها بل وتمثيلها بيانيًا واستخراج المعلومات منها بسرعة وكفاءة أكبر. 2. تطوير مواقع الويب واستخراج بيانات المواقع تعد لغة بايثون لغة ملائمة جدًا لتطوير مواقع الويب وبالتحديد الواجهة الخلفية لمواقع الويب، فهي لغة تعمل من طرف الخادم ويمكنها التواصل مع قواعد البيانات ومعالجة بياناتها بسهولة، كما أنها توفر العديد من أطر العمل التي تسرع وتيرة تطوير مواقع وتطبيقات ويب احترافية وآمنة من أشهرها جانغو Django و فلاسك Flask. وتوفر مكتبات تسمى مكتبات ORM توفر طرقًا مبتكرة للاستعلام عن البيانات من قاعدة بيانات ومعالجتها باستخدام نموذج موجه للكائنات Object-relational mapping مثل SQLAlchemy و Django ORM وهي أسهل وأسرع من كتابة استعلامات بلغة SQL التقليدية. كما تلبي لغة بايثون طلبك إن كنت مهتمًا بموضوع استخراج البيانات من صفحات الويب أو المتاجر الإلكترونية المختلفة بهدف دراستها والبحث ضمنها ومقارنة الأسعار فيما بينها، فهي قادرة على استخراج البيانات تلقائيًا من المواقع Web Scraping بسرعة وتنسيقها بطريقة منظمة، وتمثيلها رسوميًا من خلال كتابة أكواد مختصرة ومباشرة بفضل مكتباتها المتنوعة التي توفر كافة الوظائف الضرورية للقيام بذلك وأبرزها Beautiful Soup و Scrapy و Selenium. احصل على موقع إلكتروني مخصص لأعمالك أبهر زوارك بموقع احترافي ومميز بالاستعانة بأفضل خدمات تطوير وتحسين المواقع على خمسات أنشئ موقعك الآن 3. الذكاء الاصطناعي وتعلم الآلة لم يعد الذكاء الاصطناعي وتعلم الآلة مصطلحات غريبة في عصرنا الحالي بل أصبحت من المواضيع الرائجة والمطبقة بكثرة، وهنا أيضًا تبرز لغة بايثون كلغة ملائمة بشكل مثالي لتطبيق مفاهيم الذكاء الاصطناعي وجعل الحواسيب والأجهزة التي نتعامل معها في حياتنا اليومية ذكية وقادرة على التعلم بنفسها ومساعدتنا في اتخاذ القرارات، ومن أشهر المكتبات التي توفرها بايثون في مجال الذكاء الاصطناعي نذكر NumPy و Pandas و Scikit-Learn ...إلخ. دورة الذكاء الاصطناعي احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة. اشترك الآن 4. تطوير تطبيقات سطح المكتب والألعاب. تستخدم لغة بايثون بشكل كبير لتطوير وبرمجة تطبيقات سطح المكتب ذات الواجهات الرسومية GUI سواء التطبيقات البسيطة كالآلة الحاسبة أو تطبيقات تشغيل الوسائط أو التطبيقات الأكثر تعقيدًا من خلال توفير مجموعة مكتبات قوية ومليئة بأدوات واجهة المستخدم مثل Tkinter و wxPython و PyQt التي تسهل على المبرمج تخطيط وإنشاء تطبيقات سطح مكتب متوافقة مع مختلف أنظمة التشغيل. كما تعتبر بايثون ملائمة بشكل مثالي لتطوير الألعاب فهي توفر العديد من المكتبات وأطر العمل المساعدة مثل PyGame و Pyglet و PyKyra و PyOpenGL و Panda3D ...إلخ. التي تجعل من إنشاء الألعاب التفاعلية أسهل بكثير من استخدام لغات برمجة أخرى. 5. برمجة العتاد واللوحات الإلكترونية إذا كنت مهتمًا ببرمجة العتاد واللوحات الإلكترونية وبرمجة التطبيقات المضمنة Embedded Product وانترنت الأشياء فيمكنك البدء باستخدام شريحة راسبيري باي Raspberry Pi التي تعتبر حاسوبًا أوليًّا يعمل بنظام لينكس Linux ويستخدم لغة بايثون بشكل ضمني ليمكن المبرمجين والمتعلمين من تطوير مشاريع عملية رائعة مثل ساعة ذكية تعرض الوقت أو بوت للرد الآلي أو تطبيق بث مباشر على يوتيوب أو تطبيق للتحكم بالكاميرا وجعلها تلتقط الصور وتسجل مقاطع الفيديو ...إلخ. بكل سهولة. هذه كانت بعض المجالات البارزة التي تستخدم فيها لغة بايثون، إضافة إلى الكثير من المجالات الأخرى التي لا يسعنا حصرها هنا. لماذا بايثون؟ إنّ تحديد أفضل لغة برمجة للتعلم قد يكون مهمة صعبة ولو سألت عدة أشخاص عن لغة البرمجة التي يجب تعلمها، فستحصل على عدة إجابات، ويكفي أن تدخل على جوجل وتكتب أفضل لغة برمجة، وستجد آراءً مختلفةً، وجدالًا لا ينتهي حول هذا الموضوع. لا أريد أن أبدأ حرب لغات البرمجة هنا، ولكنني سأحاول في هذه الفقرة تقديم بعض الحجج لتبرير لماذا أرى أنّ بايثون هي لغة المستقبل، وأن تعلم لغة بايثون مثالي للمبتدئين الذين يريدون دخول عالم البرمجة وعلوم الحاسوب. شعبية لغة بايثون بحسب استطلاع موقع stackoverflow، تحتل لغة بايثون المرتبة الرابعة في لغات البرمجة الأكثر استخدامًا من قبل المبرمجين والمطورين حول العالم بعد JavaScript و HTML/CSS و SQL، متفوقة على لغات مثل جافا و ++C و C#‎‏‎‏‎‎‎‎، كما أنها سادس أكثر لغة برمجة مرغوبة من قبل المبرمجين. فبايثون ليست لغة قوية وفعالة فحسب، بل هي فوق ذلك محبوبة من قبل المبرمجين، ولا عجب في ذلك فهي سهلة ومرنة وتوفر مكتبات هائلة للمبرمجين تسهل عليهم الكثير من الجهود في كتابة الكود، فهل لا يزال لديك شك في أن تعلم لغة بايثون هو خيار مثالي لك؟! يوضح المخطط التالي إحصائية أجرتها منصة StackOverlow عام 2022 عن أكثر لغة شعبية مفضلة في أوساط المبرمجين وموضع لغة بايثون فيها: كما يوضح المخطط التالي إحصائية أخرى أجرتها منصة StackOverlfow أيضًا عام 2022 عما إذا كانت لغة البرمجة محبوبة (الأزرق) أم مخفية (البنفسجي) وللغة بايثون نصيب جيد من المحبوبية: دعم لغة بايثون نظرًا لشعبيتها الكبيرة، تتمتع بايثون بدعم جيد على جميع المستويات تقريبًا. وباعتبارها اللغة المفضلة للمبتدئين، فهناك مجتمع داعم كبير ومتعاون وكم هائل من المراجع والمواد والدورات التعليمية التي تشرح مفاهيم البرمجة الأساسية، إضافة إلى صياغة اللغة وتطبيقاتها. فسواء كنت هاويًا، وتحب تعلم البرمجة كهواية، أو لأجل استخدامها في مجال عملك، مثل تحليل البيانات ومعالجة اللغات الطبيعية وغير ذلك، أو كنت تريد أن تعمل كمستقل، أو تدخل سوق العمل وتحقق دخلًا من البرمجة، ففي جميع هذه الحالات، سيكون تعلم لغة بايثون خيارًا مثاليًا لك. بايثون مطلوبة في السوق تُستخدم لغة بايثون من قبل بعض أكبر الشركات في مجال التكنولوجيا، مثل Uber و PayPal و Google و Facebook و Instagram و Netflix و Dropbox و Reddit. إضافةً إلى هذا، تُستخدم بايثون بكثافة في مجال الذكاء الاصطناعي والتعلم الآلي وتحليل البيانات ومراقبة الأنظمة وغير ذلك. يقدر موقع stackoverflow، الدخل السنوي لمطوري بايثون بحوالي 71 ألف دولار، وبالرغم من أن الاستبيان الذي أجراه الموقع مبني على مشاركين معظمهم من الولايات المتحدة والهند وألمانيا ولا يعكس الرواتب في منطقتنا العربية إلا أن الرقم كبير بالمقارنة مع باقي المهن، ويدل على أهمية هذه اللغة وأجرها المرتفع في سوق العمل. ولا ننسى أن لغة بايثون كما أشرنا لغة عامة الأغراض وقادرة على إيجاد الحلول الفعالة في العديد من المجالات المختلفة وهذا من شأنه بكل تأكيد حث أرباب العمل على توظيف مطوري بايثون والاستفادة من مهاراتهم وخبراتهم في عدة مجالات. أهمية تعلم لغة بايثون قد تمكنت لغة بايثون طيلة هذه السنوات من لحظة انطلاقها إلى اليوم من إثبات إمكانياتها لتعد واحدة من أهم لغات البرمجة وأكثرها شعبية وجدارة كما أشرنا، ويبرز اسمها بين أوساط المبرمجين والمطورين والطلاب على حد سواء كما أن مختلف الجامعات بدأت بتدريسها في الفصول الأولى للطلاب وتراها المخيمات والدورات البرمجة خيارها الأول لتعليم البرمجة لغير المختصين. أضف إلى ذلك أن لغة بايثون نالت ثقة الكثير من المواقع والشركات العملاقة واليوم تستخدمها كل من شركات Spotify و Google و Amazon بشكل أساسي إضافة إلى Facebook التي تستخدم بايثون لمعالجة الصور وإدارة بنيتها التحتية، وفي كل يوم تتحول شركات جديدة معروفة عالميًا إلى استخدام بايثون مثل YouTube و DropBox و Instagram التي قررت كذلك استخدامها وفضلتها على PHP. كما تُستخدم لغة بايثون أيضًا من قبل بعض الجهات العلمية والبحثية، مثل وكالة الفضاء الأمريكية ناسا، والتي لها مستودع خاص بالمشاريع المُطورة ببايثون كما أنها تقدم دورات تدريبية لتعليم لغة بايثون من الصفر للاحتراف لعلمائها ومهندسيها ليتمكنوا من معالجة بياناتهم بشكل أفضل وأسرع. كيفية تعلم لغة بايثون تعرفت إلى الآن على بايثون وأهميتها ومميزاتها واستخدامات لغة بايثون المختلفة وفرص العمل فيها، واقتنعت بأهمية تعلم لغة بايثون لذا قد تتساءل من أين تبدأ؟ سأجيبك في هذا القسم بالتفصيل. هنالك مساران لتعلم البرمجة عمومًا وتعلم لغة بايثون خصوصًا، إما في أروقة الجامعة أو عبر دورات متخصصة، أما في مسار الجامعة فستتكفل بوضع خطة تعلم عبر فصولها وسنواتها وفي كل الأحوال قد تلجأ إلى الدورات حتى لو دخلت الجامعة بسبب الكم النظري الكبير الذي تعطيه الجامعة غافلة الجانب العملي التطبيقي أو بسبب نسيان اللغة وعدم البرمجة فيها إن جرى تدريسها في السنوات الأولى وهنا تجد نفسك تبحث عن دورات برمجة متخصصة. سأختصر عليك الطريق وأشير إلى أفضل دورة برمجة متخصصة لتعلم لغة بايثون وهي دورة تطوير التطبيقات بلغة بايثون من أكاديمية حسوب وهي دورة منهجية شاملة بعدد ساعات يزيد عن 60 معدة من قبل مبرمجين أكفاء تأخذ بيدك خطوة بخطوة لتعلم لغة بايثون من الصفر وحتى الاحتراف وتبني خلالها الكثير من التطبيقات العملية، وهي كفيلة بأن تؤهلك لبدء حياتك المهنية كمطور بايثون ودخول سوق العمل والحصول على أول وظيفة خلال ستة أشهر. وإن كنت ممن يفضلون التعلم من خلال الكتب الإلكترونية لما توفره من شمولية وتنظيم في المعلومات، فيمكنك تنزيل كتاب البرمجة بلغة باثيون من أكاديمية حسوب. هل تريد المزيد من المصادر؟ ما رأيك بزيارة موسوعة حسوب الشاملة التي تضم توثيقات الكثير من لغات البرمجة، بما في ذلك توثيق لغة بايثون. ننصحك أيضًا بالاطلاع على قسم دروس ومقالات متنوعة حول لغة بايثون وهذه الدروس تُحدَّث باستمرار لذا كن على اطلاع دائم عليها لتواكب كل جديد وإن كنت مهتمًا بتعلم لغات برمجة أخرى، فيمكنك زيارة قسم البرمجة في الأكاديمية. وإن أشكل عليك شيء ما فيمكنك أن تسأل عنه في قسم الأسئلة والأجوبة الخاص بالأكاديمية ليجيبك عنه أحد المبرمجين أو تطرحه للنقاش مع المهتمين في مجتمع حسوب IO. نصائح لتعلم لغة بايثون أخيرًا وليس آخرًا، إليك أهم النصائح التي عليك اتباعها لتعلم لغة بايثون من الصفر حتى الاحتراف. 1. حدد المجال الذي تريد التخصص فيه مجالات العمل في بايثون متنوعة وتحديد المجال أو المسار الوظيفي الذي تنوي التخصص فيه سيمكنك من تحديد المفاهيم والمهارات الفنية التي يتوجب عليك تعلمها والتركيز عليها دون سواها، وضع خطة زمنية لإتقان جميع المهارات اللازمة لتحقيق هدفك والتزم بها قدر المستطاع. فإذا كان هدفك من تعلم بايثون هو إنشاء مواقع ويب ضع في خطتك تعلم Django أو Flask، وإذا كان هدفك هو تطوير الألعاب فضع في خطتك التعرف على إحدى المكتبات القوية في تطوير الألعاب مثل Pyglet أو Panda3D أو Pygame ...إلخ. 2. تعلم أساسيات لغة بايثون أيًا كان المجال الذي حددته في الخطوة السابقة فلا بد لك في البداية من تعلم أساسيات لغة البايثون التي تمثل أساسًا لأي لغة برمجة والتي تشمل: طريقة تثبيت لغة بايثون على جهازك وإنشاء بيئة افتراضية. صياغة الجمل والعبارات في بايثون تعريف المتغيرات وأنواع البيانات الأولية. العمليات الحسابية والمنطقية الأساسية. عمليات الإدخال والإخراج ومفهوم الاستثناءات وطرق معالجتها. الدوال البرمجية وطريقة تعريفها واستدعائها. هياكل البيانات المركبة مثل القوائم والمجموعات والقواميس تعليمات التحكم بتدفق البرنامج مثل التعليمات الشرطية والحلقات التكرارية. مفاهيم البرمجة كائنية التوجه أهم المكتبات القياسية التي تستخدم في العديد من المشاريع. طرق التعامل مع الملفات. الخبر الجيد هنا أن تعلم هذه الأساسيات لن يستغرق منك الكثير من الوقت لأن بايثون كما أشرنا لغة سلسة وبسيطة وسهلة التعلم. 3. تعلم المواضيع المتقدمة التي تخدم أهدافك بعد إتقان المفاهيم الأساسية عليك الانتقال خطوة للأمام والتعرف على مواضيع متقدمة تتعلق بشكل مباشر بالتخصص الذي تنوي العمل به والمسار هنا يختلف حسب التخصص الذي اخترته لنفسك والبدء بإتقان جميع المهارات اللازمة لتحقيق هدفك. يمكنك في هذه المرحلة على سبيل المثال التعرف على مفاهيم مثل قواعد البيانات والتعامل معها، وتعلم مكتبات بايثون والتدريب على استخدامها من خلال تطبيقها في برامج عملية بالطبع ستتطلب المشاريع المختلفة مكتبات مختلفة لذا من المهم التعرف على المكتبات الأكثر شيوعًا في مجالك والتركيز عليها. كما ستحتاج لتعلم أحد أطر عمل بايثون Python Frameworks التي تساعدك على تطوير مشاريعك وكما ذكرنا بالنسبة للمكتبات ستعتمد الأطر التي عليك تعلمها على التخصص الذي تنوع العمل به. 4. عزز ما تعلمته في مشاريع عملية يفترض الآن أنك تملك كافة المهارات اللازمة والأسس النظرية، لكن المعرفة التقنية وحدها لا تكفي لذا حان الوقت لبدء التدرب على تطوير مشاريع لصقل كل هذه المهارات. لذلك من الضروري أن تتدرب على تطوير مجموعة من المشاريع في مجال تخصصك وتبني معرض أعمال يظهر هذه المهارات فهذا يعزز فرصتك للحصول على وظائف فعلية وبدء حياتك المهنية كمطور بايثون. يمكنك ريثما تحصل على فرصة عمل مناسبة أن تعمل بشكل مستقل على مواقع العمل الحر مثل مستقل وخمسات وتنجز المشاريع للعملاء عبر هذه المنصات. 5. لا تهمل مهاراتك الناعمة لاشك أن المهارات الفنية ومعرض الأعمال القوي أمر ضروري لأي مبرمج لكن هناك نوعًا آخر من المهارات الضرورية لأي مبرمج والتي يفضل أصحاب العمل توفرها لدى المطورين والمبرمجين وأهمها: مهارات حل المشكلات والتفكير المنطقي الرغبة في التعلم المستمر والاطلاع على كل جديد في مجالك. مهارات التواصل الفعال والعمل الجماعي خاتمة تعرفنا في مقال اليوم على لغة بايثون ورأينا كيف أنها تجمع بين البساطة والسهولة من جهة وبين القوة والفعالية من جهة أخرى، وتعرفنا على أهم مميزات بايثون ومستقبلها الواعد الذي يفتح لمتعلمها الكثير من الفرص والآفاق. وختمنا المقال بأهم الخطوات والنصائح لتتعلم بايثون بسرعة واحترافية. هل أنت متحمس لتعلم بايثون أو بدأت فعلًا بتعلمها ولديك أي استفسار حول أي من المواضيع التي ذكرناها في المقال؟ اكتبها في قسم التعليقات أسفل المقال وسنحرص على الإجابة عليها بأقرب فرصة. وفّقك الله تعالى.
    4 نقاط
  4. نعيش اليوم في عصر يتصف بتفجر غير مسبوق في كمية البيانات، فكل الأجهزة التي نتعامل معها في حياتنا اليومية سواء هواتفنا الجوالة أو مواقع التجارة الإلكترونية التي نتسوق منها أو شبكات التواصل الاجتماعي التي نتصفحها بشكل يومي وحتى أجهزة الاستشعار الموجودة في أجهزة إنترنت الأشياء التي باتت منتشرة في كل مكان حولنا…إلخ. كلها تتعقبنا وتسجل بياناتنا والإجراءات التي نقوم بها والخيارات التي نتخذها ولك أن تتخيل كمية البيانات المهولة التي تولد عن كل هذا طوال الوقت! هذه البيانات الضخمة في شكلها الأولي لا تعني أي شيء في الواقع لذا كان لا بد من تحليلها واستخراج المعلومات المفيدة منها وهنا يأتي دور علم البيانات الحديث الذي يعالج كل جزء من البيانات التي يتم إنشاؤها اليوم لتطوير وتيرة الأعمال واتخاذ القرارات الصائبة والموثوقة التي تعتمد على هذه المعلومات. سنركز في مقال اليوم على أحد التخصصات المهمة في هذا العلم وهو تحليل البيانات Data analysis وهو التخصص الذي يهتم باستخلاص معلومات ذات قيمة من هذه البيانات الخام ونوضح أهميته في عالم الأعمال اليوم ونكتشف أهم الأدوات والتقنيات والمهارات التي تحتاجها لتصبح محلل بيانات محترف، كما سنكتشف أهم الفروقات بين علم البيانات وتحليل البيانات وهندسة البيانات ونسرد بعض الأمثلة الواقعية على شركات تستخدم تحليل البيانات لتحسين أعمالها بأسلوب بسيط وسهل الفهم بعيدًا عن المصطلحات المعقدة. ما هو تحليل البيانات؟ علم تحليل البيانات Data analysis هو تنظيف وتحويل ونمذجة البيانات حتى تحويلها أخيرًا إلى معلومات مفيدة تساعد في اتخاذ قرارات أو توضيح رؤى، حيث يهدف إلى تحويل البيانات إلى معلومات والفرق بين البيانات والمعلومات هو أن الأولى عبارة أن أجزاء بيانات متناثرة تفتقد المعنى مثل عدد 25 أو اسم أحمد بينما الأخيرة هي بيانات لها معنى مثل أن العدد 25 هو عمر أحمد فأصبح له معنى، هذا على مستوى عدد فكيف لو كان لدينا آلاف أو ملايين البيانات والأعداد المماثلة، تخيل! يقوم محللو البيانات باستخراج البيانات الأولية وتنظيمها ثم تحليلها وتحويلها من أرقام غير مفهومة إلى معلومات مفسرة وواضحة وبعد الانتهاء من تفسير البيانات تصاغ النتائج التي تم التوصل إليها بشكل اقتراحات أو توصيات حول الخطوات التالية التي يجب اتخاذها في العمل وتتقاطع هذه المهام مع مهام مهندسي البيانات. يمكنك التفكير في مجال تحليل البيانات كشكل من أشكال ذكاء الأعمال أو ما يعرف استخبارات الأعمال Business intelligence واختصارًا BI، وهو علم يستخدم لحل مشاكل وتحديات معينة داخل المؤسسات والشركات، وتكمن أهميته وقوته في العثور على مجموعات وأنماط البيانات التي يمكنها أن تخبرنا بشيء مفيد وملائم حول مشكلة أو أمر معين من العمل يخص العملاء أو الموظفين أو المنتجات أو المخزون …إلخ. ولا يساعد هذا العلم على فهم السلوك الماضي فحسب بل يمكّننا من التنبؤ بالاتجاهات والسلوكيات المستقبلية وبهذا تكون أي قرارات تتخذ مدروسة بناءً على ما تخبرنا به البيانات وليست مجرد قرارات تعتمد على التخمين والحدس. الفرق بين علم البيانات وتحليل البيانات لا بد أن نعرف قبل الغوص في الفرق بين علم البيانات وتحليل البيانات أنّ كلا العلمين يتعامل مع البيانات الضخمة لكن لكل منهما نهجه الخاص. وعمومًا يشكل علم البيانات مظلة تضم تحتها علم تحليل البيانات وتستفيد من إمكاناته لكنه يغطي مجالًا أوسع في التعامل مع البيانات. يركز علم البيانات على إيجاد ترابط منطقي بين كم هائل من البيانات، بينما صمم تحليل البيانات لإيجاد ميزات الرؤى المستخلصة من تلك البيانات. بكلمات أخرى: هو فرع من علم البيانات يُعنى بالإجابة عن أسئلة محددة يطرحها علم البيانات وكيفية إنجاز أو تطبيق هذه الإجابات. يقضي الفرق بين علم البيانات وتحليلها اختلافًا في الطرق المستخدمة في العمل، إذ يستخدم عالم البيانات مثلًا الرياضيات والإحصاء وخوارزميات تعلم الآلة لتصحيح وتنظيف ومعالجة وتفسير البيانات الخام لاستخلاص الرؤى منها وإنجاز نماذج أولية توضح الترابط بين البيانات المدروسة. أما محلل البيانات فهو من يتفحص مجموعات البيانات ليجد مدلولها ويخلص بنتائج ملموسة، إذ يجمّع محلل البيانات كميات كبيرة من البيانات المهيكلة ثم ينظمها ويحللها ليتعرف على الأنماط التي يبحث عنها ثم يحاول بعد ذلك تصوير هذه الأنماط بعرضها على شكل مخططات ورسومات وغير ذلك. باختصار ينقب علم البيانات في البيانات الخام بحثًا عن رؤى وأفكار بينما يُستخدم تحليل البيانات في نقل هذه الرؤى والأفكار التي قد تبدو معقدة إلى لغة أبسط يفهمها التقنيون وغير التقنيين في المؤسسة التي طلبت الدراسة ويطورون أنظمة لأتمتة وتحسين الأداء العام للعمل مع البيانات. أفردنا لعلم البيانات مقالًا مفصلًا بعنوان علم البيانات Data science: الدليل الشامل يمكنك الرجوع إليه للاستزادة عن علم البيانات. أهمية تحليل البيانات في شركات الأعمال تبرز أهمية تحليل البيانات في المقام الأول بسبب الكمية الضخمة من البيانات التي تجمع في مختلف المنظمات ومؤسسات العمل فعلى سبيل المثال تقوم شركات البيع بالتجزئة اليوم بجمع وتخزين كميات هائلة من البيانات وتتعقب أي منتجات أو خدمات قمت بتصفحها وشرائها وتسجل كافة الصفحات التي قمت بزيارتها على مواقعها الإلكترونية وتتعقب القنوات التي اشتريت منها وتتعرف على عاداتك في الإنفاق وتجمع كل شاردة وواردة عنك! هذه البيانات التي تجمع بكميات مهولة هي واحدة من أهم أصول الشركات التجارية وأكثرها استراتيجية في عالم الأعمال لكن هل تساءلت لماذا تتنافس الشركات فيما بينها لجمع كل هذه المعلومات؟ لأن التنقيب في هذه البيانات وتحليلها وفهمها يساعدها على استخراج كنوز منها وهذه الكنوز هي معلومات قيمة تساعد أصحاب العمل على اتخاذ أفضل القرارات وتطوير الأداء بشكل مضمون. فالحصول على البيانات وجمعها لا يكفي وحده وهو ليس الغاية في الواقع فماذا يفعل صاحب العمل بكميات مهولة من البيانات المختلفة في بنيتها والتي قد تكون في كثير من الأحيان مكررة أو ربما ناقصة أو غير دقيقة، صاحب العمل يريد في النهاية الخلاصة أو بكلام آخر يريد القصة التي ترويها هذه البيانات والمستنتجة من كل هذا الزخم كي يبني عليها قرارًا صائبًا بشأن الميزانية أو الأسعار أو الموارد وفي نهاية المطاف يسعى في المقام الأول لزيادة أرباحه النهائية وهنا يبرز دور علم البيانات وتحليل البيانات. فشركات البيع على سبيل المثال قادرة الاستفادة من تحليل هذه البيانات في معرفة العادات الشرائية لعملائها وتوصيتهم بأنسب المشتريات وتحديد التحسينات الأنسب في أسعارها وتتبع مخزونها وكشف عمليات الاحتيال ومقارنة مستوى المبيعات وغير ذلك الكثير. وكي تتمكن الشركات من ذلك يجب أن تتمكن من صياغة البيانات وتمثيلها بشكل تقارير مناسبة توضح لصناع القرار في مجال الأعمال المغزى منها وتمكنهم على فهم دلالاتها واتخاذ إجراءات موثوقة وسريعة بالاعتماد عليها وإحداث تغيير إيجابي داخل الشركات لذا تلجأ إلى تحليل البيانات الذي يفسر لأصحاب العمل كل ما تحاول البيانات إخبارهم به. مهام محلل البيانات يلعب محلل البيانات دورًا حيويًا ومهمًا في الشركات والمنظمات ويساعدها على فهم البيانات الضخمة المتوفرة لديها ويتعاون مع باقي أعضاء فريق البيانات للمساعدة في استخراج عن أي معلومات مفيدة وقيمة. كما يقوم محلل البيانات بجمع وتحليل البيانات لحل مشكلة معينة ويكون مسؤولًا عن تحويل البيانات الأولية إلى رؤى ذات مغزى ويستخدم البيانات والأفكار التي توفرها عملية تحليل البيانات لحل مشاكل محددة أو الإجابة على أسئلة محددة. وإليك قائمة بأهم المهام التي يقوم بها محلل البيانات: جمع البيانات الأولية معالجة البيانات ضمان أمن وخصوصية البيانات نمذجة البيانات فهم وتفسير البيانات عرض البيانات نستعرض في الفقرات التالية المزيد من التفاصيل حول كل مهمة من هذه المهام. 1. جمع البيانات الأولية الخطوة الأولى هي جمع البيانات الخام ويمكن أن يقوم محلل البيانات بهذه المهمة ويجمع المعلومات المطلوبة فالبيانات التي سيحللها قد تكون موجودة في مصادر مختلفة، فهي إما أن تكون موجودة في قواعد بيانات الشركة مبعثرة هنا وقد يحتاج لجمعها من خلال إجراء استطلاعات الرأي أو من خلال تتبع بيانات زوار موقع الشركة على الويب، أو من خلال الاستعانة ببيانات الشركات المنافسة حيث يمكن للشركات تبادل البيانات فيما بينها لتحقيق مصالح مشتركة. 2. معالجة البيانات بعد جمع البيانات يجب على محلل البيانات البدء بتنظيف وإعداد هذه البيانات الأولية لأنها في الغالب تحتوي على نسخ مكررة أو قيم خاطئة أو غير دقيقة أو مفقودة للحصول على بيانات سليمة وموثوقة ومفهومة وذات جودة عالية وقد يحتاج إلى تحويل البيانات من هيكل إلى آخر أو من نوع إلى آخر حتى يصبح من الممكن التعامل معها بإحدى لغات البرمجة أو تخزينها في قواعد البيانات كي تكون تفسيرات هذه البيانات دقيقة فإذا لم تكن البيانات التي نبني نحللها نظيفة وصحيحة لن تكون التحليلات والنتائج التي تحصل عليها دقيقة. أحيانًا وفي الشركات أو المشاريع المتوسطة إلى الكبيرة يتولى هذه المهمة مهندس البيانات الذي يركز على هذه المهمة نظرًا لكبر المشروع أو ضخامة البيانات بينما يركز محلل البيانات على عملية التحليل بعيدًا عن عملية الجمع والمعالجة والتجهيز الذي يكون دوره تاليًا. 3. ضمان أمن وخصوصية البيانات قد يحتاج محلل البيانات لإخفاء هوية البيانات الحساسة والشخصية أو حذفها بالكامل لمنع الآخرين من الاطلاع عليها عندما لا تكون هناك حاجة لها للحصول على النتيجة التي يريدها، وأيضًا قد يتولى مهندس البيانات هذه المهمة وتأتي البيانات مشفرة ومحمية إلى محلل البيانات ليقوم بالخطوات التالية. 4. نمذجة البيانات الخطوة التالية هي تحليل وتحديد نقاط البيانات المختلفة التي تم جمعها وإنشاءها بواسطة محللي البيانات واختيار أنواع البيانات المراد تخزينها وجمعها وإنشاء علاقات بينها وتحديد كيفية ترابط مجموعات البيانات مع بعضها البعض وكيفية عرض هذه البيانات وتساعد النمذجة الصحيحة للبيانات على تسريع وتيرة فهمها وإعداد التقارير الخاصة بها. 5. فهم وتفسير البيانات بعد نمذجة البيانات تأتي الخطوة التالية وهي تفسير هذه البيانات من خلال تحديد الأنماط أو الاتجاهات في البيانات التي يمكنها أن توفر معلومات مفيدة تُستخلص منها إجابات على أسئلة توضح سلوكيات أو تفسر أسباب لمشكلات تخص العمل كما تُبنى عليها قرارات وغيرها. 6. عرض البيانات الخطوة الأخيرة والضرورية التي يتوجب على محلل البيانات القيام بها هي عرض وتقديم البيانات بشكل يضفي عليها الحيوية فالمعلومات التي حصلت عليها يجب أن تصاغ على هيئة مخططات ورسوم بيانية وتقارير مكتوبة بألوان متناسقة وخطوط مفهومة ثم تقدم لأصحاب العمل المهتمين لمساعدتهم على فهم ما تعنيه هذه البيانات وتمكينهم من اتخاذ قرارات دقيقة وحيوية بشأنها. مجالات تحليل البيانات نظرًا للتطور التقني الحاصل في عصرنا الراهن فقد أصبح جمع البيانات وفرزها وتحليلها أمرًا ضروريًا لأي مجال من مجالات الحياة وبات من الضروري توظيف محللي البيانات في كافة قطاعات العمل، وفيما يلي نستعرض بعض المجالات والتخصصات التي يمكن لمحللي البيانات العمل فيها. محلل الأعمال محلل الأعمال هو المسؤول عن تحليل ومعالجة البيانات التي تساعد الشركات والمؤسسات على تفسير وتوثيق العمليات التجارية والمنتجات والخدمات والبرامج ويتمثل دوره الأساسي في زيادة كفاءة الأعمال. محلل تسويق محلل التسويق أو محلل أبحاث السوق هو الشخص المسؤول عن جمع وتحليل بيانات المنافسين والعملاء فهو يدرس المنافسين ويبحث عن تفضيلات العملاء وظروف العمل واتجاهات السوق وأي معلومات أخرى تساعد في جهود التسويق للشركة مثل تحديد المبيعات المحتملة لمنتج أو خدمة ما أو تحديد المنتجات التي يفضلها الناس وتقدير تكلفتها وتحديد الفئات التي ستشتريها ويسعى بشكل أساسي لزيادة الإيرادات وتحسين الحملات التسويقية. محلل العمليات محلل العمليات أو محلل أبحاث العمليات هو المسؤول عن تحليل وتقييم البيانات بهدف تحسين العمليات التجارية وحل المشكلات الداخلية وضمان سير عمليات الشركة بسهولة وسلاسة وإنشاء نماذج التسعير والتسويق، فهو من يحدد الحملات التسويقية التي ستجلب عملاء جدد ويجد الطرق الأنسب لخفض التكاليف دون المساس بجودة المنتج أو الخدمة التي تقدمها الشركة. محلل نظم تقنية المعلومات يعرف محلل نظم تقنية المعلومات أيضًا باسم محلل النظم وهو متخصص تقني لديه معرفة واسعة بأنظمة التشغيل والبرامج والأنظمة الأساسية ومهمته الأساسية تحليل وتصميم وتنفيذ نظم المعلومات والعمل على مشاكل العمل باستخدام التقنيات والأدوات التي يحترفها. المحلل المالي المحلل المالي Financial Analyst هو شخص مسؤول عن جمع البيانات وتنظيم المعلومات وتحليل البيانات المالية السابقة للعملاء والشركات بهدف تقديم المشورة الأفضل حول كيفية إنفاق الأموال لتعظيم الأرباح وتقييم نتائج السندات والأسهم والاستثمارات الأخرى. محلل كميات محلل الكميات أو المحلل الكمي quantitative analyst هو شخص متخصص في حل المشكلات المالية وإدارة المخاطر باستخدام الأساليب الرياضية والإحصائية فهو يطور وينفذ نماذج متقدمة تساعد المؤسسات والشركات التي تعمل في مجال الاستثمار وتداول الأوراق المالية مثل شركات التأمين وشركات المحاسبة وشركات البرمجيات المالية على اتخاذ القرارات المناسبة وتحديد فرص الاستثمار والتسعير المناسبة وإدارة المخاطر. محلل ذكاء الأعمال محلل ذكاء الأعمال business intelligence يحلل تقارير أبحاث السوق التي تسلط الضوء على أنماط السوق والاتجاهات التي قد يكون لها تأثير على عمليات الشركة وأهدافها المستقبلية ويعرض النتائج على الجمهور المناسب. محلل استراتيجي محلل استراتيجيات الشركة هو المختص في حل مشاكل العمل فهو يعتمد على تحليل البيانات التي تمكنه من توفير نتائج مفيدة تساعد الشركات على اتخاذ قرارات أفضل ومعالجة التحديات التي تواجهها وتحديد فرص النمو الجديدة للشركة وتطوير الخطط التي تحدد أفضل الطرق والاستراتيجيات لتحقيق الأهداف. محلل طبي يهتم المحلل الطبي أو محلل الرعاية الصحية بجمع وتنظيم وتحليل وتفسير البيانات الطبية مثل بيانات المرضى والعلاجات والمنتجات الطبية لتحسين العمليات التجارية للمستشفيات والمرافق الطبية وتطوير أدائها. محلل الأمني فحص المحلل الأمني البيانات لفحص أي تهديدات محتملة وتحديد ما إذا كان هناك هجوم قد وقع أو على وشك الوقوع. قد يستخدمون أيضًا معرفتهم الإحصائية والرياضية لتطوير طرق جديدة لجمع البيانات حول تهديدات محددة أو هجمات محتملة. مدير تحليل البيانات يوجه مدير تحليل البيانات فريق محللي البيانات في مقر العمل وينسق العمل بينهم ويشرف على عمليات تحويل البيانات الأولية إلى رؤى تجارية يمكن استخدامها لاتخاذ القرارات ويساعد في التوصية بحلول لإنجاز العمل والبحث عن طرق فعالة لجمع البيانات وإنشاء وتطوير النماذج الإحصائية المعقدة واستخدام الخوارزميات والاستراتيجيات الفعالة لتحليل البيانات. مسؤول قاعدة البيانات يراقب مسؤول قاعدة البيانات قاعدة البيانات ويهتم بسلامة بياناتها وسلامة الأجهزة التي توجد عليها وهو يشارك في معالجة البيانات وتحويلها والتحقق من صحتها وتنظيفها لتلبية احتياجات العمل والمتطلبات كما يهتم بأمن هذه البيانات ومنح الوصول لها واستخدامها وفق احتياجات ومتطلبات العمل فقط وتقييد وصول المستخدمين غير المصرح بهم إليها. أنواع تحليل البيانات يقسم تحليل البيانات إلى خمس مكونات أو أنواع وهي كالتالي: التحليل الوصفي Descriptive التحليل التشخيصي Diagnostic التحليل التنبؤي Predictive التحليل التقديري Prescriptive التحليل الإدراكي أو المعرفي Cognitive وكلما كان محلل البيانات أكثر خبرة كلما كان قادرًا على تحديد النوع الصحيح من التحليلات بما يتناسب واحتياجات العمل كي يضمن تحقيق أقصى استفادة من البيانات التي تمتلكها المؤسسة وبالتالي تحقيق أفضل النتائج من هذا التحليل. دعنا نتعرف بالتفصيل على طريقة إجراء كل نوع من هذه التحليلات وأهميتها في مكان العمل. 1. التحليل الوصفي Descriptive Analytic التحليل الوصفي هو نوع التحليل الأبسط والأكثر استخدامًا فهو يمكن محلل البيانات من تحليل البيانات المتوفرة باستخدام أدوات تحليل مثل Google Analytics التي تمكنه من فهم ما جرى في مؤسسته أو شركته، فالتحليل الوصفي يوفر لمحلل البيانات الإدراك المتأخر لما يجري في العمل. على سبيل المثال إذا كنت محلل بيانات وحصل انخفاض مفاجئ في مبيعات موقع التجارة الإلكترونية الخاص بشركتك في شهر ما لن تقف مكتوف الأيدي لتنتظر هل ستتحسن المبيعات في الشهر التالي بل عليك استخدام التحليلات الوصفية لتحليل بيانات كافة الأشخاص الذين زاروا الموقع في هذا الشهر لمعرفة سبب ما حدث وهل هو ناتج عن انخفاض في عدد زيارات الموقع أو خطأ في أحد الصفحات أو مرتبط بموسم محدد وتعثر على إجابة لكافة التساؤلات حياله ووصف النتائج التي حصلت عليها لأصحاب العمل. يمكن أن تستعين في إجراء هذه المهمة بأدوات التحليل مثل جوجل أناليتكس Google Analytics وتستسخدم مؤشرات قياس الأداء الرئيسية KPIs التي تمكنك من تتبع الأداء ومعرفة مدى نجاح وفشل الأهداف الرئيسية. فالتحليلات الوصفية باختصار تساعد في معرفة ما حدث في السابق مثل انخفاض المبيعات أو زيادة الإيرادات أو نقص الموارد وتلخص مجموعات البيانات الكبيرة وتصف النتائج التي تم التوصل لها لأصحاب العمل وتستفيد منها في معرفة أسباب النجاح أو الفشل السابق وإنشاء تقارير بها. هذا النوع من التحليل على أهميته يعطي المحلل نظرة ثاقبة فقط حول ما إذا كان كل شيء في العمل يسير على ما يرام أم لا، لكنه في الواقع لا يفسر السبب الجذري لوقوعها لذا تعمد الشركات عادة على الدمج بين هذا النوع من التحليل وأنواع التحليلات الأخرى للحصول على رؤية أفضل. 2. التحليل التشخيصي Predictive Analytic التحليلات التشخيصية هي الشكل الثاني لتحليل البيانات وهي تساعد أصحاب الأعمال في الإجابة عن السبب الأساسي في وقوع حدث ما أو العوامل التي تؤثر على سير العمل، فعندما يعرف محلل البيانات ما يحدث بالفعل في عمله باستخدام التحليلات الوصفية لكنه يريد أن يعرف الأسباب والعوامل التي تسببت بحدوثها بشكل جذري يأتي دور التحليل التشخيصي للإجابة عن أسئلة حول سبب وقوع الأحداث. على سبيل المثال كي يشخص محلل الأعمال إن كانت زيادة الأسعار الأخيرة على أسعار منتجات الشركة لها علاقة بانخفاض المبيعات يمكنه استخدام التحليل التشخيصي باستخدام برنامج إحصائي مثل Microsoft Excel أو يستخدم خوارزمية معينة تمكنه من تحليل بيانات المنتجات والعملاء وفحصها ومقارنتها للعثور على الإجابة الدقيقة. هناك العديد من المفاهيم الإحصائية التي يجب على محلل البيانات فهمها قبل أن يتمكن من إجراء التحليلات التشخيصية وأهمها اختبار الفرضيات والفرق بين الارتباط والسببية وتحليل الانحدار التشخيصي. تكمل تقنيات التحليلات التشخيصية التحليلات الوصفية الأساسية حيث يساعد دمج التحليلات التشخيصية والوصفية الشركات في العثور على العلاقات بين الأسباب والنتائج وفحص مؤشرات الأداء لاكتشاف سبب التحسن أو التراجع بدقة. بشكل عام تحدث هذه العملية في ثلاث خطوات: تحديد الشذوذ في البيانات فقد تكون هذه الحالات الشاذة تغييرات غير متوقعة فيمقياس أو سوق معين. جمع البيانات المتعلقة بهذه الحالات الشاذة. استخدم التقنيات الإحصائية لاكتشاف العلاقات والاتجاهات التي تشرح هذه الحالات الشاذة. 3. التحليل التنبؤي Predictive Analytic يساعد التنبؤ بالمستقبل أصحاب الأعمال على توقع اتجاهات السوق وسلوكيات العملاء وكشف حالات الاحتيال قبل وقوعها وتحليل المنافسين لتحسين وبناء استراتيجيات حديثة لتحسين نتائج الأعمال. يعتمد التحليل التنبؤي على النتائج التي تم الحصول عليها من التحليل الوصفي والتشخيصي ويستخدم للعثور على إجابات حول الأمور التي من المحتمل أن تحدث في المستقبل بناءً على النتائج والأنماط السابقة. على سبيل المثال يمكن استخدام التحليل التنبؤي في الشركات والبنوك لتحليل التركيبة السكانية للعملاء وسجلات الدفع السابقة والمنتجات التي اشتروها وأي سلوكيات سلبية حديثة وقعت من قبلهم لتوقع العملاء الذين سيتأخرون في دفع المستحقات والفواتير المترتبة عليهم ولن يسددوها في الوقت المحدد مما يمكنهم من إدارة التدفقات المالية بشكل أفضل واتخاذ خطوات للتخفيف من حدوث هذه المشكلة مثل تقديم خيارات دفع أخرى أو إرسال رسائل تذكير إلى العملاء الذين تم التنبؤ بأنهم سيتأخرون في تسديد المستحقات وتحديد أفضل تاريخ ووقت لإرسال هذه الرسائل وأفضل طريقة للاتصال بهم مثل البريد إلكتروني أو المكالمة الهاتفية أو الرسائل النصية …إلخ. كما تستخدم النماذج التنبؤية بشكل كبير في مجال الرعاية الصحية وتحلل مجموعة من البيانات المتغيرة حول المرضى مثل العمر أو العلاجات السابقة أو تاريخ المرض ومعدل الكوليسترول والوزن للتنبؤ بما إذا كان الشخص عرضة للإصابة بأمراض معينة كالسكري أو النوبات القلبية أم هشاشة العظام أم لا. يعتمد إجراء التحليل التنبؤي على الخوارزميات الإحصائية المتنوعة وعلى تقنيات التعلم الإحصائي وخوارزميات التعلم الآلي مثل الشبكات العصبية وأشجار القرار والانحدار …إلخ. التي تساعد محلل البيانات على تقديم توصيات وتوفير إجابات للأسئلة المتعلقة بما قد يحدث في المستقبل ولكونها تحليلات تعتمد على التخمينات والاحتمالات فهي تعطي نتائج تقديرية قد لا تكون صحيحة ودقيقة بنسبة مئة بالمئة. 4. التحليل التقديري Prescriptive Analytic التحليل التقديري هو الخطوة التالية التي تأتي بعد إجراء التحليل التنبؤي وهو يساعد الشركات على امتلاك رؤية ثاقبة عما يجب عليهم القيام به لحل مشاكل العمل بناءً على العوامل المشتقة من البيانات. فأثناء تحليل البيانات الضخمة لا تكون التنبؤات التي حصلنا عليها من المدخلات دقيقة كما ذكرنا وبالتالي لا يمكننا التيقن من السبب الحقيقي في حدوث مشكلات معينة وهنا يأتي دور التحليلات التقديرية. فعندما يحصل محلل البيانات على النتائج من التحليلات الوصفية والتشخيصية والتنبؤية ويعرف ما حدث ولماذا حدث ويتوقع ما قد يحدث في المستقبل يمكنه أن يستخدم التحليل التقديري لمساعدته في تحديد أفضل مسار للعمل وما الإجراءات التي يجب الإبقاء عليها وما الإجراءات التي يجب التخلي عنها لزيادة نتائج ومخرجات الأعمال. تعتمد تقنيات التحليلات التقديرية على تعلم الآلة لكونها قادرة على تحليل كميات كبيرة من البيانات بسرعة وكفاءة أكبر واختبار مجموعة كبيرة من الشروط والعثور على أنماط محددة في مجموعات البيانات الكبيرة وتقديم التوصيات بناء عليها. على سبيل المثال تستخدم خرائط جوجل التحليل التقديري لمساعدتك على اختيار وتقدير أفضل طريق عليك اتباعه للوصول لوجهتك من خلال الاعتماد على جميع البيانات ذات الصلة مثل المسافة والسرعة وحركة المرور إضافة للمعلومات السابقة المسجلة عن الأشخاص الذي سلكوا هذه الوجهة من قبل. ومن الأمثلة الأخرى على هذا النوع من التحليل توقع توصيات المحتوى المناسب لك على منصات التواصل الاجتماعي من خلال تحليل سجلات سلوكك والمحتوى الذي تشاهده وتتفاعل معه سواء على هذه المنصات نفسها أو على أنظمة أخرى وتمرير سلوكياتك السابقة لخوارزمية محددة تحلل هذه البيانات وتقدر بناء على ذلك نوع المحتوى الذي تهتم به وتقترحه لك. 5. التحليل المعرفي Cognitive Analytic هذا النوع من التحليل هو الأكثر تقدمًا ولا زال في بداياته وهو مستوحى من الطريقة التي يعالج فيها دماغنا البشري البيانات أي أنه يحلل البيانات بذكاء يشبه ذكاء الإنسان فهو يستخلص النتائج ويكتسب الخبرة من التعلم ويطور نفسه مع الزمن، ويساعدك على معرفة ما قد يحدث إذا تغيرت الظروف وتحديد أفضل الطرق للتعامل معها وهو أمر لا تستطيع التحليلات البسيطة القيام به. يعتمد هذا النوع من التحليل مجموعة من التقنيات الذكية مثل الذكاء الاصطناعي وخوارزميات التعلم الآلي ونماذج التعلم العميق والمزيد لمعالجة المعلومات واستخلاص النتائج من البيانات والأنماط الموجودة ويتوقع أن تصبح تطبيقاته واستخداماته أكثر فعالية بمرور الوقت من خلال تعلمه وتفاعلاته المستمرة مع البيانات ومع البشر. وباستخدام هذا النوع من التحليل ستتمكن من معالجة اللغة الطبيعية مباشرة مثل سجلات محادثة مركز الاتصال ومراجعات المنتجات فهو لا يفهم الكلمات في هذه النصوص فقط بل يفهم السياق الكامل لما يتم كتابته أو نطقه! على سبيل المثال تعد كل من Cortana من مايكروسوفت، و Siri من أبل، و Watson من IBM وآخرها ChatGPT من OpenAI روبوتات محادثة تستخدم التحليل المعرفي لتتفاعل معك بلغتك الطبيعية وتوفر لك المعلومات والرؤى التي تريدها. يمكن أن تستفيد الشركات من هذا التحليل للنظر في أنماط المشتريات من السنوات السابقة وتحديد المنتجات التي قد تكون شائعة العام المقبل وفهم سبب شعبية ورواج منتج معين وما إذا كانت شعبيته ستبقى في السنوات المقبلة مما يساعدها على تحديد فيما إذا كانت ستواصل تخزين كميات كبيرة من هذا المنتج الرائج أم لا كما يمكن للمؤسسات الطبية استخدام التحليل المعرفي لإعطاء أفضل العلاجات الممكنة للمرضى. هذه كانت نبذة عن أهم أنواع التحليلات التي يمكنك الاعتماد كمحلل بيانات عليها واختيار الأنسب من بينها لتعزيز مسار العمل والحصول على أي إجابات يحتاج صاحب العمل لمعرفتها لتعزيز تواجده في السوق أو زيادة أرباحه أو التخلص من مشاكل العمل الحالية أو المستقبلية …إلخ. دعنا نلخص هذه التحليلات كما يلي: إجراء التحليلات الوصفية لإدراك ما حدث بعد وقوعه. إجراء التحليلات التشخيصية إذا طلب منك معرفة لماذا حدث هذا الأمر. إجراء التحليلات التنبؤية إذا طلب منك أن تكون بعيد نظر وتعرف ماذا يمكن أن يحدث في المستقبل. إجراء التحليلات التقديرية لتكسب أصحاب العمل بصيرة ثاقبة يعرفون من خلالها ما الذي يجب عليهم فعله بعد ذلك؟ إجراء التحليلات المعرفية للحصول على رؤية صحيحة وصائبة لما يجب أن يتم. أهم أدوات وتقنيات تحليل البيانات في السابق كان تحليل البيانات أمرًا صعبًا ومرهقًا بسبب عدم توفر التقنيات المساعدة فكانت البيانات تجمع يدويًا بطريقة مرهقة، لكن يمكن اليوم لمحلل البيانات الاستعانة بالكثير من أدوات تحليل وتمثيل البيانات المتوفرة لمساعدته على أداء عمله بسرعة وسهولة وفيما يلي نذكر أهم 10 أدوات في تحليل البيانات: برنامج مايكروسوفت إكسل Microsoft Excel برنامج Microsoft Power BI برنامج التحليل الإحصائي SAS إطار عمل أباتشي سبارك Apache Spark لغة بايثون Python لغة البرمجة R لغة الاستعلام الهيكلية SQL تطبيق Jupyter Notebook منصة KNIME برنامج Tableau دعنا نشرح كل أداة من هذه الأدوات وكيف يمكن لمحلل البيانات الاستفادة منه في عمله. برنامج مايكروسوفت إكسل Microsoft Excel يمكننا برنامج جدولة البيانات مايكروسوفت إكسل من إجراء الحسابات على البيانات وفرزها وتجميعها ومعالجتها والبحث فيها وعرضها بشكل رسوم بيانية وإنشاء النماذج وإعداد التقارير، لكن المشكلة في برنامج إكسل أنه ضعيف في التعامل مع البيانات الضخمة. برنامج Microsoft Power BI مايكروسوفت باور بي آي Microsoft Power BI هو برنامج احترافي لتحليل بيانات الأعمال وهو برنامج تجاري مدفوع لكنه يوفر نسخة مجانية بمواصفات محدودة وقد بدأ كمكوِّن إضافي لبرنامج Excel ثم أعيد تطويره عام 2010 وصدر كبرنامج مستقل. يوفر هذا البرنامج مجموعة أدوات متكاملة لتحليل بيانات الأعمال وهو برنامج احترافي يسمح للمستخدمين بإنشاء تقارير مرئية تفاعلية ولوحات معلومات وهو يتكامل مع برنامج إكسل و SQL Server وخدمات جوجل السحابية ويوفر العديد من الميزات الأخرى المفيدة لمحللي البيانات. برنامج SAS برنامج SAS هو أداة تحليل إحصائي تستخدم لتحليل معلومات وبيانات المؤسسات التجارية الكبيرة تم تطويره لتحديد سمات العملاء وإعداد التقارير واستخراج البيانات وإجراء التحليلات التنبؤية ويملك وحدات برمجية لاستخدامات متقدمة مثل مكافحة غسيل الأموال وتحليل لإنترنت الأشياء لكنه منتج مدفوع وسعره مرتفع نوعًا ما. أباتشي سبارك Apache Spark أباتشي سبارك هو إطار عمل برمجي سريع وديناميكي وسهل الاستخدام لمعالجة البيانات وهو يحتوي مكتبة غنية لخوارزميات التعلم الآلي ويستخدم عادة من قبل محللي البيانات وعلماء البيانات لمعالجة البيانات الضخمة وغير المهيكلة وإجراء مهام التحليل الثقيلة حسابيًا من خلال توزيعها على عدة حواسيب. دورة تطوير التطبيقات باستخدام لغة Python احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة اشترك الآن لغة البرمجة بايثون Python توفر لغة البرمجة بايثون لمحلل البيانات آلاف المكتبات المجانية التي تساعده على استخراج البيانات وتحليلها وإعداد التقارير عنها مثل مكتبات NumPy و pandas التي تبسط إجراء العمليات الحسابية ومكتبات Beautiful Soup و Scrapy لاستخراج البيانات من الويب ومكتبة Matplotlib لتمثيل البيانات رسوميًا وإعداد التقارير حولها. لغة البرمجة R لغة R هي لغة برمجة مفتوحة المصدر تستخدم في التحليل الإحصائي واستخراج البيانات وتوفر الكثير من الحزم المساعدة لمحللي البيانات بشكل مشابه لبايثون، ورغم أن كتابة التعليمات في لغة R أكثر تعقيدًا من لغة بايثون إلا أنها لغة مصممة خصيصًا للتعامل مع المهام الإحصائية وتمثيل البيانات المتقدم. لغة الاستعلام الهيكلية SQL تعد لغة SQL أحد التقنيات الأساسية لتحليل البيانات وإعداد التقارير وهي لغة شائعة وسهلة التعلم ومرنة بشكل كبير ما يجعلها اللغة المفضلة لمحللي البيانات لفلترة البيانات والاستعلام عنها وإعداد التقارير …إلخ. Jupyter Notebook تطبيق Jupyter Notebook هو تطبيق ويب مفتوح المصدر يسمح لمحللي البيانات بإنشاء مستندات تفاعلية تتضمن نصوص وأكواد ومعادلات رياضية ورسوم بيانية تشبه إلى حد ما مستندات وورد لكنها أكثر تفاعلية ومصممة خصيصًا لتحليل البيانات وهو متكامل مع أدوات تحليل البيانات الضخمة مثل Apache Spark. برنامج KNIME KNIME هي منصة مفتوحة المصدر وقائمة على السحابة تملك واجهة رسومية GUI سهلة الاستخدام تستخدم في مهام تحليل البيانات والتنقيب عن البيانات والتعلم الآلي تم تطويرها عام 2004 لصناعة المستحضرات الصيدلانية إلا أن قوتها في تجميع البيانات من العديد من المصادر في نظام واحد دفعت محللي البيانات إلى استخدامها في العديد من المجالات مثل تحليل العملاء وذكاء الأعمال والتعلم الآلي. وهي شائعة لدى الشركات الصغيرة ذات الميزانيات المحدودة. برنامج Tableau برنامج Tableau هو برنامج تجاري عملاق لتحليل البيانات وذكاء الأعمال يمكنه التعامل مع كميات كبيرة من البيانات ومعالجتها وإنشاء حسابات معقدة عليها، ويوفر استعلامات SQL لفلترة البيانات ويمكنك من كتابة استعلاماتك الخاصة وهو سهل الاستخدام ويملك واجهة رسومية GUI تعتمد تقنية السحب والإفلات. كانت هذه قائمة بأشهر أدوات والتقنيات المستخدمة. وتذكّر لا توجد أداة واحدة تفعل كل شيء! عليك كمحلل استخدام الأدوات التي تلبي حاجة عملك بأفضل صورة. مصادر تعلم تحليل البيانات ستجد في أكاديمية حسوب العديد من الدروس والمقالات التي تفيدك في تخصص تحليل البيانات ومن أبرز هذه المصادر دروس تعلم برنامج اكسل المشروحة بطريقة منظمة ومبسطة تساعدك على تعلمه بسرعة وسهولة. وإذا كنت مهتمًا بتعلم لغة بايثون التي تعد من أهم لغات البرمجة المستخدمة في تحليل البيانات فقد وفرت لك أكاديمية حسوب قسم دروس ومقالات متنوعة حول لغة بايثون وهي تُحدَّث باستمرار لذا كن على اطلاع دائم عليها لتتعلم كل جديد وإن كنت تفضل التعلم من الكتب المنهجية يمكنك تنزيل كتاب البرمجة بلغة باثيون من أكاديمية حسوب وللمزيد من المصادر أنصحك بزيارة موسوعة حسوب الشاملة التي تضم توثيقات الكثير من لغات البرمجة، بما في ذلك توثيق لغة بايثون. ومن المصادر المميزة التي تسهل عليك طريق الاحتراف دورة تطوير التطبيقات باستخدام لغة Python التي توفرها أكاديمية حسوب والتي تفرد فيهًا مسارًا كاملًا يشرح بشكل واضح ومبسط أساسيات تحليل البيانات ويعرفك على أهم أدوات ومكتبات بايثون وآليات تطبيقها لإجراء عمليات التحليل الإحصائي والوصفي والتصوير البياني وتنظيف وفهم البيانات وغيرها ذلك الكثير من المعلومات التي تؤهلك لبدء العمل كمحلل بيانات في أي شركة أو منظمة أيًا كان مجال عملها. كما توفر دورة الذكاء الاصطناعي التي تساعدك في احتراف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة وتطوير تطبيقات ذكية تقوم بتحليل البيانات Data Analysis وتمثيلها مرئيًا، وتطبيقات تعلم الآلة Machine Learning والتعلم العميق Deep Learning وغيرها من التطبيقات المنوعة التي تساعدك على احتراف هذا المجال. وأنصحك كذلك بتعلم البرمجة بلغة R التحليلية باللغة العربية وأسلوب منهجي ومنظم وبشرح مبسط من خلال الاطلاع على مجموعة المقالات والدروس حول لغة R التي توفرها أكاديمية حسوب. وتوفر لك أكاديمية حسوب سلسلة دروس ومقالات عن لغة SQL،كما توفر كتابًا تعليميًا متكاملاً بعنوان ملاحظات للعاملين بلغة SQL 1.0.0 يتضمن مجموعة من الملاحظات والأمثلة العملية عن مختلف مواضيع لغة SQL من الأساسيات حتى الاحتراف. الخلاصة تعرفنا في مقال اليوم على مفهوم تحليل البيانات واستكشفنا معًا المهام المختلفة لمحلل البيانات وكيف يتعامل مع جميع البيانات التي يتم إنشاؤها كل يوم والمتاحة في مكان عمله، من بيانات المعاملات في قاعدة بيانات تقليدية وبيانات القياس المختلفة والبيانات التي يتم جمعها من وسائل التواصل الاجتماعي وكيف يستخرج منها المعرفة التي تطور سير العمل وتحسنه للأفضل. هل لديك اهتمام بتحليل البيانات؟ إذا كانت الإجابة نعم فقد حان الوقت لتبدأ من الآن رحلتك في احتراف هذا التخصص الواعد الذي يزدهر الطلب عليه بشكل كبير في سوق العمل.
    4 نقاط
  5. ربما تقرأ أو تشاهد يوميًا تقارير عن توقع في انخفاض أو ارتفاع مؤشرات أسواق المال أو تغيرات متوقعة في أسعار شراء بعض المنتجات على أساس شهري أو سنوي، أو حتى نجاح أو إخفاق لقاح لأحد الأمراض في مرحلة التجربة السريرية؛ فما مصدر هذه المعلومات؟ لا تُعد هذه الظواهر ظواهر علمية طبيعية أي لا تنتنج عن قوانين ثابتة يمكن تطبيقها في كل زمان ومكان، بل تأتي في معظم الأحيان نتيجة تطبيق طرق استدلالية أو تحليلية أو إحصائية على كم مترابط أو غير مترابط من البيانات المتوفرة عن هذه الظاهرة أو تلك، وتكون نتيجتها مجموعة محددة من المعلومات التي توصِّف هذه الظاهرة بلغة واضحة يمكن البناء عليها لاحقًا لاتخاذ قرار أو توثيق حادثة. يطلق على العلم القائم خلف هذه الطرق الاستدلالية والتحليلية والإحصائية اسم علم البيانات Data science أو العلم القائم على البيانات Data-driven science ويُعدّ حاليًا من أكثر العلوم التي تدفع عجلة التقدم التقني في مجالات تعلم الآلة والبحث عبر الإنترنت والتعرف الآلي على الصوت والصور والنقل والصحة واستكشاف المخاطر وغيرها الكثير. وأصبح هذا المجال أحد أهم المجالات في العالم الرقمي ولا عجب في ذلك فهو العلم الذي يهتم باستخراج القيمة الكامنة في البيانات التي تعد اليوم أهم أصول الشركات حتى أنها أصبحت تسمى النفط الجديد أو الذهب الجديد. وستكتشف في مقال اليوم كل خبايا هذا العلم وتتعرف على فوائده وأهم أدواته وتقنياته وحتى التعرف على سوق العمل فيه ومصادر تعلمه. ما هو علم البيانات Data Science؟ يُعد علم البيانات حقلًا لتطبيق المهارات التحليلية والوسائل العلمية لاستخلاص معلومات ذات قيمة وأهمية انطلاقًا من بيانات خام raw data أو بيانات مهيكلة أو غير مهيكلة وذلك لاتخاذ القرارات أو وضع خطط استراتيجية في مجال عمل معين أو تحليل الأنظمة أو بناء تصورات مسبقة عن سلوكها. تزداد أهمية علم البيانات يومًا بعد يوم، إذ تساعد الإضاءات التي يقدمها علم البيانات على زيادة كفاءة العمل وتحديد فرص عمل جديدة وزيادة فعالية النشاطات التجارية، وتضيف ميزات تنافسية قوية للأعمال التي تعتمد على علم البيانات موازنة بغيرها وفي مختلف المجالات والأصعدة. يتألف علم البيانات من ثلاث تخصصات أو مجالات متقاطعة مع بعضها البعض وهي كالتالي: علم البيانات هندسة البيانات تحليل البيانات قد تتداخل المهام في كل مجال من هذه المجالات، إلا أن المسؤوليات الأساسية لكل منها تختلف في مكان العمل وفيما يلي نوضح أهم الفروقات بين كل تخصص منها. علم البيانات علم البيانات هو المجال الذي يهتم بتطبيق تقنيات التحليلات المتقدمة والمبادئ العلمية لاستخراج معلومات قيمة من البيانات بهدف اتخاذ القرارات التجارية الأفضل والتخطيط الاستراتيجي . يعمل في مجال علم البيانات أشخاص ذوو كفاءة عالية يملكون معرفة أساسية في تخصص تحليل البيانات وهندسة البيانات فهم يتشابهون في عملهم مع مهندسي البيانات إلا أنهم أصحاب اليد العليا في جميع الأنشطة المتعلقة بالبيانات فعندما يتعلق الأمر باتخاذ القرارات المتعلقة بالأعمال يتمتع عالم البيانات بكفاءة أعلى وهو الذي يتخذ القرار النهائي بشأن العمل. يجب أن يمتلك المتخصص في هذا المجال مهارات تحليلية وبرمجية متقدمة تمكنه من حل مشكلات العمل بشكل كامل بالاعتماد على البيانات واستخراج المعلومات القيِّمة والمفيدة منها لتطوير الأعمال مستخدمًا برمجيات متقدمة من خلال الاعتماد على أفضل المنظومات والخوارزميات لحل المسائل المتعلقة بتنظيم البيانات واستخلاص المعلومات منها. يمكن أن نختصر ماهية علم البيانات بالنقاط التالية: طرح الأسئلة الصحيحة عن المسألة المدروسة وتحليل البيانات الخام. نمذجة البيانات باستخدام خوارزميات متنوعة ومتقدمة وعالية الكفاءة. تصوير البيانات لفهمها من منظور أوضح. فهم البيانات المتاحة لاتخاذ قرارات أفضل أو الوصول إلى نتيجة نهائية. باختصار علم البيانات هو العلم المسؤول عن استخراج معلومات مفيدة من بيانات مبعثرة ولا قيمة لها بشكلها الخام بعد تنظيفها وتصحيح أخطائها وإزالة القيم المكررة منها ومعالجة القيم المفقودة منها وهي تشبه عملية استخراج شيء مفيد من النفايات. علم هندسة البيانات Data Engineering هندسة البيانات هي العمود الفقري لعلم البيانات وتتضمن عملية تصميم وبناء أنظمة تسمح للأشخاص بالتنقيب عن البيانات الأولية وجمعها وتنظيفها من مصادر وتنسيقات متعددة وتخزينها واستعادتها ونقلها تمهيدًا لتحليلها واستخراج معلومات مفيدة منها. كما تهتم هندسة البيانات بالبيانات الوصفية التي تُعد بيانات تصف بيانات أخرى. وتأتي أهمية هندسة البيانات من ضرورة تهيئة البيانات التي جرى جمعها حتى تُخزن ويسهل استعادتها عند الطلب فلا معنى لأي تحليل أو تفسير للبيانات ما لم تجري أرشفة النتائج وتخزينها في منظومة معلوماتية يسهل التعامل معها لاتخاذ القرار. تتضمن هندسة البيانات المهام التالية: استخراج البيانات من مصادر مختلفة Data extraction معالجة البيانات Data processing وتحويل البيانات Data transformation والتي تتضمن تنظيف البيانات data cleaning ومعالجة القيم الفارغة وفصل القيم المجمَّعة وإزالة القيم الخطأ أو تحويلها إلى قيم صحيحة موحدة ومتناسقة. تحميل البيانات Data load وتخزين البيانات الناتجة في المصدر النهائي وعادة تكون قاعدة بيانات مخصصة للتحليل Database analysis تنفيذ العمليات الثلاث ETL التي تعني استخراج Extract وتحويل Transfer وتحميل Load والتي تعني مجتمعة عملية تنقل البيانات من قاعدة بيانات واحدة، أو قواعد بيانات متعددة، أو مصادر أخرى إلى مستودع موحد عادة ما يكون مستودع بيانات. فنظرًا لكون تحليل البيانات أمرًا صعبًا لأن البيانات تجمع بواسطة تقنيات مختلفة ويتم تخزينها بهياكل وتنسيقات مختلفة لكن الأدوات المستخدمة لتحليل البيانات تتطلب أن تكون كافة مجموعات البيانات مخزنة بنفس الهيكلية! وهنا يأتي دور هندسة البيانات في توحيد مجموعات البيانات وإنشاء البنية التحتية التي تزود أعضاء فريق البيانات ببيانات عالية الجودة ليعملوا عليها ويفهموها ويعثروا من خلالها على إجابات لأسئلتهم، وهم مسؤولون كذلك عن تصميم وصيانة هذه البنية التحتية. على سبيل المثال يمكن أن تجمع الشركات العديد من البيانات حول عملائها ومن مصادر متنوعة مثل معلومات حول الفواتير من برنامج مخصص لإدارة المبيعات ومعلومات عن الشحن من برنامج إدارة شركات الشحن والخدمات اللوجستية ومعلومات عن دعم العملاء من برنامج دعم العملاء ومراقبة مواقع التواصل الاجتماعي للحصول على المحتوى الذي يهتم به العملاء ويتفاعلون معه ومعلوماتهم الديموغرافية وأوقات نشاطهم …إلخ. توفر هذه البيانات الكثير من المعطيات للعميل لكن الحصول عليها من مصادر مختلفة وبتنسيقات متنوعة يجعل فهمها والحصول على الإجابات التي نريدها منها أمرًا صعبًا للغاية ويستهلك الكثير من الوقت والجهد لذا لا يمكننا أن نُعوِّل على إدراكنا البشري في هذا الأمر. لهذا السبب يقوم مهندسو البيانات بإعداد هذه البيانات وتنسيقها وتنظيمها وتخزينها في مستودعات بيانات مناسبة مصممة لمعالجة الاستعلامات بسرعة تضمن الأداء المناسب، وبعدها يقدمون هذه البيانات إلى مستهلكي البيانات النهائية مثل محللي البيانات الذين لن يتمكنوا من الوصول إلى البيانات وتحليلها واستخلاص النتائج والقرارات الصائبة منها بدون البنية التحتية التي ينشؤها لهم مهندسو البيانات. عمومًا، كان هذا تعريفًا مختصرًا بتخصص هندسة البيانات، وقد توسعنا بالحديث عنه في مقال منفصل بعنوان الدليل الشامل إلى هندسة البيانات Data Engineering فارجع إليه للاستزادة. علم تحليل البيانات Data analysis تحليل البيانات هو المجال المسؤول عن معالجة البيانات لاستخراج أو استخلاص معلومات مفيدة من شأنها أن تساعد الشركات والمنظمات في حل مشكلة ما أو الكشف عن فرصة ما لتطوير العمل وعرض هذه المعلومات والنتائج التي تم الحصول عليها بأفضل طريقة لصانعي القرار في العمل حتى يتمكنوا من اتخاذ قرارات من شأنها تطوير العمل نحو الأفضل. على سبيل المثال قد يطلب من محلل البيانات تقسيم العملاء بناءً على سلوك الشراء لديهم لتحديد العملاء الذين يجب أن يتم استهدافهم في الحملات التسويقية وإرسال العروض الأنسب المخصصة لكل منهم بناءً على سلوكه الشرائي أو يطلب منه تحديد التكلفة الأفضل للمنتجات للحفاظ على القوة الشرائية كي لا تنخفض عن مستويات السنوات السابقة. ومن أهم المهام التي يعنى بها تحليل البيانات ما يلي: جمع البيانات الخام من مصادر متعددة وتنظيمها. التأكد من جودة البيانات وتنظيفها وتحويلها عند الضرورة. نمذجة البيانات في تنسيقات محددة. التمثيل الرسومي للبيانات أو تصوير البيانات Data visualization ويقصد به عرض البيانات بطريقة مرئية كي يتمكن المتابع من فهم المحتوى الذي تقدمه ويستوعب الرؤى التي استخلصت من هذه البيانات. إيجاد إجابات وحلول لأي مشكلات أو استفسارات في مجال العمل من خلال تحليل البيانات ذات الصلة. الاستفادة من الإحصائيات الوصفية في تلخيص ووصف خصائص مجموعة البيانات. للقيام بهذه المهام يحتاج المختص في تحليل البيانات لامتلاك مجموعة من المهارات الفنية وأهمها الإلمام الجيد بلغة الاستعلام الهيكلية SQL لاستخراج البيانات التي يحتاجها من قواعد البيانات العلاقية المختلفة وإتقان البرامج المخصصة مثل MS Excel و MS Access و Microsoft Power BI التي تساعد في تحليل هذه البيانات وإنشاء نماذج منها وإجراء العمليات الحسابية والإحصائية المختلفة عليها. كما يحتاج بالطبع لامتلاك معرفة جيدة بالإحصاء والتحليل الرياضي لإضافة المهارات في التنظيم والتخطيط والاهتمام بأدق التفاصيل كي يتمكن من إدارة ومعالجة طلبات العمل بكفاءة، كما تعد مهارات التواصل مفيدة جدًا أيضًا لمحللي البيانات لأنهم بحاجة إلى التعبير عن نتائجهم وتفسيرها بوضوح لأرباب العمل. كان هذا تعريفًا مختصر بمجال تحليل البيانات، وقد توسعنا بالحديث عنه في مقال منفصل بعنوان الدليل الشامل لتحليل البيانات Data Analysis فارجع إليه للاستزادة. الفرق بين علم البيانات والذكاء الاصطناعي يُعرّف الذكاء الاصطناعي Artificial Intelligence واختصارًا AI بأنه وسيلة لتزويد الآلات بسلوك يحاكي السلوك البشري كي تقارب تفكيرهم وتتصرف مثلهم وبالتالي فإن الجانب الأساسي من تقنية الذكاء الاصطناعي مرتبط بتعلم الآلة وتعلم الآلة المعمّق. يلخص الجدول التالي الفرق بين علم البيانات والذكاء الاصطناعي من نواحي عدة كي نستطيع إدراك أوجه الشبه والاختلاف: وجه الموازنة علم البيانات الذكاء الاصطناعي الأساسيات علم البيانات هو دورة عمليات مفصلة تتضمن التحضير الأولي للبيانات وتحليلها ثم تصويرها واتخاذ القرار الذكاء الاصطناعي هو إنجاز نموذج قادر على التوقع بهدف التنبؤ بأحداث مستقبلية. الأهداف التعرف على الأنماط المطلوب إيجادها ضمن البيانات الخام للمشروع قيد الدراسة أتمتة العمليات ووضع بيانات التصرف الذاتي ضمن الوحدة البرمجية المدروسة. نوع البيانات التي يعمل عليها يعمل علم البيانات على أنواع مختلفة من البيانات مثل البيانات الخام والبيانات المهيكلة وغير المهيكلة. يستخدم الذكاء الاصطناعي أنواع معيارية من البيانات على شكل متجهات vectors وأنواع مدمجة أخرى من البيانات التقنيات المستخدمة يستخدم التقنيات الرياضية والإحصائية وخوارزميات تعلم الآلة وأدوات تحليل البيانات وتصويرها. يستخدم بشكل أساسي خوارزميات تعلم الآلة وتعلم الآلة المعمّق. المعرفة المكتسبة تُستخدم المعرفة التي يوفرها علم البيانات في إيجاد الأنماط والسلوكيات في البيانات. تصب المعرفة التي يوفرها الذكاء الاصطناعي في تزويد الوحدات البرمجية بشكل من أشكال التصرف الذاتي. أمثلة عن الأدوات المستخدمة ++R, Python, MATLAB,C Tensor flow, sci-kit-learn, Kaffee متى يُستخدم يُستخدم علم البيانات عندما تقتضي الضرورة استخدام حسابات رياضية سريعة أو تحليل بيانات استطلاعي أو تحليل توقعي predective analysis. لا بد في هذه الحالات من تحديد الأنماط والسلوكيات من خلال البيانات المتاحة ويتطلب ذلك معرفة بالإحصاء الرياضي. يُستخدم الذكاء الاصطناعي عندما تقتضي الضرورة التخلص من عمل ضروري متكرر. لا بد في هذه الحالات من تقييم مخاطر الانتقال إلى الذكاء الاصطناعي وسرعة اتخاذ القرار ودقة في التنفيذ بعيدًا عن المشاعر البشرية والانحياز. أمثلة عن الاستخدام تحسين العمليات واكتشاف سلوكيات العملاء والتحليل المالي وغيرها الكثير. الروبوتات وبرمجيات المحادثة الآلية والألعاب عبر الإنترنت وأنظمة المساعدة الصوتية. هنالك مسارات أخرى بدأت تتبلور تعكس التأثير الكبير لعلم البيانات على الذكاء الاصطناعي مع تزايد الاندفاع نحو ما يُعرف بالذكاء الاصطناعي القابل للتوضيح explainable AI والذي يقدم معلومات تساعد المستخدمين على فهم كيفية عمل نماذج تعلم الآلة ومقدار الثقة التي ينبغي أن يولوها لنتائج عمل هذه الوحدات عند اتخاذ القرارات. بالإضافة إلى دور علم البيانات في صياغة مبادئ تصميم الذكاء الاصطناعي المسؤول responsible AI principles للتأكد من عدالة جميع التقنيات المستخدمة وضمان عدم تحيزها وشفافيتها. مكونات علم البيانات ينبثق علم البيانات من مجموعة من المكوّنات أو العلوم ولا بد من استعراضها حتى تتوضح أبعاد هذا العلم: الإحصاء Statistics الرياضيات Mathematics البرمجة وعلوم الحاسوب Programming and Computer Science أساسيات الرياضيات لتتعلم علم البيانات لا بد من إتقان المفاهيم الأساسية في الرياضيات التي تعد الجزء الأكثر حيوية في مجال علوم البيانات، فهي الفضاء الذي تُدرس ضمنه الكميات والبنى والعلاقات ذات الصلة بالظاهرة المدروسة. إذ يُعد علم الرياضيات اللغة التي توصِّف الظواهر العلمية وتوفر الأدوات الضمنية التي يستخدمها علم البيانات مثل عمليات الاستقراء والتحليل والإحصاء والتفاضل والتكامل وغيرها. الإحصاء الرياضي يُعد الإحصاء الرياضي Statistics من أهم مكوّنات علم البيانات لأنه الوسيلة الأنسب لجمع وتحليل البيانات العددية مهما كانت كميتها كبيرة واستخلاص الأفكار منها. يتعامل هذا العلم مع مجموعات منفصلة من البيانات أو مجموعات مستمرة منها محاولًا تطبيق وسائل رياضية لدراسة ميل هذه البيانات للتقارب أو التباعد والمنحى الذي تأخذه في هذا السلوك ثم تضع أطرًا لتعريف وتصنيف هذه الوسائل. فمن منا لم يسمع في مرحلة ما من تحصيله الدراسي كلمة متوسط حسابي أو انحراف معياري أو منوال مثلًا، فهذه المصطلحات ما هي إلّا مقاييس لابتعاد قيم مجموعة من البيانات عن قيمها الوسطى. البرمجة وعلوم الحاسوب يأتي الحمل الأكبر في علم البيانات على البرمجة وتخصص علوم الحاسوب كي تتمكن من كتابة وتنقيح وتعديل الشيفرات التي تجمع وتحلل وتهيكل البيانات، حيث يجب على من يريد التخصص في علم البيانات تعلم إحدى لغات البرمجة والمكتبات البرمجية التي تدعم الوظائف الإحصائية والرياضية وبرمجيات التحليل وإيجاد علاقات الترابط وغيرها، إضافة لقواعد البيانات المسؤولة بشكل أساسي عن تخزين البيانات وتنظيمها واسترجاعها. كما يعد تعلم الآلة Machine learning أحد التقنيات المتقدمة التي تلعب في الآونة الأخيرة دورًا حيويًا في علم البيانات فمن خلاله يمكننا من الحصول على تنبؤات وقرارات أفضل دون الحاجة للتدخل البشري مما يساعد علماء البيانات في أداء مهامهم والحصول على حلول لمشكلات العمل بطريقة أسرع وأكثر ذكاء مقارنة بالاعتماد على التقنيات الإحصائية التقليدية. وإذا كنت مهتمًا بتعلم أسس علوم الحاسوب والتخصص في مجال علوم البيانات واكتساب خبرة عملية فيه بأسرع الطرق يمكنك مطالعة مقال أساسيات علوم الحاسوب فهو بمثابة دليل شامل يعرفك على اختصاص علوم الحاسب وأهم فوائده وتطبيقاته. دورة علوم الحاسوب دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب اشترك الآن أهمية علم البيانات لم تكن البيانات المتوفرة حول مختلف المجالات خلال العقد الأول من هذه الألفية وما قبلها -وخاصة بشكلها الرقمي- ذات أحجام كبيرة جدًا، وكان من السهل تخزينها في هياكل مخصصة مثل الجداول الإلكترونية وقواعد البيانات العلاقيّة ومن ثم التعامل معها من خلال أدوات مختلفة بكل سهولة ويسر. فقد جمعت البيانات ما قبل الحقبة الرقمية بأساليب يدوية مرهقة بالاعتماد على الأشخاص والأوراق والجداول ولم تكن بيانات شاملة، بل كانت تقتصر على ما هو ضروري للجهة التي تحتاج هذه البيانات سواء أكانت حكومية أو سواها. مع التحول إلى الرقمنة، أصبحت عملية الحصول على البيانات وتصنيفها أسهل وأيسر وظهرت أنواع جديدة من قواعد البيانات التي تسهل التعامل مع هذه البيانات، لكن كما أشرنا بقيت ضمن حدود السيطرة. لكن الكم الهائل جدًا من البيانات التي تنتج يوميًا عن كل فرد قد وصلت وفق بعض الأبحاث إلى 1.7 ميغا بايت في الثانية عام 2020 وقد تصل إلى أضعاف هذا الرقم في لحظة كتابة هذه الأسطر. فانطلاقًا من البيانات البسيطة التي يسجلها الجوال عن مستخدميه، وبيانات التصفح واستخدام الحاسوب، وبيانات نشاطك على مختلف مواقع التواصل الاجتماعي وعمليات التسجيل والشراء أو أي نشاط على مختلف المواقع قد تُسجل وتؤرشف لغايات خاصة بمشغلي تلك المواقع فتأمل عندها الكميات الكبيرة من البيانات التي ستظهر حتى حركة مؤشر الفأرة على شاشة متصفح مسجلة وتستعملها المواقع عبر أدوات تعقب وتحليل مختلفة مثل تتبع الأقسام التي زرتها والروابط والمنتجات التي أبديت اهتمامُا بها وذلك لتحليل سلوكك وبالتالي تقديم تجربة أفضل لك. ولا ننسى تطور البرامج السحابية التي مكنت المؤسسات من تتبع أحجام ضخمة من بيانات الأعمال في الوقت الفعلي وتوفر مليارات من أجهزة إنترنت الأشياء IoT حول العالم التي تجمع كل لحظة كمًا ضخمًا من البيانات عن كل تحركاتنا، لذا يتوقع أن يكون هناك 175 زيتابايت من البيانات في عالم البيانات العالمي بحلول عام 2025 وللعلم فإن زيتابايت يساوي 1000 بايت للأس 7 وبعبارة أخرى فإن زيتابايت واحد يحتوي على 21 صفرًا ولهذا السبب نحن نعيش بالفعل حقبة انفجار البيانات الضخمة Big Data Explosion ونحتاج لطريقة تمكننا من معالجة هذا الكم الجنوني من البيانات! إن معالجة هذا الكم الهائل من البيانات هي مهمة صعبة جدًا على أي مؤسسة أو جهة، لهذا ظهرت الحاجة الماسة إلى أدوات وتقنيات فعالة لمعالجة وتحليل تلك البيانات وأشخاص مؤهلين قادرين على التعامل معها وبدأ علم البيانات بالتبلور ليكون مزيجًا من عدة علوم تتكامل لإنجاز ما يلي: تجميع البيانات الخام وإعدادها للمعالجة أو التحليل النوعي. تحويل هذه الكميات الكبيرة من البيانات الخام وغير المهيكلة إلى معلومات ذات قيمة. تقديم البيانات وعرضها بصريًا لتوضيح الاستراتيجيات أو القرارات المبنية على نتائج تحليل تلك البيانات. استخلاص الأفكار والرؤى من البيانات المحللة باستخدام تقنيات الذكاء الاصطناعي وخوارزميات تعلم الآلة. وضع استراتيجيات تطوير للأعمال انطلاقًا من نتائج التحليل والدراسة. وضع توقعات صحيحة أو قريبة من الصحة في مختلف المجالات مثل استطلاعات الرأي والانتخابات وحجوزات السفر واستكشاف حالات الغش والدراسات العلمية والاجتماعية وغيرها. لم يكن علم البيانات منذ عقد مضى ولا حتى العاملين في هذا المجال منتشرًا في سوق العمل، لكن الشعبية الكبيرة حاليًا لهذه الفئة من الخبراء تعكس طريقة تفكير الأعمال بالبيانات الضخمة. فلا يمكن بعد الآن تجاهل الكميات الهائلة من البيانات الخام التي أضحت بالنسبة للكثير من الشركات بمثابة منجم ذهب افتراضي طالما أن هناك خبراء متحمسين وطموحين ودقيقي الملاحظة قادرين على التنقيب فيها ورؤية ما لا يراه غيرهم. مجالات علم البيانات يلعب علم البيانات اليوم دورًا فعالًا في جميع جوانب الحياة التجارية والطبية والحكومية …إلخ، ويجد المختصون في المجالات المختلفة كل يوم تطبيقًا جديدًا لعلم البيانات بما يعزز العمل الذي يشرفون عليه ويحقق مكاسب على جميع الأصعدة، لكننا سنقف تاليًا على أبرز المجالات التي شاع استخدام علم البيانات فيها. التعرف على الصور وتمييز الكلام عندما تحمّل صورة على فيسبوك ثم ترى اقتراحات للإشارة إلى أصدقائك في الصورة، فإن ما يجري فعلًا أن موقع فيسبوك قد استخدم خوارزمية تمييز الصور تلقائيًا وقد تعرف على الأشخاص في هذه الصورة. إن هذه الخوارزمية هي جزء من علم البيانات. وكذلك الأمر عندما تقول "Ok Google" ليستجيب هاتفك الذكي ويستعد للأوامر الصوتية، فإن علم البيانات هو السبب في ظهور خوارزمية التعرف على الكلام التي استخدمها التطبيق توًا. محركات البحث عبر الإنترنت هل لاحظت كيف تقترح لك محركات البحث الشهيرة مثل جوجل وياهو وبينج ما هو قريب من نتيجة بحثك؟ هل لاحظت السرعة في عرض النتائج والتحسن المستمر في دقة نتيجة البحث؟ يعود الفضل في ذلك إلى علم البيانات وخوارزمياته التي تجعل تجربة البحث عبر الانترنت أكثر سرعة وفعالية ورضًى للمستخدم. العلوم الطبيعية تُستنبط معظم المعايير العلمية المتعلقة بالظواهر الطبيعية من كم البيانات الهائل الناتج عن مراقبة هذه الظواهر على مدى طويل من الزمن كالمناخ والبيئة والفضاء، إذ ترسل المسابر ملايين البايتات يوميًا إلى مراكز الأبحاث لتحليلها واستقراء النتائج وبالطبع لن يكون من السهل فهم هذه البيانات والربط بينها دون استخدام خوارزميات علم البيانات وطرائقه. عالم الألعاب سواء الألعاب الرياضية الحقيقية كدراسة وتحليل حركات لاعبي كرة القدم وحتى منصات الألعاب الرقمية في تعزيز تجربة اللاعبين. تعتمد الشركات التي ترعى هذه المواضيع على تحليل نتائج البيانات المأخوذة من كم هائل من المباريات ومن تجارب مئات الآلاف الذين يمارسون ألعاب الفيديو عبر الإنترنت. لقد حسَّن استخدام علم البيانات وتقنياته أداء الكثير من شركات الألعاب. النقل إن الهدف الرئيسي لاستخدام علم البيانات في عالم النقل هو الوصول إلى المركبات ذاتية القيادة التي يسعى مصمموها إلى تقليل الخطأ البشري إلى أدنى مستوى وتقليل عدد الحوادث المرورية وضبط معدلات التلوث بعوادم الوقود. إضافة إلى ذلك، يساعد علم البيانات في تحليل حركة المرور واكتشاف الازدحامات والاختناقات المرورية وإرسال إشعارات للسائقين لسلوك طريق آخر مثلًا لوجود ازدحام في الطريق الذي يسير عليه وتحليل الحوادث المرورية واتخاذ القرارات. الرعاية الصحية لعلم البيانات دور بارز في مجال الرعاية الصحية لما يؤمنه من مساهمة في تشخيص الحالات الطبية وتخطيط العلاج والبحث الطبي ويوفر نتائج حاسمة وتوقعات تقترب نسبة الخطأ فيها من الصفر وخاصة في مجالات الكشف عن الأورام وابتكار الأدوية وتحليل الصور الطبية. أنظمة التوصية بالمنتجات تعتمد معظم الشركات مثل غوغل وأمازون ونيتفليكس على علم البيانات الذي يقدم تكنولوجيا مفيدة جدًا في تحسين تجربة مستخدمي هذه الشركات من خلال التوصية بمنتجات هذه الشركات لمستخدميها من معرفة ميولهم وسلوكياتهم أو ما يعرف بالتزكية المخصصة. فعندما تبحث عن شيء ما ثم تجد اقتراحات لأشياء مشابهة لاحقًا فهي نتيجة تطبيق خوارزميات علم البيانات. اكتشاف المخاطر تواجه الشركات المالية مخاطر تتعلق بقضايا التزوير وخسارة رأس المال، لكن بوجود علم البيانات ستقل هذه الأخطار إلى مستويات منخفضة. إذ تستفيد شركات المال من علماء البيانات في دراسة البيانات المالية للاستثمارات المطروحة وإدارة المخاطر المالية واكتشاف المعاملات الاحتيالية وتقييم مخاطر الخسارة أو الإفلاس مما يرفع ثقة العملاء بأداء هذه الشركات، كما يساعد علم البيانات أنظمة تقنية المعلومات في منع الهجمات الإلكترونية ومنع التهديدات الأمنية المختلفة. ومن مجالات هذا العلم الأخرى مساعدة الشركات التجارية على إنشاء حملات تسويقية أقوى وإعلانات مستهدفة أكثر دقة لزيادة المبيعات والأرباح، ومنع حدوث أعطال المعدات في الأماكن الصناعية، ويبرز استخدام علم البيانات المجال الأكاديمية لمراقبة أداء الطلاب وتحسينه للأفضل وغير ذلك الكثير مما لا يتسع المقال لذكره. وقلما تجد اليوم مجالًا لا يساهم علم البيانات الحديث في تحسينه وتطويره نحو الأفضل. دورة حياة مشروع علم البيانات تمر دورة علم البيانات بالمراحل التالية: الاستكشاف إعداد البيانات تخطيط النماذج بناء النماذج التحضير للعمل إيصال النتائج الاستكشاف وهي أولى مراحل هذه الدورة وتبدأ بطرح الأسئلة الصحيحة عن الظاهرة المدروسة. فلا بد قبل أن تبدأ أي مشروع متعلق بعلم البيانات أن تحدد المتطلبات الاساسية لهذا المشروع وأولوياته وميزانيته. لا بد في هذه المرحلة من تحديد كل متطلبات المشروع كعدد العاملين فيه والتقنيات المستخدمة والزمن اللازم لإنجازه والبيانات التي سيجري العمل عليها والغاية منها، وبالتالي سنتمكن من وضع إطار أولي لحل المشكلة التي كانت سببًا في إطلاق المشروع. إعداد البيانات نحتاج في هذه المرحلة إلى إنجاز المهام التالية: تصحيح البيانات وتنظيفها Data cleaning اختزال البيانات وتقليل حجمها Data Reduction تكامل البيانات Data integration نقل البيانات Data transformation بعد إنجاز هذه المراحل الأربعة تصبح البيانات جاهزة لعمليات أخرى. التخطيط لبناء النماذج نحتاج في هذه المرحلة إلى تحديد النماذج المختلفة والتقنيات اللازمة لإيجاد العلاقات والروابط بين متغيرات الدخل. وتجري عادة عملية تحليل بيانات استطلاعي Exploratory data analytics -تختصر إلى EDA- باستخدام الدوال والصيغ الإحصائية ثم أدوات تصوير البيانات لفهم الروابط بين المتغيرات ومن ثم فهم ما ترشدنا إليه تلك البيانات. من أكثر الأدوات شيوعًا في إنجاز هذه المرحلة نجد: SQL Analysis Services R SAS Python بناء النماذج تبدأ في هذه المرحلة عملية بناء النماذج. إذ يجري خلال هذه المرحلة إنشاء مجموعات من البيانات لأغراض التمرين والاختبار لتساعد في تطبيق تقنيات مثل التجميع والتصنيف والربط على البيانات المتوفرة لوضع نماذج عن سلوكها. إليك بعض أدوات بناء النماذج الأكثر شيوعا: SAS Enterprise Miner: عبارة عن إضافة تتكامل مع قواعد بيانات أو جداول (مثل إكسيل) لبناء نماذج تحليلية تعطي توقعات عن البيانات الموجودة وفقًا لمسار التحليل الذي تتبعه. WEKA: وهي مجموعة من خوارزميات لغة الآلة كتبت بلغة جافا للتعامل مع مهام التنقيب عن البيانات. SPSS Modeler: برنامج من شركة IBM لتنفيذ مهام التنقيب عن البيانات وتمثيلها بيانيًا وفهمها واتخاذ القرارات بناء عليها. MATLAB: بيئة عمل رياضية وبرمجية متكاملة لمختلف الأغراض الحسابية والتحليلية وتصوير البيانات وبناء خوارزميات تعلم الآلة وتطبيقها. تحضير المشروع للعمل تُسلم في هذه المرحلة معظم التقارير النهائية عن المشروع إلى جانب الشيفرة والمستندات التقنية. تقدم هذه المرحلة نظرة شاملة عن أداء المشروع على صعيد محدود قبل أن يجري نشر نتائجه كاملةً. إيصال النتائج النهائية يتحقق فريق العمل في هذه المرحلة من أن الهدف الذي وضع للمشروع في مرحلة الاستكشاف قد أنجز أم لا، ثم تُسلم بعد ذلك المعلومات التي تمكن الفريق من حيازتها عن طريق النماذج التي بنيت ومن ثم إيصال النتائج النهائية إلى فريق الأعمال الذي طلب الشروع بالعمل. التخصص في مجال علم البيانات رأينا سابقًا كيف ظهرت الحاجة الملحة لعلم البيانات كتخصص قائم ومستقل بذاته للتنقيب عن المعرفة بين أكوام البيانات الخام ويُعتقد وفقًا لعدة استطلاعات رأي بأنّ هذا التخصص سيكون الأكثر طلبًا في السوق خلال هذا العقد. وبما أن الطلب شديد على هذا المجال فهناك نقص كبير في اليد العاملة فيه عربيًا وعالميًا، لذا أمامك فرصة سانحة لممارسته دون الحاجة لوجود شهادة أكاديمية متخصصة فيه إذ التركيز حاليًا على الخبرة نظرًا لنقص اليد العاملة فيه. أي كل ما تحتاجه هو الخبرة الأساسية في البرمجة والإحصاء الرياضي ورغبة في تعلم هذا المجال وتحصيل كل ما يكسبك الخبرة العملية فيه من دورات ومخيمات تدريبية تؤهلك لدخول سوق العمل والحصول على فرصة مميزة لدى الكثير من الشركات والمنظمات التي ستتهافت على تدريبك وتوظيفك لديها. لهذا السبب لا بد من الاطلاع على التخصصات التي يمكنك العمل بها في حال رغبت في التخصص في مجال علوم البيانات. الوظائف التي يتضمنها علم البيانات حتى تختار التخصص الذي تراه مناسبًا لخبراتك وميولك، سنفرد هذه الفقرة للتفصيل في مجموعة من أهم الوظائف والأدوار الوظيفية المرتبطة بالبيانات والمتطلبات الأساسية لكل وظيفة: عالم بيانات Data scientist محلل بيانات Data analyst مهندس بيانات Data engineer معماري بيانات Data architect مطوّر تصوير بيانات Data Visualization Developer خبير في تعلم الآلة Machine Learning expert لنكتشف المزيد حول كل دور من هذه الأدوار وأهم التقنيات والمهام المنوطة به. محلل البيانات هو شخص خبير ينقّب في أكوام البيانات الخام باحثًا عن نماذج وأنماط علاقات تربط بينها. يعمل بعد ذلك على عرض نتائج ما توصل له بما يساعد على اتخاذ قرار أو حل مشكلة. ما المهارات التي يجب أن يتقنها محلل البيانات؟ معرفة جيدة في الرياضيات. معرفة جيدة في التنقيب ضمن البيانات Data mining. معرفة أساسيات علم الإحصاء Statistic. أن يكون مطلعًا على بعض لغات البرمجة والأدوات البرمجية المستخدمة في علم البيانات مثل: Python MATLAB SQL Hive R JS SAS SPSS وغيرها مهندس بيانات وهو الشخص الذي يعمل مع كميات كبيرة من البيانات ويكون مسؤلًا عن بناء وصيانة بنى مناسبة لهذه البيانات وفقًا لمشروع علم البيانات الذي يعمل عليه. يعمل مهندس البيانات أيضًا على تصميم العمليات التي تتحكم بمجموعات البيانات وتُستخدم في نمذجة هذه المجموعات أو التنقيب فيها أو حيازة معلومات منها أو التحقق من سلامتها. ما المهارات التي يجب أن يتقنها مهندس البيانات؟ معرفة معمقة بتقنيات برمجية مثل: SQL MongoDB Cassandra HBase Apache Spark Hive MapReduce معرفة جيدة بلغات برمجة مثل Python, C/C++, Java, Perl. معماري بيانات وهو الشخص الذي يتصور ويصمم الأسلوب الذي تُنجز وفقه البنية التحتية المسؤولة عن تخزين وإدارة البيانات لأغراض التحليل سواء على صعيد العتاد الصلب أو الصعيد البرمجي. ما المهارات التي يجب أن يتقنها معماري البيانات؟ معرفة معمقة بقواعد تطوير البرمجيات والأنظمة. معرفة معمقة بالمعماريات المستخدمة في إنجاز قواعد البيانات. عالم بيانات عالم البيانات هو شخص خبير يعمل على تجميع وتحليل واستخلاص النتائج من كميات كبيرة من البيانات الخام أو المهيكلة أو غير المهيكلة. يجمع عمل عالم البيانات بين علوم الحواسب وخاصة برمجتها وعلم الإحصاء والرياضيات. يعمل عالم البيانات على تحليل ومعالجة ونمذجة البيانات ثم يفسر النتائج التي حصل عليها كي يُنشئ خطة عمل مناسبة للشركة أو المنظمة أو الجهة التي يعمل لديها. يُسخّر علماء البيانات قدراتهم ومهاراتهم في مختلف المجالات سواء التقنية منها أو الاجتماعية للبحث عن تفاصيل قد لا يراها ولا يفهمها سواهم في كم البيانات الهائل الذي يعملون عليه، إذ يتضمن عملهم عادة إيجاد ترابط منطقي بين بيانات غير مهيكلة أو خام تنتج عن مصادر مختلفة كالأجهزة الذكية وردود الأفعال على مواقع التواصل الاجتماعي ومحتوى رسائل البريد الإلكتروني وغيرها من المصادر التي يصعب ملاءمتها من قواعد البيانات المهيكلة. ما المهارات التي يجب أن يتقنها عالم البيانات؟ فهم معمق لعلم الإحصاء. معرفة جيدة في الرياضيات. مهارة في إحدى لغات البرمجة التالية أو أكثر Python R SAS SQL Hive Pig Apache spark MATLAB قدرة جيدة على تصوير البيانات Visualization. مهارات تواصل جيدة. دورة تطوير التطبيقات باستخدام لغة Python احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة اشترك الآن مطور تصوير بيانات وهو شخص يعمل إلى جانب عالم البيانات لتمثيل البيانات بصريًا وتقديم عروض ومخططات تفصّل نتائج تحليل هذه البيانات بطريقة مرئية سهلة الفهم لإيصالها إلى من يستخدمها. ما المهارات التي يجب أن يتقنها مطور تصوير بيانات؟ مهارة في إحدى لغات البرمجة التالية أو أكثر: Python R SAS SQL Hive Pig Apache spark MATLAB قدرة تحليلية ممتازة. قدرة كبيرة على إيجاد الطرق الأمثل في تصوير البيانات. خبير في تعلم الآلة هو الشخص الذي يعمل مع مختلف خوارزميات تعلم الآلة التي تُستخدم في علم البيانات مثل خوارزميات الارتجاع أو الإنحدار Regression والتجميع clustering والتصنيف classification وشجرة القرار decision tree والغابة العشوائية random forest وغيرها. ما المهارات التي يجب أن يتقنها خبير تعلم الآلة؟ خبرة في أحد لغات البرمجة التالية أو أكثر: Python ++C R Java Hadoop فهم جيد للخوارزميات الكثيرة المستخدمة في علم البيانات وتعلم الآلة. مهارة تحليلية في حل المشاكل. معرفة جيدة في علمي الاحتمالات والإحصاء. مصادر تعلم علم البيانات هل أنت متحمس للتخصص في مجال علم البيانات وتعلمه بشكل ذاتي وبأقصر الطرق بعيدًا عن أروقة الجامعات ومناهجها المكثفة -بسنواتها الطويلة التي تمتد لأربع أو خمسة سنوات- لكنك لا تعرف من أين تبدأ؟ سنسلط في القسم الضوء على مصادر تعلم تخصص علم البيانات العربية لدخول سوق العمل، فكما أشرنا حاليًا السوق شره على المتخصصين ويركز على الخبرة والمشاريع العملية المنجزة ولا يتطلب شهادات جامعية حصرية. نفترض أنك أنهيت مراحل جيدة من التعليم الدراسي أو قد أنهيت المرحلة الثانوية أو تخصصت في أحد التخصصات الهندسية وبذلك تكون قد حصَّلت معرفة جيدة بأساسيات الرياضيات والإحصاء وحتى مواضيع متقدمة مثل التفاضل والتكامل (إن كنت قد اخترت التخصص العملي وليس الأدبي) وبذلك تكون قد قطعت شوطًا في تعلم هذا العمل، وعمومًا الأساسيات تكفي للبدء ويمكن لاحقًا التعمق في أي موضوع تحتاج إليه. بعدها يمكنك البدء بتعلم أساسيات علوم الحاسوب ولغات البرمجة المخصصة المستخدمة في علم البيانات وأهمها لغة بايثون و لغة R ولغة SQL فهي من أكثر اللغات المطلوبة والمخصصة للاستخدام مع البيانات. تؤمّن هذه اللغات قدرات وظيفية كبيرة في التواصل مع قواعد البيانات واستخلاص البيانات الخام وتحليلها وتنظيمها واستخلاص الرؤى وفقا للظاهرة المدروسة ومن ثم التقييم وإتخاذ القرار، وكل ذلك من خلال مجموعة واسعة من الخوارزميات التي توفرها هذه اللغات ضمنًا أو من خلال مكتبات متوافقة معها. من أهم المصادر العربية المتكاملة التي ننصحك بها كي تتعلم هذه التقنيات: كتاب ملاحظات للعاملين بلغة SQL 1.0.0 كتاب البرمجة بلغة بايثون الذي يشرح أساسيات لغة بايثون سلسلة تعلم لغة R التي تطلعك على كافة الأساسيات والمواضيع النظرية التي تحتاجها في هذه اللغات. سلسلة مقالات think stats التي توفر لك مجموعة مميزة من المقالات والدروس المتخصصة في تعليم الاحتمالات والإحصائيات لمبرمجي بايثون بأسلوب مبسط وسهل الفهم. وإذا كنت تفضل التعلم بإشراف مختصين يجيبونك على أي سؤال يخطر ببالك ويقرن التعليم النظري بالتطبيق العملي فأنصحك بالاطلاع على دورة أساسيات علوم الحاسب التي توفرها أكاديمية حسوب فهي كفيلة بأن تكسبك كافة الأسس التي تحتاجها لتعلم أسس البرمجة وقواعد البيانات، وكذلك دورة تطوير التطبيقات بلغة بايثون والتي تمكنك من تطوير طيف واسع من التطبيقات في مجالات منوعة من بينها تطبيقات عملية في تحليل البيانات تساعدك في التعرف على أبرز مكتبات بايثون المتخصصة في التعامل مع علم البيانات. إضافة إلى لغات البرمجة التي ذكرناها ستجد الكثير من المنصات والأدوات التي تدعم بشكل مباشر العمل مع البيانات الضخمة وتقدم مختلف الأدوات المساعدة في التحليل والتنظيم واتخاذ القرار والتي يمكنك تعلمها ومن أبرزها SAS و Spark و Hadoop و Azure و AWS. خاتمة ألقينا الضوء في هذا المقال على علم البيانات الذي يُتوقع أن يكون من أكثر الأعمال طلبًا خلال هذا العقد من الألفية نظرًا للحاجة الماسة للعمل ضمن كميات هائلة من البيانات الخام وضرورة الاستفادة منها في تطوير الأعمال على مختلف الأصعدة. كما تحدثنا عن المكونات والتخصصات التي يضمها ومجالات استخدامه وتطبيقه، كما تحدثنا عن دورة الحياة التي يمر بها أي مشروع يعتمد على علم البيانات. ومنعًا لتضارب الأفكار وضياع التسميات، فقد تحدثنا عن الفرق بين علم البيانات وتحليلها وكذلك الفرق بين علم البيانات والذكاء الاصطناعي. وهكذا نكون قد أحطنا بشكل مفصل أساسيات علم البيانات وتخصصاته ومجالاته المختلفة لمن يرغب فعليًا في امتهانه أو احتراف أحد اختصاصاته، ووضحنا المتطلبات الضرورية التي يحتاجها المتعلم حتى يبدأ رحلته في هذا المجال المهم والشيق والمجزي ماديًا والذي ينبئ بمستقبل واعد.
    4 نقاط
  6. نوضح في هذا المقال الأسلوب الأمثل لدراسة تخصص هندسة البرمجيات، ونجيب على السؤال المهم حول إمكانية دراسة البرمجة بشكل ذاتي. ونسلط الضوء على أهم المميزات والتحديات التي ستواجهك إذا اخترت الدراسة الذاتية للبرمجة أو الدراسة الأكاديمية لها، ونختم المقال بجملة من النصائح التي تساعدك لتتعلم البرمجة باحترافية وكفاءة. هل يناسبني تخصص هندسة البرمجيات؟ لا شك أن البرمجة مهارة مميزة في عصرنا الحالي سريع التطور، وقرار تعلم البرمجة أو هندسة البرمجيات هو خيار ممتاز وخطوة صائبة، ويعد تخصص هندسة البرمجيات واحدًا من أسرع المجالات نموًا في العالم ويوفر للمرء فرص عمل متعددة ذات أجر مرتفع ويضمن له مستقبلًا مشرقًا، فكل الأعمال اليوم تحتاج لمن يطور لها البرامج والمواقع ويقوم بصيانتها وتحديثها بصورة مستمرة. إضافة لكونه مجالًا إبداعيًا ودائم التطور يمنح المتخصص فيه قدرة إبداعية ويحسّن طريقة تفكيره المنطقي ويمكّنه من تطوير برامج وتطبيقات بأفكار مميزة ونافعة، فإذا كنت مهتمًا بمجال البرامج الحاسوبية ولغات البرمجة ولديك رغبة دائمة في تطوير نفسك وصبر على تعلم الكثير من المفاهيم والأدوات والاطلاع على كل جديد في مجال التقنيات واستعداد لمواجهة التحديات وحل المشكلات وإتمام المهام وانتباه جيد للتفاصيل فدراسة تخصص هندسة البرمجيات خيار مناسب لك بكل تأكيد ويحقق لك الكثير من الفوائد والمميزات وأهمها: توفير العديد من فرص العمل في مختلف المجالات والقطاعات، فالطلب على المبرمجين ومهندسي البرمجيات في تزايد مستمر. الحصول على أجور مرتفعة مقارنة بالتخصصات والوظائف الأخرى. تعزيز القدرة على التفكير التحليلي والمنطقي وحل المشكلات بسهولة ومرونة. مرونة في اختيار ساعات ومكان العمل حيث يمكن العمل عن بعد من داخل المنزل أو أي مكان وخلال أي وقت تفضله. حرية العمل بشكل مستقل أو بدء عملك الخاص أو العمل في شركة مع فريق متكامل. القدرة على تحويل الأفكار إلى تطبيقات ومشاريع مبتكرة تفيد البشر وتسهّل عملهم. مواكبة التطور التقني وفهم طريقة التعامل مع التقنيات الحديثة بسرعة وسهولة. اكتساب مهارة التطوير الذاتي والقدرة على تعلم مهارات جديدة باستمرار. كيفية تعلم تخصص هندسة البرمجيات إذا قررت التخصص في مجال البرمجة وهندسة البرمجيات فسوف تجد أمامك خيارين أو نهجين متاحين للتعلم الأول هو الطريق الأكاديمية أي سيتوجب عليك الالتحاق بجامعة أو كلية تقنية متخصصة في هندسة البرمجيات أو علوم الحاسوب أو أي اختصاص مشابه، وهذا الخيار يمنحك تعليمًا شاملًا للبرمجة وفق منهج منظم ومحدد لكنه طريق طويل يلزمك بدراسة الكثير الكثير من المقررات ويمتد لفترة زمنية طويلة. الخيار الثاني هو الطريق المهني حيث يتوجب عليك دراسة تخصص هندسة البرمجيات بشكل ذاتي مستفيدًا من مصادر التعلم الكثيرة والمتنوعة من كتب ومقالات ودروس ومقاطع فيديو ودورات تدريبية متاحة عبر الإنترنت لتعلم لغات البرمجة والتقنيات وغيرها من الأدوات والمهارات المطلوبة لإتقان التخصص وهذا الخيار يمكّنك من التركيز على تخصصك واحترافه بوقت أقل. سنناقش في الفقرات التالية أبرز المميزات والعيوب لكل طريقة من هذه الطرق لنساعدك على اختيار الطريقة الأفضل والأنسب لك. الدراسة الجامعية لتخصص هندسة البرمجيات إذا قررت دراسة هندسة البرمجيات من خلال الالتحاق بإحدى الجامعات الأكاديمية حيث تستغرق الدراسة في هذا التخصص وسطيًا أربع سنوات وقد يختلف عدد السنوات والمواد من جامعة لأخرى. وهذا الخيار سيوفر لك عدة مميزات وسيضع أمامك جملة من العوائق والتحديات، لنناقش كلًا منها على حدا في فقراتنا التالية. مميزات الدراسة الجامعية لتخصص هندسة البرمجيات من أهم المميزات والإيجابيات التي ستحصل عليها عند دراسة تخصص هندسة البرمجيات في الجامعة ما يلي: الحصول على تعليم منهجي ومنظم وفق جدول زمني محدد فالمناهج الجامعية موضوعة بعناية ومرتبة وفق ترتيب منطقي يتدرج في تعليمك كافة الأساسيات التي تحتاجها والتي يمكنك من خلال تعلمها تطوير نفسك في أي مجال لاحقًا. الحصول على شهادة جامعية معترف بها تعزز مصداقيتك وتساعدك على الحصول على فرصة عمل. توفر دراسة البرمجة في الجامعة جو تعلّم جماعي وتمكّنك من التفاعل مع زملاء لهم نفس الاهتمامات وتنفيذ مشاريع جماعية ومناقشات مثمرة. توفر الجامعات مختبرات حواسيب ومكتبات ضخمة تضم الكثير من الكتب والمصادر البرمجية القيّمة التي تساعدك في عملية التعلم. صعوبات وتحديات الدراسة الجامعية لتخصص هندسة البرمجيات لا يخلو التعليم الجامعي في تخصص هندسة البرمجيات من بعض العوائق والصعوبات التي تحتاج لأن تأخذها بعين الاعتبار عند اختيار المسار الأفضل بالنسبة لك ومن أبرز هذه الصعوبات نذكر: تحتاج دراسة هندسة البرمجيات في الجامعة لمدة زمنية طويلة تستغرق 4 سنوات أو أكثر وتختلف المدة حسب كل جامعة. المقاعد الجامعية محدودة فقد لا تحصل على فرصة في دراسة هندسة البرمجيات في الجامعة التي تطمح لها وتضطر لدراسة تخصص آخر. يعتبر التعليم الجامعي مرتفع التكلفة مقارنة بالتعلم الذاتي حيث ستضطر لدفع تكاليف الرسوم الجامعية والكتب وأجور المواصلات وغيرها. ستضطر خلال فترة دراسة تخصص هندسة البرمجيات في الجامعة إلى تعلم الكثير من المواد النظرية المملة التي لن تفيد مطلقًا في سوق العمل. لا زال أسلوب تعليم البرمجة وتقييم معلومات الطالب في بعض الكليات معتمدًا على الأساليب التقليدية القديمة التي تختبر الحفظ بدل الفهم ولا تقيم مهارات الطالب تقييمًا صحيحًا، وهذا الأسلوب يناسب التخصصات النظرية لكنه لا يناسب تخصص هندسة البرمجيات والحاسوب الذي يعتمد على الفهم والإبداع والمنطق. لا تواكب بعض المناهج الجامعية التطور السريع في مجال البرمجة وتقنياتها أولًا بأول، وقد تعتمد لسنوات على نفس المناهج القديمة التي عفا عليها الزمن فإذا اكتفيت بما تعلمك إياه الجامعة ستخرج إلى سوق العمل وتفاجأ بالفجوة الكبيرة بين ما تعلمته في أروقة الجامعات وبين ما هو مستخدم في سوق العمل. الدراسة الذاتية لتخصص هندسة البرمجيات هل تعلم أن معظم المبرمجين الناجحين لم يكونوا خريجي كليات تقنية وليس لديهم شهادات جامعية في أحد التخصصات البرمجية بل اتبعوا أسلوب التعلم الذاتي وأثبتوا جدارتهم من خلال العمل على تطوير مشاريعهم البرمجية الخاصة حيث توفر الدراسة الذاتية لتخصص هندسة البرمجيات جملة من الفوائد والمميزات التي قد لا يوفرها لك خيار التعلم الجامعي التقليدي، وإذا كنت ترغب بالاطلاع على قصص نجاح لأشخاص تمكنوا من تحقيق النجاح والتميز من خلال دراسة هندسة البرمجيات بشكل ذاتي أنصحك بمطالعة قصص نجاح طلاب أكاديمية حسوب ففيها تجارب ملهمة حقًا. لكن الدراسة الذاتية لتخصص هندسة البرمجيات تتضمن أيضًا جوانب إيجابية وأخرى سلبية سنتعرف عليها في الفقرات التالية. مميزات الدراسة الذاتية لتخصص هندسة البرمجيات من أبرز الفوائد التي ستعود عليك في حال قررت دراسة هندسة البرمجيات بشكل ذاتي ما يلي: مرونة التعلم في أي وقت وتحديد عدد ساعات التعلم وجدول الدارسة وفق ما يناسب ظروفك. تعلم البرمجة من المنزل أو أي مكان يناسبك بدل تكبد عناء الذهاب لمقر الجامعة الذي قد يكون موجودًا في مكان بعيد عنك أو خارج مدينتك. التعلم بتكلفة بالمجّان أو دفع تكلفة منخفضة مقارنة بتكاليف التعليم الجامعي. التعلم بصورة أسرع من خلال التركيز على تعلم لغات البرمجة والتقنيات التي تفيدك في تخصصك البرمجي فقط. التعلم من مصادر حديثة ما يبقيك على اطلاع بأحدث التقنيات في تخصصك البرمجي بدل دراسة معلومات قديمة عفا عليها الزمن. توفر مصادر تعلم عديدة ومتنوعة تمكّنك من تحديد الأسلوب الذي تفضلّه وتحقيق أفضل استفادة. التركيز على التطبيق العملي وتنفيذ المشاريع المطلوبة في سوق العمل بدل التعلم النظري الممل. تعلم التنظيم وإدارة الوقت وتحديد أولويات التعلم يما يحقق أهدافك من التعليم. تطوير مهارة التواصل الفعال مع المجتمعات البرمجية عبر الإنترنت. زيادة الاعتماد على النفس واكتساب مرونة في مواجهة التحديات وحل أي مشكلات تواجهك بمفردك. صعوبات وتحديات الدراسة الذاتية لتخصص هندسة البرمجيات بالرغم مما توفره الدراسة الذاتية للبرمجة من مميزات ونقاط قوة إلا أنها لا تخلو من بعض الصعوبات والتحديات وإن لم تتعامل معها بشكل صحيح فقد تصاب بالإحباط وتفشل في تحقيق أهدافك، وإليك قائمة بأبرز هذه الصعوبات: التعلم الفوضوي وغير المنضبط فقد تشتتك كثرة المصادر ولا تعرف من أين تبدأ وما هي الخطوات الصحيحة التي عليك اتباعها. عدم وجود أستاذ يقيّمك ويمكّنك من تحديد مستواك ومعرفة نقاط ضعفك والعمل على تحسينها. عدم تنظيم الوقت والمماطلة وفقدان التركيز والانضباط والتحفيز. لا تحصل على شهادة أكاديمية تثبت ما تعلمته لكن يمكن حل هذه النقطة ببناء معرض أعمال قوي يثبت كفاءتك وهو الأهم حاليًا في سوق العمل والكل يبحث عنه بدلًا من الشهادة. إذا كنت شخصًا اجتماعيًا فقد يشعرك التعلم الذاتي بنوع من العزلة لعدم وجود زملاء أو فريق يشاركك التعلم ويتعاون معك في المشاريع، والانضمام للمجتمعات والمنتديات عبر الانترنت يساعدك في تخطي هذه الصعوبة. هل أتعلم البرمجة عبر الجامعة أم ذاتيًا؟ سواء اخترت تعلم البرمجة بشكل ذاتي أو في كلية أو جامعة فيجب أن تضع في الحسبان أن تعلم البرمجة ليس بالأمر اليسير بل يحتاج للكثير من الصبر والمثابرة وبذل الجهد والتعلم المستمر من مصادر حديثة والتطبيق العملي، ستحتاج إلى قضاء وقت كبير في البرمجة والعمل على مشاريع لتحسين مهاراتك لكن حلاوة الإنجاز ستهون عليك التعب. وختاًا إليك بعض النصائح لتصبح مهندس برمجيات ناجح: ابدأ بتعلم الخوارزميات والتفكير المنطقي قبل أن تبدأ في تعلم أساسيات البرمجة، ففهم هذه المواضيع أمر بالغ الأهمية لك كمبرمج أو مهندس برمجيات. تعرف على أهم مجالات البرمجة وأكثر التخصصات البرمجية المطلوبة في سوق العمل الذي تود التوجه له، وحدد بناءً على ذلك ما هو التخصص البرمجي الذي تود متابعة دراسته واحترافه، ثم ضع قائمة بأهم لغات البرمجة والتقنيات التي عليك تعلمها لتتقنها وضع خطة محكمة لتعلمها. طبق كل ما تتعلمه فكلما كتبت أكوادًا أكثر كلما استوعبت المفاهيم البرمجية بشكل أفضل، وتأكد أنك مهمًا قرأت من دروس وشاهدت من مقاطع فيديو فلن تصبح مبرمجًا كفؤًا إلا إذا مارست ما تتعلمه بشكل عملي وتدربت على حل المشكلات وتصحيح الأخطاء التي ستظهر عند تنفيذ الكود. فكّر ثم برمج ولا تكتب أي كود برمجي قبل أن تخطط وتحلل مشروعك بشكل جيد وتفهم الوظائف والمهام المطلوبة بوضوح ثم تنفذها من خلال الأكواد البرمجية. حدّث معلوماتك باستمرار فمهما كان مستوى خبرتك فهناك دومًا معلومات وتقنيات جديدة تحتاج لتعلمها. شارك في المنتديات والمجتمعات البرمجية وتبادل معلوماتك وتجاربك مع المبرمجين والمطورين الآخرين. من الجيد أن تتعلم أكثر من تقنية أو لغة لتطوير مشاريعك البرمجية فهذا يجعلك قابلًا للتكيف مع سوق العمل والتغير الكبير في المتطلبات. إذا كنت تشعر بالتشتت ولا تملك القدرة على تنظيم تعلمك وتقييم معلوماتك فإن اتباعك لدورات تدريبية منهجية في التخصص البرمجي الذي تحبه سيمكنك من اتباع الخطوات الصحيحة ويساعدك في التعلم بشكل أفضل وأسرع. كيف تساعدك دورات أكاديمية حسوب على دراسة هندسة البرمجيات تساعدك أكاديمية حسوب على تخطي العقبات التي قد تواجهها في في دراستك الذاتية لتخصص هندسة البرمجيات من خلال توفير تعلم منهجي منظم فهي توفر لك الكثير من مصادر التعلم المجانية لتعلم البرمجة من كتب ودروس ومقالات وسلاسل تعليمية تناسب كافة المستويات، كما توفر الأكاديمية دورات تعليمة متنوعة في أشهر التخصصات البرمجية المطلوبة في سوق العمل كما تضمن لك حداثة المحتوى التعليمي فالأكاديمية تضيف تحديثات مستمرة لمختلف الدورات لتواكب أحدث التطورات والاتجاهات. أضف إلى ذلك أنها توفر قسم الأسئلة والأجوبة كمجتمع برمجي فاعل يساعدك خلال رحلتك التعليمية. وعند اشتراكك في إحدى دورات أكاديمية حسوب ستضمن الحصول على شروحات برمجية ذات جودة عالية تدمج بين التعليم النظري والتطبيق العملي حيث تشمل دورات الأكاديمية العديد من المشاريع التطبيقية التي تمنحك خبرة عملية وتقيم مستواك البرمجي بشكل صحيح وتساعدك على بناء معرض أعمال احترافي. كما توفر لك دعمًا تفاعليًا حيث يمكنك التواصل مع فريق متخصص من المدربين المستعدين لشرح ما يصعب عليك خلال دراستك وإجابتك على على أي تساؤل تطرحه، والأهم أنك ستتمكن من خوص امتحان يقيّم ما تعلمته خلال الدورة لتتمكن من الحصول على شهادة معتمدة من أكاديمية حسوب في حال نجاحك فيه الأمر الذي يعزز فرصتك في الحصول على فرصة عمل مناسبة. وفي الختام تذكّر أن رحلة تعلم البرمجة قد لا تكون سهلة لكنها بالتأكيد ستكون رحلة مليئة بالتحديات والتشويق والمتعة إذا سلكتها بالطريقة المناسبة واتبعت الخطوات الصحيحة، لذا من المهم أن توازن إيجابيات وسلبيات كل طريقة من طرق تعلم تخصص هندسة البرمجيات وتختار الطريقة التي تناسب ظروفك ومتطلباتك وتلتزم بالنصائح التي ذكرتها لك، وستنجح بإذن الله في تحقيق كل أهدافك والتغلب على كل التحديات والصعوبات التي تواجهك. الخلاصة تعرفنا في مقال اليوم على أبرز الطرق التي يمكنك من خلالها دراسة تخصص هندسة البرمجيات ومميزات وتحديات كل طريقة منها، ويمكن أن نخلص في نهاية المقال بأن الدراسة الذاتية للبرمجة هي الخيار الأفضل لك إذا كنت شخصأ يسعى لدخول سوق العمل وكسب المال بسرعة وتريد أن تحافظ على حداثة معلوماتك وتبقى مطّلعًا على كل جديد لكن هذا يتطلب منك الكثير من الجهد والتنظيم والالتزام واعتماد مصادر تعلم جيدة والتحفيز الذاتي المتواصل لتجنب الفشل والإخفاق. أما الدراسة الجامعية فهي الأنسب لك إذا كان هدفك هو الحصول على شهادة جامعية والدراسة ضمن بيئة تعلم منظمة ومنهجية وإذا تمكنت من الجمع بين التعليم الجامعي والتعلم الذاتي فسيكون هذا أمرًا رائعًا بإمكانه تجاوز القصور الذي تعاني منه مناهج التعليم التقليدي. اقرأ أيضًا تعلم البرمجة ما هي فوائد تعلم البرمجة؟ أسهل لغات البرمجة مدخل إلى تطوير البرمجيات Software Development
    3 نقاط
  7. نسلط الضوء في مقال اليوم على مستقبل البرمجة أحد أكثر المجالات تغيرًا وتجددًا، فالتقنيات والتخصصات البرمجية المختلفة تتطور بوتيرة هائلة وسريعة جدًا ما يحتم على أي مبرمج أو مطور أن يواكب هذه التغييرات ويكون على دراية بأهم الاتجاهات التي يتوقع أن تشهدها البرمجة في السنوات القادمة وتأثيرها على سوق العمل والوظائف المستقبلية. الذكاء الاصطناعي ومستقبل البرمجة لعل أول تساؤل يخطر ببال أي مبرمج بشأن مستقبل البرمجة هل ستحل الروبوتات والذكاء الاصطناعي محل المبرمجين في المستقبل، والجواب هو أن الذكاء الاصطناعي سوف يساعد المبرمجين بدلًا من استبدالهم كما أن تقنيات الذكاء الاصطناعي ستتطور بشكل أكبر ويساعد البشر على القيام بمهامهم المختلفة والحصول على النتائج التي يريدونها حول أي موضوع بشكل أفضل وأسرع. وكما تعرف فقد بدأ الذكاء الصناعي بالفعل في الآونة الأخيرة يؤثر بشكل مباشر على مختلف جوانب حياتنا، ويتوقع أن يزداد تأثيره في المستقبل أكثر وأكثر نتيجة لتطوير البنية التحتية التي يعتمد عليها وتطوير معيار اتصال الواي فاي wifi7 فائقة السرعة والتي تصل لغاية 36 جيجا بت في الثانية بعرض نطاق ترددي يصل إلى 320 ميجاهرتز وانتشار شبكات اتصالات الجوال من الجيل الخامس 5G والبدء بشبكات الجيل السادس 6g التي ستكون أسرع 1000 مرة من شبكة 5G. سيحسن هذا التطور في البنية التحتية من سرعة نقل البيانات ويقلل زمن وصولها ويعطي المبرمجين المتخصصين في الذكاء الاصطناعي وتعلم الآلة القدرة على تحليل ومعالجة هذه البيانات بكفاءة عالية، كما سيزيد من قدرتهم على تطوير حلول إنترنت الأشياء IoT عالية الكفاءة وتطوير تطبيقات متقدمة لم تكن متاحة مع الشبكات السابقة، وسيزيد الطلب أيضًا على برمجة أجهزة ذكية قادرة على اتخاذ القرارات مثل السيارات ذاتية القيادة وروبوتات المحادثة والمساعدين الافتراضيين والروبوتات الصناعية التي ستعمل جنبًا إلى جنب معنا نحن البشر أو ربما تؤدي مهامنا وتستغني عن وجودنا بالكامل لكن في مهن وتخصصات محدودة. كما سيلعب الذكاء الصناعي وتعلم الآلة دورًا أساسيًا في مستقبل البرمجة وكتابة الكود وسيزداد التوجه إلى الإصدار الثاني من البرمجيات Software 2.0 وهي البرمجيات التي تستخدم خوارزميات تعلم الآلة ML والشبكات العصبية لتؤدي عملها دون تدخل بشري ولا بد أنك سمعت أو استخدمت بوت المحادثة الذكي ChatGPT من Open AI وأداة OpenAI Codex الأكثر تخصصًا والتي تساعدك على إنتاج الأكواد البرمجية وتدعم العديد من لغات البرمجة فهما مثالان على برمجيات تعتمد على الذكاء الاصطناعي والتي من شأنها مساعدة المطورين والمبرمجين في تحسين عملهم وزيادة إنتاجيتهم ليركزوا على الأمور الأكثر أهمية في عملية التطوير. فإذا كنت مهتمًا بهذا المجال من الضروري أن تحرص على تعلم لغات البرمجة الخاصة بالذكاء الاصطناعي وتعلم الآلة ولعل أهمها لغة البرمجة بايثون Python التي توفر الكثير من أطر العمل والمكتبات القوية في مجال الذكاء الاصطناعي مثل مكتبة SciKit-Learn و TensorFlow و PyTorch و Keras. ولمطالعة المزيد من المعلومات حول خارطة طريق تعلم الذكاء الاصطناعي ومعرفة أدواته وتقنياته المختلفة أنصح بقراءة مقال تعلم الذكاء الاصطناعي ومقال تعلم الآلة Machine Learning. دورة الذكاء الاصطناعي احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة. اشترك الآن مستقبل إنترنت الأشياء إنترنت الأشياء IoT هو التقنية التي تجعل الأجهزة من حولنا ذكية وتتفاعل مع بعضها البعض وترسل البيانات عبر شبكة الإنترنت وتحللها وهو بلا شك أحد الجوانب التي ستؤثر على مستقبل البرمجة بشكل كبير، ومن المتوقع أن يزداد تأثيره في السنوات القادمة ليطبق بشكل أكبر في أتمتة منازلنا والتحكم بمختلف الأجهزة التي نستخدمها في حياتنا اليومية كأجهزة الإنذار وأنظمة التدفئة وأنظمة الإضاءة الذكية وأنظمة التحكم بالأبواب والستائر ويمكننا من التحكم بها من خلال التطبيقات المثبتة على هواتفنا الذكية، ولن يقتصر تطبيق إنترنت الأشياء على منازلنا فحسب بل سيستخدم بصورة أكبر في مختلف المجالات الصناعية كصناعة السيارات ومجال الرعاية الصحية وغيرها. ربما ستزيد هذه التقنيات من اعتمادية الناس العادية على الأجهزة لكنها ستفرض على معشر المبرمجين بذل جهد أكبر في تعلم تقنيات تطوير تطبيقات الأجهزة المضمنة وتطبيقات الأجهزة قابلة للارتداء والاطلاع على أحدث التغييرات التي ستطرأ على تطوير تطبيقات الجوال وتطبيقات الويب، إلى جانب اكتساب مهارات كافية في علوم البيانات لجعل هذه التطبيقات قادرة على التعامل مع كمية ضخمة من البيانات Big data فأجهزة إنترنت الأشياء ستولد لنا كميات هائلة من البيانات وهذه البيانات الضخمة تحتاج إلى تحليلها ومعالجتها واتخاذ قرارات صائبة منها. كما يحتاج المبرمجون المهتمون بهذا المجال إلى التركيز بشكل أكبر على أمان التطبيقات والمواقع التي يطورونها، ويتعلموا بشكل جيد طريقة التعامل مع بروتوكولات الاتصال وأجهزة الاستشعار والمنصات السحابية المناسبة حسب نوع التطبيق المطلوب، ويتقنوا اللغات والبروتوكولات الخاصة بإنترنت الأشياء مثل MQTT و CoAP و Zigbee. مستقبل البرمجة وعلم البيانات علم البيانات Data Science هو مجال حديث يجمع بين الإحصاء والرياضيات وعلوم الحاسوب ويهتم بدراسة البيانات ويعتمد عليها في اتخاذ القرارات من خلال الاستعانة بخوارزميات الذكاء الاصطناعي وتعلم الآلة، ويتوقع أن يزداد الطلب عليه بشكل أكبر في المستقبل نتيجة التضخم الهائل في حجم البيانات الذي نشهده، كما يتوقع أن يكون علم البيانات أحد أكثر المجالات المطلوبة في المستقبل لأن كافة المؤسسات والمنظمات وقطاعات العمل بدأت في الاعتماد عليه لاتخاذ قراراتها المختلفة مثل كشف عمليات الاحتيال والتوصية بالمنتجات المناسبة للعملاء وستحتاج للاعتماد عليه بشكل أكبر مستقبلًا. فإذا كنت مهتمًا بمجال علم البيانات أنصحك بأن تبدأ من الآن بتعلم التقنيات ولغات البرمجة الشهيرة في هذا المجال مثل لغة بايثون python ولغة R ونظم إدارة قواعد البيانات وبرامج التحليلات الإحصائية والتمثيل الرسومي للبيانات مثل Tableau و Power BI ومنصات البيانات الضخمة وتفهم أطر البيانات الضخمة مثل Spark و Hadoop لضمان مهنة لها دور واعد في مستقبل البرمجة. لمطالعة مزيد من المعلومات حول علم البيانات وتخصصاته وكيفية تعلمه أنصح بمطالعة مقال علم البيانات Data science: الدليل الشامل ومقال الدليل الشامل إلى تحليل البيانات Data Analysis. مستقبل تقنية البلوكتشين Blockchain أحدثت تقنية البلوكتشين Blockchain ثورة في طريقة التعامل الرقمي مع البيانات وهي تقنية تعتمد على تخزين المعاملات في قاعدة بيانات عملاقة مشفرة وآمنة لا مركزية وغير قابلة للتعديل تسمى دفتر الأستاذ الموزع distributed ledger وقد اكتسبت هذه التقنية شهرتها من العملات المشفرة المبنية عليها. ففي هذه التقنية تتم المعاملات على قاعدة البيانات بترتيب تسلسلي وتكون المعاملات لامركزية أي أنها تعمل على حواسيب موزعة في جميع أنحاء العالم وتتم مباشرة بين المستخدمين دون تدخل طرف ثالث وتكون مؤمنة بشكل كبير، على سبيل المثال عندما يبيع شخصان السلع لبعضهما البعض باستخدام عملة بيتكوين Bitcoin فلن يحتاجوا إلى المرور عبر وسيط مثل بيبال لإتمام هذه المعاملة. تتطور تقنية بلوكتشين بشكل متسارع ويتوقع أن تشهد المزيد من الاستخدامات في المستقبل في عدة مجالات فإلى جانب تحويل العملات المشفرة عبر الأجهزة سيعتمد عليها في إنشاء عقود ذكية مخصصة قادرة على التعامل مع المعاملات المعقدة والتحقق من المعاملات متعددة الخطوات وتسريع معالجة البيانات ونقلها بأمان، وبدأت تعتمد في العديد من القطاعات والمجالات مثل عمليات التصويت للانتخابات وحفظ المعاملات المالية وسندات الملكية. يتوقع أن تؤثر هذه التقنية على مستقبل البرمجة وتزيد الطلب على مطوري البلوكتشين بمختلف تخصصاتهم سواء المطورين الأساسيين blockchain core أو مطوري تطبيقات blockchain أو مطوري التطبيقات اللامركزية DApps ومطوري العقود الذكية باستخدام لغات مخصصة مثل solidity، فإذا كنت ترغب في تعلم مجال رائد في مستقبل البرمجة يمكنك البدء بتعلم تقنيات تطوير البلوكتشين والتعرف على منصاتها وبروتوكولاتها المختلفة. الحوسبة الكمومية Quantum Computing ستحل الحوسبة الكمومية التي تستخدم البتات الكمومية quantum bits أو ما يعرف بالكيوبتات qubits محل بالحوسبة الكلاسيكية التي تستخدم البتات bits أو نظام الأرقام الثنائية binary digits لتمثيل البيانات وتنفيذ العمليات، وستلعب دورًا فعالًا في مستقبل البرمجة من خلال زيادة سرعة معالجة كميات هائلة من البيانات وتسهيل حل المشكلات المعقدة التي استعصى على البشرية حلها. لا تزال الحوسبة الكمومية في بدايتها ويقتصر استخدام الحواسيب الكمومية اليوم على المجالات البحثية ولازالت تواجه حتى اليوم بعض التحديات التقنية والعملية التي يعمل الخبراء على حلها، وحين تستقر سيبدأ استخدامها في تطبيقات فعلية مختلفة ويتوقع أن تطور العديد من تخصصات البرمجة وأبرزها الأمن السيبراني وتحليل البيانات وتطور مجال الرعاية الطبية وتساعد في اكتشاف الأدوية وتحسن من الاقتصاد. تستخدم الحوسبة الكمومية أسلوبًا مختلفًا في البرمجة وتحتاج لتطوير خوارزميات جديدة لذا يحتاج المبرمجون المهتمون بهذا المجال إلى تعلم لغات برمجة وأطر عمل جديدة مصممة للعمل على الحواسيب الكمومية مثل Q#‎ و Cirq و Qiskit، كما يمكنهم استخدام لغات برمجة تقليدية مثل بايثون لكن مع الاستعانة بمكتبات خاصة مصممة للعمل مع الأنظمة الكمومية مثل QuTip وسيحتاجون كذلك لفهم أساسيات الجبر الخطي وميكانيك الكم للتعامل مع هذه التقنية الرائدة. مستقبل البرمجة دون كود No-Code ستبقى البرمجة التقليدية التي تعتمد على كتابة الشيفرات البرمجية أو ما يعرف بالتطوير عالي الكود High-code development موجودة في مستقبل البرمجة بالتأكيد، لكن يتوقع أن يزداد الاعتماد كذلك على منصات التطوير بدون كود No-code development أو التطوير منخفض الكود Low-code development الذي يسمح لأي شخص غير مختص بالتقنية بتطوير البرامج والتطبيقات والمنتجات الخاصة به وأتمتة أعماله بنفسها. تتميز البرمجة منخفضة الكود بشكل أساسي بتوفير واجهات رسومية سهلة الاستخدام تعتمد السحب والإفلات ولا تحتاج لكتابة الشيفرات والتعليمات باستخدام إحدى لغات البرمجة المعقدة، ويمكن أن تعتمد أيضًا على أنظمة تصميم ومكونات مسبقة الصنع يمكن لأي شخص استخدامها مباشرة وإنشاء تطبيقاته بسرعة وسهولة. قد تتساءل هل هذا يعني أن الاعتماد على المبرمجين والمطورين المتخصصين سوف ينخفض في المستقبل؟ والجواب هو بالنفي فالحلول بدون كود مهما كانت مرنة وسهلة الاستخدام فلن تتمكن من الاستغناء عن دور المبرمجين بالكامل وستصلح للأنظمة البرمجية البسيطة نسبيًا وستبقى كتابة الأكواد مطلوبة لتطوير الأنظمة البرمجية الاحترافية والتحكم بهذه المنصات نفسها فهذه المنصات تعمل وراء الكواليس بواسطة الشيفرات البرمجية وستظل بحاجة لمبرمجين يطورونها ويقومون بصيانتها، كما يمكن أن تكون هذه المنصات بذات الوقت أداة مساعدة يمكن للمبرمجين دمجها مع أساليب البرمجة التقليدية لتحسن إنتاجيتهم وتسريع وتيرة عملهم. مستقبل تطبيقات الويب التقدمية PWA يتوقع أن تسيطر تطبيقات الويب التقدمية PWAs وهي اختصار لعبارة Progressive Web Applications على مستقبل برمجة تطبيقات الويب ويزداد الاعتماد عليها من قبل الشركات والمؤسسات المختلفة، فهذه التطبيقات وفرت أسلوبًا جديدًا لتطوير تطبيقات الأجهزة المحمولة ومكنت المبرمجين من تطوير تطبيقات ويب تتصرف مثل التطبيقات الأصيلة native applications وتعمل بكفاءة على كافة أنواع أنظمة التشغيل وتتوافق مع كافة الأجهزة وأحجام الشاشات سواء الحواسب المكتبية أو الأجهزة المحمولة ويتم الوصول لها من خلال مستعرض الويب وهي لا تتطلب من المستخدم تثبيت أي شيء لاستخدامها كما يمكنها العمل دون الحاجة للاتصال بالإنترنت. تستخدم تطبيقات الويب التقدمية تقنيات تطوير الويب الأساسية HTML و CSS وجافاسكريبت إلى جانب أدوات وأطر العمل المخصصة مثل Angular و React و Vue.js، فإذا مهتمًا بمجال برمجة وتطوير التطبيقات أنصحك بالبدء بتعلم تطوير PWAs واكتساب المهارات اللازمة في هذا المجال لضمان مهنة مطلوبة في سوق العمل في السنوات القادمة. لمطالعة مزيد من التفاصيل حول تطبيقات الويب التقدمية والتعرف على أهم مميزاتها يمكنك مطالعة مقال مدخل إلى تطبيقات الويب التقدمية PWA أهمية البرمجة في المستقبل لاشك أن مستقبل البرمجة واعد ومشرق في عصرنا الرقمي متسارع الخطى فالطلب على المطورين والمبرمجين يزداد بشكل كبير في الشركات التقنية المتخصصة، كما أن البرمجة قد تصبح مطلبًا أساسيًا للتوظيف في العديد من مجالات العمل الأخرى مثل الاقتصاد والصناعة ومؤسسات الرعاية الصحية إلى جانب زيادة الاعتماد عليها في مجالات الحياة اليومية. فالبرمجة لغة المستقبل وعلى الجميع تعلمها ولكن لنتذكر دومًا أن عالم البرمجة في تغير مستمر ومن الضروري لأي مهتم بالبرمجة أن يواكب التطورات الحاصلة فيها ويركز على تعلم الاتجاهات الحديثة التي يتوقع أن يزداد الطلب عليها إذا أراد أن يضمن البقاء في الصدارة في سوق العمل المستقبلي. إذا كنت مهتمًا بتعلم البرمجة واحترافها يمكنك البدء بأحد التخصصات البرمجية التي شرحناها سابقًا والتي يتوقع أن تشهد ازدهارًا وطلبًا مرتقعًا في مستقبل البرمجة، وتذكر أن مهنة البرمجة بلا شك بجميع مجالاتها وتخصصاتها الأخرى ستبقى واحدة من أكثر المهن التي تنبئ بمستقبل واعد، فإذا كنت مهتمًا بتعلم البرمجة وتقنياتها لا تتردد وابدأ من اليوم بتحديد المجال الذي يوافق ميولك وضع خطة لتعلمه مع الاهتمام إلى جانب ذلك بتنمية مهاراتك الناعمة مثل مهارات التواصل الفعال وحل المشكلات والقدرة على التعلم وتطوير الذات لأن هذه المهارات ستصبح أكثر أهمية في المستقبل وستمكنك من إثبات وجودك والتميز في سوق العمل. وإذا كنت مهتمًا بمعرفة مزيد من التفاصيل حول مستقبل البرمجة أنصحك بمشاهدة هذا الفيديو: الخلاصة حاولنا في مقال اليوم أن نستشرف مستقبل البرمجة ونعرفك على أهم التخصصات البرمجية التي يتوقع أن تشهد وجودًا قويًا في السنوات القليلة القادمة ومن أبرزها الذكاء الاصطناعي، والتعلم الآلي، والتعلم العميق، وإنترنت الأشياء، وعلم البيانات، وتقنيات البلوكتشين، والبرمجة بدون كود أو منخفضة الكود، وناقشنا أهمية تخصص البرمجة والمستقبل الواعد لدراسة هندسة البرمجيات وزيادة الطلب على المبرمجين والمطورين في سوق العمل المستقبلي. اقرأ أيضًا تعرف على أعلى تخصصات البرمجة أجرًا البرمجة والخوارزميات والذكاء الاصطناعي تطوير تطبيق وصفة لاقتراح الوجبات باستخدام ChatGPT و DALL-E في PHP برمجة الذكاء الاصطناعي
    3 نقاط
  8. لا شك تعلم الخوارزميات أحد النصائح المهمة التي وجهت لك إذا قررت تعلم البرمجة فكلمة خوارزمية تتردد كثيرًا في مجال البرمجة وغيرها من المجالات مثل الرياضيات والعلوم والمنطق وكل ما يتعلق بالحاسوب خصوصًا، فهي من أهم المفاهيم التي لا يمكن أن يستقيم لك تعلم البرمجة والرياضيات وعلوم الحاسب بدونها. إذا كنت تتساءل ما هي الخوارزمية، وكيف أتعلم الخوازميات، وما أهمية الخوارزميات في علوم الحاسب وفي البرمجة بشكل خاص، وما هي أنواع الخوارزميات التي علي تعلمها، وكيف أكتب أفضل خوارزمية فهذه المقالة لك، حيث سنستعرض في سياقها كل ما تحتاج معرفته عن الخوارزميات، ونوفر لك مجموعة من المصادر التعليمية العربية الغنية التي تساعدك على تعلم رموز الخوارزميات وطرق حل الخوارزميات في الحاسوب بأفضل طريقة. ما هي الخوارزمية؟ الخوارزمية algorithm هي مجموعة من التعليمات المرتبة لحل مشكلة ما في الرياضيات أو أي مشكلة تواجهك في الحياة اليومية خلال زمن محدد وعدد خطوات محدود. ينبغي أن تكون خطوات وتعليمات الخوارزمية واضحة ومُرتّبة بحيث تنتهي بحل المشكلة. فكّر في الخوارزمية كما لو كانت وصفة طبخ، إذ تقدّم الوصفة طريقة تحضير وجبة ما خطوة بخطوة، ابتداءً بالمقادير الضرورية للوجبة، وحتى آخر خطوة من تحضير الوجبة وتقديمها. ورغم أن مفهوم الخوارزميات يمكن أن يطبق في كل مجالات الحياة لكن تبرز أهمية الخوارزميات في علوم الحاسب بشكل خاص فهي تنظم عمل المبرمج وتعزز تفكيره المنطقي والرياضي وتمكنه من فهم المشكلات وتصورها بشكل أفضل قبل حلها وتطبيقها فعليًا على برامج حاسوبية مكتوبة بإحدى لغات البرمجة. تاريخ الخوارزميات تُعزى أقدم الخوارزميات المعروفة إلى البابليين، إذ عُثِر على أقدم لوح يحتوي تعليمات خوارزمية لإجراء عملية القسمة، ويعود تاريخه لسنة 2500 قبل الميلاد. وقد عثِر كذلك على خوارزميات حسابية تعود إلى المصريين القدامى تعود إلى سنة 1550 قبل الميلاد. ازداد استخدام الخوارزميات في حقبة اليونان، حيث ظهرت الكثير من الخوارزميات الرياضية التي ما تزال تُستخدم حتى يومنا هذا، مثل خوارزمية قسمة إقليدس التي تحسب خارج وباقي عملية القسمة. تطور مفهوم الخوارزميات في عصر الحضارة الإسلامية، إذ استخدم المسلمون الخوارزميات لحل المعادلات والمسائل الرياضية. ولعل أشهر هذه الخوارزميات هي خوارزمية حل المعادلات من الدرجة الثانية التي ذُكِرت في كتاب "حساب الجبر والمقابلة" لعالم الرياضيات المسلم محمد بن موسى الخوارزمي مؤسس علم الجبر، والذي تُنسب إليه كلمة خوارزمية في اللغة العربية، وكذلك الكلمة المقابلة لها في اللغات اللاتينية algorithm المُشتقة من الكلمة al-Khwārizmī، وهو الاسم الرومي للخوارزمي -وأيضًا كلمة الجبر algebra. استخدم الأوروبيون كلمة algorithm للدلالة على القواعد والتقنيات التي استخدمها الخوارزمي لحل المعادلات الجبرية، ثمّ عُمِّم هذا المصطلح ليشمل أيّ مجموعة من القواعد والتقنيات الساعية لحل مشكلة ما. استمر مفهوم الخوارزميات في التطور بعد الحقبة الإسلامية إبّان عصر النهضة، خصوصًا مع تطوّر أسس علم الحوسبة في القرن التاسع عشر وإنتاج أول خوارزمية يمكن تنفيذها على الحاسوب سنة 1840 على يد آدا لوفانس Ada Lovelace. ثمّ الصياغة النهائية لمفهوم الخوارزمية على يد آلان تورنغ Alan Turing عبر آلته الشهيرة آلة تورنغ (Turing machine). دورة علوم الحاسوب دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب اشترك الآن أركان الخوارزمية تملك أي خوارزمية ثلاثة أركان رئيسية وهي: الدخل أو المدخلات: تمثل البيانات أو الأشياء الضرورية والمطلوبة التي تعمل عليها الخوارزمية وإن كان الدخل مؤلفًا من عدة عناصر، فإنّ تعداد عناصره يسمى حجم الدخل، مثلًا إن كان الدخل عبارة عن مصفوفة أو سلسلة نصية مؤلفة من n عنصر، فإنّ حجم الدخل سيساوي n. لو عدنا إلى مثال الطبخ فإنّ دخل خوارزمية طهي وجبة معينة ستكون هي المقادير المُستخدمة لإعداد الوجبة. متن الخوارزمية: تأخذ الخوارزمية الدخل، وتطبّق عليه سلسلة من خطوات المعالجة المتتابعة والمُحدّدة سلفًا. مثلًا، يشمل متن خوارزمية الطبخ كل عمليات تجهيز المقادير وإعدَادها وخطوات طهيها. الخرج أو المُخرجات: بعد أن تنتهي الخوارزمية من تنفيذ كافة الخطوات، تُنتج لنا خرجًا يمثل حل المشكلة. مثلًا خرج خوارزمية طهي وجبة سيكون هو الوجبة نفسها جاهزة ومطهيّة. على سبيل المثال إذا أردنا كتابة خوارزمية جداء عددين صحيحين ستكون أركان هذه الخوارزمية كالتالي: الدخل: هو العددان الصحيحان المطلوب حساب ناتج جدائهما x, y الخرج: هو ناتج الجداء z متن الخوارزمية: الخطوة 1: ابدأ الخطوة 2: قم بالتصريح عن ثلاثة أعداد صحيحة x و y و z الخطوة 3: أدخل قيم المدخلات x و y الخطوة 4: اضرب قيم x بـ y الخطوة 5: خزّن ناتج الضرب في z الخطوة 6: اعرض قيمة z الخطوة 7: توقف خطوات حل الخوارزميات عندما تواجهك أي مشكلة وتريد كتابة خوارزمية لحلها عليك أن تفكر في العثور على إجابات للأسئلة التالية: ما هو دخل الخوارزمية أي ما هي المعلومات التي أحتاج إلى الحصول عليها من المستخدم؟ ما هو خرج الخوارزمية أي ما هي المعلومات التي أحتاج لعرضها على المستخدم؟ ما هي الخطوات الرئيسية المطلوبة لحل هذه المشكلة؟ ما هو ترتيب تنفيذ هذه الخطوات؟ ما هي القرارات أو الشروط التي أحتاج مراعاتها عند معالجة المعلومات؟ هل هناك تعليمات بحاجة لأن أكررها عدة مرات؟ طرق تمثيل الخوارزميات يمكنك ثمثيل الخوارزمية أو التعبير عنها بعدة طرق: الطريقة الأولى من خلال الكلام المبعثر الذي يصف حل المشكلة بلغتك المحكية دون اتباع أي قواعد في الوصف. الطريقة الثانية من خلال ما يسمى الشيفرة الوهمية أو الزائفة pseudocode وهي مجموعة من التعليمات التي تحاكي في طريقة كتابتها لغات البرمجة لكنها لا تلتزم بقواعد البرمجة التي يجب الالتزام بها عندما تكتب شيفرات برمجية فعلية. الطريقة الثالثة تسمى المخططات الانسيابية Flowcharts، والمخطط الانسيابي هو تمثيل رسومي للخوارزمية يرسم باستخدام أنواع مختلفة من الرموز لكل رمز غرض معين وهو في تقسيم المشكلة الكبيرة إلى مشاكل صغيرة سهلة الفهم ويعد طريقة مناسبة للتواصل بين الأشخاص غير التقنيين. تتوافر عدة برامج مساعدة تساعدك على رسم المخططات الانسيابية، وللمزيد يمكنك مطالعة مقال كيفية رسم مخطط انسيابي Flowchart باستخدام PowerPoin. مثال على استخدام الخوارزمية في حياتنا اليومية على سبيل المثال إذا طلب منك كتابة خوارزمية توضح طريقة التعامل مع آلة صنع القهوة والشاي ستكون الخطوات التي عليك اتباعها كالتالي: معرفة إن كان الزبون يريد شرب الشاي أم القهوة إضافة الشاي أو القهوة إلى الكوب معرفة إن كان المستخدم يريد إضافة السكر للكوب إذا كان الجواب نعم أضف السكر إلى الكوب سكب الماء الساخن في الكوب للتعبير عن هذه الخوارزمية باستخدام الشيفرة الزائفة سنكتب التالي: START; /Would you like Tea or Coffee?/; if tea { Add Tea in cup; } else { Add Coffee in cup; } /Would you like Sugar?/; if Sugar { Add Sugar in cup; } Pour boiling water in cup END; وللتعبير عنها باستخدام المخطط الانسيابي سنرسم المخطط التالي: أمثلة على الخوارزميات لنفهم بشكل أفضل ما هي الخوارزميات دعنا نستعرض بعض الأمثلة الإضافية على خوارزميات لحل مسائل رياضية بسيطة ونتعرف على أركانها المختلفة وخطوات حلها ونعبر عنها بالطرق المختلفة. خوارزمية لحساب قيمة مضروب عدد في الرياضيات المضروب factorial أو عاملي العدد الصحيح n الذي يعبر عنه بالشكل التالي n! هو جداء كل الأعداد الطبيعية المساوية أو الأصغر من n ما عدا الصفر ولكتابة خوارزمية تحل هذه المسألة الرياضية علينا اتباع الخطوات التالية: الدخل: هو العدد الصحيح المطلوب حساب مضروبه n. الخرج: هو ناتج المضروب factorial المتن: الخطوة 1: إدخال العدد n المراد حساب مضروبه الخطوة 2: تعريف متغير مساعد وليكن i وهو عبارة عن عدد صحيح يأخذ قيمة متغيرة بين الواحد والعدد نفسه ويساعدنا على حساب القيمة المطلوبة. الخطوة 3: تهيئة المتغير factorial الذي يمثل القيمة المؤقتة للمضروب، والمتغير i الذي يمثل المرحلة التي نحن فيها أثناء تنفيذ الخوارزمية بالقيمة واحد أي نجعل factorial = 1 و i = 1 الخطوة 4: إعادة تعيين قيم المتغير factorial بالقيمة factorial*i والمتغير بالقيمة i+1 الخطوة 5: كرر الخطوة 3 حتى تصبح قيمة المتغير i أكبر تمامًا من n الخطوة 6: قم بإيقاف الخوارزمية وإعادة قيمة factorial التي تمثل مضروب العدد n الصورة التالية توضح طريقة رسم المخطط الانسيابي لحل خوارزمية حساب مضروب عدد: هل تعرف طرقًا أو أساليب أخرى لحل هذه المسألة؟ شاركنا إياها في قسم التعليقات أسفل المقال. خوارزمية للعثور على أكبر عدد من بين ثلاثة أعداد سنكتب حل هذه المسألة بأكثر من خوارزمية أو طريقة: طريقة 1: الدخل: 3 أرقام a و b و c الخرج: العدد الأكبر من بينها a أو b أو c المتن: الخطوة 1: أدخل الأرقام الثلاثة وخزنها في المتغيرات a و b و c على التوالي. الخطوة 2: تحقق من كون الرقم الأول a أكبر من الرقم الثاني b و الثالث c عندها اطبع أن a هو العدد الأكبر بين الكل وأنهي التنفيذ الخطوة 3: تحقق من كون b أكبر من a و c عندها اطبع أن b هو العدد الأكبر بين الكل وأنهي التنفيذ الخطوة 4: تحقق من كون c أكبر من a و b عندها اطبع أن c هو العدد الأكبر بين الكل وأنهي التنفيذ الكود الزائف للتعبير عن خوارزمية أكبر عدد بين 3 أعداد: Step-1 Start Step-2 Read three numbers a,b,c Step-3 If a>b then go to step-5 Step-4 IF b>c THEN print b is largest ELSE print c is largest ENDIF GO TO Step-6 Step-5 IF a>c THEN print a is largest ELSE print c is largest ENDIF Step-6 Stop والمخطط الانسيابي للتعبير عن الخوارزمية هو كما يلي: لعلك لاحظت أن الطريقة أعلاه تتطلب اختبار الكثير من الشروط حتى نصل لقرار حول العدد الأكبر من بين الأعداد الثلاثة، دعنا نحاول حلها بطريقة أبسط. كما تلاحظ فإن خوارزمية مقارنة ثلاثة أعداد حتى نصل لقرار حول العدد الأكبر من بين الأعداد الثلاثة تطلبت إجراء خطوتين والمرور مرتين على كل عدد، ولكن ماذا لو كان لدينا 10 أعداد أو أكثر ستزداد الخطوات ومرات المرور على الأعداد وسيزاد زمن الحل وتعقده لذا من الأفضل أن نفكر بطريقة أفضل تمكننا من المرور مرة واحدة على الأعداد ومعرفة العدد الأكبر من بينها. يمكن أن نخزن الأعداد في بنية واحدة مثل المصفوفة ثم نقرأها واحدًا تلو الآخر ونعتبر أن أول عدد هو الأكبر من بين كل الأعداد وكلما قرأنا عددًا جديدًا نقارنه بالذي قبله مباشرة فإن كان أكبر منه نبدل بينهما وإن كان أصغر منه أو يساويه لا نقوم بأي إجراء. لنطبق هذه الطريقة لإيجاد العدد الأكبر من بين ثلاثة أعداد طريقة 2: الدخل: 3 أرقام a و b و c الخرج: max الذي يمثل العدد الأكبر المتن: الخطوة 1: أدخل الأعداد الثلاثة وخزنها في a و b و c على التوالي الخطوة 3: افترض أن العدد الأول a هو الأكبر max = a الخطوة 4: إذا كان العدد الثاني b أكبر من max اجعل max = b الخطوة 5: إذا كان العدد الثالث c أكبر من أكبر من max اجعل max = c الخطوة 6: اعرض قيمة max الكود الزائف للتعبير عن هذه الخوارزمية لإيجاد أكبر عدد من بين 3 أعداد: Step-1 Start Step-2 Read three numbers: a,b,c Step-3 max = a Step-4 IF b > max THEN max = b ENDIF Step-5 IF c > max THEN max = c ENDIF Step-6 print max Step-7 Stop والمخطط الانسيابي للتعبير عن الخوارزمية هو كما يلي: هل لديك خوارزمية أخرى أفضل لحل هذه المسألة؟ يمكن أن تشاركنا إياها لنتناقش حولها. كما تلاحظ فقد مررنا مرة واحدة على الأعداد وعرفنا أيها أكبر، وهذا لن يختلف لو كان لدينا قائمة تحوي 100 عدد أو أكثر، هذا المفهوم ببساطته يسمى بكفاءة الخوارزمية أو تعقيد الخوارزمية والذي يشار إليه برمز Big O وستجده دومًا في أي موضوع يتناول الخوارزميات، لأن من شروط كتابة الخوارزميات أن تكون ذات كفاءة وأقل تعقيدًا ممكنًا. فكل الخوارزميات تعطي في النهاية الخرج الصحيح نفسه ولكن تتميز عن بعضها بكفاءة وكيفية وسرعة الوصول للخرج الصحيح، وهنا تبرز أهمية التفكير المنطقي وضرورة دراسة الخوارزميات وبنى المعطيات لمعرفة الحل الأكثر كفاءة لحل أي مسألة برمجية تواجهها وسنتحدث عن هذا الموضوع بالتفصيل تاليًا في فقرة "تحليل الخوارزميات". تحويل الخوارزمية إلى برنامج حاسوبي إن طرق تمثيل الخوارزمية مفهومة وواضحة لنا كبشر لكنها في الواقع غير قابلة للاستخدام والتطبيق على الحاسوب، لأنّ الخوارزميات خطط عامة ومجرّدة لحل المشاكل. فإن أردنا استخدام الخوارزمية لحل مشكلة ما، فسيكون علينا ترجمتها أو التعبير عنها بإحدى لغات البرمجة كي يفهمها الحاسوب ويعيد لنا النتائج المطلوبة، هذه العملية تُسمّى تحقيق الخوارزمية أو تنفيذ الخوارزمية implementation وينتج عن تحويل الخوارزمية إلى إحدى لغات البرمجة شيفرة برمجية قابلة للتنفيذ execution على الحاسوب. لنضرب مثالًا على ذلك: سنحول الخوارزمية التي ذكرناها آنفًا والتي تحاول إيجاد أكبر عدد من بين ثلاثة أعداد إلى برنامج مكتوب بلغة بايثون حتى يتسنّى لنا تنفيذها على الحاسوب. تنفيذ خوارزمية إيجاد أكبر عدد من بين ثلاثة أعداد في لغة بايثون برنامج بايثون لإيجاد أكبر عدد من بين ثلاثة أعداد a = int(input('a= ')) b = int(input('b= ')) c = int(input('c= ')) max = a if b > max : max = b if c > max : max = c print(max, "هو العدد الأكبر") يمكنك الآن تنفيذ هذه الشيفرة على أيّ حاسوب وستعمل كما هو متوقع. كما يمكنك بالطبع تحقيق الخوارزمية بأيّ لغة برمجة أخرى تريدها مثل C أو C++‎ أو جافا أو جافا سكريبت أو R …إلخ. تمرين ما رأيك أن تجرب تحويل الخوارزمية السابقة إلى برنامج حاسوبي يطلب من المستخدم إدخال مجموعة أعداد تفصل بينها فراغات مثل 4 9 8 7 10 ليحللها البرنامج بتلك الخوارزمية ويعطي العدد الأكبر من بينها (مساعدة: ستحاول استعمال حلقات التكرار loops) مجالات استخدام الخوارزميات كانت الخوارزميات تُستخدم طوال آلاف السنوات من قبل علماء الرياضيات لحل المعادلات والمسائل الرياضية وما تزال إلى يومنا هذا. فالخوارزميات جزء لا يتجزأ من الرياضيات ابتداءً من حل المعادلات الجبرية، وحتى كتابة البراهين المنطقية. وتستخدم الخوارزميات اليوم على نطاق واسع في مجال البرمجة وعلوم الحاسب، فالحاسوب ليس سوى آلة تنفذ الأوامر بكفاءة وسرعة على عكس البشر، الذين يفهمون المطلوب ويحللونه ويفكرون بأدمغتهم لوضع الخوارزميات ثم ينفذونها بواسطة الحاسوب. لذلك، تحتاج إلى تبسيط ووضع خوارزمية للحاسوب لينفذها لك بحذافيرها وبأفضل أداء ممكن. وكل البرامج والتطبيقات وأنظمة التشغيل تعتمد على الخوارزميات وتستخدمها من أجل معالجة البيانات وإجراء الحسابات وحلّ مشكلات العمل كما تستخدم الخوارزميات في عدة مجالات أخرى مثل الفيزياء وتحليل اللغات والاقتصاد وغيرها من مناحي الحياة وهي تطبق اليوم في كل شيء نستخدمه من حولنا ومن أبرز الأمثلة على مجالات استخدام الخوارزميات في حياتنا اليومية نذكر: خوارزميات التواصل الاجتماعي التي تتحكم فيما تراه على مواقع التواصل الاجتماعي خاصتك خوارزميات محركات البحث التي تحسن عمليات البحث وتتنبأ بما سيكتبه المستخدمون. خوارزميات كشف الجرائم باستخدام تقنيات التعرف على الوجه ورسم الخرائط التنبؤية لتوقع الجرائم واتخاذ الإجراءات لمنعها. خوارزميات التشفير التي تقوم بتحويل نص مفهوم إلى نص غير مفهوم وتُستخدم لحماية البيانات المهمة بحيث لا يفهمها إلّا الأشخاص الذين وجهت إليهم. خوارزميات التنبؤ بحالة الطقس ودرجة الحرارة بمساعدة البيانات السابقة وهي تفيد في عدة مجالات أهمها الزراعة والطيران والاتصالات والحروب. خوارزميات تحديد مواعيد وصول الحافلات وجدولتها بأفضل طريقة. خوارزميات تحديد مواقف السيارات المتاحة لمساعدة السائقين على العثور على وجهتم بسرعة وسهولة. خوارزميات توجيه المركبات إلى أفضل طريق. خوارزميات تعديل مسارات الصواريخ. وغيرها الكثير من مجالات الحياة المختلفة في الاقتصاد والعلوم والإعلام وما شابه التي تلعب فيها الخوارزميات دورًا فعالًا وحيويًا، على سبيل المثال عرضت نيتفليكس جائزة قدرها مليون دولار لمن يطور خوارزميتها المستخدمة في اقتراح الأفلام والمسلسلات على الزوار ويجعلها أفضل بنسبة 10%. مواصفات الخوارزمية الجيدة قد تتساءل وهل هناك خوارزمية جيدة وأخرى ليست كذلك؟ وما الذي يجعل الخوارزمية جيدة؟ والجواب هو نعم فكما أنّ هناك وصفات طبخة سيئة ولا تنجح، فكذلك هناك خوارزميات سيئة وغير عملية ولا تصلح للتطبيق، فليست كل سلسلة متتابعة من الخطوات والتعليمات خوارزمية، بل لابد أن تتوفر فيها شروط خاصة تجعلها عملية وقابلة للتطبيق مثل: الوضوح: ينبغي أن تكون كل خطوة من خطوات الخوارزمية واضحة ومفهومة ولا لبس فيها. المحدودية: يجب أن تكون الخوارزمية محدودة، أي أن تكون خطواتها منتهية، وتُنفّذ في مدة زمنية منتهية. فإن كان عدد الخطوات غير منته، أو كان بإمكان إحدى الخطوات أن تستغرق مدة لا منتهية، فإنّها ليست خوارزمية. البساطة والواقعية: ينبغي أن تكون الخوارزمية قابلة للتطبيق بالموارد والتقنيات المتاحة، ولا ينبغي أن تعتمد على تقنية مستقبلية أو غامضة. قابلية التطبيق: يعني الاستقلالية عن لغات البرمجة أي لا ينبغي أن تكون الخوارزمية مرتبطة بلغة برمجة محددة، ويجب أن تكون مجردة وعامّة بحيث تركز على العمل الأساسي للبرنامج بدلًا من التركيز على خصائص لغة برمجة معينة وبعدها يمكن تطبيقها عبر أي لغة برمجة. صحة النتائج: يجب أن تقوم الخوارزمية بتنفيذ المهمة المطلوبة منها دون أخطاء في التنفيذ أو عدم دقة في النتائج. الكفاءة والفعالية: ينبغي أن تستخدم الخوارزمية أفضل الطرق لحل المشكلة بأسرع وقت تنفيذ أو ما يعرف بالتعقيد الزماني للخوارزمية وأقل مساحة ذاكرة أو ما يعرف بالتعقيد المكاني للخوارزمية. هل أحتاج إلى معرفة الرياضيات لتعلم الخوارزميات؟ الجواب هو نعم ولا، وكي أوضح إجابتي أكثر ، فالخوارزميات تُستخدم أساسًا لحل مشاكل حسابية، مثل متوسط مجموعة من القيم، أو أقصر مسار بين نقطتين في شعبة، أو أسهل طريقة لرسم شكل هندسي، أو ترتيب عناصر مصفوفة. كل هذه المشاكل تنطوي على قدر من الرياضيات الأساسية، لذلك فالجواب هو نعم. لكن إن كنت تقصد بمعرفة الرياضيات أنّه ينبغي أن تكون لك شهادة جامعية في الرياضيات، أو تكون لك معرفة عميقة أو حتى متوسطة بها، فالجواب سيكون لا لأنّ الخوارزميات لا تتطلب معرفة عميقة بمفاهيم الرياضيات. تذكر أنّ الخوارزميات هي طرق عامة لحل المشاكل والمسائل الحسابية، لذلك فمقدار الرياضيات التي تحتاجها يتعلق بنوع المشكلة التي تريد حلها، إن كنت تريد حل مشكلة معقدة، مثل التنبؤ بالمناخ، فعلى الأرجح أنّ الخوارزمية ستكون معقدة وتحتاج إلى معرفة متقدمة بالرياضيات لكن لا تدع هذا يخيفك ويصدّك عن تعلم الخوارزميات، إذ أنّ معظم المسائل التي ستُواجهها هي مشاكل لا تحتاج إلا إلى معرفة بسيطة بأساسيات الرياضيات، مثل العمليات الحسابية البسيطة. خلاصة القول هو أنك لا تحتاج إلى تعلم الرياضيات لكي تتعلم الخوارزميات، فما دمت تفهم كيف تجري العمليات الحسابية البسيطة، مثل الجمع والضرب، وبعض المفاهيم البسيطة، مثل المجموعات والدوال وطرق حل المعادلات فيمكنك أن تتعلم الخوارزميات بسهولة. لكن النقطة الأهم هي الارتباط بين التفكير المنطقي أو طرق حل المشكلات وبين الخوارزميات والبرمجة، فالتفكير المنطقي هو بلا شك مهارة ضرورية للبشر عمومًا وللمبرمجين على وجه الخصوص ومن الضروري تعليمه للأطفال من سن مبكرة لمنحهم هذه المهارة المهمة والضرورية جدًا لنجاحهم في مستقبلهم المهني. تحليل الخوارزميات الخوارزمية هي في الأصل خطة لحل مشكلة حسابية فإن لم تكن تملك خطة مُسبقة لحل مشكلة معقدة، فستفشل محاولاتك على الأرجح لحل تلك المشكلة وحتى لو كانت المشكلة بسيطة، فقد يكون هناك العديد من الحلول، وبعض هذه الحلول أسرع وأكفأ من بعض. من هنا تأتي أهمية تحليل الخوارزميات الذي يهتم بدراسة كفاءة الخوارزميات من ناحية الوقت والذاكرة التي يحتاجها تنفيذ الخوارزمية واختيار الحل الأبسط والأسرع والأقل استهلاكًا للموارد، أو بلغة الحوسبة، تريد أن تخفض تعقيد الخوارزمية Algorithms Complexity إلى أقصى حد ممكن. يشمل تعقيد الخوارزمية كل الموارد الضرورية لحل المشكلة، إن كانت الخوارزمية خوارزميةَ طبخ، فإنّ تعقيدها سيكون الوقت والطاقة اللازمة لإعداد الوجبة. أما إن كانت الخوارزمية تسعى لحل مشكلة في الرياضيات، سيكون تعقيدها هو الوقت اللازم لإجراء خطوات الخوارزمية. أما إن كانت الخوارزمية حاسوبية، فإنّ تعقيدها سيكون الوقت ومساحة الذاكرة الضروريان لتنفيذ خطوات الخوارزمية. لهذا السبب ابتكر العلماء فرعًا كاملًا في علم الخوارزميات مُخصّصًا لتقدير تعقيد الخوارزميات يُسمّى نظرية التعقيد، والذي يصنّف الخوارزميات إلى أصناف بحسب تعقيدها الزماني Time Complexity الذي يصف مقدار الوقت الذي يستغرقه تنفيذ الخوارزمية. وتعقيدها المكاني أو ما يسمى بتعقيد المساحة Space Complexity الذي يمثل عدد خلايا الذاكرة اللازمة لتنفيذ عمليات الخوارزمية مع استثناء المساحة المخصصة لدخل الخوارزمية. يتم التعبير عن تعقيد الخوارزمية بتدوين خاص يسمى Big O notation وهو طريقة لوصف تعقيد الخوارزمية الزمني باستخدام مصطلحات جبرية وأدنى هذه الأصناف هو الصنف O(1)‎، والذي يعني أنّ الخوارزمية تستغرق وقتا ثابتًا لحل المشكلة مهما كان حجم الدخل كما في خوارزمية معرفة كون العدد فردي أم زوجي مثلًا أو خوازرمية طباعة أول رقم من بين قائمة من الأرقام، أما الصنف O(n)‎ فَيعني أنّ مدة تنفيذ الخوارزمية متناسبة مع حجم الدخل n كما في خوارزمية حساب مضروب العدد وخوازمية إيجاد أكبر عدد من بين مجموعة من الأعداد. وإليك قائمة مختصرة بأشهر أنواع تعقيد الخوارزميات وفق تدوين Big O ودلالة كل منها: O(1)‎ تعقيد زمني ثابت: أي تستغرق الخوارزمية نفس الزمن مهما كان حجم الدخل. O(n)‎ تعقيد زمني خطي: أي يتناسب زمن تنفيذ الخوارزمية بشكل خطي مع حجم الدخل، بمعنى آخر إذا كان حجم الدخل n فإن عدد الخطوات المطلوب لحلها سيكون n على الأكثر. O(sqrt(n)) تعقيد جذر تربيعي: أي إذا كان حجم دخل الخوازرمية هو n سوف يتناسب زمن تنفيذ الخوارزمية مع الجذر التربيعي لقيمة الدخل. O(n^c)‎ تعقيد كثير الحدود: يتناسب زمن تنفيذ الخوارزمية مع حجم الدخل مرفوع للأس c وله أنواع فقد يكون تعقيد زمني تربيعي O (n^²)‎ أي يتناسب زمن تنفيذ الخوارزمية مع مكعب حجم الدخل أو تعقيد زمني تكعيبي O(n^3)‎ أي يتناسب زمن تنفيذ الخوارزمية مع مكعب حجم الدخل. O(log n)‎ تعقيد لوغاريتمي: تناسب زمن تنفيذ الخوارزمية مع لوغاريتم حجم الدخل. O(n log n)‌‎ تعقيد لوغاريتمي خطي: وهو أبطأ قليلاً من الخطي O(2^n)‎ تعقيد أسي: وفيه تتضاعف خطوات الخوارزمية بشكل أسي مع زيادة حجم الدخل. O(n!)‎ تعقيد عاملي: أي يتناسب زمن الخوارزمية مع قيمة عاملي الدخل أي ضرب جميع الأعداد الصحيحة الموجبة الأصغر من قيمة الدخل. يمكنك أن تجد حلًا للمشاكل بدون الخوارزميات، لكن من النادر أن يكون ذلك الحل الذي وجدته هو الحل الأفضل والأكفأ، وهذه فائدة تحليل الخوارزميات فهو يمكّنك من العثور على الحل الأمثل والأنسب والأقل استهلاكًا للموارد. للمزيد من المعلومات أنصح بمطالعة مقال مدخل إلى تحليل الخوارزميات ومقال الدليل الشامل عن تعقيد الخوارزميات أنواع الخوارزميات البرمجية الخوارزميات هي خطط عامة لحل المشاكل وتتنوع أساليب وأنواع الخوارزميات بحسب الأسلوب الذي تتبعه الخوارزمية لحل المشكلة أو بحسب نوع المشكلة التي تحلها، وبناء على ذلك يمكن أن نجد أنواعًا مختلفة من الخوارزميات ومن أبرزها: خوارزميات القوة الغاشمة Brute force algorithms : تحاول الخوارزميات من هذا النوع حل المشكلة بطريقة مباشرة وتمر بجميع الخيارات الممكنة حتى تتمكن من العثور على حل لهذه المشكلة. الخوارزميات الجشعة Greedy algorithms: تحاول الخوارزميات الجشعة حل المشكلة خطوة فخطوة، بحيث تقترب رويدًا رويدًا من الحل العام للمشكلة. خوارزميات البرمجة الديناميكية Dynamic Programming: تقسّم خوارزميات البرمجة الديناميكية المشكلة إلى مشاكل فرعية أبسط، ثمّ تحل تلك المشاكل الفرعية لاستنتاج الحل النهائي خوارزميات فرق تسد Divide and conquer algorithms: تقسِّم خوارزميات فرِّق تسد المسألة إلى مسائل فرعية تشبه المسألة الأصلية، ثمّ تحلها وتدمج الحلول لتقديم حلٍّ المسألة الأصلية. خوارزميات التعقب الخلفي Backtracking algorithms: تحاول خوارزميات التعقب الخلفي حل المشكلة تعاوديًا عبر بناء الحل تصاعديًا خطوة فخطوة، مع حذف الحلول التي لا تستجيب للقيود التي تفرضها المسألة المُراد حلها في أيّ وقت أثناء تنفيذ الخوارزمية. خوارزميات الترتيب Sort algorithms: هي خوارزميات ترتب مجموعة من العناصر القائمة في ترتيب معين رقمي أو هجائي. والفرز هو أحد الخطوات الهامة في الخوارزميات الأكثر تعقيدًا، توجد عدة خوارزميات تمكننا من تحقيق عملية الفرز ولكل منها ميزاتها ومحدوديتها. خوارزميات البحث Search algorithms: هي خوارزميات تقوم بتحديد موقع بيانات محددة بين مجموعة من البيانات أي أنها تبحث عن البيانات المخزنة ضمن بعض الهياكل أو بنى البيانات وتقوم باستردادها. خوارزميات التعلم الآلي: هي خوارزميات تحاول التعلم بناءً على مجموعة من حالات اتخاذ القرار السابقة كي تتمكن من اتخاذ قرارات معقدة بناءً عليها. خوارزميات التشفير: هي الخوارزميات التي تقوم بتحويل نص مقروء إلى نص غير مقروء يُعرف باسم النص المشفر بحيث يمكن للأطراف المصرح لهم فقط بفهم المعلومات الموجودة في هذا النص وهي خوارزميات هامة جدًا في مجال أمن البيانات الحساسة والحفاظ على الخصوصية. كانت تلك بعض أنواع وتصنيفات الخوارزميات الأكثر شيوعًا وهناك بالطبع العديد من الخوارزميات الأخرى للعديد من الحالات المختلفة. هناك أيضًا طرق أخرى يمكن تطبيقها بسهولة في التطبيقات مثل خوارزمية Dijkstra و Cycle Detection و Kruskal Minimum Spanning Trees فهي من الخوارزميات الأساسية للمبتدئين للتعلم منها. أهمية الخوارزميات في البرمجة هناك من قد يقول أنّ تعلم الخوارزميات تَرفٌ، وهو غير ضروري لكتابة البرامج والتطبيقات، وأنّه يمكن للمبرمج أن يكتب برامجه مباشرة دون الحاجة إلى مفاهيم الخوارزميات. صحيح أنّه ليس عليك أن تكون خبيرًا في الخوارزميات لتَكون مبرمجًا، لكن لا يمكنك أن تكون مبرمجًا بارعًا ومحترفًا دون أن تتعلم فن تصميم الخوارزميات. يوفر تعلم الخوارزميات للمبرمج العديد من الفوائد أبرزها: القدرة على حل المشكلات بشكل أفضل الاستخدام الفعال للموارد الحاسوبية يوفر وقت البرمجة يجعل منك مبرمجًا أفضل لنناقش كل فائدة منها بمزيد من التفصيل ونتعرف كيف يسهم تعلم الخوارزميات في تعزيزها. القدرة على حل المشكلات بشكل أفضل سيحسن تعلمك لطرق حل الخوارزميات من قدرتك على حل المشكلات بصورة عامة والمشكلات البرمجية على وجه الخصوص، ويكسبك مرونة ذهنية في التفكير في الحلول ويساعدك لاحقًا في كتابة البرامج الحاسوبية المتنوعة أيًا كانت اللغة البرمجية المستخدمة خصوصًا بأنّ الخوارزميات مستقلة عن لغات البرمجة، لذا يمكنك استخدامها مهما كانت لغة البرمجة التي تعمل عليها. الاستخدام الفعال للموارد يضمن لك اختيار الخوارزمية الصحيحة الاستخدام المناسب للموارد مثل الذاكرة والتخزين والشبكة وغيرها. فلا يكفي أن تكون الفكرة التي بنيت عليها البرنامج أو التطبيق مفيدة ومبتكرة، ينبغي أن تكون عملية بحيث ينفّذها الحاسوب أو الجوال في وقت معقول وموارد محدودة، فما فائدة تطبيق رسم يحتاج دقيقة كاملة ليرسم مربعًا، وما فائدة برنامج يحتاج إلى 10 جيجابايت من الذاكرة ليعمل! توفير وقت البرمجة يوفر عليك تعلم الخوارزميات الكثير من الوقت، إذ أنّ معظم المشاكل والمسائل التي قد تعترضك أثناء كتابة البرامج لها حلول جاهزة على هيئة خوارزميات مُحسّنة وسريعة، ما يغنيك عن إعادة اختراع العجلة في كل مرة تعترضك مشكلة ما، لأنّ هناك من حلّها قبلك على الأرجح وأعدّها على هيئة خوارزمية وكل ما عليك فعله هو تحويلها إلى لغة البرمجة التي تستعملها ثم تنفّذها وقد لا تضطر حتى إلى تنفيذها فمعظم الخوارزميات الشهيرة والفعالة مثل خوارزميات البحث والفرز تدمج في لغات البرمجة بشكل مكتبات جاهزة يمكنك استخدامها في شيفراتك البرمجية. الخوارزميات تجعل منك مبرمجًا أفضل تعلم الخوارزميات سيجعلك مبرمجًا أفضل وأكثر احترافية، فسَواء كنت متخصصًا في تطبيقات الجوال أو تطبيقات سطح المكتب، أو في بناء المواقع أو تصميم الألعاب أو غيرها من مجالات البرمجة، فإنّ تعلم الخوارزميات سيوسع أفق تفكيرك البرمجي ويساعدك على تطوير برامج أجود وأسرع وأكثر موثوقية. أهم مصادر تعلم الخوارزميات هناك للأسف ضعف في المحتوى العربي التقني، هذا الضعف يظهر أكثر ما يظهر في مجالات الخوارزميات. ولسدّ هذا القصور في المحتوى العربي فقد وفرت أكاديمية حسوب العديد من مصادر التعلم القيمة باللغة العربية. فنظرًا للأهمية الكبيرة للخوارزميات في كافة مجالات البرمجة، وفي غيرها من المجالات مثل الرياضيات والتنمية وغيرها، فقد وفرت لك أكاديمية حسوب دورة علوم الحاسب والتي تتضمن مسارات متعددة يحتاجها أي مبتدئ في تعلم البرمجة من أهمها مسار الخوارزميات وبنى المعطيات الذي يعلمك خطوة بخطوة كيفية كتابة الخوارزميات وتحليلها ويعرفك على أهم الخوارزميات التي تفيدك في عملك البرمجي مثل خوارزميات البحث والترتيب والخوارزميات الرياضية وخوارزميات الرسوم البيانية وغيرها الكثير. كما نشرت الأكاديمية سلسلة الخوارزميات للمحترفين التي تشرح الخوارزميات بالتفصيل وتغطّي كافة مفاهيمها الأساسية مثل مفهوم التعقيد لتقدير الموارد التي تستهلكها البرامج كالوقت والذاكرة. إضافة إلى مفاهيم البرمجة الديناميكية، وبعض أنماط الخوارزميات العامة. تلك السلسلة غنية بالأمثلة التطبيقية، إذ تستعرض الكثير من الخوارزميات لحل بعض المشاكل التقليدية في علم الحاسب خصوصًا تلك المتعلقة بالأشجار وترتيب المصفوفات والبحث، علاوة على طائفة من الخوارزميات المتنوعة في مجالات الجبر والهندسة ونظرية الأعداد. كما أن السلسلة تنفذ الخوارزميات التي تستعرضها من خلال العديد من لغات البرمجة، فمهما كانت لغة البرمجة خاصتك، سواء كانت بايثون أو جافا أو C++/C أو #C‏‏ أو جافا سكريبت، فستجد أمثلة بهذه اللغات وغيرها في هذا الكتاب. وستجد كذلك توثيقًا شاملًا عن الخوارزميات في موسوعة حسوب يضم توثيقات لأهم الخوارزميات المُستخدمة في البرمجة. وننصحك كذلك بأن تشترك في قناة أكاديمية حسوب على يوتيوب وستجد فيها الكثير من الدروس المفيدة والمواضيع الشيقة حول البرمجة والخوارزميات والتفكير المنطقي وغيرها الكثير. وأخيرًا إذا كنت تتساءل هل يجب علي كمبتدئ أن أتعلم الخوارزميات أولًا أم أتعلم إحدى لغات البرمجة أولًا فنصيحتي لك أن تبدأ كخطوة أولى بالتعرف على أساسيات البرمجة وبعد التمكن منها يمكنك البدء بتعلم الخوارزميات وتطوير تفكيرك البرمجي والخوارزمي على التوازي في رحلة التعلم حتى تصل للاحتراف في كليهما. إذا أتقنت تعلم الأساسيات يمكن أن تنتقل لتعلم الأمور المتقدمة وستجد في قسم البرمجة ضمن وتحديدًا في قسم "مقالات برمجة متقدمة" في أكاديمية حسوب مجموعة متنوعة من المقالات المتقدمة التي تزيد معرفتك وخبرتك في مجال الخوارزميات وفي حال واجهك أي سؤال يمكنك طرحه في قسم الأسئلة والأجوبة في الأكاديمية. الخلاصة تعرفنا في مقال اليوم ما هي الخوارزمية وأهمية الخوارزميات في علوم الحاسب وهندسة البرمجيات، وتعرفنا على خطوات حل الخوارزمية وطرق التعبير عن الخوارزميات بالشيفرة الوهمية والمخططات الانسيابية ثم تحويلها بعد ذلك إلى برامج حاسوبية من خلال الأمثلة العملية البسيطة التي تناسب المبتدئين. كما تعرفنا في الختام على أبرز الفوائد التي تجنيها كمبرمج من تعلم الخوارزميات، وأهم المراجع العربية التي تشرح الخوارزميات من الصفر للاحتراف، فإذا كنت تسعى لتكون مبرمجًا محترفًا فتعلم الخوارزميات أحد الأمور المهمة التي ينبغي أن تضعها في الحسبان لتساعدك على تحقيق هذا الهدف. اقرأ أيضًا أمثلة عن أنواع الخوارزميات تعرف على تخصص هندسة البرمجيات مهندس البرمجيات من هو وما هي مهامه ما هي مدة تعلم البرمجة؟
    3 نقاط
  9. مصطلح إطار العمل أو الفريم وورك Framework يعد أحد المصطلحات الفنية والبرمجية التي تربك المبتدئين على وجه الخصوص في بداية مشوار تعلم البرمجة والتي لا يستطيع فهم دلالتها ولا إدراك مدى أهميتها بشكل جيد. وكثيرًا ما يتساءل المبرمج المبتدئ عن معنى إطار العمل Framework وعن مزايا ومحدويات استخدام أطر العمل Frameworks في عمله البرمجي وعملية البرمجة عمومًا، وهل يتوجب عليه تعلم إطار عمل للغة برمجة محددة، أم أن تعلمه للغة البرمجة نفسها يكفيه في سوق العمل، وهل تعلم إطار العمل صعب ويستغرق وقتًا، ومالفرق بين إطار العمل والمكتبة، وغيرها من الأسئلة من هذا القبيل. فإذا كنت مهتمًا بعرفة الإجابة على كل هذه التساؤلات فتابع قراءة هذا المقال للنهاية. ما هو إطار العمل Framework؟ إطار العمل Framework في البرمجة هو ببساطة آلية يتم من خلالها إعداد وتجهيز كافة الوظائف الضرورية والشائعة التي تستخدم بكثرة عند تطوير التطبيقات والأنظمة وإتاحتها للمبرمج ليستخدمها ويستفيد منها في عمله دون أن يحتاج لإعادة كتابة هذه الوظائف بنفسه من الصفر وبهذا نستنتج أن استخدام إطار العمل يختصر الكثير من الوقت ويجعل العمل البرمجي أكثر كفاءة. لتفهم الأمر بصورة أفضل تخيل أنك تحتاج لكتابة سيرتك الذاتية، سيكون أمامك خياران إما أن تفتح مستندًا فارغًا وتبدأ بكتابة كل شيء وتنسيقه بنفسك من الصفر، أو تعتمد على قالب جاهز للسيرة الذاتية يكون مقسمًا ومنسقًا وكل ما عليك هو ملء البيانات الضرورية الخاصة بك فقط دون أن تشغل بالك بالكثير من التفاصيل الأخرى سيكون الخيار الثاني أفضل وأسرع بالتأكيد. يساعدك إطار العمل في مشروعك البرمجي بطريقة مشابهة فهو يعمل كقالب أو هيكل أساسي عليك الالتزام به لإنشاء التطبيقات الخاصة بك، ويوفر لك مجموعة من الأدوات أو المكونات أو الحلول البرمجية الجاهزة لبناء تطبيقات مخصصة بطريقة آمنة وسريعة ومنظمة. ستجد الكثير من أطر عمل لكل لغات البرمجة الشائعة مثل جافاسكريبت وبايثون و PHP وجافا، ومن أجل استخدام أي إطار منها عليك بداية تعلم كيفية تطوير المشاريع في كل إطار منها والاستفادة من التسهيلات الكثيرة التي توفرها لك هذه الأطر. ما الفرق بين إطار العمل والمكتبة؟ كثيرًا ما يتم الخلط بين مفهوم إطار العمل Framework ومفهوم مشابه له في البرمجة وهو المكتبة Library ورغم التشابه بينهما في طريقة العمل واستخدامهما بالتبادل في بعض الأحيان، إلا أن مفهوم المكتبة أبسط وأكثر محدودية فالمكتبة تركز على توفير وظيفة محددة في حين يوفر إطار العمل مجموعة متكاملة من الميزات التي تمكنك من برمجة تطبيقات في مجال محدد. تُعرَّف المكتبة بأنها عبارة عن مجموعة من التعليمات البرمجية المختبرة القابلة لإعادة الاستخدام والتي تنفذ وظيفة معينة وتحل مشكلة محددة، في حين ينفذ إطار العمل حزمة وظائف متكاملة أو يوفر مخططًا عامًا لبناء التطبيقات في حين لا توفر المكتبات هذه الميزة كما تحدد أطر العمل قواعد وإرشادات كتابة التعليمات البرمجية الخاصة بك وتنظم الملفات والمجلدات الخاصة بمشاريعك، ويمكن أن تتضمن مجموعة من المكتبات وتستخدمها لتنفذ مهام معينة. على سبيل المثال من بين المكتبات الشائعة نذكر مكتبة ريآكت React وهي مكتبة برمجية مبنية بلغة جافاسكربت ومتخصصة في بناء واجهات المستخدم ومكتبة jQuery التي تختصر العديد من الأكواد والتعليمات البرمجية المكررة في جافا سكريبت لتسهيل عملية البرمجة، ومن بين أطر العمل الشائعة نذكر أنجولار Angular وفيو Vue.js وهما إطارا عمل بلغة جافا سكريبت مختصان في تصميم واجهات مواقع الويب. ما الفرق بين إطار العمل ولغة البرمجة؟ يمكن للمطور أن يستخدم لغة البرمجة ويكتب كافة التعليمات البرمجية اللازمة لبناء التطبيقات من الصفر كما يمكنه إن شاء الاستعانة بإطار عمل Framework مخصص لتطوير برامجه وتطبيقاته. ورغم أن استخدام إطار العمل يفيد المطورين ويسرع وتيرة عملهم، إلا أنه يحد من حريتهم في كتابة التعليمات البرمجية ويقيد إمكانيات التطوير ويمكنهم من بناء تطبيقات لأغراض محددة فقط، في حين أن استخدام لغة برمجة يمكنهم من تطوير ما يشاؤون من تطبيقات متنوعة، حتى إطار العمل نفسه تم بناؤه في النهاية بإحدى لغات البرمجة. باختصار لغة البرمجة هي الأساس ومن خلال تعلمها يمكنك بناء ما تشاء من تطبيقات، أما إطار العمل فهو مصمم لنوع محدد من التطبيقات مثل تطبيقات الويب أو تطبيقات الجوال أو تطبيقات علم البيانات أو الذكاء الاصطناعي وإنترنت الأشياء …إلخ ويفضل أن تتعلم استخدامه بعد أن تتعلم البرمجة وتتمكن من أساسياتها. أهمية إطار العمل في البرمجة تبرز أهمية إطار العمل framework بشكل أساسي في كونه يتيح لك إعادة استخدام التعليمات البرمجية بدلًا من إعادة كتابتها من جديد، وفيما يلي جملة من الفوائد التي يمكن أن يوفرها استخدام إطار العمل: يساعد على توفير كود أكثر أمانًا لكونه يتضمن شيفرات تتحقق من المصادقات والصلاحيات وتحمي تطبيقك من الاختراق وتعالج الكثير من الثغرات الأمنية الشائعة مثل CSRF و XSS و SQL Injection. تركيز الجهود على كتابة التعليمات البرمجية الخاصة بالمشروع فقط بدلًا من برمجة وظائف متكررة وشائعة الاستخدام. توحد أنماط وقواعد كتابة التعليمات البرمجية وتوفر مخططًا عامًّا يمكن لكافة الفرق البرمجية فهمه بسهولة. يساعد في تطوير مشروعك وإضافة ميزات جديدة له بسهولة دون الحاجة للتعديل على الكود الأساسي لإطار العمل. يغني عن إعادة اختراع العجلة ويوفر لك الوقت والتكلفة اللازمين لتطوير المشاريع والتطبيقات. يساعد في كتابة كود نظيف وغير مكرر. يسهل عملية اختبار الكود وتصحيح الأخطاء البرمجية. يقلل بالعموم من كمية الأخطاء البرمجية لأنك ستكتب كود أقل وبالتالي ستنتج لديك أخطاء برمجية أقل. محدوديات إطار العمل لا شكَّ أن استخدام إطار العمل يفيدك كمطور ويساعدك على تسريع وتحسين العمل البرمجي، إلا أن الاعتماد على أطر العمل وحدها يفرض عليك بعض القيود وإليك أبرزها: يوفر وظائف محددة ويختص في بناء تطبيقات في مجالات معينة فقط. الاعتماد عليها قد يعيق المبرمج من فهم لغات البرمجة بشكل متعمق وواضح. بعض أطر العمل معقدة ويستغرق تعلمها وفهمها بشكل جيد وتطوير التطبيقات باستخدامها الكثير من الوقت. نحتاج إلى اختيار إطار العمل المناسب للتطبيق فاختيار الإطار غير الملائم قد يؤثر سلبًا على أداء تطبيقاتك وتجربة المستخدمين. تصدر لها تحديثات جديدة بشكل دوري، لذا سيتوجب عليك البقاء على اطلاع دائم على كل جديد ومعرفة كل الميزات الجديدة المضافة للإطار والمميزات التي تم الاستغناء عنها في كل إصدار. توقف تحديث إطار العمل أو تغيره ينعكس على سير عملية تطوير التطبيق المبرمج فيه وأمانه مثلما حصل مع إطار العمل AngularJS عندما قررت غوغل التوقف عن تطويره وإطلاق نسخة عنه مختلفة تمامًا. صفات إطار العمل الجيد تتوافر عشرات أطر العمل في المجالات البرمجية المختلفة الأمر الذي يشعرك بالحيرة في تحديد الإطار الأفضل لمشروعك ويجعلك تتساءل كيف أختار إطار العمل المناسب؟ بالعموم يتصف إطار العمل الجيد بثلاث صفات أساسية وهي: التوثيق الجيد توفير الوظائف المطلوبة لعملك الشهرة والدعم المجتمعي لنوضح بمزيد من التفصيل كل صفة من هذه الصفات وأهميتها في اختيار إطار العمل الأفضل. التوثيق الجيد اختر إطار عمل موثقًا بشكل جيدًا كي تتمكن من العودة إليه عندما تحتاج لمعرفة المزيد من المعلومات حول استخدام ميزة معينة أو حل مشكلة تواجهك في استخدامه، فالتوثيق الجيد يوفر عليك الكثير من الوقت والجهد. توفير الوظائف المطلوبة لعملك ضع في اعتبارك أن لكل إطار عمل حدود معينة لذا من الضروري أن تبحث بشكل جيد في ميزات الإطار الذي تريد اعتماده وتتأكد من أنه يلبي متطلبات مشروعك ويحقق لك كافة الوظائف والميزات التي تحتاج لتحقيقها بالشكل الأنسب، وبنفس الوقت لا تختر إطار عمل شديد التعقيد أو مكتظًا بالميزات التي قد لا تحتاجها على الإطلاق! الشهرة والدعم المجتمعي لاشك أن شهرة إطار العمل ووجود مجتمع داعم له يدل على قوته والطلب الكبير عليه في سوق العمل، لذا احرص على استخدام إطار عمل معروف وله قاعدة مستخدمين نشطة ويفضل بعض المبرمجين الاعتماد على أطر عمل حرة ومفتوحة المصدر وغير مقيدة أو مدعومة من شركات معينة لتخوفهم من انعكاس أي طارئ يحصل لها أو تغير في سياستها على إطار العمل. ولذلك السبب ترى البعض يميل إلى استخدام إطار العمل Vue.js الذي انبثق من أروقة المجتمع الحر بدلًا من إطار العمل Angular الذي ولد بين أروقة شركة غوغل مثلًا، ولكن هنالك طرف مقابل يشير إلى تنظيم وقوة وسرعة تطوير أطر العمل التي تقف خلفهم الشركات نظرًا لدعمهم السخي طويل الآجل عادةً خصوصًا إن وقفت شركات تقنية كبيرة خلفهم والحديث يطول في هذه النقطة وهي خارج موضوع المقال فقط أحببت الإشارة إليها نظرًا لأهميتها في أي نقاش يدور حول المفاضلة بينها. أنواع أطر العمل frameworks في البرمجة هناك عدة أنواع من أطر العمل حيث يختص كل إطار بمجال استخدام معين، وفيما بعض أهم أنواع أطر العمل حسب التطبيقات أو الوظائف التي يؤديها: 1. أطر عمل تطوير الويب Web development frameworks تستخدم هذه الأطر في تطوير تطبيقات الويب ومن أشهرها إطار عمل أنجولار Angular وفيو جي إس Vue.js وهي أطر عمل جافا سكريبت شائعة تستخدم لتطوير الواجهات الأمامية للويب، وإطاري عمل إكسبرس Express و NestJS وهي أطر عمل Node.js لتطوير الواجهات الخلفية للويب، وإطاري عمل جانغو Django وفلاسك Flask وهي أطر عمل مفتوحة المصدر مكتوب بلغة بايثون مخصصة لتطوير الواجهات الخلفية للويب، وإطار عمل Ruby on Rails الذي يوفر لك كل ما تحتاجه لإنشاء تطبيق ويب بسهولة وسرعة وأمان وإطار عمل لارافيل Laravel المبني بالاعتماد على لغة PHP. 2. أطر عمل تطوير الجوال Mobile development frameworks من أشهرها في تطوير تطبيقات الجوال نذكر إطار عمل React Native مفتوح المصدر مكتوب بلغة جافا سكريبت طورته فيسبوك لتطوير تطبيقات جوال متوافقة مع كافة الأنظمة الأساسية، وإطار أيونيك Ionic الذي يستخدم تقنيات الويب HTML و CSS وجافا سكريبت من أجل تطوير تطبيقات الجوال وهو يتكامل مع أطر تطوير الواجهات الأمامية مثل Angular و Vue، وإطار عمل فلاتر Flutter وهو إطار عمل مفتوح المصدر للغة دارت Dart من جوجل لتطوير تطبيقات الجوال وهو يدعم أنظمة iOS و Android ويحتوي على عناصر واجهة مستخدم قابلة للتخصيص بالكامل، وإطار عمل أباتشي كوردوفا Apache Cordova الذي يمكنك من تطوير تطبيقات هجينة للهاتف الجوال. 3. أطر عمل علم البيانات Data science frameworks تعرف هذه الأطر كذلك بأطر التعلم الآلي Machine Learning Frameworks وهي تساعد علماء البيانات على إنشاء نماذج تعلم آلي وتصميمها بشكل أسرع وأسهل واستخراج المعلومات المفيدة من مجموعات البيانات بالاستفادة من تقنيات البرمجة والذكاء الاصطناعي والتعلم الآلي. وهناك العديد من أطر عمل علم البيانات ومن ضمنها scikit-Learn و XGBoost و TensorFlow و PyTorch. 4. أطر إدارة المحتوى Content management frameworks تعرف أيضًا باسم نظم إدارة المحتوى Content Management Systems أو اختصارًا CMS هي برمجيات توفر مكونات قابلة لإعادة الاستخدام لإنشاء وإدارة محتوى الويب وعرضه ضمن مدونات أو مواقع إلكترونية أو تطبيقات جوال وهي توفر ميزات أخرى مثل سهولة الاستخدام وتحسين محركات البحث والأمان. ومن أشهر هذه النظم نذكر نظام ووردبريس WordPress الشهير المستخدم في إنشاء ما يقارب من نصف المواقع الإلكتروني ودروبال Drupal الذي يعد نظام مثالي لتطوير المواقع التي تحتوي على الكثير من المحتوى وهو يتطلب معرفة تقنية أكثر من بقية نظم إدارة المحتوى. 5. أطر عمل أتمتة الاختبار Test Automation frameworks يستخدم مطورو البرمجيات أطر عمل الأتمتة من أجل إنشاء حالات اختبار التطبيقات والتأكد من سير عملها بكفاءة وتوفر لهم أدوات وتوصيات للتحقق من جودة البرمجيات واتباع معايير الترميز المناسبة. من أشهر أطر الاختبار نذكر سيلينيوم Selenium وهو إطار مفتوح المصدر لأتمتة اختبار تطبيقات الويب، وCypress المبني بجافا سكريبت والمخصص لاختبار الواجهة الأمامية لتطبيقات الويب، و Playwright للاختبار الشامل لتطبيقات الويب. هل يمكن البدء باستخدام إطار العمل دون تعلم لغة البرمجة؟ لاشك أن إطار العمل يوفر لك كمطور أداة قيمة لتطوير البرامج التطبيقات المختلفة، لكن السؤال الذي يطرح نفسه هل يغني تعلم أطر العمل واستخدامها في بناء التطبيقات العملية عن تعلم لغات البرمجة وفهمها بشكل متعمق؟ في الواقع حتى لو لم تكن ترغب في تطوير التطبيقات بإحدى لغات البرمجة وتميل للاستفادة من ميزات أحد أطر العمل فلا غنى لك عن تعلم لغة البرمجة وفهم أساسياتها إلى جانب إطار العمل فكلما فهمت لغة البرمجة بشكل أفضل سيسهل عليك فهم أطر العمل. كما أن تعلّم البرمجة يوسع أفق عملك ويمكنك من بناء العديد من التطبيقات في مختلف المجالات، أما إطار العمل فهو مصمم كما ذكرنا سابقًا لغرض واحد فقط وبالتالي سيقيدك بنوع محدد من التطبيقات. ويمكن باختصار أن نلخص الإجابة على هذا السؤال بجملة واحدة: يمكنك استخدام أطر العمل، لكن قبل ذلك تعلم أساسيات لغة البرمجة واتقنها ثم استفد من ميزات إطار العمل الخاص بتلك اللغة كما يحلو لك. الخلاصة تعرفنا اليوم على مفهوم إطار العمل Framework ودوره المهم في توفير الوظائف القياسية وتحديد الخطوط العريضة التي تنظم المشاريع البرمجية وتوفر وقت وجهد المطورين والمبرمجين، واكشتفنا أهم الفروقات بين أطر العمل وبين أدوات تطوير البرامج الأخرى مثل المكتبات ولغات البرمجة، وتعلمنا طريقة اختيار أفضل إطار عمل يناسب متطلباتنا وعددنا أهم صفات إطار العمل الجيد، وأخيرًا استعرضنا قائمة بأهم أطر العمل المستخدمة في مجالات مختلفة كتطبيقات الويب وتطبيقات الجوال وغيرها من المجالات. هل تستخدم في عملك أحد أطر العمل التي وردت في سياق المقال أو أطر عمل أخرى؟ ما هو هذا الإطار وفي أي مجال تستخدمه؟ هل هناك أي مشاكل تواجهها في التعامل مع هذا الإطار أم أنك راضٍ عن أدائه. شاركنا تجربتك في التعليقات أسفل المقال. اقرأ أيضًا تعلم أساسيات البرمجة قواعد البرمجة ببساطة للمبتدئين أسهل لغات البرمجة مهندس البرمجيات من هو وما هي مهامه تعرف على تخصص هندسة البرمجيات
    3 نقاط
  10. بدأنا في هذه السلسلة برمجة الذكاء الاصطناعي تعريف الذكاء الاصطناعي وارتابط البرمجة والذكاء الاصطناعي ثم تحدثنا عن البرمجة وأساسيات البرمجة بلغة بايثون، وسنكمل في هذا المقال الحديث بالتفصيل عن تخصص تعلم الآلة تحديدًا الذي يندرج ضمن الذكاء الاصطناعي. تعريف تعلم الآلة Machine Learning عرَّف البروفسور توم ميتشل Tom Mitchell -وهو عالم حاسوب أمريكي وبروفيسور في جامعة Carnegie Mellon في الولايات المتحدة- تعلم الآلة بالتعريف التالي: لا بأس إذا بدا ذلك التعريف غامضًا قليلًا، إذ سنشرحه أثناء الحديث عن الخطوات التطبيقية وعملياتها في برمجة تعلم الآلة، كما سيُعرَّف كل رمز من تلك الرموز المذكورة في التعريف بشيء من التفصيل لاحقًا لنرى موقع تلك الرموز من الجانب التطبيقي. إنّ نماذج تعلم الآلة ما هي إلا خوارزميات بُنيت على قواعد الجبر الخطي والتفاضل والتكامل وعلم الإحصاء؛ ولذلك فإنّ فروع تلك الرياضيات مهمة لدارسي تعلم الآلة ليُؤهلوا لفهم أفضل لما يحدث وراء الأحداث ولفهم ما تفعله الخوارزميات، وبالطبع ستكون محاولة فهم لماذا تعمل تلك الخوارزميات بالأمر الشاق جدًا، وذلك تخصص باحثي الذكاء الاصطناعي القائمين باختراع وتطوير تلك الخوارزميات؛ أما نحن المبرمجين فما نريده لا يزيد عن فهم آلية عمل تلك الخوارزميات. يُعَدّ تعلم الآلة Machine Learning فرعًا من فروع علم الذكاء الاصطناعي، وبالأحرى هو إحدى طرق صناعة الذكاء من بين طرق متعددة وهو الأكثر شيوعًا في العقد الحالي مع أنّ الأبحاث في ذلك العلم كانت قد بدأت منذ القرن الماضي بالفعل، لكن لم تر تلك الخوارزميات النور لعدم وجود إمكانيات حاسوبية في ذلك الوقت تتيح تنفيذ تلك الخوارزميات، فالحواسيب لم تكن قادرة على تنفيذ هذه المهام، كما أنّ الأمر يتطلب الكثير والكثير من البيانات التي لم تكن لتتوفر بالصورة المطلوبة في ذاك الوقت. يدعى ذلك العلم في وسط الرياضيات باسم التعلم الإحصائي Statistical Learning أو التحليلات التنبؤية Predictive Analytics، ويسعى ذلك العلم ببساطة إلى استخراج المعلومات من البيانات السابقة ليتنبأ معلومات أخرى بصورة دقيقة لم يتعرف عليها من قبل. نرى تطبيقات تعلم الآلة واضحةً في حياتنا اليومية على الإنترنت، إذ تُستخدَم خوارزميات تعلم الآلة في اليوتيوب ليرجِّح المقاطع أثناء تصفحك لمشاهدتها، كما أنّ أمازون تستخدِمها لترجيح المنتجات؛ أما فيسبوك فيستخدِمها في تحديد وجهك ووجه أصدقائك في صوركم معًا، فعندما تتصفح أحد تلك المواقع فستجد على الأرجح في كثير من أجزائها مهامًا تستخدِم فيها إحدى خوارزميات تعلم الآلة، ولكن بعيدًا عن تلك المواقع والمجالات الترفيهية والتجارية، فإنّ لمجال تعلم الآلة أثر عظيم في المجالات العلمية الأخرى، إذ يُستخدَم في تحليل سلاسل الحمض النووي وفي فهم النجوم وإيجاد الكواكب البعيدة وتشخيص الأمراض وإيجاد الأدوية والكثير من الأمور الأخرى. لا يعني ذلك بالضرورة أنّ كتابة أيّ برنامج تعلم آلة هو حصرًا للمشروعات الكبيرة المؤثرة في العالم، فيمكن الاستفادة من برامج تعلم الآلة على المستوى البسيط، إذ تستخدِم الكثير من الشركات الصغيرة والمتوسطة نماذج تعلم الآلة في اتخاذ القرارات المستقبلية الصحيحة لأعمالها، فلتلك النماذج استخدامات كثيرة منها البسيط ومنها المعقد والكبير. حتى هذا اليوم معظم التطبيقات الذكية التي تُصنَع دون تعلم الآلة تدعى بالأنظمة الخبيرة، وهي برامج تُستخدَم فيها قواعد اتخاذ القرارات، وهي تُستخدم في معالجة البيانات ومدخلات المستخدِم ثم محاولة كتابة تعليمات شرطية تؤدي إلى ناتج ما، كما تحتاج تلك النظم إلى معرفة دقيقة للغاية بالمهمة المطلوبة، لكن لن يكون البرنامج دقيقًا إلى حد كبير في كثير من الأحوال، كما أنه ستُعاد كتابة أجزاء كبيرة من البرنامج أو حتى إعادة كتابة البرنامج كليةً لإجراء أيّ تعديل بسيط على المنطق الأساسي في البرنامج. لن تنجح الأنظمة الخبيرة في القيام بالمهام المطلوبة في كثير من الأحوال، فلا يمكن على سبيل المثال لمثل تلك الأنظمة إجراء مهمات متعلقة بالصور مثل تحديد الوجه أو تحديد الكائنات الموجودة في الصور؛ وذلك لأنه يكاد يكون من المستحيل على البشر التوصل إلى آليات وشروط محددة يستطيع كتابتها للحاسوب ليحدد بها خصائص الوجه أو تحديد خصائص كائنات معينة في الصور، إذ أنّ طريقة معالجة البشر للصور في الدماغ تختلف عن الحاسوب، فمشكلة تحديد الوجوه البشرية في الصور تلك ظلت غير محلولة حتى عام 2001م، إذ جرى صناعة نموذج تعلم آلة يستخدم الكثير من صور الوجوه البشرية لتحديد الخصائص التي يمكن عن طريقها تحديد الوجه البشري في الصور. كما أوردنا فإن تعلم الآلة هو تخصص فرعي من تخصصات الذكاء الاصطناعي، ولكن حتى تعلم الآلة ينقسم إلى تخصصات فرعية أخرى مثل التعلم العميق Deep Learning وهو المختص بحل المشكلات والتطبيقات المعقدة عن طريق محاكاة شبكة عصبية من الدماغ البشري ويعمل ذلك الفرع على حل مشكلات مثل تطبيقات التعرف على الوجوه في الصور وغيرها. يعتمد تعلم الآلة اعتمادًا كبيرًا على البيانات الضخمة Big Data وجودة تلك البيانات؛ ولذلك يتداخل تخصص تعلم الآلة مع تخصص آخر يدعى علم البيانات Data Science، والحدود بين العلمين غير واضحة بصورة دقيقة، إلا أننا نستطيع القول بأن تعلم الآلة يعتمد على علم البيانات وليس العكس، إذ يستطيع عالم البيانات التعامل مع البيانات الكبيرة وتحسين جودتها عبر الأساليب المدروسة مسبقًا حتى تكون البيانات جاهزةً بالفعل لتدريب نموذج تعلم الآلة المراد صنعه، وذلك عادةً ما يفعله مهندس تعلم الآلة، إذ أنه في كثير من الأحوال وخاصةً في الشركات الصغيرة لا يوجد متخصص في علوم البيانات لتحسينها قبل إرسال البيانات إلى مهندس تعلم الآلة للتدريب النموذج، ولا بأس إذا بدت الأمور غير واضحة لك حتى الآن. توضح الصورة التالية العلاقة بين الذكاء الاصطناعي Artificial Intelligence وتعلم الآلة Machine Learning والتعلم العميق Deep Learning. أما الصورة التالية، فستستطيع من خلالها فهم الترابط والتداخل بين علم البيانات Data Science وعلوم الذكاء الاصطناعي المختلفة. عرَّف أرثر صامويل Arthur Samuel في عام 1959م تعلم الآلة بأنه حقل الدراسة الذي يعطي للحواسيب القدرة على التعلم دون أن تكون مبرمجةً صراحةً، ونجد أنّ ذلك التعريف معبر للغاية، وقد ظل ذلك التعريف مستخدمًا حتى اليوم، ولكن مع ذلك فإنه قد يُفهم التعريف بصورة خاطئة عند كثير من غير المتخصصين، إذ أنّ أرثر لم يقصد أنه بإمكان الآلات اتخاذ القرارات بدون برمجة مسبقة على الإطلاق لأن ذلك لم يحصل، إذ أنّ مجال تعلم الآلة يعتمد اعتمادًا كبيرًا على البرمجة، ولكن يقصد بذلك أنّ الآلة تستطيع التعلم من البيانات لاستنباط واستنتاج أنماط من خلال علم الإحصاء وخوارزميات الرياضيات المكتوبة بلغة البرمجة لتستطيع من خلالها التوقع أو أداء مهمة ما بناءً على برمجة مسبقة، ولكنها ليست برمجة صريحة بالمعنى التقليدي الذي يحدد مخرجات البرامج بصورة نوعية وكمية. كان أرثر صامويل من أوائل مَن استخدم مصطلح تعلم الآلة Machine Learning وذلك في الورقة البحثية التي نشرها في العام نفسه 1959 والذي عرف فيه المصطلح بعنوان Some Studies in Machine Learning Using the Game of Checkers، وهو يحاول في تلك الورقة إثبات أنه بإمكان الآلات تعلم لعب الألعاب وبمستوى أفضل من مبرمج الآلة نفسه. الفرق بين البرمجة الاعتيادية وبرمجة تعلم الآلة تختلف برمجة الحاسوب الاعتيادية وبرمجة نماذج تعلم الآلة في أوجه كثيرة سنناقشها في هذا القسم. البيانات الضخمة Big Data لا تحتاج البرمجة الاعتيادية في أغلب الأحوال إلى بيانات ضخمة لصناعة تطبيقاتها، فبالرغم من كونها قد تخزِّن تلك البيانات الضخمة واستخدامها، إلا أنها ليست ضرورية، ولكن تحتاج برمجة تعلم الآلة إلى البيانات الضخمة بصورة أساسية حسب ما يراد برمجته، فمثلًا في حال برمجة نموذج تعلم آلة -أو بالأحرى نموذج تعلم عميق- يحدِّد الوجوه البشرية في الصور، فسنحتاج إلى كثير من الصور التي تحتوي على وجوه بشرية حصرًا وبصورة واضحة حتى يتعلم منها النموذج خصائص الوجه البشري، أو مثلًا إذا أردنا برمجة نموذج تعلم آلة يتوقع قيمة سعر منزل في منطقة ما، فسنحتاج إلى بيانات تحتوي على خصائص العقارات وأسعارها في تلك المنطقة لنمرر بعدها تلك البيانات للنموذج وليتعلم منها خصائص كل عقار وسعره حتى يستطيع بعد ذلك توقع سعر أيّ عقار في تلك المنطقة بناءً على خصائصه حتى ولو لم يكن ذلك العقار من ضمن العقارات التي مررناها إليه مسبقًا، وبناءً على ذلك فإنّ الحاجة إلى البيانات الكبيرة في نماذج تعلم الآلة ضروري وأساسي للغاية، كما أنّ تحسين جودة تلك البيانات أيضًا ضروري. الدقة وآلية العمل تُمرَّر مدخلات المستخدِم في البرمجة الاعتيادية، ثم إجراء عمليات محددة مسبقًا من قبل البرنامج ثم إرجاع الخرج إلى المستخدِم مرةً أخرى؛ أما في تعلم الآلة فالأمر يختلف قليلًا، إذ تُستقبَل في كثير من الأحيان مدخلات من المستخدِم فعلًا، مع ذلك فإنه لا تُجرى عمليات محددة مسبقًا من قِبَل البرنامج، وإنما تُمرَّر المدخلات إلى الخوارزمية -أي النموذج- الذي دُرِّب من قبل حتى يتوقع الخرج الذي سيعاد مرةً أخرى إلى المستخدِم، ولنأخذ المثال السابق للعقارات لفهم ذلك بصورة واضح. لا يسعنا سوى استخدام قواعد اتخاذ القرارات لتحديد سعر العقار في البرمجة الاعتيادية، فإذا طلبنا مثلًا من المستخدِم إدخال عدد غرف العقار ومساحته بالمتر المربع، فكل ما يسعنا فعله هو كما يلي: إذا كان عدد الغرف أكبر من غرفتين والمساحة أكبر من 100 متر مربع، فسيكون السعر 100 ألف دولار أمريكي، فيما عدا ذلك فسيكون السعر 80 ألف دولار أمريكي، وبذلك فإنه لمن المستحيل أن يُعيد البرنامج أية قيمة سوى 100 ألف أو 80 ألف فقط، وهي القيم المبرمَجة بالفعل، ولكن مع ذلك فيمكننا تعقيد المثال بصورة أكبر حتى يُحسَب سعر أساسي تبعًا للمتر المربع ثم إجراء بعض العمليات الحسابية بناءً على عدد الغرف مثلًا، لكن في النهاية سيكون سعر المتر عددًا محددًا بالفعل من مجموعة أعداد محدَّدة من قبل المبرمِج. أما في الواقع، يختلف سعر المتر المربع من شارع إلى آخر ومن مبنى إلى آخر، في حين أن الأمر يختلف في نماذج تعلم الآلة لأننا في تلك الحالة ننشئ نموذجًا بناءً على إحدى الخوارزميات التي نختارها تبعًا للمشكلة المراد حلها، ثم ندرِّب تلك الخوارزمية على بيانات العقارات في تلك المنطقة، إذ ستحتوي تلك البيانات على مساحة وعدد غرف كل عقار ثم سعر كل عقار، بعد ذلك نختبر النموذج لمعرفة مدى دقة توقعه لأسعار العقارات عند إدخال بيانات عقار آخر، أي المساحة وعدد الغرف. الحدود النوعية كما أوردنا من قبل في هذا المقال أنه توجد الكثير من المشكلات التي من المستحيل واقعيًا تجسيدها عبر البرمجة التقليدية مثل مشكلة التعرف على الوجوه في الصور ومشكلة الترجمة من لغة إلى أخرى بصورة دقيقة ومشكلة التعرف على الصوت وتحويله إلى نص والعكس؛ أما في تعلم الآلة فالأمر مختلف، إذ أنّ تلك المهام التي تُعَدّ مستحيلةً في البرمجة العادية، أصبحت الآن متواجدة تواجدًا فعليًا في حياتنا اليومية، ويضيف الباحثون كل عام نماذج وخوارزميات جديدةً لحل مشكلات جديدة لم تحل من قبل أو خوارزميات لحل مشاكل موجودة لكن بجودة أعلى عبر تعلم الآلة حتى وصلنا اليوم إلى نماذج وتطبيقات مبهرة مثل تطبيق الدردشة ChatGPT وتطبيقات تصميم الصور بناءً على كتابة وصف لها مثل نموذج DALL-E. لنأخذ تلك الأوقات التي نتصفح فيها اليوتيوب مثالًا لتوضيح أكثر، فقد تشاهد في أحيان كثيرة مقاطعًا رياضيةً لدوري كرة القدم الإسباني ودوري كرة القدم الإنجليزي، وستلاحظ في تلك الحالة أن الموقع يرشِّح لك دائمًا ذلك النوع من المقاطع في كل فرصة، مع ذلك فلم يتخذ مبرمِجي الموقع ذلك القرار صراحةً، إذ أنهم لم يكتبوا في برمجية الموقع تعليمة مثل أنه إذا شاهد المستخدِم ذلك المقطع رقم 42 وذاك المقطع رقم 55، فاعرض له المقطع 43 و56 ، وإنما استخدموا إحدى خوارزميات تعلم الآلة التي ترشِّح المقاطع المشابهة لتلك المقاطع التي تشاهدها باستمرار بناءً على ما تقضيه من وقت في مشاهدتها وبناءً على إعجاباتك على المقاطع وعلى تعليقاتك، …إلخ. وبذلك يتضح لنا جليًا مقصد أرثر صامويل في تعريفه لتعلم الآلة. أقسام تعلم الآلة تنقسم نماذج تعلم الآلة إلى عدة أقسام تبعًا لطريقة عملها، إذ يوجد التعلم تحت إشراف Supervised Learning والتعلم دون إشراف Unsupervised Learning والتعلم المعزز Reinforcement Learning. التعلم تحت إشراف Supervised Learning أول قسم من أقسام تعلم الآلة هو التعلم تحت إشراف Supervised Learning ، ويُعرَف أيضًا بالتعلم الاستقرائي Inductive Learning، وهو من أشهر أقسام تعلم الآلة وأكثرها استخدامًا وأيسرها في الفهم والبرمجة، فالتعلم تحت إشراف عمومًا أسهل كثيرًا من التعلم دون إشراف Unsupervised Learning لأنه يعتمد على الاستقراء المبني على معرفتنا المسبقة بجميع خواص النموذج وعلى المدخلات والمخرجات المرادة. تُدرَّس الفكرة الأساسية في التعلم الاستقرائي بالفعل في مناهج الرياضيات في المرحلة الثانوية عادةً، والفكرة في الأمر كله إيجاد أفضل خط يمر بين نقاط عدة بين المدخلات ومخرجاتها لتوقع مخرجات لمدخلات جديدة، وبرغم كون الأمر يبدو مبهمًا، إلا أنه في غاية البساطة وسيتضح ذلك لاحقًا. يعمل التعلم الاستقرائي رياضيًا على دالة تستقبل مدخلات تُدخَل في معادلة جبرية لاستخراج الناتج المتوقع، وتلك المعادلة تضرب المدخلات وتجمعها مع ثوابت أخرى تمثِّل أفضل قيم ممكنة لتوقع الناتج الأقرب للواقع، وتلك الدالة تدعى دالة الفرضية Hypothesis Function وتدعى أيضًا بالمتوقِّع Predictor، فهدف النموذج في النهاية هو تعديل ثوابت دالة الفرضية لهدف تقريب ناتجها مع الناتج الحقيقي، ولمحاولة تبسيط المعنى بغض النظر عن دقة المثال، فلنفترض وجود الدالة الآتية: f(x) = x + 1 في حال كان المتغير x يساوي 1 فإن الدالة ستنتج 2، وفي حال كان المتغير x يساوي 2 فإن الدالة ستنتج 3، …إلخ، ثم بعد ذلك لنفترض أننا نحاول الإتيان بفرضية ناتجها مقارب جدًا إلى ناتج الدالة أعلاه، إذ توجد عدة فرضيات محتملة مثل: f(x) = x + 0.9 f(x) = x + 0.5 f(x) = x + 0.99 عند محاولة استخدام الفرضية الأولى في حالة كان المتغير x يساوي 1 فسيكون الناتج 1.9، وهو يقارب الناتج الحقيقي حال كون x يساوي 1 في الدالة، إذ كان الناتج الحقيقي للدالة هو 2 وناتج الفرضية 1.9، وهما ناتجان متقاربان للغاية، كما يبدو الأمر أكثر تقاربًا عند استخدام الفرضية الثالثة، ففي حال كان المتغير x يساوي 1 فسيكون الناتج 1.99، وهو أقرب للناتج الحقيقي من 1.9؛ وبناءً على ذلك نستنتج أنّ الفرضية الثالثة أفضل من الفرضية الأولى. في حين أن الفرضية الثانية هي الأقل دقة، فعند تطبيقها حال كون المتغير x يحمل القيمة 1 فإن الناتج سيكون 1.5، وهو الأبعد عن الناتج الحقيقي من الفرضية الأولى والفرضية الثالثة. إذًا الفرق بين الفرضيات الثلاثة والتي تمثِّل دورًا مفصليًا في جودة الناتج هو العدد الرقم الأخير، وهو في حالة التعلم الاستقرائي أحد الثوابت Constants في المعادلة والتي نحاول الإتيان بأفضل قيمة ممكنة له حتى تنتج دالة الفرضية ناتجًا مقاربًا للحقيقة بأكبر قدر ممكن، في مثالنا السابق اخترنا الفرضية الثالثة والتي تمثل أعلى دقة، وبالتالي يمكن تجربة دالة تلك الفرضية على مدخلات أخرى، فإذا كان المتغير x يساوي 2 مثلًا، فسيكون ناتج الفرضية 2.99 وهو قريب جدًا من ناتج الدالة الأصلية. إنّ محاولة الوصول إلى أفضل قيم للثوابت في دالة الفرضية هي ما تكون عن طريق جزء التعلم Learning في التعلم الاستقرائي، وتوجد تقنيات وطرق رياضية وخوارزميات مختلفة للوصول إلى القيم المثلى لتلك الثوابت في علم التعلم الإحصائي Statistical Learning الذي أحلنا إليه مسبقًا، ولكون التعلم الاستقرائي أو التعلم تحت إشراف هو أسهل أنواع نماذج تعلم الآلة وأكثرها شيوعًا، ففي هذه السلسلة نحاول التركيز بصورة كبيرة على ذلك النوع من التعلم، وبالرغم من كون الأمر قد يبدو لك معقدًا ومبهمًا فإن ذلك طبيعي للغاية، إذ نهدف من هذا الفصل إلى تعريف بعض المبادئ فقط؛ أما شرح تلك النقاط فسيكون في الفصول القادمة. سنورد ثلاثة أمثلة على التعلم تحت إشراف وهي تحديد نوع السرطان في الصور الطبية إذا كان خبيثًا أو حميدًا، وتحديد إذا كانت عملية تحويل الاموال سليمةً أم مشبوهةً، وقراءة أرقام مكتوبة بخط اليد في القسم التالي، مع أنه توجد أمثلة أبسط على ذلك النوع من التعلم أيضًا، فمثلًا يمكننا محاولة استقراء راتب موظف عن طريق عدد سنين خبرته، إذ يكون عدد سنين الخبرة هو الدخل الوحيد لدينا في ذلك المثال وهو يمثل قيمة المتغير x في الدالة؛ أما راتب الموظف فهو ناتج الدالة. أمثلة أخرى من قبيل استقراء سعر شقة أو عقار في المناطق، أو تصنيف الرسائل البريدية إن كانت سليمة أم مزعجة. الجدير بالذكر هنا أنه يوجد نوعان رئيسيان من مشاكل التعلم تحت إشراف أولهما هو التوقع الخطي أو ما يدعى بالانحدار الخطي Linear Regression، وهي المشاكل التي يتم فيها توقع قيمة مستمرة Continuous Value، أي قيم غير محددة مثل ثمن عقار أو راتب موظف، وثانيهما التصنيف Classification، أو ما يدعى بالتوقع اللوجيستي أو الانحدار اللوجيستي Logistic Regression، وهي المشاكل التي تقرَّب فيها القيم المتوقعة إلى تصنيف محدد، مثل تصنيف الرسائل البريدية إذا كانت صحيحةً أو مزعجةً، أو تصنيف عمليات التحويل المالية إذا كانت سليمةً أو مشبوهةً، أو تصنيف صورة ما إذا كانت تحتوي على قطة أو كلب، أو تصنيف صورة ما إذا كانت تحتوي على وجه بشري أو لا. التعلم دون إشراف Unsupervised Learning القسم الثاني من أقسام تعلم الآلة هو التعلم دون إشراف Unsupervised Learning وهو أكثر تعقيدًا من التعلم تحت إشراف؛ وذلك لكون المعطيات لا تكون واضحةً تمامًا لنا في هذا النوع من التعلم، فنحن نسعى في ذلك النوع من التعلم إلى إيجاد أنماط مشتركة بين البيانات لتُصنَّف بشكل أو بآخر. سُمِّي ذلك النوع بالتعلم دون إشراف لعدم وجود ناتج حقيقي نقييم ونعلِّم النموذج حتى يصل إلى أقرب قيمة له، ففي الأمثلة الواردة في التعلم تحت إشراف كانت لدينا دالة تحتوي على معادلة تنتج قيمة، وتلك الدالة تنتظر معاملًا أو متغيرًا يدعى x، وعندما يساوي ذلك المتغير 1 فإن ناتج الدالة يكون 2، وبذلك يصبح الرقم 2 هو الناتج الحقيقي المراد الوصول إلى أقرب قيمة له عن طريق دالة الفرضية، إذ كان لدينا في التعلم تحت إشراف مدخلات ومخرجات يراد توقعها؛ أما في التعلم دون إشراف فلا توجد مخرجات أصلًا، أي لا يوجد الناتج 2، فنحن فقط لدينا مدخلات مختلفة مثل x عندما تساوي 1 وx عندما تساوي 2 وx عندما تساوي 3 …إلخ، وبالرغم من كون تلك الأمثلة ليست دقيقةً للغاية، إلا أنها فقط لمحاولة إيضاح فكرة عامة عن التعلم دون إشراف والفرق بينه وبين التعلم تحت إشراف. يُعَدّ كل من تحويل مجموعة البيانات Dataset Transformation وخوارزميات التجميع Clustering Algorithms تقنيتَين من تقنيات التعلم دون إشراف؛ أما الأولى فهي عملية تسعى إلى تحويل البيانات التي يُدرَّب النموذج عليها حتى تكون في صورة أكثر إفادة وسهولة في التعامل، وقد يتم ذلك حتى يستطيع المبرمج فهم البيانات بشكل أفضل، أو حتى يتم تهيئة البيانات لخوارزمية تعلم آلة أخرى، ومن أهم تطبيقات ذلك النوع من الخوارزميات -أي خوارزميات تحويل هيئة مجموعة البيانات- هو تقليص الأبعاد Dimensionality Reduction، فقد تحتوي مجموعة البيانات على أبعاد كثيرة مختلفة يصعب التعامل معها، والبعد في علوم البيانات وتعلم الآلة يشير إلى الميزة أو الخاصية في البيانات والتي أشرنا إليها عند الحديث عن هندسة الميزات أو هندسة الخواص Feature Engineering، وهي ببساطة العمود إذا رسمنا البيانات على هيئة جدول، ففي حال كان لدينا مجموعة بيانات لموظفي شركة ما على سبيل المثال، وكانت تلك البيانات تحتوي على العمر والاسم وتاريخ الميلاد والمؤهل الدراسي لكل موظف، فإن كل خاصية من تلك الخواص هي بُعد من الناحية التقنية والرياضية، أي أن الاسم بُعد والعمر بُعد وتاريخ الميلاد بُعد والمؤهل الدراسي بُعد، …إلخ. إن هدف تحويل مجموعة البيانات هو تقليل عدد الخواص في البيانات عبر تعلم الأنماط المشتركة، وإنّ لتلك التقنية استخدامات عدة من أبرزها تقليل عدد الأبعاد إلى بعدين فقط لتسهيل عملية تصوير البيانات في رسوم بيانية، وهناك أيضًا بعض التطبيقات الأخرى مثل استخراج كلمة مفتاحية واحدة تعبِّر عن كل مقالة من مجموعة من المقالات بناءً على محتواها؛ أما خوارزميات التجميع فهي تهدف إلى إيجاد البيانات المتشابهة والمختلفة للتمييز بين كل مجموعة من البيانات، فيمكن مثلًا تقسيم مجموعة من الصور حسب الأشخاص الموجودين فيها، إذ تُقسَّم مجموعة من الصور لوجود الشخص 1 فيها ومجموعة أخرى من الصور لوجود الشخص 2 فيها، وعلى الرغم من أنّ الخوارزمية لا تعرف هذا ولا ذاك، ولكنها تقسِّم مجموعة البيانات إلى مجموعات أصغر بناءً على التشابهات والاختلافات الموجودة في كل صورة. التعلم شبه الخاضع للإشراف Semi-supervised Learning التعلم شبه الخاضع للإشراف Semi-supervised Learning هو مزيج بين القسمين السابقين، لذلك قد لا يُذكر في بعض الكتب والمراجع، وهو عن التعامل مع البيانات التي يحتوي بعضها وليس كلها على مخرجات، فقد يكون لدينا مثلًا بيانات لموظفي شركة ما ويوجد لدينا خواص مثل الاسم والعمر والمؤهل الدراسي لكل موظف، ومع ذلك فإن بعض هؤلاء الموظفين لدينا عنهم معلومات إضافية مثل الراتب، وبذلك أصبح لدينا معلومات إضافية لبعض الموظفين. أحد الأمثلة التطبيقية على ذلك النوع هو خدمات رفع الصور مثل خدمة Google Photos، إذ أنه بعد رفع صورك مع أفراد العائلة، ستتمكًن الخدمة من معرفة أن الشخص س ظهر في الصورة 1 و3 و6؛ أما الشخص ع ظهر في الصورة 2 و3 و4، وهذا الجزء دون إشراف، ولكن قد تتمكن الخدمة من معرفة أنّ الشخص س، هو في الحقيقة اسمه زيد، ولكنها لا تعرف اسم الشخص ع، إذ لا توجد لديها تلك المعلومة، وتستخدِِم الخدمة تلك المعلومة الإضافية لتوفر لمستخدميها خدمة البحث في الصور عن طريق الأسماء. التعلم المعزز Reinforcement Learning يُعَدّ التعلم المعزز أو التعلم التعزيزي Reinforcement Learning أكثر أنواع تعلم الآلة طموحًا وأكثرها صعوبةً وتعقيدًا بالطبع وهو وحش مختلف تمامًا عن باقي الأنواع، إذ في التعلم المعزز يُصنَع نظام تعلم يدعى بالوكيل Agent، وفي هذا الإطار يلاحظ الوكيل ما حوله في البيئة ثم يتخذ قرارًا بإجراء فعل ما، ويحصل بناءً على ذلك الفعل على نقاط مكافأة Rewards أو على نقاط عقوبة Penalties، وعن طريق تلك النقاط يجب على الوكيل تحديد الاستراتيجية المثلى للتعامل مع المواقف واتخاذ القرار الصحيح، وتلك الاستراتيجية التي يطورها الوكيل تدعى سياسة العمل Policy، والأمر هنا كما تلاحظ أشبه بتعليم طفل صغير وما يجب أن يفعله وما لا يجب أن يفعله عن طريق نظام الثواب والعقاب. تُعَدّ طريقة تطوير سياسة العمل تلك هي أنواع الخوارزميات في التعلم المعزز وتدعى Policy-Based Algorithms أي الخوارزميات القائمة على السياسة، ولكن يوجد أنواع أخرى مثل القائمة على القيمة Value-Based والقائمة على النموذج Model-Based، …إلخ، والأمثلة التطبيقية على هذا النوع من التعلم شتى، إذ أنّ الكثير من الروبوتات مبرمجة عن طريق ذلك النوع من نماذج تعلم الآلة لتتعلم كيفية المشي، ومثال آخر هو برنامج ألفا جو Alpha Go الذي تصدر الأخبار عام 2016م حين هزم بطل العالم في لعبة جو اللاعب لي سيدول Lee Sedol، وهذا البرنامج قد صُنِع من قِبَل شركة Deep Mind وهي شركة بريطانية متخصصة في أبحاث الذكاء الاصطناعي تأسست عام 2010م وقد استحوذت عليها شركة جوجل عام 2014م والتي بدورها تغير اسمها إلى Alphabet عام 2015م، لتصبح شركة جوجل شركات Alphabet بجانب Deep Mind. تعلَّم برنامج ألفا جو لعب تلك اللعبة عن طريق التعلم المعزز، إذ حلل البرنامج ملايين الاحتمالات في اللعبة ثم لعب ضد نفسه مرارًا وتكرارًا عبر نظام نقاط الثواب والعقاب، حتى أنه طوَّر السياسة المناسبة Policy والتي استخدمها في اللعب ضد بطل العالم في اللعبة، ونذكر هنا أن البرنامج أثناء اللعب ضد بطل العالم لم يكن في تلك المرحلة في إطار التعلم، وإنما كان في إطار استخدام السياسة التي طورها أثناء تعلمه السابق لمباراته ضد بطل العالم. ودونًا عن باقي أقسام تعلم الآلة، فإن التعلم المعزز لا يحتاج بصورة ضرورية إلى بيانات مسبقة للتعلم منها، وإنما يتعلم من خلال خبرته الشخصية عبر الثواب والعقاب والتجربة والخطأ كما أوردنا، والهدف النهائي لهذا النموذج هو تعظيم نقاط المكافأة على المدى الطويل، ونلاحظ أيضًا من أهم الاختلافات بين التعلم المعزز وباقي أقسام خوارزميات تعلم الآلة أنّ التعلم المعزز يقوم بالتعلم باستمرار دون توقف، في حين أنّ نماذج التعلم تحت إشراف والتعلم دون إشراف تصل إلى نقطة محددة بعد التعلم من البيانات الممررة إليها لتصل إلى ذروة ما تستطيع الوصول إليه من معدل الدقة، وعند تلك النقطة يقف النموذج عن التطور والتعلم. إنّ من أفضل طرق تخيل أمر التعلم المعزز هو تخيل لعبة حاسوبية يلعبها الوكيل Agent، إذ أنه لديه مهمة طويلة المدى مع مجموعة من الأفعال التي من الممكن أن يتخذها عند الحاجة، ولكنه عند القيام بالفعل الخاطئ، سيُخصَم من نقاطه في اللعبة، في حين أنّ أداء الفعل الصحيح سيزيد من نقاطه، وبذلك هو يقوم بتطوير وتصقيل مهاراته في اللعبة واستراتيجيته في ممارستها يومًا بعد يوم بناءً على البيانات المسبقة التي تمثلها الخبرة التي اكتسبها أثناء لعبها آلافًا من المرات، ومن التقنيات الخاصة بالتعلم المعزز هي مقايضة الاستكشاف والاستغلال Exploration and Exploitation Tradeoff وعمليات قرار ماركوف Markov Decision Processes أو MDPs اختصارًا في بعض المراجع، بالإضافة إلى تعلم كيو Q-Learning، والتعلم المعزز العميق Deep Reinforcement Learning. دورة الذكاء الاصطناعي احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة. اشترك الآن مشاكل يحلها تعلم الآلة سنتعرف الآن على التطبيقات التي يمكن حلها تبعًا لكل قسم من أقسام تعلم الآلة التي أشرنا إليها للتو. تحديد نوع السرطان إن كان خبيثا أو حميدا يمكن لنماذج تعلم الآلة بناءً على الصورة الطبية تحديد ما إذا كان يوجد سرطان خبيث أو حميد، وستحتاج لإجراء ذلك إلى عدد كبير من الصور الطبية مع تحديد كل صورة كون السرطان الموجود فيها خبيثًا أم حميدًا، وقد تحتاج لذلك إلى رأي طبيب متخصص، بعد تمرير تلك الصور مع نوع السرطان في كل صورة إلى نموذج تعلم الآلة، فسيكون النموذج قادرًا على استقبال صورة طبية جديدة تمامًا ليحدِّد نوع السرطان بناءً على ما تعلمه من قبل في النماذج التي مررتها إليه، ويندرج ذلك النوع من النماذج تحت تصنيف التعلم تحت إشراف. تحديد ما إن كانت التحويلات الائتمانية صحيحة أم مشبوهة سنحتاج في ذلك النموذج إلى بيانات فيها الكثير من عمليات تحويلات الأموال عبر البطاقات الائتمانية مع إدخال قيمة تدل على ناتج عملية التحويل إذا كانت عمليةً صحيحةً أم مشبوهةً، وبعد تدريب النموذج على تلك البيانات، سيستطيع النموذج استقبال بيانات عملية تحويل جديدة ثم تحديد ما إذا كانت العملية مشبوهةً أم صحيحةً بناءً على خبرته السابقة التي تعلمها من البيانات. قراءة أرقام مكتوبة بخط اليد نحتاج إلى كثير من الصور لتدريب ذلك النموذج، والتي تحتوي على أرقام مكتوبة بخط اليد، مع إدخال الرقم الموجود في كل صورة ضمن البيانات ليتم التدريب، إذ يصبح لدى النموذج خبرةً بقدر كاف لاستقبال صور جديدة لا يعرف الأرقام الموجودة فيها ليستخرجها هو، ارجع مثلًا إلى مقال بناء شبكة عصبية للتعرف على الأرقام المكتوبة بخط اليد باستخدام مكتبة TensorFlow لتطلع على مثال عملي. نلاحظ أن المشترك بين التطبيقات الثلاثة السابقة هو وجود مدخلات ومخرجات في البيانات الممررة إلى النموذج، ففي المثال الأول نحن لا نقوم فقط بتمرير العديد من الصور الطبية، بل نقوم بتحديد ما إن كان السرطان الموجود فيها حميدًا أم خبيثًا حتى يتعلم النموذج أنّ الصورة 1 فيها سرطان خبيث، والصورة 2 فيها سرطان حميد، والصورة 3 فيها سرطان حميد، …إلخ، وبعد التدريب تصبح لدينا إمكانية تمرير الصورة الطبية فقط دون تحديد نوع السرطان، إذ سيفعله النموذج بالفعل بناءً على ما تعلمه مسبقًا من الصور والمخرجات التي مررتها إليه. وكذلك الأمر في النموذج الثاني، إذ لا نمرر بيانات عمليات التحويل فقط، وإنما نمرر معلومة إضافية مع كل عملية تحويل -وهو الخرج- وهي إذا كانت تلك العملية عمليةً سليمة أم عمليةً مشبوهةً ليُدرَّب النموذج عليها وليتعرف على أكبر عدد ممكن من العمليات الصحيحة والعمليات المشبوهة، وبعد مرحلة التدريب تلك نستطيع تمرير بيانات عملية تحويل جديدة كليًا -دون خرجها- لم يُدرَّب النموذج عليها، حتى يحدد النموذج ما إذا كانت العملية سليمةً أم مشبوهةً بناءً على ما تدرب عليه مسبقًا، وكذلك الأمر في المثال الثالث. يدعى ذلك النوع من النماذج التي نمتلك فيها المدخلات والمخرجات المراد توقعها بعد ذلك من النموذج بالتعليم تحت إشراف، ونلاحظ أنه بالرغم من كون التطبيقات الثلاثة تحت تصنيف واحد، إلا أنّ أمر جمع وتنقية تلك البيانات اللازمة لتدريب النموذج تتباين للغاية، إذ سيكون من الصعب جمع مثل تلك البيانات في المثال الأول، كما أنه لتحسين جودة البيانات وتنقيتها فإنه يجب استخدام خبير طبي في مثل تلك الصور، لكن الأمر يختلف في نموذج عمليات التحويلات المالية، إذ قد تكون تلك البيانات متاحةً من قِبَل بعض الشركات بالرغم من كونها بيانات غاية في الدقة والحساسية بسبب خصوصيتها؛ أما المثال الثالث فإنه بسيط للغاية ولا يتطلب متخصصين، إذًا أمر تطبيقات تعلم الآلة يختلف كثيرًا باختلاف مجال التطبيق، حتى وإن تشابهت في نوع الخوارزميات، وفيما يلي أمثلة على تطبيقات أخرى. تحديد المواضيع التي تتحدث عنها المقالات لنقل أنه لديك عدد كبير من المقالات المكتوبة التي تريد استخراج المواضيع المهمة التي تتحدث عنها كل مقالة من تلك المقالات، في تلك الحالة أنت فقط لديك المدخلات -أي نصوص المقالات- ولا يوجد لديك فكرة واضحة عن المخرجات، إذ لا تعرف ما هي تلك المواضيع ولا تعرف كم عدد الموضوعات الممكن إيجادها. ارجع إلى مقال تصنيف الشخصيات بالاعتماد على تغريداتهم العربية باستخدام التعلم العميق للاطلاع على مثال عملي مشابه. تقسيم العملاء حسب تفضيلاتهم الشرائية نريد في هذا النموذج تقسيم العملاء حسب تفضيلاتهم الشرائية، وفي تلك الحالة نحن نملك بيانات العملاء، لكننا مع ذلك لا نعرف ما هي تلك التقسيمات وما عددها، لا نعلم إذا كان لدينا مَن يفضِّل شراء الأدوات المنزلية أو من يفضِّل شراء الألعاب أو كليهما؛ ولذلك لا توجد لدينا مخرجات واضحة لهذا النموذج، وارجع إلى مقال استخدام خوارزميات العنقدة لتجزئة عملاء متجر إلكتروني للاطلاع على مثال عملي. نلاحظ في كلا التطبيقين السابقين أنه لدينا المدخلات ولا نمتلك مخرجات واضحة لا من حيث النوع ولا من حيث الكم؛ وهذه التطبيقات تندرج تحت قسم التعلم دون إشراف، لكن في كلتا الحالتين لاحظ أنه علينا الحصول على بيانات المدخلات وهي القاسم المشترك بين هذا وذاك، وفي كل الأحوال من الجيد تنظيم البيانات أو على الأقل تخيلها على صورة جدول، بحيث يحتوي كل صف على بيانات عينة كاملة، وكل عمود هو خاصية Property أو ميزة Feature، ففي مثال تحديد ما إذا كانت عمليات التحويل المالية صحيحةً أم مشبوهةً مثلًا، يمكننا تخيل كل صف على أنه عملية تحويل، وقد يكون لدينا عدة أعمدة مثل عمود يحتوي على بلد التحويل وعمود يحتوي على تاريخ التحويل، …إلخ. أهمية فهم وتحسين البيانات يعتمد تعلم الآلة بجميع نماذجه وخوارزمياته بصورة أساسية على البيانات بغض النظر إذا كانت مدخلات ومخرجات أو حتى مدخلات فقط؛ ولذلك تُعَدّ جودة البيانات وفهمها من أهم الأمور، إذ سيتعين عليك في بعض الأحيان إضافة خاصية أو حذف خاصية من البيانات، وهو ما يدعى بهندسة الخواص أو هندسة الميزات Feature Engineering أو Feature Extraction، وأحيان أخرى ستدمج بعض الخواص معًا بطريقة ما، وكل تلك الأمور نجدها في علم التعلم الإحصائي Statistical Learning الذي تم الإحالة إليه من قبل. تُعَدّ مرحلة فهم البيانات وتنقيتها وتحسينها من أهم المراحل، لأنه بناءً على ذلك تستطيع كمهندس تعلم آلة اختيار الخوارزمية المناسبة للبيانات من خوارزميات تعلم الآلة المتاحة والتي ستوفِّر أفضل دقة ممكنة تبعًا للمهمة التي تريد إجراءها من خلال النموذج الذي بُرمِج، كما أنّ جودة البيانات تلعب دورًا كبيرًا في معدل الدقة Accuracy Rate للنموذج، إذ يمكننا عن طريق تحسين جودة البيانات الوصول إلى دقة 99٪ بدلًا من دقة 97٪، ونستطيع الوصول إلى دقة 97٪ بدلًا من 80٪ عن طريق تعديل قيم معامِلات الخوارزمية المختارة Algorithm Parameters، ولذلك فإن فهمك للبيانات هو أول خطوة على طريق اختيار الخوارزمية وقيم المعاملات. يُعَدّ الجزء الخاص ببرمجة نماذج تعلم الآلة مجرد نقطة من صورة أكبر، وهي المشكلة المراد حلها، ولذلك من الضروري جدًا بقاء تلك الصورة الكبيرة في ذهنك دائمًا عند برمجة نموذج، فبناءً على تلك الصورة الكبيرة ستستطيع تحديد ما إذا كنت تمتلك البيانات الصحيحة أم لا، وتلك هي أول خطوة من الخطوات، ثم بعد ذلك ستستطيع تحديد ما يجب فعله أثناء مرحلة هندسة الخواص عبر تنقية وتحسين جودة البيانات، ثم بناءً على تلك الصورة ستستطيع تحديد الخوارزمية الصحيحة للتطبيق الذي تعمل عليه. اقرأ أيضًا المقال السابق: مختصر البرمجة كائنية التوجه OOP وتطبيقها في بايثون تحليل المشاعر في النصوص العربية باستخدام التعلم العميق الذكاء البشري مقابل الذكاء الاصطناعي المفاهيم الأساسية لتعلم الآلة
    3 نقاط
  11. لا يختلف اثنان على أهمية تعلم أساسيات البرمجة، فالبرمجة هي مهنة الحاضر والمستقبل، وهي تعتبر أحد المهارات الأساسية في عصرنا الذي بات يعتمد على التقانة في جميع جوانبه، فضلًا عن أن البرمجة قد أصبحت مادة أساسية في المناهج الدراسية في العديد من الدول بدءًا من المراحل الابتدائية. إذا اتخذت قررًا بتعلم أساسيات البرمجة من الصفر للاحتراف فهذا بلا شك قرار صائب، فالبرمجة توفر لك الكثير من فرص العمل، وتوسع مداركك، وتعزز تفكيرك النقدي، كما أنها تكسبك القدرة على حل المشكلات التي تواجهك بكفاءة أكبر، والأمر الجيد أن البرمجة تتميز عن غيرها من المجالات بكونها متاحة للجميع، ويمكنك تعلمها بشكل ذاتي بعيدًا عن أروقة الجامعات الطويلة. نشرح في مقال اليوم أساسيات البرمجة، ونستعرض أهم الأدوات التي تحتاجها كمبرمج، ونبين مفاهيم البرمجة الأساسية التي تشترك فيها معظم لغات البرمجة، وأهم المبادئ التي يمكنك اتباعها لتبرمج كالمحترفين. ما هي البرمجة؟ البرمجة باختصار هي إعطاء التعليمات لجهاز الحاسوب لينفذها باستخدام إحدى لغات البرمجة، ويتلقى الحاسوب هذه التعليمات ويترجمها ويفهمها وينفذها، ويُطلق على تسلسل التعليمات المكتوبة باستخدام لغة برمجة والتي تنجز مهمة محددة اسم برنامج. فنحن البشر نتواصل فيما بيننا بلغاتنا الطبيعية كالعربية أو الإنجليزية، أما الحاسوب فيحتاج لاستخدام لغة برمجة خاصة للتواصل معه، وعالم لغات البرمجة شامل ومنوع فهناك المئات من لغات البرمجة حاليًا، ونشير إلى أن لغة البرمجة هي لغة وسيطة بيننا وبين الحاسوب فحتى الحاسوب لا يفهم لغة البرمجة التي نكتبها بل تُحول كل لغة نكتبها إلى لغة يفهمها الحاسوب عبر أداة تحويل وتدعى اللغة التي يفهمها الحاسوب بلغة الآلة 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 نصائح لتعلم أساسيات البرمجة إليك مجموعة نصائح سريعة تساعدك في رحلة تعلم البرمجة: حدد هدفك من تعلم البرمجة، ثم تعلم ما يلزمك من تقنيات لتحققه. لا تشتت نفسك بكثرة اللغات والتنقل بينها وركز على المفاهيم وطبقها بلغة واحدة بإتقان وتركيز. ضع خطة للتعلم والتزم بها دون تسويف. لا تضيع وقتك في البحث عن أفضل المصادر التعليمية والتنقل بينها بل اختر واحدًا فقط والتزم به للنهاية. طور مهارات البحث الفعال فهذا سيوفر عليك وقتًا كبيرًا ويساعدك في إيجاد حلول لمشاكلك البرمجية. رافق المجدين ومن يشاركونك الهدف والاهتمام نفسه فإن الصاحب ساحب كما يُقال. لا تتوقف عن التعلم وطور نفسك باستمرار. تحلَّ بالصبر والأناة فإن العلم بالتعلّم والحلم بالتحلّم. تقبل الفشل والخطأ فالفشل هو وسيلة للنجاح. طبق ثم طبق ثم طبق ما تتعلمه. الخلاصة تطرقنا في مقال اليوم لشرح أساسيات البرمجة للمبتدئين وتعرفنا على أهم المفاهيم البرمجية التي ستصادفك عند تعلم أي لغة من لغات البرمجة وذكرنا في الختام أهم الأسس والنصائح التي تساعد أي مبرمج لتعلم أساسيات البرمجة من الصفر حتى الاحتراف. قد لا تتمكن من هضم جميع المفاهيم مرة واحدة خصوصًا إن كنت مبتدئًا، لذا ارجع للمقال مرة ومرتين حتى تتأكد من استيعابك لتلك المفاهيم وضعه ضمن قائمتك المفضلة وطبق الأمثلة بلغة البرمجة التي تتعلمها أو تريد تعلمها. وإذا كان لديك أي تساؤلات حول أي شيء مر معك في المقال أو كنت قد بدأت فعلا بتعلم إحدى لغات البرمجة ولديك نصائح مفيدة تود أن توجهها للمبتدئين في تعلم البرمجة، نرحب بأن تشاركنا بها في التعليقات أسفل المقال. اقرأ أيضًا أسهل لغات البرمجة البرمجة كائنية التوجه دليلك الشامل إلى: برمجة التطبيقات فوائد تعلم البرمجة
    3 نقاط
  12. تعرفنا في المقال السابق على بعض اﻷساسيات في علم اﻹلكترونيات مثل الجهد الكهربائي وشدة التيار وتعلمنا استخدام بعض العناصر اﻹلكترونة الساكنة passive component في تكوين بعض الدوائر البسيطة وقياس قيم الجهد والتيار باستخدام المقياس الكهربائي متعدد الوظائف (اﻵفو). نتابع في هذا المقال استعراض مفاهيم أخرى أساسية في تكوين الدوائر الإلكترونية ونلقي الضوء على بعض العناصر اﻹلكترونية التي تُدعى بالعناصر الفعّالة Active Components. ما تحتاجه لإكمال التمارين العملية في هذا المقال إليك قائمة بالعناصر الإلكترونية والتجهيزات اللازمة لإكمال التطبيقات العملية: بطارية جهدها 5 فولط. مقاومات قيمها 1.2، 2.2، 6.8، 10، 22 كيلو أوم مؤشرات ضوئية (ليد) تعمل عند جهد 5 فولط أو أقل (ثلاثة ويفضل من ألوان مختلفة). مكثفة سعتها 470 ميكرو فاراد وأخرى 330 ميكرو فاراد جهدها 16 فولط. ديودات من طراز 1N4007 (يكفي اثنان). ترانزستورات قطبية من الطراز 2N2222. ترانزيستور ذات أثر حقلي من النوع MOSFET وطراز 2N2905A (ثلاثة تكفي). لوحة اختبار مثقبة (إن أردت فاﻷمر اختياري) مقياس كهربائي متعدد الوظائف AV multi-meter. ترتيب العناصر اﻹلكترونية في الدوائر نشرح في هذا القسم طريقة توصيل العناصر اﻹلكترونية والهيكلية اﻷساسية للدوائر بشكل مبسط دون الخوض في التفاصيل لأنها تتطلب معارف رياضية متقدمة. الوصل على التسلسل والوصل على التفرّع وهما طريقتان لوصل العناصر في الدائرة اﻹلكترونية سنشرحهما بشكل مبسط: الوصل على التسلسل عندما نصل طرفي عنصرين معًا، ونترك طرفيهما اﻵخرين كي توصلا مع بقية عناصر الدائرة ندعو هذا الوصل وصلًا تسلسليًا. وقد نصل عنصرين أو أكثر وفق هذه الطريقة فيتكون فرع في الدائرة الكهربائية يمر في عناصره تيار ذو شدة محددة ويهبط الجهد عند طرفي كل عنصر ليكون الجهد الكلي بين طرفي هذه العناصر المتسلسلة هو مجموع هبوطات الجهود. الوصل على التفرع أو التوازي إذ وصلت رجلي عنصر أو طرفي عنصر مع بعضهما ثم وصلت كذلك الطرفين اﻵخرين مع بعضهما فإن هذا الوصل هو وصل على التفرع. وقد نصل عنصرين أو أكثر بهذه الطريقة فتتكون عدة فروع في الدائرة عددها هو عدد هذه العناصر الموصولة على التفرع. يكون هبوط الجهد متماثلًا في الفروع إذ وصل طرفاها إلى منيع التغذية الكهربائي بينما سيتوزع التيار على هذه الفروع حسب طبيعة كل فرع. وصل العناصر على التفرع إلى اليمين وعلى التسلسل إلى اليسار هيكلية الدائرة اﻹلكترونية تتكون الدائرة اﻹلكترونية بأبسط أشكالها من مصدر تغذية كهربائي وعنصر إلكتروني أو أكثر بحيث يخرج التيار الكهربائي من مصدر التغذية ويعود إليه. وعند ترتيب العناصر في الدائرة سواء على التسلسل أو التفرع أو بطريقة مختلطة نميّز فيها الأقسام التالية: العقدة: وهي نقطة التقاء ثلاثة فروع أو أكثر ولها قاعدة مهمة جدًا بخصوص التيارات المارة فيها وتنص أن مجموع شدات التيارات الداخلة إلى عقدة تساوي مجموع شدات التيارات الخارجة منها. أي إذا دخل على عقدة تيار شدته 3 أمبير وتفرّع إلى فرعين سيكون مجموع الشدتين في الفرعين الناتجين هو أيضًا 3 أمبير. الفرع: هو جزء من الدائرة مكون من عنصر واحد أو عدة عناصر موصولة على التسلسل. الحلقة: وهي دائرة فرعية محددة بعقدتين أو أكثر. وصل بعض العناصر على التسلسل والتفرع لكل عنصر إلكتروني وظيفة محددة وبالتالي طريقة ربط محددة في الدارة، وهكذا تبدأ الفروع والحلقات والعقد بالظهور لهيكلة الدائرة وتزداد صعوبة الحسابات الكهربائية. لكننا سنبقي اﻷمور في مقالنا بسيطة قدر اﻹمكان مبتعدين عن أية حسابات رياضية صعبة. وصل العناصر الإلكترونية على التسلسل والتفرع وصل منابع التغذية توصل منابع التغذية الكهربائية على التسلسل والتفرع لزيادة الجهد الكلي في الدائرة أو زيادة شدة التيار الذي يمكن للعناصر استجراره منها. عند وصل منبعي تغذية أو أكثر على التسلسل بوصل القطب الموجب للأولى مع السالب للثاني حصلنا على مصدر تغذية جهده الكلي يساوي مجموع جهدي المنبعين. فلو وصلنا بطاريتين جهد كل منهما 1.5 فولط على التسلسل سنحصل على مصدر تغذية جهده 3 فولط. وعند وصل منبعي تغذية على التفرع بوصل القطبين الموجبين معًا والسالبين معًا بحيث تكون اﻷقطاب المشتركة هي من تغذي الدائرة الكهربائية، سيتمكن مصدر التغذية الجديد من استجرار تيار أكبر لعناصر الدائرة، أو على اﻷقل تغذية الدائرة لفترة أطول. وصل المقاومات اتبع القواعد البسيطة التالية: وصل مقاومات على التسلسل يعطي مقاومة جديدة قيمتها مجموع قيم المقاومات السابقة. فلو كان لديك مقاومات قيمها 2 كيلو أوم فقط وتحتاج إلى مقاومة 6 كيلو أوم، صل عندها ثلاثًا منها على التسلسل. وصل مقاومتين لهما القيمة ذاتها على التفرع يعطي مقاومة قيمته نصف قيمة إحداهما ووصل ثلاثة لها القيمة ذاتها سيعطي مقاومة لها ثُلث قيمة إحداها وهكذا. فلو كان لديك مقاومات قيمها 3 كيلو أوم وتحتاج إلى مقاومة قيمتها 1 كيلو أوم صل ثلاثة منها على التفرع. وصل المكثفات اتبع القواعد البسيطة التالية: وصل مكثفتين لهما القيمة ذاتها على التسلسل يعطي مكثفة سعتها نصف سعة إحداهما ووصل ثلاثة لها السعة ذاتها سيعطي مكثفة لها ثُلث سعة إحداها وهكذا. فلو كان لديك مكثفات قيمها 10 ميكروفاراد وتحتاج إلى مكثفة سعتها 5 ميكروفاراد صل اثنتين منها على التسلسل. وصل مكثفات على التفرع يعطي مكثفة جديدة سعتها مجموع سعات تلك المكثفات. فلو كان لديك مكثفات سعاتها 1 ميكروفاراد فقط وتحتاج إلى مكثفة سعتها 4 فاراد ، صل عندها أربعةً منها على التفرع. وصل الديودات اتبع القواعد البسيطة التالية: توصل الديودات على التسلسل (مهبط>مصعد>مهبط>مصعد) لأسباب عديدة منها ضمان الحماية عند تيارات أعلى ومنها تخفيض الجهد أكثر بين طرفي الوصلة إذ يخفض كل ديود الجهد بحدود 0.6 فولط (وفق مادة تصنيعه). توصل الديودات على التفرع عندما لا تريد أن يؤثر توصيله على شدة التيار الذي يصل العنصر اﻹلكتروني التالي. تتوزع شدات التيار في الفروع الخارجة من عقدة كلًا حسب مقاومته المرجع المشترك (اﻷرضي) هذا المصطلح شائع كثيرًا ومربك كثيرًا، لهذا سنشرح اﻷمر بالبساطة الممكنة دون أية تعريفات مدرسية. تعمل الدوائر اﻹلكترونية بين نقطتين لهما جهد مختلف وتتحرك الشحنات من الجهد اﻷعلى إلى اﻷدنى. لكن عندما تضم الدوائر عددًا كبيرًا من العناصر وقد تضم أيضًا عدة مصادر تغذية نحتاج إلى نقطة مرجعية لنقيس الجهد عند أية نقطة من الدائرة بالنسبة لها تُدعى هذه النقطة بالمرجع المشترك أو اﻷرضي وقد تكون نقطة من الدائرة أو خارجها ونعتبر أن قيمة جهدها هو الصفر . لا تكترث كثيرًا اﻵن لهذا الموضوع، ففي معظم دوائرك التي ستغذيها من مصدر تغذية محدد اعتبر أن اﻷرضي هو القطب السالب لمصدر التغذية وأرح نفسك، وإن رأيت في أحد المراجع رمز المرجع المشترك وأردت تطبيق الدائرة الموجودة، صل اﻷرضي بالقطب السالب. نظرة ثانية إلى العناصر اﻹلكترونية: عناصر إلكترونية فعّالة العناصر الفعّالة Active Components هي عناصر تقدم الطاقة الكهربائية للدائرة أو تستهلك جزءًا من الطاقة لتؤدي وظيفتها أو تعمل على تضخيم اﻹشارات الكهربائية. من اﻷمثلة عنها مصادر التغذية التي تحدثنا عنها في مقالنا السابق وسنتحدث اليوم عن أحد أهم العناصر الفعالة وهو الترانزيستور Transistor. الترانزيستوارت الترانزيستور هو عنصر إلكتروني فعال يُستخدم كمفاتيح إلكترونية يمكن التحكم بها كهربائيًا أو كمضخمات لزيادة قوة اﻹشارة الكهربائية. تُستخدم هذه العناصر بكثرة في الدوائر اﻹلكترونية وهي اﻷساس في تصنيع الكثير الكثير من الدوائر المتكاملة Integrated circuits واختصارًا IC. آلية عمل الترانزستور إن الفكرة اﻷساسية خلف تصنيع الترانزستور هو استخدام تيار كهربائي صغير جدًا أو جهد كهربائي صغير جدًا كي نفتح الطريق أما التيار الكهربائي اﻷساسي للمرور ضمن العنصر المطلوب أو إيقافه. و الترانزيستورات أنواع مختلفة وفقًا لطبيعة تصنيعه وتجميع أحزاءه، ونميّز النوعين الرئيسيين التاليين: الترانزستورات القطبية: وتستخدم تيارًا صغيرًا للتحكم بمرور تيار كهربائي أكبر (التيار الرئيسي) يغذي العنصر المطلوب. يتكون هذا الترانزيستور من غلاف يخرج منه ثلاثة أرجل يُدعى أحدها مجمّع Collector والثاني قاعدة Base والثالث باعث Emitter. تغلق هذه الترانزيستورات بشكل طبيعي الطريق أما التيار الرئيسي لكن بمجرد مرور تيار صغير بين القاعدة والباعث تفتح الطريق أمام التيار الرئيسي ويتناسب عندها شدة التيار الرئيسي المار في العنصر الذي نريد التحكم به طردًا مع شدة التيار المار بين الباعث والقاعدة. ولهذه الترانزيستورات نموذجان، اﻷول هو الترانزيستور NPN ويفتح إن كان جهد القاعدة أكبر من جهد الباعث واﻵخر هو الترانزيستور PNP ويفتح إن كان جهد القاعدة أقل من جهد الباعث. الترانزستورات ذات اﻷثر الحقلي: لا حاجة في هذه الترانزيستورات إلى مرور تيار كهربائي بين أحد الرجلين حتى تعمل بل تحتاج إلى تطبيق جهد بسيط. تتكون هذه الترانزيستورات من ثلاثة أرجل أيضًا هي المصرف Drain ورمزه D واﻵخر بوابة Gate ورمزه G والثالث منبع Source ورمزه S. لهذه الترانزيستورات أنواع وتقنيات تصنيع مختلفة أكثرها فعند تطبيق جهد بسيط على البوابة يمر يفتح الترانزيستور للتيار الرئيسي الطريق كي يمر من المصرف إلى المنبع أو يغلق الطريق أمامه. وهذه هي الميزة الرئيسية الترانزستورات الحقلية عن القطبية فهي قد تكون في الوضع الطبيعي مغلقة أو مفتوحة وعند تطبيق جهد على البوابة تُفتح أو تُغلق الطريق امام التيار الرئيسي. لهذا السبب نجد تصنيفات أخرى له ومن الضروري الانتباه إليها لأن لكل منها فائدته في الدائرة وسنوضحها في الجدول التالي: الترانزيستور من النوع المعزِّز Enhancing الترانزيستور من النوع المبدد Depletion معزز بقناة N: يكون مغلق بشكل طبيعي لكن عند تطبيق جهد موجب صغير على البوابة يفتح مبدد بقناة N: يكون مفتوحًا بشكل طبيعي لكن عند تطبيق جهد سالب صغير على البوابة يُغلق معزِّز بقناة P: يكون مغلق بشكل طبيعي لكن عند تطبيق جهد سالب صغير على البوابة يفتح مبدد بقناة P: يكون مفتوحًا بشكل طبيعي لكن عند تطبيق جهد موجب صغير على البوابة يُغلق إلى اليمين ترانزيستور قطبي وإلى اليسار ترانزستور حقلي MOSFET استخدامات الترانزيستور للترانزستورات تطبيقات عملية كثيرة لكننا سنهتم فقط بعملها كمفاتيح إلكترونية، ولهذا الغرض فإن أكثر التوصيلات شيوعًا تكون على الشكل التالي: يوصل العنصر اﻹلكتروني (سواء مؤشر ضوئي أو غيره) والذي نريد التحكم بمرور التيار ضمنه بين الطرف الموجب لمصدر التغذية والمجمّع أو المصرف بينما يتصل الباعث أو المنبع مع الطرف السالب لمصدر التغذية أو المرجع المشترك (الأرضي). لكن ولأن الترانزيستور وظيفة أخرى لا نحتاجها هنا وهي وظيفة التضخيم، فمن اﻷفضل وصل مقاومة بين الباعث أو المنيع والمرجع المشترك كي نحدد شدة التيار التي يحتاجها العنصر اﻹلكتروني الذي نتحكم به. أما عن كيفية تطبيق الجهد على البوابة أو تمرير تيار التحكم (التيار الصغير) بين القاعدة و الباعث فهذا أمر يعود لك وفقًا لطبيعة الدائرة التي تصممها. تطبيق عملي: دارة تغذية مؤقتة لحفظ معلومات الدائرة في الذواكر ستجد مع تمرسك في تصميم الدوائر اﻹلكترونية أنك تحتاج إلى عناصر إلكترونية خاصة تُدعى الذواكر وتُستخدم لحفظ حالة الدائرة اﻹلكترونية عند إطفاء الدائرة أو عند حدوث خلل في التغذية الرئيسية كأن تحفظ قيمة عداد معين أو تخزّن توقيتًا مهمًا وغيرها. ومن غير المجدي الكتابة إلى الذاكرة في كل لحظة لأنها سترهق الذاكرة وتقصر عمرها الافتراضي الذي يقدر بعدد محدد من عمليات القراءة والكتابة. لهذا تزوّد الدوائر المماثلة بنظام تغذية ثانوي (بطارية ليثيوم دائرية عادةً) يعمل فقط ولفترة قصيرة جدًا عند انقطاع التغذية الرئيسية وذلك لتخزين حالة الدائرة. سنحاول في هذا التمرين تنفيذ مشروع لتحقيق الهدف ذاته. وفيه نحاكي مصدر تغذية رئيسي وآخر ثانوي عن طريق تشكيل مسريين موجبين ومسريين سالبين يمثلان مصدري تغذية منفصلين ثم نستخدم مكثفة تشحن من مصدر التغذية الرئيسي وعند انقطاع التغذية الرئيسية تفرّغ شحنتها مما يؤدي إلى مرور تيار في قاعدة ترانزستور ثنائي القطبية لفترة صغيرة حتى ينتهي تفريغها وخلال فترة التفريغ يمرر الترانزيستور التيار من مصدر التغذية الثانوي إلى مؤشر ضوئي يحاكي الذواكر ليضيء مستغلًا طاقة المنبع الثانوي كما تستغله عناصر الذاكرة لتخزين حالة الدائرة. نحتاج في هذا التطبيق إلى: مكثفة مستقطبة سعتها 330 ميكروفاراد جهدها 16 فولط. ترانزيستور قطبي من لطراز 2N2222. ديود من طراز 1N4007. مؤشران ضوئيان أخضر وأحمر جهد تشغيلهما لا يزيد عن 5 فولط. مقاومتين 2 كيلو أوم وأخرى قيمتها 10 كيلو أوم. منبع تغذية جهده 5 فولط. لوحة اختبار مثقبة. استخدم العناصر السابقة لتشكيل الدائرة التالية: دائرة إلكترونية على لوحة مثقبة تضم مكثف وديود وترانستور وبطارية ومقاومات ومؤشرات ضوئية صل رجل المقاومة 10 كيلو أوم إلى المسرى الموجب اليميني (الذي يمثل مصدر التغذية الرئيسي) والرجل اﻷخرى إلى الرجل اﻷطول للمؤشر الضوئي اﻷخضر ثم صل رجل المؤشر اﻷخرى إلى المسرى السالب. صل الرجل السالبة للمكثفة مع المسرى السالب ثم صل الرجل الموجبة مع مقاومة 2 كيلو أوم ثم صل الرجل اﻷخرى للمقاومة مع قاعدة الترانزيستور حتى تفرّغ المكثفة شحنتها عبر قاعدة الترانزيستور وتسمح له بتمرير التيار من مصدر التغذية الثانوي. صل مهبط الديود مع قاعدة الترانزيستور أيضًا ومصعده مع المسرى الموجب اليميني. إن الغاية من ذلك منع تيار شحن المكثفة من المرور عبر قاعدة الترانزيستور وفتح الترانزيستور فهذا يؤدي إلى تشغيل مصدر الطاقة الثانوي دون مبرر. في هذه الحالة يطبق الديود جهدًا موجبًا على القاعدة يعادل تمامًا جهد شحن المكثف فلن يمر تيار في القاعدة عندها ولن يفتح الترانزيستور. صل باعث الترانزيستور مع رجل مقاومة 2 كيلو أوم وصل الرجل اﻷخرى مع المسرى السالب ونستخدم هذه المقاومة لتحديد شدة التيار التي ستمر بالمؤشر الضوئي اﻷحمر الذي يحاكي الذواكر. صل أخيرًا الرجل الأطول للمؤشر الضوئي اﻷحمر مع المسرى الموجب اليساري (الذي يمثل التغذية الثانوية) والرجل اﻷخرى مع مجمع الترانزيستور، إذ يمر في هذا الفرع التيار الثانوي. صل القطب الموجب للبطارية بسلك مع المسرى الموجب اليميني وبسلك آخر مع المسرى الموجب اليساري ثم صل القطب السالب مع المسرى السالب المشترك (يمثل هنا مرجع مشترك). ستلاحظ أن المؤشر اﻷخضر سيضيء وفي نفس الوقت تُشحن المكثفة، ولن يضيء المؤشر اﻷحمر لأن الترانزستور الذي يتحكم بتيار التغذية الثانوي مغلق. اسحب السلك الذي يصل قطب البطارية الموجب مع المسرى اليميني محاكيًا انقطاع التغذية الرئيسية، عندها سبطفىء المؤشر اﻷخضر ويعمل المؤشر اﻷحمر لفترة حوالي 10 -20 ثانية ثم ينطفئ محاكيًا استخدام التيار الثانوي لفترة معينة كافية للذواكر بإنجاز عملها. هل يمكنك تفسير ما يحدث؟ مدخل إلى الدوائر الإلكترونية التماثلية والرقمية يُعد مفهومي المقدار التماثلي والرقمي أمرًا مهمًا في فهم التطبيقات المتقدمة لعلم اﻹلكترونيات، وقد لا تحتاج إلى التعمق في هذه المفاهيم حاليًا لكن من المفيد إلقاء نظرة عليهما. المقادير التماثلية نقول عن مقدار أنه تماثلي Analogue إذا تغيّرت قيمته تدريجيًا مع الوقت زيادة أو نقصانًا كزيادة شدة اﻹضاءة أو انخفاضها وتغير قيمة المقاومة تدريجيًا من قيمة إلى أخرى وارتفاع حرارة جهاز أو انخفاضها وهكذا. وتتميز هذه المقادير بأن تغيرها تدريجي بين القيمة العليا والدنيا. تُدعى الدوائر اﻹلكترونية التي تعطي خرجًا تماثليًا بالدوائر التماثلية، مثل الدوائر التي تتحكم بشدة اﻹضاءة أو شدة الصوت أو الحرارة. تطبيق عملي: إضاءة متفاوتة سنستفيد في هذا التطبيق من ترانزستورات حقلية نتحكم فيها بالتيار الذي يستجره المؤشر الضوئي بتغيير الجهد الموجب المطبق على بوابة كل منها. لهذا شكل الدائرة البسيطة التالية من ثلاث مقاومات 2 كيلو وواحدة 1 كيلو وثلاث ترانزستورات حقلية كالتي أرنا إليها في بداية الفقرة: دائرة إلكترونية على لوحة مثقية تضم ترانزستورات ومقاومات ومؤشرات ضوئية وبطارية لا تصل بوابة الترانزستور اﻷول (الرجل في المنتصف وحولها نقطة عادة) مع أي شيء وصل منبعه بمقاومة 2 كيلو أوم ومنها إلى المسرى السالب. صل الرجل اﻷطول للمؤشر الضوئي اﻷول مع المسرى الموجب واﻷخرى مع مصرف الترانزيستور. ضع هذه الدارة إلى يمين اللوحة المثقبة. صل بوابة الترانزستور الثاني مع مقاومة 1 كيلو أوم ثم صلها مع منبع التغذية الموجب. صل بعد ذلك منبعه ومصرفه بنفس طريقة الوصل السابقة. ضع هذه الدارة في الوسط. صل بوابة الترانزستور الثالث مع المسرى الموجب مباشرة، ثم صل منبعه ومصرفه كما في الحالتين السابقتين تمامًا. صل قطبي البطارية إلى المساري المناسبة، وراقب ما يحدث؟ هل تستطيع تحديد نوع الترانزستور الحقلي؟ المقادير الرقمية نقول عن مقدار أنه رقمي Digital إذا أخذ إحدى قيمتين فقط عليا ودنيا ولا يكون الانتقال بينهما تدريجيًا بل لحظيًا مثل تشغيل وإطفاء مؤشر ضوئي. تُستخدم القيمة الرقمية للتحقق من حالة شيء ما إن كان موصولًا أو مفصولًا. وتُبنى النظم المنطقية على أساس المقادير المنطقية فلو كانت قيمة الجهد عند نقطة ما 5 فولط مثلًا كانت القيمة المنطقية الموافقة هي 1 وإن كانت أقل من 1 فولط تكون القيمة المنطقية الموافقة 0 وهكذا. تطبيق عملي: بوابة AND منطقية باستخدام الترانزيستورات القطبية بوابة AND (معناها وَ بالعربية) هي عنصر إلكتروني يوصل التيار إلى خرجه إذا طبق على جميع مداخلها إشارة (تيار كهربائي طبعًا) أي حتى يعمل مثلًا المؤشر الضوئي الموصول إلى خرجها لا بد من تطبيق جهد ثابت على كل مداخلها. لتصميم بوابة AND ترانزيستورية ذات مدخلين ومخرج وتعمل كعنصر رقمي، شكّل الدائرة اﻹلكرتونية التالية من ترانزستورين قطبيين ومقاومتين أكبر من 20 كيلو أوم (كي لا نستهلك تيارًا كبيرًا) ومؤشر ضوئي: دائرة إلكترونية على لوحة مثقبة تضم ترانزيستورات ومقاومات ومؤشر ضوئي وبطارية صل مجمع الترانزستور الأول مع المسرى الموجب وصل باعثه مع مجمع الثاني ثم صل باعث الثاني مع الرجل اﻷطول للمؤشر الضوئي ورجله اﻷقصر مع مقاومة 2 كيلو أوم ومنها إلى المسرى السالب. يكون عندها باعث الترانزيستور الثاني هي مخرج البوابة أو رجل الخرج لها. صل قاعدة كل منهما بمقاومة أكبر من 20 كيلو أوم ثم صلهما إلى المسرى الموجب. تمثل القاعدتين مداخل البوابة أو أرجل الدخل. صل البطارية إلى اللوحة، ماذا سيحدث؟ سيعمل الضوء لأن كلا المدخلين متصلان بجهد محدد. افصل اﻵن أي مقاومة منهما أو كلاهما عن المسرى الموجب و ينطفئ المؤشر. ما يحدث أن وصل قاعدة الترانزيستور اﻷول إلى جهد موجب سيمرر التيار من باعثه إلى مجمع الثاني وإن وصلت قاعدة الترانزيستور الثاني أيضًا إلى جهد موجب سيمرر التيار بدوره إلى المؤشر. وسيؤدي فصل أي من القاعدتين إلى عدم مرور التيار إلى المؤشر الضوئي. تهانينا لقد صممت اﻵن ابسط دائرة متكاملة لها ثلاثة أرجل مدخلين ومخرج، هل يمكنك إضافة بوابة دخل إضافية؟ الخلاصة أكملنا في هذا المقال ما بدأناه في المقال السابق من حيث التوسع قليلًا في شرح مفاهيم جديدة في الدوائر اﻹلكترونية والتعرف على الترانزيستورات وهي عناصر فعّالة شديدة الأهمية من خلال عدة تطبيقات عملية مفيدة تمهد لنا الطريق لمفهوم الدارات المتكاملة التي سنناقشها في مقال لاحق. اقرأ أيضًا المقال السابق: أساسيات في عالم الإلكترونيات: التيار والجهد والعناصر الساكنة طريقة عمل الرابط الديناميكي مع المكتبات في معمارية الحاسوب ما هي لوحة أردوينو Arduino؟ تصميم وتنفيذ آلة موسيقية باستخدام لوحة راسبيري باي بيكو
    2 نقاط
  13. نعرفك في مقال اليوم ما هي لغة الآلة أو لغة الأصفار والوحدات والتي تقع في أدنى مستويات لغات البرمجة، وتستخدم للتخاطب والتفاعل المباشر مع أجهزة الحواسيب، ونكتشف معًا ما هي مميزات لغة الآلة، وما الفرق بين لغة الآلة ولغة التجميع، ونستعرض أمثلة على لغة الآلة واستخداماتها، وطريقة تنفيذ تعليماتها من قبل الحواسيب المختلفة. مستويات لغات البرمجة قبل أن نتعرف ما هي لغة الآلة لنوضح ما هي لغة البرمجة وما هي المستويات التي مرت بها لغات البرمجة خلال تطورها. إن لغة البرمجة هي الأسلوب الذي يعتمده البشر للتخاطب مع الحواسيب وغيرها من الأجهزة القابلة للبرمجة وطلب تنفيذ الأوامر منها، وهي تكتب أو تصاغ على شكل سلسلة من الأوامر المتتالية، وتحفظ على هيئة برامج حاسوبية ثم تمرر حاسوب لتنفيذها والحصول على النتائج المطلوبة. وقد مرت لغات البرمجة خلال تطويرها بعدة مراحل أو مستويات ومن أبرزها: لغات منخفضة المستوى Low-Level Languages لغة الآلة Machine Language لغة التجميع Assembly Language لغات متوسطة المستوى Mid-Level Languages لغات عالية المستوى High-Level Languages لنتعرف على مميزات وسمات كل لغة من هذه اللغات. لغات منخفضة المستوى Low-Level Languages كانت لغات الجيل الأول للحواسيب لغات منخفضة المستوى مكونة من مجموعة من التعليمات التي تدخل إلى الحاسوب في شكل قابل للتنفيذ مباشرة بواسطة معالج الحاسوب حيث كانت التعليمات البرمجية مكونة من أرقام مكتوبة بالنظام الثنائي binary system وهو نظام أساسه العدد 2، أو النظام الست عشري hexadecimal وهو نظام أساسه العدد 16وكان من الممكن تنفيذ هذه البرامج مباشرة. على سبيل المثال هذا الكود هو مثال على جزء من كود مكتوب بلغة الآلة لبرنامج حاسوبي يجمع عددين: 11101100, 11011010, 10100001, 11011101, 01011111, 10111110, 11101110, 00101101, 11010111, 11101100, 11011011, 11101110, 11101110, 11011101, 00001010, 10101011, 11101110, 11101110, 11001110, 10111010, 10101010, 10101101, 11101010, 11101111, 00011010, 11010010, 11101110, 00011010, 10101011, 11101110, 11101110, 10101110, 11101010, 11101011, 11101010, 00001000, 00001010, 11101110, 11001010 البرنامج السابق مكتوب بالنظام الثنائي، وسيكون البرنامج بالشكل التالي في حال استخدامنا النظام الست عشري لكتابة التعليمات: 0xEC, 0xDA, 0xA1, 0xDD, 0x5F, 0xBE, 0xEE, 0x2D, 0xD7, 0xEC, 0xDB, 0xEE, 0xEE, 0xDD, 0x0A, 0xAB, 0xEE, 0xEE, 0xCE, 0xBA, 0xAA, 0xAD, 0xEA, 0xEF, 0x1A, 0xD2, 0xEE, 0x1A, 0xAB, 0xEE, 0xEE, 0xAE, 0xEA, 0xEB, 0xEA, 0x08, 0x0A, 0xEE, 0xCA وكما تلاحظ من فإن كتابة وقراءة لغة الآلة كانت صعبة ومعقدة للغاية، لذا ظهرت لغات الجيل الثاني أو ما يعرف بلغات التجميع assembly languages وهي عبارة عن لغات ذات مستوى منخفض أيضًا لكن كودها البرمجي أسهل في الفهم نوعًا ما، فقد ابتكر علماء الحاسوب لغة التجميع كلغة وسيط أكثر قابلية للقراءة، وهي تتضمن مجموعة محدودة من التعليمات الخاصة بالتعامل المباشر مع العتاد الصلب والتجهيزات الإلكترونية القابلة للبرمجة، وهي تختلف بحسب ببنية كل معالج فكل جيل من المعالجات له لغة التجميع الخاصة به. على سبيل المثال الكود التالي يوضح برنامج مكتوب بلغة التجميع لجمع عددين على معالج Intel x86 لجمع العددين 5 و 7 assembly section .data num1 dd 5 num2 dd 7 result dd 0 section .text global _start _start: mov eax, [num1] add eax, [num2] mov [result], eax ; Exit the program mov eax, 1 ; System call number for exit xor ebx, ebx ; Exit status 0 int 0x80 ; Make system call إذا قرأت الكود السابق فستنتج أن أول قسم منه Section .data يعرف العددين num1 و num2 المطلوب جمعهما كما يعرف متغير result لحفظ نتيجة الجمع، أما القسم _start فهو يشير لبداية البرنامج، وبعدها تبدأ التعليمات الفعلية حيث تقوم التعليمة mov eax, [num1] بنقل القيمة المخزنة في num1 إلى المسجل eax وتقوم التعليمة add eax, [num2] بجمع القيمة المخزنة في عنوان num2 إلى هذا المسجل، وبعدها تُنقل قيمة المسجل إلى المتغير result الذي يخزن نتيجة الجمع، وتستخدم التعليمات الثلاثة الأخيرة للخروج من البرنامج. كما تلاحظ هذه اللغة مفهومة أكثر من الأصفار والوحدات لكنها لا تزال صعبة ومربكة، وتحتاج من المبرمج لأن يهتم بتفصيل دقيقة مثل تحديد المسجلات التي سيتم استخدامها ونقل البيانات إليها أو منها أثناء تنفيذ البرنامج، كما أنها لا تصلح لتطوير البرامج والخوارزميات المتقدمة وستنتج قدرًا كبيرًا من الكود لتنفيذ كل عمليلة. لغات متوسطة المستوى Mid-Level Languages بعد لغة التجميع، طورت لغات برمجة أخرى مثل بيزك BASIC وفورتران FORTRAN وباسكال Pascal وسي C و C++‎ سميت بلغات البرمجة متوسطة المستوى، وهي لغات تقع في مكان وسطي بين لغات البرمجة منخفضة المستوى ولغات البرمجة ذات عالية المستوى مثل بايثون Python أو جافا Java، وهي تتيح للمبرمجين التحكم في التفاصيل الدقيقة للعتاد، وتوفر في نفس الوقت مستوى أعلى من المرونة في التعامل. على سبيل المثال لجمع عددين بلغة البرمجة C سيكون الكود بالشكل التالي: #include <stdio.h> int main() { // تعريف المتغيرات int num1 = 5; int num2 = 7; int result; // جمع الأرقام result = num1 + num2; // طباعة النتيجة printf("النتيجة هي: %d\n", result); return 0; } لغات عالية المستوى High-Level Languages أخيرًا ظهرت لغات الجيل الثالث أو لغات البرمجة عالية المستوى مثل بايثون Python وروبي Ruby وجافا سكريبت JavaScript لتبسيط البرمجة على المطورين والمبرمجين، فهذه اللغات تعد من أسهل لغات البرمجة وتكتب تعليماتها بمفردات قريبة من مفردات اللغة الانجليزية المحكية، وهي سهلة القراءة والفهم من قبل البشر، ولا تضطرنا للتعامل مع التفاصيل الدقيقة المتعلقة بالعتاد. لكن هذه اللغات تحتاج إلى ترجمتها أو تفسيرها ليفهمها معالج الحاسوب ثم يتمكن من تنفيذها بالشكل الصحيح. وهذه اللغات ليست مرتبطة بنوع جهاز معين حيث يمكن تحويل أوامرها إلى تعليمات مختلفة بلغة الآلة حسب كل جهاز كي يتمكن من تفسيرها وتنفيذها. على سبيل المثال يحقق الكود التالي بلغة بايثون نفس وظيفة الكود السابق لجمع عددين، ويمكنك أن تلاحظ بساطة وسهولة اللغة ومدى قربها من كلامنا المحكي مقارنة بالأكواد السابقة: # تعريف المتغيرات num1 = 5 num2 = 7 # جمع الأرقام result = num1 + num2 # طباعة النتيجة print("النتيجة هي:", result) ما هي لغة الآلة وكيف تعمل لغة الآلة أو لغة الأصفار والواحدات هي لغة برمجة تتكون من أوامر وتعليمات مكتوبة بطريقة يستطيع الحاسوب فهمها ومعالجتها، فالحاسوب يفهم في الواقع فقط الأصفار والواحدات حيث أن الرقم 1 يعني وجود تيار أو جهد كهربائي، والرقم 0 يعني عدم وجود تيار أو جهد كهربائي. وفي بدايات ظهور الحواسيب كانت هذه الأرقام تحول إلى أوامر، ومن ثم تنفذ مباشرة بواسطة وحدة المعالجة المركزية CPU. ويكون كل أمر عبارة عن رمز رقمي أو سلسلة من الرموز الرقمية الممثلة بالنظام الثنائي أو الست عشري كما شرحنا سابقًا، وتجدر الإشارة الأن هذه الرموز الرقمية خاصة بكل جهاز حيث تطور لكل بنية معالجات لغة آلة خاصة به. وقد كانت الطريقة الوحيدة لإدخال هذه التعليمات إلى الحواسيب في بدايات ظهورها هي من خلال البطاقات المثقبة فإجهزة الحواسيب الأولى لم تكن أجهزة قادرة بعد على تخزين البيانات في ملفات لذا إذا أردت كتابة برنامج بلغة الآلة وإدخاله للحاسوب فإن الطريقة الوحيدة هي استخدام هذه البطاقات المثقبة. تحتوي كل بطاقة على ثقوب تُعبر عن تعليمات محددة للكمبيوتر حول المهام التي نريد تنفيذها، فإذا كان الثقب موجودًا سيمثل القيمة 1، وإذا لم يكن هناك ثقب يمثل القيمة 0، وكان لهذه البطاقات أشكال عديدة لكن أشهرها كان البطاقة المكونة من 80 عمودًا التي طورتها شركة IBM في عام 1928 كما هو موضح في الصورة التالية. مصدر الصورة تخيل أنك ستحتاج إلى بطاقة واحدة مشابهة من أجل كتابة كل سطر من التعليمات البرمجية! لذا كانت كتابة برنامج كامل باستخدام هذه البطاقات أمرًا في غاية الصعوبة ويتطلب مجموعة هائلة من البطاقات، وكانت هذه البطاقات تمرر إلى الحاسوب بشكل تسلسلي إلى جهاز مخصص يسمى قارئ البطاقات ليقوم بقراءة تعليماتها عمودًا عمودًا ويحول تسلسل الثقوب إلى معلومات رقمية، ثم يحملها في ذاكرة الحاسوب، وبعد اكتمال قراءة وتحميل كل البطاقات في الذاكرة ينفذ تعليماتها البرمجية ثم يخرج النتائج على شكل بطاقات مثقبة أيضًا. ولك أن تتخيل كم كان المبرمجون الأوائل يبذلون جهدًا في عملية البرمجة والتواصل مع الحاسوب، وقد استمر العمل بهذه الآلية ظهرت الأقراص المغناطيسية والأجهزة الطرفية peripherals لتخزين وإدخال البيانات وظهرت أجهزة الحواسيب الشخصية التي ألغت استخدام البطاقات المثقوبة ووجعلتها جزءًا من تاريخ لغات البرمجة. مميزات لغة الآلة بالرغم من أن لغة الآلة صعبة ومعقدة على البشر، إلا أنها تتمتع بمجموعة من المميزات والخصائص من أهما: تستخدام لغة الآلة الأرقام الثنائية 0 1 التي يفهمهما الحاسوب وينفذها مباشرة دون الحاجة إلى مترجم لتفسيرها. تسمح لغة الآلة للمبرمجين بالتحكم في عتاد الحاسوب مثل المعالج والذاكرة بشكل مباشر. تتميز لغة الآلة بالسرعة والكفاءة مقارنة مع اللغات عالية المستوى. تصلح لغات المستوى المنخفض لتطوير برامج النظام الأساسية للحواسيب. عيوب لغة الآلة من أبرز العيوب التي تعاني منها لغة الآلة ما يلي: من الصعب كتابة البرامج والخوارزميات المعقدة وتنفيذها باستخدام لغة الآلة. تتطلب كتابة الكثير من أسطر التعليمات البرمجية لبرنامج بسيط يتطلب تعديل البرامج الكثير من الوقت والجهد من الصعب تحديد وتصحيح الأخطاء البرمجية للبرامج المكتوبة بلغة الآلة تكون لغة الآلة خاصة بالأجهزة أي أنها تعتمد على نوع أو عائلة معالج الجهاز الذي ستعمل عليه لذا تختلف من جهاز لآخر الخلاصة تعرفنا في مقال اليوم على لغة الآلة التي تقع في أدنى مستويات لغات البرمجة والتي يفهمها الحاسوب بشكل مباشر وينفذها بواسطة وحدة المعالجة المركزية CPU، وتعرفنا على طريقة التعامل معها وأبرز مميزاتها وعيوبها. واليوم لم تعد لغة الآلة أو لغات المستوى المنخفض تستخدم من قبل المبرمجين إلا في مجالات وتطبيقات محدودة للغاية تحتاج للتعامل مع عتاد الحاسوب مباشرة، فقد أصبحت لغات البرمجة عالية المستوى أسهل بكثير ولكن تذكر أن جميع لغات البرمجة تحول في نهاية المطاف إلى برامج بلغة الآلة كي تنفذ من قبل الحاسوب. اقرأ أيضًا مستويات لغات البرمجة دليلك إلى أنواع لغات البرمجة قواعد البرمجة ببساطة للمبتدئين تعلم أساسيات البرمجة
    2 نقاط
  14. هل أنت مهتم بتعلم البرمجة والتطوير لكنك تتساءل ما هي مدة تعلم البرمجة؟ وكم أحتاج من الوقت لتعلم لغة برمجة معينة، وهل سأستغرق وقتًا طويلًا لتعلمها والعمل بها؟ وفي مقال اليوم نحاول أن نجيبك على كل هذه الأسئلة ونقدم بعض النصائح المفيدة التي تساعدك على التقدم بشكل أسرع. في الواقع قد تختلف الإجابة على هذا السؤال اعتمادًا على عدة عوامل مثل الوقت الذي يمكنك توفيره لدراسة البرمجة يوميًا ومدى استيعابك، وهل تبدأ من الصفر أم لديك بعض المعلومات المسبقة عن البرمجة، وما هو المجال أو التخصص الذي ترغب بتعلمه كم يستغرق تعلم البرمجة دعنا نتفق أنه ليس من السهل تحديد جواب دقيق لهذا السؤال، جرب مثلًا أن تكتب في محرك البحث جوجل "كم يستغرق تعلم البرمجة" ستفاجئ بالحصول على إجابات متفاوتة بشكل كبير على هذا السؤال قد تتراوح من ثلاثة أشهر إلى خمس سنوات! يعزى هذا التفاوت الكبير في الإجابات إلى وجود عوامل عديدة تلعب دورًا في تحديد مدة تعلم البرمجة، بعض هذه العوامل فردية وتختلف من شخص لآخر فهناك أشخاص يتعلمون المفاهيم الجديدة أسرع من غيرهم، وبعضهم لديه متسع من الوقت يمكن تخصيصه يوميًا في دراسة البرمجة أكثر من غيره، وبعضها الآخر عوامل تتعلق بطبيعة لغة البرمجة التي تنوي تعلمها أو التخصص البرمجي التي تود تعلمه وهل ترغب بالتعلم لدخول سوق العمل أم لمجرد اكتساب مهارات شخصية فكل هذه العوامل تؤثر على وتيرة تعلمك وزمن تحقيق أهدافك. سنناقش في الفقرات التالية بعض العوامل المهمة التي تؤثر على مدة تعلم البرمجة ونوضح كم يستغرق تعلم البرمجة بناء على كل حالة من الحالات لنساعدك على تحديد الوقت المطلوب بشكل تقريبي بحسب حالتك. العوامل التي تؤثر على مدة تعلم البرمجة الخبرة المسبقة صعوبة لغة البرمجة المستوى الذي تطمح للوصول إليه التخصص أو المجال البرمجي أسلوب التعلم جودة مصادر التعلم الخبرة المسبقة فإذا كنت تنوي تعلم البرمجة من الصفر ولم يكن لديك أي خلفية تقنية وليس لديك أدنى فكرة عن مبادئ التعامل مع الحاسوب ومفهوم الخوارزميات وأسس التفكير المنطقي وحل المشكلات وعن أي لغة برمجة سابقة فسيستغرق تعلم البرمجة وقتًا طويلاً منك نظرًا لوجود مجموعة واسعة من المفاهيم التي عليك تعلمها وقد يستغرق الأمر عدة أشهر حتى تتمكن من كتابة استيعاب أساسيات البرمجة وفهم مفردات لغة البرمجة التي تستخدمها وكتابة برنامج الأول بها بنفسك وتنفيذه بشكل صحيح. من الضروري أن لا تشعر بالإحباط في بدايات تعلم البرمجة وتأسيس نفسك بها فالبدايات دومًا هي الأصعب فإذا تخطيت هذه المرحلة فستتمكن من التقدم بتعلم البرمجة بوتيرة أسرع وسيسهل عليك الانتقال لتعلم أي لغة برمجة أخرى. صعوبة لغة البرمجة أحد العوامل المهمة في زمن تعلم البرمجة هو اللغة التي تختارها فهناك العديد من لغات البرمجة المختلفة مثل لغة بايثون Python. وجافا Java و C++ و PHP وغيرها الكثير وبعض هذه اللغات سهل التعلم وبعضها الآخر أكثر صعوبة ويستغرق مدة تعلم أطول فتعلم لغة برمجة سهلة نسبيًا يستغرق حوالي أربعة إلى ستة أشهر وستحتاج لوقت أكبر إذا كنت تتعلم لغة برمجة صعبة. لذا عندما تقرر تعلم البرمجة فمن الأفضل أن تبحث عن لغة لها منحنى تعلم "Learning Curve" سهل وغير حاد أو معقد، ومنحنى التعلم هو طريقة بيانية للتعبير عن صعوبة تعلم الشخص لموضوع خلال فترة زمنية معينة ويعبر عن سرعة التقدم والخبرات المكتسبة في هذا الموضوع مع مرور الوقت. على سبيل المثال تملك لغة بايثون Python منحنى تعليمي أسهل من لغة جافا Java بسبب تعتبر لغة تركيبتها التي تشبه إلى حد كبير اللغة الإنجليزية وقواعدها السهلة، لهذا السبب فإن مدة تعلم لغة البايثون ستكون أقصر من مدة تعلم لغة جافا وتقدر المدة الوسطية لتعلم أساسيات بايثون بخمس إلى عشر أسابيع في حين تصل مدة تعلم جافا من ستة أشهر إلى 18 شهرًا، ويمكنك مطالعة المزيد من المعلومات حول لغات البرمجة التي يفضل أن تبدأ بها تعلم البرمجة من خلال مقال أسهل لغات البرمجة. المستوى الذي تطمح للوصول إليه إذا كنت تقصد عند سؤالك ما المدة التي أحتاجها لتعلم البرمجة أن تتعلم أساسيات البرمجة وتتعرف على طريقة أسلوب كتابة الشيفرات والتعليمات وتعريف المتغيرات وأنواع البيانات، والحلقات والشروط والدوال البرمجية …إلخ. لمجرد اكتساب مهارة تنمي تفكيرك المنطقي والتحليلي وتوسع مداركك وتمكنك من كتابة برامج حاسوبية لحل مشكلات بسيطة أو أتمتة مهامك اليومية المتكررة فهذا الأمر لن يتطلب منك سوى ثلاثة إلى ستة أشهر فقط لتعلم البرمجة بأي لغة كانت. لكن هذه المدة لن تكون كافية لك لاحتراف البرمجة ودخول سوق العمل فهذا الأمر قد يتطلب منك حوالي سنة أو أكثر للعمل على بناء برامج معقدة وتطبيقات احترافية متكاملة تتعامل مع مشكلات فعلية وتنبي من خلالها معرض أعمال جيد يعزز فرصتك في الحصول على عمل مناسب وإذا كنت تحتاج علم لغة برمجة سهلة نسبيًا يستغرق حوالي أربعة إلى ستة أشهر. التخصص أو المجال البرمجي إن مجالات البرمجة كثيرة ومتنوعة مثل تطوير الويب وبرمجة المواقع وبرمجة الألعاب والذكاء الاصطناعي وعلوم البيانات والأمن السيبراني وغيرها الكثير وبتطلب كل تخصص برمجي مجموعة مهارات مختلفة عن الآخر فكلما زادت المهارات المطلوبة وزاد تعقيدها، كلما زاد الوقت الذي تحتاجه لتعلمها. على سبيل المثال، تبلغ مدة تعلم برمجة المواقع حوالي ستة أشهر إلى عام واحد، في حين يحتاج تعلم أساسيات الذكاء الاصطناعي مدة أطول قد تصل لسنة أو أكثر لأنه مجال أكثر تعقيدًا ويتطلب وجود أساس جيد في الرياضيات والإحصاء ويحتج بعض الوقت للتآلف مع مصطلحاته والتعرف على تخصصاته المختلفة وتعلم خوارزميات التعلم الآلي ولغات برمجة الذكاء الاصطناعي كما يحتاج للكثير من الممارسة لإتقانه. أسلوب تعلم البرمجة تختلف مدة تعلم البرمجة أيضًا بحسب الطريقة التي تختارها للتعلم، فإذا اخترت دارسة البرمجة عن طريق التعليم الأكاديمي والتسجيل في إحدى الجامعات فستستغرق وقتًا طويلًا لا يقل عن أربع أو خمس سنوات لأنك ستضطر على الالتزام بمنهج محدد. أما إذا اخترت التعلم الذاتي فستتمكن من توفير الكثير من الوقت وتقتصر اعلى لغات البرمجة والتقنيات التي تحتاج لتعلمها وبقدر ما تثابر وتبذل من جهد وتلتزم بخطة تعلم منظمة وساعات تعلم محددة يوميًا فستختصر من زمن تعلم البرمجة وتتمكن من دخول سوق العمل بسرعة أكبر. جودة مصادر التعلم إذا قررت تعلم البرمجة فستجد الكثير من مصادر التعلم المتنوعة من دروس ومقالات وكتب ومقاطع فيديو ودورات تدريبية وغيرها من المصادر التي تساعدك لكن هذه المصادر ليست على نفس المستوى من الجودة وقد يصعب عليك كمبتدئ تمييز الغث من السمين وتحديد الترتيب الصحيح لمواضيع التعلم والتركيز على تعلم ما يهمك. كما أن تعلمك من مصادر مشتتة وبطريقة عبثية فتارة تشاهد مقطع فيديو عن موضوع ما وتارة تقرأ مقالة عن موضوع آخر وتارة تبدأ بقراءة كتاب ثم تمل منه سريعًا سيزيد بلا شك من مدة تعلم البرمجة وتحقيق هدفك وتذكر أن المشتت لا يصل. فإذا كنت تتعلم البرمجة دون خطة منهجية واضحة وتريد اختصار وقت تعلم البرمجة فمن الأفضل أن تستثمر وقتك وجهدك وتسجل في دورة تدريبية المنهجية التي تقدم لك المعرفة التي تحتاجها بالتسلسل الصحيح وتوضح لك الأدوات والتقنيات التي تحتاجها وتقيم مهاراتك بشكل معياري وتساعدك على تنفيذ تطبيقات عملية تعزز ما تعلمته وتزيد فرصتك في الحصول على وظائف برمجة مناسبة لمهاراتك. ستجد في أكاديمية حسوب الكثير من الدورات التعليمية عالية الجودة بمختلف التخصصات توفر لك إمكانية التعلم من الصفر دون الحاجة لأي معرفة مسبقة وتساعدك على التعلم بطريقة منظمة وتقرن التعليم النظري بالتطبيق العملي والأهم أنها توفر لك مدربين خبراء يرشدونك ويدعمونك طوال رحلتك التعليمية ويساعدونك في الإجابة على أي تساؤل وحل أي مشكلة تواجهك ويسعدون بتقديم المشورة التي تحتاجها حتى تحترف البرمجة وتجد فرصة العمل المناسبة. هل فات الوقت على تعلّم البرمجة كثيرًا ما نسمع أسئلة من قبيل أنا مهتم بالبرمجة والتقنية وأرغب في تعلمها لأعمل في وظيفة أفضل وذات مردود مادي أعلى أو أرغب بتعلم البرمجة لمواكبة التطور التقني وتعزيز مهارات حل المشكلات لدي ولكن عمري (كذا سنة) فهل فات الوقت على تعلم البرمجة؟ دعني أخبرك بأنه مهما كان عمرك فإن الأوان لم يفت على تعلم البرمجة فالعمر لا يشكل أي عائق في التعلم سواء في ظل وفرة الموارد المتاحة لمساعدتك. وقد يستغرق تعلم البرمجة مدة أطول مع التقدم في السن لكنك قادر على تقليل هذه المدة في حال خصصت وقتًا أطول وأسست نفسك بشكل جيد بالاعتماد على مصادر عالية الجودة وامتلكت الإرادة والرغبة الحقيقية للتعلم فهذا كفيل بجعلك تتغلب على أي صعوبات أو عوائق تواجهها. نصائح لتقليل مدة تعلم البرمجة حدد هدفك من تعلم البرمجة والتخصص البرمجي المناسب لك، وضع خطة لتعلم التقنيات واللغات التي تفيدك في هذا التخصص. عزز مهارة حل المشكلات والتفكير المنطقي قبل البدء بالبرمجة فهي مهارات أساسية تقلل مدة تعلم البرمجة. ركز على تعلم لغة برمجة سهلة وتناسب المبتدئين فهذا يسهل عليك استيعاب المفاهيم البرمجية بوقت أقل ويسهل عليك الانتقال لتعلم أي لغة برمجة أخرى. لا تستسلم بسرعة، فتعلم أي شيء جديد سيكون صعبًا في البداية ويستغرق بعض الوقت لفهم الأساسيات ومع الوقت والخبرة تصبح الأمور أسهل. اعتمد على مصدر جيد لتعلم البرمجة ولا تشتت نفسك بكثرة المصادر. احرص على التطبيق العملي لما تتعلمه من مفاهيم فهذا يعزز مهاراتك ويساعدك على بناء معرض أعمال يثبت خبرتك. تعلم مع أصدقاء لديهم نفس اهتمامك وضع معهم هدفًا مشترك وخطة للتعلم وتعاون معهم في حل المشكلات وتعلم المفاهيم الجديدة فهذا يجعل التعلم أكثر متعة ويحفزك على المواصلة. الخلاصة نأمل أن يكون هذا المقال قد ساعدك في تحديد كم يستغرق تعلم البرمجة ومعرفة أهم العوامل التي تلعب دورًا في الإجابة على هذا السؤال بشكل تقريبي، وكما وضحنا في المقال لا يوجد جواب واحد يناسب الجميع على هذا السؤال لكن بإمكانك اختصار مدة تعلم البرمجة ودخول سوق العمل بسرعة بالمثابرة والجهد. وتذكر في الختام أن البرمجة تحتاج منك إلى الاستمرار في التعلم وتطوير نفسك حتى بعد الاحتراف ودخول سوق العمل، فالتقنيات تتغير وتتطور باستمرار ومن الضروري مواكبة هذه التغييرات وتطبيقها في عملك للحفاظ على مكانتك التنافسية وتلبية متطلبات سوق العمل المتجددة. اقرأ أيضًا دليل شامل لتعلم البرمجة قواعد البرمجة ببساطة للمبتدئين اكتشف ما هي البرمجة وما أهمية تعلمها برمجة الحاسوب للمبتدئين لماذا يجب أن تعلم طفلك البرمجة؟
    2 نقاط
  15. نعرفك في مقال اليوم على نظام التشغيل لينكس Linux أحد أشهر أنواع أنظمة التشغيل، وتاريخ نشأته وتطوره، ثم نتطرق لتوضيح أبرز مميزاته وعيوبه والطريقة المثلى لاستخدامه والتعامل معه. ما هو نظام لينكس Linux؟ نظام لينكس Linux أو ما يعرف بنظام جنو لينكس GNU/Linux هو نظام تشغيل حرّ ومفتوح المصدر شبيه بنظام التشغيل يونكس Unix يصدر بموجب رخصة جنو العمومية GPLv2 أي أن أي شخص يمكنه الاطلاع على كوده البرمجي وتعديله وإعادة توزيعه بنفس شروط الرخصة أو بشروط مكافئة. يتميز نظام لينكس بكونه نظام تشغيل فعال ومستقر ويستخدم شخصية البطريق كعلامة رسمية له، هذا البطريق اللطيف الذي تراه في الصورة التالية يدعى توكس Tux وقد ابتكره المبرمج الأمريكي لاري إيوينج Larry Ewing وصورته لا ترتبط بأي شركة تجارية ولا تخضع لأي حقوق لتعكس طبيعة Linux المفتوحة المصدر. تاريخ نظام لينكس أول من طور نظام لينكس طالب فنلندي يدعى لينوس تورفالدس Linus Torvalds حيث أنشأ الإصدار الأول من نواة لينكس عام 1991 كمشروع شخصي والنواة هي المكون الرئيسي في نظام التشغيل لينكس وهي عبارة عن برمجيات منخفضة المستوى تمثل جسر بين عتاد وبرمجيات الحاسوب وتدير موارده بالشكل الأمثل. قبل ذلك كان العمل جاريًا على مشروع نظام جنو GUN منذ عام 1984 بقيادة عالم الحاسوب الأمريكي ريتشارد ستالمان Richard Stallman لإنشاء نظام تشغيل كامل من الصفر يشبه نظام يونكس لكنه يتألف بالكامل من برمجيات حرّة وبحلول عام 1991 لم يكن مشروع جنو قد أكمل بعد تطوير نواة نظامه، فقرر إضافة نواة لينكس إلى مشروعه عام 1992 لإنشاء نظام تشغيل متكامل ومجاني أطلق عليه اسم نظام جنو/لينكس يتألف من نواة لينكس، التي تدير الأجهزة والموارد، وبرامج جنو التي توفر أدوات وتطبيقات ومكتبات داعمة. ويواصل مجتمع المطورين تطوير مكونات وتطبيقات داعمة لنظام لينكس ودمجها مع نظام لينكس ما جعله واحدًا من أقوى أنظمة التشغيل اليوم وهو متوافق مع معظم المنصات والبيئات فبالرغم من أن نظام لينكس صمم بالأصل لتشغيل الحواسيب الشخصية التي تعتمد على بنية Intel x86 إلا أنه تطور بشكل كبير وأصبح اليوم قادرًا على تشغيل العديد من المنصات والأجهزة كالحواسيب المركزية العملاقة والخوادم والهواتف الذكية والأجهزة المدمجة أي الأجهزة التي تم تصميم نظام التشغيل الخاص بها عادةً في البرامج الثابتة ومخصصة للغاية للنظام مثل أنظمة Raspberry Pi. مكونات نظام التشغيل لينكس يتألف نظام التشغيل لينكس Linux بشكل أساسي من المكونات الأساسية التالية: النواة Kernal التطبيقات Applications الصدفة Shell لنتعرف في الفقرات التالية على كل مكون من هذه المكونات بمزيد من التفصيل. النواة Kernal نواة لينكس هي الجزء الأساسي من النظام، وهي أول برنامج يتم تحميله عند بدء تشغيل نظام الحاسوب وتعمل كصلة وصل بين العتاد والبرامج وتدير موارد الجهاز كالمعالج والذاكرة والطابعة وأجهزة التخزين وغيرها من الأجهزة وتتحكم بها. التطبيقات Applications يوفر نظام التشغيل جنو GUN مجموعة من التطبيقات والأدوات الخدمية التي تمكّن المستخدم من إدارة النظام وتتيح له التعامل معه بكفاءة مرونة. الصدفة Shell الصدفة هي مكون أساسي لنظام لينكس وهي تقع بين النواة والتطبيقات الخدمية، وتوفر للمستخدم طريقة للاستفادة من كامل ميزات ووظائف النظام وتكون عادة واجهة سطر أوامر أو طرفية تستقبل الأوامر والنصوص البرمجية scripts التي يكتبها المستخدم وتحولها إلى لغة مفهومة من قبل النواة. هناك أنواع مختلفة من الصدفات، حيث تملك كل صدفة خصائص تختلف عن غيرها في كيفية معالجة وتفسير الأوامر التي تصلها، وتسمى الصدفة الافتراضية في نظام لينكس صدفة باش Bash. وقد توفر بعض أنظمة لينكس واجهة مستخدم رسومية GUI جنبًا إلى جنب مع واجهة سطر الأوامر لتسهيل التعامل مع النظام. ما معنى توزيعات لينكس؟ يصدر نظام التشغيل Linux على شكل توزيعات Linux distributions أو ما يعرف اختصارًا Linux distro حيث تتكون التوزيعة من نواة لينكس بشكل أساسي إضافة لمجموعة من الأدوات والبرامج والتطبيقات المختلفة التي تختلف من توزيعة لأخرى لتقدم وظائف مساعدة مثل واجهة المستخدم الرسومية التي تعرف باسم بيئة سطح المكتب وبرنامج مدير الحزم وغيرها من الأدوات الأساسية المفيدة التي تشكل بدمجها مع بعضها البعض نظام تشغيل متكامل يمكّن المستخدم من القيام بكافة المهام المطلوبة منه. لهذا السبب تتوفر اليوم مئات توزيعات أو إصدارات لينكس تناسب كل واحدة منها منصات وأجهزة مختلفة وبالرغم من أن معظم البرامج المضمنة في توزيعات لينكس مجانية ومفتوحة المصدر إلا أن بعض توزيعات لينكس قد تحتوي على برامج احتكارية لا تخضع لرخصة GNU، تطورها جهات خارجية مثل برامج تشغيل الأجهزة التي توفرها الشركات المصنعة لدعم أجهزتها وتدمجها مع النظام ولهذا السبب قد تفرض بعض توزيعات لينكس رسومًا مقابل خدمات القيمة المضافة. كما تختلف توزيعات لينكس عن بعضها بتجربة المستخدم وخيارات استخدامها وأسلوب تثبيت البرامج الجديدة فيها أو تحديثها فبعض التوزيعات أسهل استخدامًا من غيرها وتوفر طرق واضحة ومريحة لتثبيت البرمجيات بينما تكون هذه العملية معقدة في بعض التوزيعات لهذا من الضروري أن تفهم أبرز مواصفات أي توزيعة قبل أن تقرر استخدامها. هناك العديد من توزيعات لينكس Linux التي تناسب مختلف المتطلبات والاستخدامات، بعض هذه التوزيعات طورها مجتمع لينكس وبعضها طورته شركات تجارية ومن أبرزها أوبونتو Ubuntu و ديبيان Debian، ولمعرفة المزيد حول توزيعات لينكس يمكنك مطالعة مقال ما هو نظام لينكس ولماذا توجد 100 توزيعة منه؟ ومقال عرض موجز لأشهر توزيعات لينكس مميزات نظام التشغيل لينكس يتمتع نظام التشغيل لينكس بالعديد من المميزات ومن أهم مزايا استخدام Linux ما يلي: مفتوح المصدر ويمكن لأي شخص الاطلاع على الكود المصدري وتحريره وتحسينه وإعادة توزيعه. مجاني ولا يتطلب دفع رسوم ترخيص لاستخدامه (يتطلب دعم النظام دفع رسوم). يوفر مئات التوزيعات المناسبة لمختلف الاستخدامات والمنصات. يملك مجتمع كبير ونشط من المطورين الذين يطورون تطبيقات وبرامج داعمة لإصدارات لينكس المختلفة. خفيف الحجم ويتطلب حجم ذاكرة ومساحة تخزين أقل بكثير مما تتطلبه أنظمة التشغيل. يوفر طرفية أو بيئة سطر أوامر قوية قادرة تشغيل العديد من التعليمات والأوامر والتفاعل مع نظام الملفات دون الحاجة لاستخدام واجهة المستخدم الرسومية وهي ميزة أساسية لإدارة الخوادم التي تعمل بنظام لينكس. آمن وموثوق وأقل عرضة للفيروسات والثغرات الأمنية ويحمي خصوصية مستخدميه. يوفر Linux أمان المستخدم من خلال ميزات المصادقة مثل حماية كلمة المرور والتحكم في الوصول إلى ملفات محددة وتشفير البيانات. مثالي للمبرمجين والمطورين فهو متوافق مع معظم لغات البرمجة وتتضمن معظم توزيعات لينكس الكثير من المترجمات ومحررات الأكواد وبيئات التطوير بشكل افتراضي أو توفر تنزيلها من خلال مدير الحزم. مستقر ويتعامل بشكل جيد مع أخطاء تشغيل البرامج ويوفر تحديثات وتصحيحات مستمرة. يعد نظام متعدد المستخدمين ومتعدد المهام أي أنه يمكن لعدة مستخدمين الوصول إلى النظام في نفس الوقت وتشغيل عدة تطبيقات بآن واحد. عيوب نظام لينكس Linux لا يخلو نظام لينكس من بعض العيوب أو الجوانب السلبية ومن أبرزها: استخدام نظام لينكس وتثبيت التطبيقات عليه صعب نسبيًا لا سيما من قبل المستخدمين المبتدئين وغير التقنيين. لكل توزيعة لينكس واجهة خاصة بها وطريقة استخدام مختلفة ما يجعل التبديل بين توزيعاته أمرًا صعبًا. لا يمكن استخدام معظم البرامج الاحتكارية مثل حزمة تطبيقات سطح المكتب مايكروسوفت أوفيس على نظام لينكس. يدعم نظام لينكس عدد ألعاب محدود نسبيًا فإذا كنت من محبي الألعاب فقد لا تجد إصدارًا متوافقًا مع لينكس من لعبتك المفضلة. بعض إصداراته ليست مجانية فبالرغم من أن بمقدور أي مؤسسة الحصول على نظام لينكس دون رسوم ترخيص إلا أن بإمكانها إعادة توزيعه مقابل دفع رسوم معينة مثل إصدار ريد هات الخاص بالمؤسسات. قد لا توفر بعض الشركات المصنعة للأجهزة برامج تشغيل خاصة بنظام لينكس أو توفرها بمقابل مادي. ما الفرق بين Linux و Windows يعد كل من ويندوز Windows ولينكس Linux نظامي تشغيل مشهورين جدًا، لكنهما يختلفان في العديد من الجوانب أهمها نموذج الترخيص فنظام ويندوز هو نظام تشغيل تجاري ومغلق المصدر طورته مايكروسوفت ويتطلب شراء ترخيص لاستخدامه، أما لينكس فهو نظام تشغيل مجاني ومفتوح المصدر حيث يمكن للمستخدمين تنزيله واستخدامه بدون دفع أي رسوم. كما يتميز نظام ويندوز بواجهة بسيطة وسهلة الاستخدام ما يجعله أكثر شيوعًا وملائمةً للمستخدمين الذين ليس لديهم خلفية تقنية، أما لينكس فهو أصعب في الاستخدام لكنه أكثر مرونة ويسهل تعديله حسب احتياجات المستخدم لذا يفضله المستخدمون المحترفون، كما أن استخدام لينكس قد يكون صعبًا على مستخدمي ويندوز حيث يحتاج المستخدم لتعلم مصطلحات ومفاهيم جديدة ومعرفة طريقة استخدام أنواع مختلفة من البرامج والأدوات للتعامل معه. كما يعدّ نظام لينكس آمنًا بطبيعته وهو أكثر أمانًا من نظام ويندوز، فنادرًا ما تصاب أنظمة Linux بالفيروسات وحتى في حالة الإصابة بفيروس ما فسيتضرر جزء فقط من النظام ولن يتمكن الفيروس من إصابة النظام بأكمله، كما تملك نواة لينكس جدار حماية مدمج، في حين يتعرض نظام ويندوز للهجمات الإلكترونية بشكل أكبر لكثرة مستخدميه ويتطلب اهتمامًا خاصًا بتثبيت برامج مكافحة الفيروسات لنظام التشغيل وتحديثها بشكل مستمر. استخدامات نظام لينكس يصلح نظام لينكس للاستخدام في العديد من المجالات وفي جميع الأجهزة الإلكترونية تقريبًا بفضل توزيعاته وإصداراته المختلفة التي تصلح لمختلف التطبيقات، وفيما يلي نستعرض أبرز استخدامات لينكس: خوادم الويب وخوادم قواعد البيانات وخوادم الملفات وخوادم أسماء النطاقات DNS وخوادم البريد الإلكتروني وأي نوع آخر من الخوادم. أجهزة الحاسوب الشخصية حيث توفر العديد من إصداراته بيئة سطح مكتب سهلة الاستخدام ورغم ذلك قد لا يكون نظام التشغيل المفضل لمستخدمي الحواسيب الشخصية. تشغيل تطبيقات الحوسبة السحابية بفضل قابلية التوسع وسهولة نشره عبر خوادم متعددة. تشغيل التطبيقات كبيرة الحجم وتنفيذ مهام الحوسبة العلمية التي تتطلب عمليات حسابية معقدة. تشغيل الهواتف المحمولة فنظام تشغيل الجوالات المشهور آندرويد Android مبني على نواة لينكس. نظام تشغيل مضمن embedded system لتشغيل الأجهزة التي تتطلب تنفيذ مهام ووظائف محددة مثل الأجهزة المنزلية الذكية أو أنظمة الإنذار وكاميرات المراقبة وغيرها. تشغيل أجهزة الشبكة مثل الموجهات routers والمحولات switches. تطوير البرامج مفتوحة المصدر مثل نظام التحكم بالإصدارات git ومحررات الأكواد vim و emacs ومترجمات ومفسرات معظم لغات البرمجة. كيفية التعامل مع نظام Linux إذا كنت مهتمًا بتعلم كيفية التعامل مع نظام التشغيل لينكس فهذه خطوة جيدة إذ تتطلب العديد من الوظائف التقنية طريقة التعامل مع نظام لينكس، وبالرغم مما يقال عن صعوبة استخدام لينكس إلا أنك تستطيع بقليل من الوقت والجهد التآلف مع استخدام نظام لينكس والتعامل مع أوامره الأساسية. اختر توزيعة لينكس الملائمة لاحتياجاتك ومتطلباتك وإذا لم تعرف أي توزيعة هي الأنسب فيفضل أن تبدأ باستخدام توزيعة سهلة الاستخدام مثل أبونتو Ubuntu أو فيدورا Fedora أو مينت Mint. إذا كنت تملك جهاز يعمل بنظام ويندوز أو ماك يمكنك أن تثبت نظام لينكس على جهازك وتتعلم كيفية عمله من خلال أدوات مساعدة مثل تطبيق VirtualBox الذي يمكّنك من إنشاء جهاز افتراضي وتشغيل نظام تشغيل مختلف وبهذا تشغيل أنظمة تشغيل وتطبيقات متعددة على جهاز واحد بسهولة. تعلم طريقة التعامل مع الجهاز الافتراضي وتثبيت توزيعة Linux داخله، لن تختلف الخطوات فيما إذا كنت تثبت لينكس على جهاز حقيقي. تعلم أساسيات التعامل مع نظام لينكس مثل استخدام الواجهة الرسومية وطريقة تخصيصها. تعلم هيكل الملفات والأدلة في لينكس وإدارة صلاحياتها فالملفات في لينكس تنظم في بنية شجرية تختلف عن هيكلية ملفات ويندوز والتنقل بينها من خلال الطرفية. تعلم استخدام صدفة باش Bash والتفاعل مع النظام باستخدامها وكيفية كتابة النصوص البرمجية والبرامج البسيطة في باش Bash. تعلم إدارة الحزم والتعامل مع مدير الحزم الخاص بتوزيعتك وتثبيت البرامج وتحديثها في Linux وطريقة التحقق من تحديثات النظام. اختر مصادر تعليمية منظمة ومنهجية، ستجد الكثير منها على الإنترنت كما ستجد في أكاديمية حسوب مجموعة منوعة دروس ومقالات تعلم لينكس تناسب المبتدئين والمحترفين كما توفر لك دورة علوم الحاسوب مسارًا كاملًا يعلمك طريقة التعامل مع نظام لينكس من الصفر للاحتراف دون الحاجة لوجود أي معلومات فنية مسبقة. طبق ما تتعلمه بشكل عملي وتعلم طريقة استخدم أوامر لينكس المختلفة لإدارة النظام والتفاعل معه. انضم للمنتديات ومجتمعات الدعم الخاصة بنظام لينكس وفي حال واجهت أي مشكلة في التعامل مع النظام ستجد الكثير من المهتمين المستدعين لمساعدتك وإرشادك، كما يمكنك طرح أي سؤال يراودك حول نظام لينكس أو أحد توزيعاته أو تطبيقاته في قسم الأسئلة والأجوبة في أكاديمية حسوب ليجيبك عليها نخبة من الخبراء والمختصين. بعد أن تتقن التعامل مع لينكس على جهاز افتراضي ستكون جاهزًا لتجربته بأمان على جهاز فعلي دون أي مشكلات، ولا تنسَ أن تطور مهاراتك وتحدث معلوماتك باستمرار وتتابع كل جديد في نظام لينكس. الخلاصة تعرفنا في مقال اليوم على نظام التشغيل لينكس وأبرز مميزاته وعيوبه، واستعرضنا الفرق بينه وبين نظام ويندوز، وأخيرًا شرحنا بإيجاز أهم الخطوات التي تساعدك على تعلم استخدامه بكفاءة وفعالية. وفي الختام تذكّر أن تعلّم استخدام نظام لينكس يعزز مهاراتك التقنية ويمكّنك من التعامل مع حاسوبك بكفاءة أعلى وينصح باستخدامه لاكتساب احترافية أعلى في التعامل مع الحاسوب وبرمجياته المختلفة. اقرأ أيضًا 10 طرق لتجربة نظام التشغيل لينكس Linux واستكشافه عرض موجز لأشهر توزيعات لينكس ما هو نظام لينكس ولماذا توجد 100 توزيعة منه؟ تثبيت لينكس مع نظام ويندوز
    2 نقاط
  16. في مقال اليوم سنوضح لك ما هي أكواد البرمجة، وما أهمية تعلمها في عالم اليوم الذي يزداد فيه تعاملنا مع الآلات والأجهزة الرقمية بشكل كبير، وتزداد معه حاجتنا إلى توجيه هذه الأجهزة وتسخيرها لتلبّي حاجاتنا ومتطلباتنا. فكل جهاز رقمي يخطر في بالك اليوم، سواء أكان حاسوبًا أم تلفازًا حديثًا أم جوالًا أم صاروخًا فضائيًّا، لا يعمل إلا بالكود البرمجي. فما هو الكود البرمجي؟ وكيف يعمل؟ وما طريقة كتابته؟ ما هو الكود البرمجي الكود code كلمةٌ إنكليزية الأصل، تطوّر معناها على مرّ العصور فقد كانت تعني في البداية كتابة القوانين، ثم أصبحت تشير إلى نظام تخاطب سري تحكم استخدامه قوانين خاصة، ثم أخيرًا تطور معناها ليصبح نظامًا أو أسلوبًا للتعبير عن المعلومات والتعليمات في صيغة يمكن للحاسوب فهمها. فالكود البرمجي فهو مجموعة من التعليمات أو نظام من القواعد المكتوبة بلغة برمجية معينة. وتستخدم أكواد البرمجة في تطوير مختلف أنواع التطبيقات، كما تستخدم في بناء أنظمة الذكاء الاصطناعي وتعلم الآلة، وبرمجة الألعاب الإلكترونية وغيرها من مجالات البرمجة المختلفة. كانت كتابة الكود البرمجي في البداية عملية صعبة ومعقدة وتعتمد على لغات برمجة منخفضة المستوى وقريبة من مستوى الجهاز أو الآلة التي يعمل عليها مثل لغة الآلة ولغة التجميع، في حين يكتب الكود البرمجي اليوم بلغات عالية المستوى وقريبة للغات البشرية المحكية مثل لغة بايثون وجافا وجافاسكربت وغيرها. بعدها يمرّ هذا الكود البرمجي بمراحل من التفسير interpretation أو التصريف compilation لينتقل من الأسلوب القريب من الفهم البشري إلى ما هو أقرب إلى العتاد الحاسوبي الذي يتعامل مع مواقع ذاكرة الحاسوب ووحدة المعالجة المركزية مباشرة ويدير العمليات فيها. ويُسمّى كود البرمجة الذي يكتبه المبرمج قبل أن يُترجَم كود المصدر أو الكود المصدري source code، وهو الذي تجري على تعليماته بعد ذلك برامج ترجمة أو تفسير لتنتج كودًا آخر بلغة الآلة يُسمّى الكود الهدف target code أو الكود المترجَم compiled code. ما معنى كود برمجي نظيف Clean Code نظافة كود البرمجة هو اصطلاح يضمّ عدة معايير ويتبع مجموعة قواعد اعتمدها مجتمع المبرمجين بوصفها مقياسًا لجودة هذا الكود. وتعلم كتابة الأكواد البرمجية النظيفة مهارة لا بدّ منها لكل مطور أو مبرمج محترف يريد أن يعمل في فريق أو شركة أو يبرمج تطبيقات مختلفة، ومن شروط الكود البرمجي النظيف نذكر: أن تكون أسماء المتحولات والدوال المستخدمة في الكود البرمجي ذات معنى ودلالة. أن تكون لكل مهمة محددة وظيفة أو دالة واحدة تنجزها. أن يحتوي على تعليقات توضح عمل الكود البرمجي وتبيّن مواضع اللبس فيه. أن يكون منظَّمًا في الصيغة والإزاحات. ألا يحتوي على تكرار لنفس الكود عدة مرات. أن يُعالج الأخطاء في حال حدوثها. أن يحتوي على اختبارات تفحص وظائفه. إليك مثالًا عن كود نظيف مكتوب بلغة بايثون لحساب مساحات الأشكال يحقق المعايير المطلوبة: import math def calculate_circle_area(radius): """ تقوم هذه الدالة بحساب مساحة دائرة معطاة نصف قطرها. الدخل: radius (float): نصف قطر الدائرة. الخرج: float: مساحة الدائرة. """ # حساب المساحة باستخدام الصيغة πr^2 area = math.pi * radius * radius return area # مثال على استخدام الدالة radius = 5 area = calculate_circle_area(radius) print("مساحة الدائرة التي نصف قطرها", radius, "=", round(area, 2)) لابد أن سنفهم بسهولة كود البرمجة السابق والهدف منه حتى لو لم تكن على دراية مسبقة بلغة البرمجة التي كتب بها، الآن قارن كود البرمجة السابق بالكود التالي غير النظيف الذي يؤدي الوظيفة نفسها: import math def func1(r): x = math.pi * r * r return x x = func1(5) print("area =", x) أنواع الكود البرمجي كما تختلف أهداف البرمجة ومقاصدها، وكما تختلف أنظمة التشغيل والأجهزة، تختلف أنواع الكود البرمجي من جهتين هما: لغة البرمجة المستخدمة لكتابة كود البرمجة. أسلوب كتابة الكود البرمجي. فلنلق نظرة على كل منهما. لغات كتابة أكواد البرمجة لكل لغة برمجة مجال تتفوق فيه على غيرها، وإن كانت معظم لغات البرمجة عالية المستوى اليوم متعددة الاستخدامات بفضل المكتبات المتعددة التي تتوفر فيها. ومن أشهر لغات البرمجة التي يمكنك كتابة أكواد برمجة باستخدامها نذكر: جافاسكريبت JavaScript: تتفوق هذه اللغة في إضافة الديناميكية إلى صفحات الويب، وإن كانت استخداماتها قد اتسعت لتشمل مجالات كثيرة، من بناء الواجهات الخلفية لتطبيقات الويب إلى بناء تطبيقات الجوال. بايثون Python: تصدّرت هذه اللغة مجال الذكاء الاصطناعي وتعلم الآلة، ولطالما جذبت هذه اللغة المبتدئين لسهولة قراءة وكتابة أكوادها البرمجية. كما تتنوع تطبيقات ومجالات لغة بايثون من بناء الواجهات الخلفية لتطبيقات الويب إلى تطبيقات الذكاء الاصطناعي وتطبيقات استخلاص المعلومات من مواقع الويب وأتمتة المهام المتكررة وغير ذلك. جافا Java: تتميز لغة البرمجة جافا بأدائها العالي ومجتمعها الواسع ودعمها للبرمجة كائنية التوجه oop. وتستخدم لغة جافا في العديد من المجالات من أبرزها بناء التطبيقات الضخمة التي تتعامل مع قواعد البيانات، كما تستخدم في بناء الواجهات الخلفية لمواقع وتطبيقات الويب. روبي Ruby: تتميز لغة روبي على غيرها من لغات البرمجة عالية المستوى بسهولة قراءة وكتابة كود البرمجة المكتوب بها. وتعد هذه اللغة من أسهل لغات البرمجة على المبتدئين وتتعدد استخداماتها من تطوير تطبيقات الويب والجوال إلى برمجة الألعاب وتحليل البيانات وحتى تطبيقات الذكاء الصنعي. جو Go: تتصدر لغة البرمجة Go المشهد في التطبيقات المتوازية التي تعتمد على مبدأ خيوط المعالجة المتوازية وتمكنك من الاستفادة من كامل قوة المعالج. وتناسب التطبيقات التي تهتم بالأداء العالي، مثل التطبيقات الشبكية والسحابية وتطوير الويب وتحليل البيانات والألعاب الإلكترونية. أساليب كتابة أكواد البرمجة تتنوع أساليب تنظيم الكود بين لغات البرمجة وبين المطورين. وقد تدعم لغة البرمجة الواحدة عدة أساليب برمجية، وقد تقتصر على أسلوب واحد. وفيما يلي نذكر أهم أساليب كتابة كود البرمجة: البرمجة كائنية التوجه OOP أو البرمجة بالكائنات هي أسلوب في كتابة أكواد البرمجة يعتمد على مفهوم الكائن object الذي يمكن أن يحتوي على بيانات أو خصائص تصفه properties وعلى توابع برمجية methods تتعامل مع هذه البيانات، وتعد البرمجة كائنية التوجه من أهم وأشهر أساليب كتابة الأكواد والشيفرات البرمجية، وهي مدعومة في عدة لغات برمجة مثل جافا وبايثون (التي تتبع برمجة كائنية التوجه قائمة على مفهوم الصنف class) وفي جافاسكريبت (التي تتبع مفهوم برمجة كائنية التوجه قائمة على مفهوم الخاصية prototype). البرمجة الإجرائية Procedural Programming: هي أسلوب في كتابة الكود البرمجي يعتمد على مفهوم الإجراءات ونعني بها سلسلة من الخطوات لإنجاز مهمة محددة وينفذها الحاسوب لدى استدعاء هذه الإجرائية. تدعم لغات بايثون وسي وجافا سكريبت وغيرها مبدأ البرمجةَ الإجرائية. البرمجة الوظيفية Functional Programming: هي نموذج برمجي يعتمد على تطبيق الدوال أو التوابع وتركيبها، وتشيع في اللغات المستعملة في الصناعة والتعليم، مثل لغة وولفرام Wolfram كما تدعمها لغة بايثون وكوتلن Kotlin وغيرها. البرمجة المنطقية Logic Programming: هي نموذج برمجي يعتمد على المنطق الصُّوَري أو الرسمي formal logic، ويُستخدم لاستنتاج قيم مجهولة بناءً على قواعد ومعارف معلومة، من أهم اللغات التي تعتمد على برمجة المنطق لغة برولوغ Prolog. برامج كتابة الكود البرمجي يعتمد المطورون على برامج تسهّل وتيسّر كتابة الكود البرمجي، منها بيئات التطوير المتكاملة IDEs ومحررات الأكواد البرمجية إذ يمكن للمبرمج استخدام كل بيئات التطوير المتكاملة والمحررات في كتابة وتحرير الأكواد البرمجية، لكن بيئات التطوير المتكاملة تتميز بدعمها لميزات أكبر مثل توفير أدوات مدمجة لتسهيل كتابة الكود وتصريفه وتشغيله وتصحيح أخطائه. ومن أشهر برامج كتابة أكواد البرمجة نذكر: فيجوال استوديو كود Visual Studio Code: أشهر وأوسع بيئات التطوير المتكاملة، تدعم مختلفة أنظمة التشغيل، ومعظم لغات البرمجة. IntelliJ IDEA: من أشهر بيئات التطوير المستعملة للغة جافا Java، ويمكن استعمالها مع لغات أخرى مثل Javascript وغيرها. PyCharm: بيئة تطوير مبنية خصيصًا لتحرير أكواد بايثون، وتدعم لغات برمجة كثيرة أخرى. NetBeans: من بيئات التطوير الشائعة والمجانية، وتدعم البرمجة بلغات جافا وجافا سكريبت و PHP و C++‎ وغيرها. خطوات كتابة أكواد البرمجة كيف إذًا تبدأ تعلم كتابة أكواد البرمجة؟ إن تعلم لغات البرمجة وفهم مبادئ الخوارزميات وأصول التفكير المنطقي هي البداية التي يجب على كل مهندس برمجيات الانطلاق منها. إليك هذه الخطوات التي تساعدك على كتابة الأكواد البرمجية: أمعن التفكير في المشكلة المطلوب حلها: لا بد من إمعان النظر في المشكلة قبل البدء بكتابة كود البرمجة، يمكنك استخدام الورقة والقلم لفهم المشكلة جيدًا وإيجاد حل منطقي لها، كما يستعمل مهندسو البرمجيات مخططات ووثائق لتحليل المتطلبات وحالات الاستخدام لتطوير البرامج والتطبيقات. قسّم المشكلة إلى مشكلات أصغر قدر الإمكان: بمعنى آخر اعتمد مبدأ فرّق تسُد، فكلما كانت الوحدات البرمجية في كودك محددة وتركز على مهمة واحدة كان الكود أعلى جودة وأفضل أداءً. حدد المدخلات والمخرجات لكود البرمجة ولكل وحداته الجزئية: تفيد هذه المعلومات في كتابة أكواد البرمجة وتسهيل مهمة صيانتها فيما بعد. حدد لغة البرمجة المناسبة لمشكلتك: هل تحتاج المشكلة إلى ذكاء صنعي وتعلم آلة؟ هل تحتاج إلى موقع ويب؟ هل تحتاج إلى تطبيق جوال أو حاسوب؟ لكل خيار من هذه الخيارات لغة برمجة هي الأمثل في نطاقه. ابدأ التطبيق العملي للحل: انتقل من التحليل والتصميم إلى التطبيق والإنجاز، وتذكّر الالتزام بقواعد كتابة الكود النظيف. اختبر أكواد البرمجة التي تكتبها: بعد كتابة الكود، اختبره بوسائل الاختبار اليدوي والبرمجي. توفّر كل لغات البرمجة أدوات لاختبار الوحدات والأنظمة والتكامل بين وحدات النظام. لا تتوقف عن صيانة وتطوير كود البرمجة: فالكود الناجح هو الكود الذي تستمر صيانته ويستمر تطويره بعد تسليم النسخة الأولى منه. لذا احرص على تطويره وإضافة المزيد من المميزات في أي كود تكتبه، وأصلح أي خلل يظهر بعد تسليمه للحصول على منتج برمجي عالي الجودة والكفاءة. توثيق أكواد البرمجة إن توثيق أكواد البرمجة هو العملية المسؤولة عن شرح كيفية عمل الكود وكيفية استخدامه، وهو أمر لا بد منه في كتابة الأكواد البرمجية حتى لو كان الكود البرمجي مكتوبًا بشكل مفهوم بالنسبة لك ولا يحتاج لشرح، فعملية التوثيق تسهّل صيانة الكود البرمجي وتساعدك أنت شخصيًا على تذكر وظيفته عند العودة له بعد فترة من الزمن، كما يسهّل الكود الموثق جيدًا التعاون بين أعضاء الفريق البرمجي ويرفع مستوى التفاهم فيما بينهم. ومن أهم عناصر توثيق كود البرمجة: كتابة التعليقات ضمن كود البرمجة: حيث تساعد التعليقات داخل الكود على توثيق الكود وزيادة وضوحه وفهم كيفية عمله وكيفية استعماله، وتعد كتابة التعليقات كما شرحنا سابقًا أحد من شروط الكود النظيف. إنشاء مستندات التوثيق: هي مستندات تشرح كيفية عمل الكود البرمجي وكيفية استخدامه والاستفادة منه ومن واجهاته مثل واجهات برمجة التطبيقات APIs، وتشرح القرارات البرمجية التي اتخذها فريق التطوير والدوافع وراءها، ويكمن أن تنشر هذه المستندات على هيئة قاعدة معرفة، أو ضمن مستودع الكود أو في ملفات مستقلة تتضمن مقتطفات من الكود البرمجي مرفقة بشرحه. لا تنسَ أن التوثيق يحتاج إلى الصيانة والمراجعة والتطوير مثل الكود تمامًا، كما يجب أن يكون مستواه مناسبًا للفئة المستهدفة. دورة علوم الحاسوب دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب اشترك الآن خاتمة بهذا نكون وصلنا إلى ختام مقالنا الذي وضحنا فيه مفهوم أكواد البرمجة. أرجو أن يكون هذا المقال قد وفّر لك ملعومات وافية حول معنى الكود البرمجي، وساعدك على معرفة أنواع أكواد البرمجة وطرق كتابتها المختلفة. وإذا كان لديك أي سؤال بخصوص ما ورد في المقال، فلا تتردد في كتابته في قسم التعليقات. اقرأ أيضًا تعلم كتابة أكواد بايثون من خلال الأمثلة العملية دليل شامل لتعلم البرمجة أساسيات البرمجة تعرف على أشهر لغات برمجة التطبيقات
    2 نقاط
  17. يعد الذكاء الاصطناعي Artificial Intelligence مجالًا حديثًا يُحدث تغييرًا في الطريقة التي نعيش ونعمل ونتفاعل بها مع العالم والتكنولوجيا. إن فهم أساسيات الذكاء الاصطناعي في هذا العصر الذي يتسم بالتطورات المذهلة والتحوّل الرقمي والتقدّم الذي يحدث بسرعة الضوء -ليس مجرد خيار؛ إنه ضرورة. يدور الذكاء الاصطناعي في جوهره حول إنشاء آلات ذكية يمكنها أداء المهام التي تتطلب عادةً الذكاء البشري. يمكن أن تكون هذه المهام متعلقة بمواضيع مثل التعرّف على الكلام وفهم اللغة البشرية وحل المشكلات وحتى التنبؤ بالأحداث المستقبلية كحالة الطقس أو حدوث الكوارث. لقد صُممت أنظمة الذكاء الاصطناعي للتعلم من البيانات، مما يسمح لها بتحسين أدائها بمرور الوقت دون الحاجة إلى برمجة صريحة. تخيل عالمًا تتمكّن فيه أجهزة الحاسب من الفهم والتعلم من الخبرات والتكيف مع المعلومات الجديدة -هذا هو جوهر الذكاء الاصطناعي. سواء كنت مهتمًا بمفهوم الآلات التي يمكنها التعلّم واتخاذ القرارات مثل البشر أو كنت مهتمًا ببساطة بالتكنولوجيا التي تعمل على تشغيل المساعدين الصوتيين والسيارات ذاتية القيادة وغيرهم الكثير، فإن هذه الرحلة إلى أساسيات الذكاء الاصطناعي مصممة خصيصًا لك. إننا نزيل فيها الغموض عن التعقيدات المحيطة بالذكاء الاصطناعي ونقسّم المفاهيم المعقدة إلى أجزاء بسيطة وسهلة. ما هو الذكاء الاصطناعي؟ الذكاء الصناعي هو فرع من فروع علوم الحاسوب يركز على إنشاء آلات ذكية قادرة على أداء المهام التي تتطلب عادةً الذكاء البشري. وتشمل هذه المهام التعلم والتفكير وحل المشكلات وفهم اللغة البشرية والتعرف على الكلام ..إلخ. يُمكّن الذكاء الصناعي في جوهره الآلات من محاكاة الوظائف المعرفيّة البشريّة. صُمّمت أنظمة الذكاء الصناعي لتحليل وتفسير البيانات المعقدة والتكيف مع البيئات المتغيرة وتحسين أدائها بمرور الوقت، كل ذلك دون تدخل بشري. إذًا الهدف من الذكاء الصناعي هو تطوير آلات يمكنها التفكير والتعلم مثل البشر وإظهار سمات مثل الإدراك والتفكير واتخاذ القرار. هناك نوعان رئيسيان من الذكاء الصناعي: الذكاء الصناعي الضيق أو الضعيف Narrow or Weak AI: تم تصميم هذا النوع من الذكاء الصناعي لأداء مهمة محددة أو نطاق ضيق من المهام. وهي تعمل في ظل مجموعة من الشروط المحددة مسبقًا وغير قادرة على تعميم معرفتها على مجالات أخرى. تشمل الأمثلة الأشهر المساعدين الافتراضيين مثل سيري Siri وأليكسا Alexa، بالإضافة إلى خوارزميات التوصية التي تستخدمها مواقع الويب مثل اليوتيوب أو الفيس بوك أو أمازون أو نصات التجارة الإلكترونية ..إلخ. الذكاء الاصطناعي العام أو القوي General or Strong AI: يشير الذكاء الاصطناعي العام إلى آلة تتمتع بالقدرة على الفهم والتعلم وتطبيق المعرفة بطريقة لا يمكن تمييزها عن الذكاء البشري. يظل هذا المستوى من الذكاء الاصطناعي نظريًا ويخضع للبحث والاستكشاف المستمر. يمكنك قراءة المزيد من التفاصيل عن أنواع الذكاء الاصطناعي هنا. تاريخ وتطور الذكاء الاصطناعي إن تاريخ الذكاء الصناعي هو رحلة مثيرة للاهتمام تمتد على مدى عدة عقود وتتميز بمعالم هامة واختراقات وتحولات نموذجية في فهمنا للآلات الذكية. نتعمق هنا في كيفية تطور الذكاء الصناعي من المفاهيم النظرية إلى التقنيات التحويلية. ولادة الذكاء الاصطناعي: الخمسينيات والستينيات تمت صياغة مصطلح "الذكاء الاصطناعي" في منتصف القرن العشرين، مما وضع الأساس لمجال جديد من الأبحاث. في تلك الفترة، اقترح علماء رائدون مثل آلان تورينج وجون مكارثي فكرة الآلات التي يمكنها محاكاة الذكاء البشري. ذهب مكارثي لتنظيم مؤتمر دارتموث في عام 1956، والذي اعتبر على نطاق واسع ولادة الذكاء الاصطناعي كنظام أكاديمي. شتاء الذكاء الاصطناعي: السبعينيات والثمانينيات خلال فترة "شتاء الذكاء الاصطناعي" التي امتدت من الستينيات حتى منتصف الثمانينيات، واجهت صناعة الذكاء الاصطناعي العديد من التحديات الرئيسية. كانت التكنولوجيا المتاحة في ذلك الوقت غير كافية لدعم تطوير الذكاء الاصطناعي بالطريقة المطلوبة، حيث كانت الحواسيب والمعالجات بطيئة وضعيفة في الأداء، مما حد من إمكانية تطوير تقنيات الذكاء الاصطناعي المتقدمة. بالإضافة إلى ذلك، كانت هناك توقعات متفائلة جدًا غير واقعية بخصوص قدرة الآلات على فهم اللغة والتعلم تلقائيًا بشكل سريع، وهو ما كان صعب المنال في ظل الوضع التكنولوجي في ذلك الوقت. كما تعثرت الكثير من المشاريع البحثية والتطويرية في هذا المجال بسبب نقص التمويل، حيث لم تكن الحكومات والشركات مستعدة للاستثمار بشكل كبير في هذا المجال بسبب عدم رؤية العائد المالي الفوري. ولم يكن هناك كمية كافية من البيانات المتاحة لتدريب النماذج الذكية بفعالية، مما قيد إمكانية تطوير النماذج الذكية. ظهور الأنظمة الخبيرة: الثمانينات لقد تحققت خلال شتاء الذكاء الاصطناعي الكثير من التطورات في مايسمى الأنظمة الخبيرة أو المتخصصة Expert systems، وهي عبارة عن برامج ذكاء اصطناعي مصممة لتقليد الخبرة البشرية في مجالات محددة. وقد وجدت هذه الأنظمة تطبيقات عديدة في مجالات مثل الطب والتمويل، مما أدى إلى تجديد الاهتمام بأبحاث الذكاء الاصطناعي. عودة التعلم الآلي: التسعينيات إلى العقد الأول من القرن الحادي والعشرين شهد أواخر القرن العشرين عودة ظهور الذكاء الصناعي مدفوعًا بالتقدم في خوارزميات التعلم الآلي. بدأ الباحثون في تطوير تقنيات تُسمى الشبكات العصبية (المستوحاة من بنية الدماغ البشري) والنماذج الإحصائية التي يمكنها التعلم من البيانات. كانت هذه الفترة بمثابة بداية التطبيقات العملية للذكاء الاصطناعي، بما في ذلك التعرّف على الكلام والتنقيب في البيانات. ثورة التعلم العميق: 2010 إلى الوقت الحاضر شهد العقد الأول من القرن الحادي والعشرين قفزة ملحوظة إلى الأمام مع ظهور تقنيات تدعى تقنيات التعلم العميق التي مكنت أنظمة الذكاء الصناعي من معالجة كميات هائلة من البيانات وحل المهام المعقدة. شهد هذا العصر اختراقات في التعرف على الصور ومعالجة اللغات الطبيعية (اللغة البشرية) والأنظمة المستقلة Autonomous systems مما أدى إلى تحوّل في الصناعات والحياة اليومية. المشهد الحالي والآفاق المستقبلية يعد الذكاء الصناعي اليوم جزءًا لا يتجزأ من مختلف القطاعات، بما في ذلك الرعاية الصحية والتمويل والنقل والترفيه والتجارة والألعاب والإعلام وكل شيء تقريبًا. يمكنك الاطلاع على مقالة مستقبل الذكاء الاصطناعي للحصول على استشرافٍ أوسع لقدرات الذكاء الصناعي الممكنة في والمستقبل. إن تاريخ الذكاء الصناعي وتطوره لا يعكس التقدم التكنولوجي فحسب، بل يعكس أيضًا مرونة العقل البشري وإبداعه. إن استمرار الذكاء الصناعي في التطور يحمل وعدًا بإحداث ثورة في الصناعات وحل التحديات العالمية وزيادة الإمكانات البشرية بطرق لم يكن من الممكن تصورها من قبل، ويمكن أن تجد مزيد من التفاصيل هنا. المفاهيم الأساسية اللازمة لتطوير أنظمة الذكاء الاصطناعي هناك العديد من المفاهيم والعناصر المرتبطة بأنظمة الذكاء الاصطناعي والتي تُمكّن الآلات من محاكاة الذكاء البشري وأداء مجموعة واسعة من المهام. تشمل هذه المفاهيم والعناصر: البيانات الضخمة البيانات هي شريان الحياة لأنظمة الذكاء الصناعي. إنها بمثابة الأساس الذي تعمل عليه خوارزميات الذكاء الصناعي. بدون البيانات لم نكن لنرى ذكاءًا صناعيًا، فنماذج الذكاء الاصطناعي كالنار والبيانات كالحطب، كلما أعطيتها بيانات توهجت أكثر. إن ثورة البيانات الضخمة Big data ليست مجرد مصطلح عصري يطرحه بائعو التقنية الذين يقترحون طرقًا مبتكرة لتخزين المعلومات وتحليلها؛ بل تعد قوة كبيرة تعيد تشكيل حياتنا اليومية. ومن المحتمل أنك صادفت هذا المصطلح في العديد من المنشورات العلمية والتجارية، وأثار فضولك لمعرفة معناه الحقيقي. من الناحية الفنية، تمثل البيانات الضخمة مجموعات بيانات ضخمة ومعقدة لدرجة أن الأساليب التقليدية التي تتضمن تخزينًا إضافيًا أو زيادة قوة الحوسبة تفشل في إدارتها. يمثل هذا المفهوم تحولًا عميقًا في كيفية تخزين البيانات ومعالجتها، مما يؤدي إلى أكثر من مجرد تقدم كمي فهو يتيح إجراء تحسينات نوعية، ليعزز قدرتنا على أداء المهام باستخدام هذه البيانات. فهم أنواع البيانات: المُهيكلة وغير المُهيكلة بينما ينظر البشر إلى البيانات بتنسيقات مختلفة، فإن أجهزة الحاسب تقوم بمعالجتها بشكل أساسي كتدفق مستمر من الواحدات والأصفار، فهي لغة الحواسيب الأساسية. ويمكن تصنيف البيانات إلى نوعين أساسيين بناءً على كيفية إنشائها واستهلاكها. البيانات المُهيكلة أو المُنظّمة Structured data، وهي ذات تنسيق واضح مع مواقع معروفة لكل جزء من المعلومات، وغالبًا ما تشبه جداول قاعدة البيانات حيث يحتوي كل عمود على أنواع بيانات محددة. تُنظّم البيانات المهيكلة بتأني وتُجمع بشكل انتقائي وتخزّن بطريقة منهجية، تمامًا مثل ترتيب الكتب في المكتبة، مما يجعل من السهل تحديد موقع بيانات محددة عند الحاجة. ومن ناحية أخرى، تتضمن البيانات غير المُهيكلة أو غير المنظّمة Unstructured data عناصر مثل الصور ومقاطع الفيديو والتسجيلات الصوتية، ويمكن أن تشمل نصًا في نموذج يتطلب وضع علامات عليه بخصائص مثل الحجم أو التاريخ أو نوع المحتوى. تفتقر البيانات غير المُهيكلة إلى بنية محددة مسبقًا، مما يجعل من الصعب تحديد بيانات محددة ضمن مجموعة بيانات، حيث يتم تمثيلها كتسلسلات من الواحدات والأصفار التي تتطلب تفسيرًا أو تصورًا بواسطة التطبيق. تمثيل المعرفة إن تمثيل المعرفة knowledge representation هو مفهوم أساسي في الذكاء الاصطناعي يركز على كيفية التقاط المعرفة حول العالم وتنظيمها بطريقة يمكن لأنظمة الحاسوب الاستفادة منها بفعالية. في أنظمة الذكاء الاصطناعي، يتضمن تمثيل المعرفة تخزين المعلومات بحيث يمكن استخدامها لاستخلاص الاستدلالات واتخاذ القرارات وحل المشكلات. الخوارزميات تلعب البيانات دورًا أساسيًّا في ثورة الذكاء الاصطناعي، وتشير التطورات الحديثة إلى أنه في بعض الحالات، يكون اختيار الحجم المناسب من البيانات له أهمية أكبر من العثور على الخوارزمية المثالية. هذا ما أوضحته ورقة بحثية هامة أجراها باحثون في مايكروسوفت Microsoft عام 2001 بانكو وبريل والمتعلقة بنماذج اللغة نماذج الذكاء الاصطناعي التي تهدف إلى معالجة النصوص وتوليدها وفهمها فقد كشفت أبحاثهما عن رؤية عميقة: عندما نهدف إلى إنشاء نموذج لغوي، لا ينبغي أن تكون الخوارزمية هي الأكثر تعقيدًا وصحة. فمن خلال غمر النموذج بمليارات الكلمات المتعلقة بسياق المشكلة، فإن أي خوارزمية، بغض النظر عن مدى تعقيدها، تبدأ في عرض أداء عالي بشكل ملحوظ. على الرغم من أنه لا غنى عن كمية كبيرة من البيانات، إلا أن وجود خوارزمية مناسبة يظل ضروريًا لاستخلاص معلومات ذات معنى. كما أن التحليل الدقيق للبيانات، والذي يتضمن سلسلة من الخطوات المنهجية، أمر ضروري لضمان التناغم بين الخوارزميات المختارة والبيانات. لا توجد طرق مختصرة؛ حتى في مجال الأتمتة الذكية، يكون للتحليل أحيانًا الأسبقية على الأتمتة. إن الآلات القادرة على التعلم المستقل وتجنب التدخل البشري تمامًا هي احتمال بعيد، وليست حقيقة حالية. دور الخوارزمية غالبًا ما يجذب الذكاء الاصطناعي انتباهنا عندما يتجلى في الأدوات التي تقدم تفاعلات مبتكرة تشبه تفاعلات الإنسان، فكر مثلًا في المساعدين الافتراضيين مثل سيري Siri وكورتانا Cortana أو الأدوات اليومية مثل أجهزة توجيه نظام تحديد المواقع العالمي GPS وأنظمة تجنب الاصطدام في المركبات والطائرات التي تدمج الذكاء الاصطناعي بشفافية دون لفت الانتباه، وذلك ببساطة لأنها أصبحت منتشرة في كل مكان وأصبحت أمرًا مفروغًا منه. هذه الظاهرة، التي صاغتها باميلا ماكوردوك بدقة "تأثير الذكاء الاصطناعي AI effect" في عام 1979، تسلط الضوء على أنه بمجرد أن تصبح أنظمة الذكاء الاصطناعي ماهرة وبارعة جدًا في مهامها، فإنها تتلاشى في الخلفية (تفقد اهتمام الجمهور والخبراء)، وتطغى التحديات الأحدث في هذا المجال على أهميتها. بمعنى آخر، بمجرد أن تصبح أنظمة الذكاء الاصطناعي شائعة وتؤدي المهام ببراعة، فإنها تصبح جزءًا طبيعيًا من بيئتنا ويختفي توهجها. ينتج عن ذلك أن يميل الناس إلى نسيان الدور الأساسي الذي تلعبه الخوارزميات الكلاسيكية في قيادة كل التقنيات الموجودة والتقليل من أهمية مساهمتها المحورية في الذكاء الاصطناعي، ويتحول الاهتمام إلى تقنيات أكثر غرابة أو التطورات الحديثة مثل التعلم الآلي والتعلم العميق. الخوارزمية في جوهرها عبارة عن مجموعة منهجية من العمليات، يتم تنفيذها عادةً بواسطة جهاز حاسب، مما يضمن حلًا نهائيًا لمشكلة ما خلال إطار زمني محدد أو يشير إلى عدم قابليتها للحل. بينما ظل البشر يحلون الخوارزميات يدويًا لعدة قرون، فإن تعقيد المشكلات الحديثة يستلزم المساعدة الحسابية. تم تصميم الخوارزميات لتبسيط هذه العملية، بهدف إيجاد حلول دقيقة وسريعة وفعالة أيضًا. تمثل هذه الخوارزميات إنجازات فكرية متأصلة في العقل البشري، وتعكس الآلات التي تعمل بالخوارزميات بشكل أساسي الذكاء المتضمن في هذه الإجراءات. إن فهم التأثير العميق للخوارزميات على الذكاء الاصطناعي أمر بالغ الأهمية، لأنه يذكرنا بأن الجوهر الحقيقي للذكاء الاصطناعي يكمن في التصميم الدقيق لهذه العمليات الأساسية وتنفيذها. النمط Pattern يشير مصطلح النمط إلى تمثيل أو تجميع البيانات بطريقة تسمح بالكشف عن تكرار السلوك أو الخصائص المشتركة. ويمكن استخدام هذا التمثيل لفهم البيانات واستخراج المعلومات والقواعد منها. على سبيل المثال، يمكن لنموذج تعلم الآلة أن يتعرف على نماذج معينة في الصور، مثل التعرف على وجوه الأشخاص لأن لها شكل وسمات مميزة. مثال آخر، يمكن لنظام يعمل بالذكاء الصناعي تصنيف رسائل البريد الإلكتروني إلى "رسائل هامة" و "رسائل غير هامة" عن طريق اكتشاف أنماط مثل الكلمات المفتاحية وهياكل الرسائل. الميزات أو السمات Features السمات عبارة عن أجزاء محددة من المعلومات ضمن البيانات التي تستخدمها الخوارزمية لإجراء تنبؤات أو قرارات. في التعرف على الصور، يمكن أن تتضمن السمات الحواف Edges أو الألوان أو الأنسجة أو قيم البكسلات أما في التنبؤ بأسعار المنازل، فيمكن أن تكون السمات هي حجم ومساحة المنزل وعدد الغرف والموقع. يعد اختيار السمات ذات الصلة أمرًا بالغ الأهمية لدقة نظام الذكاء الاصطناعي. اقرأ مقالة خوارزميات الذكاء الاصطناعي للحصول على فهم شامل. النموذج Model لحل أي مشكلة أو مهمة باستخدام الذكاء الاصطناعي، فإن الهدف الأساسي هو إنشاء نموذج باستخدام خوارزمية واحدة أو أكثر. نطوّر أداء هذا النموذج من خلال التدريب الدقيق للخوارزميات المُستخدمة. يتمثل الطموح النهائي في أن يقدم النموذج قدرات تنبؤية استثنائية، بحيث نضمن فعاليته في سيناريوهات العالم الحقيقي. على سبيل المثال، يمكن للنموذج الذي تم تدريبه على آلاف صور القطط التعرف على القطط في الصور الجديدة. النماذج هي جوهر أنظمة الذكاء الصناعي. من ناحية أخرى، يتضمن تدريب نموذج الذكاء الاصطناعي بشكل رئيسي تعريّضه لكميات كبيرة من البيانات بهدف فهم وتعلّم هذه البيانات. يتم تحقيق ذلك من خلال الخوارزميات التي يمكنها التعلّم من البيانات. تُعتبر مرحلة تدريب النموذج خطوة هامة في إنشاء أنظمة الذكاء الاصطناعي القادرة على اتخاذ القرارات الذكية الفعّالة. الأجهزة والعتاد Hardware تحدثنا في فقرة سابقة عن النكسات التاريخية التي واجهتها مساعي الذكاء الاصطناعي المبكرة بسبب عدم كفاية قدرات الأجهزة أو الموارد الحوسبية عمومًا. كان شح الموارد الحسابية كبيرًا للغاية ولم تكن قادرة على تنفيذ المهام بسرعة كافية، مما أعاق حتى العمليات البسيطة، فما بالك بالمهام المعقدة المتمثلة في تكرار الفكر البشري. تم تصوير هذا التحدي بوضوح في الفيلم الرائع "The Imitation Game"، حيث نجح آلان تورينج ببراعة في فك شفرة إنجما من خلال تحديد عبارة معينة في كل رسالة. كان نجاح تورينج يعتمد على استغلال ثغرة في طريقة مشغلي آلة إنجما، والتي لولاها لكان نجاح جهاز الحاسب الخاص به أمرًا مستحيلًا لأنه كان بطيئًا جدًا للقيام بالمهمة. يؤكد الواقع التاريخي الأكثر تعقيدًا عما صوّره الفيلم، عمق التحديات التي يواجهها تورينج. حل ما لا يمكن حله: كيف تمكن آلان تورينج وفريقه من فك شفرة اللغز؟. لحسن الحظ تم حل مشكلة الموارد الحوسبية في وقتنا هذا إلى حد جيد، مما أتاح لنا رؤية الذكاء الاصطناعي في حياتنا اليومية. عمومًا، وحتى مع وجود أجهزة متخصصة مصممة لإجراء عمليات حسابية سريعة اليوم مثل وحدات المعالجة المركزية CPUs ووحدات معالجة الرسومات GPUs ومسرعات الذكاء الاصطناعي المتخصصة مثل TPUs، فإن الآلة المصمّمة لمحاكاة الفكر البشري تواجه قيودًا تُمليها مدخلاتها ومخرجاتها، بالتالي لازالت مكونات الحواسيب لا تساعد في الارتقاء إلى مستوى تكرار تعقيد الدماغ البشري. لغات برمجة الذكاء الاصطناعي لغات برمجة الذكاء الاصطناعي هي مفتاح أساسي لتطوير تطبيقات ذكية ونظم قادرة على التعلم واتخاذ القرارات. هذه اللغات تمثل الواجهة التي تسمح للمطورين بالتفاعل مع الأنظمة الذكية وتحديد سلوكها. من بين أهم هذه اللغات تأتي لغة بايثون Python التي تُعَدُّ لغة برمجة مفتوحة المصدر وسهلة التعلم، وهي مثالية لبناء نماذج الذكاء الاصطناعي. إلى جانب بايثون تأتي لغة R التي تستخدم أساسًا في التحليل الإحصائي والتعلم الآلي. مكتبات وأطر التعلم الآلي مكتبات وأطر التعلم الآلي هي أدوات برمجية ومكتبات تسهل تطوير نماذج الذكاء الاصطناعي وتدريبها. تشمل أطر التعلم الآلي الشائعة تنسرفلو TensorFlow وباي تورش PyTorch وسايكيت-ليرن scikit-learn. واجهة المستخدم UI توفر واجهة المستخدم وسيلة للبشر للتفاعل مع أنظمة الذكاء الاصطناعي. يمكن أن تكون بسيطة مثل واجهة الدردشة النصية أو معقدة مثل روبوت يشبه الإنسان. تعد معرفة هذه العناصر والمفاهيم الأساسية أمرًا ضروريًا لفهم كيفية عمل أنظمة الذكاء الاصطناعي وكيفية تطبيقها في سيناريوهات العالم الحقيقي المختلفة. دورة الذكاء الاصطناعي احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة. اشترك الآن كيف يعمل الذكاء الاصطناعي يشمل الذكاء الاصطناعي مجموعة واسعة من التقنيات والأساليب التي تهدف إلى محاكاة الذكاء البشري في الآلات. في حين أن الذكاء الاصطناعي قد يبدو صعبًا، فإن فهم مفاهيمه الأساسية يعد خطوة أولى حاسمة في إزالة الغموض عن هذا المجال الرائع. يعمل الذكاء الاصطناعي في جوهره من خلال معالجة وتحليل كميات هائلة من البيانات لاكتشاف الأنماط وفهم العلاقات بينها. فيما يلي المفاهيم الأساسية وراء كيفية عمل الذكاء الاصطناعي: إدخال البيانات: تبدأ أنظمة الذكاء الاصطناعي بالبيانات. يمكن أن تأتي هذه البيانات في أشكال مختلفة، مثل النصوص أو الصور أو قراءات أجهزة الاستشعار. إنه بمثابة المادة الخام التي تعمل بها خوارزميات الذكاء الاصطناعي. المعالجة المسبقة للبيانات: قبل أن تتمكن خوارزميات الذكاء الاصطناعي من فهم البيانات، غالبًا ما تحتاج إلى التنظيف والإعداد. يتضمن ذلك مهام مثل إزالة الضوضاء ومعالجة القيم المفقودة وتوحيد التنسيق. الخوارزميات: خوارزميات الذكاء الاصطناعي هي التعليمات الرياضية التي تقود عمليات صنع القرار. يمكن أن تتراوح من الأنظمة البسيطة القائمة على القواعد إلى نماذج التعلم الآلي الأكثر تقدمًا. يعتمد اختيار الخوارزمية على المهمة المحددة التي يحتاج الذكاء الاصطناعي إلى تنفيذها. التدريب: في حالة التعلم الآلي، تخضع أنظمة الذكاء الاصطناعي للتدريب حيث تتعلم كيفية التعرّف على الأنماط في البيانات. الاستدلال: بعد انتهاء التدريب، تستخدم أنظمة الذكاء الاصطناعي المعرفة المكتسبة لإجراء تنبؤات أو حل المشكلات أو تقديم التوصيات. يُعرف هذا بالاستدلال وهو الطريقة الأساسية التي يتفاعل بها الذكاء الاصطناعي مع العالم الحقيقي. حلقة التقييم: في سياق الذكاء الاصطناعي، يشير "التقييم" إلى العملية التي من خلالها تتعلم أنظمة الذكاء الاصطناعي وتحسن أدائها بمرور الوقت. بعد نشر نموذج الذكاء الاصطناعي والتفاعل مع بيانات العالم الحقيقي أو المستخدمين، فإنه يتلقى تعليقات بناءً على نتائج تنبؤاته أو قراراته. تعتبر حلقة التغذية الراجعة هذه ضرورية لتحسين النموذج وتعزيز دقته وفعاليته. المخرجات: المخرجات النهائية لنظام الذكاء الاصطناعي هي النتائج أو الاستجابات التي تولدها أنظمة الذكاء الاصطناعي بعد معالجة بيانات الإدخال باستخدام الخوارزميات. وهو يمثل نتيجة التحليل أو اتخاذ القرار أو التوصية أو التنبؤ الذي يقوم به نظام الذكاء الاصطناعي بناءً على الأنماط والمعلومات التي تعلمها أثناء التدريب أو من خلال قواعده المبرمجة. يعد فهم هذه المفاهيم الأساسية أمرًا ضروريًا لأي شخص يتطلع إلى فهم طريقة عمل الذكاء الاصطناعي. هذه المبادئ الأساسية تكون بمثابة أساس متين لاستكشاف موضوعات الذكاء الاصطناعي الأكثر تقدمًا. تعلم الآلة: تقنية الذكاء الاصطناعي الأساسية يعد تعلم الآلة تقنية أساسية في مجال الذكاء الاصطناعي، حيث تُمكّن أجهزة الحاسب من التعلم من البيانات وتحسين أدائها بمرور الوقت دون أن تتم برمجتها بشكل صريح. في برمجة الحاسوب التقليدية، يكتب البشر تعليمات واضحة لجهاز الحاسب لأداء مهمة محددة. أما في التعلم الآلي يتم تصميم الخوارزميات بطريقة يمكنها التعرف على الأنماط من خلال تعريضها لكميات هائلة من البيانات، مما يسمح للنظام بالتنبؤ أو اتخاذ القرارات في الحياة الواقعية بناءً على فهمه السابق للبيانات. تتضمن عملية التعلم الآلي ثلاثة مكونات رئيسية: البيانات: يتم جمع مجموعات كبيرة من البيانات المتوافرة عبر الإنترنت بهدف تدريب النموذج عليها. الخوارزميات: تحلل خوارزميات التعلم الآلي البيانات لتحديد الأنماط والعلاقات داخلها. تم تصميم هذه الخوارزميات للتعلم من البيانات وتحسين أدائها بمرور الوقت. النماذج: بمجرد أن تتعلم الخوارزمية من البيانات، فإنها يصبح لدينا نموذج. يمكن استخدام هذا النموذج لإجراء تنبؤات أو قرارات. إن تعلم الآلة متعدد الاستخدامات بشكل لا يصدق ويستخدم في مجموعة واسعة من التطبيقات، مثل معالجة اللغة الطبيعية والتعرف على الصور وأنظمة التوصية والمركبات المستقلة، لذا فهو يلعب دورًا حاسمًا في تمكين أنظمة الذكاء الاصطناعي من التكيف وتحسين أدائها عندما تواجه بيانات جديدة، مما يجعلها التقنية الأساسية في تطوير الآلات الذكية. التطبيقات الشائعة للذكاء الاصطناعي في الحياة اليومية لقد اندمج الذكاء الاصطناعي بسلاسة في حياتنا اليومية والعملية، مما أدى إلى إحداث ثورة في مختلف الجوانب وتعزيز الكفاءة والراحة. لقد أصبحنا اليوم نرى تطبيقات لاحصر لها للذكاء الاصطناعي، وفي هذا القسم نلقي الضوء على بعض تطبيقات الذكاء الاصطناعي الشائعة. المساعدون الافتراضيون Virtual assistants يعمل المساعدون الافتراضيون المدعومين بالذكاء الاصطناعي مثل سيري Siri وأليكسا Alexa ومساعد جوجل Google Assistant على تبسيط المهام والإجابة على الأسئلة والتحكم في الأجهزة الذكية من خلال معالجة اللغة الطبيعية. ميزات الهاتف الذكي يعمل الذكاء الاصطناعي على تحسين الهواتف الذكية من خلال التعرف على الوجه للأمان وتحسين إعدادات الكاميرا للحصول على صور أفضل وتحسين تجربة المستخدم بشكل عام. تخصيص وسائل التواصل الاجتماعي تعمل خوارزميات الذكاء الاصطناعي على تحليل سلوك المستخدم وعرض محتوى مخصص وإعلانات مستهدفة. التسوق المحسّن عبر الإنترنت تستخدم منصات التجارة الإلكترونية الذكاء الاصطناعي لتوصيات المنتجات وتقديم اقتراحات مخصصة بناءً على سجل التصفح وتعزيز تجربة التسوق. خدمة العملاء المعتمدة على الذكاء الاصطناعي توفر روبوتات الدردشة Chatbots المدعومة بالذكاء الاصطناعي استجابات فورية لاستفسارات العملاء وتحسين خدمات الدعم على مواقع الويب والتطبيقات ووسائل التواصل الاجتماعي. الذكاء الاصطناعي في الرعاية الصحية من تحليل الصور الطبية إلى التحليلات التنبؤية، يساعد الذكاء الاصطناعي في تشخيص الأمراض والتنبؤ بالنتائج وتحسين خطط العلاج. أنظمة الملاحة الذكية يقوم الذكاء الاصطناعي بتحليل بيانات حركة المرور في الوقت الفعلي، وتقديم اقتراحات دقيقة للمسار، وأوقات الوصول المقدرة، والمسارات المثالية للسائقين. خدمات الترجمة اللغوية تتيح أدوات الترجمة المعتمدة على الذكاء الاصطناعي مثل Azure AI Translator على ترجمة النصوص والكلام في الوقت الفعلي، وكسر حواجز اللغة وتسهيل التواصل العالمي. الذكاء الاصطناعي في الخدمات المالية يقوم الذكاء الاصطناعي بتحليل البيانات المالية واكتشاف الاحتيال والتنبؤ باتجاهات السوق وتقديم المشورة المالية الشخصية للمستخدمين. أتمتة المنزل الذكي يعمل الذكاء الاصطناعي على تشغيل أجهزة مثل أجهزة تنظيم الحرارة وكاميرات الأمان، مما يسمح للمستخدمين بالتحكم في المنازل وأتمتتها لتحقيق كفاءة الطاقة والأمن. التعليم المخصص توفر المنصات التعليمية التي تعتمد على على الذكاء الاصطناعي تجارب تعليمية مخصصة، وتكيف الدروس بناءً على أداء الطالب الفردي وأساليب التعلم. تسلط هذه التطبيقات الضوء على التأثير المتنوع والواسع النطاق للذكاء الاصطناعي في حياتنا اليومية، مما أحدث ثورة في كيفية تفاعلنا مع التكنولوجيا وتعزيز الجوانب المختلفة لأعمالنا الروتينية. نوصي أيضًا بالاطلاع على مقالة تطبيقات الذكاء الاصطناعي، حيث نلقي نظرة شاملة على التطبيقات المختلفة للذكاء الاصطناعي. الاعتبارات الأخلاقية والتحديات في الذكاء الاصطناعي تحتل الاعتبارات والتحديات الأخلاقية في مجال الذكاء الاصطناعي صدارة المناقشات مع استمرار تقدم هذه التكنولوجيا. إن قدرة الذكاء الاصطناعي على معالجة كميات هائلة من البيانات واتخاذ القرارات تثير أسئلة أخلاقية مهمة حول الخصوصية والتحيز والمساءلة والعديد من القضايا التي نتناولها بإيجاز في هذا القسم. خصوصية البيانات وأمنها وحقوق الملكية الفكرية يعتمد الذكاء الاصطناعي بشكل كبير على البيانات. يعد ضمان خصوصية وأمن بيانات المستخدم أمرًا بالغ الأهمية لمنع سوء الاستخدام والوصول غير المصرح به. كما أن هذه الأنظمة الذكية يمكنها إعادة صياغة الأفكار والمقالات أو تقليد أساليب الكتابة ..إلخ، وهذا ما يمس مبدأ حقوق الملكية الفكرية والنشر. على سبيل المثال، بعض الكتاب بدأو بتحريك دعوات قضائية ضد شركتي "ميتا META" و "أوبن آي إيه OpenAI" بسبب أنظمة الذكاء الاصطناعي التي يطورونها. التحيز والإنصاف يمكن لخوارزميات الذكاء الاصطناعي أن تؤدي عن غير قصد إلى تبني التحيزات الموجودة في بيانات التدريب، مما يؤدي إلى نتائج غير عادلة. يعد التصدي للتحيز وضمان العدالة في أنظمة الذكاء الاصطناعي أمرًا ضروريًا لاتخاذ القرار العادل. في مقالة نشرتها صحيفة إندبندنت independent الأمريكية، بعنوان "يقول إيلون ماسك Elon Musk إنه سينشئ "TruthGPT" لمواجهة "تحيّز" الذكاء الاصطناعي"، ونقلًا عن رجل الأعمال الشهير إيلون ماسك -قالت أن إيلون ماسك يتهم ChatGPT بما اسماه "التحيز ليبرالي". الشفافية والمساءلة غالبًا ما يُنظر إلى عمليات الذكاء الاصطناعي على أنها "صناديق سوداء"، مما يجعل من الصعب فهم كيفية اتخاذ القرارات. يعد ضمان الشفافية في الخوارزميات ومحاسبة المطورين عن سلوك أنظمتهم أمرًا بالغ الأهمية. التأثير على التوظيف إحدى المشكلات الأساسية هي أتمتة المهام الروتينية، حيث يمكن لأنظمة الذكاء الاصطناعي المجهزة بخوارزميات التعلم الآلي، التعامل بكفاءة مع الوظائف المتكررة والعادية التي كان يؤديها البشر في السابق. يشكل هذا التحول تحديًا كبيرًا، وخاصة في صناعات محددة حيث أصبحت الأتمتة سائدة. لقد شهدت صناعات مثل التصنيع والنقل وخدمة العملاء الاستبدال التدريجي للعمال البشريين بآلات ذكية، وهذا ما سيؤدي إلى فقدان محتمل لبعض الوظائف. مثال على ذلك، هو أننا بدأنا نرى استبدال لخدمة العملاء ببرامج الدردشة الآلية. عمومًا، ووسط هذا التحدي، هناك فرصة لاكتساب مهارات جديدة وللتحوّل الوظيفي. على سبيل المثال لا الحصر، هناك حاجة متزايدة لقوى عاملة ماهرة في إدارة وتطوير أنظمة الذكاء الاصطناعي. كما يمكن لمبادرات برامج إعادة بناء المهارات والمسارات التعليمية أن تزوّد العمال بالخبرة اللازمة للتكيف مع سوق العمل المتطور. من الممكن أن تخفف هذه التحوّلات من الآثار السلبية للأتمتة من خلال مواءمة القوى العاملة مع متطلبات الاقتصاد والصناعة المدعومة بالذكاء الاصطناعي، وهذا يضمن قدرة الأفراد على إيجاد سبل جديدة للتوظيف في ظل هذا التقدم التكنولوجي. الاستخدام الأخلاقي في الحرب والمراقبة يتم استخدام تقنيات الذكاء الاصطناعي بشكل متزايد في التطبيقات العسكرية والمراقبة. يعد وضع مبادئ توجيهية أخلاقية لمنع إساءة الاستخدام وإلحاق الضرر بالمدنيين وانتهاكات حقوق الخصوصية مصدر قلق ملح. التعاون بين الإنسان والذكاء الاصطناعي يعد تحقيق التوازن بين أدوار البشر والذكاء الاصطناعي في عمليات صنع القرار أمرًا بالغ الأهمية. وينبغي للأطر الأخلاقية أن تعمل على تعزيز التعاون حيث يعمل الذكاء الاصطناعي على تعزيز القدرات البشرية بدلا من استبدال الحكم البشري بالكامل. العواقب طويلة المدى إن توقع وتخفيف العواقب المحتملة طويلة المدى للذكاء الاصطناعي، مثل تأثيره على المجتمع والبيئة والعلاقات الإنسانية، يتطلب دراسة أخلاقية متأنية لضمان مستقبل إيجابي للبشرية. المعايير واللوائح العالمية إن تطوير المعايير واللوائح الدولية أمر ضروري لضمان تطوير تكنولوجيات الذكاء الاصطناعي ونشرها واستخدامها بشكل أخلاقي عبر الحدود، وتعزيز الابتكار المسؤول وتقليل المخاطر. خاتمة وفي ختام مقالة أساسيات الذكاء الاصطناعي، فإن الخوض في عالم الذكاء الاصطناعي قد سمح لنا بإزالة الغموض عن التكنولوجيا التي تشكل حاضرنا ومستقبلنا. خلال هذا الاستكشاف، تعلمنا المفاهيم الأساسية وراء الذكاء الاصطناعي، وتتبعنا أصوله وفهمنا أنواعه المختلفة. لقد كشفنا عن الأعمال الداخلية لأنظمة الذكاء الاصطناعي، وكشفنا عن مفاهيم التعلم الآلي والخوارزميات التي كانت تعتبر في السابق ألغازًا غامضة. ومن خلال استكشاف تطبيقات الحياة الواقعية، شهدنا كيف يتم دمج الذكاء الاصطناعي بسلاسة في حياتنا اليومية، مما يؤدي إلى إحداث ثورة في الصناعات وتعزيز تجاربنا. ومع ذلك، سلطت هذه الرحلة الضوء أيضًا على الاعتبارات الأخلاقية المحيطة بالذكاء الاصطناعي، وحثّتنا على التفكير في التطوير المسؤول لهذه الأداة. تطرّقنا أيضًا إلى التحديات والقيود التي يواجهها الذكاء الاصطناعي، مع التأكيد على أهمية البحث والابتكار المستمر للتغلب على هذه العقبات. في هذا العصر الذي يتسم بالتقدم التقني السريع، فإن تبني أساسيات الذكاء الاصطناعي يمكّننا من المشاركة في المناقشات واتخاذ قرارات مستنيرة والاستفادة من فوائد هذه التكنولوجيا التحويلية. ومن خلال تعزيز فهم أعمق للذكاء الاصطناعي بين الأفراد الذين ليس لديهم معرفة مسبقة، فإننا نمهد الطريق لمجتمع أكثر شمولاً واستنارة. اقرأ أيضًا تعلم الذكاء الاصطناعي خوارزميات الذكاء الاصطناعي أهمية الذكاء الاصطناعي برمجة الذكاء الاصطناعي مقدمة إلى الذكاء الاصطناعي التوليدي دليل استخدام ChatGPT API لتحسين خدماتك عبر الإنترنت بناء مساعد شخصي من خلال ربط واجهة OpenAI API مع Node.js
    2 نقاط
  18. مع اقتراب الربع الأول من القرن الواحد والعشرين من نهايته، تتضح أهمية تعلم لغات البرمجة والتقنيات عمومًا لمختلف الأفراد أكثر فأكثر. فعالمُنا يزداد اعتمادًا على الحواسيب والروبوتات والأجهزة الذكية ويستخدمها في شتّى المجالات والقطاعات، من البحث العلمي والأكاديمي إلى الصناعة والترفيه والصحة وغيرها. وبالتالي أصبح تعلم لغات البرمجة ضرورة ملحة لكلّ إنسان يرغب في مواكبة مقتضيات العصر الرقمي ويرغب بأن يعزز موقعه الوظيفي ويزيد من مهاراته في حل المشكلات. فإذا كنت مهتمًا بتعلم لغات البرمجة لكنك لا تعرف من أين تبدأ، إليك هذا المقال! ما هي لغات البرمجة؟ بدايةً، لنتعرّف على معنى لغة البرمجة، ولماذا سُمّيت لغة أصلًا؟ تُعَدّ لغات البرمجة أدوات يُخاطب بها المبرمج جهاز الحاسوب أو أي جهاز قابل للبرمجة، ويوجهه إلى إجراء عمليات معينة. وتتميز كل لغة برمجة بقواعد تحكم صياغتها شأنها شأن الغات البشرية الطبيعية، فإذا خرج المبرمج عن هذه القواعد، سيتعذّر على الحاسوب فهم البرنامج أو تنفيذه على النحو المطلوب. وقد نشأت لغات البرمجة الأولى في أواسط القرن العشرين وكانت أول لغة برمجة متاحة تجاريًا هي لغة فورتران FORTRAN، وكانت لغات البرمجة في بداية عهدها صعبة ومقعدة وأقرَب إلى لغة الآلة وعتاد الحاسوب منها إلى اللغات البشرية. لكن مع تطوّر مستويات لغات البرمجة عبر العقود، نشأت لغات البرمجة عالية المستوى، وهي أسهل فهمًا وأقرب إلى اللغات الطبيعية. وسهّل انتشار هذه اللغات تعلّم البرمجة على غير المختصين في الحواسيب. لكن، لماذا قد يتعلّم المرء البرمجة أصلًا؟ فوائد تعلم لغات البرمجة قبل الشروع في أسماء وأنواع لغات البرمجة واستخدامات كل منها، يحسُن بنا ذكر فوائد تعلم لغات البرمجة. فإذا كان الإنسان مديرًا أو موظفًا أو مالك متجر، فهل يمكن أن ينفعه تعلم البرمجة؟ وحتّى إن كان مصمم مواقع ويب أو صانع ألعاب إلكترونية مثلًا، ألا يمكنه الاعتماد على الأدوات الجاهزة الميسَّرة التي تمكنه من إنجاز عمله دون الحاجة إلى تعلم لغات البرمجة؟ في الواقع إن علمك بلغات البرمجة وتعلمك لها ورقة رابحة في يدك وسيعود عليك بالعديد من الفوائد، سواءٌ أكنت مبرمجًا أم غير ذلك، ومن أبرز هذه الفوائد ما يلي: تسهّل لغات البرمجة أتمتة الأعمال وتوفر الوقت. تتيح لك البرمجة بناء أشياء قيّمة تزيد من دخلك. تعزز معرفة لغات البرمجة فرص توظيفك. تمكنك لغات البرمجة من محو أميتك الرقمية والتآلف مع التطور التقني. لنناقش كل نقطة من النقاط الواردة أعلاه بمزيد من التفصيل. 1. تسهّل لغات البرمجة أتمتة الأعمال وتوفر الوقت تخيّل أن تستطيع أتمتة عمل 10 ساعات في ساعة واحدة! يدور جزء كبير من علوم الحاسوب على الخوارزميات التي تساعد على تحقيق أكبر قدر من العمل بأقل قدر من الوقت والجهد. تساعدك هذه الخوارزميات (حتى وإن لم تكن مبرمجًا) على حل كثيرٍ من مشكلاتك على نحو أمثلي. 2. تتيح لك البرمجة بناء أشياء قيّمة تزيد من دخلك لا يكاد يخلو مشروعٌ من المشاريع الصغيرة أو الكبيرة من الحاجة إلى برنامج محلي، أو موقع إلكتروني على الويب، أو تطبيق جوال يسهّل العمل أو يزيد شهرة المشروع أو يعزّز تجربة المستخدم. إن قدرتك على بناء حلول تعزز مشروعك الخاص أو مشاريع من هم حولك قد تكون فرصة لك وللمشروع للانطلاق إلى مستقبل باهر. 3. تعزز معرفة لغات البرمجة فرص توظيفك حسب موقع جِتنُكس إن أكثر من 58% من فرص العمل في الصناعات الرقمية يتطلب وجود مهارة في البرمجة لدى المتقدمين. كما أن الطلب على وظائف البرمجة قد ازداد بمعدل أسرع بـ50% من ازدياد الطلب على الوظائف الأخرى بالعموم في العقد الماضي ولعل هذه النسب المرتفعة تكفي لوحدها لإقناعك بأن مستقبل الوظائف المختلفة سترجح لكفة من يهتم بتعلم لغات البرمجة ويوليها الاهتمام الكافي. 4. تمكنك لغات البرمجة من محو أميتك الرقمية والتآلف مع التطور التقني ففي عصرنا الحالي لم تعد الأمية هي أمية القراءة والكتابة والحساب، بل يعد أي شخص غير قادر على التعامل مع التقنيات الرقمية والحواسيب والهواتف الذكية ومنصات الإنترنت أميًّا، ومن هنا تبرز أهمية تعلم لغات البرمجة فهي توسع مداركك وتعزز قدرتك على التخاطب مع الأجهزة الذكية والمختلفة واستخدامها بكفاءة. كيف أختار لغة البرمجة المناسبة لي؟ إن تعلّم لغات البرمجة بالترتيب (من الأسهل إلى الأصعب، أو من الأقرَب إلى منطق الحاسوب إلى الأبعد عنه) هو الطريقة المثالية للبدء إذا لم يكن لديك هدف محدد لتعلم البرمجة وكنت تود فقط تعزيز مهاراتك في التفكير وحل المشكلات. لكن من الأفضل أن يعرف المرء أولًا لماذا يتعلّم لغات البرمجة؟ وما نوع التطبيقات التي ينوي تطويرها من التعلم إذ تختلف أهداف الناس عندما يقررون تعلم لغات البرمجة وتتنوع بين: برمجة المواقع الإلكترونية. برمجة تطبيقات الجوال. تعلم الذكاء الصنعي وتحليل البيانات. برمجة الألعاب. فلنتعرّف على لغات البرمجة المناسبة لكل مجال من هذه المجالات. برمجة المواقع الإلكترونية إذا كان شغفك في بناء المواقع الإلكترونية، فلا بدّ لك من البدء بتقنيات الويب. أهم لغات البرمجة المناسبة لتطوير المواقع الإلكترونية: HTML: وهي اللغة التي تُعنى بمحتوى صفحات الويب من نصوص وصور وروابط. CSS: وهي اللغة المعنية بتنسيق صفحات الويب تلوينًا وتحريكًا وتحجيمًا… إلخ. JavaScript: وهي اللغة المعنية بإضافة التفاعلية والديناميكية إلى صفحات الويب. من أهم مزايا تقنيات الويب هي ميزة تعدّد المنصّات cross-platform، أي إمكانية استخدامها لبناء تطبيقات في مختلف المنصّات. وباستخدام أطر عمل تطوير الويب الحديثة، يستطيع مبرمج الويب بناء مختلف أنواع التطبيقات سواء برمجة مواقع وتطبيقات الويب، أو تطبيقات سطح المكتب أو تطبيقات لأجهزة الجوال (أندرويد وآيفون) برمجة تطبيقات الجوال لقد أصبحت برمجة تطبيقات الجوال مجالًا من أهم مجالات تقانة المعلومات. تتنوع منهجيات برمجة تطبيقات الجوال بين الأصيل والهجين ومتعدد المنصات والتقدمي. إليك أهم لغات البرمجة في مجال تطبيقات الجوال: لغة Kotlin لتطبيقات الأندرويد الأصيلة. لغة Swift لتطبيقات iOS الأصيلة. تقنيات الويب للتطبيقات الهجينة والتقدمية. إطار Flutter أو React Native، أو NativeScript للتطبيقات متعددة المنصات. تعلم الذكاء الصنعي وتحليل البيانات مع صعود نجم الذكاء الصنعي، وازدياد الحاجة إلى تحليل البيانات الضخمة، برزت أهمية لغة بايثون Python في هذا المجال. لذا يعدّ تعلم لغة البرمجة بايثون من أول الخيارات التي ستتبادر للذهن عند الرغبة في تعلم لغات البرمجة من أجل التخصص في تطوير تطبيقات الذكاء الاصطناعي. إذ تمتاز لغة بايثون بسهولة قواعدها وسهولة فهم أكوادها، وهي في الوقت نفسه مدعومة بكثير من المكتبات التي توسّع إمكاناتها إلى مختلف المجالات. وقد أثبتت بايثون قدرتها العالية كلغة لبرمجة الذكاء الصنعي وتحليل البيانات، دون أن تنقص من قيمتها في مجالات أخرى، مثل تطوير الواجهات الخلفية لتطبيقات الويب، أو حتى بناء بوتات تلغرام أو غير ذلك. تعد سهولة تعلم لغة البرمجة بايثون، إلى جانب توفر كثير من المكتبات التي تسهّل بناء مختلف التطبيقات باستخدامها، من أهم مزاياها التي تشجّع المبتدئين على اختيارها. فإذا كنت مهتمًّا بالذكاء الصنعي وتحليل البيانات، فلغة البرمجة بايثون هي خيارك الأول. دورة الذكاء الاصطناعي احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة. اشترك الآن برمجة الألعاب يتجه كثير من الراغبين في تعلم البرمجة إلى تعلم صناعة الألعاب الإلكترونية فهو مجال مربح وممتع بذات الوقت. تتنوع الخيارات أمام عشاق برمجة الألعاب، إذ تتوفر العديد من لغات برمجة الألعاب ومحركات الألعاب التي تسهل عمل مبرمجي الألعاب. لكن الخيار الأول إذا أردت تعلم برمجة الألعاب ثلاثية الأبعاد هو لغة ++C، إذ تعد هذه اللغة البداية التقليدية في رحلة تعلم البرمجة، كما تُدرّسها كثير من الجامعات في السنوات الأولى. ومن أشهر محركات الألعاب التي تستخدم لغة ++C نذكر: محرك الألعاب Unity. محرك الألعاب Unreal Engine. أما إذا أردت بناء ألعاب أقرب إلى البساطة، فلك أن تبدأ تعلم لغات البرمجة الآتية: لغة #C أو GDScript (محرك الألعاب Godot) جافاسكريبت (إطار Phaser). بايثون (إطار Pyxel). كيفية تعلم لغة البرمجة التي اخترتها بعد أن تختار لغة البرمجة المناسبة لك، لا شكّ أنك تتساءل عن طرف الخيط. كيف تبدأ تعلم لغة البرمجة التي اخترتها؟قد تختلف طرائق تعلم لغات البرمجة في تفاصيلها، ولكنها تتبع بالعموم قواعد معينة: تعلم الخوارزميات وأسس التفكير المنطقي وحل المشكلات. تعلم مبادئ وأساسيات لغات البرمجة. لا تشتت نفسك بمصادر منوعة لتعلم لغات البرمجة واكتفَ بمصادر حديثة وموثوقة. انضم للمجتمعات البرمجية مثل مجتمع حسوب io وشارك تجاربك مع خبراء في لغات البرمجة المختلفة. ابدأ بتطوير مشاريع برمجية بسيطة تناسب المبتدئين، ثم تقدم شيئًا فشيئًا. احرص على بناء معرض أعمال قوي يعكس خبراتك في لغات البرمجة التي تعلمتها. ابحث عن فرصة عمل في الشركات ومواقع العمل الحر فالمشاريع الفعلية كفيلة بتعزيز تعلمك للغات البرمجة والوصول للاحتراف. لا تتوقف عن التعلم وتطوير نفسك فالبرمجة تتطور وتتغير باستمرار وعليك الاطلاع على كل جديد كي تبقى في الصدارة. أهم مصادر تعلم لغات البرمجة بالعربية إن كنت قلقًا من إمكانية تعلم لغة البرمجة بالعربية، فلا عليك. لقد تطور المحتوى التعليمي البرمجي العربي في السنوات الأخيرة تطورًا ملحوظًا، وصار من السهولة بمكان تعلم أي لغة برمجة باللغة العربية. ويعود هذا الفضل إلى جهود كثير من منشئي المحتوى على اليوتيوب، إلى جانب المؤسسات التعليمية مثل أكاديمية حسوب التي تعد اليوم أكبر منصة تعليمية لتعلم البرمجة في الوطن العربي، والتي تقدم الكثير من دروس البرمجة عالية الجودة بأسلوب شيق وعملي. حيث توفر أكاديمية حسوب عدة كتب برمجة عربية ومقالات برمجة مجانية لتعلم لغات البرمجة المختلفة.ومن الكتب المناسبة للمبتدئين كتاب تعلم البرمجة للمبتدئين الذي يُطلع القارئ على أنواع البيانات الأساسية وأنواع لغات البرمجة ومكونات التدفق المنطقي، ثم ينتقل إلى بناء تطبيقات للتعامل مع قواعد البيانات، وبناء الواجهات الرسومية وغير ذلك من المهام البرمجية التي تنفع في بناء شتى أنواع التطبيقات، ومن الكتب الأخرى المناسبة للمبتدئين كتاب البرمجة بلغة بايثون الذي يعدّ منطلقًا إلى عالم البرمجة بهذه اللغة القوية التي تعد واحدة من أقوى لغات البرمجة والتي تصلح للعديد من المجالات. كما تقدم أكاديمية حسوب أيضًا عدة دورات مدفوعة للمبتدئين في عالم لغات البرمجة، منها دورة علوم الحاسوب وهي مدخل مناسب إلى الحاسوب وعلومه والخوارزميات وأنظمة التشغيل وقواعد البيانات وغير ذلك. أما الدورات المتخصصة بلغة برمجة بعينها فمنها: دورة تطوير التطبيقات باستخدام لغة Python دورة تطوير التطبيقات باستخدام لغة JavaScript دورة تطوير تطبيقات الويب باستخدام لغة PHP دورة تطوير تطبيقات الويب باستخدام لغة Ruby خاتمة إن تعلم لغات البرمجة رحلة وممتعة، فإذا كنت قد عزمت البدء فيها، فأتمنى لك التوفيق، وأرجو أن يكون هذا المقال دليلًا صغيرًا ينفعك في أول محطات رحلتك. وإذا واجهتك عقبة في رحلة تعلم أي لغة برمجة، فلا تيأس، جرّب وحاول حتى تتعلّم. وإذا وجدت صعوبة في اختيار لغة البرمجة المناسبة لك أو كيفية تعلمها، فلك أن تطرح مشكلتك في قسم التعليقات أسفل المقال. اقرأ أيضًا أسهل لغات البرمجة دليلك إلى أنواع لغات البرمجة لغات برمجة الذكاء الاصطناعي الدليل الشامل لتعلم البرمجة خطوات برمجة تطبيق للمبتدئين برمجة الذكاء الاصطناعي تعرف على وظائف البرمجة الأكثر طلبًا
    2 نقاط
  19. في عالمنا المتغير بسرعة، يعد الذكاء الاصطناعي أحد أكثر التكنولوجيات انتشارًا وتأثيرًا في حياتنا. فالذكاء الاصطناعي يُعدّ من أكثر التطورات المثيرة والمهمة في عصرنا، إذ يوفر فرصًا جديدة لتطوير حياتنا وأعمالنا بطرق لم نكن نتخيلها من قبل. ومن بين تطبيقات الذكاء الاصطناعي، تأتي العديد من التطبيقات المميزة، مثل التعرف على الصوت والصور والترجمة الفورية، وحتى الروبوتات التي تستطيع العمل بدلاً من الإنسان في بعض المهام. فالذكاء الاصطناعي يوفر العديد من المزايا والفرص لتحسين حياتنا وأعمالنا بشكل كبير. وبالنظر إلى الذكاء الاصطناعي في نطاق الشركات، فهو يتيح لها الفرصة للتحسين من كفاءة عملياتها وتقليل الأخطاء، إلى جانب توفير تحليلات وإحصاءات دقيقة عن البيانات المخزنة والمعالجة. ومن بين أفضل التطبيقات على الذكاء الاصطناعي هي تطبيقات معالجة اللغات الطبيعية و التي انبثقت منها أدوات مثل ChatGPT التي تتيح للمستخدمين التفاعل مع النظام والحصول على إجابات دقيقة وفعالة عن الأسئلة المختلفة التي تتعلق بالمواضيع المختلفة. ChatGPT المقدم من openAI هو مثالٌ على كيف يمكن للذكاء الاصطناعي أن يساعد في التواصل بين الناس، فهو يوفر فرصة للتفاعل الفعال والدقيق بين المستخدمين والنظام. وبفضل تقنيات الذكاء الاصطناعي الحديثة، يستطيع ChatGPT التعرف على مواضيع وأسئلة مختلفة وتقديم إجابات دقيقة ومفيد ما هي OpenAI API هل تريد تطوير تطبيقات وأدوات تعتمد على تقنيات الذكاء الاصطناعي بسهولة وبدون الحاجة إلى دراسة عميقة في هذا المجال؟ هذا بالضبط ما يوفره OpenAI API، حيث يمكن للمطورين الاستفادة من الأدوات المتطورة لتطوير التطبيقات التي تستند إلى الذكاء الاصطناعي. يعد OpenAI API من أكثر الواجهات البرمجية شيوعًا في مجال الذكاء الاصطناعي، حيث يوفر للمطورين الوصول إلى النماذج الأكثر تطورًا للتعلم الآلي والتي تدعم العديد من التطبيقات والأدوات. فباستخدام هذه الواجهة البرمجية، يمكن للمطورين إنشاء تطبيقات متطورة تعتمد على الذكاء الاصطناعي في مجالات مختلفة مثل التسويق والتعليم والصحة والإدارة والمالية وغيرها. ومن بين أهم التطبيقات التي يمكن استخدام OpenAI API فيها هي التحدث مع الآلة والتعرف على الصور والنصوص والتحكم في الأجهزة الذكية. كما يمكن استخدامها في مجالات مختلفة مثل الروبوتات والألعاب والتصميم والترجمة والعديد من التطبيقات الأخرى. وبفضل تقنياتها المتطورة، تمكّن OpenAI API المستخدمين من الوصول إلى أدوات ونماذج التعلم الآلي الأكثر تطورًا، مما يجعلها خيارًا جيدًا للمطورين الذين يبحثون عن الحلول الفعالة لتطوير التطبيقات التي تعتمد على الذكاء الاصطناعي. نتعلم في هذا المقال كيفية الاستفادة من واجهة OpenAI API والاتصال بخدمة ChatGPT واستعمالها في تطبيق عملي بسيط، ويمكنك أنت بعد ذلك استعمالها في أي تطبيق تريده. فكرة المشروع ومتطلباته في هذا المقال، سنستكشف كيفية إنشاء مساعد شخصي باستخدام ChatGPT API بطريقة فعالة ومبتكرة، وكيفية تخصيص تجربة المستخدم لتلبية احتياجاتهم الفردية، سنتحدث أيضًا عن أهمية هذه التقنية في عالمنا الرقمي الحديث، وكيف يمكن أن يكون بناء مساعد شخصي باستخدام ChatGPT API استثمارًا قيماً و لكن قبل الشروع في التنفيذ علينا أن نلقي نظرة خاطفة على التقنيات المستخدمة لربط ChatGpt برمجيًا باستخدام Node.js. المتطلبات المسبقة لبناء المشروع: تثبيت بيئة Nodejs: لمن لا يعرفها، هي بيئة تشغيل JavaScript خارج المتصفح. إطار العمل Express.js: لتطوير تطبيقات الويب باستخدام Node.js، وارجع إلى مقال إعداد بيئة تطوير Node مع Express من أجل تثبيته مع Node.js. واجهة OpenAI API: توفر خدمات وأدوات للمطورين لإنشاء تطبيقات وأنظمة تعتمد على تقنيات الذكاء الاصطناعي. وتشمل خدمات OpenAI API العديد من الأدوات والتقنيات مثل GPT-3 وDALL-E ومنصة الاستكشاف للتحليلات اللغوية وتطبيقات الروبوتات والعديد من الخدمات الأخرى. الآن سنقوم بكتابة الكود البرمجي خطوة بخطوة، بدءًا من إعداد بيانات الواجهة API وصولاً إلى بناء بوت دردشة يمكنه فهم استفسارات المستخدمين والرد عليها بلغة طبيعية. تهيئة المشروع ننشئ مجلدًا جديدًا عن طريق إدخال التعليمات التالية في الطرفية terminal ونطلق عليه اسم خاص بالمشروع: $ mkdir chatgpt-api-bot $ cd chatgpt-api-bot ننشئ ملف package.json عبر الأمر التالي: $ npm init -y نضيف الحزم التالية: openai: توفر مكتبة OpenAI Node.js وصولاً إلى واجهة OpenAI API من تطبيقات Node.js readline-sync: توفر قراءة متزامنة إدخالات المستخدم من سطر الأوامر Dotenv: تسمح لنا بادارة المتغيرات في الملف ‎.env داخل بيئة المشروع إطار العمل Expressjs body-parser: تسمح لك بمعالجة الطلبات بتنسيقات مختلفة مثل JSON و XML. $ npm i openai@4.20.0 readline-sync@1.4.10 dotenv@16.3.1 express@4.18.2 body-parser إنشاء مفتاح api من OpenAI لكي نتمكن من استخدام واجهة OpenAI API داخل تطبيق Node.js، نحتاج أولاً إلى إنشاء مفتاح API من لوحة تحكم OpenAI. لإنشاء المفتاح، نتحتاج إلى إنشاء حساب مستخدم على https://openai.com والوصول إلى قسم مفاتيح واجهة برمجة التطبيقات في لوحة تحكم OpenAI ثم إنشاء مفتاح جديد. هذا المفتاح سري ويجب ألا يتم مشاركته مع أي شخص آخر، سنحتاج إلى استخدام هذا المفتاح لاحقًا عند تنفيذ برنامج Node.js للوصول إلى OpenAI API. نضيف هذا المفتاح إلى متغير البيئة في المشروع الخاص بنا، حيث ننشئ ملفًا جديدًا: touch .env نضيف في هذا الملف المتغير OPENAI_API_KEY ونسند له قيمة المفتاح api الذي نسخناه للتو: OPENAI_API_KEY="YOUR OPEN AI API KEY" بناء الواجهة الخلفية backEnd الخاص بالمشروع ننشئ ملف المشروع و ليكن اسمه index.js: $ touch index.js داخل ملف index.js نبدأ في كتابة الكود ونقوم أولا باستدعاء الحزم التي قمنا بتحميلها داخل المشروع: const express = require("express"); const bodyParser = require("body-parser"); const OpenAI = require("openai"); require("dotenv").config(); Configuration و OpenAIApi هي كائنات من حزمة OpenAI، والتي تستخدم للاتصال بواجهة OpenAI API واستخدامها dotenv لتحميل متغيرات بيئة المشروع من ملف ‎.env ننشئ بعد ذلك خادم المشروع عبر Express: const app = express(); const port = 3000; app.listen(port, () => { console.log(`Server is listening on port ${port}`); }); بناء كود الربط بين openAI api والتطبيق نضبط مكتبة openai بتمرير قيمة المفتاح الموجود في ملف بيئة المشروع: const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY, }); ننشئ الآن مصفوفة فارغة لتخزين سجل المحادثة ضمنها والتي من شأنها توفير سياق المحادثة للذكاء الاصطناعي لتوليد الإجابات المناسبة: const history = []; ننشئ مصفوفة للرسائل ثم نستخدم حلقة for لتكرار سجل المحادثة وإنشاء قائمة بالرسائل بالتنسيق المناسب لبوت الدردشة ChatGPT الخاص بـ OpenAI. و إعطاء كل رسالة دور role (إما "مستخدم" أو "مساعد ") والمحتوى (نص الرسالة)، ولمزيد من التفصيل يمكن الإطلاع على صفحة Text generation models من openAI. نضيف بعد ذلك مدخلات المستخدم user_input ودوره الحالي إلى نهاية مصفوفة الرسائل: const messages = []; for (const [input_text, completion_text] of history) { messages.push({ role: "user", content: input_text }); messages.push({ role: "assistant", content: completion_text }); } messages.push({ role: "user", content: user_input }); الآن نستخدم openai.createChatCompletion لتوليد رد من OpenAI API وندخل معامل نموذج الذكاء الاصطناعي الخاص بتوليد الرد وهو نموذج gpt-3.5-turbo: const completion = await openai.createChatCompletion({ model: "gpt-3.5-turbo", messages: messages, }); يوجد أكثر من معامل ويمكنك زيارة صفحة models لمعرفة المعاملات المتوفرة واختلافها ومعامل الرسائل messages أيضًا. نستخدم بعد ذلك التابع createChatCompletion لتوليد الاجابة من خلال الواجهة openAi API، ويتم استخراج الاستجابة التي تم إنشاؤها من نموذج ذكاء اصطناعي AI من الكائن completion ونخزنها في المتغير completion_text، ثم نطبع الاجابة في الطرفية. const completion_text = completion.choices[0].message.content; console.log(completion_text); ندخل البيانات التالية إلى مصفوفة سجل المحادثة: النص الحالي الذي أدخله المستخدم user_input والرد الذي تم إنشاؤه من قبل نموذج الذكاء الاصطناعي completion_text: history.push([user_input, completion_text]); ثم نعالج الأخطاء التي يمكن أن تحدث أثناء تنفيذ الطلب بطباعة كود الخطأ ومعلومات عن الخطأ عن طريق استخدام try/catch في JavaScript: try{ // code here } catch (error) { if (error.response) { console.log(error.response.status); console.log(error.response.data); } else { console.log(error.message); } } ما هي عمليات CRUD؟ عمليات CRUD هي اختصار للعمليات الأربعة الأساسية التي يتم استخدامها في إدارة البيانات وهي الإنشاء Create والقراءة Read والتحديث Update والحذف Delete، ويتم استخدام هذه العمليات في العادة في تطوير تطبيقات الويب والبرمجيات المختلفة التي تتعامل مع قواعد البيانات. ويوفر إطار العمل Express وظائف مختلفة لتسهيل عمليات الإنشاء والقراءة والتحديث والحذف والتي تتماشى مع عمليات CRUD. على سبيل المثال، يوفر Express وظائف لمعالجة طلبات http مثل: app.post()‎ للإنشاء app.get()‎ للقراءة app.put()‎ للتحديث app.delete()‎ للحذف ويمكن استخدام هذه الوظائف لتنفيذ عمليات CRUD بسهولة في تطبيقات Express، مما يساعد في إدارة البيانات بشكل فعال. بناء نقاط الوصول الخاصة بالمشروع سنستخدم في مشروعنا عمليتين فقط لإدارة البيانات وهما عملية الإنشاء وعملية القراءة حاليًا. نقوم بقراءة ملف index.html الذي سننشئه لاحقًا لعرض الواجهة الأمامية للتطبيق: // Serve the index.html file app.get('/', (req, res) => { res.sendFile(__dirname + '/index.html'); }); لمعالجة الرسائل القادمة من المستخدم نستخدم app.post ونقوم بكتابة كود الربط بين واجهة openAi APi والتطبيق داخل الدالة ونضيف الاستجابة اللي سوف تعود لنا من openAi APi: … app.post('/message', async (req, res) => { const message = req.body.message; // If there is a previous message, include it in the prompt const user_input = history.length > 0 ? `سجل المحادثة:\n${history.join('\n')}\nأنت: ${message}\n` : `أنت: ${message}\n`; const messages = []; for (const [input_text, completion_text] of history) { messages.push({ role: "user", content: input_text }); messages.push({ role: "assistant", content: completion_text }); } messages.push({ role: "user", content: user_input }); try { const completion = await openai.chat.completions.create({ model: "gpt-3.5-turbo", messages: messages, }); const completion_text = completion.choices[0].message.content; console.log(completion_text); history.push([user_input, completion_text]); res.json({ message: completion_text }); } catch (error) { if (error.response) { console.log(error.response.status); console.log(error.response.data); res.status(500).json({ error: 'Something went wrong' }); } else { console.log(error.message); res.status(500).json({ error: 'Something went wrong' }); } } }); لاحظ أننا قمنا بتخزين الرسائل القادمة من طلب http المرسل من المستخدم داخل المتغير message: message = req.body.message; وأعدنا الاستجابة التي نحصل عليها عبر: res.json({ message: completion_text }); انتهينا الآن من بناء الواجهة الخلفية للتطبيق وهي جاهزة للعمل، وكخطوة إضافية تُطلب عادة في اختبار الواجهات الخلفية، يمكنك تجربة نقاط الوصول عبر تطبيق postman أو Insomnia والتأكد من أن كل شيء يعمل بشكل صحيح. بناء الواجهة التفاعلية للتطبيق سنبدأ الآن بناء الواجهة الأمامية للتطبيق وهي صفحة HTML بسيطة تمكن من التفاعل مع خدمة ChatGPT ورؤية النتيجة مباشرةً. إنشاء الصفحة الرئيسية ننشئ ملف index.html الذي يمثل واجهة التطبيق الذي نعمل على بنائه: $ touch index.html نضيف كود HTML الأساسي ونضع ضمن وسم title عنوان الصفحة ولتكن دردش مع البوت chatbot: <!DOCTYPE html> <html lang="ar" dir="rtl"> <head> <title>دردش مع البوت chatbot</title> </head> <body> </body> </html> الآن نكتب كود الصفحة داخل وسم body: <div id="container"> <h1>دردش مع البوت chatbot</h1> <div id="conversation"></div> <form> <input type="text" id="message" placeholder="اكتب رسالتك هنا" /> <button type="submit">إرسال</button> </form> </div> هنا قمنا بإضافة عنوان يظهر بأعلى الصفحة واستمارة form تحوي قسمًا لإدخال استفسارات المستخدم وزر الإرسال، ثم نعرض المحادثة داخل العنصر <div id="conversation"></div>. تنسيق الصفحة الرئيسية نقوم بوضع الكود التالي ضمن وسم <head> وهو تنسيق جاهز بسيط أضفناه للصفحة ويمكنك تعديله أو كتابة التنسيق الخاص بك: <style> body { font-family: Arial, sans-serif; margin: 0; padding: 0; } #container { padding: 8rem 16rem; } h1 { text-align: center; margin: 2rem 0; } form { display: flex; justify-content: space-between; align-items: center; margin: 2rem 0; } input[type="text"] { height: 2rem; flex: 1; padding: 1rem; font-size: 1.2rem; border-radius: 0.5rem; border: none; box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2); } button[type="submit"] { height: 4rem; padding: 0 1.2rem; margin-right: 1rem; font-size: 1.2rem; border-radius: 0.5rem; border: none; background-color: #007bff; color: white; cursor: pointer; } #conversation { margin: 2rem; } p { margin: 0.5rem 0; } .user { color: #007bff; font-weight: bold; } .chatbot { color: #333; font-weight: bold; width: 50%; } </style> الصفحة بسيطة وستظهر بالشكل التالي: سنعمل بعدها على تركيب أجزاء المشروع مع بعضها بربط الواجهة الأمامية مع الخلفية وتجربة خصائصه. ربط الواجهة الأمامية مع الواجهة الخلفية الآن نكتب الكود الخاص بربط الواجهة الخلفية مع الواجهة التفاعلية الأمامية ونضيفه ضمن وسم body: <script> const conversationElem = document.getElementById('conversation'); const messageInput = document.getElementById('message'); // Send message to chatbot on form submit document.querySelector('form').addEventListener('submit', async (event) => { event.preventDefault(); const message = messageInput.value; messageInput.value = ''; // Send message to server and wait for response const response = await fetch('/message', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message }) }).then(res => res.json()); // Add user message and chatbot response to conversation conversationElem.innerHTML += `<p class="user">أنت: ${message}</p>`; conversationElem.innerHTML += `<p class="chatbot">البوت: ${response.message}</p>`; console.log(response.message) }); </script> قمنا بتعريف متغيرين الأول هو conversationElem لقسم المحادثة والثاني messageInput لمدخلات المستخدم ثم قمنا باختيار النموذج الذي انشأناه في ملف index.html لمعالجة البيانات المدخلة وإرسالها إلى الواجهة الخلفية، ونستخدم لذلك الغرض دالة fetch من خلال عملية post التي قمنا بشرحها سابقًا. ثم نقوم باضافة رسالة المستخدم واستجابة بوت المحادثة المرسلة من الواجهة الخلفية للتطبيق من خلال استخدام الدالة innerHTML ونضيف العناصر ضمن وسم النص <p> ونكون بذلك قد انتهينا من المشروع النموذجي. الكود النهائي للمشروع ملف index.js: const express = require("express"); const bodyParser = require("body-parser"); const OpenAI = require("openai"); require("dotenv").config(); const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY, }); const app = express(); const port = 3000; // Array to store previous messages const history = []; // Middleware to parse JSON in the request body app.use(bodyParser.json()); // Serve the index.html file app.get("/", (req, res) => { res.sendFile(__dirname + "/index.html"); }); // Handle incoming messages app.post("/message", async (req, res) => { const message = req.body.message; // If there is a previous message, include it in the prompt const user_input = history.length > 0 ? `سجل المحادثة:\n${history.join("\n")}\nأنت: ${message}\n` : `أنت: ${message}\n`; const messages = []; for (const [input_text, completion_text] of history) { messages.push({ role: "user", content: input_text }); messages.push({ role: "assistant", content: completion_text }); } messages.push({ role: "user", content: user_input }); try { const completion = await openai.chat.completions.create({ model: "gpt-3.5-turbo", messages: messages, }); const completion_text = completion.data.choices[0].message.content; console.log(completion_text); history.push([user_input, completion_text]); res.json({ message: completion_text }); } catch (error) { if (error.response) { console.log(error.response.status); console.log(error.response.data); res.status(500).json({ error: "Something went wrong" }); } else { console.log(error.message); res.status(500).json({ error: "Something went wrong" }); } } }); // Start the server app.listen(port, () => { console.log(`Server is listening on port ${port}`); }); ملف index.html: <!DOCTYPE html> <html lang="ar" dir="rtl"> <head> <style> body { font-family: Arial, sans-serif; margin: 0; padding: 0; } #container { padding: 8rem 16rem; } h1 { text-align: center; margin: 2rem 0; } form { display: flex; justify-content: space-between; align-items: center; margin: 2rem 0; } input[type="text"] { height: 2rem; flex: 1; padding: 1rem; font-size: 1.2rem; border-radius: 0.5rem; border: none; box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2); } button[type="submit"] { height: 4rem; padding: 0 1.2rem; margin-right: 1rem; font-size: 1.2rem; border-radius: 0.5rem; border: none; background-color: #007bff; color: white; cursor: pointer; } #conversation { margin: 2rem; } p { margin: 0.5rem 0; } .user { color: #007bff; font-weight: bold; } .chatbot { color: #333; font-weight: bold; width: 50%; } </style> <title>دردش مع البوت chatbot</title> </head> <body> <div id="container"> <h1>دردش مع البوت chatbot</h1> <div id="conversation"></div> <form> <input type="text" id="message" placeholder="اكتب رسالتك هنا" /> <button type="submit">إرسال</button> </form> </div> <script> const conversationElem = document.getElementById("conversation"); const messageInput = document.getElementById("message"); // Send message to chatbot on form submit document .querySelector("form") .addEventListener("submit", async (event) => { event.preventDefault(); const message = messageInput.value; messageInput.value = ""; // Send message to server and wait for response const response = await fetch("/message", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ message }), }).then((res) => res.json()); // Add user message and chatbot response to conversation conversationElem.innerHTML += `<p class="user">أنت: ${message}</p>`; conversationElem.innerHTML += `<p class="chatbot">البوت: ${response.message}</p>`; console.log(response.message); }); </script> </body> </html> تجربة التطبيق ندخل الأمر التالي بالطرفية لتشغيل التطبيق: $ node index.js ثم نذهب للمتصفح ونقوم بإدخال العنوان التالي localhost:3000 لتظهر لنا واجهة التطبيق، ندخل أي سؤال وليكن كتابة قصة قصيرة وننتظر الرد من التطبيق كما في الصورة التالية: يمكنك تحميل كود التطبيق من هنا chatgpt-api-bot.zip تطويرات يمكن إضافتها للمشروع يمكننا تطوير المشروع السابق بالعديد من الطرق، ومنها: إضافة ميزات لبوت الدردشة: يمكنك إضافة ميزات جديدة مثل إضافة قائمة من الخيارات للمستخدم للاختيار من بينها مثل إضافة طريقة رد البوت هل هي بطريقة جدية أو بطريقة مضحكة أو بسخرية …إلخ، أو تمكين البوت من إجراء بعض العمليات الرياضية أو توفير إجابات علمية أو حتى إنشاء بوت لتعلم شيء جديد مثل تعلم البرمجة أو تعلم الإنجليزية وهكذا. تحسين واجهة المستخدم: يمكنك تحسين واجهة المستخدم لتبدو أكثر جاذبية وسهولة في الاستخدام، ويمكنك استخدام مكتبات CSS المختلفة لتحسين التصميم والإضاءة على المكونات المهمة في الصفحة. تخزين المحادثات: يمكنك إضافة القدرة على تخزين المحادثات السابقة بين المستخدم والشات بوت، وعرضها للمستخدم عند الضرورة. إضافة تحليلات: يمكنك إضافة تحليلات للمحادثات، مثل عدد المحادثات الناجحة والمحادثات التي تم إنهاؤها بشكل مبكر التي قام المستخدم باغلاقها، وعرضها بشكل رسومي لمساعدتك في تحسين أداء البوت. استخدام مكتبة React أو Vue لتصميم واجهة أمامية تفاعلية أكثر وأداء أفضل. ربط البوت مع خدمات openAI الأخرى المختلفة مثل استعمال رده في توليد صورة من خدمة DALL·E هذه بعض الأفكار التي يمكن تطبيقها لتطوير مشروع الدردشة ويمكنك استخدامها كنقطة انطلاق لمشاريعك المستقبلية، ويمكنك أن تطلع على صفحة الأمثلة من openAI التي تحوي على عشرات الأمثلة والتطبيقات التي يمكن الاستلهام منها والبناء عليها. الخلاصة بهذا نكون قد انتهينا من هذا المقال الذي شرحنا فيه كيفية ربط واجهة برمجة تطبيقات OpenAI API عبر خدمة ChatGPT مع Node.js لإنشاء بوت دردشة بسيط. وباستخدام هذه التقنيات يمكن للمطورين إضافة قيمة كبيرة لتطبيقاتهم على الويب، وتوفير تجربة مميزة للمستخدمين، وكما رأينا، فإن استخدام OpenAI's ChatGPT في Node.js ليس صعبًا بقدر ما يبدو، ويمكن لأي مطور أن يبدأ في تجربتها والاستفادة منها. ومن المؤكد أننا سنشهد مزيدًا من التطورات والتحسينات في مجال الذكاء الاصطناعي والبوتات الذكية في المستقبل، ولذلك يجب أن نستعد لمواكبة هذه التحولات والتطورات بالاستمرار في تعلم وتحسين مهاراتنا في هذا المجال، فلا شك أنه بالعمل الجاد والاستمرار في الابتكار، يمكن للجميع أن يحققوا نجاحات كبيرة في هذا المجال الواعد. اقرأ أيضًا دليل استخدام ChatGPT API لتحسين خدماتك عبر الإنترنت تطوير تطبيق 'وصفة' لاقتراح الوجبات باستخدام ChatGPT و DALL-E في PHP تطوير تطبيق 'علمني' لاستكشاف المواضيع باستخدام جافا سكريبت و ChatGPT
    2 نقاط
  20. هل أنت متحمس لتعلم البرمجة لكنك غير متأكد ما هي وظائف البرمجة التي يمكنك العمل بها في حال تعلمها، وما هي أهم المهارات التي تؤهلك للحصول على كل وظيفة من هذه الوظائف، وما طبيعة المهام والمسؤوليات التي ستوكل إليك عند مباشرة العمل بها. نحاول في مقال اليوم نحاول أن نجيبك على كل هذه التساؤلات ونوضح لك مجموعة من وظائف البرمجة الأكثر طلبًا في سوق العمل وأهم تقنياتها ومهامها ومصادر مفيدة تساعدك على تعلمها واحترافها لنساعدك في ختام المقال على تحديد وظيفة البرمجة الأنسب لك. وظائف البرمجة في سوق العمل يوفر تعلم البرمجة الكثير من الفوائد ويفتح أمامك فرص العمل في العديد من الوظائف البرمجية المتنوعة ذات الطلب المرتفع في سوق العمل، فمع التطور التقني المتسارع في مختلف المجالات والتحول الرقمي الذي انتهجته مختلف القطاعات والصناعات ازدادت الحاجة لتعيين مبرمجين ومطورين متخصصين قادرين على تطوير التطبيقات المختلفة والتعامل معها وصيانتها وتحسينها، وارتفع الطلب على مختلف الوظائف البرمجية ما أدى بالتالي إلى ارتفاع رواتب هذه الوظائف أيضًا. بالطبع تختلف الرواتب الممنوحة للمبرمجين باختلاف المنطقة الجغرافية والتخصص البرمجي وعدد سنوات الخبرة وغيرها من العوامل الأخرى، إلا أن أجور المهن والوظائف البرمجية تبقى مرتفعة مقارنة بغيرها من المهن في سوق العمل وإذا كنت مهتمًا بمعرفة المزيد من المعلومات حول رواتب وظائف البرمجة أنصحك بمطالعة مقال تعرف على أعلى تخصصات البرمجة أجرًا. ولعل من أبرز مميزات وظائف البرمجة التي تشجع الأشخاص على تعلم البرمجة إلى جانب ارتفاع الطلب عليها وأجورها المحفزة هو أنها توفر بيئة عمل مرنة فهي تمكنك من العمل من منزلك أو من أي مكان تفضله وخلال أي وقت ما يجعلها الخيار الوظيفي الأفضل بالنسبة لك إذا كنت ممن يميل للبقاء في المنزل والعمل بين أفراد عائلتك وتسعى لأن تحقق التوازن بين عملك وحياتك الشخصية. ولحسن الحظ فإن وظائف المبرمجين والعمل بها اليوم لم تعد تتطلب شهادة جامعية بل بات بإمكانك تعلمها ذاتيًا والعمل في التخصص البرمجي الذي ترغب به أيًا كان، كل ما تحتاجه هو خبرة كافية ومثبتة، ومعرض أعمال قوي يمكنك من شغل المنصب الذي تطمح له، وأنصحك بالاطلاع على بعض قصص النجاح المحفزة التي تشجعك على بدء رحلتك في تعلم البرمجة والتخصص بإحدى مجالاتها. أبرز وظائف تخصص البرمجة إذا كنت ترغب في العثور على وظيفة برمجة لكنك متردد في اختيارها ولا تدري هل تناسبك، وهل هي مطلوبة في سوق العمل أم لا، وهل يتطلب العمل بها تأدية الكثير من المهام، فإليك قائمة تقترح لك أبرز عشر وظائف برمجة مطلوبة يمكنك العمل بها: مطور ويب مطور تطبيقات جوال مطور تطبيقات سطح مكتب مبرمج ألعاب مسؤول قواعد البيانات محلل بيانات مهندس Devops خبير أمن معلومات خبير ذكاء اصطناعي مدرس برمجة سنناقش في الفقرات التالية كل وظيفة من هذه الوظائف ونتعرف مهام المبرمج الذي يقرر العمل فيها بمزيد من التفصيل. 1. مطور ويب لاشك أن تطوير الويب وبرمجة المواقع من وظائف البرمجة المهمة والمرتفعة الطلب عربيًا وعالميًا نظرًا لأن كافة الشركات والأعمال وحتى الأشخاص اليوم يحرصون على إنشاء موقع ويب خاص بهم سواء موقع تعريفي أو موقع للتجارة الإلكترونية أو معرض أعمال جذاب أو غير ذلك من أنواع المواقع المختلفة. عند العمل كمطور ويب سيكون عليك كتابة كافة التعليمات البرمجية التي تجعل هذا الموقع يعمل بالشكل الصحيح والاهتمام بصيانته وإدارته وحل أي مشكلات مستقبلية تظهر فيه، ويمكن أن يقوم بهذه الوظيفة مبرمج أو فريق عمل واحد يعمل بوظيفة مطور ويب كامل Full-Stack أو يقوم بها مبرمجان أو فريقان برمجيان الأول يعمل بوظيفة مطور واجهات أمامية Front-end والثاني يعمل بوظيفة مطور واجهات خلفية Back-end. يهتم مطور الواجهات الأمامية بتصميم الجانب الذي يراه المستخدمون من موقع الويب ويصمم بنية الموقع والتأكد من أنه يظهر بشكل جميل ومثالي على مختلف المتصفحات ومتجاوب مع كافة أحجام الشاشات، كما يحتاج مطور الواجهة الأمامية كذلك إلى التعاون مع مصمم تجربة المستخدم UX للتأكد من أن موقع الويب مناسب وسهل الاستخدام. في حين يهتم مطور الواجهات الخلفية بكتابة كود موقع الويب الذي يجعل الموقع يعمل ويتفاعل مع قواعد البيانات ويؤدي كافة الوظائف المطلوبة منه، كما يعمل على اختباره وصيانته وتصحيح أي مشكلات تظهر في وظائفه أو في بنيته الداخلية. تعلم وظيفة تطوير الويب إذا كنت تجد أن وظيفة تطوير الويب مناسبة لك وترغب في تعلمها فستجد في أكاديمية حسوب العديد من مصادر التعلم المجانية من دروس ومقالات متنوعة على سبيل المثال ستجد في مقال المدخل الشامل لتعلم تطوير الويب وبرمجة المواقع الكثير من التفاصيل المفيدة حول هذه الوظيفة المهمة وأهم تقنياتها وتخصصاتها، وستجد كذلك الكثير من الكتب المنهجية التي تساعدك على تعلم تقنيات تطوير الويب، كما توفر لك موسوعة حسوب توثيقات شاملة للعديد من تقنيات تطوير الويب المطلوبة في سوق العمل. إلى جانب ذلك توفر أكاديمية حسوب العديد من الدورات التدريبية المتكاملة لمساعدتك في تعلم كافة التقنيات التي تحتاجها لتصبح مطور ويب بطريقة منهجية ومنظمة تساعدك على بناء العديد من المشاريع التي تعزز معرض أعمالك وتساعدك في الحصول على وظيفة مطور ويب بسرعة وإليك قائمة ببعض الدورات التي تفيدك في هذه الوظيفة: دورة تطوير واجهات المستخدم: ستتعلم في هذه الدورة بناء العديد من المواقع التي تساعدك على تطوير مهاراتك الفنية وإظهار إبداعك في بناء الواجهات الأمامية مثل بناء موقع شخصي لعرض أعمالك، وموقع تعريفي لشركة، وموقع أخباري، ومتجر إلكتروني، ولوحة تحكم والعديد من صفحات الهبوط كصفحة هبوط منتج وصفحة تطبيق وغيرها، وستطبق خلال تنفيذ هذه المشاريع العديد من لغات البرمجة والتقنيات المفيدة وتكون جاهزًا لمباشرة وظيفة برمجة واجهات المستخدم. دورة تطوير تطبيقات الويب باستخدام لغة PHP: ستتعلم في هذه الدورة أساسيات لغة PHP وإطار عملها الشهير لارافيل Laravel وستبني عدة مواقع ويب احترافية مثل موقع لإدارة المشاريع، وشبكة تواصل اجتماعي تشبه تلغرام، ومتجر إلكتروني لبيع الكتب، وموقع إعلانات مبوبة، ونظام إدارة محتوى وغيرها الكثير كما ستتعلم كيف تبني متجر إلكتروني باستخدام ووردبريس WordPress. دورة تطوير التطبيقات باستخدام لغة Python: ستتمكن في هذه الدورة من بناء عدة مواقع ويب متكاملة مثل بناء موقع إدارة مهام وإنشاء متجر الكتروني باستخدام إطار العمل جانغو Django: كما ستتعلم بناء مدونة شخصية وتطبيق وجبات باستخدام إطار العمل فلاسك Flask. دورة تطوير تطبيقات الويب باستخدام لغة Ruby: ستتعلم أساسيات لغة البرمجة روبي وطريقة استخدام إطار عمل تطوير المواقع الشهير روبي أو ريلز Ruby On Rails وتطور من خلاله شبكة تواصل اجتماعي تشبه تويتر ومجتمع يشبه حسوب I/O. 2. مطور تطبيقات الجوال تعد وظيفة برمجة تطبيقات الجوال من الوظائف الأكثر طلبًا في السوق التقني وفي حال قررت التخصص في تطوير تطبيقات الجوال فستكون مسؤولًا عن تصميم وتطوير تطبيقات جوال متنوعة سواء تطبيقات تعليمية، أو تطبيقات ترفيهية، أو تطبيقات تواصل اجتماعي، أو متاجر إلكترونية، أو أي نوع آخر من التطبيقات التي يمكن استخدامها على الجوال. قد يطلب منك عند العمل في هذه الوظيفة تطوير تطبيقات جوال أصيلة Native تعمل على أنظمة تشغيل معينة فقط، مثل تطبيق مخصص لنظام أندرويد Android أو تطبيق مخصص لنظام آي أو إس iOS، أو يطلب منك تطوير تطبيقات جوال هجينة Hybrid أو متعددة المنصات Cross-Platform وهي تطبيقات تعمل مع كافة أنظمة تشغيل الجوالات ولكل نوع من هذه التطبيقات أساليب وتقنيات مختلفة لبرمجته، وقد يطلب منك نشر التطبيق على المتاجر الرقمية المتخصصة مثل نشره على متجر جوجل بلاي Google Play أو متجر آبل ستور Apple Store وصيانة التطبيق وتحسينه وحل أي مشكلات تظهر فيه لاحقًا. تعلم وظيفة تطوير تطبيقات الجوال كي تعمل كمطور تطبيقات جوال تحتاج إلى تحديد نوع التطبيقات الذي تود برمجته ثم تبدأ بتعلم خطوات برمجة التطبيق بداية من تحديد فكرته وتصميم واجهته وكتابة التعليمات البرمجية التي تجعل هذا التطبيق يعمل بالشكل الصحيح. ستجد في أكاديمية حسوب الكثير من الدروس والمقالات والكتب المفيدة التي تساعدك على تعلم التقنيات ولغات البرمجة واطر العمل التي تناسب تطوير التطبيقات بمختلف أنواعها مثل مقال دليلك الشامل إلى برمجة التطبيقات ومقال تطوير تطبيقات الجوال. كما تساعدك دورات أكاديمية حسوب على التخصص في تطوير التطبيقات بسرعة واحترافية ففي دورة تطوير التطبيقات باستخدام جافا سكريبت ستتعلم تطوير العديد من التطبيقات التي تعزز معرض أعمالك مثل تطبيق جوال للبحث عن الأطباء باستخدام رياكت نيتف React Native، وتطبيق مراسلة شبيه بواتساب، وتطبيق أسئلة وأجوبة، وتطبيق تعلم لغات باستخدام الذكاء الاصطناعي من خلال إطار عمل Next.js، إضافة لتطبيق تواصل اجتماعي باستخدام إطار أيونيك Ionic وغيرها من التطبيقات الرائعة التي تساعدك للعمل في وظيفة تطوير تطبيقات الجوال. 3. مطور تطبيقات سطح مكتب تعد برمجة تطبيقات سمح المكتب وظيفة برمجية مرتفعة الأجر وعند العمل بها ستكون مسؤولًا عن تصميم وبرمجة وتطوير برامج مخصصة للعمل على أجهزة الحاسوب المكتبية والحواسيب المحمولة التي تعمل بنظام التشغيل ويندوز أو لينكس أو ماك، وقد يطلب منك إضافة لبرمجة تطبيق سطح المكتب تثبيت التطبيق على أجهزة المستخدمين في الشركة التي ستستخدم هذا التطبيق وتوضيح طريقة التعامل معه أو رفعه على أحد متاجر تطبيقات سطح المكتب مثل متجر تطبيقات ويندوز. وقد يطلب منك كمطور سطح مكتب تطوير أنواع مختلفة من تطبيقات سطح المكتب مثل التطبيقات الأصيلة Native المخصصة للعمل على نظام تشغيل معين أو التطبيقات متعددة المنصات Cross-platform وفي هذه الحالة تحتاج لأن تكتب الكود البرمجي للتطبيق مرة واحدة بالاستفادة من تقنيات برمجة الويب ثم تحول الكود بأدوات معينة ليتوافق مع كافة أنظمة التشغيل المختلفة. تعلم وظيفة تطوير تطبيقات سطح المكتب في حال كنت مهتمًا بالعمل في وظيفة تطوير تطبيقات سطح المكتب وتود تعلمها فعليك في البداية تحديد نوع التطبيقات التي تنوي تطويرها والبدء بتعلم كافة التقنيات واللغات المخصصة لهذا النوع فلكل نوع تقنياته وأدواته المختلفة. ستجد في أكاديمية حسوب الكثير من المصادر التي تساعدك على تعلم هذه الوظيفة من دروس ومقالات مثل مقال كل ما تود معرفته عن برمجة تطبيقات سطح المكتب كما ستجد العديد من الكتب البرمجية المجانية المفيدة حول التقنيات التي تحتاجها. كما توفر لك دورة تطوير التطبيقات باستخدام JavaScript مسارًا كاملًا لتعلم إنشاء تطبيقات سطح مكتب باستخدام إطار العمل القوي إلكترون Electron JS المعتمد على لغة جافا سكريبت فهذه اللغة قوية ومتعددة الاستخدامات وتعلمها يفتح لك العديد من مجالات العمل. 4. مبرمج ألعاب تعد الألعاب الإلكترونية من التطبيقات المحببة لدى فئة كبيرة من المستخدمين، ويزداد حجم سوق صناعة الألعاب بوتيرة عالية ويحقق أرباحًا كبيرة جدًا، وهذا بدوره يجعل برمجة الألعاب أحد أكثر تخصصات البرمجة أجرًا ويزيد الطلب على مصممي ومطوري الألعاب المسؤولين عن إنشاء مختلف أنواع الألعاب الإلكترونية. يتطلب العمل في وظيفة برمجة الألعاب الإلكترونية امتلاك مهارات فنية في لغات برمجة الألعاب ومحركات الألعاب كما يتطلب امتلاك مهارات إبداعية وخيال واسع لابتكار أفكار ألعاب إلكترونية ممتعة تجذب المستخدمين وتحفزهم على اللعب، كما يحتاج لوجود مهارات في التنظيم والتعاون والعمل الجماعي لاسيما عند العمل مع فريق تطوير ألعاب. وتذكر أنك إذا قررت أن تصبح مطور ألعاب فيمكنك أن تعمل بشكل مستقل وتطور ألعابًا بسيطة وجذابة، ومن الممكن أن تعمل ضمن فريق عمل متكامل حيث يتولى تطوير الألعاب الضخمة عادة شركات برمجية متخصصة تضم فرق عمل مكونة من مبرمجين وفنانين ومصممين وكتاب يتعاونون معًا لإنتاج ألعاب احترافية مميزة لذا تحتاج في هذه الحالة إلى تعزيز مهاراتك الناعمة مثل مهارات التواصل الفعال وروح العمل الجماعي. تعلم وظيفة برمجة الألعاب يتطلب التخصص في وظيفة برمجة الألعاب لتعلم إحدى لغات برمجة الألعاب وتعلم استخدام أحد محركات الألعاب game engines التي توفر لك كافة الوظائف اللازمة لتطوير ونشر الألعاب بسرعة وسهولة، كما يساعدك تعلم لغات تطوير الويب على برمجة ألعاب المتصفح وتعلم لغات تطوير الجوال على برمجة تطبيقات ألعاب مخصصة للعمل على الهواتف المحمولة. وأنصحك أيضًا بالاطلاع على مقالات ودروس صناعة الألعاب في أكاديمية حسوب حيث ستتعرف فيها على كل جديد يخص تصميم وبرمجة الألعاب واستخدام برامج تطوير الألعاب المختلفة. 5. مسؤول قواعد البيانات تعد الوظائف المرتبطة بقواعد البيانات من أهم التخصصات البرمجية المطلوبة حيث تحتاج معظم قطاعات العمل مثل المستشفيات والجامعات والقطاعات الحكومية وغيرها إلى تخزين الكثير من البيانات الخاصة بها وتوظيف مختصين مسؤولين عن تنظيم عملية تخزين هذه البيانات وهنا يأتي دور مسؤول قواعد البيانات أو مدير قواعد بيانات للقيام بهذه المهمة. عند العمل في وظيفة مسؤول قواعد البيانات في شركة ما سيكون عليك القيام بعدة مهام من بينها الاهتمام بتصميم قواعد البيانات والتواصل مع مبرمجي التطبيقات الذين يستخدمون قواعد البيانات في تطبيقاتهم للتأكد من تخزين المعلومات ضمنها بطريقة مناسبة تلبي متطلبات العمل، كما يتوجب عليك إدارة الوصول إلى البيانات والتأكد من أمنها وسلامتها ومنع الوصول غير المصرح لها وإجراء النسخ الاحتياطي لها بصورة دورية لاستعادتها في حال حدوث أي أخطاء أو فقدان للبيانات. تعلم وظيفة مسؤول قواعد البيانات كي تتعلم وظيفة إدارة قواعد البيانات عليك التعرف على مفهوم قواعد البيانات وأنواعها المختلفة مثل قواعد البيانات العلاقية وغير العلاقية وأساسيات تصميم قواعد البيانات وتتعلم لغات الاستعلام من البيانات مثل SQL وأنظمة إدارة قواعد البيانات المختلفة مثل mySQL أو MongoDB وتتعرف على مكونات قواعد البيانات المختلفة ومن المفيد لك تعلم إحدى لغات البرمجة لتطوير تطبيقات لمعالجة هذه البيانات مثل لغة بايثون Python أو جافا سكريبت JavaScript. ستجد في أكاديمية حسوب الكثير من دروس تعلم قواعد البيانات المفيدة التي تساعدك على فهم قواعد البيانات المختلفة وفي حال كنت تفضل الدارسة من الكتب ستجد في قسم الكتب في الأكاديمية العديد من الكتب المفيدة للتعلم مثل كتاب تصميم قواعد البيانات وكتاب الدليل العملي إلى قواعد بيانات PostgreSQL. كما توفر دورة علوم الحاسوب كافة المعلومات التي تحتاجها حول أنظمة قواعد البيانات المختلفة وطريقة التعامل معها، مع شرح تفصيلي للغة SQL إضافة لشرح كافة المبادئ المتعلقة بأنظمة قواعد البيانات بمختلف أنواعها وغيرها الكثير من المواضيع التي تفيدك لتشغل وظيفة مدير قواعد بيانات. 6. محلل بيانات تزايد الطلب على وظائف البرمجة المرتبطة بالبيانات نتيجة التضخم الهائل في كمية البيانات المبعثرة التي تخزنها الأجهزة و المواقع والتطبيقات المختلفة التي نتفاعل معها يوميًا ما استدعى الحاجة لوجود وظيفة قادة على فهم هذه البيانات الضخمة المتناثرة وتحليلها وتحويلها لمعلومات قيمة واستنتاج قرارات مفيدة منها لتحسين العمل وخفض تكاليفه وزيادة أرباحه. ومن أبرز التخصصات المرتبطة بالبيانات وظيفة تحليل البيانات وهناك تسميات وأدوار وظيفية أخرى مشابهة ومتقاطعة مع هذه الوظيفة مثل علم البيانات وهندسة البيانات وتحليل الأعمال وهذه التخصصات مطلوبة بكثرة في العديد من القطاعات مثل مجالات التصنيع والاقتصاد والرعاية الصحية. تركز وظيفة محلل البيانات على جمع البيانات وتنظيفها وتحديد أنماطها وعرضها على شكل مخططات رسومية واستنتاج قرارات مفيدة تساعد المؤسسات على اتخاذ قرارات صحيحة باستخدام برامج وأدوات مخصصة لتحليل وتمثيل البيانات وتحليلها إحصائيًا. تعلم وظيفة تحليل البيانات تحتاج وظيفة تحليل البيانات لتعلم إحدى لغات البرمجة المستخدمة في معالجة وتحليل البيانات مثل لغة بايثون Python أو R أو SQL، ووجود معرفة أساسية بالرياضيات والإحصاء الرياضي والذكاء الاصطناعي لمعالجة الكميات الضخمة من البيانات واتخاذ قرارات ذكية بناء عليها، كما يفيدك تعلم الأدوات والبرامج المساعدة مثل برنامج إكسل Excel و Power BI و SAS. توفر أكاديمية حسوب عدة دروس ومقالات مساعدة لتعلم هذه التقنيات مثل دروس تعلم برنامج اكسل و ودروس تعلم لغة R ودروس تعلم لغة بايثون كما تشرح موسوعة حسوب الشاملة توثيق لغة بايثون وتوثيق لغة SQL إلى جانب العديد من المصادر الأخرى مثل كتاب البرمجة بلغة باثيون و توثيق لغة بايثون وكتاب ملاحظات للعاملين بلغة SQL. وإذا كنت مهتمًا بتعلم الجانب العملي لتخصص تحليل البيانات ستفيدك دورة تطوير التطبيقات باستخدام لغة Python فهي تتضمن مسارًا كاملًا ووافيًا حول تحليل البيانات يمكنك من خلاله تعلم أهم مكتبات تحليل البيانات في بايثون وتطبيقها على عدة مشاريع عملية مفيدة. 7. مهندس DevOps يعد تخصص ديف أوبس DevOps من الوظائف البرمجية الحديثة التي زاد الطلب عليها كثيرًا في الشركات التقنية لما توفره من تسريع وتيرة تطوير البرمجيات وجعل العمل عليها أكثر كفاءة وإنتاجية. من أبرز المهام التي ستعمل بها في حال عملك كمهندس ديف أوبس DevOps engineer هو إدارة ونشر التطبيقات بعد الانتهاء من برمجتها أو التعديل عليها وحتى توصيلها للمستخدم بسرعة وأمان، وتحسين التواصل بين فرق تطوير البرمجيات وفرق عمليات تقنية المعلومات IT operations المسؤولة عن نشر وتشغيل البرمجيات وغيرهم من الأطراف، وللاطلاع مزيد من المعلومات حول طبيعة هذه الوظيفة أنصحك بمطالعة مقال ما هي الغاية من DevOps؟. تعلم وظيفة مهندس DevOps عليك أن تتعلم مجموعة متنوعة من المهارات الفنية لتتمكن من إنجاز ممارسات DevOps أهمها إعداد البنية التحتية اللازمة لتطوير البرمجيات والتعامل مع قواعد البيانات ومعرفة أساسيات الشبكات الحاسوبية والتعامل مع منصات الحوسبة السحابية وإدارة الخوادم ونظام التشغيل لينكس وأساسيات سطر الأوامر والتعامل مع صدفة باش Bash وطريقة التعامل مع الحاويات ومن أشهرها حاوية دوكر Docker. كما تحتاج لتعلم إحدى لغات برمجة الخوادم مثل لغة بايثون Python أو جافا سكريبت JavaScript أو غيرها من اللغات كي تتمكن من أتمتة المهام المتكررة التي تنفذها عليه التي يمكنك الاطلاع عليها في مقال أفضل 5 لغات برمجة لـ DevOps. كما ستحتاج إلى تعلم منهجيات تطوير البرمجيات مثل منهجية أجايل Agile التي تساعد المطورين على إدخال ميزات وتحديثات صغيرة على التطبيقات بعد إصدارها وتكرار مراحل التطوير بشكل دوري ومرن، ومنهجية التكامل المستمر والنشر المستمر CI/CD لاختبار التغييرات الجديدة على البرمجيات وإضافتها إلى مستودعات الأكواد البرمجية ونشر التحديثات بسرعة وبكفاءة. ستجد في قسم المقالات والدروس في أكاديمية حسوب قسمًا كاملًا حول دورس DevOps يتضمن الكثير من المقالات البرمجية عالية الجودة حول هذا التخصص مثل مقال المدخل الشامل لتعلم DevOps وغيرها الكثير من المقالات التي تساعدك لتعلم إدارة السيرفرات والتعامل مع نظام لينكس والمنصات السحابية، وإن كنت تفضل الدراسة من الكتب يمكنك مطالعة القسم المتخصص بكتب DevOps في الأكاديمية. كما توفر لك دورة علوم الحاسوب من أكاديمية حسوب فرصة تعلم أهم الأساسيات التي تحتاجها كمتخصص DevOps على شكل مسارات منهجية من أهمها مسار التعامل مع أنظمة التشغيل، ومسار تعلم أساسيات الشبكات، وغيرها من المسارات المفيدة لهذا التخصص. 8. خبير في الذكاء الاصطناعي تعد مهنة الذكاء الاصطناعي والتعلم الآلي واحدة من أكثر الوظائف البرمجية المطلوبة والمجزية فقد تطور الذكاء الاصطناعي في الآونة الأخير بشكل كبير وأصبح يؤثر على مختلف نواحي حياتنا، ورغم ما أثاره هذا التطور من مخاوف لدى بعض المبرمجين بأنه قد يهدد مستقبلهم الوظيفي لكنه على العكس زاد الطلب المبرمجين المتخصصين في مجال الذكاء الاصطناعي ومجالاته الفرعية مثل تعلم الآلة والتعلم العميق وهو اليوم في طليعة الوظائف البرمجية المطلوبة. من خلال العمل في هذه الوظيفة البرمجية ستكون مسؤولًا عن تطوير وبرمجة وتدريب نماذج الذكاء الاصطناعي التي تصلح لمختلف التطبيقات مثل تطبيقات الدردشة الذكية، وتطبيقات فهم اللغة الطبيعية والمعالجة اللغوية، وتطبيقات الرؤية الحاسوبية والتعرف على الأشياء، وكشف الاحتيال، وتشخيص الأمراض والتنبؤ بها، وصناعة الألعاب الذكية وغيرها من الأنواع العديدة الأخرى. تعلم وظيفة متخصص في الذكاء الاصطناعي يحتاج العمل في هذا التخصص إلى وجود معرفة بأساسيات البرمجة وتعلم إحدى لغات البرمجة المناسبة لتطوير تطبيقات الذكاء الاصطناعي مثل بايثون Python أو C++‎ أو R كما تحتاج لوجود فهم جيد للرياضيات والاحتمالات والإحصاء ومعرفة بأساسيات الذكاء الاصطناعي وأهم خوارزمياته وكيفية عملها والقدرة على تحديد الخوارزمية الصحيحة المناسبة لاستخدامها في تطبيقاتك. توفر أكاديمية حسوب الكثير من الدروس والمقالات المفيدة في تعلم الذكاء الاصطناعي ومختلف تخصصاته الفرعية وتشرح لك أهم الخوارزميات والتقنيات المستخدمة في هذا التخصص، كما توفر عدة كتب برمجية مجانية مفيدة تساعدك للتخصص في مجال الذكاء الاصطناعي مثل كتاب مدخل إلى الذكاء الاصطناعي وتعلم الآلة وكتاب عشرة مشاريع عملية عن الذكاء الاصطناعي. إضافة لذلك توفر دورة الذكاء الاصطناعي AI مسارًا كاملًا يساعدك لتتعلم كل ما تحتاجه عن برمجة خوارزميات الذكاء الاصطناعي وتعلم الآلة Machine Learning وتحليل البيانات ودمج النماذج اللغوية المختلفة مثل LLMs مثل GPT من OpenAI و LLaMA 2 من Meta مع تطبيقاتك العملية وتعزز فرصتك في العمل بهذه الوظيفة الحيوية والواعدة في مستقبل البرمجة. دورة الذكاء الاصطناعي احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة. اشترك الآن 9. خبير أمن سيبراني تهتم وظيفة الأمن السيبراني Cybersecurity بتأمين وحماية الأنظمة الرقمية والشبكات الإلكترونية وكل ما يتعلق بالأجهزة الرقمية وتكنولوجيا المعلومات الرقمية ضدّ أي هجمات رقمية أو هجمات سيبرانية Cyber Attacks ويزداد الطلب على العاملين فيها بسبب زيادة التهديدات التي تواجهها شركات الأعمال وسعيها لحماية أمن معلوماتها والالتزام باللائحة العامة لحماية البيانات GDPR التي زادت من وعي شركات الأعمال بضرورة حماية البيانات. عندما تعمل كخبير أمن سيبراني في شركة ما فقد يطلب منك التخصص في مجال محدد مرتبط بهذه الوظيفة مثل مهندس أمن سيبراني، أو مختبر اختراق أخلاقي، أو محلل جنائي رقمي، وقد تختلف مهامك الوظيفية باختلاف التخصص لكنك بالعموم ستكون مسؤولًا عن تأمين وحماية الأنظمة والشبكات والبنية التحتية التي تستخدمها شركتك من أي هجمات وكشف أي ثغرات أمنية محتملة فيها والعمل على إصلاحها، وحماية البيانات من الوصول غير المصرح واتخاذ تدابير للوقاية من أي هجمات مستقبلية. كما يتطلب منك العمل في هذه الوظيفة التواصل الفعال مع موظفي شركتك وإرشادهم وتدريبهم على التعامل مع الأنظمة البرمجية بالطريقة الصحيحة وزيادة وعيهم بأهمية اتباع تدابير السلامة التي تحفظ أمن وحماية البيانات. تعلم وظيفة خبير أمن سيبراني إذا كنت مهتمًا بالعمل في هذه الوظيفة البرمجية المهمة عليك تعلم أساسيات التعامل مع أنظمة التشغيل وبشكل خاص نظام التشغيل لينكس وفهم مبادئ عمل الشبكات الحاسوبية وأسس تصميم قواعد البيانات بطريقة آمنة، كما يتوجب عليك تعلم أساسيات البرمجة والتعمق في إحدى لغات البرمجة المفيدة في مجال الأمن السيبراني مثل لغة C أو C++‎. تمكنك دروة علوم الحاسوب من تعلم معظم الأساسيات التي تحتاجها في هذا المجال، كما توفر أكاديمية حسوب الكثير من مصادر التعلم المجانية المفيدة حول تقنيات ومبادئ الأمن السيبراني مثل الدروس والمقالات المفيدة المتخصصة التي تشرح لك ما هو الأمن السيبراني وما أبرز أنواع الهجمات الأمنية وسبل الوقاية منها إلى جانب العديد من الكتب الشاملة المفيدة في هذا التخصص مثل كتاب دليل الأمان الرقمي وكتاب تصميم قواعد البيانات الذي يرشدك لطريقة ضمان سلامة بيانات قواعد البيانات. 10. مدرّس برمجة إذا كنت مهتمًا بالتقنية والبرمجة ولديك بذات الوقت شغف بمهنة التدريس ونشر المعرفة فهذه الوظيفة هي الأنسب لك، فمن خلالها ستكون مسؤولًا عن تدريس البرمجة لطلابك وتدريبهم على تطوير المشاريع البرمجية والتطبيقات المختلفة، وإكسابهم القدرة على حل المشكلات البرمجية والتعامل معها بكفاءة. تعد هذه الوظيفة كذلك من وظائف البرمجة المهمة والمجزية حتى أن معظم المبرمجين المشهورين يحصلون على دخلهم من التدريب والتعليم وليس من برمجة التطبيقات المختلفة، فالجيل الناشئ يدرك قيمة وأهمية البرمجة لمستقبلهم الوظيفي والشخصي ويحرص على تعلمها، لكن البرمجة في الواقع قد تكون مهارة صعبة التعلم على المبتدئ لما تتضمنه من مفاهيم جديدة لذا قد يحتاج لمبرمج محترف يساعده في رحلة تعلم البرمجة ويشرح له ما هي البرمجة ويبسط مفاهيمها ويساعده على التغلب على أي صعوبات في تعلمها. ومن مميزات العمل في هذه الوظيفة هي أنها هي توفر لك إمكانية تدريس الطلاب عن بعد، أو التدريس في معاهد متخصصة، أو تدريب الطلبة ضمن معسكرات برمجية، أو ربما فتح قناة يوتيوب خاصة بك، أو إعداد دورات تدريبية خاصة بك وبيعها. تعلم وظيفة مدرس برمجة كي تتمكن من العمل في وظيفة مدرس برمجة عليك امتلاك معرفة كبيرة بعلوم الحاسوب ولغات البرمجة، إلى جانب امتلاك مهارة جيدة في أساليب التدريس وإعداد الدروس وإيصال المعلومات بسلاسة لطلابك، مع مراعاة الفروق الفردية بينهم وتحفزهم على تطوير نفسهم وتقيم مهاراتهم بشكل صحيح، كما يستلزم العمل في هذه الوظيفة متابعة كل جديد في مجال التقنية لتواكب تطورها المتسارع. إذا كنت تنوي العمل في تدريس البرمجة ولم تكن تملك أي خبرة مسبقة عنها أو كنت لا تعرف ما هو المجال الذي ستخصص في تدريسه فإن دورة علوم الحاسوب مناسبة لبدء مشوارك المهني، وفي حال كنت مهتمًا بمجال معين من مجالات البرمجة فيمكنك التركيز على تعلم التقنيات التي تساعدك في تدريس هذا المجال والبدء بتحضير منهج التدريب الخاص بك والذي يشرح هذا المجال بسهولة ووضوح. كانت هذه قائمة بأكثر وظائف البرمجة التي يمكنك التخصص بها، بالطبع هناك مجالات عديدة أخرى مثل برمجة الأنظمة وتطوير البرمجيات حرة المصدر، وأتمتة الأعمال وبرمجة الروبوتات وبرمجة الشبكات، وإدارة المشاريع البرمجية، وغيرها الكثير، لكن حاولنا أن نسلط الضوء على أكثر وظائف برمجة مطلوبة في سوق العمل. الخلاصة بهذا تكون قد وصلت لنهاية هذا المقال الشامل الذي سلط الضوء على أهم وظائف البرمجة التي يمكنك العمل بها وطبيعة كل وظيفة ومهامها وأهميتها في سوق العمل والتقنيات التي عليك تعلمها للعمل في هذه المهنة ومصادر تساعدك على تعلمها. شاركنا في التعلقيات هل تعتقد أن وظائف البرمجة ستختفي في المستقبل أم لا؟ وهل أنت مهتم بالعمل في إحدى وظائف البرمجة التي شرحناها في سياق المقال؟ وما وظيفة البرمجة التي تفضلها أكثر من غيرها، وهل عملت بها بالفعل أم أنك لا تزال في مرحلة الدراسة واكتساب الخبرات اللازمة للعمل بها؟ وما هي التقنيات التي تتعلمها في هذا المجال؟ اقرأ أيضًا مستقبل البرمجة اكتشف ما هي البرمجة وما أهمية تعلمها برمجة مواقع الويب: دليلك المختصر كيف تتعلم البرمجة: نصائح وأدوات لرحلتك في عالم البرمجة بداية رحلة تعلم البرمجة برمجة الذكاء الاصطناعي
    2 نقاط
  21. إذا كنت ترغب في تَعلُّم الذكاء الاصطناعي أو العمل كمهندس ذكاء صناعي لكنك مشتت في الخطوات التي عليك اتباعها ولا تزال المصطلحات والمفاهيم المرتبطة بهذا العلم مبهمة بالنسبة لك وتراودك تساؤلات من قبيل: هل يمكنني تعلم الذكاء الاصطناعي حتى لو لم يكن لدي خبرة في البرمجة؟ أريد تعلم الذكاء الاصطناعي لكني لا أعرف من أين أبدأ؟ ما هي خطوات تعلم الذكاء الاصطناعي؟ ما هي أهم مصادر تعلم الذكاء الاصطناعي؟ إذا كانت الإجابة نعم فهذه المقالة ستفيدك حتمًا حيث سأوفر لك فيها إجابة شافية على كل ما سبق، وأحاول أن أبسط الأمور قدر المستطاع وأشرح لك بأسلوب موجز ماهية الذكاء الاصطناعي وأهميته وأهم تطبيقاته، وأوضح لك الخطوات التي عليك اتباعها من أجل تعلم الذكاء الاصطناعي، وأهم التخصصات وفرص العمل المرتبطة بهذا المجال، ثم أختم المقال بالإجابة على على أكثر الأسئلة شيوعًا في مجال الذكاء الاصطناعي. وأنوه لأن المقالة الحالية هي جزء من سلسلة مقالات عن الذكاء الصناعي بدأناها مع مقدمة شاملة عن الذكاء الاصطناعي ما هو الذكاء الاصطناعي؟ الذكاء الاصطناعي أو الذكاء الصناعي Artificial Intelligence أو اختصارًا AI هو العلم الذي يعطي يجعل الآلات قادرة على اتخاذ قرارات والتصرف بذكاء من خلال محاكاة البشر وطريقتهم في التفكير، فنحن البشر نحصل على المعلومات الواردة من العالم الخارجي ونعالجها في عقولنا ونصدر الأحكام والاستنتاجات بناء عليها وبناء على تجاربنا السابقة. يمكنك تشبيه عملية الذكاء الاصطناعي وتعلم الآلة بالمولود الجديد الذي لا يستطيع تعلم أو عمل أي شيء بمفرده إذا لم يعلمه والداه ويدربانه وينقلان له المعرفة ويمكنانه من التعرف على ما هو خطأ وما هو صواب، وبذلك تتعلم الآلة وتصبح قادرة على اتخاذ القرارات وإعطاء الاستنتاجات واقتراح الحلول. نعرف أن الآلات هي مجرد عتاد قابل للبرمجة ولكن في عصر الذكاء الاصطناعي أصبحت قابلة للتعلم أيضًا بطريقة تمكنها من إصدار أحكام وقرارات مشابهة للبشر من خلال اتباع طريقة معينة في البرمجة تسمى تعلم الآلة Machine Learning وهي مصطلح مرافق للذكاء الاصطناعي يُمكِّن الآلات من التعلم من أكوام من البيانات بتطبيق خوارزميات ونماذج وأنماط مسبقة البناء عليها نعطيها لها مع البيانات لتستنتج بذلك منها المعلومات دون أن تتم برمجتها وتعليمها بشكل صريح وبذلك تتعلم الآلات وتصبح أكثر ذكاءً. مثلًا بسيط على ما سبق هو تعليم الطفل الصغير أصناف الحيوانات فنقول له الطائر يطير وله جناحان وهذا هو النموذج الحاكم، وبذلك يستطيع الطفل تطبيق هذا النموذج لتصنيف الطيور عن غيرها من أصناف الحيوانات الأخرى مهما أعطيناه من أصناف وأشكال مختلفة، وهو بالضبط ما نفعله مع الآلات باختصار وتبسيط. أهمية تعلم الذكاء الاصطناعي قد تتساءل لماذا أتعلم الذكاء الاصطناعي؟ وهل هناك فائدة من تعلمه والجواب هو نعم بكل تأكيد فالذكاء الصناعي واحد من أهم العلوم الحديثة المستخدمة في عملية إيجاد حلول لمشاكل المجتمع المُلحّة والمصيرية، كالأمراض ومشاكل التلوث وتغير المناخ والعمل في البيئات الخطرة (كالبحر والفضاء). كما يعد الذكاء الاصطناعي أيضًا قطاعًا اقتصاديًّا سريع النمو، حيث من المتوقع أن تزيد عائدات البرامج التي تعتمد على تقنيات الذكاء الاصطناعي بنسبة 21.3٪ عن العام السابق، بإجمالي 62.5 مليار دولار في عام 2022. إذًا من خلال تعلّم الذكاء الاصطناعي، لن تكون مواكبًا لثورة هذا العصر فقط بل ستكون جزءًا منها، عدا عن كون العمل بها ممتع ومحطّ جذب لمن يُريد تحقيق إنجازات علمية وبحثية. أضف إلى ذلك يعتبر العمل في مجال الذكاء الصناعي مُجزيًّا ماديًّا، فمتوسط الرواتب لمهندسي الذكاء الاصطناعي وفقًا لموقع Glassdoor المتخصص في الولايات المتحدة الأمريكية يزيد عن 127 ألف دولارًا أمريكيًّا في السنة، بينما يبلغ متوسط الأجر لمهندس الذكاء الاصطناعي في الإمارات العربية المتحدة 337 ألف درهمًا إماراتيًا (حوالي 94 ألف دولارًا أمريكيًّا) في السنة وفقًا للموقع المتخصص erieri. وعلى الرغم من أن قدرات الذكاء الصناعي لم تأخذ ذروتها بعد ومازالت في مهدها، إلا أنّه أصبح جزءًا أساسيًّا في الكثير من التطبيقات المختلفة، ويتزايد عدد الشركات التي تعتمد الذكاء الاصطناعي لتحسين أدائها ما يعني أن الوظائف المرتبطة بالذكاء الاصطناعي تُصبح مطلوبة كثيرًا وبوتيرة متسارعة. فبحسب استطلاع أجرته شركة McKinsey أظهر أن الذكاء الصناعي يستخدم بوتيرة متزايدة في تحسين الخدمات وتعزيز المنتجات ونمذجة المخاطر ومنع الاحتيال، واعتبارًا من الآن وحتى عام 2030 من المتوقع أن ينمو الطلب على وظائف أبحاث الحاسب والمعلومات بنسبة 22٪. وعلى أهمية هذا المجال وانتشاره لا يزال هناك نقص في الموارد البشرية للذكاء الاصطناعي لاسيما في العالم العربي، فإذا كنت شخصًا مهتمًا بالذكاء الاصطناعي وترغب في تعلمه فأنت تمنح نفسك فرصة عظيمة للحصول على عمل يبشر بمستقبل واعد وفرص واسعة. تطبيقات الذكاء الاصطناعي قد يخطر ببالك عند سماع مصطلح الذكاء الاصطناعي أنه يطبق فقط في الروبوتات المتقدمة التي نراها في البرامج الوثائقية وأفلام الخيال العلمي لكن هذا المثال عام جدًا فالذكاء الاصطناعي يمكن أن يطبق في العديد من المجالات ويصمم لإنجاز مهمة محددة في مجال الرعاية الصحية أو الخدمات المصرفية أو التعليم أو الترفيه أو الإدارة وما إلى ذلك. ومن أبرز تطبيقات الذكاء الصناعي نذكر: التجارة الإلكترونية: يمكن تطبيق الذكاء الاصطناعي للتوصية بأفضل المنتجات واستخدام روبوتات الدردشة ومنع عمليات الاحتيال على بطاقة الائتمان. التعليم: يمكن الاستفادة من الذكاء الاصطناعي في وضع خطط دراسية متكاملة وإنشاء محتوى تعليمي ذكي وأتمتة المهام الإدارية. الرعاية الصحية: يستخدم الذكاء الاصطناعي في التعرف على الأمراض المختلفة وتشخيصها والكشف المبكر عنها وفي اكتشاف أدوية جديدة. السيارات: يستخدم الذكاء الاصطناعي في تصنيع السيارات الذكية وذاتية القيادة كما يحسن تجربة القيادة في السيارة من خلال توفير أنظمة إضافية مثل كبح الفرامل عند الطوارئ. وسائل التواصل الاجتماعي: يمكن الاستفادة من الذكاء الاصطناعي للتوصية بالمنشورات التي قد يهتم بها المتابعون بناء على نوع المحتوى الذي يتفاعلون معه والكشف عن المحتوى غير الملائم والترجمة التلقائية للمحتوى. كانت هذه أمثلة على بعض استخدامات الذكاء الاصطناعي، وتجدر الإشارة أن الذكاء الاصطناعي آخذ في التقدم دونما توقف وتضاف العديد من المجالات التي يضع الذكاء الصناعي بصمته فيها كالزراعة والنقل والفضاء والتجارة الإلكترونية وفي مقالة تطبيقات الذكاء الاصطناعي نشرنا مقالة شاملة لكل هذه المجالات. ما هي وظيفة مهندس الذكاء الاصطناعي؟ يسمى الشخص المسؤول عن الذكاء الاصطناعي داخل أي مؤسسة أو منظمة مهندس الذكاء الاصطناعي وهو منصب وظيفي مرموق، وقد تختلف مسؤوليات مهندس الذكاء الاصطناعي حسب مكان العمل ولكنه يكون مسؤولًا بشكل عام عن الأمور التالية: تطوير أنظمة وتطبيقات ذكية من شأنها تحسين الأداء واتخاذ قرارات أفضل. تحقيق أهداف العمل باستخدام أساليب الذكاء الاصطناعي. استخدام المنطق والاحتمالات وتعلم الآلة لحل مشكلات العمل. تطبيق أفضل الممارسات والخوارزميات لاستخراج البيانات حول المشتريات والمبيعات. والمنتجات ومعالجتها وتحليلها والتنبؤ بالأحداث المستقبلية. تحليل الأنظمة الحالية والعمل على مشاريع تطويرية. ويمكن لمهندس الذكاء الاصطناعي أن يتخصص في مجالات مختلفة مثل التعلم الآلي أو التعلم العميق وسنتحدث بشكل موسع عن هذه التخصصات في فقرة لاحقة. وكي تصبح مهندس ذكاء اصطناعي تحتاج لمجموعة من المهارات الشخصية أهمها الفكر التحليلي والإبداعي والتواصل الجيد والعمل بروح الفريق إلى جانب المهارات التقنية المتعددة التي ذكرناها وعلى رأسها الرياضيات والإحصاء وعلوم الحاسوب ولغات البرمجة. أساسيات الذكاء الاصطناعي قد تتمكن من صعود السلم درجتين درجتين لكن أكثر من ذلك سيكون الأمر مستحيلًا، لذا من الأفضل صعوده درجة درجة وقبل أن تبدأ في تعلم الذكاء الصناعي، يجب أن يكون لديك أساس في المجالات التالية وكلما كان أساسك أكبر كلما كان أفضل: مبادئ علوم الحاسب لغات البرمجة الخوارزميات وهياكل البيانات أنظمة التشغيل حل المشكلات وتطبيقها باستخدام البرمجة الحاسوبية لنتعرف سويًا على كل مجال من المجالات الواردة أعلاه بمزيد من التفصيل وأهميتها في تعلم الذكاء الاصطناعي مبادئ علوم الحاسب لا يمكنك لعب كرة القدم بدون كرة. الأمر ذاته ينطبق هنا، فلابد من فهم المبادئ الأساسية لعلوم الحاسب قبل أن تتمكن من بدء برمجة الذكاء الاصطناعي. هذا يتضمن (سنضع الحد الأدنى من مستوى المعرفة المطلوبة لكل منها): 1. برمجة الحاسب (متوسطة) البرمجة هي مجموعة الأنشطة التي تمكننا من التخاطب مع الحاسب وتوجيه الأوامر له، وتتضمن هذه الأنشطة أمورًا مثل كتابة التعليمات وتوجيه الأوامر وبناء الخوارزميات وكي تتمكن من برمجة الحاسب يجب أن تتعلم إحدى لغات البرمجة. 2. لغات البرمجة (أساسية) يجب أن يكون لديك القدرة على البرمجة بإحدى لغات البرمجة وتحديدًا لغة بايثون، وهي كافية لتطوير مختلف تطبيقات الذكاء الاصطناعي بمختلف تخصصاته. 3. الخوارزميات وهياكل البيانات (متوسطة) هياكل البيانات Data structure هي تنظيم وإدارة وتخزين البيانات بطريقة تتيح الوصول والتعديل الفعّال مثل المصفوفات Arrays، والقوائم المترابطة Linked list والمكدس Stack …إلخ. أما الخوارزمية فهي عبارة عن مجموعة من الخطوات لحل مشكلة معينة، ومن خلال فهم الخوارزميات وهياكل البيانات وكيفية بنائها، يمكننا كتابة برامج وتطبيقات فعّالة. 4. أنظمة التشغيل (أساسية) يجب أن يكون لديك مهارة أساسية في التعامل مع نظامي التشغيل ويندوز لا نقول أن تكون خبيرًا بهما بل يكفي تعلم الأمور الأساسية وتحديدًا كيفية استعمال سطر الأوامر وتشغيل الخدمات الخلفية وإيقافها وإدارة العمليات وغيرها. وننصحك هنا بالرجوع إلى كتاب أنظمة التشغيل للمبرمجين الذي يجب على كل مبرمج قراءته ليحيط بما يلزمه من معلومات وتفاصيل عن نظام التشغيل. 5. حل المشكلات وتطبيقها باستخدام البرمجة الحاسوبية (متوسطة) حل المشكلات هو عملية تحويل وصف المشكلة إلى حل باستخدام معرفتنا بمجال المشكلة والاعتماد على قدرتنا على اختيار واستخدام استراتيجيات وتقنيات وأدوات مناسبة لحل المشكلات. يمكنك الاطلاع على مقالة حل المشكلات وأهميتها في احتراف البرمجة. لمزيد من التفصيل، يمكنك الرجوع إلى مقال المدخل الشامل لتعلم علوم الحاسوب. الرياضيات الرياضيات هي أساس العلوم العلمية، وبالتأكيد هي الأساس الذي انطلق منه الذكاء الصناعي لذا ستحتاج إلى معرفة بعض أساسيات الرياضيات على الأقل للخوض في مجال الذكاء الاصطناعي والتي تشمل: الجبر الخطي التفاضلات التحليل العددي الرياضيات المتقطعة الاحتمالات والإحصاء تعمل الاحتمالات والإحصائيات كأساس للتحليل والتعامل مع البيانات وتقييم نماذج الذكاء الصناعي، كما أنها أساس للعديد من الخوارزميات فيه (خوارزمية بايز مثلًا). يمكن أن تجيب الاحتمالات والإحصاءات على أسئلة مثل: ما هي النتيجة الشائعة؟ ما هي النتيجة المتوقعة؟ كيف تبدو البيانات؟ وغيرها من الأسئلة. تعلم استعمال أدوات الذكاء الاصطناعي هناك العديد من أدوات الذكاء الصناعي التي يمكنك تعلمها والتي تساعدك في أتمتة عملك وتوفر وقتك في تطوير التطبيقات وزيادة كفاءتها ومن أشهرها: SciKit-Learn: التي تعد من أشهر مكتبات بايثون في مجال الذكاء الاصطناعي وهي مبنية على مكتبة SciPy التي توفر العديد من خوارزميات تعلم الآلة وهي تناسب المبتدئين وتسهل عملهم بشكل كبير. TensorFlow: مكتبة مفتوحة المصدر ومتوافقة مع بايثون طورتها جوجل وهي تسهل عمليات الحساب العددي وتستخدم في العديد من مهام الذكاء الاصطناعي وتعلم الآلة والشبكات العصبية. PyTorch: مكتبة بايثون طورتها فيسبوك وتسرع عملية تطوير تطبيقات الرؤية الحاسوبية ومعالجة اللغات الطبيعية. CNTK: تعد واحدة من أفضل أدوات الذكاء الاصطناعي من مايكروسوفت وهي مشابهة لـ TensorFlow وتملك العديد من واجهات برمجة التطبيقات API للغات بايثون وجافا و C++‎ و C Caffe: مكتبة بايثون مفتوحة المصدر تساعد في تطبيقات الذكاء الاصطناعي وتناسب بشكل خاص مشاريع البحث الأكاديمي والتطبيقات الصناعية المتقدمة لكونها تتميز بسرعة المعالجة. Keras: مكتبة مبنية على TensorFlow وتوفر واجهة بايثون وهي واحدة من أفضل أدوات الذكاء الاصطناعي مفتوحة المصدر المستخدمة اليوم. إلى جانب العديد من أدوات الذكاء الاصطناعي التي يمكنك تعلمها مثل OpenNN و Google ML kit و Theano و Swift AI و AutoML و H2O التي تصلح لتطبيقات متنوعة، اختر من بينها ما يناسب احتياجاتك. دورة الذكاء الاصطناعي احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة. اشترك الآن مجالات الذكاء الاصطناعي إذا قررت تعلم الذكاء الصناعي ستلاحظ أنه علم واسع ومتشعب ويتفرع عنه عدة مجالات أو علوم فرعية وفيما يلي نذكر لك من باب الاطلاع أهم هذه المجالات. تعلم الآلة Machine learning التعلم العميق Deep Learning معالجة اللغات الطبيعية Natural Language Processing علم الروبوتات Robotics الشبكات العصبية الاصطناعية Artificial Neural Networks المنطق الترجيحي أو الضبابي Fuzzy Logic الأنظمة الخبيرة Expert systems لا تقلق إن بدت لك التسميات مربكة وصعبة فبعد أن تنتهي من مرحلة تعلم الأساسيات وتبدأ بالتطبيق العملي ستتوضح لك هذه المصطلحات بشكل أفضل وإليك وصفًا سريعًا لكل مجال من هذه المجالات وأهم استخداماته وتطبيقاته: تعلم الآلة Machine learning يركز هذا المجال على بناء أنظمة تدرب الآلة على بيانات قديمة ومعروفة والاعتماد عليها من أجل إصدار التنبؤات والقرارات بناءً على بيانات جديدة لم يتم التدرب عليها مسبقًا فهو يمكّن الآلة من التعلم وتطوير نفسها من مجموعات تجارب السابقة دون الحاجة إلى برمجة صريحة. على سبيل المثال يستخدم تطبيق خرائط جوجل كافة البيانات السابقة للأشخاص الذين سلكوا مسارًا معينًا كي يتنبأ بحركة المرور القادمة على هذا المسار وتطبيق DeepFace التابع لفيسبوك والذي يتعرف على الوجوه ويحدد الأشخاص الموجودين في صورة ما بناء على صور سابقة مخزنة لهم. التعلم العميق Deep Learning التعلم العميق هو فرع أكثر تخصصًا من التعلم الآلي ففي التعلم الآلي تحدد الميزات التي نريد تصنيف البيانات بناء عليها بشكل مسبق أما في التعلم العميق تتولى الآلة عملية استخراج الميزات ذات الصلة تلقائيًا، وهو يستخدم بنية خاصة تسمى الشبكات العصبية والتي تتكون من عدة طبقات لذا يسمى تعليم عميق. في هذا المجال يتم تدريب الآلة على مجموعة كبيرة من البيانات المصنفة والتعرف على مميزاتها مباشرة والاعتماد عليها في تصنيف البيانات المستقبلية بدقة عالية، وهو يستخدم في عدة مجالات مثل السيارات ذاتية القيادة للتعرف على الكائنات المحيطة وتمييزها مثل المشاة وإشارات المرور. معالجة اللغات الطبيعية Natural Language Processing يهتم هذا الفرع من فروع الذكاء الاصطناعي على جعل الآلة قادرة على فهم لغاتنا البشرية الطبيعية، ومن الأمثلة الشهيرة على تطبيقات هذا الفرع برامج روبوتات الدردشة، لا بد وأنك قد سمعت في الآونة الأخيرة عن ChatGPT. علم الروبوتات Robotics هذا المجال يجمع بين الهندسة الميكانيكية والكهربائية والتقنية ويتخصص في تطوير الروبوتات. والروبوت هو آلة قابلة للبرمجة تؤدي وظائف تشبه إلى حد كبير وظائف البشر ويمكن استثمارها في أي صناعة تقريبًا وعلى أي مستوى من الاستخدام فهناك روبوتات تستخدم في صناعة السيارات والتنظيف والطب وغيرها. ملاحظة: هناك روبوتات برمجية تسمى برامج الروبوت وهي برامج حاسوبية تنفذ المهام بشكل مستقل ومثال عليها روبوتات الدردشة الذي ذكرناه سابقًا لكن هذه الروبوتات لا تندرج ضمن هذا المجال لكونها لا تملك هيكل مادي فهي تنشأ داخل جهاز حاسوب وتتواجد على شبكة الإنترنت فقط. الشبكات العصبية الاصطناعية Artificial Neural Networks الشبكات العصبية الاصطناعية أو اختصارًا الشبكات العصبية هي أحد الفروع التخصصية للتعلم العميق والشبكة العصبية ماهي إلا مجموعة من الخوارزميات المنفذة بشكل يحاكي الدماغ البشري والتي تتكون من مجموعة من (العقد المتصلة التي تسمى الخلايا العصبية الصناعية والتي تشبه الخلايا العصبية للدماغ البشري. عندما تتعلم طريقة استخدام الشبكات العصبية ستتمكن من بناء تطبيقات متنوعة مثل التعرف على الصور والأصوات والوجوه والتحقق من صحة التوقيع اليدوي لشخص ما وتستخدم كذلك في توقعات سوق الأسهم وفي الكشف عن الأمراض في صور الأشعة السينية والأشعة المقطعية وغيرها الكثير من التطبيقات. المنطق الترجيحي أو الضبابي Fuzzy Logic المنطق الضبابي هو تقنية حسابية تعتمد على استخدام الترجيح لاتخاذ القرار ويمكنه الاعتماد على معلومات إدخال غير دقيقة أو فيها بعض الأخطاء، وكلمة Fuzzy تعني أمر غير مؤكد أو غير محدد وهي تختلف عن المنطق الحاسوبي الذي يعطي نتيجة محددة إما 1 أي صواب أو 0 أي خطأ فهو يعطي إجابة قريبة من الحقيقة بدرجة معينة. على سبيل المثال إذا كان لديك سؤال تريد الإجابة عليه بالمنطق الضبابي فلن تحصل على إجابة أكيدة إما نعم أو لا وستكون الإجابة التي ستحصل عليها من من قبيل ربما نعم أو ربما لا أو بالتأكيد لا. يستخدم المنطق الضبابي في العديد من التطبيقات مثل ضبط حرارة مكيفات الهواء وفق درجة الحرارة المحيطة والتحكم في مياه الغسالات حسب حجم الملابس ودرجة اتساخها ونوع الأوساخ وما إلى ذلك. الأنظمة الخبيرة Expert systems الأنظمة الخبيرة هي تطبيقات حاسوبية مخصصة لحل المشكلات المعقدة في مجال معين بطريقة تحاكي الخبراء من البشر فهي أنظمة تحسن أداءها بمرور الوقت لأنها تكتسب المزيد من الخبرة تمامًا كما يفعل البشر لكنها تتميز عنا نحن البشر في كونها أكثر دقة في النتائج فهي لا ترتكب الأخطاء البشرية من سهو ونسيان ولا تطلق أحكامها بناء على العواطف بل على الحقائق فقط. تستخدم الأنظمة الخبيرة في أي مجال يحتاج لاستخدام الآلات في إطلاق الأحكام أو التنبؤات بدلًا من البشر مثل اكتشاف أعطال المركبات والتحكم في إشارات المرور واستنتاج أسباب الأمراض وتوقع عمليات الاحتيال والمعاملات المشبوهة …إلخ. وهناك بعض التخصصات الأخرى التي تتداخل مع الذكاء الصناعي إلى حد كبير جدًا، لكنها لا تعتبر فرعًا من فروع الذكاء الصناعي مثل: الرؤية الحاسوبية وعلم البيانات. وكنا قد تحدثنا عن هذه الفروع بشيء من التفصيل في مقالة مجالات الذكاء الاصطناعي فارجع إليها لمزيد من التفصيل. خريطة تعلم الذكاء الاصطناعي أحد أكبر الأسباب التي تجعل الناس يبتعدون عن مجال الذكاء الاصطناعي هو أنهم لا يعرفون من أين يبدؤون ولا يجدون المصادر الجيدة باللغة العربية كما أن هناك الكثير من المصطلحات الصعبة نسبيًا والتي تعترض طريقهم عندما يبحثون عن موارد لتعلم الذكاء الاصطناعي وتجعلهم يشعرون بالإحباط في البداية. عمومًا، يمكنك أن تتعلم المجال إما بدخول أروقة الجامعة وهو الطريق الأطول الذي يأخذ عدة سنوات ولا توفر أغلب الجامعات تعلم مجال الذكاء الاصطناعي من البداية بل يكون ضمن برامج الماجستير والدراسات العليا، عدا عن التركيز على الجانب النظري والتقنيات القديمة في ظل التسارع الرهيب لمجال علوم الحاسوب عمومًا والذكاء الاصطناعي خصوصًا، وقد فصلنا هذه النقطة في فقرة "طرق لتعلم البرمجة" من مقال كيف تتعلم البرمجة: نصائح وأدوات لرحلتك في عالم البرمجة أو يمكنك الاعتماد على الدورات البرمجية والمخيمات البرمجية والكتب المتخصصة لتعلم المجال منها خصوصًا، وهذا الأسلوب أقصر وأكثر عملية وأسرع للدخول في سوق العمل. سنعطيك الآن خارطة طريق ومصادر تعلم الذكاء الاصطناعي يمكنك من خلالها بدء رحلتك بسهولة لتعلم الذكاء الصناعي. هنا لا أقول أنه طريق سحري؛ بمجرد إنهائه تختم المجال، لا إطلاقًا، إنما هو طريق مناسب جدًا للدخول في هذا المجال. 1. تمكن من الأساسيات هذا يشمل مبادئ علوم الحاسب والرياضيات والاحتمالات والإحصاء. لقد أشرنا إلى الأساسيات في القسم السابق، فبالنسبة للرياضيات وما يتعلق بها، فغالبًا قد أنهيت الثانوية أو على وشك إنهائها ودرست بالفعل الرياضيات وهذا كافٍ للانطلاق. بالنسبة لتخصص علوم الحاسوب، تحتاج إلى فهم الحواسيب وعملها وأساسيات التعامل معها والتعامل مع أنظمة التشغيل وكيفية برمجتها وكتابة برامج لها …إلخ، وإن كنت مهتمًا بالحواسيب منذ صغرك وتعرف كيفية التعامل مع أنظمة التشغيل فيمكنك تخطي هذه الخطوة وبدء تعلم أساسيات لغة برمجة. يمكنك أيضًا البدء مع دورة علوم الحاسب التي يقدّمها نخبة من المطورين والمبرمجين في أكاديمية حسوب والذين يتابعون تقدمك في كل مرحلة ويجيبون على أي سؤال في حال واجهت مشكلة أو كان لديك استفسار أو طلبت شرحًا إضافيًّا، وتتضمن هذه الدورة كل ماتحتاجه لتصبح على معرفة واسعة بعلوم الحاسب، وهذا يتضمن: مكونات الحاسب، أساسيات البرمجة، لغات البرمجة، البرمجة الكائنية، الخوارزميات وهياكل البيانات، أنظمة التشغيل، قواعد البيانات، الويب، تصميم البرمجيات وغيرها. أما بالنسبة للإحصاء والاحتمالات فمعظمها يُفترض أن تكون تلقيته خلال دراستك الثانوية. عمومًا هناك الكثير من الدورات والمراجع المتوفرة على الإنترنت يمكنك الرجوع إليها. 2. تعلم أساسيات البرمجة ومفاهيمها ستحتاج إلى كتابة الشيفرات وبرمجة التطبيقات لذا وقبل البدء مباشرة بتعلم لغة البرمجة -والتي غالبًا ستكون بايثون- وتصعيب المهمة عليك لأنك ستتعلم لغة البرمجة ومفاهيم البرمجة في الوقت نفسه، ابدأ بتعلم مفاهيم البرمجة وأساسياتها أولًا والتي تجدها في كل لغات البرمجة وبذلك يسهل عليك تعلم استخدام أي لغة برمجة أخرى مهام كانت سهلة أو صعبة. أضع بين يديك مجموعة مقالات مناسبة بهذا الصدد يمكنك الرجوع لها: دليلك الشامل إلى تعلم البرمجة تعلم أساسيات البرمجة كيف تتعلم البرمجة: نصائح وأدوات لرحلتك في عالم البرمجة دليلك الشامل إلى أنواع البيانات تعرف على هياكل البيانات Data Structures 3. تعلم لغة بايثون لغة بايثون هي اللغة الأساسية والأقوى لتطوير تطبيقات تعلم الآلة والذكاء الصناعي، يمكنك بالطبع تعلم لغات برمجة أخرى مثل جافا Java و C++‎ إلا أن لغة بايثون تعد من أفضل لغات الذكاء الصناعي بسبب المزايا العديدة التي تقدمها مثل وفرة مكتباتها وسهولة كتابة تعليماتها البرمجية ودعم المجتمع والمرونة والاستقلالية والسرعة. يمكنك تعلّم لغة بايثون من خلال دورة تطوير التطبيقات باستخدام لغة Python الشاملة من أكاديمية حسوب التي تبدأ معك من الصفر حيث تعلمك أساسيات البرمجة وحتى احترافها بلغة بايثون، ثم تعلمك أساسيات الذكاء الاصطناعي وتعلم الآلة بإنشاء تطبيقات عملية تضيفها في معرض أعمالك، كما أن الدورة تضمن لك دخول سوق العمل بعد التخرج مباشرةً. 4. تعلم مفاهيم الذكاء الاصطناعي بالتزامن مع دورة بايثون سالفة الذكر، يمكنك البدء بقراءة كتاب مدخل إلى الذكاء الاصطناعي وتعلم الآلة وهو من أهم مصادر تعلم الذكاء الاصطناعي تتعرف من خلاله أكثر على أساسيات علم الذكاء الاصطناعي وتعلم الآلة وتتعرف على أهم مصطلحاته وتطبيقاته في حياتنا اليومية. ويمكنك الاطلاع على العديد من الدروس والمقالات المتنوعة الخاصة بالذكاء الصناعي في قسم الذكاء الصناعي في أكاديمية حسوب. 5. تعلم المكتبات وأطر العمل الأساسية توفر لك المكتبات وأطر العمل طرقًا مختصرة للعمل في مشاريع الذكاء الاصطناعي وهنا لن تحتاج إلى تعلم جميع أُطر ومكتبات الذكاء الصناعي بالطبع، فالأمر يعتمد على الفرع والمواضيع التي ترغب بالتخصص فيها. وإليك بعض هذه الأطر والمكتبات ومجال استخدامها: لبناء الشبكات العصبية: تنسرفلو TensorFlow وكيراس Keras وباي تورش PyTorch. غالبًا يكفي أن تتعلم واحدة منها، وكمبتدئ يكفي كيراس. لاستخدام خوارزميات تعلم الآلة: يمكنك استخدام مكتبة ساي كيت ليرن scikit-learn التي تتضمن تحقيقات لأهم خوارزميات تعلم الآلة، مثل خوارزمية التوقع الخطي وأشجار القرار. لتحليل وفهم البيانات وتوزيعها والعلاقات بينها: يمكنك الاعتماد على مكتبات بايثون، مثل: ماتبلوتليب Matplotlib وسيبورن Seaborn. 6. تعلم المعالجة المسبقة البيانات Data Preprocessing لا تتعامل تطبيقات وخوارزميات الذكاء الاصطناعي مع البيانات التي تستخرجها من الوسط المحيط مباشرة حيث تكون هذه البيانات بحالة فوضوية ومبعثرة، لذا تحتاج من تعلم تقنيات مختلفة تساعدك على تحويل هذه البيانات إلى شكل أفضل وأكثر فائدة من خلال تطبيق عمليات التنظيف والتوحيد والتشذيب عليها. تسمى هذه العمليات بالمعالجة المسبقة للبيانات وهي تحول البيانات الأولية إلى تنسيق مفهوم ومفيد وبجودة عالية وهي مهمة للغاية في مجال الذكاء الاصطناعي. 7. ابدأ بإنشاء المشاريع عندما تحاول إتقان الذكاء الاصطناعي، فإن النظرية وحدها لا تكفي والنهج العملي سيعزز تعلمك ويعزز مهاراتك لذا لابد لك من البدء بإنشاء مشاريع برمجية في الذكاء الصناعي لكي تصبح متمرّسًا في هذا المجال. هنا أنصحك بقراءة كتاب عشرة مشاريع عملية عن الذكاء الاصطناعي والذي يعد أيضًا من أهم مصادر تعلم الذكاء الاصطناعي العربية، ستجد فيه العديد من المشاريع الخاصة بالذكاء الصناعي، وهي مناسبة جدًا للمبتدئين. وكي تطور فهمك لخوارزميات الذكاء الاصطناعي أكثر يمكنك بناء هذه الخوارزميات من الصفر، ابدأ بالمشروعات التي تتطلب خوارزميات بسيطة ثم نفذ مشاريع أصعب، وزد مستوى المهارة المطلوبة تدريجيًا. على سبيل المثال يمكنك تطوير خوارزمية يمكنها التنبؤ بالحالة المزاجية لأصدقائك بحسب منشوراته في وسائل التواصل الاجتماعي أو حالته على الواتس وترسل لهم رسالة للاطمئنان عليهم أو تفكر في أي تطبيق آخر مفيد لمجتمعك. 8. تقدم بطلب للحصول على تدريب بعد الانتهاء من تلك عملية التعلم، سيكون الوقت قد حان للتقدّم للحصول على تدريب في شركة ما فالتدريب طريقة رائعة للحصول على بعض الخبرة الفعليّة وتسهيل البحث عن وظيفة مناسبة لاحقًا ولزيادة فرصك في الحصول على تدريب، يمكنك القيام بما يلي: أنشئ معرض أعمال يتضمن كافة مشاريع الذكاء الاصطناعي التي عملت عليها ووضح مساهمتك فيها. أخبر الأشخاص في شبكاتك المهنية والشخصية أنك تبحث عن تدريب (على لينكد إن مثلًا). احضر اللقاءات المحلية وهاكاثونات الذكاء الاصطناعي. حافظ على تحديث حساباتك في الشبكات المهنية. استعد للمقابلة دومًا وحضر إجاباتك على أكثر أسئلة مقابلات الذكاء الاصطناعي شيوعًا. 9. الحصول على عمل غالبًا يوفر التدريب الخبرة والاتصالات المهنية التي تساعدك في الحصول على وظيفة لذا عند الانتهاء من تدريبك، تواصل مع جهات الاتصال التي طورتها لإعلامهم بأنك تبحث عن وظيفة دائمة. الجانب الأكثر قيمة عند التدرب في الشركات هو منحك فرصة لحل مشاكل العالم الحقيقي. تأكد من إبراز مشاريع الذكاء الاصطناعي التي عملت عليها خلال فترة التدريب عندما تناقش ذلك مع أصحاب العمل المحتملين، بما في ذلك المساهمات التي قدمتها. 10. اسأل ولا تتردد حاول التعرف على من هم في نفس المجال سواء متعلمين أو خبيرين وتابعهم على وسائل التواصل أو ابحث عنهم في المجتمعات إذ سيشكلون طبقة الدعم والمساعدة لك في رحلتك في هذا المجال وكذلك ستفعل عندما تتعلم وتصبح خيبرًا وتمد يد العون للداخل الجديد وهكذا، ولا تتردد بطرح أي سؤال أو طلب أي مساعدة ولا تخجل إن كان سؤالك بسيطًا أو يبدو تافهًا. يمكنك أيضًا أن تضيف سؤالًا في قسم الأسئلة والأجوبة الذي توفره أكاديمية حسوب لتحصل على إجابة لسؤالك واستفسارك من مبرمجين آخرين ولتضمن لك الحصول على الدعم والمساعدة التي تحتاج إليها في بداية تعلمك. نصائح لتعلم الذكاء الاصطناعي بسرعة إن خيارات تعلم الذكاء الاصطناعي كثيرة متشعبة وكي لا تشعر بالتشتت والضياع إليك بعض النصائح التي تسرع عملية تعلمك وتمكنك من تحقيق نتائج ملموسة بزمن قصير: حدد من البداية هدفك من التعلم واختر مجال الذكاء الاصطناعي المناسب لك للتركيز عليه والتخصص به مما يعطيك فرص أكبر وأولوية للعمل به لاحقًا. اكتب كل ما تحتاج إلى تعلمه من الأساسيات التي ذكرناها في سياق المقال وضع خطة منهجية له وابدأ عملية التعلم والتزم بها قدر المستطاع. عزز ما تعلمته وطبقه على مشاريع عملية متدرجة في الصعوبة مستعينًا بالأدوات والأطر المناسبة التي تسرع عملك. حاول الحصول على تدريب عملي في إحدى الشركات أو المنظمات واعمل على مشاريع تحل مشاكل واقعية وتقدم قيمة فعلية. لا تستسلم إذا شعرت بالإحباط خلال إحدى مراحل التعلم فهذا أمر طبيعي، خذ فترة استراحة قصيرة وواصل ما بدأت به فالمجال واعد ومشرق ويستحق بذل الجهد. أسئلة شائعة حول الذكاء الاصطناعي 1. هل يمكنني تعلم الذكاء الاصطناعي بنفسي؟ نعم فبالرغم من كون الذكاء الاصطناعي مجالًا متقدمًا ويتضمن مفاهيم رياضية وبرمجية متقدمة لكن إذا كان لديك خطة واضحة للتعلم والتزمت بجدول زمني منتظم واتبعت كل النصائح التي وردت في سياق المقال فستتمكن بلا شك من تجاوز أي صعوبات وتعلمه بشكل ذاتي. 2. هل يمكن تعلم الذكاء الاصطناعي دون معرفة البرمجة؟ رغم توفر العديد من البيئات والأدوات المخصصة لحلول الذكاء الاصطناعي والتي لا تحتاج لكتابة شيفرات برمجية أو تتطلب كتابة القليل جدًا منها مثل Amazon SageMaker و DataRobot إلا أنه من الضروري أن تملك أساسًا في إحدى لغات البرمجة المختصة في الذكاء الاصطناعي مثل بايثون أو جافا أو C++‎ لتكون مهندس ذكاء اصطناعي محترف وتتمكن من حل أي مشكلة تواجهها بمرونة وكفاءة. 3. كم من الوقت يستغرق تعلم الذكاء الاصطناعي؟ يعتمد الجواب هنا على الخبرات الأساسية المسبقة المتاحة لديك ومدى قدرتك على التعلم لكن تعلم كافة أساسيات الذكاء الاصطناعي قد يحتاج منك حوالي ستة أشهر لعام تقريبًا بعدها يمكنك البدء في تنفيذ مشاريع بسيطة تناسب المبتدئين وتطور مستواك تدريجيًا. 5. ما هي مهارات تعلم الذكاء الاصطناعي؟ يجب أن يمتلك المتخصص في الذكاء الصناعي مجموعة من المهارات الشخصية إلى جانب مهاراته الفنية في البرمجة ومعرفته الجيدة في الرياضيات والإحصاء ولعل أبرزها التفكير النقدي والتحليلي والتواصل الفعال مع الآخرين والقدرة على اتخاذ القرارات. 4. أين أعثر على أفكار مشاريع في الذكاء الاصطناعي؟ إذا كنت ترغب في التدرب على مشاريع الذكاء الاصطناعي ولا تستطيع العثور على فكرة ملهمة فإليك بعض الاقتراحات لعشرة مشاكل يمكنك محاولة حلها باستخدام تقنيات الذكاء الاصطناعي. تصنيف التعليقات المزعجة أو المسيئة في المواقع اقتراح المنتجات الملائمة لاهتمامات العملاء التعرف على لغة الإشارة كشف الأخبار الكاذبة والمضللة تطبيق لتحليل السير الذاتية واختيار أفضل المرشحين كشف مشاهد العنف في الصور أو مقاطع الفيديو أداة التصحيح التلقائي للغة العربية التنبؤ بسعر المبيعات تطبيق التعرف على الوجه لفتح قفل الهاتف تطبيق للتنبؤ بالعمر وابحث وتابع صفحات ومنشورات ومواقع تتعلق بالمجال ومنها ستستلهم الكثير من الأفكار. 5. هل الذكاء الاصطناعي مطلوب في العالم العربي؟ نعم بكل تأكيد فالطلب على تخصص الذكاء الاصطناعي يزداد على مستوى العالم ككل وعلى مستوى الوطن العربي بشكل خاص وهو يدخل حيز التطبيق في كافة المجالات والقطاعات فإذا كان لديك شغف في تعلم الذكاء الاصطناعي أنصحك أن لا تضيع الوقت وتبدأ من الآن باستكشاف هذا المجال الثوري الذي سيكون سمة مميزة للعصر الحديث. خاتمة قدمنا في هذه المقالة دليلًا تفصيليًا سيساعدك على تعلم الذكاء الاصطناعي بالطريقة الحديثة. بدأنا بمقدمة أساسية للذكاء الاصطناعي وأشرنا إلى فروعه الواسعة. رأينا أيضًا المتطلبات الأساسية التي ستحتاجها قبل أن تبدأ بتعلم الذكاء الاصطناعي. ناقشنا خارطة طريق مفصلة يمكنك اعتمادها لتبدأ بسلاسة رحلة تعلم الذكاء الصناعي؛ بدأنا بأساسيات الذكاء الاصطناعي التي تضم جميع المفاهيم المهمة والموضوعات المطلوبة التي يجب أن تتعلمها لضمان رحلة سلسة. تحدثنا أيضًا عن أهم فروع الذكاء الصناعي والنصائح التي تساعدك على تعلمه بسرعة. لا شك أن الذكاء الاصطناعي مجال واسع ومربك بسبب المصطلحات التقنية الكثيرة التي تصادفها ونأمل أن يكون هذا الدليل البسيط قد ساعدك في تكوين فهم واضح عنه ومهد لك طريق التعلم وأجاب عن كافة تساؤلاتك حوله. اقرأ أيضًا برمجة الحاسوب للمبتدئين تعلم البرمجة مستقبل الذكاء الاصطناعي فوائد الذكاء الاصطناعي
    2 نقاط
  22. نعرفك في مقال اليوم على كتب برمجة عربية مميزة تصلح لتكون مراجع مفيدة تساعدك في دراسة البرمجة وفهمها بطريقة منهجية ومنظمة، ونتعرف على مميزات كل كتاب منها، ونوضح لك ماذا ستتعلم من كل كتاب ونوفر رابط لتحميله. فكما تعرف فإن مصادر وطرق تعلم البرمجة اليوم كثيرة ومتنوعة، ولكل منا طريقة تناسبه في التعلم فإذا كنت من معشر المبرمجين أو الطلاب الذين يفضلون القراءة المنظمة ويجدون أن أسلوب التعلم من كتب برمجة متخصصة أكثر فائدة من طرق التعلم الأخرى كمقاطع الفيديو أو متابعة الدروس المتفرقة هنا وهناك فهذا المقال لك. أهمية كتب تعلم البرمجة لا شك أن فوائد تعلم البرمجة كثيرة، وأيًا كان الأسلوب الذي تفضله في تعلم البرمجة فإن قرار تعلمها بحد ذاته خيار رائع وذكي، لكن التعلم من كتب البرمجة يتميز عن غيره من طرائق التعلم بعدة مميزات وفوائد ومن أبرزها: تعرض كتب البرمجة المفاهيم والمعلومات بالتدريج من الأسهل للأصعب، وتوزعها في صفحات مرقمة ومرتبة ضمن فصول متعددة ما يساعدك على تنظيم دراستك بحيث تدرس يوميًا عددًا محددًا من الصفحات أو الفصول. تعرض الكتب المعلومات بطريقة شاملة ومفصلة من الألف للياء ما بجنبك التشتت في كثرة المصادر لتكتمل لك الصورة الكاملة لما تتعلمه. تفهرس الكتب محتوياتها بطريقة محكمة ما يسهل عليك العثور على أي معلومات تريدها ويمكنك من العودة لها عند الحاجة. توفر الكتب معلومات مفصلة وواضحة عن المفاهيم والتقنيات التي تشرحها، وهذا سيساعدك على استيعاب هذه المفاهيم بشكل أفضل من مصادر التعلم الأخرى. يعزز التعلم من كتب البرمجة القدرة على التعلم الذاتي وقراءة المحتوى بالسرعة التي تناسبك. تسمح لك كتب البرمجة الإلكترونية بنسخ الشيفرات أو الأكواد البرمجية لتجربتها وتعديلها بسهولة. تتميز الكتب بجودة وموثوقية المعلومات التي توفرها فقد خضعت للتحرير والمراجعة والتدقيق أكثر من مرة. لا يعني هذا أن الكتب هي أفضل طريقة لتعلم البرمجة بالنسبة للجميع، فما يناسبك قد لا يناسب غيرك، المهم أن تختار الأسلوب المناسب لك والذي تشعر بأنك تستطيع من خلاله فهم ما تتعلمه بالطريقة المثلى، كما يمكنك الدمج بين عدة أساليب تعلم إن كنت تشعر أن كل أسلوب يقدم لك فائدة مختلفة، لكن انبته لأن تنظم وقتك في التعلم ولا تشتت نفسك في كثرة المصادر. إن كنت مهتمًا بالتعلم من كتب تعلم برمجة عربية شاملة، فقد وفرت لك أكاديمية حسوب مجموعة من أفضل كتب البرمجة المجانية باللغة العربية يمكنك تحميلها واعتمادها كمصادر موثوقة ومنهجية لتعلم لغات البرمجة والتقنيات المختلفة. أفضل كتب برمجة بالعربية مهما كان التخصص أو مجال البرمجة الذي تنوي تعلمه واحترافه فستجد في قائمة كتب أكاديمية حسوب العديد من الكتب المساعدة التي يمكنك اعتمادها كمراجع موثوقة لتعلم هذا التخصص، وفي فقراتنا التالية سنسلط الضوء على قائمة بمجموعة منتقاة لكتب برمجية اخترناها لتناسب المبتدئين الذين بدأوا للتو رحلتهم في تعلم البرمجة. كتاب تعلم البرمجة للمبتدئين البرمجة بلغة بايثون البرمجة بلغة سي نحو فهم أعمق لتقنيات HTML5 ملاحظات للعاملين بلغة CSS دليل JavaScript الشامل - الجزء الأول البرمجة بلغة جافا سكربت تصميم قواعد البيانات .هياكل البيانات للمبرمجين .البرمجة بلغة رست ملاحظات للعاملين بلغة SQL الدليل العملي إلى قواعد بيانات PostgreSQL لنتعرف في الفقرات التالية على شرح موجز لكل كتاب من هذه الكتب وأهم المواضيع والتقنيات التي يتناولها. 1. كتاب تعلم البرمجة للمبتدئين هذا الكتاب هو ترجمة عريبة لكتاب Learning to Program للمبرمج آلان جولد Alan Gauld وهو أحد المراجع الممتازة التي اختارتها أكاديمية حسوب بعناية ويصلح ليكون كتاب تعلم البرمجة من الصفر والتعرف على النظريات والتقنيات الأساسية لبرمجة الحواسيب، يفترض هذا الكتاب وجود معرفة مسبقة لديك بأحد أنظمة التشغيل مثل ويندوز أو ماك أو لينكس ومعرفة ببعض المفاهيم الرياضية الأساسية، وهو يعتمد في الشرح على لغة البرمجة بايثون Python التي تعد من أسهل لغات البرمجة وأكثرها قوة وتفضيلًا بين أوساط المبرمجين وقد اعتمدها الكاتب كمثال لتعلم البرمجة مع التأكيد على أن فهم أساسيات البرمجة بأي لغة يمكنك من الانتقال لتعلم أي لغة برمجة أخرى بسهولة وسلاسة. فإذا كنت ترغب بدخول عالم البرمجة وتبحث عن كتاب مناسب يبين لك أهمية تعلم البرمجة ويمكنك من التفكير بطريقة تشابه طريقة تفكير الحاسوب لحل المشكلات البرمجية ويوضح لك أنواع لغات البرمجة والتعامل مع قواعد البيانات وكيف تكتب البرامج الحاسوبية بحيث تكون سهلة الاستخدام وغيرها من المفاهيم البرمجية التي يحتاجها أي مبرمج لمعرفتها فهذا الكتاب بداية جيدة لك. 2. كتاب البرمجة بلغة بايثون إذا كنت تبحث عن لغة مريحة وممتعة وسهلة لتعلم البرمجة فيمكن أن تختار تعلم لغة البرمجة بايثون Python فهي لغة شهيرة وتتميز بسهولة كتابة وقراءة أكوادها البرمجية كما ذكرنا سابقًا، كما أنها تعد الخيار الأول للمؤسسات الأكاديمية والتدريبية لتعليم البرمجة للطلاب والمبتدئين وما يميز لغة بايثون أيضًا هو أنها لغة متعددة الاستخدامات ولها العديد من التطبيقات في مجال علوم الحاسوب من أبرزها تطوير الويب والذكاء الصناعي وتعلم الآلة وعلوم البيانات وهي لغة مطلوبة بشدة في سوق العمل. يتميز هذا الكتاب المترجم للعربية عن كتاب How to code in Python للمؤلفة ليزا تاغليفيري Lisa Tagliaferri بأنهيشرح لك كافة المفاهيم البرمجية الأساسية في بايثون بدءًا من كتابة أول برنامج لك وصولًا لمفاهيم برمجية مثل البرمجة كائنية التوجه OOP وشرح طريقة إنشاء الأصناف الكائنات في بايثون بأسلوب سهل وواضح. 3. كتاب البرمجة بلغة سي C تعد لغة البرمجة سي C من لغات البرمجة المشهورة والمناسبة للمبتدئين والمحترفين في تعلم البرمجة على حد سواء، فهي تتميز بسرعتها وسهولة تعلمها وتوافقها مع مختلف المنصات وأنظمة التشغيل إلى جانب قوتها وكفاءتها وتنوع استخدامها، فهي تمكن المبرمج من تطوير مختلف أنواع البرامج والأنظمة وتتيح له التحكم الكامل والوصول إلى الموارد والتعامل مع هياكل البيانات ولا تقيده بقواعد صارمة. هذا الكتاب مترجم من كتاب The C Book للمؤلفين الثلاثة مايك باناهان Mike Banahan وديكلان برادي Declan Brady ومارك دوران Mark Doran وهو كتاب برمجة شامل يستهدف المبتدئين والمحترفين على حد سواء حيث يشرح كافة المواضيع التي تحتاج لتعلمها حول لغة سي بدءًا من طريقة كتابة البرنامج الأول بلغة سي ويشرح أساسيات اللغة كالمتغيرات وأنماط المعطيات وبنى التحكم والدوال البرمجية والمصفوفات والمؤشرات وهياكل البيانات والمكتبات وغيرها من المفاهيم النظرية، وصولًا للتطبيقات العملية التي تعزز كل ما تعلمته من مفاهيم. فإذا كنت مهتمًا بتعلم لغة سي C وتبحث عن كتاب لتعلم البرمجة يساعدك على فهم كافة المبادئ البرمجية وتطوير البرامج بطريقة شاملة وتسلسل منهجي فهذا الكتاب ملائم جدًا للبدء. 4. كتاب نحو فهم أعمق لتقنيات HTML5 يحتاج أي شخص يرغب في برمجة أو تطوير موقع ويب إلى تعلم لغة HTML فلغة HTML هي اللغة المستخدمة لتوصيف وإنشاء الهيكل الأساسي لموقع الويب، وفي حال كان مهتمًا بالبدء بتعلم تطوير الويب فهذا الكتاب سيكون مرجعًا مفيدًا بالتأكيد. هذا الكتاب هو الترجمة العربية لكتاب Dive Into HTML5 للمؤلف مارك بيلجرم Mark Pilgrim وهو مرخص برخصة المشاع الإبداعي CC BY 3.0 وقد نشرته دار نشر O’Reilly لاحقًا باسم HTML5: Up and Running، ستجد في هذا الكتاب شرحًا وافيًا لكل ما تحتاج لمعرفته حول أساسيات HTML5 وهو أحدث إصدار من HTML فقد دعم هذا الإصدار العديد من الوسوم والتقنيات التي لم تكن في الإصدارات السابقة. كما ستجد في فصول الكتاب شرحًا معمقًا لأهم تقنيات ومفاهيم HTML5 مثل تقنيات الرسم على صفحة الويب وترميز وتشغيل مقاطع الفيديو، وبناء النماذج، وتحديد الموقع الجغرافي، وإنشاء التطبيقات التي تعمل دون اتصال، وتضمين البيانات الوصفية microdata و metadata التي تعزز تحسين محركات البحث SEO مع توضيح الاستخدامات الأساسية لهذه المفاهيم بأمثلة علمية داعمة. 5. كتاب ملاحظات للعاملين بلغة CSS لغة CSS هي لغة تنسيق صفحات الويب ويحتاج أي مطور إلى تعلمها إلى جانب لغة HTML كي يتمكن من إنشاء صفحات ويب ذات مظهر جميل واحترافي، وهي تتكامل مع لغة HTML المستخدمة لتوصيف مواقع الويب، وعلى الرغم من أن لغة CSS بسيطة وسهلة التعلم إلا أن احترافها يتطلب الكثير من الممارسة والتجريب لاسيما عندما تزداد العناصر في صفحة الويب التي تنسقها، لذا ستحتاج لامتلاك فهم عميق لكيفية تنسيق وترتيب العناصر باستخدام CSS كي تنسق مظهر الموقع بالصورة المطلوبة. وهذا ما يحاول أن يوفره لك هذا الكتاب فهو مترجم عن كتاب CSS Notes For Professionals المبني على توثيق موقع StackOverflow وقد شارك في إعداده عدد كبير من المساهمين في موقع ستاك أوفرفلو StackOverflow المشهور بين أوساط المبرمجين وبقراءته ستمتلك أهم المهارات التي تساعدك على التعامل مع لغة CSS كالمحترفين. يبدأ الكتاب من شرح أساسيات لغة CSS ويوضح مفهوم النموذج الصندوقي Box Model في CSS كما يعلمك كيف تنسق العناصر المختلفة، وكيف تتحكم في تخطيط الصفحة وتضبط محاذاة عناصرها، وكيف تجعل موقعك متجاوب مع أجهزة الجوال باستخدام استعلامات الوسائط Media Queries، وكيف تضيف انتقالات وحركات تفاعلية في صفحات الموقع، وغيرها الكثير من المواضيع المتقدمة المفيدة والشيفرات البرمجية المفيدة التي كتبها محترفون يمتلكون خبرة واسعة في استخدام CSS. 6. دليل JavaScript الشامل - الجزء الأول لغة البرمجة جافا سكريبت JavaScript هي لغة البرمجة التي ستفكر بتعلمها بعد الانتهاء من تعلم HTML وCSS فإذا قررت تعلم تطوير الويب لجعل صفحات الويب تفاعلية. تعد لغة جافا سكريبت JavaScript من لغات البرمجة سهلة التعلم والاستخدام للمبتدئين مقارنة بلغات برمجة أخرى مثل جافا أو ++C لكن تعلمها سيكون أصعب قليلًا من تعلم HTML و CSS فهي لغة برمجة فعلية وليست لغة توصيف أو تنسيق وتتضمن عمليات برمجية ومنطقية مثل التحقق من مدخلات المستخدم ومعالجة البيانات وغيرها من المفاهيم التي ستكون جديدة عليك إذا لم تكن على دراية بلغة برمجة سابقة. فإذا كنت تبحث عن كتاب برمجة مناسب للبدء بتعلم لغة جافا سكريبت فهذا الكتاب يناسبك تمامًا فهو يعد مرجعًا تعليميًا ممتازًا للتعلم وهو ترجمة عربية لكتاب The JavaScript Language: Part 1 لكاتبه إيليا كانتور Ilya Kantor وهو مقسم إلى عدة أقسام ويتناول مواضيع متنوعة حول لغة جافا سكريبت JavaScript، بدءًا من الأساسيات ويشرح العديد من المفاهيم مثل أنواع البيانات في جافا سكريبت، والتعامل مع الأخطاء وتصحيحها ومفهوم الدوال والتعامل معها، إلى جانب مفهوم البرمجة كائنية التوجه OOP والأصناف Classes والوحدات Modules وكيفية استيرادها واستخدامها في البرامج، كما يتضمن العديد من الأكواد والتطبيقات العملية التي تساعدك في تطبيق ما تتعلمه من مفاهيم. وهناك جزء ثانٍ لهذا الكتاب يتحدث عن استعمال جافا سكريبت في المتصفحات، وجزء ثالث يتحدث عن مواضيع متفرقة ومتقدمة عن جافا سكريبت ليكمل الجزأين السابقين ويتمم الحديث عن لغة جافا سكريبت ليكون الكتاب بأجزائه الثلاثة مرجعًا كاملًا عن لغة جافا سكريبت متعددة المجالات والتطبيقات. 7. كتاب البرمجة بلغة جافا سكريبت هذا الكتاب هو كتاب آخر من أفضل كتب تعلم البرمجة بلغة جافا سكريبت باللغة العربية وهو نسخة مترجمة لكتاب Eloquent JavaScript لصاحبه مارين هافربيك Marijn Haverbeke يبدأ معك من الصفر تمامًا ويشرح كافة مبادئ البرمجة الأساسية بلغة جافا سكريبت JavaScript. يقسم هذا الكتاب إلى ثلاثة أجزاء رئيسية تتناول مواضيع متعددة في البرمجة باستخدام جافا سكريبت إذ يناقش الجزء الأول أساسيات لغة جافا سكريبت، ويركز الجزء الثاني على استخدام جافا سكريبت في متصفحات الويب، ويتطرق الجزء الثالث لشرح بيئة Node.js التي تمكنك من تشغيل جافا سكرببت خارج بيئة المتصفح. وأخيرًا يقدم لك الكتاب عدة مشاريع تطبيقية عملية تعزز ما تعلمته مثل مشروع بناء رجل آلي أو روبوت عبر جافا سكريبت، وبرنامج رسم بالبكسلات، ومشروع بناء موقع ديناميكي، وغيرها من المشاريع المنوعة التي تجعل تعلم البرمجة بجافا سكربيت أكثر متعة. وإذا كنت قد أنهيت تعلم جافا سكريبت وتبحث عن كتب برمجة أكثر تقدمًا تشرح أطر عمل ومكتبات جافا سكريبت فيمكنك تحميل كتاب أساسيات إطار العمل Vue.js الذي يشرح بالتفضيل طريقة التعامل مع إطار العمل فيو جي إس Vue.js المخصص لبناء الواجهات الأمامية لمواقع وتطبيقات الويب، وكتاب البرمجة باستخدام Node.js الذي يساعدك في تعلم تطوير الواجهات الخلفية back-end أو مجال التطوير الشامل full-stack باستخدام لغة جافاسكريبت. 8. كتاب تصميم قواعد البيانات يعد هذا الكتاب من الكتب المهمة التي يحتاج أي مبرمج أو مطور يريد استخدام قواعد بيانات في تطبيقاته إلى تعلمها، فهو يوفر للقارئ شرحًا شاملًا ووافيًا عن عملية تصميم قواعد البيانات التي تعد مرحلة أساسية وحاسمة في تطوير أي نظام برمجي يتعامل مع البيانات وينبغي التفكير فيها وتخطيطها بعناية قبل البدء بتنفيذها برمجيًا. يتناول الكتاب شرح كافة المفاهيم الأساسية المتعلقة بقواعد البيانات فهو يبدأ أولًا بتغطية كل المفاهيم المتعلقة بقواعد البيانات بدءًا من شرح فكرة ما هي قاعدة البيانات وما مكوناتها وما الفرق بينها وبين أي نظام تخزين بيانات، ثم يشرح عمليات نمذجة البيانات وتصميم الجداول والعلاقات بينها وطريقة رسم مخطط نموذج الكيان والعلاقة ER الذي يصف قاعدة البيانات ويوضح كافة جداولها والعلاقات فيما بينها، كما يشرح طريقة تحويل هذا المخطط إلى قاعدة بيانات فعلية باستخدام لغة الاستعلام البنيوية SQL إلى جانب التطرق لأشهر أنظمة إدارة قواعد البيانات DBMS. هذا الكتاب مترجم عن كتاب Database Design - 2nd Edition لصاحبيه إيدرين وات Adrienne Watt ونيلسون إنج Nelson Eng وهو مبني في الأصل على عدة مصادر ركيزتها كتاب Database Design للمؤلف الأول إيدرين وات، وهو كتاب مرجعي مهم تعتمده بعض الجامعات لتدريس مادة تصميم قواعد البيانات في قسم علوم الحاسوب، فإذا كنت مهتمًا في تعلم المزيد عن تصميم قواعد البيانات وكيفية تنفيذها برمجيًا أنصحك بتحميل هذا الكتاب فسوف يفيدك بكل تأكيد. 9. كتاب هياكل البيانات للمبرمجين يعد هذا الكتاب من كتب البرمجة الممتازة لأي مبرمج أو مطور راغب بتعلم هياكل البيانات والخوارزميات بأسلوب واضح وبسيط ويركز على الجانب العملي وهو عبارة عن ترجمة لكتاب البرمجة الشهير Think Data Structures لمؤلفه Allen B. Downey والذي يعد مرجعًا عمليًا في شرح موضوعي هياكل البيانات والخوارزميات. يبدأ هذا الكتاب بمقدمة عن هياكل البيانات والخوارزميات، ثم ينتقل إلى شرح أهم هياكل البيانات المركبة التي تحتاج لاستخدامها عند كتابة البرامج الحاسوبية، مثل المصفوفات، والقوائم والمكدسات، والأشجار كما يشرح الكتاب أيضًا مفهوم الخوارزميات ويشرح أبرز أنواع الخوارزميات مثل خوارزميات الترتيب والبحث، كما يقدم الكتاب أيضًا بعض الأساسيات التي تحتاجها في تخصص هندسة البرمجيات مثل التعرف على مفهوم نظم التحكم بالإصدارات version controls، واختبار الوحدات unit testing وغيرها من المفاهيم المفيدة لأي مبرمج. 10. كتاب البرمجة بلغة رست يأخذ هذا الكتاب بيدك لتعلم لغة البرمجة رست Rust من الصفر حتى الاحتراف، حيث تتميز هذه اللغة بقدرتها على كتابة برمجيات أسرع وأكثر وثوقيّة وتحقق للمبرمج تحكمًا كبيرًا بالتفاصيل منخفضة المستوى مثل استخدام الذاكرة بمرونة كبيرة وهو مترجم عن الكتاب The Rust Programming Language لكاتبيه ستيف كلابنيك Steve Klabnik وكارول نيكلز Carol Nichols ويتميز بسهولته ولغته البسيطة التي تساعدك على التعلم بسهولة، لكنه يفترض أنك على دراية بالبرمجة وبكتابة أكواد برمجية بإحدى لغات البرمجة الأخرى وهو يدمج بين المفاهيم النظرية، والمشاريع العملية ليحقق تجربة تعلم شاملة ومتكاملة. ستتعلم من خلال هذا الكتاب مواضيع مختلفة في لغة البرمجة رست، بداية من توضيح مبادئ البرمجة الأساسية مثل المتغيرات وأنواع البيانات وكتابة الدوال ثم يشرح مفهوم الملكية وكيفية استخدام الهياكل لتنظيم البيانات ومبادئ البرمجة كائنية التوجه OOP والأنماط patterns، كما يشرح مواضيع متقدمة مثل الأنواع المعممة والسمات ومفاهيم البرمجة غير الآمنة Unsafe Rust والماكرو Macros، كما يعرفك على كيفية كتابة الاختبارات الآلية والتعامل مع الأخطاء البرمجية، ويقدم لمحة عن أداة Cargo وهي أداة لإدارة المشاريع في Rust، ويتعمق في مفهوم المؤشرات الذكية والبرمجة المتزامنة الآمنة، ويختتم بفصول عملية تشرح بناء خادم ويب متعدد المهام باستخدام لغة رست Rust. 11. كتاب ملاحظات للعاملين بلغة SOL هذا الكتاب من كتب برمجة قواعد البيانات التي لا غنى عنها لأي مبرمج أو متخصص في علوم الحاسوب مهتم بتعلم لغة SQL أو لغة الاستعلامات البنيوية Structured Query Language التي تعد لغة برمجة قياسية تستخدم في معالجة وإدارة قواعد البيانات، وتعتمدها كافة أنظمة إدارة قواعد البيانات RDBMS فمن خلال تعليمات SQL يمكنك إجراء عمليات مباشرة على البيانات، مثل تخزينها في قاعدة بيانات أو جلبها منها أو التعديل على البيانات المخزنة أو نسخها احتياطيًا وغيرها من المهام. وقد اعتمد هذا الكتاب على أحد أفضل كتب برمجة SQL وهو كتاب SQL Notes For Professionals من موقع GoalKicker المبني بدوره على توثيق موقع StackOverflow وساهم في إعداده عدد كبير من المساهمين على موقع ستاك أوفر فلو StackOverflow الشهير وهو يغطي المفاهيم الأساسية والمتقدمة للغة SQL بدءًا من كتابة استعلامات بسيطة لجلب البيانات، وتنفيذ تعليمات شرطية على البيانات، وتعليمات إدراج وحذف البيانات، وأهم دوال التعامل مع البيانات، وجلب البيانات من عدة جداول، وإدارة المستخدمين، وتنظيم وتأمين شيفرات SQL، وغيرها من المفاهيم المتنوعة، كما أنه يجمع بين الشرح النظري والأمثلة العملية لضمان فهم جيد لهذه المفاهيم. 12. كتاب الدليل العملي إلى قواعد بيانات PostgreSQL ستحتاج في رحلة تعلم البرمجة وقواعد البيانات إلى تعلم استخدام أحد أنظمة إدارة قواعد البيانات DBMS كي تنظم ملفات قاعدة البيانات الخاصة بك وتوفر طريقة فعالة لإنشاء هذه الملفات وتحريرها ومعالجة البيانات الموجودة فيها، ومن أهم الأنظمة المستخدمة لإدارة قواعد البيانات نظام بوست غريس PostgreSQL وهو نظام إدارة قواعد بيانات علائقي Relational DBMS أي أنه يخزن البيانات في جداول مترابطة مع بعضها وهو يستخدم في العديد من تطبيقات الويب والهواتف المحمولة وتطبيقات تحليل البيانات. يبدأ هذا الكتاب من الصفر تمامًا إذ يشرح طريقة تثبيت PostgreSQL على جهازك وكيفية إدارة قواعد البيانات باستخدامه، كما يشرح أساسيات استعمال لغة SQL في PostgreSQL ويتطرق أيضًا لشرح مواضيع متقدمة في إدارة قواعد البيانات مثل النسخ الاحتياطي، وإدارة الأداء، وإدارة استخدام الذاكرة في PostgreSQL، كما يوضح أهم أوامر التعامل مع قواعد البيانات من خلال صدفة psql كالاتصال بقاعدة بيانات، واستعراض الفهارس، وتنسيق المخرجات، وغيرها من الأوامر المفيدة الأخرى. هذا الكتاب هو ترجمة عربية بتصرف للدليل PostgresGuide لمؤلفه كريج كيرستينز Craig Kerstiens إلى جانب عدة مواضيع إضافية تعزز محتوى الكتاب وتسد النقص في الدليل الأصلي، وهو يتميز بدمج التعلم النظري مع العملي، فإذا كنت تبحث عن كتاب برمجة قواعد بيانات يناسب المبتدئين ويساعدك في الوصول إلى مستوى متقدم في التعامل مع قواعد البيانات أنصحك بقراءة هذا الكتاب القيم. الخلاصة تعرفنا في مقال اليوم على أفضل كتب برمجة للمبتدئين باللغة العربية، وإذا كنت من محبي القراءة وتريد المزيد من الكتب فستجد في قسم كتب أكاديمية حسوب مجموعة كتب برمجة متنوعة أخرى أكثر تقدمًا، كما ستجد العديد من الكتب المفيدة في تخصصات أخرى مثل كتب التصميم وريادة الأعمال والتسويق والعمل الحر وكتب تخصص DevOps وغيرها لذا أنصحك أن تطلع على هذا القسم وتحمل الكتب التي تناسب اهتمامك وميولك وتضع خطة لإتمام قراءتها والاستفادة من معلوماتها القيمة. وحبذا لو تشاركنا في قسم التعليقات أسفل المقال ما هو أفضل كتاب لتعلم البرمجة استفدت منه، وهل هناك كتب برمجة جيدة تنصح الآخرين بقراءتها؟ اقرأ أيضًا دليلك الشامل لتعلم البرمجة كيف تتعلم البرمجة: نصائح وأدوات لرحلتك في عالم البرمجة اكتشف ما هي البرمجة وما أهمية تعلمها أسهل لغات البرمجة
    2 نقاط
  23. شهد الذكاء الاصطناعي Artificial Intellegence تحولًا ملحوظًا في العقد الأخير من الزمن، حيث خرج من عوالم الخيال العلمي إلى حياتنا اليومية. إنه القوة المُشغّلة للمساعدين الافتراضيين وأدوات التشخيص الطبي المتطورة والسيارات ذاتية القيادة وعمليات صنع القرار المعتمدة على البيانات في مختلف الصناعات وعدد لا يحصى من التطبيقات الأخرى التي تعيد تعريف كيفية تفاعلنا مع التكنولوجيا. ولكن ما الذي يُمكّن ثورة الذكاء الاصطناعي هذه بالضبط؟ خلف الكواليس، إنه عالم مكتبات وأطر عمل الذكاء الاصطناعي الرائع. مكتبات وأطر عمل الذكاء الاصطناعي هي من يمكّن المطورين من تحويل مفاهيم الذكاء الاصطناعي إلى واقع. فهي توفر اللبنات الأساسية والأدوات والموارد اللازمة لصياغة أنظمة ذكية، مما يجعل عملية التطوير أكثر كفاءة ويمكن تحقيقها أكثر من أي وقت مضى. في هذه المقالة الشاملة لمكتبات وأطر عمل الذكاء الاصطناعي، سنكشف عن أهمية مكتبات وأطر عمل الذكاء الاصطناعي ونفهم سبب أهميتها ونتعمق في أهم وأبرز الخيارات التي تساعد مطوري الذكاء الاصطناعي في جميع أنحاء العالم على أداء مهامهم. الفرق بين مكتبات الذكاء الاصطناعي وأطر عمل الذكاء الاصطناعي مكتبات الذكاء الاصطناعي عبارة عن مقتطفات أو وحدات برمجية مكتوبة مسبقًا توفر عددًا كبيرًا من الدوال Functions والأصناف Classes المصممة لأداء مهام محددة. يمكن أن تتراوح هذه المهام من معالجة اللغة الطبيعية NLP والرؤية الحاسوبية CV إلى التعلم المعزز RL والتعلم العميق DL. على عكس الأطر، لا تفرض المكتبات بنية محددة على المشروع بأكمله. وبدلاً من ذلك، فهي تقدم حلولاً محددة للمشكلات المستهدفة، مما يجعلها أدوات متعددة الاستخدامات للمطورين. عمومًا، تتصف أطر العمل بما يلي: الكفاءة: تعمل أطر عمل الذكاء الاصطناعي على تبسيط عملية التطوير من خلال توفير الأدوات والمكتبات والوظائف المعدة مسبقًا، مما يقلل حاجة المطورين إلى إعادة اختراع العجلة. تعمل هذه الكفاءة على تسريع تطوير مشروع الذكاء الاصطناعي. قابلية التوسع: توفر أطر العمل قابلية التوسع، مما يسمح للمطورين بالانتقال من التجربة على جهاز واحد إلى نشر النماذج على مجموعات من الأجهزة القوية أو حتى بيئات الحوسبة الموزعة. دعم المجتمع: تتمتع العديد من أطر عمل الذكاء الصناعي بدعم مجتمعي واسع النطاق. يُترجم هذا إلى ثروة من الموارد والبرامج التعليمية ومجتمع من المطورين الذين يمكنهم المساعدة في حل المشكلات، مما يجعل التطوير أكثر سلاسة. قابلية التشغيل البيني: غالبًا ما تدعم أطر عمل الذكاء الصناعي لغات برمجة متعددة ويمكن دمجها مع أدوات أخرى، مما يعزز مرونتها وتوافقها مع الأنظمة الحالية. تحسين الأداء: تتضمن تقنيات التحسين لجعل نماذج الذكاء الصناعي تعمل بشكل أسرع وتستهلك موارد أقل، وهو أمر بالغ الأهمية للتطبيقات التي تعمل في الزمن الحقيقي Real Time والأجهزة محدودة الموارد. باختصار، تعمل مكتبات وأطر الذكاء الصناعي على تمكين المطورين من التركيز على بناء نماذج الذكاء الصناعي وتحسينها بدلًا من التورط في تعقيدات التنفيذ على المستوى المنخفض، مما يجعل تطوير الذكاء الصناعي أكثر سهولة وكفاءة. لمزيد من التفاصيل، ارجع إلى مقال تعرف على مفهوم إطار العمل Framework وأهميته في البرمجة. أطر عمل الذكاء الاصطناعي تبرز أطر عمل الذكاء الاصطناعي باعتبارها الأساس الذي تُبنى عليه تطبيقات الذكاء الاصطناعي، إذ ذكرنا أن هذه الأطر عبارة عن حزم برمجية شاملة مصممة لتبسيط وتسريع عملية إنشاء نماذج وحلول الذكاء الاصطناعي. إنها توفر للمطورين صندوق أدوات مليء بالخوارزميات والمكتبات والأدوات المساعدة المعدة مسبقًا، مما يمكنهم من التركيز على الجوانب التطبيقية والإبداعية للذكاء الاصطناعي مع تجاوز الكثير من كتابة الشيفرات المعقدة منخفضة المستوى. أشهر أطر عمل الذكاء الاصطناعي سنذكر فيما يلي أطر عمل الذكاء الاصطناعي الأكثر شيوعًا والتي يعتمد عليها المطورون في إنشاء مشاريع الذكاء الاصطناعي الخاصة بهم وهي: تنسرفلو Tensorflow باي تورش PyTorch كيراس Keras تنسرفلو Tensorflow: إطار العمل الأكثر استخدامًا يعد تنسرفلو Tensorflow الذي طورته جوجل أحد أكثر أطر عمل الذكاء الاصطناعي مفتوحة المصدر استخدامًا وتنوعًا. يشتهر تنسرفلو بقابلية التوسع والمرونة، فهو تتيح للمطورين إنشاء شبكات عصبية كبيرة ومتطورة لتطبيقات الذكاء الاصطناعي المختلفة. أسلوب تنسرفلو في بناء الشبكات العصبية يُسهّل التوازي، مما يجعلها مثالية للتعامل مع معالجة البيانات على نطاق واسع. تمتد براعة تنسرفلو إلى أبعد من مجرد التعلم العميق. يشتمل نظامها البيئي على أدوات للمعالجة المسبقة للبيانات وتقييم النماذج والنشر. بدءًا من الإصدار 2.0، تبنى إطار العمل هذا نهجًا أكثر سهولة في الاستخدام وأكثر بديهية من خلال تبسيط أسلوب بناء وتنفيذ الشبكات العصبية ودمج إطار العمل كيراس معه. تعمل هذه التحسينات على تمكين المطورين من التركيز على بناء النماذج بدلاً من التورط في تعقيدات التنفيذ. باي تورش PyTorch: إطار عمل الباحثين المفضل يلبي باي تورش PyTorch احتياجات الباحثين وممارسي الذكاء الاصطناعي الذين يحتاجون إلى تحكم دقيق في نماذجهم. طُور باي تورش بواسطة مختبر أبحاث الذكاء الاصطناعي في فيسبوك، ويتبع نموذجًا حوسبيًا ديناميكيًا، مما يسمح للمستخدمين بتعريف نماذجهم وتعديلها وتصحيحها وتجريبها بسهولة. كما أن النظام البيئي ecosystem أو العمل في بيئة باي تورش يعد مرنًا للغاية. على الرغم من أن الطبيعة الديناميكية لباي تورش توفر مزايا في البحث والتجريب، فقد تأتي على حساب الأداء في سيناريوهات إنتاج معينة. الجهود الأخيرة (مثل إدخال TorchScript) تهدف إلى سد هذه الفجوة لجعل باي تورش خيارًا متعدد الاستخدامات لكل من البحث والنشر. كيراس Keras: تبسيط التعلم العميق باستخدام واجهة برمجة تطبيقات سهلة الاستخدام ظهرت كيراس Keras، التي غالبًا ما توصف بأنها واجهة برمجة تطبيقات، كإطار عمل لكل من المبتدئين وحتى الممارسين ذوي الخبرة في مجال الذكاء الاصطناعي على حد سواء. طُور في البداية كمشروع مستقل مفتوح المصدر، وقد تم الآن دمجه بالكامل مع تنسرفلو. تكمن قوته الأساسية في بساطته وسهولة استخدامه. يتخلص كيراس من تعقيدات تنفيذ النموذج، مما يسمح للمطورين بإنشاء شبكات عصبية معقدة ببضعة أسطر من التعليمات البرمجية. يتبع كيراس نموذج برمجة تصريحي عالي المستوى، مما يجعله مثاليًا للتجربة السريعة والنماذج الأولية، حيث تتطلّب عملية بناء النماذج والتدريب الحد الأدنى من التعليمات البرمجية. تأتي هذه البساطة مع مفاضلة، إذ قد تفتقر كيراس إلى المرونة والتحكّم الدقيق الذي توفره أطر العمل ذات المستوى الأدنى مثل تنسرفلو وباي تورش. أطر عمل الذكاء الاصطناعي الأقل شهرة بالإضافة إلى أطر عمل الذكاء الاصطناعي المعروفة مثل تنسرفلو و باي تورش وكيراس، هناك العديد من الأطر القوية الأخرى التي اكتسبت شعبية في مجتمع الذكاء الاصطناعي. نذكر منها: كافي Caffe: طوره مركز BVLC ويتميز بسرعته وكفاءته في مهام تصنيف الصور. سينتك CNTK: يوفر أداءً عاليًا وقابلية للتوسع لمهام التعلم العميق. وهو يدعم العديد من هياكل الشبكات العصبية وقد تم استخدامه في مهام تتراوح من التعرف على الصور والكلام إلى معالجة اللغة الطبيعية. إم إكس نت MXNet: طورته شركة أباتشي Apache، هو إطار عمل بارز آخر مصمم لتحقيق أهداف الكفاءة والمرونة. يتميّز بقدرته على التكيف مع الشبكات العصبية الديناميكية. ساهم دعمه للغات برمجية متعددة، بما في ذلك بايثون وجوليا، في اعتماده على نطاق واسع. فاست إي آي Fast.ai: هو إطار عمل يتميز بتركيزه على إضفاء الطابع الديمقراطي على تعليم الذكاء الاصطناعي (جعل تعليم الذكاء الصناعي وموارده في متناول مجموعة واسعة من الأشخاص، بغض النظر عن خلفيتهم أو خبرتهم). يوفر واجهات برمجة تطبيقات ومكتبات سهلة الاستخدام لتبسيط مهام التعلم العميق المعقدة. هذا يجعله اختيارًا ممتازًا للمبتدئين والباحثين الذين يرغبون في تجربة نماذج الذكاء الاصطناعي ونماذجها بسرعة. أخيرًا ثيانو Theano: استخدم على نطاق واسع في الماضي لمهام التعلم العميق بسبب حسابه الفعال للتعابير الرياضية. على الرغم من أن ثيانو لم يعد نشطًا كما في السابق، إلا أنه لعب دورًا مهمًا في تشكيل مشهد أطر عمل الذكاء الاصطناعي الصناعي. تستمر هذه الأطر، جنبًا إلى جنب مع غيرها من الأطر التي لم تُذكر مثل تشينر Chainer و Deeplearning4j وأونكس ONNX، في إثراء برمجة الذكاء الاصطناعي، مما يوفر خيارات متنوعة للمطورين والباحثين للاستكشاف والابتكار في مجال الذكاء الاصطناعي. اختيار إطار العمل المناسب لمشروعك يمكن أن يؤثر اختيار إطار العمل بشكل كبير على فعالية وكفاءة مشاريع الذكاء الاصطناعي. نتيجةً لكون مجال الذكاء الاصطناعي متنوع وديناميكي، ظهرت بعض الأطر كمعايير صناعية نظرًا لتعدد استخداماتها وأدائها وأدواتها الواسعة المصممة لمهام الذكاء الاصطناعي. يعد فهم نقاط القوة والضعف في مختلف أطر العمل أمرًا ضروريًا لاتخاذ قرارات مستنيرة عند البدء في مشاريع الذكاء الاصطناعي. تلعب عوامل مثل تعقيد النموذج وسهولة نشر النموذج ودعم المجتمع والتكامل مع التقنيات الأخرى دورًا في تحديد الأدوات التي تتوافق مع أهداف المشروع. نشرع في هذا القسم للحديث عن هذه العوامل بشيء من التفصيل. هنالك عدة عوامل يجب مراعاتها لمتطلبات المشروع ومهارات الفريق والأهداف، إذ يتضمن اختيار إطار العمل لمشروع الذكاء الاصطناعي الخاص بك تحليلًا مدروسًا لعدة عوامل. تشكل هذه العوامل مجتمعة الأساس الذي سيُبنى عليه مشروعك، نذكر منها: متطلبات المشروع: تُعد طبيعة مشروع الذكاء الصناعي الخاص بك اعتبارًا أساسيًا. هل تقوم بتطوير تطبيق رؤية حاسب أو أداة معالجة لغة طبيعية أو نظام توصية؟ قد يستفيد كل مجال من مجموعة مختلفة من الأدوات. التعقيد: ضع في اعتبارك مدى تعقيد المشكلة التي تحاول حلها. تتفوق بعض الأطر في التعامل مع العمليات الحسابية المعقدة، بينما يتناسب البعض الآخر بشكل أفضل مع المهام الأبسط. قابلية التوسع: هل سيحتاج مشروعك إلى التوسع مع البيانات المتزايدة ومتطلبات المستخدمين؟ توفر بعض الأطر خيارات أفضل لتحسين الأداء وقابلية التوسع. المجتمع والتوثيق: يمكن أن تكون المجتمعات القوية والوثائق الشاملة ذات قيمة لا تقدر بثمن عند استكشاف المشكلات وإصلاحها أو طلب التوجيه. مهارات الفريق: قم بتقييم خبرة فريق التطوير لديك. يمكن أن يؤدي اختيار لغة وإطار عمل مألوفين لفريقك إلى تسريع عملية التطوير وضمان مستوى أعلى من جودة التعليمات البرمجية. التكامل: ضع في اعتبارك مدى سهولة تكامل الإطار المختار مع الأدوات والخدمات وأنظمة التشغيل والمنصات الأخرى التي قد تحتاج إلى استخدامها. الصيانة طويلة المدى: التخطيط للمستقبل. تأكد من أن إطار العمل الذي تختاره له خارطة طريق للتحديثات والصيانة. توفر الموارد: يمكن أن يؤثر توفر الأدوات والموارد بشكل كبير على سرعة التطوير وكفاءته. سهولة الاستخدام: بعض الأطر أكثر سهولة في الاستخدام، مما يجعلها مثالية للمبتدئين. يوفر البعض الآخر مزيدًا من التحكم والمرونة للمطورين ذوي الخبرة. يعد اختيار لغة البرمجة والإطار المناسبين لمشروع الذكاء الاصطناعي الخاص بك قرارًا استراتيجيًا يتطلب تقييمًا شاملاً لمتطلبات المشروع وقدرات الفريق والأهداف طويلة المدى. توفر الخيارات الكثيرة المتاحة اليوم للمطورين الأدوات اللازمة لإنشاء تطبيقات مبتكرة وقوية. من خلال النظر في هذه العوامل والاستلهام من دراسات الحالة الناجحة، يمكن للمطورين وضع مشاريعهم على طريق النجاح. قيود استخدام أطر عمل الذكاء الاصطناعي يمكن أن تؤثر القيود المرافقة لأطر عمل الذكاء الاصطناعي على تطوير تطبيقات الذكاء الاصطناعي ونشرها. هناك العديد من القيود، ويمكن أن تختلف هذه القيود بناءً على إطار العمل المحدد. تتضمن بعض القيود الشائعة ما يلي: الأداء: قد تواجه أطر عمل معينة للذكاء الاصطناعي صعوبة في التوسع للتعامل مع مجموعات البيانات الكبيرة أو النماذج المعقدة بكفاءة. يمكن أن ينتج عن ذلك أوقات تدريب أبطأ (بعض النماذج تحتاج أيام) وتطبيقات أقل استجابة (أي تستغرق وقت أطول لكي تعطيك النتيجة). التوافق: قد لا تكون بعض أطر عمل الذكاء الصناعي متوافقة مع أجهزة أو منصات معينة، مما يحد من قابليتها للاستخدام في بيئات معينة. التعقيد: يمكن أن تكون عملية بناء بعض نماذج الذكاء الصناعي غير سهلة، خاصة للمبتدئين. يمكن أن تعيق الأطر التي تفتقر إلى التوثيق والدعم عملية التعلّم. الافتقار إلى المرونة: قد تُقيّد بعض أطر عمل الذكاء الاصطناعي المطورين على خوارزميات ونماذج محددة مسبقًا، مما يقلل من مرونة تجربة الحلول المخصصة. قابلية التشغيل البيني Interoperability: تشير إلى القدرة على تبادل البيانات أو الوظائف بين نظم مختلفة أو برمجيات مختلفة دون الحاجة إلى تعديل هذه البرمجيات. يعد التحقق من قابلية التشغيل البيني أمرًا مهمًا في عالم تطوير البرمجيات والتكنولوجيا. يمكن أن تؤدي قابلية التشغيل البيني المحدودة بين أطر الذكاء الاصطناعي المختلفة ولغات البرمجة إلى إعاقة تكامل الأدوات والتقنيات المتعددة. ** الدعم المحدود**: قد يكون لبعض أطر عمل الذكاء الاصطناعي قاعدة مستخدمين أصغر، مما يؤدي إلى دعم مجتمعي محدود. مخاوف أمنية: يمكن أن تتسبب أطر عمل الذكاء الاصطناعي في حدوث ثغرات أمنية، مما قد يؤدي إلى كشف بيانات حساسة. منحنى التعلم: يمكن أن يؤدي تعقيد بعض أطر عمل الذكاء الاصطناعي إلى منحنى تعليمي حاد (أي ليس من السهل تعلمها)، مما يتطلب وقتًا وجهدًا كبيرين حتى تصبح بارعًا. على الرغم من هذه القيود، يعمل البحث والتطوير المستمر على مواجهة هذه التحديات. مكتبات الذكاء الاصطناعي إلى جانب أطر عمل الذكاء الاصطناعي، تلعب المكتبات دورًا مهمًا في تحويل الخوارزميات المعقدة إلى أدوات يسهل الوصول إليها. في حين أن أطر العمل مثل TensorFlow و PyTorch تهيمن على مشهد الذكاء الاصطناعي، فمن الضروري التعرف على خيارات أخرى تُستخدم في تطوير الذكاء الاصطناعي وهي المكتبات. عكس أطر العمل، صممت المكتبات لتبسيط مهام محددة، حيث تقدم للمطورين وحدات ودوال مُعدة مسبقًا يمكن دمجها بسهولة في مشاريعهم. دعونا نستكشف أهمية مكتبات الذكاء الاصطناعي. أشهر مكتبات الذكاء الاصطناعي البارزة هناك عدد كبير من المكتبات المستخدمة في برمجة الذكاء الاصطناعي وكل منها يُستخدم ضمن لغة برمجة معين. تتضمّن بايثون الحصة الأكبر من مكتبات الذكاء الاصطناعي، فلديها مجموعة واسعة من المكتبات التي تلبي مهام الذكاء الاصطناعي المختلفة. توفر هذه المكتبات للمطورين أدوات ودوال جاهزة لتبسيط عملية التطوير، من المعالجة المسبقة للبيانات إلى التدريب النموذجي والتقييم. فيما يلي بعض المكتبات الأساسية الضرورية لتطوير الذكاء الاصطناعي. هاغينغ فيس Hugging Face هاغينغ فيس Hugging Face اسم معروف في عالم الذكاء الاصطناعي وهي الخيار رقم واحد في معالجة اللغة الطبيعية، إذ قدمت مساهمات ملحوظة في مجال معالجة اللغات الطبيعية NLP. تأسست شركة Hugging Face في عام 2016، وقد اكتسبت شهرة بسبب مكتبتها مفتوحة المصدر، مثل مكتبة المحولات Transformers. توفر هذه المكتبة مجموعة واسعة من مجموعات البيانات والنماذج المدربة مسبقًا لمجموعة واسعة من مهام معالجة اللغات الطبيعية، بما في ذلك تصنيف النصوص وترجمة اللغة ونماذج اللغة وتحليل المشاعر. ما يميز Hugging Face هو التزامها بإضفاء الطابع الديمقراطي على الذكاء الاصطناعي ومعالجة اللغات الطبيعية من خلال جعل النماذج المتطورة في متناول المطورين والباحثين في جميع أنحاء العالم. مع مجتمع مزدهر من المساهمين، تُواصل Hugging Face الابتكار وقيادة التقدم وتعزيز التعاون في عالم معالجة اللغات الطبيعية. لقد أصبح مصدرًا لا غنى عنه لأي شخص يعمل في مشاريع الذكاء الاصطناعي المتعلقة باللغة. نمباي Numpy مكتبة خاصة بلغة بايثون وهي أساس العديد من مشاريع الذكاء الاصطناعي. توفر دعمًا للمصفوفات الكبيرة والمعقّدة والمتعددة الأبعاد، جنبًا إلى جنب مع مجموعة واسعة من الدوال الرياضية لعمليات المصفوفة. هذه المكتبة لا غنى عنها للمهام التي تنطوي على حسابات رقمية ومعالجة البيانات. باندا Pandas مكتبة خاصة بلغة بايثون. هي مكتبة قوية لتحليل البيانات ومعالجتها. يسمح هيكل DataFrame الخاص بها للمطورين بالتعامل مع البيانات المهيكلة ومعالجتها بكفاءة، مما يجعل المهام مثل تنظيف البيانات وتحويلها وتجميعها أكثر ملاءمة. سكايت ليرن scikit-Learn مكتبة خاصة بلغة بايثون. تُعرف هذه المكتبة أيضًا باسم sklearn، وهي نقطة انطلاق لمهام التعلم الآلي. يقدم مجموعة متنوعة من خوارزميات التعلم الآلي للتصنيف والانحدار والتكتّل وتقليل الأبعاد والمزيد. توفر بالإضافة إلى ذلك أدوات لتقييم النموذج واختيار الميزات والمعالجة المسبقة للبيانات. مجموعة أدوات اللغة الطبيعية NLTK مكتبة خاصة بلغة بايثون مصممة خصيصًا لمهام معالجة اللغة الطبيعية. توفر أدوات وموارد للتقطيع tokenization والتشذيب stemming، وتصنيف أجزاء الكلام POST، وتحليل المشاعر ، وأكثر من ذلك ، مما يجعله ضروريًا للمشاريع التي تتضمن بيانات نصية. سباسي spaCy مكتبة خاصة بلغة بايثون. مكتبة قوية أخرى لمهام معالجة اللغة الطبيعية، تركز سبايسي على توفير إمكانيات لمعالجة اللغة الطبيعية بطريقة سريعة وفعّالة. كما أنها تتفوق في مهام مثل التعرف على الكيانات المسماة NER وتحليل التبعية والتحليل اللغوي. جينسم Gensim مكتبة خاصة بلغة بايثون مصممة لنمذجة الموضوعات وتحليل تشابه المستندات. إنها مفيدة بشكل خاص للعمل مع مجموعات نصية كبيرة وإنشاء تمثيلات رقمية للنصوص باستخدام تقنيات مثل Word2Vec. إكس جي بوست XGBoost مكتبة خاصة بلغة بايثون ولغة R وهي مكتبة شهيرة وحديثة للتعلم الآلي. تحظى بشعبية خاصة بالنسبة للبيانات المُهيكلة (كالتي تُنظّم في جداول) وتستخدم على نطاق واسع في مسابقات التعلم الآلي. مكتبة OpenCV مكتبة خاصة بلغة بايثون ولغة C++‎ وتعد مصدرًا قويًا لمهام الرؤية الحاسوبية. فهي توفر أكثر من 2500 خوارزمية محسنة لتحليل الصور والفيديو في الوقت الفعلي. من التعرف على الوجه إلى اكتشاف الأشياء، تعد OpenCV واحدة من المكتبات المفضلة لمطوري الرؤية الحاسوبية. مكتبتي forecast و tseries وهي مكتبات خاصة بلغة R تُستخدم في تحليل السلاسل الزمنية، حيث تسهل حزم forecast و tseries التنبؤ بالبيانات المعتمدة على الوقت وتحليلها. مكتبتي sp و sf مكتبات خاصة بلغة R تُستخدم في التحليل المكاني، حيث تُمكّن المستخدمين من معالجة البيانات المكانية وتحليلها. هذه كانت مجموعة من أهم مكتبات الذكاء الاصطناعي. تعمل هذه المكتبات بشكل جماعي على تمكين المطورين من إنشاء تطبيقات ذكاء اصطناعي معقدة عبر مجالات متنوعة. من خلال الاستفادة من قدرات هذه المكتبات، يمكن لممارسي الذكاء الاصطناعي تسريع عملية التطوير وإنشاء نماذج أكثر قوة ودقة. فوائد مكتبات الذكاء الاصطناعي كما أشرنا سابقًا، هناك العديد من الفوائد التي يمكن الحصول عليها من خلال إنشاء واستخدام مكتبات الذكاء الاصطناعي، وهي كما يلي: سهولة الاستخدام: تعمل المكتبات على تبسيط الخوارزميات المعقدة، مما يسهل على المطورين فهم حلول الذكاء الاصطناعي وتنفيذها دون الخوض في تعقيدات الخوارزميات الأساسية. النماذج الأولية السريعة: يمكن للمطورين إنشاء نماذج أولية سريعة لأفكارهم باستخدام المكتبات، مما يسمح لهم باختبار الفرضيات وتجربة أساليب مختلفة قبل الالتزام بحل محدد. دعم المجتمع: تمامًا مثل أطر العمل، تتمتع المكتبات الشعبية بمجتمعات نابضة بالحياة. تساهم هذه المجتمعات في المكتبات من خلال توفير التحديثات وإصلاحات الأخطاء والوظائف الإضافية، مما يضمن بقاء المكتبات قوية ومحدثة. قابلية التخصيص: توفر المكتبات التوازن بين الحلول المعدة مسبقًا والتخصيص. يمكن للمطورين تعديل أجزاء معينة من كود المكتبة لتخصيص الدالة وفقًا لمتطلبات مشروعهم. كفاءة الموارد: تتميز المكتبات عمومًا بقلة حجمها مقارنةً بأطر العمل، مما يجعلها مناسبة للبيئات المحدودة الموارد مثل أجهزة إنترنت الأشياء. خاتمة لقد أضفت مكتبات وأطر الذكاء الاصطناعي قوةً كبيرةً على تطوير الذكاء الاصطناعي، مما مكّن كلاً من المحترفين المتمرسين والوافدين الجدد من تسخير قوة الذكاء الاصطناعي. سواء كنت تقوم ببناء روبوتات محادثة ذكية أو مركبات ذاتية التحكم أو أنظمة تحليلات تنبؤية، فإن هذه المكتبات والأطر تعمل كحلفاء لك في مجال الذكاء الصناعي. إن فهم مشهد مكتبا وأطر عمل الذكاء الاصطناعي هو الخطوة الأولى في الشروع في رحلة لإنشاء الجيل القادم من الأنظمة الذكية التي ستشكل عالمنا. اقرأ أيضًا تعلم الذكاء الاصطناعي لغات برمجة الذكاء الاصطناعي خوارزميات الذكاء الاصطناعي أهمية الذكاء الاصطناعي فوائد الذكاء الاصطناعي
    2 نقاط
  24. لقد أوصلنا التطور السريع للتكنولوجيا إلى منعطف محوري، حيث أصبح الخيال العلمي حقيقة ملموسة. الذكاء الصناعي Artificial Intellegence، المجال الذي كان يقتصر في السابق على عالم الخيال، أصبح الآن قوة كبيرة تدعم الابتكار في مختلف الصناعات. بدءًا من السيارات ذاتية القيادة التي تتنقل في الشوارع المزدحمة إلى المساعدين الافتراضيين الذين يفهمون ويستجيبون لأوامرنا مثل سيري Siri وأليكسا Alexa، أصبح الذكاء الصناعي جزءًا لا يتجزأ من الحياة الحديثة. يكمن في قلب هذا التحوّل الفن المعقد لبرمجة الذكاء الصناعي، وهي عملية تتضمن صياغة خوارزميات ونماذج تُعالج وتحلّل كميات هائلة من البيانات، بغية إنشاء آلات ذكية يمكنها محاكاة الوظائف الإدراكية البشرية، مثل التعلم والاستدلال وحل المشكلات واتخاذ القرار. تتضمن برمجة الذكاء الصناعي تطوير البرامج التي تسمح للآلات بإظهار السلوك الذكي وحل المشكلات والتعلم من البيانات كما ذكرنا. إنه مجال متعدد التخصصات يجمع بين علوم الحاسب والرياضيات والعلوم المعرفية والهندسة. الهدف هو تزويد الآلات بالقدرة على تحليل البيانات المعقدة والتعلم من الأنماط والتكيّف مع الظروف المتغيرة، وحتى الانخراط في حل المشكلات التي تتطلّب حثًا إبداعيًّا. تتحدّث هذه المقالة عن برمجة الذكاء الصناعي وتستكشف مفاهيمها الأساسية وتقنياتها المتطورة وأساليب النشر والاعتبارات الأخلاقية والإمكانيات غير العادية التي تحملها لتشكيل المستقبل وأكثر. ما الفرق بين الذكاء الاصطناعي والبرمجة؟ الذكاء الصناعي والبرمجة هما مفهومان متمايزان ولكن مترابطان في مجال علوم الحاسب. تشير البرمجة إلى عملية إنشاء التعليمات البرمجية أو الشيفرة البرمجية التي تتبعها أجهزة الحاسب لأداء مهام محددة ومدروسة سابقًا ولا يمكن الخروج عنها أي لن يستجيب البرنامج إن حاولت استعماله في شيء ليس مبرمجًا عليه. يتضمن ذلك كتابة الخوارزميات والأوامر بلغات البرمجة المختلفة لتحقيق النتائج المرجوة. من الناحية الأخرى، يتجاوز الذكاء الصناعي البرمجة التقليدية من خلال تمكين الآلات من محاكاة الوظائف المعرفية بطريقة البشرية، مثل التعلم والاستدلال وحل المشكلات واتخاذ القرار. يمكن لأنظمة الذكاء الصناعي التكيف وتحسين أدائها بناءً على البيانات والخبرات، مما يسمح لها بالتعامل مع المواقف المعقدة وغير المؤكدة التي قد لا تكون مبرمجة بشكل واضح. من هنا نجد أن برمجة الذكاء الاصطناعي تختلف عن البرمجة التقليدية التي اعتدنا عليها. صحيح أن البرمجة تشكل الأساس لبناء أنظمة الذكاء الصناعي، إلا أن الذكاء الصناعي يتضمن تطوير خوارزميات ونماذج يمكنها التعلم من البيانات وتحسين أدائها بمرور الوقت، مما يمثل خروجًا كبيرًا عن نماذج البرمجة التقليدية. سأضرب مثالًا حديثًا يوضح الفرق بين الذكاء الاصطناعي والبرمجة، نشر إلون ماسك بتاريخ 26 أغسطس هذا العام فيديو على حسابه على تويتر وهو جالس في سيارة تسلا ذاتية القيادة متوجهًا من مكان إلى آخر دون أن يتدخل وقد علق قائلًا أثناء مرور السيارة بجانب دراجة أننا لم نكتب سطرًا من كود ولم نبرمج السيارة على التصرف في حال المرور بجانب شخص يقود دراجة هوائية، وقد مرت السيارة مرورًا سلسلًا بجانب الدراجة، ثم عند الوصول إلى تقاطع في إشارات مرورية علق قائلًا، نحن لم نبرمج السيارة على قراءة الإشارات المرورية ولم نكتب سطرًا برمجيًا يوضح كل اللافتات والإشارات المرورية بل الأمر متروك للسيارة باستنتاج معنى الإشارة وتطبيق ما يلزم، حيث مرت السيارة بجانب إشارة تطلب تخفيف السرعة فاستجابت لذلك، ويمكنك مشاهدة الفيديو كاملًا وهو بطول 45 دقيقة في سيارة تسلا ذاتية القيادة التي تقود مستعينة بالذكاء الاصطناعي. كان هذا أوضح مثال عن الفرق بين برمجة الذكاء الاصطناعي والبرمجة التقليدية. باختصار، تتضمن البرمجة كتابة تعليمات واضحة ليتبعها الحاسب، في حين تتضمن برمجة الذكاء الاصطناعي إنشاء أنظمة يمكنها التعلم من البيانات لإجراء تنبؤات أو قرارات دون أن تتم برمجتها بشكل صريح لكل موقف. مبرمج الذكاء الاصطناعي خلف كواليس تلك التطورات المذهلة التي يشهدها الذكاء الاصطناعي، يوجد محترفون ماهرون ينجزون هذا التطور، هم مبرمجي الذكاء الاصطناعي. يلعب هؤلاء الأفراد دورًا حاسمًا في تطوير الخوارزميات والنماذج والأنظمة التي تدعم تطبيقات الذكاء الاصطناعي. دور مبرمج الذكاء الاصطناعي مبرمج الذكاء الصناعي هو مطور برامج متخصص يركز على تصميم أنظمة الذكاء الصناعي وتنفيذها وتحسينها. هدفه الأساسي هو إنشاء خوارزميات ونماذج تمكن الآلات من أداء المهام التي تتطلب عادةً ذكاءًا بشريًّا. تتراوح هذه المهام من معالجة اللغة الطبيعية والتعرف على الصور إلى أنظمة التوصية والمركبات المستقلة. يقوم مبرمجي الذكاء الصناعي بسد الفجوة بين مفاهيم الذكاء الاصطناعي النظرية والتطبيقات العملية في العالم الحقيقي. تتضمن المهام الأساسية: تطوير الخوارزميات: يقوم مبرمجي الذكاء الاصطناعي بتصميم وتطوير خوارزميات تُمكّن الآلات من معالجة البيانات وتفسيرها وإنتاجها وإجراء التنبؤات وحتى توليد الأفكار. إنشاء النماذج: يقومون ببناء وتدريب نماذج التعلم الآلي والتعلم العميق باستخدام مجموعات بيانات ضخمة. تتعلم هذه النماذج الأنماط والعلاقات من البيانات لاتخاذ قرارات مستنيرة. المعالجة المسبقة للبيانات: يقوم مبرمجي الذكاء الاصطناعي بتنظيف البيانات ومعالجتها مسبقًا وتحويلها لجعلها مناسبة لتدريب نماذج الذكاء الاصطناعي. يتضمن ذلك مهام مثل تسوية البيانات واستخراج الميزات ومعالجة القيم المفقودة ..إلخ. تحسين الأداء: بمجرد تطوير النموذج، يقوم مبرمجو الذكاء الاصطناعي بتحسين أدائه من خلال ضبط المعلمات الخاصة بتدريب النموذج بدقة وتقليل المتطلبات الحسابية وتعزيز الكفاءة العامة. التكامل: يقوم مبرمجي الذكاء الاصطناعي بدمج نماذج وأنظمة الذكاء الاصطناعي في تطبيقات أكبر، مما يجعلها تتفاعل بسلاسة مع مكونات البرامج الأخرى. المهارات المطلوبة: إتقان البرمجة: يعد إتقان إحدى لغات البرمجة على الأقل مثل لغة بايثون أو لغة R أو جافا أمرًا أساسيًا. تحتاج عملية برمجة الذكاء الاصطناعي إلى كتابة التعليمات البرمجية لتنفيذ الخوارزميات ومعالجة البيانات وتطوير نماذج الذكاء الصناعي. التعلم الآلي: يعد الفهم القوي لمفاهيم التعلم الآلي أو تعلم الآلة، بما في ذلك التعلم الخاضع للإشراف وغير الخاضع للإشراف والانحدار والتصنيف والتجميع والشبكات العصبية، أمرًا ضروريًا. الرياضيات والإحصاء: تتضمن برمجة الذكاء الاصطناعي التعامل مع مفاهيم رياضية، مثل الجبر الخطي وحساب التفاضل والتكامل والاحتمالات. المعرفة الإحصائية السليمة أمر بالغ الأهمية لتقييم النماذج واختبار الفرضيات. أطر التعلم العميق: يعد الإلمام بمكتبات التعلم العميق مثل تنسرفلو TensorFlow وباي تورش PyTorch وكيراس Keras أمرًا ضروريًا لبناء الشبكات العصبية وتدريبها. التعامل مع البيانات: تعد المهارة في معالجة البيانات والمعالجة المسبقة وأدوات التصور ضرورية لإعداد البيانات للتدريب على نماذج الذكاء الصناعي. حل المشكلات: يجب أن يكون مبرمجي الذكاء الاصطناعي ماهرين في تقسيم المشكلات المعقدة إلى مكونات يمكن التحكم فيها واستنباط حلول فعالة. المعرفة بالمجال: قد يحتاج مبرمجي الذكاء الاصطناعي إلى معرفة خاصة بالمجال الذي يتم بناء النموذج للعمل عليه. على سبيل المثال، يجب على مبرمجي تطبيقات الذكاء الاصطناعي الطبية فهم المصطلحات والممارسات الطبية. الوعي بالأخلاق والتحيز: مع تأثير أنظمة الذكاء الاصطناعي على القرارات الحاسمة، يعد فهم الاعتبارات الأخلاقية وتخفيف التحيز أمرًا بالغ الأهمية. مبرمجو الذكاء الاصطناعي هم مهندسو المستقبل القائم على الذكاء الاصطناعي. تعتبر خبرتهم في الخوارزميات والتعلم الآلي ومعالجة البيانات مفيدة في إنشاء أنظمة يمكنها تحليل كميات هائلة من البيانات واتخاذ قرارات مستنيرة والتعلم المستمر من التجربة. ومع استمرار الذكاء الاصطناعي في إحداث ثورة في الصناعات وإعادة تعريف الإمكانيات، يظل دور مبرمجي الذكاء الاصطناعي محوريًا في تشكيل هذا المشهد التحويلي. سواء كان الأمر يتعلق بتعزيز تجارب العملاء أو إحداث ثورة في تشخيص الرعاية الصحية أو تمكين السيارات ذاتية القيادة، فإن مبرمجي الذكاء الاصطناعي هم في الطليعة، حيث يحولون الأفكار المتطورة إلى واقع عملي. المفاهيم الأساسية للذكاء الاصطناعي يشمل الذكاء الاصطناعي مجموعة واسعة من المفاهيم والتقنيات التي تهدف إلى إنشاء أنظمة قادرة على أداء المهام المختلفة. فيما يلي بعض المفاهيم الأساسية للذكاء الاصطناعي: التعلم الآلي Machine Learning التعلم الآلي هو مجموعة فرعية من الذكاء الاصطناعي الذي يركز على تطوير الخوارزميات والنماذج التي تمكن أجهزة الحاسب من التعلم والتنبؤ أو اتخاذ القرارات بناءً على البيانات. ويمكن تصنيفها إلى: التعلم الخاضع للإشراف Supervised Learning: تتعلم الخوارزميات من بيانات التدريب المصنفة لإجراء تنبؤات أو تصنيفات. وتشمل الأمثلة مهام الانحدار والتصنيف. التعلم غير الخاضع للإشراف Unsupervised Learning: تتعلم الخوارزميات من البيانات غير المسماة لاكتشاف الأنماط والعلاقات. ومن الأمثلة على ذلك التجميع وتقليل الأبعاد. التعلم المعزز Reinforcement Learning: يتعلم الوكلاء Agents تنفيذ الإجراءات ضمن بيئة محددة لتحقيق أقصى قدر من المكافآت. شائع في مهام مثل اللعب والروبوتات. الشبكات العصبية Neural Networks الشبكات العصبية هي نماذج حسابية مستوحاة من بنية الدماغ البشري. وهي تتكون من عقد مترابطة (خلايا عصبية) منظمة في طبقات. كل اتصال له وزن يمكن تعديله أثناء التدريب لتحسين أداء النموذج. التعلم العميق Deep Learning التعلم العميق هو مجال فرعي من التعلم الآلي يتضمن شبكات عصبية ذات طبقات متعددة (شبكات عصبية عميقة). لقد أتاح التعلم العميق تحقيق إنجازات كبيرة في مهام مثل التعرف على الصور والكلام نظرًا لقدرته على تعلم الأنماط المعقدة تلقائيًا من البيانات. معالجة اللغات الطبيعية Natural Language Processing تتضمن البرمجة اللغوية العصبية تمكين أجهزة الحاسب من فهم اللغة البشرية وتفسيرها وتوليدها. يتم استخدامه في مهام مثل تحليل المشاعر وترجمة اللغات وروبوتات الدردشة وإنشاء النصوص. الرؤية الحاسوبية Computer Vision تركز رؤية الحاسب على منح الآلات القدرة على تفسير المعلومات المرئية من البيئة المحيطة. يُستخدم في تحليل الصور والفيديو واكتشاف الأشياء والتعرف على الوجه والمركبات ذاتية القيادة. الأنظمة الخبيرة Expert Systems الأنظمة الخبيرة هي برامج الذكاء الاصطناعي التي تحاكي قدرات اتخاذ القرار للخبير البشري في مجال معين. ويستخدمون تقنيات تمثيل المعرفة والتفكير لحل المشكلات المعقدة. تمثيل المعرفة والاستدلال Knowledge Representation and Reasoning تحتاج أنظمة الذكاء الاصطناعي إلى تمثيل المعرفة بتنسيق منظم يمكن لأجهزة الحاسب فهمه. يتضمن الاستدلال استخدام القواعد المنطقية لإجراء الاستدلالات واستخلاص النتائج من المعرفة الممثلة. الحوسبة المعرفية Cognitive Computing تهدف الحوسبة المعرفية إلى إنشاء أنظمة يمكنها محاكاة عمليات التفكير البشري، مثل التفكير وحل المشكلات والتعلم. غالبًا ما يجمع بين تقنيات الذكاء الاصطناعي ومعالجة اللغة الطبيعية وتحليل البيانات. الإدراك الآلي Machine Perception يتضمن ذلك منح الآلات القدرة على إدراك العالم وفهمه من خلال المدخلات الحسية مثل الصور والصوت واللمس. يتضمن مهام مثل التعرف على الصور والتعرف على الكلام والتعرف على الإيماءات. توفر هذه المفاهيم فهمًا أساسيًا للذكاء الاصطناعي. ومع استمرار تطور هذا المجال، ستظهر تقنيات وأساليب جديدة، مما يساهم في تقدمه السريع. تجدر الإشارة إلى أنك كمبرمج للذكاء الصناعي لست مضطرًا لتعلّم كل هذه المفاهيم، وإنما يكفي فهم عام لها (فهم سطحي)، والتخصص في واحدة أو اثنتين منها فقط، لأن التخصص في كل هذه المفاهيم أو في كل مجالات الذكاء الصناعي هو أمر شبه مستحيل. خوارزميات الذكاء الاصطناعي خوارزميات الذكاء الاصطناعي عبارة عن مجموعات من التعليمات خطوة بخطوة أو الإجراءات الحسابية المصممة لحل مشكلات أو مهام محددة تتطلب عادةً ذكاءً بشريًا. تقع هذه الخوارزميات في قلب أنظمة الذكاء الاصطناعي، مما يمكّن الآلات من التعلم والتفكير واتخاذ القرارات.عمومًا، هذه الخوارزميات هي مجرد أفكار ونظريات تحتاج إلى تحويل إلى صيغة يمكن للآلات استغلالها، وهنا يتجلى دور برمجة الذكاء الاصطناعي في تحويل هذه الأفكار إلى شيفرات برمجية، بالتالي تصبح الآلات قادرة على تحليل البيانات بشكل ذكي، مما يتيح لها اكتساب المعرفة وتحديث أساليبها تلقائيًا. هناك مجموعة واسعة من الخوارزميات ذات الصلة بالذكاء الصناعي منها خوارزميات البحث والخوارزميات الجينية والشبكات العصبية وأشجار القرار وخوارزميات التجميع وخوارزميات معالجة اللغات الطبيعية وخوارزميات التعلم المعزز. يعتمد اختيار الخوارزمية على المشكلة التي تحاول حلها والبيانات المتوفرة لديك ومهمة الذكاء الاصطناعي المحددة التي تعمل عليها. لن نخوض في هذه الخوارزميات الآن، فقد كان لنا محطة عندها في مقالة خوارزميات الذكاء الاصطناعي. البدء في برمجة الذكاء الاصطناعي عند وجود أساس جيد للمفاهيم الأساسية للذكاء الاصطناعي، يكون قد حان الوقت للشروع في رحلتك إلى عالم برمجة الذكاء الصناعي. نوجّهك في هذا القسم إلى الخطوات الأولية لبدء برمجة تطبيقات الذكاء الصناعي. لغات برمجة الذكاء الاصطناعي تُستخدم العديد من لغات برمجة الذكاء الاصطناعي والمكتبات بشكل شائع لتطوير الذكاء الصناعي نذكر منها ما يلي: لغة بايثون Python لغة R لغة جافا Java لغة جوليا Julia 1. لغة بايثون Python لغة بايثون هي لغة شائعة لبرمجة الذكاء الصناعي نظرًا لبساطتها ونظامها الإيكولوجي الشامل لمكتبات الذكاء الصناعي مثل تنسرفلو TensorFlow وباي تورش PyTorch وسكايت ليرن scikit-Learn. لغة R تُستخدم لغة R على نطاق واسع في التحليل الإحصائي وتصوّر البيانات، مما يجعلها الخيار المفضل لمشاريع الذكاء الصناعي التي تتضمن تحليل البيانات. لغة جافا Java القدرات القوية للبرمجة غرضية التوجّه OOP في لغة جافا تجعلها مناسبة لبناء تطبيقات الذكاء الصناعي. لغة جوليا Julia تكتسب لغة جوليا قوة دفع لقدراتها عالية الأداء في الحوسبة العلمية والتعلم الآلي. سنتحدث عن استخدامات هذه اللغات -ولغات أخرى- في سياق الذكاء الصناعي بشيءٍ من التفصيل لاحقًا. تجدر الإشارة إلى أنه يمكنك الاطلاع على سلاسل مقالات كاملة عن مكتبة بايثون، ولغة جافا، ولغة R. استكشاف مكتبات وأطر عمل الذكاء الاصطناعي تصبح برمجة الذكاء الصناعي أكثر سهولة وكفاءة بمساعدة المكتبات والأطر المتخصصة. توفر هذه الأدوات دوال وتجريدات مختلفة لجعل تطوير الذكاء الصناعي أكثر كفاءة. فيما يلي بعض مكتبات وأطر عمل الذكاء الصناعي الشائعة: تنسرفلو TensorFlow تم تطوير إطار العمل تنسرفلو TensorFlow بواسطة شركة جوجل، وهي واحدة من مكتبات الذكاء الصناعي مفتوحة المصدر الأكثر استخدامًا. توفر نظامًا بيئيًا شاملاً للتعلم الآلي والتعلم العميق، بما في ذلك دعم الشبكات العصبية ومعالجة اللغة الطبيعية NLP والرؤية الحاسوبية. باي تورش PyTorch طوّر باي تورش بواسطة مختبر أبحاث الذكاء الصناعي FAIR التابع لشركة ميتا، وهو يتبع أسلوبًا ديناميكيًا في تنفيذ الشبكات العصبية، مما يجعله أكثر مرونة للبحث والتجريب. يستخدم على نطاق واسع في الأوساط الأكاديمية والصناعية لتطوير نماذج التعلم العميق. كيراس Keras في الأصل هي مكتبة مستقلة، لكن أصبحت كيراس الآن جزءًا من تنسرفلو باعتبارها واجهة برمجة تطبيقات عالية المستوى. يوفر واجهة سهلة الاستخدام لبناء الشبكات العصبية وتدريبها، مما يجعلها رائعة للمبتدئين. سكايت-ليرن Scikit-Learn هذه مكتبة شهيرة للتعلم الآلي، ولكن ليس لها أي علاقة بالتعلم العميق والشبكات العصبية. توفر هذه المكتبة عددًا كبيرًا من خوارزميات التعلم الآلي التقليدية. توفر مجموعة أدوات بسيطة وفعالة للمعالجة المسبقة للبيانات وهندسة الميزات وتقييم النموذج. توفر هذه المكتبات والأطر بيئة مناسبة ومريحة وآمنة وموثوقة، لتسهيل عملية بناء وتطوير مشاريع الذكاء الصناعي. نتحدث عن هذه المكتبات والأطر في المقالة القادمة بشكل أكبر أيضًا. أدوات تطوير وبرمجة تطبيقات الذكاء الاصطناعي قبل البدء في الخوض في عالم برمجة الذكاء الاصطناعي، من الضروري إنشاء بيئة تطوير قوية توفر الأدوات والموارد اللازمة لكتابة الشيفرات وإنشاء الاختبارات بسلاسة: اختر نظام التشغيل الخاص بك أولاً وقبل كل شيء، حدد نظام التشغيل الذي يناسب تفضيلاتك ومتطلباتك. يمكن إجراء تطوير الذكاء الصناعي على منصات مختلفة، إلا أن العديد من مكتبات وأدوات الذكاء الصناعي مدعومة جيدًا على الأنظمة المستندة إلى لينكس Linux مثل أبونتو Ubuntu. تجدر الإشارة أيضًا إلى أن نظامي التشغيل ويندوز Windows وماك macOS هما أيضًا خيارات يمكن الاعتماد عليها. يعتمد اختيارك إلى حد كبير على معرفتك بالنظام وراحتك، وممكن استعمال لينكس ضمن ويندوز عبر طريقتين إما عبر بيئة وهمية أو عبر نظام لينكس الداخلي WSL، أو يمكن تثبيت لينكس مع ويندوز. تثبيت بايثون Python بايثون هي لغة البرمجة المفضلة لبرمجة الذكاء الاصطناعي نظرًا لبساطتها وبيئتها الواسعة التي تتضمن العديد من المكتبات الداعمة للذكاء الصنعي. ابدأ بتثبيت بايثون على نظامك. يمكنك مراجعة مقال تثبيت لغة بايثون الشامل الذي يشرح تنزيل بايثون على كل أنظمة التشغيل. بعد التثبيت، ستتمكن من الوصول إلى مجموعة المكتبات والأدوات الثريّة في بايثون. اختر بيئة تطوير متكاملة IDE إن استخدام بيئة تطوير متكاملة يؤدي إلى تحسين تجربة البرمجة الخاصة بك من خلال توفير ميزات مثل إكمال التعليمات البرمجية وتصحيح الأخطاء وإدارة المشروع. تشمل الخيارات الشائعة PyCharm و Jupyter Notebook المخصصين لبايثون وكذلك Visual Studio Code الذي يُعتبر بيئة تطوير عامة. تُقدم بيئات التطوير المتكاملة مكونات إضافية وإضافات متخصصة لتطوير الذكاء الاصطناعي، مما يبسط سير عملك. تثبيت أطر ومكتبات الذكاء الصناعي لتسخير قوة الذكاء الاصطناعي، ستحتاج إلى تثبيت مكتبات وأطر تسهل مهام التعلم الآلي والتعلم العميق. تعد تنسرفلو TensorFlow وباي تورش PyTorch وكيراس Keras وسكايت ليرن scikit-Learn بعض المكتبات الأساسية التي يجب أخذها بعين الاعتبار. يمكنك تثبيت هذه المكتبات باستخدام مدير حزم بايثون pip، عن طريق تنفيذ أوامر بسيطة. إعداد البيئات الافتراضية يعد إنشاء بيئات افتراضية أفضل ممارسة لعزل مشاريعك وتبعياتها. تضمن البيئات الافتراضية أن المكتبات والحزم المثبتة لمشروع واحد لا تتداخل مع المشاريع والحزم الأخرى. استخدم أدوات مثل venv أو conda أو pipenv لإنشاء وإدارة بيئات افتراضية، وتحسين تنظيم مشروعك وتجنب تعارضات الإصدار. إعداد التحكم في الإصدار Version Control يعد التحكم في الإصدار أمرًا بالغ الأهمية لإدارة التغييرات في قاعدة التعليمات البرمجية الخاصة بك والتعاون مع الآخرين. جيت Git هو أكثر أنظمة التحكم في الإصدارات شيوعًا. أنشئ مستودع جيت لمشاريع الذكاء الاصطناعي الخاصة بك لتتبع التغييرات والتعاون مع أعضاء الفريق والاحتفاظ بسجل لقاعدة التعليمات البرمجية الخاصة بك. يمكنك الاطلاع على سلاسل مقالات كاملة للتعرّف على كيفية التعامل مع جيت من قسم Git التعليمي. استكشاف المنصات السحابية Cloud Platforms نظرًا لأن مشاريع الذكاء الاصطناعي أصبحت أكثر تعقيدًا، فقد تحتاج إلى قوة حسابية إضافية. توفر المنصات السحابية مثل خدمات أمازون ويب Amazon Web Services وسحابة جوجل Google Cloud ومايكروسوفت أزور Microsoft Azure موارد لتطوير الذكاء الاصطناعي ونشره. تعرّف على هذه المنصات لتسخير قدراتها في بناء مشاريعك. إن إنشاء بيئة تطوير قوية يضع الأساس لبرمجة ناجحة للذكاء الصناعي. مع بايثون ومكتبات الذكاء الصناعي و بيئة التطوير المتكاملة المناسبة والتحكم في الإصدار، فأنت مجهز جيدًا لبدء رحلة الذكاء الصناعي الخاصة بك. تجدر الإشارة أيضًا، إلا أن المبدتئين يمكنهم تجاوز الخطوات 6 و 7 مبدأيًا، والخوض بهما لاحقًا عند الحاجة. مراحل برمجة نموذج ذكاء اصطناعي؟ تتضمن عملية تطوير نماذج الذكاء الصناعي مرحلتين أساسيتين هما: عملية التدريب وعملية التقييم. إنهما مرحلتين حاسمتين في برمجة الذكاء الصناعي. مرحلة التدريب هي المرحلة التي يتعلم فيها نموذجك من البيانات ويضبط معلماته Parameters (العناصر القابلة للتعديل داخل النموذج، والتي تؤثر بشكل كبير على أداء النموذج وسلوكه) لعمل تنبؤات دقيقة في العالم الحقيقي. يتمثل دورك كمبرمج للذكاء الصناعي في هذه المرحلة في بناء النموذج وإعداد البيانات اللازمة للتدريب والتأكد من أن نموذجك يتعلم من البيانات بشكل فعّال وينتج تنبؤات دقيقة (أي التدريب ومراقبة صحة عملية التدريب). أما مرحلة التقييم، فهي المرحلة التي تلي مرحلة التدريب، حيث تتضمن سلسلة من الاختبارات اللازمة للتأكد من مدى فعالية النموذج عند تعريضه لبيانات العالم الحقيقي. من خلال فهم الفروق الدقيقة في تدريب النموذج والتحقق من صحة التدريب والتقييم، ستتمكن من ضبط تطبيقات الذكاء الصناعي الخاصة بك للحصول على الأداء الأمثل. ستمهد هذه المعرفة الطريق لك لإنشاء نماذج ذكاء اصطناعي أكثر تطوراً ودقة في المستقبل. نشر نماذج الذكاء الاصطناعي تظهر القيمة الحقيقية لنموذج الذكاء الصناعي عند نشره واستخدامه في سيناريوهات العالم الحقيقي، إنه الخطوة المحورية التي تحول الخوارزميات المدربة من تجارب إلى حلول عملية. إنها المرحلة التي يتم فيها إتاحة نماذج الذكاء الصناعي الخاصة بك للتفاعل مع العالم الحقيقي وإجراء تنبؤات أو تصنيفات أو قرارات. نتحدث في هذا القسم عن تعقيدات نشر نماذج الذكاء الصناعي ونغطي الاعتبارات المختلفة للنشر الناجح. اختيار نهج النشر الصحيح عند نشر نماذج الذكاء الاصطناعي، لديك عدة خيارات، لكل منها مزاياها ومقايضاتها. سنناقش طريقتين أساسيتين للنشر: النشر المحلي والنشر المستند إلى مجموعة النظراء. النشر المحلي أو النشر في أماكن العمل On-Premises Deployment: يوفر نشر نماذج الذكاء الصناعي في أماكن العمل درجة عالية من التحكم والأمان وخصوصية البيانات. يتضمن نهج النشر هذا استضافة نماذج الذكاء الصناعي الخاصة بك على الخوادم المحلية أو الأجهزة المتطورة داخل البنية التحتية لمؤسستك. يعد النشر المحلي مفيدًا بشكل خاص عند التعامل مع البيانات الحساسة أو عندما تكون التفاعلات ذات زمن الوصول المنخفض ضرورية. النشر المستند إلى السحابة Cloud-Based Deployment: أحدث النشر المستند إلى السحابة ثورة في طريقة إتاحة نماذج الذكاء الاصطناعي للمستخدمين، مما يوفر قابلية التوسع وإمكانية الوصول والتكلفة المنخفضة. هنا تحتاج إلى تحديد مزود الخدمة السحابية المناسب الذي يناسب متطلبات مشروعك، وأشهرها خدمات أمازون ويب Amazon Web Services ومنصة جوجل السحابية Google Cloud Platform ومايكروسوفت آزور Microsoft Azure. تحسين النموذج المستمر يعد تحسين النموذج للنشر خطوة مهمة لضمان أن تكون نماذج الذكاء الصناعي فعّالة وسريعة وقادرة على تقديم تنبؤات دقيقة في سيناريوهات العالم الحقيقي. نظرًا لأن نماذج الذكاء الصناعي أصبحت أكثر تعقيدًا، فإن حجمها ومتطلباتها الحسابية يمكن أن تشكل تحديات عند نشرها على أجهزة مختلفة، من الأجهزة المتطورة إلى الخوادم السحابية. تلعب تقنيات تحسين النموذج دورًا مهمًا لمواجهة هذه التحديات. أهم هذه التقنيات هم التكميم والتقليم والضغط. يمكن لممارسي الذكاء الاصطناعي تحقيق توازن بين أداء النموذج وكفاءة النشر من خلال الخوض في استراتيجيات التحسين هذه، مما يضمن أن حلول الذكاء الصناعي الخاصة بهم تقدم النتائج بسرعة وفعاليّة. التكميم Quantization: التكميم هو تقنية مهمة في مجال نشر نماذج الذكاء الاصطناعي. يتضمن تقليل دقة القيم العددية في معلمات النموذج، عادةً من عرض بت أعلى (على سبيل المثال، 32 بت) إلى عرض بت أقل (على سبيل المثال، 8 بتات). ينتج عن هذه العملية تمثيل أفضل عمليًا للنموذج، مما يقلل بشكل كبير من استخدام الذاكرة ويحسن سرعة الاستدلال. إذًا يتيح التكميم نشر نماذج الذكاء الصناعي بكفاءة على الأجهزة محدودة الموارد مثل الأجهزة المتطورة والهواتف المحمولة وأجهزة إنترنت الأشياء، وذلك من خلال التضحية بالقليل من الدقة. إنه يحقق توازنًا بين الكفاءة الحسابية والحفاظ على الأداء المعقول، مما يجعله أداة لا غنى عنها في ترسانة مهندسي الذكاء الصناعي الذين يسعون جاهدين للحصول على حلول النشر المثلى. التقليم Pruning: التقليم هو أسلوب آخر في مجال تحسين نموذج الذكاء الصناعي للنشر، يهدف إلى تبسيط التعقيد وتحسين كفاءة النماذج المُدرّبة. تتضمن هذه العملية القضاء الانتقائي على الاتصالات الزائدة أو العقد أو المعلمات من الشبكة العصبية، وبالتالي تقليل حجمها الكلي مع السعي للحفاظ على أدائها في نفس الوقت. لا ينتج عن التقليم نماذج أخف وأسرع أثناء الاستدلال فحسب، بل يساهم أيضًا في معالجة مشكلات الضبط المُفرط Overfitting. إذًا يعمل التقليم على تحسين قدرات التعميم من خلال إزالة المكونات الأقل تأثيرًا في النموذج، وغالبًا ما يؤدي إلى تحسين الدقة عمومًا. تُقدّم هذه التقنية إمكانية التوازن بين تعقيد النموذج والأداء، وتوضح كيف يمكن أن يؤدي التبسيط الاستراتيجي إلى حلول ذكاء اصطناعي أكثر مرونة وفعالية. الضغط Compression: يعد الضغط تقنية أخرى في عالم نشر نماذج الذكاء الصناعي. يهدف أيضًا إلى تحقيق توازن بين دقة النموذج وكفاءة الموارد. تلعب تقنيات الضغط دورًا مهمًا في تقليل الذاكرة التي يستهلكها النموذج وتسريع الاستدلال دون التضحية الكبيرة في الأداء التنبئي، وذلك من خلال إزالة المعلومات الزائدة واستغلال الأنماط داخل معلمات النموذج. لا يؤدي الضغط إلى تحسين متطلبات التخزين فحسب، بل يُقلل أيضًا الزمن اللازم للتنبؤ. من تقليم الاتصالات غير المهمة إلى تحديد قيم المعلمات، يمكّن الضغط مطوري الذكاء الاصطناعي من نشر نماذج قوية وفعّالة عمليًا، مما يضمن السلاسة عبر الأجهزة وسيناريوهات الاستخدام المحتملة. الأمان والخصوصية تعتبر اعتبارات الأمان والخصوصية في عملية نشر نماذج الذكاء الاصطناعي ذات أهمية قصوى. نظرًا لأن نماذج الذكاء الاصطناعي تتفاعل مع البيانات الحساسة وتقوم بالتنبؤات التي تؤثر على القرارات الحاسمة، فإن الحماية من الوصول غير المصرح به وضمان الاستخدام الأخلاقي يصبح أمرًا ضروريًا. يعد تنفيذ إجراءات أمنية قوية أمرًا ضروريًا للحفاظ على ثقة المستخدم والامتثال للوائح. تلعب تقنيات مثل التشفير دورًا محوريًا في تأمين البيانات أثناء النقل والتخزين. تساعد المصادقة المستندة إلى الرمز المميز والتحكم في الوصول المُستند إلى الدور -في تنظيم من يمكنه الوصول إلى واجهات برمجة تطبيقات الذكاء الاصطناعي، مما يضمن أن المستخدمين المُصرّح لهم فقط هم من يمكنهم إجراء تنبؤات. إضافةً إلى ذلك ونظرًا لأن أنظمة الذكاء الصناعي غالبًا ما تتعامل مع المعلومات الشخصية والسرية، فمن الضروري اعتماد أساليب الحفاظ على الخصوصية، مثل إخفاء البيانات وحماية الهويات الشخصية. إذًا من خلال تضمين اعتبارات الأمان والخصوصية عند نشر نماذج الذكاء الاصطناعي، يؤمّن المطورون بيئة أكثر أمانًا ومسؤولية لمستخدمي الذكاء الصناعي. المراقبة والصيانة المراقبة والصيانة هما شريان الحياة لنماذج الذكاء الصناعي المنشورة، حيث تضمنان استمرار دقتها وموثوقيتها وأدائها. بعد نشر نموذج الذكاء الصناعي الخاص بك، من المهم إنشاء نهج منظّم لمراقبة سلوكه ومعالجة أي مشكلات قد تنشأ لاحقًا. تتضمن المراقبة تتبع مقاييس مختلفة، مثل دقة التنبؤ وأوقات الاستجابة واستخدام الموارد لاكتشاف الأخطاء أو الانحرافات عن السلوك المتوقع. يجري ذلك من خلال إعداد التنبيهات والفحوصات الآلية، وبالتالي إمكانية تحديد أي مشكلات ومعالجتها على الفور قبل أن تؤثر على المستخدمين أو العمليات التجارية. بالنسبة للصيانة فهي تتجاوز موضوع الكشف عن الخلل وإصلاحه؛ إنها تنطوي على إدارة نماذج الذكاء الصناعي الخاصة بك بمرور الوقت، فمع تغيّر البيانات وتطور متطلبات المستخدم، قد يحتاج نموذجك إلى تحديثات دورية ليظل فعّالاً. تتضمن الصيانة أيضًا تحديد إصدارات النماذج وواجهات برمجة التطبيقات، مما يتيح لك إجراء تحسينات دون الإخلال بتجربة المستخدم. يضمن الاختبار المنتظم والتحقق من صحة سير العمل وقياس الأداء مقابل البيانات الجديدة، استمرار نماذجك في تقديم نتائج دقيقة. من خلال ضبط نماذجك باستمرار وإبقائها مواكبة لأحدث التطورات، فإنك تضمن أن حلول الذكاء الاصطناعي المنشورة تظل أصولًا قيّمة لمؤسستك. مستقبل برمجة الذكاء الاصطناعي يتطور مجال برمجة الذكاء الصناعي بسرعة، ويحمل المستقبل إمكانيات مثيرة للاهتمام. من المرجح أن تصبح الحلول التي تعمل بالذكاء الصناعي أكثر سهولة، مع الأدوات التي تسمح للمطورين بمستويات مختلفة من الخبرة لإنشاء تطبيقات الذكاء الصناعي. نستكشف الآن الاتجاهات والتحديات والإمكانيات التي تنتظر مستقبل برمجة الذكاء الصناعي. من الخوارزميات إلى أنظمة التعلم تتضمّن برمجة الذكاء الاصطناعي تقليديًا، صياغة خوارزميات معقدة لحل مشاكل محددة. إن مستقبل برمجة الذكاء الصناعي يتميز بالتحول نحو بناء أنظمة التعلم التي يمكن أن تتكيف وتتطور. لقد دفع التعلم الآلي وتقنيات التعلم العميق هذا التطور، مما مكّن أجهزة الحاسب من التعلم من البيانات وتحسين أدائها بمرور الوقت. نظرًا لأن برمجة الذكاء الصناعي تصبح أكثر اعتمادًا على البيانات، سيركز المطورون بشكل متزايد على إنشاء خوارزميات تعلم قوية وقابلة للتكيف والتطور وفقًا للبيانات. التعاون مع التخصصات الأخرى لم تعد برمجة الذكاء الصناعي مجالًا لعلماء الحاسب فقط. سيشهد المستقبل تعاونًا متزايدًا بين مبرمجي الذكاء الصناعي وخبراء المجال وعلماء الأخلاق وعلماء النفس وغيرهم من المتخصصين. سيتطلب بناء أنظمة ذكاء اصطناعي ناجحة اتباع نهج متعدد التخصصات لضمان توافق التكنولوجيا مع احتياجات وقيم العالم الحقيقي. الذكاء الاصطناعي القابل للتفسير عندما تصبح أنظمة الذكاء الاصطناعي أكثر تعقيدًا، يمكن أن تظهر عمليات اتخاذ القرار الخاصة بها على أنها "صناديق سوداء". هذا النقص في الشفافية يعيق التبني الأوسع للذكاء الاصطناعي في التطبيقات الهامة (عدم الثقة بقرار لاتعرف كيف أُنتج). سيشهد المستقبل طفرة في جهود البحث والتطوير لإنشاء أنظمة ذكاء اصطناعي قابلة للتفسير. ستوفر هذه الأنظمة رؤى حول كيفية توصل نماذج الذكاء الصناعي إلى قراراتهم، وبالتالي تعزيز الثقة بقرارات هذه النماذج وإمكانية التفسير. التعلم الآلي التلقائي AutoML أصبحت برمجة الذكاء الاصطناعي نفسها أكثر ذكاءً. يشهد التعلم الآلي التلقائي اهتمامًا كبيرًا بين الباحثين والشركات. إنه مجال يُركز على أتمتة المراحل المختلفة من خط أنابيب التعلم الآلي. سيستخدم المطورون أدوات AutoML لاختيار الخوارزميات وعمليات المعالجة المسبقة وتحسين النماذج تلقائيًا، مما يجعل من عملية تطوير نماذج الذكاء الصناعي أكثر سهولة. واجهات اللغة الطبيعية تتضمن برمجة الذكاء الاصطناعي التقليدية كتابة التعليمات البرمجية بلغات البرمجة. قد يتضمن المستقبل برمجة أنظمة الذكاء الاصطناعي باستخدام لغة طبيعية، أي أن مفهوم برمجة الذكاء الاصطناعي من الممكن أن يصبح أكثر تطورًا وسهولة. سيؤدي ذلك إلى إضفاء الطابع الديمقراطي على تطوير وبرمجة الذكاء الاصطناعي، مما يسمح للأفراد الذين ليس لديهم خبرة في كتابة الشيفرت البرمجية، بإنشاء تطبيقات ذكية من خلال محادثات بسيطة مع واجهات الذكاء الاصطناعي. الحوسبة المتطورة والذكاء الاصطناعي تستعد حوسبة الحافة Edge Computing (نموذج حوسبة يهدف إلى تنفيذ المعالجة والحوسبة قرب مصادر البيانات "الحواف")، لتشكيل مستقبل برمجة الذكاء الاصطناعي. ستحتاج خوارزميات الذكاء الاصطناعي إلى التحسين للنشر على الأجهزة محدودة الموارد مثل الهواتف الذكية وأجهزة إنترنت الأشياء والأنظمة المدمجة. سيتطلب ذلك مستوى جديدًا من الكفاءة والقدرة على التكيف في برمجة الذكاء الاصطناعي. التعلم المستمر مدى الحياة والذكاء الاصطناعي غالبًا ما يتم تدريب أنظمة الذكاء الاصطناعي التقليدية على مجموعات البيانات الثابتة. سيشهد المستقبل صعود التعلم المستمر والذكاء الاصطناعي مدى الحياة، حيث يمكن للأنظمة التعلم من البيانات الجديدة وتكييف معارفها دون نسيان تجارب التعلم السابقة. سيتطلب ذلك تقنيات خاصة لبرمجة الذكاء الاصطناعي تسهل التكامل السلس للمعلومات الجديدة في النماذج الحالية. برمجة الذكاء الاصطناعي الكمومية سيؤدي ظهور الحوسبة الكمومية Quantum computing إلى إحداث نقلة نوعية في برمجة الذكاء الاصطناعي. تمتلك أجهزة الحاسب الكمومية القدرة على إحداث ثورة في خوارزميات التعلم الآلي والعميق ومشكلات التحسين. سيشهد المستقبل قيام مبرمجي الذكاء الاصطناعي بالتعمق في برمجة الذكاء الاصطناعي الكمومي لتسخير قوة الحوسبة الكمومية من أجل حلول ذكاء اصطناعي أسرع وأكثر كفاءة. الذكاء الاصطناعي المرتكز على الإنسان إن مستقبل برمجة الذكاء الاصطناعي لا يقتصر فقط على بناء آلات أكثر ذكاءً؛ يتعلق الأمر بإنشاء ذكاء اصطناعي يكمل القدرات البشرية ويزيدها. ستصبح أنظمة الذكاء الاصطناعي أكثر تخصيصًا، بحيث تتكيف مع تفضيلات واحتياجات المستخدمين الفرديين. يتطلب هذا التحول من مبرمجي الذكاء الاصطناعي التأكيد على مبادئ التصميم التي تتمحور حول الإنسان، وإنشاء أنظمة تعزز الخبرات البشرية والإنتاجية. التعلم الموحد مفهوم تحولي آخر يأتي مع انتشار الأجهزة المتصلة عبر الشبكات، حيث يُمكّن نماذج الذكاء الاصطناعي من التدريب بطريقة تعاونية عبر العديد من الأجهزة اللامركزية المتصلة بالشبكة، دون الحاجة إلى نقل البيانات الأولية إلى خادم مركزي. الذكاء الاصطناعي وإنترنت الأشياء IoT يمثل تكامل الذكاء الاصطناعي مع إنترنت الأشياء تقاربًا بين تقنيتين تحويليتين تمتلكان القدرة على إعادة تشكيل الصناعات والحياة اليومية. يشير إنترنت الأشياء IoT إلى شبكة من الأجهزة المادية المترابطة والمجهزة بأجهزة استشعار وبرامج واتصالات، مما يمكنها من جمع البيانات وتبادلها. من الناحية الأخرى، يُمكّن الذكاء الاصطناعي الآلات من محاكاة الوظائف الإدراكية البشرية مثل التعلم والاستدلال واتخاذ القرار. عندما تتضافر هاتان القوتان، تظهر أوجه تآزر ملحوظة. يضفي الذكاء الاصطناعي براعته التحليلية على الكم الهائل من البيانات التي تنتجها أجهزة إنترنت الأشياء. يمكن لهذه الأجهزة جمع البيانات من البيئة أو تفاعلات المستخدم أو حتى من الأجهزة الأخرى. يمكن لخوارزميات الذكاء الاصطناعي بعد ذلك معالجة هذه البيانات لاستخراج الأنماط والاتجاهات والحالات الشاذة التي يصعب على المحللين البشريين تمييزها في الزمن الحقيقي. تخيل مدينة ذكية حيث تتعاون الأجهزة المترابطة في إشارات المرور والكاميرات والمركبات لتحسين تدفق حركة المرور استجابةً لظروف الوقت الفعلي. تعالج خوارزميات الذكاء الاصطناعي البيانات من هذه الأجهزة وتتنبأ بالازدحام المروري وتضبط توقيت إشارات المرور ديناميكيًا للتخفيف من الاختناقات. التحديات والقيود في برمجة الذكاء الاصطناعي في حين أن مجال برمجة الذكاء الاصطناعي يوفر فرصًا هائلة، إلا أنه مصحوب أيضًا بمجموعة من التحديات والقيود التي يجب على المطورين التعامل معها. أبرزها: جودة البيانات وكميتها الموارد الحسابية القابلية للتفسير والشرح الأخلاق والتحيز الافتقار إلى الفطرة السليمة وفهم السياق التعميم والقدرة على التكيف الأمان والخصوصية استهلاك الطاقة التعاون بين الإنسان والذكاء الاصطناعي التعلم المستمر والتحديثات 1. جودة البيانات وكميتها تعتمد أنظمة الذكاء الاصطناعي بشكل كبير على البيانات للتعلم واتخاذ القرارات. يمكن أن تؤثر جودة وكمية البيانات المتاحة بشكل كبير على أداء نماذج الذكاء الاصطناعي. يمكن أن تؤدي البيانات غير الكاملة أو المتحيزة أو التي تتضمّن أخطاءً إلى تنبؤات غير دقيقة ونتائج غير موثوقة. 2. الموارد الحسابية تتطلب خوارزميات الذكاء الاصطناعي، وخاصة نماذج التعلم العميق، موارد حسابية كبيرة. تتطلب نماذج التدريب المعقدة أجهزة قوية، وعلى الرغم من أن الحوسبة السحابية جعلت هذه الموارد أكثر سهولة، إلا أن التكلفة والتوافر لا يزالان من القيود المفروضة على بعض المشاريع. 3. القابلية للتفسير والشرح مع ازدياد تعقيد أنظمة الذكاء الاصطناعي، يصبح فهم كيفية التوصل إلى قرارات معينة تحديًا متزايدًا. يمكن أن يؤدي هذا الافتقار إلى الشفافية إلى إعاقة الثقة والتبني، خاصة في التطبيقات المهمة مثل الرعاية الصحية والتمويل. 4. الأخلاق والتحيز يمكن لنماذج الذكاء الاصطناعي أن تديم التحيزات الموجودة في بيانات التدريب دون قصد، مما يؤدي إلى نتائج غير عادلة أو تمييزية. يمثل تحقيق التوازن بين قدرات اتخاذ القرار في الذكاء الاصطناعي والاعتبارات الأخلاقية تحديًا مستمرًا. 5. الافتقار إلى الفطرة السليمة وفهم السياق تكافح أنظمة الذكاء الاصطناعي مع التفكير المنطقي وفهم السياق بنفس الطريقة التي يعمل بها البشر. قد يتفوقون في مهام محددة لكنهم يفتقرون إلى الفهم الأوسع الذي يمتلكه البشر. 6. التعميم والقدرة على التكيف بينما يمكن تدريب نماذج الذكاء الاصطناعي على أداء مهام محددة، قد يكون نقل تلك المعرفة إلى سيناريوهات أو مجالات جديدة أمرًا صعبًا. لا يزال تحقيق القدرة الحقيقية على التكيّف عبر مختلف السياقات يمثل تحديًا مستمرًا. 7. الأمان والخصوصية أنظمة الذكاء الاصطناعي التي تتعامل مع البيانات الحساسة عرضة للانتهاكات الأمنية. بالإضافة إلى ذلك، يشكل ضمان الخصوصية عند التعامل مع بيانات المستخدم تحديات أخلاقية وقانونية تتطلب دراسة متأنية. 8. استهلاك الطاقة يمكن أن يكون تدريب نماذج التعلم العميق مُستهلكًا كبيرًا للطاقة، مما يساهم في إثارة المخاوف بشأن التأثير البيئي لتطوير الذكاء الاصطناعي. 9. التعاون بين الإنسان والذكاء الاصطناعي إن دمج الذكاء الاصطناعي بسلاسة في سير العمل البشري يعتبر تحديًا، ويتطلب التأكد من أن الذكاء الاصطناعي يُكمل المهارات البشرية ويساعد بشكل فعال، وهذا يتطلب فهماً عميقاً لكلا المجالين. 10. التعلم المستمر والتحديثات تحتاج نماذج الذكاء الاصطناعي إلى التطور بمرور الوقت لتبقى ملائمة ودقيقة. يتطلب تحديث النماذج والتحسين المستمر لأدائها جهدًا مستمرًا. التعرف على هذه القيود أمر بالغ الأهمية لإنشاء أنظمة ذكاء اصطناعي مسؤولة وفعالة. تتطلب مواجهة هذه التحديات التعاون بين الباحثين والمطورين وواضعي السياسات والمجتمع ككل. بينما ندفع حدود برمجة الذكاء الاصطناعي، من المهم الحفاظ على منظور متوازن والعمل على التغلب على هذه العقبات من أجل تحسين مستقبلنا الذي يحركه الذكاء الاصطناعي. مصادر تعلم برمجة الذكاء الاصطناعي يعد التعرف على الذكاء الاصطناعي رحلة مثيرة تتطلب الوصول إلى مجموعة متنوعة من الموارد لتعميق فهمك ومهاراتك. فيما يلي بعض موارد تعلم الذكاء الاصطناعي القيمة لمساعدتك على البدء والتقدم في هذا المجال: الدورات التدريبية هناك العديد من الموارد المتاحة عبر الإنترنت لتعلم برمجة الذكاء الاصطناعي. تقدم أكاديمية حسوب دورة شاملة لتعلم برمجة الذكاء الاصطناعي باستخدام لغة بايثون، التي تعد كما ذكرنا اللغة الأساسية لكتابة تطبيقات ونماذج الذكاء الصناعي، حيث يمكنك تعلمها من خلال دورة الذكاء الاصطناعي التي تعد دورة شاملة لاحتراف برمجة الذكاء الاصطناعي وتحليل البيانات وتعلم كافة المعلومات المطلوبة لبناء نماذج ذكاء اصطناعي متخصصة مع مُدربين مُميزين يُرافقونك طوال الدورة للإجابة عن استفساراتك. تبقى الدورة مفتوحة لك مدى الحياة، كما أنها تطور باستمرار لمواكبة أحدث التطورات في المجال. الكتب يُمثل كتاب مدخل إلى الذكاء الاصطناعي وتعلم الآلة نقطة بدءٍ مناسبةٍ للمبتدئين الذين يرغبون الخوض في هذا المجال ويرغبون في فهم المفاهيم الأساسية للتعلم العميق والشبكات العصبية وتعلم الآلة، حيث يبدأ الكتاب معك من الأساسيات ليمهد الطريق أمامك لتعلم هذا العلم. يمكنك أيضًا الاطلاع على كتاب عشرة مشاريع عملية عن الذكاء الاصطناعي إما بعد الكتاب السابق أو يمكنك البدء به مباشرة إن كانت لديك خبرة أساسية. مؤتمرات وورش عمل الذكاء الاصطناعي يُعتبر مؤتمر NeurIPS أحد أكبر مؤتمرات الذكاء الاصطناعي مع العروض التقديمية وورش العمل. هناك أيضًا مؤتمر CVPR الذي يُركز على رؤية الحاسب والتعلم العميق و ICML يُغطي أبحاث وتطبيقات التعلم الآلي. المقالات والمدونات يمكنك أيضًا الاطلاع على عشرات المقالات المتعلقة بالذكاء الصناعي، والتي توفرها أكاديمية حسوب في قسم الذكاء الاصطناعي. المجتمعات عبر الإنترنت يوفر قسم أسئلة وأجوبة في أكاديمية حسوب إمكانية طرح أسئلة للإجابة عليها من قبل مختصين في كافة المجالات ومنها مجال برمجة الذكاء الاصطناعي. البرمجة والممارسة يُقدّم موقع كاغل Kaggle مسابقات في الذكاء الاصطناعي ومجموعات بيانات وموارد سحابية لتدريب النماذج. يمكنك أيضًا الذهاب إلى غيت هاب GitHub لاستكشف مشاريع ومستودعات الذكاء الاصطناعي مفتوحة المصدر. تُمكّنك أكاديمية حسوب أيضًا من البدء بإنشاء مشاريعك من خلال الاطلاع على مشاريع مرجعية مشروحة ومنظمة جيدًا. مثل كتاب عشرة مشاريع عملية عن الذكاء الاصطناعي. الوثائق الرسمية لأطر عمل الذكاء الاصطناعي اطلع على الوثائق الرسمية والبرامج التعليمية مثل توثيق باي تورش PyTorch وتوثيق تنسرفلو TensorFlow عبر موقعهم الرسمي. فهم يقدمون شروحات موجزة وأمثلة وحالات استخدام مختلفة إضافة إلى التوثيق الرسمي لكافة الأدوات المستخدمة في بناء وبرمجة الذكاء الاصطناعي. تذكر أن الذكاء الاصطناعي هو مجال سريع التطور، لذا فإن البقاء على اطلاع بأحدث الأوراق البحثية والتطورات أمر هام، كما أن البقاء على اطلاع على أحدث الأدوات المستخدمة في برمجة الذكاء الاصطناعي هو أمر هام أيضًا. استخدم مجموعة من هذه الموارد لبناء أساس قوي ومواصلة التفاعل مع مجتمع الذكاء الاصطناعي. خاتمة برز عالم الذكاء الاصطناعي كثورة ضمن المشهد التكنولوجي سريع التطور الذي ظهر في العقود القليلة الماضية، يقدم فرصًا وتحديات لا حدود لها على حد سواء. بينما كنا نتعمق في عالم برمجة الذكاء الاصطناعي، شرعنا في رحلة بدأت من التحدث عن لغات وأدوات برمجة الذكاء الاصطناعي إلى المكتبات والأطر المتطورة وإنشاء نماذج الذكاء الاصطناعي ونشر هذه النماذج. بالنظر إلى الأُفق، اكتشفنا المستقبل الذي ينتظر برمجة الذكاء الاصطناعي. إن مفاهيم مثل الذكاء الاصطناعي القابل للتفسير والتعلم الموحد ودمج الذكاء الاصطناعي مع إنترنت الأشياء هي المفتاح لفتح أبعاد جديدة للابتكار. بينما نرتقي إلى مستويات أعلى، يجب أن نعترف بالقيود والاعتبارات الأخلاقية التي تقدمها برمجة الذكاء الاصطناعي ونعالجها. أخيرًا، كان لابد لنا من ذكر بعض من المصادر الهامة لتعلّم الذكاء الصناعي. في الختام، مجال برمجة الذكاء الاصطناعي هو نسيج معقد منسوج بخيوط من الابتكار والأخلاق وإمكانات لا حدود لها. بينما نتنقل في هذا المشهد المعقد، فإننا لسنا مجرد مبرمجي آلات؛ نحن نشكل مستقبل الأنظمة الذكية التي لديها القدرة على إحداث ثورة في الصناعات وتعزيز حياة البشر وإعادة تعريف نسيج وجودنا التكنولوجي. إن سمفونية جهودنا في برمجة الذكاء الاصطناعي تتماشى مع الوعد بمستقبل حيث تشرع الآلات، مسترشدةً ببراعتنا، في رحلة من الذكاء والفهم. انظر أيضًا تعلم الذكاء الاصطناعي تعلم الآلة: التحديات الرئيسية وكيفية التوسع في المجال
    2 نقاط
  25. هل أنت مهتم بتطوير التطبيقات وتريد تعلم برمجة تطبيق احترافي لكنك لا تعلم كيف تبدأ وما هي الخطوات التي عليك اتباعها كي تطور تطبيقك بأفضل صورة ممكنة؟ هذا المقال يضعك في بداية الطريق ويوضح لك أنواع التطبيقات المختلفة وأبرز مميزاتها ويعرفك على لغات برمجة التطبيقات التي عليك تعلمها بأسلوب بسيط وسهل ما معنى برمجة تطبيق؟ تعني برمجة التطبيق القيام بمجموعة من العمليات والإجراءات الضرورية لكتابة برنامج يعمل على جهاز الحاسوب أو الجوال أو غيرها من الأجهزة القابلة للبرمجة ويؤدي مهمة معينة تفيد مستخدم هذا الجهاز. كي تتمكن من برمجة تطبيق ما يجب أن تضع في الحسبان عدة اعتبارات مثل تحديد نوع التطبيق الذي ستقوم بإنشائه والمنصة أو نظام التشغيل الذي سيعمل تطبيقك عليه والتقنيات التي سوف تستخدمها لتطوير التطبيق وطريقة نشر التطبيق وإتاحته للمستخدمين وغيرها من الأمور التي سنتطرق لشرحها في الفقرات التالية. أهمية برمجة التطبيقات في سوق العمل تأتي أهمية برمجة التطبيقات من أهمية التطبيقات نفسها والاعتماد الكبير عليها لأداء المهام المختلفة في العمل والحياة اليومية. فالأشخاص اليوم ينجزون معظم أعمالهم اليومية من تسوق ودفع وفواتير ولعب وتواصل مع الأصدقاء عبر تطبيقات على هواتفهم أو حواسيبهم، كما تعتمد شركات الأعمال اليوم التطبيقات بشكل أساسي للتسويق لعلامتها التجارية وتسيير أعمالها والتفاعل مع عملائها. لذا تعد برمجة التطبيقات من تخصصات البرمجة الأعلى أجرًا والأكثر طلبًا في سوق العمل، فمعظم الشركات اليوم تحتاج إلى مطورين لبرمجة تطبيقات خاصة بها أو تحسين التطبيقات الحالية وصيانتها والتأكد من أنها تعمل بشكل صحيح، كما أن تطوير التطبيقات يوفر لك فرصة العمل بشكل مستقل وتقديم خدماتك في مواقع العمل الحر العربية والعالمية، كما يمكنك كذلك تطوير تطبيقاتك الخاصة ورفعها على متاجر التطبيقات وتحقيق الربح منها. ما نوع التطبيق الذي يمكنك برمجته؟ قبل أن تبدأ ببرمجة أي تطبيق عليك تحديد نوع التطبيق الذي تنوي برمجته فأنواع التطبيقات كثيرة ومتنوعة وتختلف باختلاف أنواع الأجهزة التي ستعمل عليها وأنظمة التشغيل التي تتوافق معها، وتشمل الأنواع الرئيسية التالية: تطبيق الجوال Mobile App وهو عدة أنواع: تطبيق جوال أصيل Native Mobile App: هو تطبيق مصمم خصيصًا لنظام تشغيل الجوال الذي يعمل عليه، على سبيل المثال هناك تطبيقات جوال مخصصة لنظام أندرويد Android وأخرى مخصصة لنظام iOS ولا يمكنك استخدام تطبيق iOS أصيل على جهاز أندرويد أو العكس. تطبيق جوال هجين Hybrid Mobile App: هو تطبيق قادر على العمل على كافة أنواع المنصات والأجهزة ويبرمج من خلال تقنيات الويب HTML و CSS و JavaScript ثم يحول بتقنيات معينة ليتناسب كل منصة. تطبيق عابر للمنصات Cross-platform App: هو تطبيق قادر على العمل على كافة أنواع المنصات مثل التطبيق الهجين لكنه يبرمج باستخدام تقنيات وأطر عمل قابلة للتشغيل على أكثر من منصة. تطبيق ويب Web App: هو تطبيق يمكنه العمل على أي جهاز لأن الوصول إليه يتم من خلال متصفح الإنترنت، ولا داعي لتحميله على جهازك كي تستخدمه، لكن ليس بمقدوره الوصول إلى موارد الجهاز مثل الكاميرا أو الميكروفون أو جهات الاتصال. تطبيق سطح مكتب Desktop App: هو برنامج مصمم للعمل على أجهزة الحواسيب المكتبية والحواسيب المحمولة التي تعمل بأنظمة التشغيل ويندوز Windows أو ماك macOS أو لينكس Linux، ولا يحتاج عادة للاتصال بالإنترنت ليعمل كل ما عليك هو تثبيته من الموقع المخصص له وبعدها يمكنك تشغيله واستخدامه. بعد أن تعرفت على أنواع التطبيقات المختلفة وعرفت الفرق بينها وحددت نوع التطبيق الذي تريد برمجته قد تتساءل كيف يمكنني برمجة التطبيق الخاص بي، وما التقنيات التي علي تعلمها للقيام بذلك؟ في الفقرات التالية سنعرفك على أهم تقنيات برمجة كل نوع من أنواع التطبيقات. برمجة تطبيقات الجوال كما ذكرنا سابقًا عند برمجة تطبيقات الجوال ستكون أمام عدة خيارات ممكنة، الخيار الأول هو برمجة تطبيق جوال أصيل مخصص لمنصة محددة أو نظام تشغيل معين وهو يبرمج بلغات متوافقة مع هذا النظام، والخيار الثاني هو برمجة تطبيق جوال يعمل على عدة منصات بذات الوقت ويمكنك إنشاء هذا النوع من التطبيقات إما من خلال إنشاء تطبيق جوال هجين يعمل من داخل متصفح مضمن أو عارض ويب WebView موجود داخل تطبيق أصيل، أو من خلال إنشاء تطبيق جوال عابر للمنصات وهو تطبيق يبرمج باستخدام تقنيات وأطر عمل يمكنها أن تعمل على عدة منصات بذات الوقت مثل منصة زامارين Xamarin من مايكروسوفت أورياكت نيتف React Native أو فلاتر Flutter فهذه المنصات تمكنك من كتابة تطبيقات تعمل على أيّ نظام تشغيل بنفس الكود البرمجي. برمجة تطبيق جوال أصيل أبرز منصتين للهواتف المحمولة هما أندرويد Android من جوجل وآي أو إس iOS من آبل، لذا في حال قررت برمجة تطبيق أندرويد فعليك في هذه الحالة استخدام لغة برمجة معتمدة من قبل نظام التشغيل أندرويد مثل لغة جافا Java أو لغة كوتلن Kotlin، أما في حال قررت برمجة تطبيق iOS فعليك في هذه الحالة استخدام لغة مدعومة من قبل هذا النظام مثل لغة البرمجة Objective-C أو لغة سويفت Swift. برمجة تطبيق جوال متعدد المنصات يمكن برمجة تطبيقات جوال قادرة على العمل عبر الأنظمة الأساسية بلغات برمجة وتقنيات وأطر عمل مختلفة ومن أبرز هذه التقنيات نذكر: إطار عمل أيونيك Ionic وهو إطار عمل جافا سكريبت مخصص لبرمجة تطبيقات الجوال الهجينة. لغة درات Dart مع إطار عمل فلاتر Flutter لبرمجة تطبيقات جوال متعددة المنصات. إطار عمل ريآكت نيتف React Native وهو إطار عمل للغة جافا سكريبت لتطوير تطبيقات متوافقة مع كافة أنظمة التشغيل باستخدام نفس الكود البرمجي. برمجة تطبيق ويب يعمل تطبيق الويب عبر شبكة الإنترنت ومن أجل برمجة تطبيق ويب ينبغي عليك الاهتمام ببرمجة الواجهة الأمامية للتطبيق التي تتحكم بمظهره وتمثل كل ما تراه في هذا التطبيق من واجهات وأزرار وخطوط، وتهتم أيضًا ببرمجة الواجهة الخلفية للتطبيق التي تتحكم في كيفية عمله وتهتم بالتعامل مع قاعدة بياناته ومعالجتها وجلب البيانات المطلوبة منها. لكل واجهة من هذه الواجهات لغات وتقنيات خاصة بها ومن أبرز لغات البرمجة والتقنيات المستخدمة في برمجة تطبيقات الويب نذكر: لغات HTML و CSS وجافا سكريبت وهي اللغات الأساسية الثلاثة المستخدمة لتطوير الواجهات الأمامية لتطبيقات الويب. لغة PHP مع إطار عمل لارافيل Laravel لتطوير الواجهات الخلفية للويب. لغة جافا سكريبت JavaScript مع بيئة Node.js وأطر عملها المختلفة مثل أنجولار Angular و فيو جي إس Vue.js و Next.js لتطوير الواجهة الأمامية و إكسبرس Express لتطوير الواجهة الخلفية لتطبيقات الويب لغة بايثون Python مع إطار العمل جانغو Django أو فلاسك flask المخصصة لتطوير الواجهات الخلفية للويب. لغة روبي Ruby مع إطار عملها Ruby on Rails الذي يستخدم لإنشاء تطبيقات الويب بسهولة وسرعة. لغة جافا Java التي توفر العديد من التقنيات الفعالة لبرمجة تطبيقات الويب مثل Servlet و JSP التي تسمح بتطوير ونشر تطبيقات الويب على الخادم بسهولة وتوفر أطر عمل قوية مثل Spring و Spring Boot. برمجة تطبيق سطح مكتب تختلف التقنيات المستخدمة في تطبيقات سطح المكتب باختلاف نظام التشغيل المستهدف ومتطلبات التطبيق نفسه. تستخدم لغات البرمجة وأدوات التطوير الخاصة بكل نظام تشغيل لبناء تجربة مستخدم فعالة وممتعة على أجهزة الكمبيوتر الشخصية والحواسيب المحمولة. هناك العديد من لغات البرمجة والتقنيات المتخصصة التي تساعدك كمبرمج تطبيقات سطح مكتب نذكر منها: لغة C و C#‎ و C++‎ وهي لغات مناسبة من أجل إنشاء تطبيق سطح مكتب مخصص للعمل على أجهزة ويندوز. لغة Objective-C أو سويفت Swift وإطار العمل كاكاو Cocoa من أجل برمجة تطبيقات سطح مكتب لنظام تشغيل ماك Mac OS. لغة C و C++‎ لبرمجة تطبيقات سطح مكتب لنظام تشغيل لينكس. لغة البرمجة جافا Java لتطوير تطبيقات سطح مكتب متوافقة مع جميع المنصات وأنظمة التشغيل Windows أو Mac OS أو Linux دون الحاجة لتعديل الكود البرمجي للتطبيق. لغة بايثون Python لبرمجة تطبيقات سطح مكتب متعددة المنصات بمساعدة مكتبات مخصصة مثل PyQt وPySide و Tkinter لغة جافا سكريبت مع إطار عمل إلكترون Electron من أجل إنشاء تطبيقات سطح مكتب متوافقة مع كافة أنظمة التشغيل باستخدام كود برمجي واحد يستخدم HTML وCSS وجافا سكريبت JavaScript. إطار عمل Universal Windows Platform أو اختصارًا UWP من أجل إنشاء تطبيق سطح مكتب مخصص لنظام تشغيل ويندوز 10 و ويندوز 11 إطار عمل Windows Presentation Foundation أو اختصارًا WPF لتطوير تطبيقات سطح مكتب لنظام ويندوز باستخدام لغة ترميز التطبيق الموسعة XAML وهو متوافق مع إطار عمل دوت نت NET الذي يحتوي على العديد من المكتبات لتحسين وظائف التطبيق الخاص بك. يمكنك استخدام مكتبة واجهة المستخدم الرسومية GTK+‎ مع لغات برمجة مختلفة مثل سي C و Python و C++‎ وروبي لإنشاء واجهات تطبيقات سطح المكتب وهي متوافقة مع أنظمة التشغيل المختلفة. يمكنك استخدام نماذج WinForms لإنشاء واجهات لتطبيقات سطح مكتب تعمل على ويندوز بسهولة من خلال السحب والإفلات. ما هي خطوات برمجة تطبيق إذا أردت تطوير تطبيق ما مهما كان نوعه فعليك اتباع مجموعة من الخطوات أو المراحل قبل أن يصبح هذا التطبيق متاح للاستخدام، وفيما يلي أهم هذه المراحل: تحديد فكرة التطبيق تحديد نوع التطبيق تحديد التقنيات التي سيبرمج بها التطبيق تحديد الوظائف الرئيسية للتطبيق تصميم واجهة التطبيق برمجة واجهات التطبيق برمجة وظائف التطبيق اختبار التطبيق نشر التطبيق التحسين المستمر للتطبيق تسويق التطبيق لنناقش كل خطوة من هذه الخطوات بمزيد من التفصيل ونتعرف على أبرز المهام التي علينا القيام بها لإنجازها. 1. تحديد فكرة التطبيق أولى خطوات برمجة التطبيق الخاص هي وضع فكرة التطبيق وميزاته والهدف منه والفئة المستهدفة وتحديد المشكلة التي يحلها والميزة التنافسية التي سيوفرها عن غيره من التطبيقات المشابهة. وفي حال لم تكن صاحب الفكرة أو التطبيق الذي ستطوره فستحتاج عندها لأن تجري عدة نقاشات مع الجهة التي ستطور لها التطبيق لاستيضاح كافة هذه التفاصيل حوله. 2. تحديد نوع التطبيق في هذه الخطوة عليك تحديد نوع التطبيق المناسب لتحقيق الأهداف التي وضعتها في الخطوة السابقة، وتحدد نوع الجهاز ونظام التشغيل الذي سيعمل عليه التطبيق وغيرها من المتطلبات اللازمة لعمل التطبيق وبناء عليها يمكنك متابعة خطوات التطوير. 3. تحديد التقنيات التي سيبرمج بها التطبيق فكما وضحنا سابقًا لكل نوع تطبيقات تقنياته ولغات البرمجة الخاصة به، حدد كافة التقنيات التي ستحتاجها للبدء ببرمجة التطبيق والعمل على إعداد بيئة التطوير اللازمة للعمل. 4. تحديد الوظائف الرئيسية للتطبيق ابدأ بوضع قائمة بجميع الميزات والوظائف التي يحتاجها التطبيق للعمل وأولوية تنفيذها بناء على المتطلبات التي جمعتها في الخطوة الأولى، قد تحتاج هذه الوظائف للتعديل فيما بعد بسبب عدم وضوح المتطلبات أو وجود رؤية شاملة عن التطبيق في البداية. 5. تصميم واجهة التطبيق حان الآن وقت تصميم واجهات التطبيق وإطاراته الهيكلية Wireframes وتوضح من خلالها لمستخدمي هذا التطبيق مميزاته وطريقة عمله والوظائف التي يؤيدها بدقة، يمكنك في هذه المرحلة استخدام إحدى أدوات تصميم واجهات المستخدم مثل فيجما Figma، كما ينبغي أن تحرص على تصميم واجهات مستخدم مثالية ذات مظهر متسق وتحقق أفضل تجربة لمستخدمي التطبيق وتتبع أفضل النصائح لتصميم واجهة المستخدم. 6. برمجة واجهات التطبيق بعد تصميم الواجهات تبدأ مرحلة برمجة واجهات التطبيق أو ما يعرف ببرمجة الواجهات الأمامية للتطبيقات frontend وهي تشمل كل العناصر التي يراها المستخدمون ويتفاعلون معها من نصوص وأزرار وصور وما شابه. 7. برمجة وظائف التطبيق قد تسير هذه الخطوة بالتزامن مع الخطوة السابقة وفيها يتم البدء بتحقيق قائمة الوظائف والمميزات المطلوبة لعمل التطبيق وبرمجة واجهته الخلفية كما يتم ربط الواجهة الأمامية والخلفية مع بعضهما، الجدير بالذكر بأنك لست مضطرًا لتحقيق كل الوظائف بآن واحد بل يمكنك تنفيذ وظيفة معينة والتأكد من عملها بالشكل الصحيح قبل الانتقال لوظيفة أخرى، تحتاج في هذه المرحلة لربط. 8. اختبار التطبيق بعد الانتهاء من برمجة التطبيق عليك اختبار خلوه من الأخطاء وللاختبار نوعان: اختبار يدوي واختبار مؤتمت، يمكن إجراء الاختبار اليدوي عن طريق إتاحة التطبيق للتجريب من قبل عينة من الأشخاص الحقيقيين للحصول على ملاحظاتهم والتأكد من أن كل الميزات تعمل بالشكل المطلوب واختبار قابلية الاستخدام وأن واجهات التطبيق سهلة وتوفر تجربة مستخدم سهلة وأنه متوافق مع مختلف المنصات والشاشات وتصلح أي أخطاء ومشكلات مكتشفة قبل نشر تطبيقك، كما يمكنك أتمتة عملية الاختبار بالتحقق من صحة التطبيق ومعرفة ما إذا كان يعمل كما هو متوقع أم لا باستخدام أدوات اختبار آلية تسرع عملية الاختبار. 9. نشر التطبيق في هذه المرحلة يمكنك نشر التطبيق للمستخدمين، يمكنك نشر التطبيق الخاص على موقع خاص بك ثم توجيه المستخدمين لتنزيله وتثبيته من هناك كما يمكنك نشره على أحد متاجر التطبيقات الرسمية بحسب نوع التطبيق ففي حال كان تطبيقك عبارة عن تطبيق أندرويد سيتوجب عليك نشره على متجر Google Play وفي حال كان تطبيق iOS عليك نشره على متجر App Store وفي حال كان تطبيق سطح مكتب موجهًا لنظام تشغيل ويندوز عليك نشره في متجر مايكروسوفت Microsoft Store وفي حال كان تطبيق سطح مكتب لنظام ماك macOS عليك نشره في متجر آبل Apple Store …إلخ. الجدير بالذكر أن نشر التطبيق على أحد متاجر التطبيقات يحتاج لتوفير مجموعة من المعايير والشروط التي عليك الالتزام بها لقبول التطبيق لذا من الضروري أن تكون ملمًا بالشروط التي تفرضها هذه المنصات وتلتزم بها خلال برمجة التطبيق الخاص بك. 10. التحسين المستمر للتطبيق بعد نشر التطبيق الخاص بك وإتاحته للمستخدمين عليك مراقبة أدائه وتتبع مراجعات المستخدمين حوله وإجراء عمليات التكامل المستمر والنشر المستمر CI/CD وتطبيق الإصلاحات والتحسينات الضرورية عندما تستدعي الضرورة. 11.تسويق التطبيق من الضروري أن تسوق لتطبيقك بشكل صحيح لا سيما إن كنت تنوي الربح من التطبيق ووضع إعلانات بداخله لذا احرص على اتباع الاستراتيجيات التسويقية الفعالة التي من شأنها إيصال التطبيق للجمهور المستهدف. مصادر تعلم برمجة تطبيق بعد تحديد نوع التطبيق الذي ترغب بتطويره ستبدأ رحلة البحث عن المصادر التي يمكن أن تتعلم من خلالها برمجة تطبيق متكامل من الألف للياء، قد تفكر في اتباع مسار جامعي ودخول أحد الكليات التقنية لكن التعلم في هذه الحالة سيكون طويلًا ومشتتًا، أو يمكنك اللجوء للتعلم الذاتي واعتماد مصادر تعليمية تفضلها من دروس ومقالات وكتب ودورات عبر الإنترنت ومعسكرات تدريبية وغيرها وهنا ستجد الكثير من المصادر وقد تتشتت فيما بينها لا سيما إن لم تتمكن من وضع خطة تعلم واضحة ومدروسة والالتزام بها الأمر الذي قد يسبب لك الإحباط والفشل. لذا من الضروري أن تحدد أحد مصادر التعلم المنظمة والموثوقة وتلتزم بخطة تعلم واضحة وإذا كنت تبحث عن مصدر موثوق للتعلم باللغة العربية فقد وفرت لك أكاديمية حسوب العديد من مصادر التعلم لمعظم التقنيات التي تحتاجها لتتعلم برمجة التطبيقات من الصفر حتى الاحتراف وفي فقراتنا التالية نسلط الضوء على أبرز هذه المصادر: تعلم برمجة تطبيق ويب إذا قررت تعلم تطوير الويب أنصحك باتباع دورة تطوير تطبيقات الويب باستخدام لغة Ruby حيث ستتعلم في هذه الدورة برمجة العديد من تطبيقات الويب بلغة البرمجة روبي وإطار عملها الشهير ريلز Rails مثل برمجة تطبيق ويب لشبكة اجتماعية تشبه تويتر، وتطبيق ويب لمجتمع إلكتروني وغيرها من التطبيقات المعدة من قبل نخبة من المطورين المحترفين والتي تؤهلك لدخول سوق العمل بسرعة واحترافية. كما توفر الأكاديمية دورة تطوير تطبيقات الويب باستخدام لغة PHP وإطار عملها لارافل Laravel التي توفر لك أكثر من عشر مسارات شاملة ويمكنك من خلال اتباعها تطوير العديد من تطبيقات الويب الاحترافية مثل نظام إدارة محتوى ومتجر إلكتروني وغيرها من تطبيقات الويب المتنوعة التي تعزز سيرتك الذاتية وتساعدك في العثور على فرصة عمل مناسبة. وفي دورة دورة تطوير التطبيقات باستخدام لغة Python ستتعلم برمجة تطبيق ويب خطوة بخطوة باستخدام إطار العمل جانغو Django وتبرمج تطبيق لإدارة المهام ومتجر إلكتروني كامل المميزات. وفي حال رغبت بتطوير واجهات التطبيق الأمامية فقط أو رغبت في تعلم التطوير الكامل full-stack فيمكنك مطالعة دورة تطوير واجهات المستخدم ففيها تتعلم بناء واجهات لعدة تطبيقات باستخدام التقنيات الأساسية HTML و CSS وجافاسكربت JavaScript إلى جانب تقنيات حديثة وأطر عمل مثل بوتستراب Bootstrap 5 و Sass و Webpack وHugo التي تسرع عملك وتجعله أكثر احترافية. تعلم برمجة تطبيق أندرويد و iOS إذا كنت مهتمًا بتطوير تطبيقات الجوال يمكنك مطالعة دورة تطوير التطبيقات باستخدام لغة Python والتي ستتمكن من خلالها من تطوير تطبيق لإدارة المهام ومتجر إلكتروني متكامل وغيرها من التطبيقات باستخدام إطار العمل جانغو Django وفلاسك Flask وهما من أشهر أطر العمل المستخدمة في تطوير تطبيقات الويب. كما توفر دورة تطوير التطبيقات باستخدام جافا سكريبت عدة مسارات غنية بالمعلومات تعلمك خطوة بخطوة برمجة تطبيقات ويب متعددة المنصات تعمل على أجهزة أندرويد و iOS من بينها تطبيق جوال للوصفات باستخدام مكتبة رياكت React مع إطار عمل أيونيك Ionic وتطبيق محادثة شبيه بتطبيق واتس أب باستخدام إطار عمل React Native وغيرها من التطبيقات المختلفة. كما يمكنك الاستفادة من الدروس والمقالات المتعددة التي توفرها الأكاديمية والتي توفر شروحات متنوعة حول برمجة تطبيقات الجوال التي تناسب المبتدئين والمحترفين على حد سواء. تعلم برمجة تطبيق سطح مكتب لازالت تطبيقات سطح المكتب مطلوبة في سوق العمل لاسيما من قبل الشركات التي تهتم بخصوصية وحماية بياناتها، فإذا كنت مهتمًا ببرمجة هذا النوع من التطبيقات ستجد في أكاديمية حسوب دورة تطوير التطبيقات باستخدام لغة Python والتي ستتعلم من خلالها أساسيات تطوير تطبيقات سطح المكتب وتطبق ما تعلمته على تطوير تطبيق لإدارة المهام ومتجر إلكتروني متكامل باستخدام جانغو Django وهو إطارعمل قوي للغة بايثون يمكنك من تطوير مواقع ويب وتطبيقات ويب آمنة وسهلة الصيانة بسرعة كبيرة. كما ستجد في دورة تطوير التطبيقات باستخدام جافا سكريبت مسارًا متخصصًا في شرح برمجة تطبيق سطح مكتب باستخدام إطار عمل إلكترون Electron js بدءًا من بناء واجهات المستخدم وصولًا لنشر التطبيق. ليس هذا فحسب فأكاديمية حسوب توفر ضمن موقها الكثير من المقالات والدروس والكتب التعليمة التي تشرح لك الكثير من الأمور المتعلقة بتطوير التطبيقات سواء تطبيقات الويب أو تطبيقات الجوال أو تطبيقات سطح المكتب والتقنيات التي تحتاج لتعلمها والتي تفيدك سواء كنت مبرمج تطبيقات مبتدئ أو خبير. الخلاصة بهذا نكون وصلنا لنهاية مقالنا الذي شرحنا فيه كل ما يتعلق ببرمجة التطبيقات بأنواعها المختلفة سواء تطبيقات الجوال أو تطبيقات الويب أو تطبيقات سطح المكتب وشرحنا خطوات برمجتها وأهميتها في سوق العمل واللغات والتقنيات التي عليك اكتساب خبرة بها لتبدأ عملك كمبرمج تطبيقات وأفضل مصادر تعلمها. وتذكر أن تعلم برمجة تطبيق قد يكون تحديًا في البداية، ولكنه ليس أمرًا صعبًا إذا نظمت وقتك في التعلم وبذلك الوقت والجهد الكافيين لذلك، فإن كنت بالفعل مهتمًا ببرمجة التطبيقات ولديك فكرة تطبيق مميزة تود تحقيقها فابدأ من الآن في رحلة برمجة التطبيقات وحوّل فكرتك إلى واقع. وفي حال واجهتك أي مشكلة أو كان لديك أي تساؤل لا تتردد في مشاركتنا إياه في التعليقات أسفل المقال أو طرحه في القسم المخصص في صفحة الأسئلة والأجوبة الخاصة بالأكاديمية. اقرأ أيضًا دليلك الشامل إلى برمجة التطبيقات مدخل إلى تطوير البرمجيات Software Development كيف تصبح مبرمج تطبيقات محترف
    2 نقاط
  26. كثيرًا ما تتردد على مسامعنا عبارة التفكير المنطقي ونسمع نصائح حول أهميته وضرورة تحسينه واستخدامه في حل مشكلات حياتنا اليومية واتخاذ القرارات الصعبة، ولعلك تتساءل ما هو التفكير المنطقي؟ وما أهميته للمبرمج وهل فعلاً كلما كان لديك منطق أفضل ستتمكن من احتراف البرمجة بشكل أسرع؟ وهل التفكير المنطقي هو مَلَكة فطرية تولد مع الشخص أم أنه مهارة مكتسبة وقابلة للتعلم والتحسين؟ إذا كنت مهتمًا بمعرفة الإجابة على كل هذه التساؤلات تابع قراءة المقال إلى النهاية. سنتعرف في مقال اليوم على ماهية التفكير المنطقي وأهميته في مجال البرمجة وأهم الطرق والأدوات التي تساعدك على اكتساب مهارات التفكير المنطقي وتحسين طريقة تفكيرك وحل الخوارزميات المعقدة. ما هو التفكير المنطقي؟ التفكير المنطقي بشكل عام هو مهارة شخصية تكسب المرء القدرة على ضبط تفكيره وتحليل المواقف والمشكلات التي تواجهه وابتكار الحلول المناسبة بناءً على المعلومات والأدلة والحقائق المتوفرة لديه، وهو يتضمن كذلك القدرة على تقسيم المشكلات المعقدة إلى أجزاء أصغر وتقييمها بشكل منهجي للوصول إلى حل. وبما أن البرمجة ما هي إلا عملية التخاطب مع الحاسوب وتوجيهه لإيجاد حل لمشكلة ما والمبرمج هو حلال المشاكل كما يقال، فإن التفكير المنطقي للمبرمج يعزز قدرته على تحليل المشكلات واستنباط الحلول واتخاذ القرارات المناسبة وتطبيق المنطق على الكود الذي يكتبه لإنتاج برامج قادرة على معالجة وتحليل البيانات وإجراء العمليات الحسابية والمنطقية عليها بشكل صحيح. خصائص التفكير المنطقي قد تتساءل ما هي الخصائص التي يجب أن أتمتع بها كي أعتبر نفسي منطقيًا وهل لدي القدرة على التفكير بشكل منطقي من أجل حل أي مشكلة أو اتخاذ أي قرار؟ لأساعدك على الإجابة دعني أعدد لك خصائص التفكير المنطقي: العقلانية وعدم التحيز العاطفي والتأثر بالمشاعر عند اتخاذ قرار ما في أي موقف. على سبيل المثال يفكر الشخص العقلاني قبل شراء منتج ما بكل إيجابياته وسلبياته وهل سيلبي هذا المنتج متطلباته أم لا ثم يتخذ قرار الشراء من عدمه. التنظيم والتخطيط المسبق لكل شيء على سبيل المثال إذا كنت تنوي الذهاب في رحلة هل تفكر مليًا قبل ذلك في كل شيء يتعلق بتفاصيل رحلتك مثل زمان ومكان الرحلة وكيف ستقضي وقتك ومتى ستعود؟ إذا كان الجواب نعم فأنت في الغالب شخص منطقي. الانتباه ودقة الملاحظة لكل ما يحيط بك وأخذه بالاعتبار عند التفكير في حل مشكلة ما فمعظم الأخطاء تنجم عن عدم الوعي والانتباه للتفاصيل الدقيقة. الديناميكية وإيجاد حلول بديلة عند الضرورة. الفضول وحب الاستكشاف وتعلم أشياء جديدة وطرح العديد من الأسئلة لتوسيع أفق التفكير. الاعتراف بالخطأ وتصحيحه فهذا ينم عن نضج فكري لدى الشخص. الاعتماد على الحقائق والمعرفة وليس على الحدس والمعتقدات عند اتخاذ القرارات. بعد قراءة الخصائص الواردة أعلاه، هل تعتقد أنك تملك مهارة التفكير المنطقي أم لا؟ مراحل التفكير المنطقي كي تتمكن من التفكير منطقيًا وحل أي مشكلة تواجهك بطريقة منهجية يمكنك اتباع الخطوات التالية: فهم المشكلة جيدًا فإذا لم نفهم المشكلة تمامًا فلن تتوصل لأفضل حل ممكن لها أو ربما تستغرق الكثير من الوقت لتحلها. تقسيم المشكلة المعقدة وصعبة الحل إلى أجزاء صغيرة وبسيطة يسهل حلها. وضع خطة واضحة لحل كل جزء من المشكلة. البدء بتنفيذ الخطة التي وضعتها في الخطوة السابقة. العودة للخطوة الأولى. أهمية التفكير المنطقي للمبرمج لا شك أن أهمية التفكير المنطقي تبرز في كافة مجالات الحياة الشخصية والعملية، لكننا سنركز في هذه الفقرة على أهمية التفكير المنطقي في مجال البرمجة على وجه الخصوص فهو يعد أحد المهارات التي لا غنى عنها للمبرمجين والمطورين بصفة خاصة. فالبرمجة تحتاج منك للتخاطب مع الآلة، والآلة لا تفهم ولا تنفذ أوامر عامة بل تحتاج إلى تبسيط الأوامر إلى أبسط شكل، وتعد أي مهمة أو مخاطبة مع الآلة مشكلة يجب إيجاد أفضل حل وكتابة الحل الناتج بشكل برنامج، ومن هنا تأتي أهمية التفكير المنطقي في عملية البرمجة. لذا في حال رغبت بأن تصبح مبرمجًا ستكون أول نصيحة توجه لك هو تعلم مهارات التفكير المنطقي والخوارزميات لكونها خطوة أساسية تسبق مرحلة البرمجة وكتابة الأكواد، وبدون امتلاك مهارات التفكير المنطقي ستجد صعوبة كبيرة في حل المشكلات البرمجية المعقدة. وإليك جملة من فوائد التفكير المنطقي للمبرمج: يمنح القدرة على التفكير خارج الصندوق وابتكار حلول إبداعية للمشكلات البرمجية. ينشط الدماغ ويحفز الذاكرة ويساعد على ربط المعلومات ببعضها البعض. يساعد على تقسيم المشكلات إلى خطوات بسيطة ومتسلسلة منطقيًا. يعزز القدرة على تصور حل المشكلات البرمجية وصياغة طريقة الحل الأمثل قبل البدء في كتابة الكود البرمجي. يساعد على كتابة وفهم الخوارزميات وهي مجموعة من التعليمات التي تخبر الحاسوب بما يتوجب عليه القيام به لحل المشكلة بناء على معطيات دخل محددة. يسهل فهم منطق البرمجة وأكوادها واستخدام التعبيرات المنطقية والعبارات الشرطية. والجدير بالملاحظة أن المهارات التقنية ليست وحدها ما يبحث عنه أرباب العمل في المبرمجين والمطورين المرشحين للتوظيف بل تجدهم يحرصون على توافر مجموعة من المهارات والسمات الشخصية مثل التفكير المنطقي ومهارات حل المشكلات ومهارات التواصل الفعال وتنظيم الوقت وغيرها من السمات الأخرى التي يمكنك الاطلاع عليها في هذا الفيديو: التفكير المنطقي لحل المشكلات البرمجية يحتاج أي مبرمج لمهارة التفكير المنطقي لحل المشكلات البرمجية لأن حلها يتطلب طريقة معينة في التفكير ووضع خطوات الحل بطريقة مفضلة ومتسلسلة منطقيًا وقابلة للحل حاسوبيًا. على سبيل المثال إذا طلب منك حل مشكلة صنع شطيرة توست من الزبدة والمربى سيكون عليك أن تفكر بداية بالمواد المطلوبة لصنعها وهل هي متوفرة أم لا وهي الزبدة والمربى والخبز والسكين. بعد التأكد من توافر كل المعطيات اللازمة سيكون عليك التفكير بالخطوات التي تحتاجها لصنع الشطيرة. قد تخبرني أن الأمر بديهي ولا يحتاج لأي تفكير منطقي ضع الزبدة والمربى على الخبز وتناولها لكن انتبه هنا لأن هذا لن يساعدك في حل المشكلة وبناءً على ذلك قد تكون الخطوات المنطقية للعمل كالتالي: افتح كيس الخبز. خذ شريحة الخبز الموجودة في أعلى الكيس وضعها في طبق. افتح علبة الزبدة. اغمس السكين في علبة الزبدة. وزع الزيدة على شريحة الخبز. ضع السكين جانباً. خذ شريحة خبز ثانية من أعلى الكيس وضعها فوق الشريحة الأولى. افتح علبة المربى. اغمس السكين في علبة المربى وزع الزيدة على شريحة الخبز الثانية. ضع السكين جانباً. ضع شريحة الخبز الأولى فوق الثانية. الشطيرة جاهزة. قد يكون هناك أكثر من طريقة لحل المشكلة على سبيل المثال يمكن أن نختصر بعض الخطوات ونفكر في حل المشكلة كالتالي: افتح كيس الخبز وخذ شريحتين من خبز التوست. افتح علبة الزيدة. اغمس السكين في الزبدة. وزع الزبدة فوق شريحة الخبز الأولى. افتح علبة المربى. اغمس السكين في المربى. وزع المربى فوق شريحة الخبز الأولى. ضع الشريحة الأولى فوق الثانية. الشطيرة جاهزة. قد تفكر أيضًا أن الخطوات (افتح العلبة، اغمس السكين، وزع) تتكرر مرة من أجل الزبدة ومرة من أجل المربى فلم لا نحاول دمجها بوظيفة وليكن اسمها مثلًا وضع المادة المطلوبة. تسألك عن المادة التي تريدها وتطبق هذه الخطوات الثلاث دفعة واحدة في كل مرة تريد فيها تنفيذ هذه الخطوة. وقد تفكر في مناقشة بعض الافتراضات والحالات الخاصة التي قد تحدث خلال العمل وتجد حلولًا مناسبة لها كأن تناقش حالة عدم وجود المربى واستبداله بالعسل أو الشوكولا، فالخطوات المتبعة في الحل وطريقة التفكير والتنفيذ والمعالجة قد تختلف من شخص لآخر وهنا تبرز أهمية التفكير المنطقي فالجميع قد يحصل في النهاية على حل لكن بعض الحلول قد تكون أفضل من غيرها وأكثر كفاءة واختصارًا. قس على هذا أي مشكلة معقدة تحاول حلها من خلال الحاسوب. في ختام هذه الفقرة أدعوك لمشاهدة هذا الفيديو اللطيف والشيق لأب يعلم أطفاله كيف يكتبون بدقة التعليمات اللازمة لطريقة صنع شطيرة زبدة الفول السوداني مع المربى، عندما تتعامل مع الحاسوب تعامل معه كأنه ذلك الأب وأخبره بالتعليمات المطلوبة لحل مشكلتك بدقة متناهية. اكتساب التفكير المنطقي في البرمجة بعد أن تعرفت على أهمية التفكير المنطقي في تحسين البرمجة أعتقد أنك تتساءل الآن هل التفكير المنطقي هو موهبة فطرية تولد مع المبرمج وتمكنه من التوصل إلى حلول منطقية مناسبة لحل مشكلات الكود بسهولة وسلاسة، أم أنه مهارة مكتسبة يمكن تنميتها من خلال أدوات وممارسات معينة؟ لحسن الحظ رغم أن التفكير المنطقي هو ملَكَة فطرية يتميز بها البعض ويساعدهم وجودها على تعلم لغات البرمجة أسرع من غيرهم لكنه في نفس الوقت مهارة قابلة للاكتساب والتحسين والتطوير من خلال العديد من الطرق والتقنيات. إليك أهم الطرق والأدوات التي تساعدك على تحسين التفكير المنطقي في البرمجة: حلّ الألغاز والألعاب المنطقية. استخدم الورقة والقلم لوصف أي مشكلة تواجهك. تعلّم الخوارزميات. قسّم المشكلات المعقدة لأجزاء أصغر. تمكّن من أساسيات البرمجة. شارك في المسابقات والتحديات البرمجية. ادرس الشيفرات البرمجية للآخرين. تعلّم نماذج البرمجة وأنماط التصميم. دعنا نناقش كل طريقة من هذه الطرق ونتعرف على أهميتها في تنمية منطقك البرمجي حلّ الألغاز والألعاب المنطقية فحل الألغاز المنطقية وألعاب الذكاء مثل الشطرنج وألغاز الكلمات المتقاطعة وسودودكو و tic-tac-toe أو غيرها من الألغاز الرياضية والألعاب المنطقية وألغاز الذكاء IQ أمر ممتع ومفيد جدًا في تشيط عقلك وتحسين تفكيرك المنطقي وبالتالي تحسين قدراتك البرمجية. فمهارة حل الأحاجي أمر يبحث عنه معظم أرباب العمل لمعرفة مدى قوة تفكيرك وسرعة بديهتك فلا تستغرب حين تطرح عليك في مقابلات العمل مع شركات البرمجيات ألغاز من قبيل الأحجية التالية: كم عدد العملات التي تمتلكها إذا كانت جملة واحدة فقط من الجمل الثلاث التالية صحيحة: لديك عملة واحدة على الأقل. لديك خمس عملات على الأقل. عدد العملات الموجود معك أقل من خمسة. خذ وقتك في التفكير بحل هذه المسألة ويمكن أن تشاركني في التعليقات الجواب الذي توصلت إليه وكيف توصلت إليه. كما يمكن أن تتدرب على الكثير من المسائل والأحاجي المنطقية، ابحث عن ألغاز مثل لغز المئة سجين 100‎ prisoners problem أو لغز الجمل والموز camel and banana puzzle أو غيرها من الألغاز المشهورة التي تخص مجال البرمجة وعلوم الحاسب فهي متوفرة بكثرة على مواقع الإنترنت ومتاجر التطبيقات. استخدم الورقة والقلم لوصف أي مشكلة تواجهك استخدم الورقة والقلم عند التفكير واكتب كافة المعطيات المتاحة بين يديك كي لا تنسى أحدها فنحن البشر نتذكر الأشياء التي نكتبها بكفاءة أكثر، بعدها ناقش كافة الخيارات التي تخطر ببالك للحل وحاول أن تستنتج الحل الأمثل والأدق لها. ويمكنك أن ترسم مخططات توجيهية توضح لك الأمور بشكل أفضل لاسيما إذا كنت شخصًا بصريًا حينها ستساعدك المخططات والرسوم التوضيحية والمربعات والدوائر والأسهم على تصور المشكلة وفهمها بشكل أفضل وكتابة كود مناسب لحلها لاحقًا. تعلّم الخوارزميات فتعلم الخوارزميات وهياكل البيانات من شأنه أن يعزز التفكير المنطقي التحليلي والتفكير الخوارزمي الذي يغير طريقة تفكيرك في حل المشكلات ويعلمك منهجية التفكير بطريقة تشبه الطريقة التي يعمل بها الحاسوب كما أنه يساعدك لاحقًا في تعلم لغات البرمجة. يمكن أن تبدأ بالخوارزميات الأساسية مثل خوارزميات الفرز والترتيب sorting algorithms وخوازميات البحث search algorithms وخوارزميات فرق تسد divide and conquer وتفهم آلية عملها ثم تتدرج في تعلم خوارزميات أكثر تعقيدًا، كما أن فهم هياكل البيانات مثل القائمة المترابطة linked lists والمكدس stack والشجرة الثنائية binary trees واستخدامها أثناء تنفيذ الخوارزميات يسرع كثيرًا من قدرتك على حل المشكلات المعقدة. قسّم المشكلات المعقدة لأجزاء أصغر عندما تعجز عن حل مشكلة ما لماذا لا تجرب أن تحللها وتقسّمها إلى مشكلات أصغر يسهل التعامل معها، ابدأ بحل كل مشكلة منها وكافئ نفسك على تحقيق كل هدف صغير ثم اجمع كل الأجزاء لتتكامل مع بعضها البعض وتحل المشكلة الأساسية. على سبيل المثال إذا طلب منك إبجاد طريقة أو خوارزمية للبحث عن رقم ما في سلسلة من الأرقام يمكنك تقسيم المشكلة إلى مشاكل أصغر تحلها كالتالي: معرفة من أين أبدأ البحث (من بداية السلسلة أم نهايتها أم من الوسط). معرفة متى وكيف يتم إيقاف عملية البحث. تحديد كيفية مقارنة عنصرين من عناصر السلسلة لتحديد أيهما يأتي قبل العنصر الآخر. تحديد كيفية متابعة البحث عند عدم العثور على الرقم المطلوب. تمكّن من أساسيات البرمجة تأكد من الفهم الجيد لأساسيات البرمجة مثل المتغيرات وأنواع البيانات والتعليمات الشرطية والحلقات التكرارية والدوال وهياكل البيانات بالتوازي مع تطوير تفكيرك المنطقي فالبرمجة والمنطق يعززان بعضهما البعض فمن جهة يساعدك التفكير المنطقي على فهم تعليمات البرمجة ومن جهة أخرى تساعدك كتابة الأكواد البرمجية على تحسين منطقك والتفكير بالطريقة التي يفهمها الحاسوب. وتذكر أنك بدون إتقان المفاهيم الأساسية والتطبيق العملي لها من خلال حل العديد من أسئلة البرمجة وحل مشكلات رياضية بسيطة من البداية إلى النهاية بشكل منتظم فإنك لن تتمكن من تطوير تفكيرك وتعلم المفاهيم المتقدمة لاحقًا وعندما تكون عالقًا في مشكلة معينة لا مشكلة في البحث عن حلول لها على الإنترنت وفهم منطق عملها فهذا يحسن مهاراتك أيضًا. شارك في المسابقات والتحديات البرمجية شارك في المسابقات والتحديات البرمجية فهي تركز على تحديات منهجية ومتسلسلة في الصعوبة وغالبًا ما تكون مقيدة بوقت محدد لذا يساعدك حلها على تحسين وتسريع تفكيرك المنطقي. حتى لو لم تحقق نتائج عالية في هذه المسابقات ستكون التجربة مفيدة لك كما أن مناقشة حلول المشاركين الآخرين تفيدك في توسيع أفق تفكيرك. ادرس الشيفرات البرمجية للآخرين فكما ذكرنا سابقًا قد توجد أكثر من طريقة لحل مشكلة معينة لهذا قد يتبع كل مبرمج طريقة خاصة به لحل المشكلة والتعرف على وجهات نظر مختلفة يفيدك بكل تأكيد ويطور منطقك البرمجي، ستجد الكثير من الأكواد لمبرمجين خبراء في المجتمعات البرمجية ومستودعات المشاريع مفتوحة المصدر مثل GitHub. تعلم نماذج البرمجة وأنماط التصميم إن تعلم نماذج البرمجة مثل البرمجة كائنية التوجه OOP والبرمجة الوظيفية functional programming وأنماط التصميم البرمجي design patterns التي توفر حلول ونماذج للمشكلات البرمجية الشائعة فهي تساعدك في بناء حلول منطقية أكثر وضوحًا وتنظيمًا وأقل أخطاءً وتحسن مهاراتك البرمجية. عادة ما تدرس مادة الخوارزميات وحل المشكلات بما يتعلق بالتفكير المنطقي في بداية أي مسار يُعلم البرمجة تعليمًا صحيحًا، سواءً في الجامعات أو مسارات البرمجة الخاصة، فمثلًا في دورة علوم الحاسوب في أكاديمية حسوب ستتعرف على أهم الخوارزميات وطريقة كتابتها وتحليلها، وتتعرف على أهم بنى المعطيات وتتعلم أساسيات البرمجة وأنماط التصميم وتكتب الكثير من البرامج العملية التي تعزز تفكيرك المنطقي وتحسّن مستواك البرمجي بشكل كبير. نصائح إضافية لتحسين التفكير المنطقي إضافةً للطرق التي ذكرناها سابقًا، إليك قائمة من النصائح السريعة التي من شأنها كذلك أن تحسن مهاراتك وتفكيرك المنطقي وتعزز فهمك للبرمجة: احرص على القراءة فهي تغذي الدماغ وتعزز تفكيرك في الأمور. لا تكن عاطفيًا أو متحيزًا لوجهة نظرك وحاول أن تتفهم آراء الآخرين. اهتم بكل التفاصيل وحلل معنى الكلمات والجمل وافهم مدلولاتها الدقيقة. تعلم لغة جديدة فهذا من شأنه أن يقوي دماغك ويحفزه. مارس نشاطًا إبداعيًا تحبه كالرسم والكتابة. كن فضوليًا واطرح تساؤلات عن مواضيع تثير اهتمامك واستكشف إجاباتها فهذا يوسع أفق تفكيرك المنطقي. حل مشاكل جديدة كل يوم أو جرب طرقًا مختلفة لحل نفس المشكلة. طور علاقات هادفة مع أشخاص آخرين وتناقش معهم حول آراء مختلفة ووسع وجهة نظرك للأمور. تعلم التفكير النقدي من خلال تحليل الحقائق والأدلة بطريقة منطقية لفهم مشكلة أو موضوع ما بدقة. حافظ على هدوءك وتركيزك عند حل مشكلة ما، فالتوتر والاستعجال أكبر عدو للتفكير السليم. كن صبورًا ولا تستسلم بسرعة وضع أهدافًا واقعية لتحسين التفكير المنطقي وابذل جهدك لتحقيقها فتغيير السلوك أمر يستغرق وقتًا. الخلاصة تعرفنا في مقال اليوم على مفهوم التفكير المنطقي الذي يعد أحد المهارات الضرورية لأي مبرمج أو مطور برمجيات، والتي تمكنه من التعامل بكفاءة مع حل المشكلات البرمجية وجمع كل المعطيات الممكنة حولها وتحليلها وفهمها ووضع الحلول المناسبة لها أيًا كانت لغة البرمجة التي يستخدمها، وتعرفنا على مجموعة من الطرق والنصائح التي تساعد المبرمجين على تحسين تفكيرهم المنطقي وبرمجة التطبيقات بكفاءة ومرونة. وتذكر في الختام أن تركيزك على تعلم لغات البرمجة والأمور التقنية على أهميته لا يكفي لجعلك مبرمجًا جيدًا، لذا لا تهمل مهاراتك الناعمة ومن أهمها مهارات التفكير المنطقي والتواصل الفعال فهي سبيلك للتميز والحصول على فرصة العمل التي تطمح لها. اقرأ أيضًا مدخل إلى الخوارزميات المرجع الشامل إلى تعلم الخوارزميات كيف تتعلم البرمجة: نصائح وأدوات لرحلتك في عالم البرمجة برمجة الحاسوب للمبتدئين هل أنا حقا مبرمج؟ متى أسمي نفسي مبرمجًا لماذا يجب أن تعلم طفلك البرمجة؟
    2 نقاط
  27. سنشرح في هذا الفيديو ما هو تعلم الآلة، ولماذا نريد من الآلات أن تتعلم، وسنتعرف على المكونات الرئيسية لتعلم الآلة مثل البيانات و المعاملات أو المتغيرات وسنشرح مفهوم الخوارزميات باختصار وأهميتها هنا مع توضيح الفروقات بين مفاهيم الذكاء الاصطناعي مثل علوم الحاسب و الذكاء الاصطناعي و تعلم الآلة و الشبكات العصبية الاصطناعية و التعلم العميق. إذا أردت التعرف أكثر على تعلم الآلة، فننصحك بالانضمام إلى دورة الذكاء الاصطناعي AI، ولا تنسَ الاستعانة خلال رحلة تعلمك وعملك بتوثيقات موسوعة حسوب المجانية. وإذا أردت متابعة المعلومات البرمجية العلمية مكتوبة فيمكنك الاطلاع على قسم البرمجة في أكاديمية حسوب، كما يمكنك متابعة جديد الفيديوهات التقنية المتاحة على يوتيوب أكاديمية حسوب مجانًا. دورة الذكاء الاصطناعي احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة. اشترك الآن
    2 نقاط
  28. تعلم الآلة machine learning هو أحد الدعائم الأساسية لتكنولوجيا المعلومات على مدار العقدين الماضيين، وبات اليوم جزءًا أساسيًا من حياتنا اليومية. فمع توفر كميات متزايدة من البيانات أصبح هناك سببٌ وجيهٌ للاعتقاد بأن التحليل الذكي للبيانات سيكون أكثر انتشارًا وأهميةً كمكون أساسي للتقدم التكنولوجي. في المقالة السابقة قدمنا دليلًا شاملًا لبدء تعلم الذكاء الاصطناعي وفي هذه المقالة والتي تعتبر جزءًا من سلسلة مقالات عن الذكاء الصناعي بدأناها مع مقال مقدمة شاملة عن الذكاء الاصطناعي نُضيء لك الطريق ونقدم لك دليلًا شاملًا للبدء بتعلم وفهم تعلم الآلة والتعرف على أهم المصطلحات المرتبطة بهذا التخصص. ملاحظة: إن لم يكن لديك معرفة مسبقة بمجال الذكاء الصناعي وفروعه وأساسياته، سيكون من الأفضل أن تقرأ مقال "مقدمة شاملة عن الذكاء" من هذه السلسلة على الأقل التي أشرت إليها للتو. ما المقصود بتعلم الآلة؟ تعلم الآلة Machine learning أو ما يعرف اختصارًا ML هو مصطلح تقني يعني استخدام مجموعة من التقنيات والأدوات التي تساعد أجهزة الحاسوب والآلات الذكية عمومًا على التعلم والتكيف من تلقاء نفسها. لقد نشأ علم التعلم الآلي عندما بدأ علماء الحاسوب بطرح الأسئلة التالية: نحن البشر نتعلم من التجارب السابقة أما الآلات فهي تفعل ما نمليه عليها فقط فهل يمكن أن نتمكن من تدريب هذه الآلات كي تتعلم من البيانات والخبرات السابقة وتحاكي طريقة تفكيرنا وتتمكن من التعلم والفهم والاستنتاج دون تدخلنا؟ هل يمكن للحواسيب أن تفعل ما نفعله وبالطريقة التي نريدها، وأن تتعلم من تلقاء نفسه كيفية أداء مهمة محددة؟ هل يمكن للحواسيب والآلات أن تفاجئنا وتتعلم من خلال البيانات من تلقاء نفسه بدلًا من قيام المبرمجين بصياغة قواعد معالجة البيانات لها بشكل يدوي؟ كل هذه التساؤلات فتحت الباب أمام نموذج برمجة بديل عن أسلوب البرمجة الكلاسيكية التي يُدخل فيها البشر القواعد ضمن برامج حاسوبية ويحددون بدقة البيانات التي يجب معالجتها وفقًا لهذه القواعد ويكون الخرج إجابات محددة ناتجة عن عمليات المعالجة. في نموذج البرمجة الجديد هذا الذي سمي تعلم الآلة أصبح بمقدور البشر إدخال البيانات للحاسوب بالإضافة إلى الإجابات المتوقعة وفقًا للبيانات، ويكون الخرج هو القواعد التي تم استنتاجها بشكل برنامج أو ما يُسمى بالنموذج model ثم يمكن بعد ذلك تطبيق هذه القواعد على البيانات الجديدة لإنتاج الإجابات. بمعنى آخر نظام التعلم الآلي يُدرّب بدلًا من برمجته صراحةً، حيث تقدّم له العديد من عينات البيانات المتعلقة بالمهمة المطلوبة، ليكتشف بنية إحصائية في هذه العينات تربط المدخلات بالمخرجات (البيانات بالإجابات) وتسمح في النهاية للنظام بالوصول إلى قواعد لأتمتة المهمة. على سبيل المثال إذا عرضنا على الحاسوب مجموعات ثنائية من الأرقام كالتالي (2 , 4) و (3 , 6) و (4 , 9) ثم طلبنا منه بناء على هذه المعطيات أن يتنبأ بالرقم الذي يجب أن يأتي مع الرقم 5 فسوف يحتاج في بداية الأمر إلى إيجاد المنطق بين مجموعات البيانات التي مررناها له وتطبيق نفس المنطق للتنبؤ بالرقم الجديد، عملية العثور على هذا المنطق يسمى تعلم الآلة وبعد إيجاد هذا المنطق سنتمكن من تطبيقه للتنبؤ بكل رقم جديد. و إذا كنت ترغب بأتمتة عملية تخمين أسعار المنازل -يمكنك إعطاء نظام التعلم الآلي مجموعة من العينات التي تمثّل مواصفات المنازل (بيانات) مع أسعارها (إجابات)، وسيتعلم النظام القواعد الإحصائية اللازمة لربط المواصفات بالأسعار. على الرغم من أن التعلم الآلي بدأ في الازدهار بدءًا من التسعينيات، إلا أنه سرعان ما أصبح المجال الفرعي الأكثر شعبية والأكثر نجاحًا في الذكاء الصناعي. تعريف تعلم الآلة؟ هناك العديد من التعاريف الخاصة بتعلم الآلة نذكر منها أهم تعريفين: تعريف آرثر صامويل 1959: "تعلم الآلة هو المجال الدراسي الذي يمنح أجهزة الحاسب القدرة على التعلم دون برمجتها صراحةً من قبل البشر" تعريف توم ميتشل: "تعلم الآلة هو دراسة خوارزميات الحاسوب التي تحسن أدائها تلقائيًا من خلال التجربة ويقال أَنَّ برنامجا حاسوبيًا يتعلَّم من الخبرة E التي تخص بمجموعة من المهام T بالنسبة إِلى مقياس الأداء P إذا تحسن أداءه على إنجاز المهام T بعد اكتساب الخبرة E بالمقدار P" على سبيل المثال في مجال لعب الشطرنج تكون الخبرة E هي عدد مرات اللعب ضد الحاسب و T هي مهمة لعب الشطرنج ضد الحاسب والمعيار P هو فوز/خسارة الحاسب. ويمكننا القول بتعريف بسيط أن تعلم الآلة مجال من مجالات الذكاء الصناعي يحاول بناء آلات قادرة على التعلّم من تلقاء نفسها. الفرق بين الذكاء الاصطناعي وتعلم الآلة يميل معظم الناس إلى استخدام مصطلحي الذكاء الاصطناعي وتعلم الآلة كمرادفين ولا يعرفون الفرق، إلا أن هذين المصطلحين هما في الواقع مفهومان مختلفان، فتعلم الآلة هو في الواقع جزء من الذكاء الاصطناعي أو أحد أنواع الذكاء الاصطناعي ويمكن القول أن الذكاء الاصطناعي هو مجال واسع من الموضوعات، ويشكل تعلم الآلة جزء صغير من هذه الموضوعات. يشير الذكاء الاصطناعي إلى القدرة العامة لأجهزة الحاسب على محاكاة الفكر البشري وأداء المهام في بيئات العالم الحقيقي، بينما يشير التعلم الآلي إلى التقنيات والخوارزميات التي تمكّن الأنظمة من تحديد طريقة لتعلّم الأنماط المخفيّة في البيانات واتخاذ القرارات وتحسين نفسها من خلال التجربة والبيانات. أهمية تعلم الآلة قد تتساءل عن أهمية مجال تعلم الآلة في عصرنا الحالي وللإجابة على هذا السؤال يمكننا تقسيم الإجابة إلى شقين الأول أهمية تعلم الآلة بالنسبة للمؤسسات وتطور الحياة عمومًا، والثاني أهميته بالنسبة لبقية فروع الذكاء الصناعي و الفروع ذات الصلة. بالنسبة للشق الأول، فالبيانات هي شريان الحياة لجميع قطاعات الأعمال وقد باتت القرارات التي تعتمد على البيانات تصنع الفارق وتشكل الفصل بين مواكبة المنافسة أو التخلف عن الركب. التعلم الآلي هو مفتاح إطلاق العنان لقيمة بيانات الشركات والعملاء واتخاذ القرارات التي تجعل الشركة في صدارة المنافسة. إذًا يعتبر التعلم الآلي مهمًا لأنه يمنح المؤسسات بمختلف أنواعها وجهة نظر حول اتجاهات وسلوك العملاء وأنماط تشغيل الأعمال فضلًا عن دعم عملية تطوير منتجات جديدة كما أنها تساعد في أمور أخرى مثل اكتشاف الأمراض وتوقعات الطقس …إلخ. وتستخدم العديد من الشركات الرائدة اليوم مثل فيسبوك Facebook وجوجل Google وأوبر Uber التعلم الآلي كجزء أساسي من عملياتها. بالنسبة للشق الثاني، ففروع الذكاء الصناعي الأخرى مثل معالجة اللغات الطبيعية أو الفروع ذات الصلة كالرؤية الحاسوبية لم تبصر النور إلا بعد التطورات الأخيرة التي شهدها تعلم الآلة الذي شكَّل ركيزة أساسية في تطور معظم فروع الذكاء الصناعي. على سبيل المثال تعد تطبيقات التعرف على الكائنات أو تتبعها أو تصنيف الأشياء قضايا شائعة في الرؤية الحاسوبية، وهي تعتمد بشكل شبه مطلق على خوارزميات التعلم العميق والأمر ذاته ينطبق على معالجة اللغات الطبيعية. البيانات وتعلم الآلة البيانات هي وقود التعلم الآلي، فبدون البيانات ستكون خوارزميات التعلم الآلي جائعة وضعيفة الأداء وستفشل في حل أي مشكلة بشكل صحيح. وبعض خوارزميات التعلم الآلي مثل خوارزميات التعلم العميق لا تشبع، وكلما زودتها بالبيانات ونوّعتها لها كلما ازدادت قوتها وقدراتها وتحسن أداؤها. وتجدر الإشارة هنا لأن الأمر لا يتعلق بزيادة حجم البيانات وكميتها فقط بل يتعلق كذلك بدقة البيانات وجودتها وتنوع حالات استخدامها للحصول على نتائج صحيحة ودقيقة. وفيما يلي نوضح أهم النقاط الأساسية المتعلقة بالبيانات والمرتبطة بالتعلم الآلي: هناك نوعان أساسيان للبيانات المستخدمة في التعلم الآلي: بيانات مُسماة labeled وغير مسماة unlabeled على سبيل المثال إذا كان المطلوب هو التنبؤ بعمر شخص ما فإن العمر هنا يعد من البيانات المسماة في حين أن البيانات غير المسماة لا تحتوي على أي سمة مميزة. تسمى خوارزميات تعلم الآلة التي تتعامل مع مجموعة بيانات مسماة خوارزميات التعلم الخاضع للإشراف في حين تسمى خوارزميات تعلم الآلة التي تستخدم مجموعة بيانات غير مسماة خوارزميات التعلم غير الخاضع للإشراف وسنشرح المزيد عن هذه الأنواع من التعلم الآلي في فقرة لاحقة. عادةً ما تكون البيانات المستخدمة في التعلم الآلي عددية Numerical أو فئوية Categorical. تتضمن البيانات العددية القيم التي يمكن ترتيبها وقياسها مثل العمر أو الدخل، وتتضمن البيانات الفئوية القيم التي تمثل الفئات، مثل الجنس أو نوع الفاكهة. يمكن تقسيم البيانات إلى مجموعات تدريب Training ومجموعات مراقبة أو تحقق Validation ومجموعات اختبار Testing حيث تُستخدم مجموعة بيانات التدريب لتدريب النموذج، وتُستخدم مجموعة المراقبة لمراقبة سير عملية التدريب وتعلّم النموذج وأخيرًا تُستخدم مجموعة الاختبار للتقييم النهائي لأداء النموذج. تعد المعالجة المسبقة للبيانات خطوة مهمة في تعلم الآلة حيث يتم من خلالها تنظيف البيانات ومعالجة القيم المفقودة والشاذة وهندسة الميزات. هناك فرق بين البيانات والمعلومات والمعرفة، فالبيانات يمكن أن تكون أي حقيقة أو قيمة أو نص أو صوت أو صورة غير معالجة لم تُفسّر أو تحلل أما المعلومات فهي البيانات بعد تفسيرها ومعالجتها. أي أنها شكل متطور للبيانات ذو فائدة ومعنى أكبر والمعرفة هي المرحلة الأكثر تطورًا والمتمثلة بالوعي والفهم والإدراك للمعلومات. تطبيقات تعلم الآلة للتعلم الآلي تطبيقات في جميع أنواع الصناعات وفي حياتنا اليومية عمومًا، يتضمن ذلك التصنيع والتجارة بالتجزئة والرعاية الصحية وعلوم الحياة والسفر والضيافة والخدمات المالية والطاقة والمواد الأولية والمرافق. بما أن تعلم الآلة يندرج تحت مظلة الذكاء الاصطناعي، فإن تطبيقات تعلم الآلة تدخل ضمن أي تطبيق ذكاء اصطناعي وقد تحدثنا عن تطبيقات الذكاء الاصطناعي في مقال تطبيقات الذكاء الاصطناعي لذا يمكنك الرجوع إليه. تشمل بعض حالات الاستخدام لمجال تعلم الآلة: التعرّف على الصور التعرف على الكلام التصنيف والتنبؤ الآلات والروبوتات الذكية -السيارات ذاتية القيادة التجارة الإلكترونية الأمان واكتشاف التزوير أو الاحتيال -الترجمة الآلية والخدمات المالية …إلخ. يُستخدم التعلم الآلي في العديد من المجالات الأخرى والتي قد لا يسعنا ذكر جميعها هنا. كما أن معظم تطبيقات الذكاء الصناعي اليوم تعتمد بشكل كامل على خوارزميات تعلم الآلة. وفي الفيديو التالي ستتعرف على المزيد من المعلومات حول معنى تعلم الآلة وأهدافها والمكونات الرئيسية لأي نظام معتمد على تعلم الآلة وأمثلة منوعة على التطبيقات المستخدمة في هذا المجال. أنواع تعلم الآلة ينقسم تعلم الآلة إلى أربعة أنواع أساسية أو مجالات أساسية بناءً على نوع البيانات المستخدمة وأسلوب التعلم المتبع وهذه الأنواع هي: التعلم الخاضع للإشراف Supervised learning التعلم غير الخاضع للإشراف UnSupervised learning التعلم شبه الخاضع للإشراف Semi-Supervised Learning التعلم المُعزز Reinforcement Learning يحاكي كل نوع من هذه الأنواع الطرق والأساليب المختلفة التي تتخذ بها نحن البشر قرارتنا وإليك شرحًا مفصلًا لكل نوع من بين هذه الأنواع. 1. التعلم الخاضع للإشراف Supervised learning هو أحد أكثر أنواع التعلم الآلي شيوعًا ونجاحًا. في هذا النوع تُعطى الخوارزمية مجموعةً من البيانات بالإضافة إلى الخرج الصحيح لها. أي أن الخوارزمية تُدرّب على مجموعةً بيانات مُسماة. مبدأ عمل الخوارزميات التي تنتهج هذا النهج هو: الحصول على مجموعة بيانات مُسماة، ثم تدريب النموذج على إيجاد علاقة أو دالة function تربط بين المدخلات والمخرجات. إذًا يمكننا القول أن هذا النهج يُستخدم عندما نريد بناء نموذج يتنبأ (كلمة يتنبأ هنا تشمل التصنيف أيضًا) بنتيجة معينة في ضوء مدخلات معينة ويتطلب تعلم الآلة الخاضع للإشراف جهدًا بشريًا لبناء مجموعة التدريب المناسبة. هناك نوعان رئيسيان من مشكلات التعلم الآلي الخاضعة للإشراف هما التصنيف Classification والتوقع Regression. يكون الهدف في حالة التصنيف هو التنبؤ بتسمية فئة من قائمة محددة مسبقًا من الفئات. المثال الذي ورد في الفقرة السابقة هو خير مثال على ذلك، حيث نُدرّب الخوارزمية على التمييز بين فئتين أو نوعين من الفاكهة هما البرتقال والتفاح. التصنيف بدوره يُقسم إلى نوعين أساسيين هما: التصنيف الثنائي Binary Classification والتصنيف المتعدد Multiclass-Classification. يحدث التصنيف الثنائي عندما يكون لدينا فئتين من البيانات كما في مثال البرتقال والتفاح، مثال آخر هو تصنيف رسائل البريد الإلكتروني على أنها بريد عشوائي أو بريد حقيقي أما التصنيف المتعدد فهو يحدث عندما يكون لدينا أكثر من فئتين (مثلًا لو كان المطلوب جعل النموذج سالف الذكر يميز بين 3 أنواع من الفاكهة هي البرتقال والتفاح والموز. بالنسبة لمهام التوقع، فإن الهدف يكون توقع قيمة من مجال غير محدد وخير مثال على ذلك هو توقع أسعار المنازل أو توقع الدخل السنوي للفرد بناءًا على مستواه التعليمي وعمره ومكان إقامته فسعر المنازل أو الدخل السنوي يمكن أن تكون أي قيمة ضمن مجال ما. 2. التعلم غير الخاضع للإشراف UnSupervised learning في هذا النوع من أنواع تعلم الآلة تُعطى الخوارزمية مجموعةً من البيانات بدون الخرج الصحيح لها، أي أن الخوارزمية تُدرّب على مجموعةً بيانات غير مُسماة. مبدأ عمل الخوارزميات التي تنتهج هذا النهج هو: الحصول على مجموعة بيانات غير مُسماة، ثم تدريب النموذج على إيجاد علاقات مخفيّة بين هذه المُدخلات. هناك نوعان أساسيين من الخوارزميات التي تنتهج هذا النهج هما خوارزميات التحويل Transformation وخوارزميات العنقدة أو التجميع Clustering. تُنشئ خوارزميات التحويل تمثيلًا جديدًا للبيانات قد يكون من الأسهل على البشر أو خوارزميات التعلم الآلي الأخرى فهمه مقارنةً بالتمثيل الأصلي للبيانات. بالنسبة للنوع الآخر المتمثل بخوارزميات العنقدة، فهي تعتمد على تقسيم البيانات إلى مجموعات مميزة من العناصر المتشابهة. خذ مثلًا عملية تحميل الصور على أحد مواقع التواصل الاجتماعي كمثال، هنا قد يرغب الموقع في تجميع الصور التي تُظهر الشخص نفسه مع بعضها بغية تنظيم صورك إلا أن الموقع لا يعرف من يظهر في الصور ولا يعرف عدد الأشخاص المختلفين الذين يظهرون في مجموعة الصور خاصتك. تتمثل الطريقة المنطقية لحل المشكلة في استخراج كل الوجوه وتقسيمها إلى مجموعات من الوجوه المتشابهة، وبعدها يتم وضع كل صورة جديدة تحملها في المجموعة الأكثر شبهًا لها ومن أشهر خوارزميات العنقدة نذكر خوارزمية K-means. التعلم شبه الخاضع للإشراف Semi-Supervised Learning تحدثنا سابقًا عن أهمية البيانات، وأنّه كلما زاد حجم البيانات التي نُدرّب النموذج عليها تزداد قوته، ولاسيما بالنسبة خوارزميات التعلم العميق التي تنتهج النهج الخاضع للإشراف والتي تعتمد على البيانات المُسماة. نشأ التعلم شبه الخاضع للإشراف من السؤال التالي: ماذا لو لم يكن لدينا ما يكفي من البيانات المُسماة لخوارزميتنا التي تنتهج المنهج الخاضع للإشراف؟ قد يخطر ببالك في هذه الحالة محاولة تسمية البيانات يدويًا لكن هذا ليس مضيعة للوقت فقط لكنه أيضًا عرضة للعديد من أنواع الأخطاء البشرية الحل البديل الجديد هو استخدام التعلّم شبه الخاضع للإشراف وهو مزيج من التعلم الخاضع للإشراف والتعلم غير الخاضع للإشراف فهو يستخدم البيانات غير المسماة (والتي تكون كثيرة) والبيانات المسماة (والتي تكون قليلة) معًا، لإنشاء تقنيات تعلم أفضل من تلك التي تُنشأ باستخدام البيانات غير المسماة فقط أو المسماة فقط. التعلم المعزز Reinforcement Learning في هذا النوع من تعلم الآلة ابتكر المطورون طريقة لمكافأة السلوكيات المرغوبة ومعاقبة السلوكيات السلبية للآلة حيث يعتمد التعلم المُعزز على التعلم من خلال التفاعل مع البيئة أي أن الخوارزمية أو الروبوت أو البرنامج والذي يسمى في هذه الحالة الوكيل "agent" يتعلم من من عواقب أفعاله بدلًا من تعليمه صراحةً. فالوكيل يختار أفعاله وقرارته المستقبلية على أساس تجاربه السابقة (الاستغلال) وأيضًا من خلال الخيارات الجديدة (الاستكشاف) أي أن التعلم يرتكز على مبدأ التجربة والخطأ ويتعلق الأمر باتخاذ الإجراءات المناسبة لزيادة المكافأة إلى أقصى حد في موقف معين. يتطلب التعلم المعزز عددًا كبيرًا من التفاعلات بين الوكيل والبيئة لجمع البيانات للتدريب ويستخدم في مجال الألعاب حيث تعد الألعاب من أبرز مجالات استخدام التعلم المعزز فهو قادر على تحقيق أداء خارق في العديد من الألعاب مثل لعبة Pac-Man. ومن الأمثلة على استخدامه هو تدريب السيارات على التوقف باستخدام نظام القيادة الآلي حيث يتم تعليم حاسوب السيارة أو الوكيل على الوقوف في المكان الصحيح من خلال قراءة بيانات أجهزة استشعار مثل الكاميرات ونظام تحديد المواقع GPS واتخاذ الإجراءات المناسبة مثل الضغط على الفرامل وتغيير الاتجاه ويحتاج الوكيل بالطبع إلى إيقاف السيارة مرارًا وتكرارًا باستخدام التجربة والخطأ ويتم تقديم إشارة مكافأة لتقييم جودة التجربة وتعزيز عملية التعلم. نماذج تعلم الآلة لقد وصل التعلم العميق وهو نوع متقدم من أنواع تعلم الآلة إلى مستوى من الاهتمام العام والاستثمار الصناعي لم يسبق له مثيل في تاريخ مجال علوم الحاسوب ولكنه ليس أول شكل أو نموذج ناجح للتعلم الآلي ويمكننا القول إن معظم خوارزميات التعلم الآلي المستخدمة في الصناعة هذه الأيام -ليست خوارزميات التعلم العميق. يوفر مجال تعلم الآلة العديد من النماذج machine learning models أشهرها التعلم العميق لكن في الواقع لا يعد التعلم العميق دائمًا الأداة المناسبة، ففي بعض الأحيان لا توجد بيانات كافية ليكون التعلم العميق قابلاً للتطبيق، ويفضل أن تُحلّ المشكلة بطريقة أفضل من خلال خوارزمية مختلفة وفيما يلي نوضح أهم أنواع طرق تعلم الآلة: النمذجة الاحتمالية Probabilistic modeling أساليب النواة Kernel Methods أشجار القرار Decision Trees والغابات العشوائية Random Forests الشبكات العصبية Neural Networks التعلم العميق Deep Learning لنتعرف على قرب على كل نموذج من هذه النماذج وأشهر استخداماته وخوارزمياته. النمذجة الاحتمالية Probabilistic modeling تعتمد النمذجة الاحتمالية على تطبيق مبادئ الإحصاء في تحليل البيانات. لقد كانت أحد أقدم أشكال التعلم الآلي، والتي لا تزال مستخدمة حتى يومنا هذا واحدة من أشهر الخوارزميات في هذه الفئة هي خوارزمية بايز الساذج Naive Bayes. أساليب النواة Kernel Methods عندما بدأت الشبكات العصبية تكتسب شهرة بين الباحثين في التسعينيات ظهر نهج جديد للتعلم الآلي سمي أساليب النواة وسرعان ما أدى لتراجع شعبية الشبكات العصبية، وأساليب النواة هي مجموعة من خوارزميات التصنيف، وأشهرها خوارزمية الآلة متجه الدعم (SVM). أشجار القرار Decision Trees والغابات العشوائية Random Forests هي إحدى طرق النمذجة التنبؤية التي تُستخدم في الإحصاء واستخراج البيانات وتعلم الآلة وهي عبارة عن هياكل شبيهة بالمخططات التدفقية تتيح لك تصنيف نقاط البيانات المُدخلة أو التنبؤ بقيم المخرجات بناءًا على البيانات المُدخلة مثلًا تعطيها مواصفات المنزل، فتتوقع السعر وقد تم تفضيلها على أساليب النواة. الشبكات العصبية Neural Networks حتى عام 2010 تقريبًا، كانت الشبكات العصبية مُهمّشة إلى أن بدأ عدد من الباحثين الذين كانوا ما يزالون يؤمنون بالشبكات العصبية في تحقيق نتائج مهمة باستخدامها، وبذلك بدأت التطورات على الشبكات العصبية تتسارع وتفرض هيمنتها في معظم مهام تعلم الآلة. التعلم العميق Deep Learning السبب الرئيسي وراء انتشار التعلم العميق وتطوره بسرعه هو أنه قدّم أداءً أفضل في العديد من المشكلات واختصر العديد من الخطوات المعقدة التي كانت موجودة في الأساليب السابقة، والتعلم العميق اليوم هو الأسلوب الأنجح في جميع المهام الحسية أو الإدراكية مثل مهام الرؤية الحاسوبية ومعالجة اللغات الطبيعية NLP. وللتعرف على المزيد من الأساليب المتطورة لخوارزميات وأدوات التعلم الآلي يمكنك إلقاء نظرة على مسابقات التعلم الآلي على موقع Kaggle نظرًا لبيئتها شديدة التنافس (بعض المسابقات لديها آلاف المشاركين وجوائز بملايين الدولارات) وللتنوع الكبير في مشكلات التعلم الآلي التي تغطيها. لغة بايثون وتعلم الآلة تعد لغة البرمجة بايثون اللغة الأكثر شهرة في مجال تعلم الآلة لعدد كبير من الأسباب فهي لغة سهلة التعلم والفهم و ولها شعبية كبيرة وتستخدم من قبل عدد كبير من الأشخاص والمؤسسات وتملك العديد من المكتبات وأطر العمل التي تختص في مجال الذكاء الصنعي وتعلم الآلة فيما يلي سنكتب كود تعلم آلة في بايثون، حيث سنستخدم خوارزمية أشجار القرار لتوقع نوع الفاكهة (برتقال أو تفاح) بناءًا على وزنها ونسيجها. from sklearn import tree # الخطوة 1 # الخطوة 2 X = [[140, 1], [130, 1], [150, 0], [170, 0]] y = [0, 0, 1, 1] # 0: apple, 1: orange # الخطوة 3 clf = tree.DecisionTreeClassifier() clf = clf.fit(X, y) # الخطوة 4 prediction = clf.predict([[160, 0]]) print(prediction) # النتيجة: 1 شرح تنفيذ الشيفرة: الخطوة الأولى: هي استيراد المكتبة ساي كيت ليرن sklearn التي تحتوي العديد من خوارزميات تعلم الآلة الجاهزة. الخطوة الثانية: هي تحديد بيانات التدريب. هنا سيكون لدينا 4 عينات، كل عينة تُمثّل نقطة بيانات الخطوة الثالثة: هي تدريب خوارزمية أشجار القرار على البيانات السابقة الهدف هنا هو جعل الخوارزمية قادرة على التنبؤ بنوع الفاكهة بعد أن ندربها على البيانات السابقة. الخطوة الرابعة: بعد الخطوة 3 نكون انتهينا من تدريب النموذج، أي أنه أصبح جاهزًا للاستخدام الفعلي. لذا نعطيه عينة بيانات، ونطلب منه توقع نوع الفاكهة. إذا كنت مهتمًا بإتقان تعلم الآلة باستخدام لغة البرمجة بايثون يمكنك البدء مع دورة الذكاء الاصطناعي AI التي توفرها أكاديمية حسوب والتي تبدأ معك من الصفر ولا تتطلب منك أي خبرة مسبقة فهي تبدأ معك بتعلم كل ما تحتاجه بلغة بايثون وتطوير تطبيقات تستفيد من دمج مختلف نماذج LLMs الحديثة مثل GPT من OpenAI و LLaMA 2 من Meta لتطوير تطبيقات ذكية بسهولة وكفاءة كما تشرح لك تحليل البيانات Data Analysis وتمثيلها مرئيًا، ومفاهيم تعلم الآلة Machine Learning والتعلم العميق Deep Learning وغيرها من خلال التركيز على الشرح العملي المعد من قبل مجموعة من المطورين المُختصين، الذين يُرافقونك طيلة الدورة وحتى بعد الدورة للإجابة على أي سؤال أو مشكلة تواجهك كما تضمن لك الدورة دخول السوق والحصول على فرصة عمل بعد تخرجك من الدورة خلال ستة أشهر. دورة الذكاء الاصطناعي احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة. اشترك الآن مصادر تعليمية لتعلم الآلة بالإضافة إلى دورة بايثون الشاملة التي ذكرناها للتو والتي تعد من أفضل الدورات العربية لتعلم بايثون وتعلم الآلة، توفر توفر لك أكاديمية حسوب أيضًا مجموعة من المقالات والدروس التعليمية ومنشورات الكتب العربية التي تعد من أفضل مصادر تعلم الآلة وتعلم البرمجة وعلوم الحاسوب نذكر لك منها: كتاب البرمجة بلغة بايثون كتاب مدخل إلى الذكاء الاصطناعي وتعلم الآلة كتاب عشرة مشاريع عملية عن الذكاء الاصطناعي سلسلة برمجة الذكاء الاصطناعي المفاهيم الأساسية لتعلم الآلة نظرة سريعة على مجال تعلم الآلة أدوات برمجة نماذج تعلم الآلة وننصحك بتفصّح ومتابعة قسم مقالات الذكاء الاصطناعي في أكاديمية لقراءة المقالات الجديدة المنشورة حول الذكاء الاصطناعي وتعلم الآلة وما يتعلق بهما. أفضل مكتبات تعلم الآلة في بايثون إليك قائمة بأهم المكتبات التي قد تحتاجها في تعلّم الآلة (جميعها تعمل في لغة بايثون): نمباي Numpy: من أفضل مكتبات بايثون في مجال تعلم الآلة والذكاء الصناعي فهي مكتبة قوية وشائعة الاستخدام تسهل معالجة المصفوفات والتعامل معها وتسهل عمليات معالجة البيانات والعمليات الإحصائية عليها. سي باي Scipy: توفر هذه المكتبة مجموعة من الحزم المخصصة للاستخدام في مجال للحوسبة العلمية والهندسة والتقنية وتحتوي على وحدات مختلفة للجبر الخطي والتكامل والإحصاءات. ساي كيت ليرن Scikit-learn: اختصارًا Sklearn وهي مكتبة فعالة توفر العديد من أدوات وخوارزميات تعلم الآلة. باندا Pandas: هي مكتبة تستخدم لمعالجة البيانات وتحليلها وتسهل عمليات تنظيم البيانات وفهرستها ووضعها ضمن جداول وإجراء العمليات عليها. ماتبلوتليب Matplotlib: هي مكتبة بايثون خاصة بتصميم الرسوميات والمخططات البيانية وإنشاء رسومات تفاعلية وتصديرها إلى تنسيقات مختلفة. إضافة للعديد من أطر العمل القوية مثل ثيانو Theano وتنسرفلو TensorFlow وكيراس Keras وباي تورش PyTorch التي تسهل بناء نماذج الشبكات العصبية وتطبيق خوارزميات التعلم العميق. مستقبل تعلم الآلة بالرغم من أن خوارزميات تعلم الآلة كانت موجودة منذ عقود إلا أنها اكتسبت شعبية أكبر مع تنامي الذكاء الاصطناعي فمعظم تطبيقات الذكاء الصناعي المتقدمة التي نراها اليوم هي تطبيقات تعمل باستخدام خوارزميات تعلم الآلة (لاسيما التعلم العميق) بدءًا من خوارزميات التوصية التي نراها في موجز أخبار فيسبوك وغيرها من شبكات التواصل الاجتماعي والتي تعتمد على اهتماماتنا وعاداتنا في القراءة وصولًا السيارات ذاتية القيادة مثل سيارات تسلا Tsla ومعالجة اللغات الطبيعية مثل تطبيق الدردشة ChatGPT. كما تندمج الحلول التي يقدمها تعلم الآلة يومًا بعد يوم في العمليات الأساسية للشركات واستخدامات حياتنا اليومية مثل الترجمة الآلية للغات والتشخيص الطبي البحث الصوتي والبحث عن أقصر الطرق للوصول إلى وجهة ما وغيرها الكثير من التطبيقات ومن المتوقع أن ينمو السوق العالمي للتعلم الآلي من 8.43 مليار دولار أمريكي في عام 2019 إلى 117.19 مليار دولار أمريكي بحلول عام 2027 وفقًا لتوقع Fortune Business Insights. وقد بدأت العديد من الشركات بالفعل في استخدام خوارزميات التعلم الآلي نظرًا لقدرتها على إجراء تنبؤات وقرارات تجارية أكثر دقة ففي عام 2020 تم رصد 3.1 مليار دولار لتمويل شركات تعلم الآلة، وذلك لقدرة تعلم الآلة على إحداث تغييرات كبيرة في الصناعات. فيما يلي بعض التوقعات لمستقبل التعلم الآلي: يمكن للحوسبة الكمية أن تحدد مستقبل تعلم الآلة: والحوسبة الكمومية هي أحد المجالات التي لديها القدرة على تعزيز قدرات التعلم الآلي وهي تسمح بأداء عمليات متعددة الحالات في وقت واحد، مما يتيح معالجة أسرع للبيانات ففي عام 2019 أجرى معالج كمي خاص بشركة جوجل Google مهمة في 200 ثانية من شأنها أن تستغرق 10000 عام لإكمالها على أفضل حاسب عملاق في العالم! قد يتمكن برنامج AutoML من تسهيل عملية تطوير نماذج تعلم الآلة من البداية إلى النهاية: يعمل AutoML الذي طورته جوجل على أتمتة عملية بناء وتطبيق خوارزميات التعلم الآلي وهو يسمح لأي شخص أو شركة تجارية بتطبيق نماذج وتقنيات التعلم الآلي المعقدة وتخصيصها وفق احتياجات أعمالهم خلال دقائق دون أن يكون خبيرًا في التعلم الآلي. دخول تعلم الآلة بقوة في عملية التصنيع: لا زالت الشركات المصنعة ما زالت في المراحل الأولى فقط من تبني التعلم الآلي. ففي عام 2020 استفادت 9٪ فقط من الشركات المشاركة في استطلاع رأي حول استخدام الذكاء الاصطناعي في عملياتهم التجارية، لكن مع التطورات المستمرة التي نشهدها في مجال تعلم الآلة يتوقع أن تزداد هذه النسبة بشكل كبير ويصبح الاعتماد على استخدام تقنيات تعلم الآلة والروبوتات في أماكن التصنيع أكثر بكثير في المستقبل القريب. السيارات والمركبات ذاتية القيادة: تعمل شركات مثل تسلا وهوندا باستمرار على إنتاج هذا النوع من السيارات مستفيدة من تقنيات التعلم الآلي، وقد قدمت هذه الشركات بالفعل سيارات مؤتمتة جزئيًّا لكن لا تزال السيارات ذاتية القيادة قيد التطوير ولم تصل إلى الشكل النهائي. الخلاصة قدمنا من خلال هذه المقالة دليلًا شاملًا عن تعلم الآلة وبدأنا بتوضيح المفهوم نفسه وأنواع التعلم الآلي وتطبيقاته والفروقات بينها والفرق بين التعلم الآلي والذكاء الاصطناعي، كما تعرفنا على أهمية لغة البرمجة بايثون في مجال التعلم الآلي وسردنا أهم المكتبات وأطر العمل التي توفرها في مجال التعلم الآلي وقدّمنا مثلًا برمجيًا لتطبيق خوارزمية الانحدار اللوجستي كما سردنا أهم المصادر والمراجع لتعلم مجال الذكاء الاصطناعي عمومًا وتعلم الآلة خصوصًا ثم ألقينا نظرة أخيرًا على مستقل مجال تعلم الآلة. نرجو أن تكون هذه المقالة قد قدمت لك فهمًا جيّدًا لمجال تعلم الآلة ووضحت لك المفاهيم الأساسية لتنطلق في رحلة تعلم الآلة والانتقال إلى مواضيع وتطبيقات عملية حتى دخول سوق العمل.
    2 نقاط
  29. كثيرًا ما نحتار في اختيار وجبة طعام اليوم لتحضيرها، أو قد تتوفر لدينا بعض المكونات التي نريد تحضير وصفة ما منها ونحتار في اختيار الوصفة المناسبة، فيمكننا البحث عبر الإنترنت عن وصفات معينة واختيار الأنسب منها، لكن ماذا لو استطاع الذكاء الاصطناعي اختيار الوجبة لنا ووصف طريقة تحضيرها بل وحتى تخيل شكل الطبق النهائي، ففي هذا المقال سنستفيد من قدرات الذكاء الاصطناعي في فهم اللغة الطبيعية وقدرته على توليد المحتوى النصي والبصري لبناء تطبيق نُخبره بالمكونات الموجودة لدينا ومن أي مطبخ نُفضل أن تكون الوصفة وسيقترح لنا وصفة مناسبة مع شرح طريقة تحضيرها، حيث سنستخدم لتطويره لغة PHP وبعض نماذج الذكاء الاصطناعي التي توفرها شركة OpenAI. نماذج الذكاء الاصطناعي واستخداماتها تتميز نماذج الذكاء الاصطناعي بسرعة معالجة وتحليل المعلومات والطيف الواسع من القدرات الكامنة ضمنها، حيث يمكن للنموذج بعد تدريبه تكوين فهمًا جيدًا عن البيانات وبالتالي يستطيع توليد أو التعامل مع بيانات جديدة لم يراها سابقًا، فمثلًا نموذج GPT (اختصارًا لعبارة المحول التوليدي مسبق التدريب Generative Pre-Trained Transformer) المطور من قبل شركة OpenAI دُرّب على كمية كبيرة من البيانات النصية فكون فهم جيد عن اللغات البشرية بدءًا من صياغتها إلى تراكيب الجمل وصولًا إلى المعنى وراء النص، فأصبح بإمكانه إكمال كتابة النصوص كما لو كان من كتبها إنسان وهي وظيفته الأساسية، ونموذج DALL-E المطور من قبل نفس الشركة تم تدريبه على كمية كبيرة من الصور وتوصيفاتها فتكون ضمنه فهم وربط بين النصوص ومحتوى الصور، وبذلك أصبح قادرًا على توليد صور أقرب ما تكون إلى الطبيعية بناءً على توصيف نصي لها. في هذا المقال سنحاول حل مشكلة الحيرة في اختيار وجبة الطعام عبر تطوير تطبيق لاقتراح الوصفات باستخدام لغة البرمجة PHP، وسنستفيد من النموذج ChatGPT في اقتراح الوصفة على المستخدم بحسب ما يريد وشرح طريقة تحضيرها، ومن النموذج DALL-E لتوليد صورة تخيلية لطبق من تلك الوصفة، أي سيكون محتوى التطبيق مولّد بالكامل من قبل نماذج الذكاء الاصطناعي. دورة تطوير تطبيقات الويب باستخدام لغة PHP احترف تطوير النظم الخلفية وتطبيقات الويب من الألف إلى الياء دون الحاجة لخبرة برمجية مسبقة اشترك الآن تحضير ملفات المشروع وتطوير واجهة المستخدم سنحتاج بدايةً لبيئة PHP مثبتة وتعمل على نظام التشغيل، ويمكن تنزيل النسخة المناسبة من الموقع الرسمي لها ثم تثبيته على الجهاز، وللتأكد من صحة التثبيت يمكن تنفيذ الأمر التالي ضمن سطر الأوامر للتحقق من رقم النسخة المثبتة: php -v سيظهر معلومات عن رقم النسخة، ويفضل استخدام النسخة 7.4 أو أعلى، ونبدأ بإنشاء ملف جديد سيحتوي على ملفات المشروع وليكن بالاسم recipe-php، وننشئ ضمنه الملفات التالية: index.php ملف الصفحة الرئيسية suggestion.php ملف صفحة عرض النتيجة style.css ملف تنسيقات CSS لتكون بنية المجلد والملفات ضمنه كالتالي: recipe-php/ ├─ index.php ├─ suggestion.php ├─ style.css ملاحظة: تحتاج إلى أن تملك خبرة أساسية بلغة PHP، وإن كنت جديدًا عليها، فارجع إلى مقال تمهيد إلى لغة PHP ومقال الدليل السريع إلى لغة البرمجة PHP للتعرف على أساسيات اللغة. نبدأ ببناء صفحة الموقع الرئيسية ضمن الملف index.php، وفيها سنطلب من المستخدم إدخال معلومات حول الوصفة، كاختيار المطبخ الذي تنتمي إليه وكتابة بعض المكونات التي قد تكون لدى مستخدم التطبيق ويريد تحضير وجبة طعامه منها، ونبدأ بربط ملف التنسيقات style.css في بداية الملف باستخدام العنصر link، ثم نموذجًا باستخدام العنصر form سيرسل محتوياته إلى ملف صفحة النتيجة suggestion.php بالطريقة POST، ويحوي على حقل اسم المطبخ للوجبة المقترحة نضع فيها خيارات مسبقة مثل (سعودي - سوري - مغربي - يمني - مصري)، ثم حقل نصي اختياري يدخل فيه المستخدم المكونات التي لديه وز لإرسال الطلب، ليصبح ملف الصفحة كالتالي: <!-- index.php --> <head> <!-- استيراد ملف التنسيقات --> <link rel="stylesheet" href="style.css"> <!-- عنوان الصفحة --> <title>تطبيق وصفة</title> </head> <div class="logo">??‍?</div> <form action="suggestion.php" method="post" dir="rtl"> <!-- اختيار المطبخ --> <fieldset> <legend>المطبخ</legend> <input type="radio" name="cuisine" id="cuisine_SA" value="سعودي" required> <label for="cuisine_SA">?? سعودي</label> <input type="radio" name="cuisine" id="cuisine_SY" value="سوري" required> <label for="cuisine_SY">?? سوري</label> <input type="radio" name="cuisine" id="cuisine_MA" value="مغربي" required> <label for="cuisine_MA">?? مغربي</label> <input type="radio" name="cuisine" id="cuisine_YE" value="يمني" required> <label for="cuisine_YE">?? يمني</label> <input type="radio" name="cuisine" id="cuisine_EG" value="مصري" required> <label for="cuisine_EG">?? مصري</label> </fieldset> <!-- مكونات الوصفة --> <div> <label for="ingredients">المكونات</label> <input type="text" name="ingredients" id="ingredients" placeholder="هل لديك مكونات محددة؟ مثال: رز بصل ..."> </div> <!-- إرسال المدخلات --> <button type="submit">اقترح وصفة ?</button> </form> نتوجه الآن لملف عرض النتيجة suggestion.php ونحضر فيه قالب عرض النتيجة، المكون من اسم الوصفة المقترحة وصورة لها ووصف سيحوي على المكونات وطريقة التحضير، وفي النهاية زر للرجوع للصفحة الرئيسية في حال رغب المستخدم اقتراح وصفة جديدة، ولا ننسى ربط ملف التنسيقات style.css في بداية الصفحة كما فعلنا سابقًا، ونحضر بعض المتغيرات الفارغة مبدأيًا سنضع فيها محتويات الصفحة بعد أن تولدها لنا نماذج الذكاء الاصطناعي في الفقرة التالية، ليصبح ملف صفحة النتيجة كالتالي: <!-- suggestion.php --> <?php $name = ''; // اسم الوصفة $recipe = ''; // المكونات وطريقة التحضير $image_url = ''; // رابط صورة الوصفة ?> <head> <!-- استيراد ملف التنسيقات --> <link rel="stylesheet" href="style.css"> <!-- عنوان الصفحة --> <title>اقتراح الوصفة</title> </head> <main class="suggestion"> <!-- اسم الوصفة --> <h2><?= $name ?></h2> <!-- صورة للوصفة --> <img src="<?= $image_url ?>" /> <!-- المكونات وطريقة التحضير --> <div class="recipe" dir="rtl"><?= $recipe ?></div> <footer> <!-- زر الرجوع للصفحة الرئيسية --> <a href="/"> <button>وصفة جديدة ??‍?</button> </a> </footer> </main> أما ملف التنسيقات style.css يهتم بالخطوط والألوان وتنسيق العناصر ضمن الصفحات ليجعلها أجمل ويحوي التالي: /* تنسيق الخطوط */ @import url("https://fonts.googleapis.com/css2?family=Noto+Kufi+Arabic:wght@400;500;700&family=Noto+Naskh+Arabic:wght@400;500;700&display=swap"); @font-face { font-family: "Flags"; font-style: normal; font-weight: 400; font-display: swap; src: url(https://fonts.gstatic.com/s/notocoloremoji/v24/Yq6P-KqIXTD0t4D9z1ESnKM3-HpFabsE4tq3luCC7p-aXxcn.0.woff2) format("woff2"); unicode-range: U+1f1e6-1f1ff; } :root { --font-heading: "Noto Kufi Arabic", "Flags", sans-serif; --font-body: "Noto Naskh Arabic", "Flags", sans-serif; } * { font-family: var(--font-body); } h1, h2, button, label, legend { font-family: var(--font-heading); } /* تنسيقات عامة */ body { display: flex; flex-direction: column; justify-content: center; align-items: center; font-size: x-large; min-height: 90vh; background-color: rgb(237, 240, 244); direction: rtl; } /* تنسيق عناصر الصفحة الرئيسية */ fieldset { border: none; padding: 0; } .logo { border-radius: 999rem; background-color: seagreen; width: 11rem; height: 11rem; text-align: center; line-height: 2em; font-size: 6rem; } form { display: flex; flex-direction: column; gap: 1.5rem; } label, legend { display: block; margin-bottom: 1rem; } input[type="radio"] ~ label { font-family: var(--font-body); display: inline-block; margin-bottom: 0; } button, input { padding: 1rem 2rem; font-size: 1.2rem; } input[type="text"] { display: block; width: 100%; } button { border: none; background-color: seagreen; color: white; font-size: 1.5rem; cursor: pointer; transition: all 150ms ease-in-out; } button:hover { background-color: darkgreen; } /* تنسيقات صفحة النتيجة */ .suggestion { display: flex; flex-direction: column; gap: 2rem; margin: 7rem 3rem; max-width: 50ch; } .suggestion h2 { text-align: center; color: #28774a; } .suggestion img { object-fit: cover; border: 1rem solid white; aspect-ratio: 1/1; } .suggestion .description { background-color: white; padding: 3rem; border: 1px solid darkgray; white-space: pre-line; } .suggestion a button { width: 100%; } يمكننا الآن معاينة الصفحات عبر خادم ويب، ويمكننا خلال مرحلة التطوير الاستفادة من خادم الويب الذي توفره بيئة PHP ويأتي مثبتًا معها، وذلك بتنفيذ الأمر php داخل مجلد المشروع مع الخيار S- ونمرر له عنوان الخادم ورقم المنفذ الذي سيتمع إليه، ويمكننا استخدام العنوان المحلي localhost ورقم المنفذ الافتراضي لخوادم الويب 80 ليصبح الأمر كالتالي: php -S localhost:80 يمكننا الآن زيارة العنوان http://localhost:80 من المتصفح ليعالج الخادم افتراضيًا ملف الصفحة الرئيسية index.php ويرسله لنا لنرى التالي: ولمعاينة صفحة النتيجة نختار خيار عشوائي ونضغط "اقترح وصفة"، ويمكننا مؤقتًا إسناد قيم لمتغيرات المتحوى ضمن صفحة suggestion.php لنتمكن من معاينة تنسيقها كالتالي: <!-- suggestion.php --> <?php $name = 'اسم الوصفة'; $description = 'شرح الوصفة...'; $image_url = '#'; ?> لتظهر لنا الصفحة بالمظهر التالي: بذلك أصبحت واجهة التطبيق جاهزة وتعمل وينقصها المحتوى فقط، وهو ما سنبدأ بتطويره في الفقرات القادمة. توليد مفتاح الواجهة البرمجية API والوصول إليه يحتاج تطبيقنا للتواصل مع نماذج الذكاء الاصطناعي المختلفة لتوليد وطلب المحتوى، ويتم ذلك عبر الواجهة البرمجية API التي توفرها الشركة صاحبة تلك النماذج، لذا نحتاج بدايةً لإنشاء حساب على منصتها وإعداد وسيلة الدفع على الحساب لنتمكن من التعامل مع خدماتها المدفوعة، بعدها علينا توليد مفتاح استيثاق خاص لتطبيقنا من صفحة إعداد المفاتيح ليتمكن من إرسال الطلبات، ويمكن تسمية ذلك المفتاح للتعرف عليه لاحقًا، وبعدها سيظهر لنا المفتاح الجديد لمرة واحدة فقط، لذا يجب التأكد من نسخه وحفظه في مكان آمن حيث سنحتاج لتمريره إلى تطبيقنا. يجب التأكيد على ضرورة الحفاظ على ذلك المفتاح وعدم تسريبه، حيث أن الخدمات التي ستتم باستخدامه ستقتطع كلفتها من حساب المستخدم صاحب المفتاح، ويفضل عدم وضع هذه المفاتيح ضمن الشيفرة البرمجية مباشرة، وأفضل طريقة لتمريرها للتطبيق تكون عبر متغيرات البيئة، فيمكننا مثلًا ضمن بيئة التطوير المحلية تعيين متغير بيئة بالاسم OPENAI_API_KEY وذلك ضمن سطر الأوامر وضمن نفس الجلسة قبل تشغيل خادم الويب، ويمكن ذلك ضمن نظام ويندوز مثلًا بتنفيذ الأمر set مع تبديل قيمة المفتاح: set OPENAI_API_KEY=المفتاح وضمن نظام التشغيل لينكس أو ماك بتنفيذ الأمر export كالتالي: export OPENAI_API_KEY=المفتاح ملاحظة: لم نضع قيمة هذا المفتاح في ملف env. فحينذاك سنضطر للاعتماد على مكتبة لتحميل هذا الملف، لذا حاولت أن يكون التطبيق بسيطًا جدًا بلا مكتبات ما أمكن. بعد تنفيذ ذلك الأمر وحصرًا ضمن نفس جلسة سطر الأوامر أي في نفس النافذة يمكن تشغيل خادم الويب، لنتمكن ضمن تطبيقنا في PHP الوصول لذلك المفتاح عبر التابع getenv كالتالي: getenv('OPENAI_API_KEY'); // قيمة المفتاح من متغير البيئة حيث يجب إرسال قيمة ذلك المفتاح مع كل طلب HTTP للواجهة البرمجية، وضمن الترويسة Authorization قيمتها الكلمة Bearer ثم مسافة وبعدها قيمة المفتاح، ويمكن بناء نص تلك الترويسة في PHP عبر استخراج قيمة المفتاح من متغير البيئة كالتالي: "Authorization: Bearer " . getenv('OPENAI_API_KEY'); وبذلك أصبحنا جاهزين لإرسال الطلبات عبر الواجهة البرمجية API للتخاطب مع نماذج الذكاء الاصطناعي لتوليد المحتوى لتطبيقنا وهو ما سنتعرف عليه ضمن الفقرة التالية. توليد الوصفة وصورة لها سنبدأ بتعريف بعض التوابع ضمن صفحة النتيجة suggestion.php سنستدعيها لاحقًا لإسناد قيم المحتوى التي ستولده نماذج الذكاء الاصطناعي إلى المتغيرات التي جهزناها سابقًا لعرضها ضمن قالب الصفحة، ونبدأ بتعريف تابع توليد النصوص chatGPT والذي يقبل متغير التعليمة النصية prompt$ كمعامل له سيرسلها ضمن طلب HTTP ليطلب من نموذج بالاسم gpt-3.5-turbo توليد جواب نصي من تلك التعليمة، يمكن التعامل مع هذا النموذج بصيغة دردشة بين المستخدم والنموذج، في حالتنا لن نحتاج سوى لرسالة واحدة من طرف المستخدم سنبنيها بناءًا على مدخلات المستخدم لاقتراح وصفة وشرح عنها. يرسل الطلب مع ترويسة الاستيثاق التي تحوي مفتاح الواجهة البرمجية API كما تعرفنا سابقًا، وترويسة للتعريف بنوع المحتوى بجسم الطلب Content-type وهو application/json، وبالطريقة POST ويحوي جسم الطلب على اسم النموذج ضمن الحقل model ومصفوفة رسائل الدردشة الحالية بين المستخدم والنموذج ضمن الحقل messages ، حيث تحتوي كل رسالة على اسم صاحب الرسالة ضمن الحقل role ومحتوى الرسالة ضمن content، وفي حالتنا نحتاج لرسالة واحدة فقط من طرف المستخدم أي user ومحتواها هو التعليمة المٌمررة للتابع ضمن المتغير prompt$ ، وبالاستفادة من التابعين file_get_contents و stream_context_create في PHP يمكننا إرسال طلب HTTP دون الحاجة لأي مكتبات إضافية، أما صيغة الجواب فهي JSON بالشكل التالي وما يهمنا منها هو رسالة النموذج: { ... "choices": [{ ... "message": { "role": "assistant", "content": "...", // رسالة النموذج }, }], } يمكننا استخراجها بعد تمرير جواب الطلب للتابع json_decode لتحويله لكائن PHP نستخرج منه القيمة التي نريدها، ليصبح التابع كاملًا كالتالي: /** * توليد نص باستخدام نموذج الدردشة * @param string $prompt التعليمة * @return string النص المُولد */ function chatGPT($prompt) { $result = file_get_contents('https://api.openai.com/v1/chat/completions', false, stream_context_create([ 'http' => [ 'header' => "Content-type: application/json\r\n" . "Authorization: Bearer " . getenv('OPENAI_API_KEY'), 'method' => 'POST', 'content' => json_encode([ 'model' => "gpt-3.5-turbo", // اسم النموذج 'messages' => [ ['role' => "user", 'content' => $prompt], // رسالة المستخدم ] ]) ] ])); // استخراج النتيجة return json_decode($result)->choices[0]->message->content; } ولتوليد الصور سنعرف التابع dalle والذي يقبل وصفًا نصيًا لمحتوى الصورة، ويرسلها في طلب HTTP بالطريقة POST لمسار توليد الصور الخاص، حيث نحتاج فقط ضمن جسم الطلب لتمرير توصيف الصورة ضمن الحقل prompt ولتحديد قياس الصورة في حالتنا هو 512x512 وعدد الصور التي نحتاجها في حالتنا يكفي صورة واحدة لذا نحدد قيمة n بواحد، ولا ننسى ترويستي الاستيثاق ونوع جسم الطلب، أما عن شكل جواب الطلب فهو بصيغة JSON يهمنا منه رابط الصورة التي تم توليدها: { ... "data": [ { "url": "https://..." // رابط الصورة } ] } نمرره أيضًا للتابع json_decode لتحويلها لكائن PHP ونستخرج منه رابط الصورة التي تم توليدها ليصبح التابع كاملًا كالتالي: /** * توليد صورة باستخدام نموذج توليد الصور * @param string $prompt وصف للصورة * @return string رابط للصورة المُولّدة */ function dalle($prompt) { $result = file_get_contents('https://api.openai.com/v1/images/generations', false, stream_context_create([ 'http' => [ 'header' => "Content-type: application/json\r\n" . "Authorization: Bearer " . getenv('OPENAI_API_KEY'), 'method' => 'POST', 'content' => json_encode([ "n" => 1, // عدد الصور "size" => "512x512", // قياس الصورة 'prompt' => $prompt, // توصيف الصورة ]) ] ])); // استخراج رابط الصورة return json_decode($result)->data[0]->url; } لنبدأ باستخدام تلك التوابع لتوليد محتوى الوصفة المقترحة ونعرف التابع recipe والذي سيقبل اسم المطبخ الذي حدده المستخدم كمعامل أول والمكونات التي أدخلها، حيث سنجمع هاتين القيمتين ضمن تعليمة نشرح بها للنموذج ما نريد أن يولده لنا، ليكون قالب هذه التعليمة كالتالي: بحيث نبدل اسم المطبخ والمكونات بالقيم الممررة للتابع، ونمرر تلك التعليمة للتابع chatGPT الذي عرفناه سابقًا، ليعيد لنا اقتراح النموذج، نعالج ذلك الاقتراح باستخراج اسم الوصفة من أول سطر منه بعد تقسيمه باستخدام التابع explode وبقية الأسطر ستحوي على شرح مكونات وطريقة تحضير الوصفة نحددها باستخدام التابع array_slice ونجمعها مجددًا باستخدام التابع implode، ونعيد هاتين القيمتين بعد تمريرهما للتابع trim لإزالة أي محارف ومسافات زائدة، كنتيجة لاستدعاء التابع تحوي الحقل name اسم الوصفة والحقل description شرح الوصفة ليكون التابع كالتالي: /** * اقتراح وصفة * @param string $cuisine اسم المطبخ الذي تنتمي إليه الوصفة * @param string|null $ingredients مكونات اختيارية تتضمنها الوصفة * @return array اسم وشرح الوصفة */ function recipe($cuisine, $ingredients) { // التوصيف $rules = implode(' ', [ // تحديد المطبخ "من وصفات المطبخ ال" . $cuisine . " المشهورة", // شرط المكونات $ingredients ? "يمكن تحضيرها بالمكونات " . $ingredients : // المكونات "", // بلا مكونات محددة ]); // بناء رسالة طلب المستخدم $recipe_prompt = "اقترح وصفة $rules اذكر اسم الوصفة ثم المكونات ثم طريقة التحضير"; // توليد الاقتراح $suggestion = chatGPT($recipe_prompt); // تقسيم الاقتراح لأسطر $lines = explode("\n", $suggestion); return [ // استخراج اسم الوصفة 'name' => trim(str_replace("اسم الوصفة:", "", $lines[0])), // استخراج المكونات والتفاصيل 'description' => trim(implode("\n", array_slice($lines, 1))), ]; } ولتوليد صورة للوصفة المقترحة يجب أن نصف بصريًا ماذا تحوي تلك الصورة، فنذكر المكونات التي تظهر والطبق والمشهد ونمرر ذلك الوصف للتابع dalle الذي عرفناه سابقًا، لكن المشكلة أننا نحتاج لكتابة توصيف خاص بكل وصفة مقترحة من أين سنأتي بذلك التوصيف؟ بما أن التوصيف عبارة عن نص لما لا نطلب ذلك من GPT حيث نمرر له اسم الوصفة مع شرحها، مع الأخذ بالاعتبار أن التوصيف يجب أن يكون باللغة الإنكليزية حيث لحين تاريخ كتابة هذا المقال لا يفهم DALL-E سوى التعليمات باللغة الإنكليزية، فنرسل التعليمة التالية لتوليد وصف للصورة: وترجمتها هي التالي: نعرف التابع recipeImage الذي يقبل اسم وشرح الوصفة ويطلب من GPT شرح لصورة تحوي طبق منها، ثم يمرر ذلك الوصف إلى DALL-E لتوليد الصورة والحصول على رابطها ونعيده كنتيجة لتنفيذ التابع كالتالي: /** * توليد صورة من اسم وتفاصيل وصفة * @param mixed $name اسم الوصفة * @param mixed $description شرح الوصفة * @return string رابط صورة للوصفة */ function recipeImage($name, $description) { // توليد وصف للصورة $image_desc = chatGPT("write a two sentence description of a dish that contains the following recipe \n $name \n $description"); // توليد الصورة return dalle($image_desc); } أصبحت جميع التوابع اللازمة جاهزة، لنستخدمها لتوليد المحتوى وإسناد القيم لمتغيرات واجهة المستخدم لعرضها، حيث يمكن استخراج القيم التي أدخلها المستخدم من المتغير العام POST_$ بحسب اسم الحقول في الصفحة الرئيسية، ونمرر تلك القيم بداية للتابع recipe لاقتراح وصفة جديدة، ثم نستخرج اسم وشرح الوصفة ونسندها للمتغيرات name$ و description$، ولتوليد الصورة نمرر تلك المتغيرات للتابع recipeImage ونسند قيمة رابط الصورة المولدة التي سيعيدها للمتغير image_url$ كالتالي: // اقتراح وصفة من مدخلات المستخدم $recipe = recipe($_POST['cuisine'], $_POST['ingredients']); $name = $recipe['name']; // اسم الوصفة $description = $recipe['description']; // شرح الوصفة $image_url = recipeImage($name, $description); // رابط صورة الوصفة أصبح التطبيق جاهزًا لنختبر بعض النتائج، لا ننسى التأكد من تعيين المفتاح ضمن متغيرات البيئة قبل إعادة تشغيل خادم الويب مجددًا، والتالي بعض النتائج: وصفة فتة حمص بالطحينة وصفة الكبسة ونلاحظ الأجواء العربية ضمن الصورة وصفة الطاجين المغربي وصفة الكشري وبعض صور الوجبات التي استطاع توليدها: تطويرات إضافية ممكنة ونقاط الضعف الحالية يمكن تطوير التطبيق بإضافة بعض المزايا إليه، مثلًا إضافة خيار لتحديد نوع الوصفة (حلويات - وجبات - مشروبات)، أو إضافة عدد السعرات الحرارية التي ستحتويها الوجبة، أو تحديد عدد الأشخاص وبالتالي ستعدل المقادير من قبل النموذج لمراعاة ذلك، أو حفظ الوجبات ضمن مفضلة لكل مستخدم. يُلاحظ أحيانًا اختراع النموذج لوصفات غير موجودة في الواقع، أو شرح طريقة تحضيرها بطريقة خاطئة، وهذا طبيعي نتيجة ضعف المحتوى العربي الذي دُربت عليه تلك النماذج، قد تُطور لاحقًا وتصبح أقوى من تلك الناحية، لذا لا تعتمد على نتائجه دومًا ونبه المستخدمين لذلك، ويمكن تحسين جودة المحتوى عبرة تغيير صيغ التعليمات المرسلة للنماذج فلا زلنا نكتشف العديد من التقنيات والأساليب للتعامل معها للحصول على نتائج أفضل ما يمكن. دورة الذكاء الاصطناعي احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة. اشترك الآن الختام تعرفنا في هذا المقال على كل من نموذج توليد النصوص GPT ونموذج توليد الصور DALL-E واستفدنا من قوة وسهولة استخدامهما في إضافة بعد جديد لتفاعل المستخدم مع التطبيق والحصول على نتائج لا حصر لها تناسب المستخدم، يمكنك توظيف قوة تلك النماذج في العديد من الأفكار فقط أطلق العنان لخيالك. اقرأ أيضًا إعداد شبكة عصبية صنعية وتدريبها للتعرف على الوجوه تصنيف الشخصيات بالاعتماد على تغريداتهم العربية
    2 نقاط
  30. هل فكرت يومًا خلال تصفحك لموقع ما أن تخزّن إحدى الصفحات على حاسوبك لجودة المحتوى أو لأهمية المعلومات التي قرأتها؟ فهل لاحظت -إن فعلت ذلك- أن امتداد هذا الملف (آخر ثلاث أو أربعة أحرف من اسم الملف) من الشكل html أو htm؟ هل وصلك بريد إلكتروني من شركة أو من مجلة إلكترونية أو حتى من صديق ووجدته مميزًا يضم صورًا وعناوين وكل ما اعتدت أن تفعله هو كتابة بضعة أسطر توجز فيها ما تريد ثم ترسل بريدك؟ هل دخلت يومًا إلى منتدى إلكتروني وأردت أن تكتب تعليقًا وقرأت عبارة "يُسمح باستخدام أكواد HTML" وتساءلت ما هي أكواد HTML؟ هل فكّرت أخيرًا وأنت تتصفح الإنترنت، أنّ جميع المواقع دون استثناء تتشابه في هيكليتها؟ فجميعها يضم شكلًا من قوائم التنقل وأقسامٍ أعلى وأدنى الصفحات تبقى كما هي عند التنقل بين صفحات الموقع نفسه، ونماذج لتعبئتها وعناوين رئيسية وفرعية وروابط لتنظيم المحتوى وتسهيل الوصول إلى المعلومات المطلوبة. إن الوصفة السحرية خلف كل ذلك هي لغة ترميز النص التشعبي Hyper Text Markup Language واختصارًا لغة HTML. سننتعرف في هذا المقال على لغة HTML وذلك إن أردت أن تتعلم لغة HTML من الصفر، إذ سنتحدث بإيجاز عن بدايات اللغة وتاريخ تطورها، ثم ننتقل إلى أساسيات استخدام لغة HTML وأهمية تعلم لغة HTML لأي شخص يرغب في دخول عالم ويب من بوابة المصممين والمبرمجين. نتحدث بعد ذلك عن قدرات HTML ونقاط قصورها، ونستعرض أهم وسوم HTML المستخدمة في كتابة أكواد HTML. جدول المحتويات سنذكر هنا جدول المحتويات باختصار حرصًا على تنظيم المقالة ولتسهيل الوصول إلى القسم الذي تريده بسهولة: ما هي لغة HTML؟ الفرق بين اللغات التوصيفية ولغات البرمجة تاريخ وتطور لغة HTML أهمية تعلم لغة HTML ما الذي أحتاج إليه لأبدأ العمل مع لغة HTML استخدامات لغة HTML أساسيات لغة HTML السمات في لغة HTML الوسوم البنائية والعناصر السطرية الوسوم الأساسية في لغة HTML إيجابيات وسلبيات لغة HTML مصادر تعلم لغة HTML ما هي لغة HTML؟ لغة HTML أو لغة ترميز النص التشعبي هي لغة توصيف للمحتوى markup language بمعنى أنها توصِّف محتوًى معينًا كي تتمايز أجزاءه عن بعضها فيسهل تنظيمه وهيكلته، إذ تشير لغة HTML إلى جزء من المحتوى على أنه فقرة وتميز عدة كلمات على أنها عنوان رئيسي وأخرى على أنها عنوان فرعي وقد تسلسل جزءًا آخر من المحتوى على شكل قائمة من النقاط وكل ذلك باستعمال ما يُدعى وسوم HTML التي تُعطي صفحة ويب هيكليتها وتعطي كل جزء منها دلالة semantic معينة. تُستخدم إذًا لغة HTML في إعطاء هيكل عام لصفحة الويب وبالتالي يُعد تعلم لغة HTML أساسيًا لدخول عالم تطوير الويب. بالإضافة إلى قدرة لغة HTML على تضمين الكثير من ملفات الوسائط المتعددة الصوتيات والمرئيات دون الحاجة إلى أية أدوات أو برمجة إضافية، وتساعدك على تصميم نماذج لإرسال البيانات واستقبالها من خلال الإنترنت وغيرها الكثير. الفرق بين اللغات التوصيفية ولغات البرمجة لغة HTML كما أشرنا هي من اللغات التوصيفية markup languages ولا تعد لغة برمجة programming language ويكثر الخلط بينهما ويظن حديث العهد بمجال علوم الحاسوب أن تعلمه لغة HTML يعني دخوله للمجال واحترافه للبرمجة وهذا خلط وخطأ، ويجب التفريق بين لغة التوصيف ولغة البرمجة. يشير مصطلح اللغات التوصيفية إلى نظام لترميز النصوص وتوصيفها وهيكلتها للتحكم بتنسيقها أو بإيجاد علاقات بينها وإغناء محتواه لتسهل عرض النص والتعامل معه والتحكم به، فماذا لو قرأت المقال الحالي بوتيرة واحدة وكأنه نص مثل نص هذه الفقرة فهل ستميز العناوين والأقسام والفقرات؟ هل فكرة أو قرأت كتابًا وكان بتنسيق ووتيرة واحدة؟ لن تميز أقسامه عن بعضها، وهذا ما تفعله اللغات التوصيفية بالضبط وما تراه أمامك الآن بعينيك. تضم اللغات التوصيفية مجموعة من الوسوم أو القواعد التي يشير كل منها إلى دلالة معينة وتستخدم لتنظيم البيانات النصية وعرضها بطريقة يسهل تمييزها بالنسبة للإنسان أو الحاسوب كأن تشير إلى عبارة على أنها عنوان وتبرز عبارة أخرى بكتابتها بخط ثخين وهكذا. لا تُعرض تلك القواعد أو الوسوم ولا تُضاف إلى المحتوى الفعلي بل وظيفتها وصف البيانات فقط وترتيبها، وتتطلب هذه اللغات فقط برنامجًا ليحلل الوسوم ويعرض المحتوى وفقًا لمدلول كل وسم وغالبًا ما تحلل المتصفحات أكواد HTML وأكواد XML ثم تعرض النتائج بينما تحلل برمجيات أخرى مخصصة لغات توصيفية أخرى مثل مارك داون Markdown ودوك بوك DocBook اللتان تستخدمان في المحررات النصية ولاتخ LaTex لكتابة الأوراق البحثية الأكاديمية وغيرها الكثير. أما اللغات البرمجية فوظيفتها توجيه أوامر للحاسوب لإنجاز مهمة أو وظيفة محددة مثل توجيهه لجمع عددين مع بعضهما كأبسط مثال أو طلب بيانات من مستخدم ومعالجتها وعرضها له أو استعمالها في غرض ما فأنت حين تسجل في موقع مثل أكاديمية حسوب أو تدفع لشراء شيء ما تتدخل لغة برمجية في الخلفية لإنجاز هذه المهام وغيرها من الأمثلة المتقدمة، وهنالك الكثير من لغات البرمجة التي تتفاوت وظيفتها ومجال استخدامها فمنها عام الاستخدام الذي يُستخدم في بناء البرامج والتطبيقات الحاسوبية مثل لغة البرمجة بايثون، ومنها ما هو خاص الاستخدام مثل لغة PHP التي تستخدم في أغلب الحالات في تطوير الويب بدمج لغة HTML معها. تأتي بساطة HTML وسهولتها من كونها لغة توصيفية خفيفة وسهلة الفهم، ولا يتطلب العمل معها الكثير من الأدوات أو البرمجيات وبالتالي استقلالية ومحمولية portability أفضل. تاريخ وتطور لغة HTML قد لا تتوقع إطلاقًا أين ولدت لغة HTML! وهذا دليل إضافي على صحة مقولة "الحاجة أم الاختراع". لقد أراد مهندس الحاسوب تيم بيرنرز لي Tim Berners-Lee الذي يعمل في قسم خدمات الحاسب في مؤسسة CERN لفيزياء الجزيئات أن يُمكّن الزملاء في مختلف المواقع داخل وخارج المؤسسة من تبادل الدراسات والأوراق البحثية وربطها مع بعضها بدلًا من تحميل نسخ عن جميع هذه الأوراق والأبحاث على كل حاسوب. أي بكلمات أخرى، سيتمكن أي باحث أثناء قراءته لمقال ما أن ينتقل إلى مقال آخر أو يستعرض معلومات أخرى جرى ذكرها في المقال الذي يقرأه دون أن يُضطر إلى إغلاق مقاله ثم البحث من جديد في أرشيف المقالات عن الموضوع الذي صادفه ثم العودة إلى المقال الأصلي. لا أعتقد أن بيرنرز-لي قد توقع من فكرته الثورية ميلاد تقنية شبكة الويب بأكملها فقد أثبتت هذه الفكرة قدرتها على التوسع لبناء شبكة عنكبوتية من الصفحات المترابطة التي تتيح لك التنقل فيما بينها جيئةً وذهابًا. لقد اعتمد بيرنرز-لي على لغة توصيف موجودة بالفعل ومحط اتفاق بين جميع العاملين في مجال الحواسب وهي لغة الترميز المعياري العام SGML فبدون أساس متين تستند عليه لم يكن ليُكتب البقاء لهذه اللغة. إذًا اعتمد بيرنرز-لي على فكرة الوسوم التي تُستخدم في SGML وهي مفاتيح تحيط بنص معين في بدايته ونهايته ليكون لهذا النص دلالة معينة وفقًا لنوع الوسم مثل <p/>...نص ما هنا...<p>، لكنه أضاف وسمًا جديدًا للمساهمة في الربط بين الصفحات وهو وسم المربط أو المرساة <a>. ولكي تُفسّر هذه الوسوم لا بد من وجود أداة تحللها وتعرض المطلوب على الشاشة لهذا صمم بيرنيرز لي أول أداة لتحليل أكواد لغة HTML دُعيت حينها WorldWideWeb وتختصر إلى www وهو اختصار معروف لك تجده اليوم في أغلب الروابط، وكانت هذه الأداة أصل ما يُدعى اليوم بالمتصفحات Browsers. شجّع بيرنرز-لي المهتمين بلغة HTML على كتابة برمجيات لتحليل هذه اللغة وعرضها على الشاشة كما اخترع بنفسه بروتوكولًا لنقل وتوزيع النصوص التشعبية سماه بروتوكول HTTP أي بروتوكول نقل النصوص التشعبية HyperText Transfer Protocol. لا زلنا حتى اللحظة في عام 1991 لكن مع ظهور فكرة أسماء النطاقات DNS (دُعيت حينها خدمة الأسماء الموزّعة) وعناوين إنترنت IP أمكن الربط بين الحواسب بطريقة أسهل وأكثر أمانًا وأصبح كل شيء مهيئًا لولادة الويب. تصاعد اهتمام الباحثين والعاملين في مجال الحواسب بلغة HTML لاحقًا من خلال عدة اجتماعات ومراسلات لتظهر للعلن أولى نسخ لغة HTML الرسمية عام 1993 وهي HTML 1.0. مع زيادة اهتمام الفعاليات بهذه اللغة أضيفت وسوم وميزات جديدة لها وبدأت الكثير من الشركات بالعمل على إنتاج المتصفحات فظهرت النسخة HTML 2.0 وتلاها ظهور متصفحات معروفة مثل نتسكيب Netscape وإنترنت إكسبلورر Internet Explorer. قدم ديفيد راغيت David Raggett نسخة HTML+‎ عام 1993 وأضافت هذه النسخة الكثير من الميزات إلى اللغة مثل الجداول ونماذج إرسال البيانات، والتي اعتمدت أغلبها لاحقًا في نسخة HTML 3.0 عام 1995 لكنها سببت في بطء المتصفحات مما دفع لاعتماد نسخة جديدة محسّنة هي HTML 4.0 عام 1999 ثم تلتها النسخة HTML 4.01 في وآخر العام ذاته وكانت بالفعل أكثر نجاحًا. تبنت منظمة W3C وهي رابطة الشبكة العالمية World Wide Web Consortium التي أسسها بيرنرز-لي اعتماد معايير لغة HTML وتطويرها منذ عام 1996 ثم تكونت لاحقًا مجموعة WHATWG عام 2004، وضمت الكثير من الشركات المهتمة بصناعة تقنيات الويب آنذاك وقد أخذت على عاتقها تطوير نسخة HTML 5 لتصدر رسميًا عام 2015، وتُعد HTML 5 امتدادًا لسابقتها والأكثر اعتمادًا حاليًا وتقدم الكثير من الميزات المتقدمة مثل الموقع الجغرافي ودعم الفيديو والصوتيات ضمنيًا واستخدام لوحات الرسوم الديناميكية من خلال من خلال العنصر Canvas وكذلك العمل مع مقابس ويب web sockets وغيرها، وصدرت بعد ذلك نسختي HTML 5.1 و HTML 5.2 في عامي 2016 و 2017 تباعًا. لن تكون هناك نسخة HTML 6 في المدى المنظور بل سيستمر العمل على تطوير HTM 5 بما يتناسب مع التطور التكنولوجي وفقًل لتقارير تصدرها مجموعة WHATWG ومن يدري في النهاية، فالويب متطور بسرعة رهيبة وقد تنقلب الموازين وتتغير الأحكام. دورة تطوير واجهات المستخدم ابدأ عملك الحر بتطوير واجهات المواقع والمتاجر الإلكترونية فور انتهائك من الدورة اشترك الآن أهمية تعلم لغة HTML أهمية تعلم لغة HTML تأتي من كونها المفتاح الرئيسي للبدء بتعلم البرمجة وتطوير مواقع وتطبيقات الويب كما ذكرنا في أول عبارة في المقال. ولعل وجودك هنا يدل على رغبتك في خوض مغامرة جديدة في عالم ويب تتجاوز حدود تصفح المواقع والنشاط على مواقع التواصل والمنتديات. فإن كنت محقًا في تخميني، إليك بعض الأسباب التي تدفعك إلى تعلم لغة HTML: لغة HTML هي مدخلك الرئيسي إلى علوم الحاسب عمومًا وإلى تصميم مواقع وتطبيقات ويب خصوصًا: فإن شبهنا موقع ويب بالمنزل فستكون لغة HTML بمثابة هيكل المنزل من أعمدة وأسقف وجدران. لغة HTML بسيطة التعلم: كل ما عليك فعله بداية هو تذكر وسوم لغة HTML ودلالاتها ثم استخدام هذه الوسوم وفق تسلسل منطقي لتكوين الصفحة فالوسم <title> مثلًا لإضافة عنوان للصفحة والوسم <p> لإضافة فقرة نصية والوسم <img> لإدراج صورة وهكذا. لا يحتاج تعلم لغة HTML واستخدامها إلى أدوات معقدة: يمكنك استخدام أي محرر نصي بسيط لكتابة أكواد HTML ثم حفظ الملف بالامتداد html ليتحول إلى صفحة HTML ساكنة يستطيع أي متصفح تحليلها. مع ذلك قد تستفيد من محررات متقدمة لتسريع وتيرة عملك والتأكد من عدم وجود أخطاء. لغة HTML لغة مرنة: ارتكب ما تشاء من الأخطاء وسيحاول المتصفح جاهدًا فهم ما تريده. يشجعك ذلك غالبًا على الانطلاق في العمل، فرؤية نتاج ما فعلته أمر محفز، بينما ستحبطك بالتأكيد قائمة بعشرات الأخطاء لا تعرف معها أين اخطأت وكيف تتجاوز تلك الأخطاء. فإن شجعتك النقاط السابقة على البدء في تعلّم لغة HTML، تابع القراءة معنا لتتعرف على أساسيات لغة HTML وأين وكيف تُستخدم. احصل على موقع إلكتروني مخصص لأعمالك أبهر زوارك بموقع احترافي ومميز بالاستعانة بأفضل خدمات تطوير وتحسين المواقع على خمسات أنشئ موقعك الآن ما الذي أحتاج إليه لأبدأ العمل مع لغة HTML كما أشرنا سابقًا لن تُضطر إلى شراء أية أدوات أو أن تتكلف أية مبالغ إضافية ولا حتى تعلم العمل على برامج جديدة، فكل ما تحتاجه: محرر نصي: مثل المفكرة Notepad إن كنت من مستخدمي ويندوز أو محرر النصوص الافتراضي تكست Text أو كايت Kate إن كنت تستخدم إحدى توزيعات لينكس. إذ ستكتب أكواد HTML كما تكتب أي نص ثم تحفظ عملك تحت اسم معبّر ينتهي بالامتداد html، وهذا كبداية. متصفح ويب: لن يخلو حاسوبك من هذه البرامج طالما أنك تستخدم الإنترنت. يُفضّل مع ذلك استخدام إحدى المتصفحات الحديثة مثل غوغل كروم أو موزيللا فايرفوكس أو مايكروسوفت إيدج أو غيرها، وبإمكانك تنزيلها مجانًا. يحلل المتصفح أكواد HTML ويعرض محتوى الصفحة وفقًا لأكواد HTML التي استخدمتها. قد تحتاج لاحقًا إلى محررات نصية أكثر تقدمًا لتسريع إنتاجيتك مثل VS code لتسهيل كتابة أكواد لغة HTML خصوصًا إن كنت مقبلًا على تعلم البرمجة. إذ تقدم هذه المحررات النصية الخاصة ميزات إضافية كالإكمال التلقائي للشيفرة بمجرد كتابة الأحرف الأولى وتنبيهك إن ارتكبت بعض الأخطاء واقتراح الحلول وغير ذلك. استخدامات لغة HTML رأينا أن لغة HTML هي لغة توصيفية أي توصِّف النصوص لذا تُستخدم مع النصوص عمومًا لتنسيقها وهيكلتها ولكن شاع استخدامها مع نصوص صفحات الويب خصوصًا (التي هي نصوص في النهاية) وبالتالي تعتبر وسيلة يستخدمها مصممو ويب في: نشر الملفات والمستندات بطريقة مهيكلة ومرتبة على الإنترنت، إذ يمكن أن تضم صورًا وجداول وقوائم ونصوصًا. الوصول إلى معلومات من الإنترنت من خلال الروابط التشعبية بمجرد نقرها. تصميم نماذج لتنفيذ عمليات على مزودات خدمة بعيدة على الإنترنت وإعادة النتائج، كأن تبحث عن معلومات أو تحجز رحلة طيران أو تشتري منتجًا. تضمين مقاطع فيديو مرئية ومقاطع صوتية وغيرها لعرضها وتشغيلها ضمن ملفاتك مباشرة. إن تحدثنا على عملية تطوير الويب وتحديدًا تطوير الواجهات الأمامية في صفحات الويب، فيُستخدم ثلاثي ذهبي أساسي فيها أولها لغة HTML لهيكلة النصوص وتوصيفها كما رأينا وثانيها لغة CSS صفحات الأنماط الانسيابية لإضافة تنسيقات وتأثيرات مرئية تضفي جمالية وبهجة على النصوص، وثالثها لغة جافاسكربت البرمجية التي تمنحها قدرات تفاعلية كبيرة مثل التفاعل عند النقر أو تنفيذ وظائف معينة في الخلفية، إذ تشكل هذه اللغات الثلاثة أساسًا للصفحات الديناميكية وتطبيقات الويب. لا يقتصر استخدام لغة HTML على بناء صفحات ويب مخصصة للنشر على الإنترنت، فقد تُستخدم لأغراض بناء النماذج الأولية للبرمجيات أو الأنظمة، إذ تُستخدم صفحات HTML لبناء واجهات مستخدم تجريبية تحاكي الواجهات الفرعية والنوافذ وكيفية التنقل بينها أثناء مرحلة التصميم (بالتنقل بين هذه الصفحات بدلًا من توضيح الأمر عن طريق الرسوميات) نظرًل لسهولة التعامل معها موازنة بلغات البرمجة. إضافة إلى ذلك تُستخدم HTML حديثًا كأساس لكتابة واجهات تطبيقات سطح مكتب تعمل على أنظمة تشغيل مختلفة في وقت واحد عبر استعمال الثلاثي الذهبي السابق مع إطار العمل إلكترون Electron، وذلك اعتمادًا على المعايير الموحدة في تطوير الويب بدلًا من تعلم لغة مخصصة لكل نظام تشغل لبرمجة تطبيقاته فلا تستغرب أن بعض واجهات التطبيقات التي تستعملها الآن مكتوبة بلغة HTML، وتشرح دورة تطوير التطبيقات باستخدام JavaScript من أكاديمية حسوب كيفية تطوير تطبيق سطح مكتب باستخدام Electron.js مرة واحدة ولكن يعمل على كل أنظمة التشغيل كما أشرنا. أساسيات لغة HTML تعتمد لغة HTML على مفهوم الوسم tag وهو مفتاح دلالي يحيط بنص ليعطيه مظهرًا أساسيًا ودلالة محددة. لنلق نظرة على المثال التالي: <h1> HTML مرحبا بك إلى </h1> <p> هي لغة توصيفية تُستخدم لهيكلة صفحات ويب HTML لغة </p> لو كتبت هذه الشيفرة في محرر نصي (يمكنك نسخها ولصقها أيضًا) ثم حفظت التغييرات بالاسم test.html ونقرت على هذا الملف الجديد سيستدعي نظام التشغيل المتصفح الافتراضي ليعرض النتيجة التالية: عرض المتصفح عبارة "مرحبًا بك إلى HTML" بخط ذو حجم كبير وثخين لأنه أحيط بالوسم <h1> والذي يُعرف بأنه وسم عنوان من المستوى الأول ويدلّ على أن النص الذي يغلّفه هو عنوان لفقرة ما. بينما عرض العبارة الأخرى التي أحيطت بالوسم <p> في سطر جديد وبالشكل الاعتيادي كما يعرضه أي محرر نصي. يُدعى وسم HTML هذا بوسم الفقرة النصية ويدل على أن النص الذي يُغلّفه هو فقرة نصية سردية تورد محتوى معينًا. يتألف عنصر HTML من الأجزاء التالية: وسم البداية Opening tag: وتتكون من اسم العنصر (p أو h1 في مثالنا) محاطًا بقوسي زاوية <>. ويشير هذا الوسم إلى النقطة التي يبدأ عندها العنصر. وسم النهاية Closing tag: يشابه وسم البداية لكنه يبدأ بشرطة أمامية / تسبق اسم العنصر. ويشير هذا الوسم إلى نهاية العنصر (<p/> و <h1/>). المحتوى Content: ويشير إلى المحتوى النصي الموجود بين وسمي البداية والنهاية. وقد لا يغلف وسمي البداية والنهاية أي محتوى، فيُدعى العنصر في هذه الحالة عنصرًا فارغًا empty element. وهكذا نرى أن صفحة ويب مبنية أساسًا باستخدام وسوم HTML المتتالية أو المتداخلة كما سنرى لإعطاء الصفحة الهيكلية المميزة لها. وكل ما عليك فعله لتعلم لغة HTML هو الاطلاع على تلك الوسوم ومعرفة دلالاتها ثم محاولة إدراج كود HTML الخاص بها في المكان المناسب. لا تُعد لغة HTML لغة ًحساسة لحالة الأحرف عند كتابة الوسوم، فالوسمين <p> أو <P> مثلًا متطابقين ويعطيان النتيجة ذاتها. السمات في لغة HTML سمات HTML هي مفاتيح داخلية توضع داخل وسم بداية العنصر لتقدم معلومات أو ميزات إضافية لهذا العنصر، ويمكن تشبيه العنصر بطفل والسمة بصفات ذلك الطفل مثل اسمه التي تحمل قيمة عبد الله وطوله ووزنه وغيرها من الصفات. وتتكون السمة من اسم السمة يليها إشارة مساواة ثم قيمة السمة ضمن إشارتي تنصيص مزدوجتين (" ") أو مفردتين (' '). ولا بد من وجود فراغ بين السمة واسم العنصر وبين السمة والسمة التي تليها إن وجدت. إليك مثالًا عن عرض صورة باستعمال الوسم <img>: <h1>جمال الطبيعة</h1> <img src="nature.jpg" width="300px" alt="صورة من الطبيعة"> وضعت صورة بجانب صفحة text.html باسم nature.jpg وأشرت إليها في الخاصية src التي يأخذها عنصر الصورة ولاحظ أنني حددت عرضها عبر الخاصية width واسم بديل للصورة إن لم تُعرض لأي سبب عبر الخاصية alt، والنتيجة: ضع في بالك أن السمات التي يأخذها عنصر قد لا يأخذها عنصر آخر وأن لبعض العناصر سمات خاصة فريدة بها، فانظر مثلًا إلى سمات العنصر <img> في توثيقه في موسوعة حسوب وبالطريقة نفسها يمكنك الرجوع إلى توثيق كل عنصر على حدة ومعرفة سماته التي يأخذها. ملاحظة: إن وجدت سمة HTML بلا قيمة أو كانت قيمتها نفس اسمها مثل "disabled="disabled تُدعى حينها بالسمة المنطقية وتُنفّذ ما يوحي به اسمها. الوسوم البنائية والعناصر السطرية تصنف وسوم HTML ضمن مجموعتين مهمتين هما مجموعة الوسوم الكتلية أو البنائية Block elements والسطرية inline elements وسنشرح الفرق بينهما. أما الوسوم الكتلية، فهي وسوم تظهر في سطر جديد بعد العنصر الذي يسبقها أي لا يمكن أن تقع على نفس السطر مع عنصر آخر لأنها تحتل سطرًا كاملًا من أوله لآخره وسيظهر العنصر الذي يليها في سطر جديد أيضًا. تُعد الوسوم الكتلية في الصفحة عناصر هيكلة وتنظيم ومن أمثلتها وسم الفقرة النصية <p> والعناوين <h> وقوائم تعداد <ol> و <ul> وغيرها، وتجدر الإشارة إلى أن الوسوم الكتلية لا توضع ضمن وسوم سطرية لكنها العكس صحيح. وأما الوسوم السطرية، فتقع داخل الوسوم البنائية وتحيط بأجزاء صغيرة من المحتوى (أي جزء من فقرة نصية أو مجموعة من بنود قائمة). لا تسبب هذه اوسوم ظهور سطر جديد في المستند أي لا تشغل بنفسها السطر بالكامل من هذه الوسوم نذكر الوسم <span> الذي يطبق تنسيقًا على جزء من فقرة والوسم <em> الذي يعرض جزءًا من النص بخط مائل. <h1> أنا وسم كتلي</h1> <p>عندما لا أقع على سطر خاص بي <em>وسمًا سطريًا </em> وأكون </p> الوسوم الأساسية في لغة HTML إليك قائمة بأهم وسوم لغة HTML ودلالاتها: عنصر الفقرة p يغلف عنصر الفقرة Paragraph أي فقرة نصية تريد عرضها كما هي ضمن صفحة ويب. يبدأ العنصر بسطر جديد وينتهي بسطر جديد عناصر عناوين الفقرات h يُضاف إلى الوسم أرقام من 1 إلى 6 لتحديد مستوى العنوان Header لتصبح على الشكل <h1> و <h2> وهكذا حتى <h6>. إليك مثالًا: <hgroup> <h1>عنوان من المستوى الأول</h1> <h2>عنوان من المستوى الثاني</h2> <h3>عنوان من المستوى الثالث</h3> <h4>عنوان من المستوى الرابع</h4> </hgroup> ستكون النتيجة كالتالي: عنصر القائمة ol/ul وتضم مجموعة من وسوم HTML تُدعى وسوم القائمة <li> ينبغي ترتيبها وفق تسلسل معين باستخدام قائمة مرتبة <ol> كأن تصف طريقة تحضير وصفة طعام أو خطوات الوصول إلى وجهة معينة أو دون تسلسل باستخدام قائمة غير مرتبة <ul>. إليك مثالًا عن قائمة مرتبة: <ol> <li>أفرغ محتويات ظرف الكريمة ضمن وعاء نظيف</li> <li>أسكب كوبًا من الماء البارد وحرك المزيج بلطف حتى التجانس</li> <li>استخدم خفاقة كهربائية لخفق المزيج بشدة من 4 إلى 5 دقائق</li> <li>ضع الكريمة في البراد حتى يحين وقت استخدامها</li> </ol> ستكون النتيجة كما يلي: وهذا مثال عن قائمة غير مرتبة: <ul> <li>C++</li> <li>Python</li> <li>Java</li> <li>PHP</li> </ul> ستكون النتيجة كما يلي: للاطلاع على المزيد من الوسوم لتعلم لغة HTML وطريقة استخدامها أنصحك بالتوجه إلى التوثيق العربي للغة HTML ضمن موسوعة حسوب لعلوم الحواسب وتكنولوجيا المعلومات. عنصر الرابط a يولد عنصر <a> رابطًا إلى صفحة HTML أخرى أو إلى قسم آخر ضمن صفحة HTML نفسها ويأخذ سمة href التي تحوي رابط الوجهة المطلوبة: <a href="https://academy.hsoub.com/"> أكاديمية حسوب </a> يسمى النص بعد تحويله إلى رابط بالمربط anchor ومن هنا جاءت تسمية العنصر <a> اختصارًا لأول حرف. أخيرًا وليس آخرًا، لا يسعنا في هذا القسم شرح كل عناصر HTML ولا حتى في مقال واحد، وسنحيلك في قسم المصادر إلى مراجع تتعرف فيها على كل وسوم لغة HTML. إيجابيات وسلبيات لغة HTML لا يمكن الحكم على إيجابيات لغة أو سلبياتها إلا من خلال منظور معين يتعلق أولًا وأخيرًا بحاجتك إلى استخدام هذه اللغة أو غيرها، ولا تمثل لغة HTML استثناءً فهي لغة محددة الوظيفة ولا بد من أخذ ذلك بعين الاعتبار. إيجابيات لغة HTML تستخدم لغة HTML على نطاق واسع في بناء هيكلية صفحات ومواقع ويب. تدعم جميع المتصفحات الحديثة لغة HTML وعلى مختلف المنصات. تعلم لغة HTML أمر سهل. حجم أكواد لغة HTML صغير وسريعة التحميل. لا حاجة لشراء برمجيات إضافية للتعامل مع لغة HTML بل يمكن أن تكتفي بمحرر نصي ومتصفح. لغة HTML شديدة المرونة وتحاول تجاهل الأخطاء التي ترتكبها أو تفسير ما هو مكتوب لإظهار نتيجة. يمكن أن تتكامل لغة HTML بسهولة مع لغات أخرى مثل JavaScript. من السهل كتابة أكواد HTML حتى بالنسبة للمبتدئين. تضم لغة HTML عددًا كبيرًا من العناصر التي تمتلك دلالات مختلفة مما يساعد في تنظيم وهيكلة صفحة الويب بطريقة أكثر احترافيةً ووضوحًا. سلبيات لغة HTML لا يمكن استخدام لغة HTML في تقديم صفحات ديناميكية تتجاوب مع المستخدم (كتنفيذ شيء ما عند نقر زر) لوحدها بل صفحات ساكنة فقط. قد تتداخل وسوم HTML مع بعضها عندما يكون هيكل الصفحة معقدًا وبالتالي سنجد صعوبة في تفسير أكواد HTML المكتوبة. تسبب مرونة لغة HTML وتغاضيها عن الأخطاء في أحيان كثيرة أخطاء قاتلة ومكلفة. قد تضطر إلى كتابة كمية كبيرة من اكواد HTML لإنشاء صفحة واحدة بسيطة. محدودية الميزات الأمنية التي تقدمها اللغة. قد تستغرق وقتًا طويلًا في إنشاء بعض المخططات وصيانتها كالجداول الكبيرة والقوائم المتداخلة والنماذج. مصادر تعلم لغة HTML إن كونت تصوّرًا واضحًا عن لغة HTML فلابد أنك تريد تعلم لغة HTML من الصفر أو إن كان لديك الأساسيات فتريد أن تتعمق فيها أكثر، وسندلك في هذا القسم إلى المصادر العربية التي وفرناها والتي تخولك لاحتراف لغة HTML. بدايةً، وفرت أكاديمية حسوب دورة تطبيقية كاملة عن تطوير الواجهات باستخدام لغة HTML وهي دورة تطوير واجهات المستخدم تزيد عن 50 ساعة فيديو أُعدت على يد نخبة من المبرمجين العرب وبلغة عربية تشرح الدورة الثلاثي الذهبي لغة HTML مع لغة CSS ولغة جافاسكربت وستصبح بإنهائك للدورة مطور واجهات مستخدم أمامية مع شهادة معتمدة تشهد بذلك وستتقن فيها تلك اللغات السابقة وستستعملها في بناء واجهات تطبيقات حقيقية. دعمت موسوعة حسوب الدورة هذه بتوفير توثيق HTML العربي وهو توثيق كامل عن لغة HTML بكل عناصرها وتفصيلاتها والسمات التي تأخذها وقيمها وكل شيء بلغة عربية لن تحتاج معه إلى مصادر أجنبية. نضيف إلى ما سبق المنشورات التي تنشرها أكاديمية حسوب ومنها: كتاب نحو فهم أعمق لتقنيات HTML5 وهو كتاب يخص إصدار HTML 5 وما فيه من ميزات وتقنيات أضيفت للغة HTML. قسم لغة HTML: وتُنشر فيه دروس ومقالات عن لغة HTML عمومًا بمختلف المواضيع وفيه ما يزيد عن 80 مقال ودرس عملي تطبيقي ننصح بالإطلاع عليه دوريًا ومتابعته. ستتعلم بتلك المصادر لغة HTML باتقان واحتراف وستستخدمها في مكانها أحسن استخدام لبناء واجهات وصفحات الويب احترافية وستدخل عالم الويب من أوسع أبوابه متجهًا نحو إتقان البرمجة والتطوير، وإن واجهت في رحلتك تلك أي عقبة، فضع سؤالك ضمن قسم الأسئلة والأجوبة لتحصل على إجابة من مبرمجين آخرين معك ولا تنسى مشاركة تجاربك في مجتمع حسوب IO البرمجي. خاتمة تُعد لغة HTML لغة توصيفية سهلة الاستخدام تعتمد على مجموعة من الوسوم لتنظيم النصوص وهيكلتها لتسهيل قراءتها وتوضيح مدلولاتها من فقرات وعناوين وقوائم وكذلك لتسهيل الوصول إلى أجزائها آليًا. تعرفنا في هذا المقال على طبيعة لغة HTML كجزء من عائلة اللغات التوصيفية، واطلعنا على تاريخها واستخداماتها وأساسيات العمل معها، كما ناقشنا إيجابيات لغة HTML وأماكن قصورها لتتكون لديك عزيزي القارئ قاعدة من المعارف الأساسية التي تمكّنك من الانطلاق في رحلتك لتعلم لغة HTML اعتمادًا على مصادر التعلم التي اخترناها لك أو أية مصادر قد تقع عليها وتجدها يسيرة ومحفزّة. اقرأ أيضًا دليلك الشامل إلى تعلم البرمجة المدخل الشامل لتعلم تطوير الويب ما هي فوائد تعلم البرمجة؟ المرجع الشامل إلى تعلم لغة بايثون دليلك الشامل للتحضير للعمل كمستقل عندما تكون مبرمجا تعلم البرمجة بنفسه
    2 نقاط
  31. علوم الحاسوب computer science (أو يطلق عليه علوم الكمبيوتر أو علوم الحاسبات بالعامية) هو روح العصر الحديث ويمثل مجال التقنية التي دخلت في كل مفاصل حياتنا، فهو يدخل في كل صغيرة وكبيرة من حولنا بدءًا من الهواتف المحمولة والحواسيب والآلات والمصانع وكل شيء بما لا يمكن حصره من المنتجات والخدمات حيث أسهم في نقلنا إلى مرحلة أعلى من الفعالية والجودة والفائدة. هذا المقال هو دليل شامل للتعرف على اختصاص علوم الحاسب وفوائده وتطبيقاته والمواد التي تدرس فيه والمجالات المتفرعة منه ثم سنناقش بعض الأسئلة المهمة المتعلقة بجدوى اختيار تخصص علوم الحاسوب ودراسته وما هي فرص العمل المتوفرة في مجال علوم الحاسوب وسنعرف أيضًا الفرق بين علم الحاسوب وهندسة الحاسوب وأخيرًا سنرشدك إلى كيفية البدء في دراسة اختصاص علوم الحاسب ذاتيًا وندلك على بداية الطريق لتنطلق إن أحببت المجال. هل أنت جاهز؟ لننطلق! فهرس المحتويات حرصًا على تنظيم المقالة ولتسهيل الوصول إلى القسم الذي تريده بسهولة، سنذكر هنا جدول المحتويات باختصار: ما هي علوم الحاسب؟ فوائد وتطبيقات علوم الحاسوب هل تعلم علوم الحاسوب مفيد؟ مواد علوم الحاسوب تخصصات علوم الحاسب كيف أختار التخصص المناسب لي من تخصصات علوم الحاسب؟ التوظيف وفرص العمل في مجال علوم الحاسوب ما الفرق بين علوم الحاسب وهندسة الحاسب؟ من أين أبدأ بتعلم علوم الحاسب؟ ما هي علوم الحاسب؟ تُعرَف علوم الحاسوب بأنها كل العلوم المتعلقة بالآلات الحسابية والمنطقية، حيث تعمل بدارات إلكترونية، وقد تكون علومًا نظريةً مثل نظرية المعلومات Information Theory أو تطبيقية مثل البرمجيات Software أو العتاد Hardware. والبرمجيات software هي الأنظمة غير الملموسة التي تُشغّل عتاد الحواسيب hardware وتقوم بمهام المستخدمين المطلوبة، بينما العتاد هو القطع الفيزيائية الملموسة التي تُكوّن النظام الحاسوبي مثل المعالِج والذاكرة العشوائية RAM والقرص الصلب …إلخ. وتتشعّب علوم الحاسوب وتترابط مع بعضها بعضًا، إذ لا يمكنك دراسة البرمجة دون دراسة الخوارزميات وهياكل البيانات، كما لا يمكنك دراسة علوم الذكاء الاصطناعي دون دراسة الجبر الخطّي والاحتمالات وعدد آخر من علوم الرياضيات. فوائد وتطبيقات علوم الحاسوب نَذكُر من فوائد وتطبيقات علم الحاسوب ما يلي: تعد شبكة الإنترنت واحدة من أفضل الاختراعات في التاريخ الإنساني، فهي شبكة حاسوبية تصل مناطق العالم ببعضها البعض. حواسيب سطح المكتب والحواسيب المحمولة التي نعمل عليها أو نرفّه خلالها عن أنفسنا …إلخ، جميعها قائمة على علوم الحاسوب وتخصصات الحاسب. الهواتف المحمولة وتطبيقات الهواتف الذكية التي نستعملها للتسوق أو طلب سيارة أجرةٍ أو طلب الطعام والدواء وغير ذلك فكلها تطبيقات حاسوبية. أجهزة إدارة المصانع والعمليات التصنيعية التي تُستعمل لتخطيط تصنيع المنتجات الغذائية وغير الغذائية، فهي مبنيّة بالأساس على برامج وخوارزميات ورياضيات حاسوبية، فلولاها لما تطورت أنظمة التصنيع التي لدينا إلى مرحلة تكفي احتياجات الجنس البشري. الأجهزة الطبية التي تُنقَذ بها حياة الناس في المستشفيات، وأجهزة الاستشعار والإدارة العسكرية، والأجهزة التي تساعد على إدارة الأسواق الاقتصاد والمال وغيرها، فكلها موجودة بفضل علوم الحاسوب. ولعلك تشاهد بعضًا من فوائد هذه العلوم بنفسك، فلا تحتاج من يخبرك عنها. دورة علوم الحاسوب دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب اشترك الآن هل تعلم علوم الحاسب مفيد؟ قد تفكر في نفسك الآن وتقول هل من المجدي لي أن أتخصص في مجال علم الحاسوب وأتعلمها سواء للدراسة والبحث الأكاديمي أو للعمل والوظيفة مستقبلًا؟ والجواب هو نعم، فالأمر مُجدٍ وأنصح به بشدة، إذ يحصل متخصصو علوم الحاسوب على رواتب أعلى من العديد من نظرائهم المهندسين غير العاملين في المجال، كما تزداد الرواتب بازدياد الخبرة ونُدرة المجال الذي يتخصص فيه المرء؛ فمثلًا لا يتساوى مُطوّر واجهات الاستخدام بمهندس يجيد الذكاء الاصطناعي وتعلم الآلة، وكذلك لا يتساوى مع مهندسي البرمجيات ومهندسي العتاد. وبغض النظر عن عامل الوظيفة والراتب والمال، يساعدك تعلم علوم الحاسوب على بناء مشاريع حقيقيةٍ يمكنك أن تستفيد منها أو تغيّر بها العالم، مثلًا انظر كيف غير مارك زوكيبربيرغ طريقة تواصل المليارات من البشر وكامل التاريخ الإنساني بسبب تطويره لموقع إنترنتٍ، وانظر كذلك كيف تتحكم العملات الرقمية وتغير الاقتصاد العالمي في وقتنا الحالي. ويؤهلك تعلم علوم الحاسب لإنشاء خدمات ومواقع وبرمجيات وأنظمة حسبما تحتاج، ومن ثَم تستفيد منها سواءٌ لنفسك أو تبيعها للآخرين إما على شكل وظيفةٍ، أو خبرةٍ كما في مجال العمل الحُرّ. ولا يعني هذا بالطبع أنك ستكون مالك شركة مايكروسوفت المستقبلي، وكذلك لن تكون مارك الذي سيغيّر العالم، إلا أنك ستمتلك نفس الخبرات والأدوات التي امتلكوها عندما فعلوا ذلك، أما الباقي فيعتمد عليك وعلى اجتهادك ومثابرتك. مواد علوم الحاسب سنتحدث في هذا القِسم عن مواد تخصص علوم الحاسب وتفريعاتها المختلفة، وأبرز المواد التي تُدرّسها معظم الجامعات حول العالم لطلابها الراغبين بتَعلّم هذا التخصص، ومعظم هذه المواد مُستوحاةٌ من الفهرس الأكاديمي لجامعة ستانفورد لعلوم الحاسبات، هذا بالإضافة لعددٍ من الجامعات الأخرى. 1. أساسيات الهندسة وهندسة البرمجيات تعد من أول المواد التي يدرسها الطلاب وتهدف للإجابة على أسئلة متنوعة مثل ما هو تعريف الهندسة وما هي عمليات الإدخال والإخراج وكيف تصمم منتجًا أو برنامجًا أو مشروعًا وما هي الخطوات العملية لتصميم وهندسة نظام ما وغيرها. والهدف الرئيسي من هذه المادة هو نقل وتوصيل معنى الهندسة للطلاب، وذلك بإدراكهم أن عملية إنشاء الأنظمة هي خليطٌ مُتقنٌ من التخطيط والترتيب، فهي ليست عمليةً عشوائيةً بسيطةً، وعادةً لا تحتوي هذه المادة على مشاريع برمجية حقيقية، وقد تشتمل على مشاريع بسيطة في بعض الجامعات. ويَتعلّم الطالب في هذه المادة عددًا من التقنيات والأدوات الشائعة لتوصيف الأنظمة وتصميماتها، مثل لغة النمذجة الموحدة Unified Modeling Language واختصارًا UML وآلات الحالة State Machines وغيرها من التقنيات. 2. الرياضيات الأساسية مادة الرياضيات مادةٌ أساسيةٌ لدى جميع طلاب الهندسة عمومًا؛ لذلك من الضروري أن يُدرك الطالب أساسيات الرياضيات مثل العمليات الحسابية والتفاضل والتكامل والجبر وحسابات الأشكال الهندسية وغير ذلك من العمليات الرياضية البسيطة. ولا تُعلّم هذه المادة في الجامعات بهدف الرياضيات ذاتها؛ فبمجرد انتهائك من المادة ستنسى غالبًا تلك المعادلات الرياضية، ولكن الهدف هو تعويد الطالب على استخدام العقل لحساب ما لم يقدِر على حسابه من قبل، فمواجهة القليل من الصعوبة في التَعلّم تُفتّح الذهن وتُعوّده على تحمّل الأكثر صعوبةً من هذه الرياضيات البسيطة مستقبلًا. 3. الرياضيات الخطية ستتعلم في الرياضيات الخطية أو الجبر الخطي أساس حلّ المعادلات الرياضية، مثل معادلات الدرجة الأولى والثانية والثالثة، وبعض الأساليب والقوانين الرياضية لحلها بسهولة. كما ستتعلم بعض الأمور عن المصفوفات وطريقة التعامل معها وإجراء بعض الحسابات لها وطريقة الاستفادة منها مثل المصفوفات أولية وثنائية وثلاثية الأبعاد. 4. التفاضل والتكامل هنا ستتعمق في التفاضل والتكامل بعد اطلاعك عليها بصورة مبسطة بالفعل في إحدى المواد الرياضية السابقة، وستتعرف عليهما بالتفصيل، وكيف تستخدمها لحل بعض المشكلات الحقيقية في العالم، كما ستعرف بعض قواعد التفاضل والتكامل. وقد تكون هذه المادة متقدمة على بعض الطلاب مثل أغلب مواد الرياضيات، وذلك لأن الطالب يتعلم فيها المعادلات والقواعد والقوانين دون أن يُعلّم من أين جاءت ولا كيف ولماذا سيتعلمها ولا أين سيستخدمها في حياته المستقبلية. 5. تصميم المنطق الرقمي ستتعلم في مادة تصميم المنطق الرقمي Digital Logic Design أهم أركان التفكير المنطقي، وكيفية تمثيل الحجج والنقاشات والمعضلات في العالم الحقيقي على شكل معادلات رياضية ومنطقية وكذلك قد تتعلّم بعض الأمور عن المجموعات Sets في الرياضيات وطريقة استخدامها لتمثيل معلومة أو بيانات معينة. كما ستتعلم تصميم البوابات المنطقية Logic Gates مثل and و or و nor و xor و not وغيرها، وكذلك ستفهم الطريقة العامة لعمل المعالجات داخل الحواسيب والأجهزة الإلكترونية. وهذه المادة واحدةٌ من بين أكثر المواد إفادةً ضمن علم الحاسوب لأن طريقة التفكير المنطقية هذه ستنقلك من إنسان عشوائي التفكير قد لا يفكر بمنطقية في معظم أمور حياته إلى إنسان يفهم الحياة بصورة منطقية كما تفهمها الآلات ويَسهُل عليه تحديد ما هو منطقي وما هو غير منطقيٍ من الحجج والمعلومات التي حوله، كما ستفهم كيفية تحويل الأفكار إلى أنظمة فيزيائية وبرمجية داخل الحواسيب بحيث تُستعمَل لإكمال تصميم الحواسيب وتُجري العمليات الحسابية المطلوبة. أي الغرض من هذه المادة أن ترى كيف يعمل الحاسوب وكيف يفهم الأوامر وينفذها حتى تعرف كيف ستتعامل معه وتبرمجه وتتخاطب معه بسهولة. وفقًا لما سبق، من الأفضل التركيز عليها كونها واحدةٌ من أهم المواد في المجال، وقد تُدرّس هذه المادة على عدة مواد منفصلة، لذلك قد تجد موادًا شبيهةً مثل التفكير المنطقي Critical Thinking والرياضيات المتقطعة Discrete Mathematics، فكلّ على حسب الجامعة والتخصص. 6. الاحتمالات مادة الرياضيات الأخيرة التي ستتعلّمها هي مادة الاحتمالات Probabilties أو نظرية الاحتمالات Probability Theory، وهي مادةٌ تهدف إلى تعليمك أهم مبادئ هذا العلم بالإضافة لأنواع الاحتمالات المُمكنة حسب الأحداث Events وطريقة ارتباطها ببعضها البعض ليُستفاد منها في الحياة الواقعية إما في اتخاذ قرارات المؤسسات أو إجراءات أصغر من ذلك سواءٌ على مستوى الأفراد أو الأجهزة الرقمية. والاحتمالات علم عميق تقوم عليه الكثير من الرياضيات الحديثة، كما يقوم عليه علم التعمية Cryptography المُستخدم في تأمين وتشفير الاتصالات والشبكات، وستستفيد من هذه المادة كثيرًا في المستقبل متى أتقنتها. 7. البرمجة من البداهة أن توجد مادة مختصة بتعلم البرمجة في تخصص علوم الحاسب أو التخصصات المرتبطة به، وذلك لأن البرمجة هي لبّ علوم الحاسب في النهاية، فجميع الأجهزة والأنظمة التي حولنا ما هي إلا برمجيات وخوارزميات مختلفة صنعت لتعمل بطريقة معيّنة. كانت لغة جافا Java أبرز لغة برمجةٍ تُعلّم في الجامعات قبل عقد من الزمن، بينما تميل الكفة الآن إلى بايثون Python أو جافاسكربت في بعض الأحيان، ولكن بايثون هي الأكثر استعمالًا واعتمادًا في الجامعات لما لها من تطبيقات لاحقة في جميع المجالات الأكاديمية الأخرى. وفي كل الأحوال ستتعلّم في هذه المادة المتغيرات والخوارزميات وحلقات التكرار والجمل الشرطية والبرمجة كائنية التوجه وغيرها من المبادئ البرمجية، وذلك بِغَض النظر عن لغة البرمجة التي ستتعلّمها. كما قد تُعلّم القليل من استخدام بيئة ماتلاب Matlab وهي بيئة برمجية ولغة برمجة تُستخدَم لإنشاء الحسابات الرياضية وبرمجة برمجيات معينة، لذلك فهي منصة ولغة برمجة في آنٍ واحدٍ، ويستعمل ماتلاب طلاب أقسام الهندسة الأخرى لمحاكاة وحساب المعادلات والنماذج الرياضية. 8. الخوارزميات وهياكل البيانات الخوارزميات Algorithms وهي الإجراءات المنطقية المتسلسلة لحلّ مشكلة ما، وسنتعلّم الخوارزميات وأفضل الطرق لتصميمها من أجل حل مختلف المشكلات التي قد تظهر لنا في المستقبل، حيث سنحتاج إلى معرفة متى نستعمل خوارزمية بعينها من أجل حل مشكلة ما، ومتى سنلجأ لخوارزمية أخرى نعرف أنها ستعطينا أداءً أفضل، بمعنى أننا سنغوص في الموازنة بين مختلف الخوارزميات وأدائها مثل السرعة والوقت ومساحة التخزين، ومتى يجب استعمال كلّ واحدةٍ منها كما سنطّلع على مختلف تشعيبات الخوارزميات المتوفرة. هياكل البيانات Data Structures وهي طريقة تخزين البيانات واستعمالها بغرض تحقيق أهدافٍ مختلفةٍ حسبما يريد المُطوّر؛ فهناك هياكل بياناتٍ أسهل وأوضح للفهم العام، وهناك هياكل بيانات أسرع في الأداء، وهناك هياكل بيانات غير سريعة في الأداء لكنها تستهلك حجمًا أقل في تخزين البيانات وبالتالي قد تفضل على غيرها في بعض الأحيان. وستتعلم كل هذه الأمور في هذه المادة، وربما تقسم هذه المادة إلى مادتين على حسب الجامعة والاختصاص الذي تدرسه، كما ستطلع على أنماط التصميم Design Patterns إذا كنت ستدرس هندسة البرمجيات؛ وهي الأنماط الشهيرة لتصميم البرمجيات بحيث لا تحتاج لإعادة اختراع العجلة مرة أخرى من أجل كل مشكلة تواجهها. 9. مبادئ أنظمة التشغيل أنظمة التشغيل هي البرمجيات الأساسية التي تُدير الأجهزة الحاسوبية والهواتف والأنظمة المدمجة وغيرها، حيث توزع الموارد على البرمجيات وتدير تشغيلها وعملها ومراقبتها للمستخدم، وأبرز أنظمة التشغيل على سطح المكتب هي ويندوز Windows وماك Mac ولينكس Linux، أم فيما يتعلق بأنظمة تشغيل الهواتف الذكية، فلدينا نظام أندرويد Android الذي يعمل على مختلف الأجهزة ونظام iOS الذي يعمل على أجهزة آبل Apple فقط. وستتعلم في هذه المادة أساسيات عمل أنظمة التشغيل المختلفة، بالإضافة لأبرز المبادئ التي تعمل بها أنظمة التشغيل الحالية مثل العمليات وأجهزة الإدخال والإخراج Input/Output وإدارة الذاكرة والوصول للمعالِج ونظام الوصول والصلاحيات وإدارة المستخدمين وغير ذلك. وستضع عليك معظم الجامعات واجبات منزلية بلغة سي C في هذه المادة، لذلك سيكون عليك تَعلّمها إن أردت اجتياز هذه المادة بنجاح. 10. مبادئ الشبكات الشبكات هي كذلك من أبرز سمات العصر الحديث فشبكات الاتصال الخلوية وشبكة الإنترنت والشبكات المنزلية كلها غيّرت شكل العالم الحديث وساهمت في فوائد جمة لا تعد ولا تحصى فبدون علم الشبكات، لن تتمكن من قراءة هذا المقال الآن. وستتعلم في هذه المادة أساسيات الشبكات وطريقة عملها، وستطّلع على بروتوكولات التواصل أشهرها بروتوكول TCP وبروتوكول UDP، كما ستطّلع على بعض المفاهيم والأجهزة الأخرى مثل الموجه Router والخوادم Servers وأجهزة العملاء Clients والنظير للنظير Peer to Peer وغير ذلك من مبادئ الشبكات البسيطة. وسيطلب منك غالبًا برمجة برنامج محادثة بسيط بأي لغة برمجةٍ تريدها وذلك باستخدام أحد بروتوكولات التواصل، وهو ما سيوضح مدى فهمك وتعلمك لهذا المساق. 11. معمارية الحاسوب إلى هنا سيكون طالب علم الحاسوب قد فهم بالفعل معظم الأساسيات التي سيحتاج إليها، ولكن مادة معمارية الحاسوب أو بنية الحاسوب Computer Architecture ستتعمق في تفاصيل دقيقة حول مكونات الحاسوب الفيزيائية وكيفية تواصلها مع بعضها بعضًا مثل طريقة تواصل الذاكرة العشوائية مع المعالِج وقرص التخزين وطريقة إرسال أو جلب المعلومات منهما. كما سيطّلع على مفهوم المسجلات Registers، وهي وحدات الذاكرة الصغيرة للمعالجات الحديثة، وكيف يستعملها لتسريع عمليات المعالجة بدلًا من جلب البيانات من الذاكرة، وسيفهم كيف ستتحول الخوارزميات والبرمجيات التي يكتبها إلى عمليات مجزأة يمكن للمعالجات حسابها في أقل من لحظة من الزمن بفضل البوابات المنطقية التي تعرّف عليها مسبقًا. أي أن هذه المادة ستغوص في تفاصيل عمل أجهزة الحواسيب وبنيتها الداخلية وطريقة تواصل مكوناتها مع بعضها بعضًا. زيادةً على المواد الأساسية التي ذكرناها آنفًا، هناك مواد ومجالات وتخصصات اختيارية يختار الطالب غالبًا ما يحلو له منها ليمارس المجال الذي يحبه، ولا يتخرج مهندسو الحاسوب وهم يتقنون كل هذه التخصصات، فعادةً ما يختارون واحدًا أو اثنين منها على الأكثر، ثم يدرسونه بصورةٍ أعمق من السابق، لذا سننتقل تاليًا إلى شرح تخصصات الحاسب التي يمكن لمهندس الحاسوب أو دارس تخصص علم الحاسوب أن يعمل ويتخصص فيها. تخصصات علوم الحاسب لا يكون هناك تخصصات واضحة في الجامعة أحيانًا، بل يمكن للطالب ببساطة أن يختار مجال أحد المواد التي درسها وأحبها ويتخصص فيها إلى حين إتمام السنوات الدراسية. سنعرض أهم تخصصات الحاسب والمجالات التي يمكن العمل فيها بعد التخرج: 1. البرمجة وهندسة البرمجيات هندسة البرمجيات وهي العلم المَعني بصناعة البرمجيات بطريقة احترافية، فهي لا تختص بالبرمجة فقط وإنما تشمل فروعًا وعمليات أكثر من ذلك بكثير. صحيحٌ أن تطوير تطبيقات سطح المكتب وتطوير تطبيقات الهواتف المحمولة هي المجالات البرمجية الأكثر شيوعًا، لكن هناك مجالات برمجية أخرى أكثر تعقيدًا مثل: برمجة أنظمة إدارة الخوادم Servers مثل Kubernetes ودوكر Docker وأشباهها من أدوات إدارة العمليات DevOps. برمجة أدوات الأنظمة المالية والاقتصادية التي تدير اقتصادات الدول والبنوك حول العالم. برمجة أنظمة الشركات العملاقة مثل شركات الطيران وشركات النفط وشركات الكهرباء …إلخ، فهذه أنظمةٌ حساسةٌ لا تحتمل الفشل وإن احتملته فهي بحاجة للاسترجاع والإدارة الفورية. الكثير من الشركات العملاقة كانت تعمل قبل عِدّة عقودٍ من الزمن على أنظمة مبرمجة بلغات برمجية قديمة عفا عليها الزمن الآن ولم يعد يُبرمَج بها، ولكن ما زالت هذه الشركات تعمل بتلك الأنظمة لعِدّة أسبابٍ لوجستيةٍ وهنا يعد نقل البرمجيات من لغة برمجة معينة إلى لغة برمجة أخرى هو مجال تخصصي كبير في علوم الحاسبات وقسم هندسة البرمجيات، فمثلًا تدفع شركة IBM رواتب عملاقة لمن يجيد نقل برمجياتٍ مكتوبةٍ بلغة COBOL إلى لغة C. ويقوم مهندسو البرمجيات بالتخطيط لعملية بناء البرمجيات اللازمة لهذه المجالات، كما يخططون للموارد التي ستلزمهم والمميزات التي سيسلمونها بالإضافة إلى نمط التصميم الذي سيستعملونه في مختلف مراحل تطوير البرنامج، ولذلك هي عملية معقدة واحترافية تحتاج إلى فريق متكامل من المبرمجين وليست مُجرّد برمجة بسيطة ينجزها فرد واحد. 2. هندسة الشبكات الشبكات ليست برامج التواصل بين المستخدمين فقط، فهناك شبكات أعقد من ذلك بكثير. ويمكنك التخصص في مجال الشبكات لتفهم طريقة عمل الشبكات البسيطة وحتى العملاقة مثل شبكة الإنترنت، والبنية التحتية لها وطريقة ربط الدول لتلك البنية التحتية، كما يمكنك التعرف على بعض أنماط الشبكات البديلة مثل النظير للنظير Peer to Peer وكيفية عمل تطبيقات مفيدة بها في الحياة الواقعية. وكذلك قد تتطرق إلى الشبكات المركبية Vehicular Networks وهي الشبكات المرتبطة بالسيارات والمركبات، أو شبكات الاتصال الخلوي وطريقة صنعها وعملها، وطريقة التعامل مع مختلف أجهزة المودم Modems. وبشكلٍ أبسط من ذلك، فيمكن أن تعمل مدير شبكات في المؤسسات والشركات الصغيرة والكبيرة وحتى مراكز إدارة الخوادم Data Centers، فلا تخلو الآن مؤسسة أو شركة من شبكة داخلية تربط أقسامها مع بعضها وهي آنذاك بحاجة إلى مدير شبكة بالتأكيد هذا أقل القليل. 3. الذكاء الاصطناعي وتعلم الآلة زاد الاهتمام بالذكاء الاصطناعي زيادة كبيرة في العقد الأخير، وهذا أمرٌ طبيعيٌ بسبب زيادة الحاجة إليه، بالإضافة إلى تَوفُّر الموارد الحاسوبية الكافية لتشغيل خوارزمياته المختلفة على أجهزة المستخدمين الشخصية، فدخل الذكاء الاصطناعي في كل شيء حولنا من إدارة إشارات المرور وتنظيم السير وتصنيف الصور في هواتفنا والتعرف على الأشخاص والوجوه والترجمة الآلية وإدارة المركبات والآلات وكشف الجرائم وعمليات التتبع وتحليل البيانات والكثير الكثير غيرها حتى بات تقريبًا عصب التقدم والتطور الذي نشهده حاليًا، وهو الأمر الذي يفسر سبب الطلب الكبير على المتخصصين في هذا المجال كما أشرنا. وهناك فرق بين الذكاء الاصطناعي Artificial Intelligence وتعلم الآلة Machine Learning؛ فالأول هو اسم المجال العام المَعني بكل ما يتعلق بإنشاء ذكاء يشابه ذكاء الإنسان باستعمال الآلات بينما الثاني مجال فرعي يتعلق بتدريب الآلات على مجموعة بيانات معينة بهدف الخروج منها بتصنيفات يمكن أن تساعد الآلة على اتخاذ قرار مطلوب منها. وستتعلم في هذا التخصص فروع تعلم الآلة الثلاثة الأشهر وهم، التعلم الموجه Supervised Learning والتعلم غير الموجه Unsupervised Learning بالإضافة إلى التعلم المعزز Reinforcement Learning، وللمزيد من المعلومات عن المجال، يمكنك الاطّلاع على كتاب مدخل إلى الذكاء الاصطناعي وتعلم الآلة. 4. الحوسبة البيولوجية الطبية لا تأتي الأجهزة الطبية الموجودة بالمستشفيات من العدم، بل يصنعها المهندسون ويساهم فيها المبرمجون، وهناك مجموعة من المواد الجامعية في تخصصات الحاسب التي تعلم الحوسبة البيولوجية الطبية الحيوية Biomedical Computing، وقد تكون تخصصًا كاملًا منفصلًا في بعض الجامعات باسم هندسة طبية حيوية biomedical engineering أو هندسة الأجهزة الطبية أو الهندسة الطبية. ويمكن أن تتخصص في هذا المجال لتتعلم أهم المتطلبات البرمجية في المجال الطبي أو البيولوجي، وكيفية تطوير برمجيات أو قطع عتاد تحل مشاكل أو تقدم استخدامات حقيقية تفيد مجال الطب والعلاج أي تقريبًا هو تخصص في مجال تصنيع الأجهزة المتعلقة في المجال الطبي من تصميم وبرمجة واختبار وتنفيذ …إلخ. ولا تستفيد المستشفيات فقط من هذا التخصص بل تستفيد كذلك مختبرات التحليل والمختبرات الحيوية والمستوصفات والعيادات الطبية وغيرها، فتحتاج جميعها إلى برمجيات صادرة عن المتخصصين في هذا المجال. 5. الرسوميات لا تُعَد الرسوميات Graphics مجالًا واحدًا فقط، فهو مجال تطوير عريض جدًا، حيث تنضوي تحته مجموعة من المجالات المتفرعة، نذكر من بينها: أنظمة التشغيل، فلها مكتبات برمجية معينة تساعدها على عَرْض الخطوط والصور والواجهات الرسومية وغير ذلك للمستخدمين، وهذا مجال ضخم، فهو ضروري لتمكين المبرمجين الآخرين من تطوير التطبيقات والألعاب لأنظمة التشغيل هذه، أي أن الرسوميات هنا هي جزء من نظام التشغيل. محركات الرسوميات Graphics Engines، وهي أنظمة برمجية عملاقة تهدف لتمكين المبرمجين من برمجة مختلف الرسوميات التي يريدونها لمختلف أنظمة التشغيل، فمثلًا يستخدم محرك Unity 3D أو Source2 أو غيرهما لبرمجة الألعاب التي تعمل على مختلف أنظمة التشغيل مثل ويندوز وماك ولينكس وأندرويد. البرامج المتخصصة في الرسم ثنائي وثلاثي الأبعاد، فتعد برمجة هذه البرمجيات مجال منفصل ويتطلب بعض الخبرات والمهارات، بينما تعلم استخدامها سيحولك إلى مصمم، وتدخل فيها برامج النمذجة modeling مثل برامج الرسم والتصميم الهندسي CAD المفيدة في الكثير من التخصصات الهندسية. برامج تحرير ومونتاج الفيديوهات مجال فرعي آخر مشهور. وتدخل الكثير من التخصصات تحت تخصص الرسوميات كما ترى، إلا أنها قد تختلف جذريًا فيما بينها، فتطوير برامج الرسم ثنائية الأبعاد لا يشبه تطوير المحركات الرسومية فعملية تطوير المحركات الرسومية واحدة من أصعب العمليات البرمجية وأكثرها تعقيدًا، لأنها تحاكي فيزياء الكون وتتطلّب فهمًا عميقًا للرياضيات. 6. تحليل البيانات وإدارة قواعد البيانات مجال تحليل البيانات (أو يرقى حتى إلى قسم منفصل باسم هندسة تحليل البيانات data analysis engineering) واحد من أكثر المجالات طلبًا حاليًا، لما له من استخدامات مفيدة وجلية في تحليل البيانات والمعطيات واستعمالها في اتخاذ القرارات المُهمَّة لدى المؤسسات والشركات، حتى إن بعض الفرق الرياضية لكرة القدم مثل ليفربول تعتمد على تحليل البيانات لوضع خططها الرياضية في كل مباراة، فتطبيقات هذا المجال واسعةٌ جدًا. كما ستتعلم في هذا المجال طريقة معالجة مجموعات ضخمة من البيانات، وطريقة تنظيفها من الأخطاء والمشاكل، وتحويلها إلى بياناتٍ يمكن معالجتها من الأنظمة الحاسوبية، وستتعلم طريقة استخراج أهم المعلومات والأسرار المخفية في البيانات الخام التي لديك بمختلف المكتبات واللغات البرمجية. حتى تتقن فن التعامل مع البيانات، فيجب أن تتقن التعامل مع أنظمة قواعد البيانات التي تخزَّن فيها البيانات، لذا يتخصص هذا المجال في مفهوم قواعد البيانات Databases وأنظمة إدارة قواعد البيانات database management systems تختصر إلى DBMS بتعمق كبير فهي مدخل إلى التعامل مع البيانات والتلاعب بها وتطويها والغوص فيها لاستخراج المعلومات. قد يتفرد هذا المجال في تخصص بمفرده في الدراسات العليا أو حتى في سوق العمل، فقد تطلب بعض الشركات متخصص لإدارة قواعد بياناتها وله المسمى الوظيفي "مدير قواعد بيانات" Database Administrator. وتشمل مشاريع تحليل البيانات عادة: جمْع البيانات من مصادرها. تنظيف وتهيئة البيانات للمعالجة وإزالة القيم الشاذة. إدخال البيانات في الأنظمة الحاسوبية المطلوبة لاستخراج النتائج والمعلومات الأولية منها، ومن أين يُبدَأ في البحث عن روابط مفيدة بين أجزائها. تحليل أعمق للبيانات إما عبر أنظمة أكثر تقدمًا أو عبر تَعلّم الآلة، وقد تُستعمل أنظمة التعرف على الأنماط Pattern Recognition كذلك. تهيئة النتائج السابقة للعرض والمشاركة عبر بعض الأدوات الشهيرة. عرض النتائج والتقارير مع المخططات والتوصيات. وتعد بايثون أكثر لغات البرمجة طلبًا في هذا المجال، بالإضافة لمكتباتها الشهيرة مثل Pandas وNumpy وJupyter Notebook وMatplotlib وغيرها، وكذلك تستعمل لغة R في هذا المجال، ولكنها ليست بنفس شيوع بايثون، أما بالنسبة لقواعد البيانات، فيجب أن تقن لغة SQL وتتقن بعدها أنظمة التعامل مع قواعد البيانات. ولتَتعلّم أساسيات بايثون بسهولة، بإمكانك الاطّلاع على كتاب البرمجة بلغة بايثون كما يمكنك الاطلاع على كتاب ملاحظات للعاملين بلغة SQL وكتاب الدليل العملي إلى قواعد بيانات PostgreSQL. 7. أنظمة التشغيل والأنظمة المدمجة تحتاج جميع الحواسيب والهواتف الذكية والأجهزة الإلكترونية عمومًا إلى نظام تشغيل Operating System لتعمل وفق رغبات المستخدم، وهذه الأنظمة هي الأخرى لا تأتي من العدم بل هناك متخصصون لبرمجتها وجعلها أفضل من غيرها والحفاظ عليها مع الزمن. تطوير أنظمة تشغيل سطح المكتب مثل ويندوز وماك ولينكس، أو أنظمة الهواتف الذكية مثل نظام أندرويد ونظام iOS وغيرهما، هي مجالات برمجية متقدمة تعتمد على خبرات ومهارات متعددة، كما يعتمد هذا على العتاد Hardware الذي ترغب ببناء نظام تشغيل له، وقد تُستخدَم أكثر من لغة برمجية في الوقت نفسه لتطوير نظام تشغيل بسيط، فتطوير أنظمة التشغيل عملية عملاقة ومكلفة وتحتاج الكثير من المهندسين، كما ينفق عليها ملايين الدولارات من الاستثمار المستمر على امتداد عدة سنوات للخروج بنتائج مرضية، ولهذا ربما تجد أن هناك ملايين البرمجيات الصغيرة حول العالم، بينما يوجد ثلاث أنظمة شهيرة لسطح المكتب ونظامان للهواتف الذكية فقط، ورغم أنه هناك بالفعل العشرات غيرها إلا أنها محدودة وضعيفة المزايا موازنة بتلك الأكثر استخدامًا والأكبر دعمًا حاليًا؛ وذلك لأن مطوريها لا يمتلكون نفس موارد وإمكانات مطوري الأنظمة الشائعة ذات الدعم الكبير. أما الأنظمة المدمجة Embedded Systems فهي الأنظمة التي تعمل مع موارد عتاد Hardware Resources محدودة للغاية، فهي تُنفّذ مهامًا محدودةً وصغيرةً مثل أنظمة الإشارات والاستشعار والأقفال الإلكترونية وألعاب الأطفال وحتى أنظمة إدارة السدود المائية وأنظمة الأجهزة العسكرية …إلخ، كما أن برمجتها مجالٌ منفصلٌ لوحده، ويوجد به الكثير من التفرعات كذلك وهو علم ضخم ذاع صيته هذه الأيام وأهم مجال تفرع عنه هو مجال إنترنت الأشياء Internet of Things تختصر إلى IoT وهي برمجة العتاد مع ربطه بالإنترنت مثل أنظمة مراقبة المباني وأقفالها وأنظمة البيوت الذكية وغيرها. أصبحت هنالك برامج واختصاصات دراسات عليا وحتى درجات جامعية تُدرِّس هذا المجال. 8. الأمان الرقمي الأمان الرقمي مجال كبير تنضوي تحته عدة أمور، مثل أنظمة التشغيل والبرمجيات العادية والشبكات والتعمية وغيرها، فكلها أمور مترابطة تحتاج لتأمين واستخدام أفضل للتقنيات وذلك للتأكد من عدم وصول الأشخاص غير المخوّلين لها. وبينما هناك مجالاتٌ متعلقةٌ بالأمان الرقمي الشخصي للمستخدمين، هناك مجالاتٌ متعلقةٌ بالأمان الرقمي الجنائي أو العسكري بين المجرمين وأجهزة الشرطة وبين الدول وبعضها البعض، كما أن هناك مجالاتٌ متعلقةٌ بالشبكات وإدارة الخوادم وغير ذلك الكثير، وكلها أمورٌ يمكن أن تتخصص بها إذا رغبت بذلك. ولمعلومات مفيدة حول الأمان الرقمي الشخصي والخصوصية، اطلع على كتاب دليل الأمان الرقمي. 9. الحوسبة العلمية تعتمد العديد من الصناعات التي تراها حولك اعتمادًا أساسيًا على علم الحاسوب لإتمام مهامها بنجاحٍ، فأغلب ما تراه حولك قد عولج في الحاسوب بدءًا من البناء الذي تقطنه والذي قد صمم واختُبر باستعمال برامج حاسوبية صممت البناء ونمذجته واختبرته على الزلازل ومختلف العوامل للتأكد منه ومن تصميمه وحتى قطع وقطع البلاستيك وأجزاءها قد صممت أيضًا باستعمال برامج حاسوبية عملاقة وهكذا، وكل هذه البرامج تعمل بخوارزميات ضخمة تحتاج للكثير من العمليات الرياضية التي تحل معادلات مختلفة، وهي بدورها تعتمد على خوارزميات محددة لتبسيطها وحسابها وهذا ما يدخل ضمن مجال الحوسبة العلمية Scientific computing. كما توجد مجالات كثيرة أخرى مثل هذه لا مجال لحصرها الآن ولكن نذكر منها مجال الحوسبة التطورية Evolutionary Computation وهي العلم الذي يأخذ نظرية التطور والحالات المعقدة المتطورة ويحولها إلى نظام قابل لحل الكثير من المشاكل في الحياة الواقعية، فيمكن استخدام هيكلة ومبادئ نظرية التطور لتطوير خوارزمية تساعدنا على معرفة عدد المطارات والمدارج التي علينا وضعها في كل مدينة. 10. الحوسبة السحابية توفر الآن الكثير من الشركات خدمات سحابية Cloud Services للمستخدمين وفكرة الحوسبة السحابية Cloud computing ببساطة إلغاء العمل على نظام تشغيل سطح المكتب لتخزين وتشغيل وإدارة الخدمات والبرامج التي تريدها والاعتماد كليًا على خدمات بعيدة موجودة على حواسيب وخوادم مركزية عملاقة تستفيد من الإنترنت للوصول إليها لفعل نفس الأمور السابقة. فمثلًا بدلًا من تشغيل خادم قاعدة البيانات الخاص بك يمكنك الاعتماد على أحد الحلول الجاهزة من أمازون Amazon أو ديجيتال أوشين Digital ocean، كما يمكنك استعمال فيجوال ستوديو من مايكروسوفت عبر الإنترنت لأداء مهامك البرمجية بدلًا من استخدام مُحرر النصوص البرمجي الخاص بك على نظامك. ويمكنك كذلك أن تستأجر خوادم فيزيائية Dedicated Servers ثم تُقسّمها إلى خوادم افتراضيةٍ Virtual Servers وتُوزّعها على مستخدمين آخرين حسب الموارد، ثم تُوّفر لهم خدمات جاهزة Software-as-a-Service واختصارًا SaaS، وهذا هو مبدأ شركات الاستضافة الحديثة والمجال السائد فكل ما تراه أصبح مخزنًا وموجودًا على سحابة وتصل إليه أو تستعمله عبر الإنترنت لذلك زاد الطلب على متخصصين في هذا المجال وتكون المسميات الوظيفية باسمه عادة مهندس حوسبة سحابية Cloud Computing Engineer. 11. تخصصات أخرى هناك مجالات ضمن علم الحاسوب تبتعد عن العلوم التطبيقية البرمجية، وتبحث في المبادئ النظرية لما تقدمه علوم الحاسب للتخصصات والمجالات الأخرى في الحياة. نظرية المعلومات Information Theory وتتحدث عن المبادئ النظرية لنقل المعلومات الرقمية ومحتواها، وإلى أي مدى يمكن ضغطها وبأي سرعاتٍ يمكن الوصول إليها. نظرية الإشارات Signal Theory وتتحدث عن الإشارات التي تُصدِرها الكائنات الحية وكيف يمكن تحديد العلاقات بينها وكيفية نمذجتها في الأنظمة الرقمية بهدف دراستها وتحليلها. نظرية الفوضى Chaos Theory ورغم أنها نظريةٌ رياضيةٌ لا تنضوي تحت علوم الحاسوب بصورةٍ مباشرةٍ، إلا أن لها تطبيقاتٌ واضحةٌ في عِدّة مجالاتٍ مثل حالة الطقس والمناخ والأنظمة المصممة لتوقّعها والتبليغ عنها، فهي تعتمد على علوم حاسوبية مثل التعمية والروبوتات وغيرها. علم التعمية Cryptography وهو واحدٌ من أكثر العلوم أهمية في علوم الحاسب لأن تطبيقاته هي التي تسمح بتشفير البيانات، ويعتمد على المبادئ الرياضية بشدةٍ، كما أنه شديد التعقيد، حيث تقوم عليه أنظمة الأمان الرقمية حول العالم بما في ذلك الأنظمة الاقتصادية. والكثير من هذه العلوم هي علوم نظرية تعتمد على مجالات متداخلة Interdisciplinary مع علوم الحاسبات، إلا أن علوم الحاسبات مركزية وأساسية فيها. كيف أختار التخصص المناسب لي من تخصصات علوم الحاسب؟ ليست كل التخصصات السابقة الذكر متوفرة في مجالات علوم الحاسب بالطبع، فهناك غيرها ولكن ذكرنا الأشيع والأشهر منها، ويبرز هنا سؤال وهو كيف يمكن لداخل جديد إلى هذه العلوم أن يختار التخصص المناسب له والذي يحبه؟ وتكمن الإجابة في معرفة المرء بنفسه وأين يحب أن يعمل فإذا كنت تحب الرياضيات فربما تناسبك العلوم النظرية، وإذا كنت تحب العمل مع الخوارزميات وتطوير الجديد منها لتسريع حل مشكلات الجنس البشري وابتكار حلول أفضل فربما قد يكون هذا اختصاصك، أو ربما ببساطة تحب تطوير البرمجيات والتطبيقات وحينها لن تحتاج شيئًا أكثر من المعارف الأساسية في علوم الحاسب ثم التخصص في تعلم البرمجة. لذا عليك أن تنظر في هذه المجالات المختلفة، ثم تسأل نفسك في أي منها يمكن أن تعمل دون أن تشعر بالملل بعد فترة؟ وستجد بضع مجالات قد تعجبك وستستبعد بعض المجالات الأخرى، فمثلًا أنا أستبعد أن أعمل في المجالات الرياضية أو مجالات التشفير، ببساطة لأنني لا أحب تعقيدها، وبعدها حاول أن تصرف بعض الساعات من وقتك في هذه المجالات التي تبقّت معك لتتعرّف عليها وترى أبرز المشاريع الموجودة فيها، وهل أحسست براحة وانشراح للنفس أثناء دراستها والعمل فيها، أم أنك تريد غيرها؟ الخلاصة، جرب التخصص والقراءة الدراسة في كل تخصص فترة من الزمن وبعدها إما أن تكمل أن تنتقل إلى تخصص آخر وهكذا تعرف الاختصاص الصحيح المناسب لك، وبعد فترة ستجد مجالات واضحة معينة لن تحب العمل في غيرها، وتلك هي المجالات التي يمكنك البدء بدراستها والتخصص بها بعد أن تنتهي من دراسة علوم الحاسوب الأساسية. التوظيف وفرص العمل في مجال علوم الحاسب تقل أهمية الشهادة الجامعية تدريجيًا في التوظيف عندما يتعلق الأمر بعلوم الحاسوب فشركات مثل جوجل بدأت تهتم بالخبرة وتعمل على نشر شهاداتها الخاصة والتي تبلغ مدتها 6 أشهر في حال عدم وجود الشهادة الجامعية، كما أن كثيرًا من الشركات الأخرى تشترط وجود الخبرة ومعرض الأعمال بدلًا من الشهادة الجامعية للمتقدِّم. وتبلغ مدة أغلب الشهادات الجامعية في معظم البلدان 4 سنوات، وهي مدةٌ طويلةُ جدًا يذهب معظمها بالانتظار والفراغ بين الحصص الدراسية الأسبوعية وتعلم علوم ومواد قد لا يكون لها أهمية كبيرة وقد تنساها بعد التخرج هذا لم نتحدث عن قلة المقاعد الدراسية الحكومية المجانية والمنافسة الشديدة عليها أو غلاء الجامعات الخاصة مما يزيد من العوامل التي تعيق أصلًا دخول الجامعة أو اختيار التخصص الذي ترغب دراسته في الجامعة فقد تضطر من أجل الدخول للجامعة والحصول على درجة جامعية أن تدرس تخصصًا لا تحبه ولا يناسبك أصلًا وهنا الحديث يطول، على أي حال، وبما أن علوم الحاسوب مجال مرتبط بالحواسيب التي بين أيدينا فقد لجأت نسبة لا بأس بها ممن يرغبون التخصص في المجال بتعلم المعلومات المطلوبة من مصادر خارجية لا علاقة لها بالجامعات الأكاديمية، دون الحاجة للدراسة الجامعية التقليدية ودخلوا سوق العمل فعليًا. ولا نريد محو أهمية الشهادات الجامعية، وذلك لأنها ما تزال تطلبها الحكومات والدول رسميًا للعمل في الوظائف الحكومية، كما لا تزال لها سمعة في الأوساط الاجتماعية على عكس من يتعلم تلك العلوم بمفرده، ولكن إذا كانت المعرفة والعمل ما يهمك فقط فحينها لا مشكلة من الخوض في المجال بعيدًا عن الدراسة الجامعية، وبذلك تكسب سنوات من عمرك بالإضافة إلى توفير الكثير من المال الذي كنت ستصرفه على الشهادة الجامعية. فمثلًا، يمكنك خلال فترة تترواح من ستة أشهر إلى سنة أن تتعلم أساسيات علوم الحاسوب وأن تبدأ العمل فيها مثلًا أن تتخصص في البرمجة وتطوير المواقع وتدخل سوق العمل وأغلب الدورات الحرة التي تعلم الاختصاص تكون مدتها ستة أشهر وحتى السنة وهي كافية لوضع قدمك على الطريق ودخول وكسب فرصة عمل. فمؤسسي أكبر الشركات التقنية في العصر الحديث، مثل مارك زوكيربيرغ مؤسس فيسبوك، وجاك دورسي مؤسس تويتر، وستيف جوبز مؤسس آبل لم يتخرجوا من الجامعات، وكذلك فهناك غيرهم الكثير من مدراء ورؤساء الشركات التقنية، ولهذا لن تكون الشهادة الجامعية عائقًا أمامك في حال أردت سلوك نفس المسار العصامي. وهنالك الكثير من المبرمجين الماهرين اليوم الذين لم يدخلوا إلى الجامعة أو درسوا اختصاصًا مختلفًا وهم يعملون في شركات كبيرة منها شركة IBM وهو لا يملك درجة في أي تخصص من تخصصات الحاسب وحتى أنه يساهم في كتابة بحث مع من درس في أروقة الجامعات. أضف إلى ذلك أنه يمكنك العمل كعامل مستقل على حسب الاختصاص الذي تجيده من اختصاصات علوم الحاسوب؛ فلو كنت مطور ويب محترف فيمكنك تطوير المواقع الإلكترونية للعملاء عبر مواقع العمل الحر مثل مستقل، ففي العمل الحر لن يسألك أحد بتاتًا عن شهادتك الجامعية وكل ما سيسألونك عنه هو خبراتك ونماذج لأعمالك السابقة نفذتها لا أكثر. أما عن فرص العمل المتوفرة في الشركات فهي تختلف باختلاف البلدان والشركات التي تريد العمل فيها، ولكنها تنضوي جميعًا تحت قسم التخصصات الذي تحدثنا فيه بصورة موسعة عن تخصصات علوم الحاسوب التي يمكن للمرء الاختصاص فيها، فمثلًا يمكنك العمل بتخصص مهندس برمجيات أو يتخصص في مجال الذكاء الاصطناعي أو مطور أنظمة تشغيل …إلخ على حسب المسميات الوظيفية المتوفرة في الشركات. انظر مثلًا إلى موقع بعيد، حيث تجد فيه طلبات توظيف من شركات مختلفة حول العالم العربي، وستجد أن معظم الوظائف لا تشترط أي نوع من أنواع الشهادات، بل تشترط معرض أعمال وخبرة سابقة فقط. وتكون رواتب المتخصصين في علوم الحاسوب متعلقة بعدة عوامل منها التخصص والخبرة والأعمال المنجزة وكذلك باختلاف الشركات والأماكن والدول، لكن يمكننا القول بصورة عامة أن رواتبهم أعلى من المهندسين الآخرين، ويمكنك البحث عن المواقع التي تَعرِض لك متوسط الرواتب التي يتلقاها الموظفون حسب المهنة في بلدك ثم البحث فيها عن التخصصات السابقة لرؤية مُعدّل الرواتب في بلدك. ما الفرق بين علوم الحاسب وهندسة الحاسب؟ على عكس الشائع فلا يوجد فرق جوهري بين علوم الحاسب computer science وهندسة الحاسب computer engineering وذلك لأن الجامعات الموجودة في دول مختلفة حول العالم تتعامل مع المصطلحين بطريقة مختلفة، فتجد في بعض الجامعات وفي بعض البلدان أن التخصصين مجرد اسمين مختلفين لنفس المواد الجامعية، فمثلًا الجامعة التي تخرجت منها كان تخصصي فيها هو هندسة وعلوم الحاسوب، أي أنني درست الاثنين معًا، ولم يكن هناك فرق في المواد التي درسناها مع الجامعات الأخرى. أما في بعض البلدان الأخرى مثل الولايات المتحدة هناك فرق حيث تكون علوم الحاسب علومًا أقرب للأقسام النظرية والفهم العام لمختلف المجالات والتخصصات، بينما تركز هندسة الحاسوب بالتحديد على علوم البرمجيات Software وعلوم العتاد Hardware والعلاقات والمشاريع التي يمكن تنفيذها بالدمج بينهما، أي أن هندسة الحاسوب تخصص هندسي تقليدي أقرب للعلوم العملية من تخصص علوم الحاسوب الأقرب للعلوم النظرية المفاهيمية. ويُعَد مصطلح علوم الحاسوب مصطلحًا جديدًا نسبيًا إذ كان التركيز قديمًا على هندسة البرمجيات Software Engineering وهندسة الحاسوب Computer Engineering وشاع المصطلح بعد 2010م وصار يشمل كل هذه العلوم وأكثر. من أين أبدأ بتعلم علوم الحاسوب؟ إن كنت تفكر بالدراسة الجامعية الأكاديمية، فهي من سيرشدك للبدء ويوفر لك المواد المتسلسلة في سنوات الدراسة ويؤمن لك كل شيء خلال رحلتك في دراسة علوم الحاسب وتخصصاته أما إن كنت ممن يريد دراسة مجال علوم الحاسوب ذاتيًا والتخصص فيه دون اللجوء إلى الجامعة، فأنت في المكان الصحيح الذي سيرشدك إلى بداية الطريق. من الأفضل لك أن تبحث عن بعض الدورات المتكاملة للبدء في تعلم علوم الحاسب بدلًا من الدروس المتفرقة، فمن الصعب على طالب جديد لا يعرف شيئًا في المجال أن يدخل فيه مباشرةً ويتعلم ما يحتاج إليه من دروس في كل مادة وتخصص من تلك المواد والتخصصات، بينما الدورات المتكاملة تكون مجهزة وكاملة وفق خطة معينة من متخصصين. عملت أكاديمية حسوب على توفير دورة متكاملة عن أساسيات علوم الحاسب هي دورة علوم الحاسوب وهي دورة شاملة مدتها عشرات الساعات حول علوم الحاسوب بدءًا من أبسط الأساسيات وصولًا إلى الخوارزميات وهياكل البيانات والبرمجة وقواعد البيانات وتطوير الويب وإدارة الخوادم، كما أنها تحت التوسيع والتحديث المستمر، ومن أبرز ميزاتها أن هناك من يتابع سَيْرَك ويجيب على أسئلتك على امتداد الدورة وليست فقط مجرد فيديوهات. ستكون مؤهلًا بعد الدورة من التخصص والغوص في إحدى مجالات علوم الحاسب التي تحبها وتريد تعلمها وقد وفرت الأكاديمية بعد دورة علوم الحاسب دورات أخرى إن أحببت الاختصاص في مجال البرمجة وتطوير البرمجيات لإكمال طريقك وستكون جاهزًا لدخول سوق العمل وبدء الكسب مما تعلمت خلال فترة قصيرة لا تتجاوز السنة بناءً على همتك وعزيمتك. وإذا وصلت إلى مرحلة أنت جاهزٌ فيها لتَعلّم البرمجة، فيمكنك قراءة الدليل الشامل لتعلم البرمجة باستخدام المصادر العربية ففيه أبرز المصادر العربية المتوفرة في الشبكة لتعلم البرمجة. كما يمكنك البحث في الشبكة عن سلاسل فيديوهات أو كتب لتُعلّمك تخصص علوم الحاسب بأي لغةٍ تجيدها، وجوجل مليءٌ بالنتائج عن ذلك كما أن أكاديمية حسوب تعمل جاهدًا على توفير مراجع عالية الجودة لتساعدك في ذلك، فتابع دومًا قسم المقالات البرمجية وقسم الكتب البرمجية. خاتمة وصلنا إلى نهاية هذا المقال بعد أن اطلعنا على أبرز علوم الحاسب وماهية التخصصات الموجودة فيه، ولا تنسَ أن هذا المقال مجرد مقدمة وسيكون عليك صَرْف العديد من الساعات لتتعلّم هذا المجال وتغوص فيه بصورة أعمق. وصحيح أن تعلم علوم الحاسوب قد يكون صعبًا في البداية للوافدين الجدد عليه، ولكن النتيجة مثمرةٌ جدًا حيث يمكنك استخدام أحد أبرز العلوم في العصر الحديث وأهمها لأي غرض أو هدف تريده، سواء كان ذاك الهدف شخصيًا أو ماديًا بهدف الكسب والرزق. إن كان لديك أي سؤال أو استفسار، فلا تتردد بطرحه في التعليقات ونسعد بمشاركتنا تجربتك، أرجو لك التوفيق والسداد! اقرأ أيضًا دليلك الشامل لتعلم البرمجة دليل شامل عن تحليل تعقيد الخوارزمية المرجع الشامل إلى تعلم لغة بايثون ما هي فوائد تعلم البرمجة؟ مدخل إلى الذكاء الاصطناعي وتعلم الآلة
    2 نقاط
  32. يتناول هذا المقال، الأول من سلسلة دروس عن لغة الاستعلام البنائية Structured Query language التي تعرف بالاختصار المشهور SQL، مفهوم قواعد البيانات، وماذا نقصد بأنظمة إدارة قواعد البيانات، وما هو الجدول، وما هي خصائص قواعد البيانات العلاقية. ما هي قاعدة البيانات؟ بطريقة بسيطة مجرّدة من مفاهيم التقنية، قاعدة البيانات هي مكان لحفظ بيانات معينة على نحو مستمر بهدف الرجوع إليها وقت الحاجة، فدفتر أرقام الهواتف الذي كنا نستعمله في الماضي يُعدّ قاعدة بيانات؛ والكم الهائل من الفواتير المحاسبية الورقية المحفوظة في خزانات الأقسام المالية في الشركات قديماً، أيضاً هو قاعدة بيانات. وقِس على ذلك العديد من الأمثلة الواقعية والملموسة. نستنبطُ من هذا التعريف البسيط وجود خاصية هامة لقاعدة البيانات، ألا وهي “الاستمرارية” أو “الدوام” في حفظ البيانات. في الجانب التقني والبرمجي، فإن قاعدة البيانات Database هي عبارة عن مستودع تُحفظ البيانات فيه داخل جهاز الحاسوب أو الخادوم، ويتمتع هذا المستودع بخاصية الاستمرارية في حفظ البيانات. ونعني بخاصية الاستمرارية هنا أنه في حال إطفاء جهاز الحاسوب أو إعادة تشغيله أو انقطاع التواصل معه، فإن قاعدة البيانات وما تحتويه من بيانات تبقى موجودة ومحفوظة دون أي خلل. أنظمة إدارة قواعد البيانات العلاقية تُسمى البرمجيات التي تنشئ وتدير قواعد البيانات بأنظمة إدارة قواعد البيانات (Databases Management Systems) وتكتب بالاختصار DBMS. ما هي أنواع أنظمة إدارة قواعد البيانات؟ تختلف وتتعدد تسميات أنواع أنظمة إدارة البيانات، وهذا الاختلاف نابع بالدرجة الأولى من تقدم الزمن وما صاحبه من تقدم في العلوم والتقنيات، ومن ثم بالدرجة الثانية، ينبع الاختلاف من التقنيات والخصائص المتعددة لهذه الأنظمة وما تقدمه من خدمات. تنقسم أنواع أنظمة قواعد البيانات إلى ثلاثة أنواع رئيسية. نظام قاعدة البيانات الملف والواحد Flat File Database: يعدّ هذا النوع من الأنظمة قديما ومن النادر أن تجد أحدا يعمل عليه إلى الآن، وهو ببساطة قاعدة بيانات من ملف واحد كبير يحتوي على كل البيانات، وهو يشبه جدول واحد به كل البيانات. نظام إدارة قاعدة البيانات غير العلاقية Non-Relational DBMS :ظهر هذا النوع من أنظمة قواعد البيانات في ظل عصر تضخم البيانات وزيادة حجمها، وخاصة مع انتشار ما يسمى بالمواقع الاجتماعية وتطبيقات الجوال وصفحات الوب الحديثة، فهذا النوع من الأنظمة يسمح بحفظ بيانات غير مرتبة وفق بنية معينة Unstructured Data، وليس من الشرط أن تترابط هذه البيانات Not relational، كما يطلق عليها No-SQL Databases. نظام إدارة قاعدة البيانات العلاقية Relational DBMS: وهو النوع الأشهر والأكثر استخداما منذ بداية ظهوره والذي سنعتمده في هذه السلسلة لشرح SQL، حيث تُجمَّع في هذا النوع من الأنظمة البيانات التي لها علاقة ببعضها البعض في مكان واحد يسمى الجدول، مع وجود الإمكانية لربط الجداول مع بعضها البعض بعلاقات ترابط. دورة علوم الحاسوب دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب اشترك الآن ما هو الجدول؟ يُعدّ الجدول العنصر الأساسي في قواعد البيانات العلاقية، وعليه تعتمد أغلب مكونات قاعدة البيانات من مشاهد Views ودوال Functions وحِزم Packages وغيرها من العناصر الأخرى. يتكون الجدول من أعمدة Columns وصفوف Rows، حيث تمثل الأعمدة ما يسمى بالخصائص Features، والصفوف عبارة عن القيم التي تأخذها الأعمدة وتسمى بالسجلات Records. يوضح الشكل التالي مثالا لجدول يحتوي على بيانات تواريخ ميلاد وأسماء طلاب في مدرسة، وفي المثال نوضح مكونات الجدول في قاعدة البيانات. خصائص قواعد البيانات العلاقية ومميزاتها ظلت قواعد البيانات العلاقية مسيطرة منذ بدايات ظهور النموذج الأساسي لها عام 1970 على يد عالم الحاسوب Frank Codd أثناء عمله لصالح شركة IBM، ولم تكن هذه الأفضلية التي يتمتع بها نظام قواعد البيانات العلاقية تأتي من فراغ، بل من الخصائص التي تتمتع بها. البساطة تُرتَّب البيانات في أنظمة قواعد البيانات العلاقية وتُحفَظ بطريقة بعيدة عن التعقيد، حيث يعدّ الجدول الذي تُحفظ فيه البيانات مفهوما لأغلب المستخدمين وخاصة الذين مارسوا أعمالا في مجال البيانات المجدولة أو مراجعة السجلات. سهولة الاستعلام عن البيانات بعد عمليات الإضافة على قاعدة البيانات، وعند الحاجة للرجوع لها، فإن نظام قواعد البيانات العلائقية يوفر آلية سهلة للاستعلام عن هذه البيانات واستردادها، وذلك عن طريق لغة SQL، بالإضافة إلى وجود الإمكانية للمستخدم أن يستعلم عن البيانات من أكثر من جدول في نفس الوقت باستخدام جمل الربط Joins. كما أن خاصية ترشيح Filtering البيانات وتحديد شروط خاصة لظهور سجلات معينة هو أمر متاح بكل سهولة. سلامة البيانات تعدّ هذه الخاصية أساسية في أي نظام قواعد بيانات بغض النظر عن نوعه. ونعني بهذه الخاصية أن تتوفر جميع القدرات والإمكانات في نظام قواعد البيانات لضمان دقة وصحة المعلومات الموجودة فيه. ويندرج تحت هذه الخاصية ما يسمى بقيود التكامل Integrity constraints والتي هي عبارة عن مجموعة من القيود التي يجب الالتزام بها عند التعامل مع البيانات في الجدول، وسنتكلم عنها في مقال متقدم. المرونة تتمتع قواعد البيانات العلاقية بطبيعتها بالمرونة والقابلية للتطوير، مما يجعلها قابلة للتكيف مع طلبات التغيير والزيادة في كم البيانات. وهذا يعني مثلا أنك تستطيع التغيير على هيكلية جدول معين دون التأثير على البيانات الموجودة فيه أو على قاعدة البيانات ككل، كما أنك – مثلا - لن تحتاج إلى وقف قاعدة البيانات وإعادة تشغيلها مرة أخرى لتنفيذ بعض لتغييرات عليها. ما هي البرمجيات التي تقدم قواعد البيانات العلاقية؟ تَتَعدد الشركات والبرمجيات التي تُقدم أنظمة إدارة قواعد البيانات، وكل منها له سوقه ومجاله الذي يشتهر به. نُقدم لكم في الفقرات القادمة بعضًا من أشهر أنظمة إدارة قواعد البيانات العلاقية. قواعد بيانات MySQL أحد أشهر أنظمة قواعد البيانات العلاقية مفتوحة المصدر. تستطيع إنشاء العديد من قواعد البيانات بداخلها، وتستطيع الوصول لها عبر الوِب. تَعمل MySQL على هيئة خِدمة Service تُتيح لأكثر من مستخدم الوصول إلى أكثر من قاعدة بيانات، وتشتهر بين معشر مبرمجي تطبيقات الوِب لارتباطها الشائع مع لغة البرمجة PHP، ويمكن تنصيبها على أكثر من نظام تشغيل مثل وندوز أو لينكس أو ماك. تعدّ MySQL الخيار المفضل للشركات الناشئة أو المتوسطة وذلك لسهولة التعامل معها وانخفاض تكاليف تشغيلها مقارنة بخيارات أخرى. قواعد بيانات أوراكل Oracle تعدّ شركة أوراكل عملاق الشركات البرمجية التي تقدم أنظمة إدارة قواعد البيانات العلاقية، وتأتي قاعدة البيانات أوراكل بأكثر من إصدار (حسب البيئة والغرض) تبدأ من الإصدار الشخصي والخفيف، وتنتهي بالإصدار المتقدم Enterprise. تتميز قواعد بيانات أوراكل بكم كبير من الإمكانات التي تسهل عليك حل العديد من المشاكل والعقبات في التطبيقات التي تديرها وتنشئها، مع وجود دعم فني قوي عبر مجتمع أوراكل، لذلك فهي تعتبر الخيار الإستراتيجي (البعيد المدى) للعديد من الشركات الكبيرة والجامعات والحكومات. قواعد بيانات مايكروسوفت Microsoft SQL Server من قواعد البيانات الشهيرة، والذي تأتي أيضا بأكثر من إصدار، لتلبي احتياجات المستخدمين المختلفة وبيئات عملهم، ولكي تتعامل مع البيانات في هذا النوع تحتاج لاستخدام النسخة الخاصة من SQL والمسماة T-SQL اختصارا ل Transact SQL والتي هي عبارة عن نسخة SQL مضاف عليه ادوال خاصة وتعديلات على طريقة حذف وتعديل السجلات. قواعد بيانات PostgreSQL قواعد بينات PostgreSQL من قواعد البيانات العلاقية المفضلة لدى بعض مطوري تطبيقات الوِب وتطبيقات سطح المكتب، وهو نظام إدارة قواعد بيانات مفتوح المصدر. توجد الكثير من الشركات الكبيرة والعاملة في مجال نطاقات إنترنت تعتمد على هذا النوع من قواعد البيانات.
    2 نقاط
  33. تَعرفنا في المقال السابق على مفهوم قواعد البيانات وما هي أنواعها. سوف نبدأ في هذا المقال أُولى خطواتنا في شرح لغة الاستعلام البنائية SQL، حيث سنتكلم عن لغة SQL ونعطي لمحة عن دورها وعلاقتها بقاعدة البيانات، ومن ثم سوف نبدأ بشرح أساسيات وجمل بناء قاعدة البيانات والجداول الخاصة بها باستخدام لغة SQL. لغة SQL وماذا تقدم SQL هي اختصارٌ لـ Structured Query language وترجمتها هي “لغة الاستعلام البنائية” وتنطق بطريقتيْن؛ إما حرفًا حرفًا S Q L، أو تنطق كلمة واحدة “سيكيوال”. لغة SQL هي لغة ذات غرض متخصص هدفها إعطاء القدرة على إدارة البيانات الموجودة في قواعد البيانات العلاقية والتعامل معها، وتخضع هذه اللغة لمعايير دولية متفق عليها، ويقوم المعهد الوطني الأمريكي للمعايير (ANSI) بإدارة وإصدار المعايير الخاصة ب SQL. لا يعني ما سبق أن كل برمجيات إدارة قواعد البيانات التي ذكرناها في المقال السابق والتي لم نذكرها، لا يعني بأن SQL لديها موحدة، ولا يعني أنك تستطيع تماما أن تُنفذ نفس جملة SQL في جميع تلك البرمجيات بنجاح. فمن المهم أن نذكر هنا أن الشركات المسؤولة عن تلك البرمجيات الخاصة بإدارة قواعد البيانات، اعتمدت نسخًا مطورة من SQL المعيارية لتصبح خاصة بها وبأنظمتها مع اعتماد حد أدنى في التوافقية مع SQL المعيارية. تستطيع باستخدام لغة SQL أن تقوم بالتالي: الاستعلام عن البيانات وجلبها من قاعدة البيانات. إضافة، تعديل السجلات في قاعدة البيانات وحذفها منها. الحفاظ على سلامة ودقة البيانات في قاعدة البيانات. تحديد الصلاحيات والأذونات الخاصة بمستخدمي قاعدة البيانات. دورة علوم الحاسوب دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب اشترك الآن أنواع أوامر SQL تنقسم جمل وأوامر SQL إلى ثلاث مجموعات، وذلك حسب الدور الذي يقوم به الأمر: لغة التعامل مع البيانات Data Manipulation Language: تحتوي هذه المجموعة على جمل غرضها إعطاء القدرة على التعامل مع البيانات دون التأثير على هيكليتها وشكلها العام، بحيث تستطيع الاستعلام عن البيانات، إضافة سجلّات، حذفها أو تعديلها. لغة تعريف البيانات Data Definition Language: تُقدم الأوامر التي تندرج تحت هذه المجموعة القدرة على تعريف البيانات وشكلها وطريقة ربطها ببعضها عبر استخدام أوامر لإنشاء الجداول وإنشاء قاعدة البيانات. لغة التحكم بالبيانات Data Control Language: تساعد هذه المجموعة من الأوامر في تحديد الصلاحيات التي يمكن منحها أو سلبها من المستخدمين الموجودين في قاعدة البيانات. يسرد الجدول التالي أهم الأوامر التي تُمَكّن المبرمج من إنشاء قاعدة البيانات الخاصة به وتنفيذ الجمل الخاصة بإدارتها وإدارة بياناتها. جملة إنشاء قاعدة البيانات في الواقع لا يوجد معيار لأمر إنشاء قاعدة البيانات في معيار SQL المقدم من معهد ANSI ولكن برمجيات قواعد البيانات العلاقية تقدم نسخة من هذا الأمر، وتختلف الصيغة من نظام إلى آخر. الصيغة العامة لأمر إنشاء قاعدة البيانات هي كالتالي: CREATE DATABASE database_name; ملاحظات هامة يُنشئ الأمر السابق قاعدة بيانات فارغة بالاسم المُمَرَّر (أي database_name في الجملة أعلاه). تتطلب أغلب نظم إدارة قواعد البيانات وجود صلاحيات المسؤول للمستخدم الذي ينشئ قاعدة البيانات. بمجرد إنشاء قاعدة البيانات، يستطيع المستخدم أو من له صلاحية، البدء بإضافة عناصر إلى قاعدة البيانات من جداول Tables، مشاهد Views، دوال وحزم، وإضافة سجلات وبيانات إلى الجداول المُنشأة. أثناء تنفيذ أمر إنشاء قاعدة البيانات وبعده، تُنشَأ ملفات خاصة بقاعدة البيانات الجديدة حسب النظام المستخدم، وتُدار هذه الملفات وتُسمَّى إما تلقائيًّا أو من قبل المستخدم. لأن أمر إنشاء قاعدة البيانات غير معياري، فإن خيارات هذا الأمر متعددة وكثيرة وتأتي حسب نوع النظام المستخدم، وحسب نوع نظام إدارة قواعد البيانات. يظهر أمر الإنشاء بأحرف كبيرة Upper case. ليس هذا ضروريّاً في أغلب برامج إدارة قواعد البيانات، إلا أنها عادة في التوثيقات Documentations لتمييز الكلمات المفتاحية التي تعدّ جزءًا من SQL. جملة إنشاء جدول يُعد إنشاء الجدول في قاعدة البيانات أول الخطوات في طريق بناء قاعدة البيانات وملئها بالسجلات، وهذا الأمر يقوم به مسؤول قواعد البيانات أو المبرمج على حد سواء. ستحتاج قبل أن تتمكّن من البدء في تنفيذ أوامر على القاعدة إلى تحديد قاعدة البيانات التي تريد العمل عليها، أي تلك التي ستُنشِئ الجداول فيها. تختلف طريقة تحديد قاعدة البيانات حسب طريقة الاتصال ببرنامج إدارة قواعد البيانات: في سطر أوامر MySQL يُنفَّذ الأمر بالطريقة التالية: USE database_name; في سطر أوامر PostgreSQL: \connect DBNAME الصيغة العامة لجملة إنشاء الجدول في SQL: CREATE TABLE table_name ( column1 datatype [constraint], column2 datatype [constraint], column3 datatype [constraint], .... ); شرح الصيغة: CREATE TABLE table_name ( CREATE تعني إنشاء العنصر (الجدول هنا) وهي بداية الأمر. TABLE لتحديد أن هذه الجملة لإنشاء جدول. table_name وهو الاسم الذي نريد إطلاقه على الجدول الجديد الذي نريد بناءه. القوس المفتوح باتجاه اليسار يعني البدء بكتابة هيكل الجدول والذي يتضمن الأعمدة ونوعها والقيود التي من الممكن أن نضيفها وبعض الإعدادات الأخرى. column1 datatype [constraint], column1: هو الاسم الذي سوف نعطيه للعمود الأول. Datatype:يعني نوع العمود (نصي, رقم, تاريخ. الخ). [Constraint]:تعني – اختيارياً - تستطيع تحديد قيود على مستوى هذا العمود (سنتكلم لاحقا بالتفصيل عن القيود). الفاصلة تعني وجود عمود آخر سوف نعرّفه بعد هذا العمود. عند كتابة العمود الأخير لا نضيف فاصلة، ومن ثم نضيف القوس المعاكس للقوس الذي فُتح عند بداية كتابة الأعمدة، ونختم الأمر بقاصلة منقوطة. ملاحظات هامة تبدأ أسماء الجداول والأعمدة عموما بحرف وليس برقم (بعض نظم إدارة قواعد البيانات تسمح بذلك)، ومن الممكن أن تُتبع بعد ذلك بالأرقام. يُفضَّل ألا يتجاوز طول اسم الجدول أو العمود30 محرفا Characters، حيث إن بعض النظم تمنع أن تتجاوز ذلك مثل نظام إدارة قواعد البيانات أوراكل. يجب ألا تُستخدَم كلمات محجوزة في تسمية الجدول أو العمود. جملة تعديل الجدول بعد أن تكلمنا عن جملة إنشاء الجدول، يجب علينا توضيح جملة تعديل الجدول بعد إنشائه، حيث إن إجراء عمليات التغيير على الجدول يُعد أمراً مهما للمبرمج ومسؤول قواعد البيانات إذ يُنفَّذ باستمرار أثناء وفي بداية بناء النظم البرمجية والبرامج نظرا لتغير المتطلبات وعدم اكتمالها. تُستخدَم جملة تعديل الجدول Alter Table عموما في الحالات التالية: إضافة عمود للجدول. حذف عمود من الجدول. تغيير نوع عمود في الجدول. إضافة قيد على العمود. حذف قيد عن العمود. نسرُد في ما يلي الصيغ العامة لجملة تعديل الجدول. إضافة عمود ALTER TABLE table_name ADD column_name datatype; حذف عمود ALTER TABLE table_name DROP COLUMN column_name; تعديل عمود ALTER TABLE table_name MODIFY | ALTER COLUMN column_name datatype; إنشاء جداول وتعديلها لإنشاء جدول باسم Persons يحتوي على 5 أعمدة تمثل معلومات أشخاص مثل رقم الشخص واسمه وعنوانه، نُنَفذ الجملة التالية (اختبرناها على MySQL 5.7 و Oracle XE 11.2): CREATE TABLE Persons ( PersonID int, Last_Name varchar(255), First_Name varchar(255), Address varchar(255), City varchar(255) ); يتكوّن الجدول السابق: من العمود PersonID الذي هو من النوع int، أي أن قيم هذا العموم يجب أن تكون أرقامًا؛ الأعمدة City، Last_Name، First_Name وAddressالتي هي من النوع varchar، أي سلسلة محارف، بطول 255 محرفا. بعد تنفيذ جملة إنشاء الجدول السابقة، ينتج لدينا جدول فارغ بالشكل التالي: +--------------+------------------+------------------+-------------+--------+ | PersonID | Last_Name | First_Name | Address | City | +--------------+------------------+------------------+-------------+--------+ نستطيع أن نملأ الجدول بالبيانات باستخدام جملة الإضافة والتي سوف نتكلم عنها في مقال قادم. لإنشاء نفس الجدول السابق بحيث يتضمن وجود قيود على مستوى الأعمدة، ننفذ الجملة التالية: CREATE TABLE Persons ( PersonID int PRIMARY KEY, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255) NOT NULL, City varchar(255) ); أضفنا في الجملة السابقة، قيودا على مستوى أعمدة الجدول، بحيث يُعرَّف العمود PersonID بأنه المفتاح الرئيسي للجدول، والأعمدة Last_Name و Address بأنها لا تستقبل القيم الفارغة. في حال أردنا أن نضيف عمودًا جديدًا للجدول باسم Age (العمر) ومن نوع البيانات رقم نستخدم جملة التعديل التالية: ALTER TABLE Persons ADD Age int; تمكن ترجمة الأمر على النحو التالي: “عدّل الجدول Persons بإضافة عمود اسمه Age ونوعه int“. في حال أردنا أن نحذف عمود City من الجدول نستخدم الجملة التالية: ALTER TABLE Persons DROP COLUMN City; أي: “عدّل الجدول Persons بحذف العمود City“. إذا أردنا تعديل نوع عمود Age إلى نص بدلا من رقم نستخدم الجملة التالية: ALTER TABLE Persons MODIFY Age varchar(10); ذكرنا خلال هذا المقال مصطلحي القيود ونوع البيانات في العمود. ولكن ما هي القيود؟ وماذا نستفيد منها في قواعد البيانات؟ وما هي أنواع البيانات التي من الممكن التعامل معها؟ يقدّم المقال القادم شرحا تفصيليا عن القيود وأنواعها، وكذلك سيشرح المقال الأنواع التي من الممكن أن نتعامل معها. اقرأ أيضًا دليلك الشامل إلى أنواع البيانات
    2 نقاط
  34. نتعرف في مقال اليوم على مفهوم الخوارزميات Algorithms التي تعد واحدة من المفاهيم الأساسية المستخدمة في مجال الرياضيات والبرمجة وعلوم الحاسوب والعديد من المجالات المختلفة الأخرى كما يمكننا تطبيقها في حل مشكلات حياتنا اليومية، ونكتشف أهم خصائصها وطرق كتابتها والتعبير عنها وطريقة تحويلها إلى كود برمجي. كما نوفر في ختام المقال أهم النصائح التي تساعدك في تعلم الخوارزميات بالطريقة الصحيحة. ما هي الخوارزميات Algorithms الخوارزمية هي مصطلح يشير إلى مجموعة من الخطوات المرتبة المتبعة لحل مشكلة ما أو إنجاز مهمة معينة، ويعود أصل هذا المفهوم إلى العالم المسلم أبي عبد الله محمد بن موسى الخوارزمي مؤلف كتاب “المختصر في حساب الجبر والمقابلة” والذي قدم فيه طرقًا منهجية جديدة لإجراء العمليات الحسابية وحل المعادلات الخطية والتربيعية بشكل خطوات متسلسلة ومن هنا نشأت كلمة خوارزمية نسبة إلى طريقة التفكير التي أوجدها لحل المسائل والتي كان لها أثرًا كبيرًا في تطوير الخوارزميات المستخدمة في شتى المجالات. فهناك خوارزميات تستخدم في مجال الرياضيات مثل خوارزمية خوارزمية إقليدس Euclidean algorithm وخوارزمية غربال إراتوستينس Sieve of Eratosthenes و خوارزميات تستخدم في مجال البرمجة وعلوم الحاسوب مثل خوارزميات الترتيب Sorting algorithms التي تساعدك على ترتيب مجموعة من العناصر وفق ترتيب تصاعدي، ويفيدنا الترتيب في حل الكثير من المشكلات الحاسوبية بسهولة أكبر على سبيل المثال البحث عن اسم ما في سلسلة عناصر مرتبة وفق التسلسل الأبجدي أسرع وأسهل من البحث في سلسلة عناصر غير مرتبة لذا من الأفضل أن ترتب العناصر قبل البحث فيها. كما تستخدم الخوارزميات كذلك في حياتنا اليومية في العديد من المواقف، على سبيل المثال لكل منا طريقة أو خوارزمية يعد من خلالها كوب القهوة الصباحي يوميًا بنفس الطريقة، بالنسبة لي أتبع الخطوات التالية: املأ الركوة أو دلة القهوة بالماء. سخّن الماء. انتظر حتى يغلي الماء. أضف القهوة وحركها. اسكب القهوة في الكوب. أعتقد أن فكرة الخوارزمية قد أصبحت واضحة بالنسبة لك، فهي ببساطة ليست سوى مجوعة من الخطوات المرتبة لإنجاز مهمة محددة وقد تختلف خطوات الخوارزمية المتبعة لإنجاز المهمة من شخص لآخر لكن المهم أن تكون النتيجة النهائية صحيحة. سنركز في فقراتنا التالية على مفهوم الخوارزميات في علوم الحاسوب والتي تعني بشكل محدد مجموعة من الخطوات المفصلة والمرتبة التي تخبر الحاسوب بطريقة أداء مهمة ما والتي تحوّل بسهولة إلى برامج حاسوبية يمكن للحاسوب تنفيذها. خصائص الخوارزميات يجب أن تتسم الخوارزمية بمجموعة من المواصفات أو الخصائص الأساسية، وتساعدك معرفة هذه الخصائص على تصميم الخوارزمية بشكل صحيح، ومن أهم هذه الخصائص: يجب أن تتكون الخوارزمية من تعليمات محددة وواضحة ومفهومة وقابلة للتنفيذ. يجب أن تكون الخوارزمية فعالة وقادرة على حل المشكلة المطلوبة بطريقة صحيحة وبسيطة قدر المستطاع. يمكن أن لا تحتوي الخوارزمية على مدخلات أو قد تتضمن عدة مدخلات. يجب أن تحتوي الخوارزمية على خرج واحد أو أكثر وينبغي أن تؤدي نفس المدخلات دائمًا إلى نفس النتائج أو المخرجات. يجب أن تجد الخوارزمية حلاً للمشكلة المطلوبة بعد عدد منتهي من الخطوات وتنجز خلال فترة زمنية محددة لتكون فعالة وذات جدوى. طرق تمثيل الخوارزمية يمكن تمثيل الخوارزمية بطرق مختلفة تصف من خلالها كيفية حل المشكلة، وفيما يلي نوضح عدة طرق ممكنة لتمثيل الخوارزمية: يمكنك تمثيل الخوارزمية بلغتك المحكية أو اللغة العامية بأي طريقة تفهمها وتستوعبها دون الحاجة للالتزام بأي قواعد محددة، وهذا الأسلوب يسهل عليك مشاركة الخوارزمية مع أشخاص آخرين مهما كانت خلفياتهم التقنية. كما يكمن أن تتبع طريقة أكثر رسمية في التعبير اللفظي باستخدام ما يعرف بالكود الزائف Pseudo-code الذي يشبه أسلوب الكتابة في لغة البرمجة ويعمل كحل وسط بين اللغة المحكية ولغة البرمجة. كما يمكن تمثيل الخوارزمية بطريقة رسومية باستخدام المخططات الهيكلية أو المخططات الانسيابية Flowcharts التي تتكون من رموز وأشكال أساسية مرتبطة بأسهم تظهر الترتيب المنطقي للخطوات، ولكل شكل هدف محدد. حيث يمثل الشكل البيضوي بداية ونهاية المخطط، ويمثل المستطيل عملية ما، ويشير متوازي الأضلاع إلى إدخال وإخراج البيانات، ويدل المعين على عملية اتخاذ قرار. على سبيل المثال إذا جربنا كتابة خوارزمية صنع كوب قهوة التي وضحناها سابقًا بشكل لفظي على شكل كود زائف يمكن أن نعبر عنها بالأسلوب التالي: ابدأ . املأ دلة القهوة بالماء. سخن الماء. تحقق مما إذا كان الماء يغلي. إذا كان الجواب صحيح انتقل إلى الخطوة التالية. إذا لم يكن الجواب صحيح عد إلى الخطوة السابقة. ضع القهوة فوق الماء المغلي وحركها. اسكب القوة في الكوب. النهاية. ويمكن كذلك تمثيل خوارزمية عمل كوب القهوة بشكل مخطط تدفقي رسومي كما يلي: خطوات كتابة الخوارزمية لتحديد خطوات الخوارزمية وكتابتها بشكل صحيح علينا بدايةً فهم المشكلة بشكل جيد وبعدها البدء بتحديد مشكلة الخوارزمية وتحديد مدخلات الخوارزمية من خلال تحديد كافة الأمثلة أو الحالات التطبيقية instances التي تعمل عليها الخوارزمية، ثم تحديد الخرج التي سنحصل عليه بعد تشغيل الخوارزمية على إحدى تلك الحالات، واعلم أن التمييز بين المشكلة نفسها والحالة التطبيقية عليها instance مهم جدًا. على سبيل المثال تُعرَّف مشكلة خوارزمية الفرز أو الترتيب sorting على النحو التالي: المشكلة: الترتيب. المدخلات: تسلسل من عدد n من المفاتيح ‎a_1, a_2, ..., a_n‎ الخرج: إعادة ترتيب تسلسل المدخلات بحيث يكون لدينا: b_1, b_2,<= ... <= b_{n-1}, b_n يمكن أن تعمل خوارزمية الفرز على عدة حالات instances، على سبيل المثال يمكن أن يكون دخل هذه الخوارزمية عبارة عن مصفوفة من السلاسل النصية التي نحتاج لترتيبها أبجديًا مثل {Haskell, Emacs} أو يكون عبارة عن تسلسل من الأرقام التي نريد ترتيبها تصاعديًا مثل {154، 245، 1337}. الخطوة التالية هي معرفة التعليمات التي ستعمل بها الخوارزمية وتعالج المدخلات للحصول على المخرجات وكتابتها بالترتيب الصحيح والتعبير عنها بالطريقة التي تفضلها وبعدها ستكون جاهزًا لتحويل الخوارزمية إلى كود برمجي قابل للتنفيذ على الحاسوب. مثال على كتابة خوارزمية Fizz Buzz سنوضح في هذه الفقرة كيفية حل مسألة Fizz Buzz وهي خوارزمية معروفة تحل مشكلة بسيطة ويطلب منك حلها في معظم المقابلات البرمجية والهدف منها طباعة مجموعة من الأعداد الصحيحة من واحد إلى N ولكنك ستطبع كلمة Fizz إذا كان العدد قابلاً للقسمة على 3، و كلمة Buzz إذا كان العدد قابلاً للقسمة على 5، وكلمة Fizzbuzz إذا كان العدد قابلاً للقسمة على العددين 3 و 5 بذات الوقت. يشير المعنى الحرفي لهاتين الكلمتين إلى الصوت التي تحدثه كل كلمة منهما، ويرجع أصل استخدامها إلى لعبة أطفال شهيرة تُسمّى fizz buzz تقوم على نفس المبدأ وتستخدم لتعلم الأطفال عملية القسمة. في الفقرات التالية سنكتب هذه الخوارزمية بلغة البرمجة سويفت Swift وفي حال لم تكن تملك خبرة في هذه اللغة اكتبها بأي لغة برمجة تعرفها مثل لغة بايثون أو جافا او اكتبها بالكود الزائف. بفرض أن دخل الخوارزمية هو سلسلة الأرقام التالية: 1 2 3 4 5 6 7 8 9 10 كما وضحنا سابقًا، يشير المصطلحَان Fizz و Buzz إلى أيّ عدد مضاعف للعدد 3 أو 5 على الترتيب، أي إذا كان العدد يقبل القسمة على 3 فيمكن استبداله بالكلمة Fizz، وإذا كان قابلاً للقسمة على 5 فيمكن استبداله بكلمة Buzz. أما إذا كان من مضاعفات 3 و 5 بذات الوقت فيُستبدَل بكلمة FzzBuzz أي سيكون الخرج كما هو مبين في الصورة التالية: يمكن التعبير عن الخوارزمية بشكل كود زائف كما يلي: ابدأ. قم بتكرار الأعداد من 1 إلى 10. تحقق مما إذا كان العدد الحالي قابلاً للقسمة على 3. إذا كان الجواب صحيح اطبع الكلمة fizz. إذا لم يكن الجواب صحيح، انتقل إلى الخطوة التالية. تحقق فيما إذا كان العدد الحالي قابلاً للقسمة على 5. إذا كان الجواب صحيح اطبع الكلمة buzz. إذا لم يكن الجواب صحيح، اعرض العدد الحالي. كرر الحلقة حتى تصل إلى الرقم 10. النهاية. لنعبر عن هذه الخطوات من خلال رسم مخطط تدفقي يوضح بشكل رسومي خطوات عمل الخوارزمية. تنفيذ خوارزمية Fizz Buzz من خلال لغة البرمجة Swift بعد أن فهمت الخوارزمية ستتمكن من تنفيذ هذه الخوارزمية بسهولة وتحويلها لبرنامج حاسوبي، افتح محرر الأكواد البرمجية Xcode أو VS code أو أي محرر آخر تفضله لكتابة برنامج جديد، يبدأ البرنامج بتعلمية تهيئة مصفوفة من 1 إلى 10 let number = [1,2,3,4,5,6,7,8,9,10] نريد أن نعالج مصفوفة الدخل والحصول على الخرج المطلوب، أي نريد أن نستبدل 3 بالكلمة fizz هنا و 5 بالكلمة buzz كما شرحنا سابقًا. ولتحقيق ذلك نمرّ على جميع عناصر المصفوفة والتحقق من كل عنصر من عناصرها ولذا سننشئ حلقة for تمرّ عبر هذه العناصر كما يلي: for num in number { // الحسابات هنا } بعد هذا، سنستخدم العبارة الشرطية if else، وعامل باقي القسمة module operator في لغة swift أي % لتحديد مواقع fizz و buzz كما يلي: for num in number { if num % 3 == 0 { print("\(num) fizz") } else { print(num) } } يكون الخرج الناتج من تنفيذ البرنامج هو كالتالي: 1 2 3 fizz 4 5 6 fizz 7 8 9 fizz 10 سنضيف الآن الجزء المتعلق بالكلمة Buzz مستخدمين نفس الآلية التي اتبعناها في كتابة الكود السابق: for num in number { if num % 3 == 0 { print("\(num) fizz") } else if num % 5 == 0 { print("\(num) buzz") } else { print(num) } } بعد إضافة الكود السابق سيكون الخرج الناتج من تنفيذ البرنامج بالشكل التالي: 1 2 3 fizz 4 5 buzz 6 fizz 7 8 9 fizz 10 سنزيد عناصر المصفوفة إلى 1-15. لاحظ أنّه بما أن 15 مضاعف لكلّ من 3 و 5، فينبغي استبدالها بـ fizz buzz: for num in number { if num % 3 == 0 && num % 5 == 0 { print("\(num) fizz buzz") } else if num % 3 == 0 { print("\(num) fizz") } else if num % 5 == 0 { print("\(num) buzz") } else { print(num) } } لا تزال لدينا مشكلة قائمة في الكود أعلاه، فالغرض الأساسي من الخوارزمية هو ترشيد وقت التنفيذ. تخيّل لو زدنا نطاق المصفوفة من 1-15 إلى 1-100، سيكون على مُصرِّف اللغة فحص كل عدد على حدة لتحديد ما إذا كان قابلاً للقسمة على 3 أو 5، ثمّ سيمرّ على الأعداد ثانيةً للتحقق ممّا إذا كانت قابلة للقسمة على 3 و 5 (معًا)، كما سيتعيّن على الشيفرة أن تمرّ على كلّ عدد في المصفوفة مرّتين لأنّها ستتحقق من قابلية قسمة العدد على 3 أولًا، ثمّ على 5. ولتسريع هذه العملية، يمكن أن نأمر المصرّف بقسمة الأعداد على 15 مباشرة. انظر الشيفرة النهائية: for num in number { if num % 15 == 0 { print("\(num) fizz buzz") } else if num % 3 == 0 { print("\(num) fizz") } else if num % 5 == 0 { print("\(num) buzz") } else { print(num) } } هنيئًا لك، بهذا تكون قد كتبت أوّل خوارزمية لك، يمكنك استخدامها في أيّ لغة برمجة، وستعمل كما هو مُتوقّع. تعلم الخوارزميات إن تعلم الخوارزميات خطوة مهمة لأي شخص مهتم بالبرمجة والتطوير فهي تساعده على فهم البرمجة بشكل أفضل وتكسبه مهارة فهم المشكلات البرمجية المعقدة واختيار الطرق الأنسب والأكثر كفاءة لحلها. كما يرتبط تعلم الخوارزميات مع تعلم هياكل البيانات التي تساعدك على تنظيم وإدارة وتخزين ومعالجة البيانات بكفاءة وتتضمن معظم مقابلات العمل للوظائف البرمجية أسئلة متعلقة بفهم أساسيات الخوارزميات وهياكل البيانات لذا من الضروري لأي مهتم بمجالات العمل البرمجي تعلمها بشكل جيد. وإليك أهم النصائح والخطوات التي تساعدك على تعلم الخوارزميات بكفاءة: عزز مهارة التفكير المنطقي فهي مهارة أساسية يحتاجها أي مبرمج. درب نفسك على التفكير الخوارزمي أي التفكير في أي مشكلة تواجهك بطريقة تشبه طريقة تفكير الحاسوب من خلال تحديد الخطوات المفصلة للحل أو تقسيم المشكلة إلى مشكلات أصغر وحل كل جزء على حدا. تعلم أهم أنواع الخوارزميات المعروفة التي يحتاجها معظم المطورين والطرق المختلفة لتنفيذها وكفاءة كل طريقة منها. تعلم كيف تحلل أي مشكلة برمجية وتفهمها جيدًا وتخطط لها على الورق وتمثلها بالطرق الخوارزمية وتأكد من أنك فهمتها بشكل كامل قبل كتابة كودها البرمجي. تعرف على أهم هياكل البيانات في لغة البرمجة التي تستخدمها لكتابة برامجك وتطبيقاتك وفكر بالبنية الأفضل لحل مشكلتك. طبق الخوارزميات لحل مشكلات بسيطة وتدرب على حل التحديات البرمجية Problem Solving وهي كثيرة عبر الإنترنت وتضم الكثير من المهتمين بالبرمجة والتطوير وقارن إجاباتك مع إجابات الآخرين وتناقش معهم حول حلولهم لتكسب المزيد من الخبرات. فكر في تنفيذ عدة طرق لحل المشكلات البرمجية التي تواجهك وقارن أيّ هذه الطرق أسرع وأكثر كفاءة وفعالية. تعلم مفهوم تعقيد الخوارزميات الذي يعبر عن مقدار الوقت أو مساحة الذاكرة التي تستغرقها الخوارزمية للتنفيذ واستفذ منه في كتابة شيفرات برمجية فعالة. اعتمد مصادر تعلم موثوقة ومنهجية، ستجد في أكاديمية حسوب الكثير من المقالات والدروس المفيدة لتعلم البرمجة والخوارزميات، كما توفر موسوعة حسوب توثيقًا باللغة العربية لأشهر الخوارزميات التي يحتاج أي مطور لمعرفتها، كما يمكنك الانضمام إلى دورة علوم الحاسوب التي تضم العديد من المسارات المفيدة لتعلم أساسيات البرمجة وتتضمن عدة مسارات تشرح الخوارزميات وطريقة التفكير المنهجي في حل أي مشكلة وكتابة خوارزمياتها قبل البدء ببرمجتها مما يصقل مهاراتك التقنية لتفكر كمهندس برمجيات بدلاً من أن تكون مجرد مبرمج يكتب الأكواد وينفذها فحسب. الخلاصة تعرفنا في مقال اليوم على ما هي الخوارزميات وما الخطوات التي يجب اتباعها لكتابة الخوارزمية وتمثيلها بطرق مختلفة واستعرضنا في الختام أهمية تعلم الخوارزميات واكتساب مهارة التفكير المنهجي لحل المشكلات بطريقة تشبه طريقة عمل الحاسوب وأهم النصائح التي تساعدك على تعلمها وإتقانها كخطوة أساسية قبل تطوير مهارات البرمجة والتطوير. ترجمة -بتصرّف- للفصل الأول من كتاب Algorithms Notes for Professionals. اقرأ أيضًا المرجع الشامل إلى تعلم الخوارزميات للمبتدئين دليل شامل عن تحليل تعقيد الخوارزمية بناء مصنف بالاعتماد على طرق تعلم الآلة بلغة بايثون باستخدام مكتبة Scikit-Learn - النسخة الكاملة لكتاب مدخل إلى الذكاء الاصطناعي وتعلم الآلة
    2 نقاط
  35. لمُوجِّهات (تعليمات) الاستيراد والتصدير أكثر من صياغة برمجية واحدة رأينا في الفصل السابق، مقدمة إلى الوحدات استعمالًا بسيطًا له، فهيًا نرى بقية الاستعمالات. التصدير قبل التصريح يمكننا أن نقول لأيّ تصريح بأنّه مُصدّر بوضع عبارة export قبله، كان التصريح عن متغيّر أو عن دالة أو عن صنف. فمثلًا، التصديرات هنا كلّها صحيحة: // تصدير مصفوفة export let months = ['Jan', 'Feb', 'Mar','Apr', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; // تصدير ثابت export const MODULES_BECAME_STANDARD_YEAR = 2015; // تصدير صنف export class User { constructor(name) { this.name = name; } } ملاحظة: لا يوجد فواصل منقوطة بعد تعليمة التصدير للأصناف أو الدوالّ لاحظ أن تعليمة export قبل الصنف أو الدالة لا يجعلها تعابير الدوالّ. ولو أنه يصُدرها، لكنه لا يزال تعريفًا للدالّة أو الصنف. لا توصي معظم الأدلة التعليمية بوضع فاصلة منقوطة بعد تعريف الدوال والأصناف. لهذا السبب لا داعي للفاصلة المنقوطة في نهاية التعليمة export class والتعليمة export function: export function sayHi(user) { alert(`Hello, ${user}!`); } // لاحظ لا يوجد فاصلة منقوطة في نهاية التعريف التصدير بعيدًا عن التصريح كما يمكننا وضع عبارة export لوحدها. هنا نصرّح أولًا عن الدالتين وبعدها نُصدّرهما: // ? say.js function sayHi(user) { alert(`Hello, ${user}!`); } function sayBye(user) { alert(`Bye, ${user}!`); } export {sayHi, sayBye}; // تصدير قائمة من المتغيرات أو… يمكننا تقنيًا وضع export أعلى الدوال أيضًا. عبارة استيراد كل شيء عادةً نضع قائمة بما نريد استيراده في أقواس معقوفة import {...}‎، هكذا: // ? main.js import {sayHi, sayBye} from './say.js'; sayHi('John'); // Hello, John! sayBye('John'); // Bye, John! ولكن لو أردنا استيراد وحدات كثيرة، فيمكننا استيراد كلّ شيء كائنًا واحدًا باستعمال import * as <obj>‎ هكذا: // ? main.js import * as say from './say.js'; say.sayHi('John'); say.sayBye('John'); يقول المرء من النظرة الأولى ”استيراد كلّ شيء فكرة جميلة جدًا، وكتابة الشيفرة سيكون أسرع. أساسًا لمَ نقول جهارةً ما نريد استيراده؟“ ذلك… لأسباب وجيهة. أدوات البناء الحديثة (مثل: webpack وغيرها) لنقل مثلًا بأنّا أضفنا مكتبة خارجية اسمها say.js إلى مشروعنا، وفيها دوالّ عديدة: // ? say.js export function sayHi() { ... } export function sayBye() { ... } export function becomeSilent() { ... } هكذا نستعمل واحدة فقط من دوالّ say.js في مشروعنا: // ? main.js import {sayHi} from './say.js'; …حينها تأتي أداة التحسين وترى ذلك، فتُزيل الدوال الأخرى من الشيفرة … بذلك يصغُر حجم الملف المبني. هذا ما نسميه هز الشجر (لتَسقطَ الأوراق اليابسة فقط). لو وضّحنا بالضبط ما نريد استيراده فيمكننا كتابته باسم أقصر: sayHi()‎ بدل say.sayHi()‎. بكتابة قائمة الاستيراد جهارةً نستطيع أن نفهم بنية الشيفرة دون الخوض في التفاصيل (أي نعرف ما نستعمل من وحدات، وأين نستعملها). هذا يسهّل دعم الشيفرة وإعادة كتابتها لو تطلّب الأمر. استيراد كذا بالاسم كذا as يمكننا كذلك استعمال as لاستيراد ما نريد بأسماء مختلفة. فمثلًا يمكننا استيراد الدالة sayHi في المتغير المحلي hi لنختصر الكلام، واستيراد sayBye على أنّها bye: // ? main.js import {sayHi as hi, sayBye as bye} from './say.js'; hi('John'); // Hello, John! bye('John'); // Bye, John! تصدير كذا بالاسم كذا as نفس صياغة الاستيراد موجودة أيضًا للتصدير export. فلنصدّر الدوال على أنّها hi وbye: // ? say.js ... export {sayHi as hi, sayBye as bye}; الآن صارت hi وbye هي الأسماء ”الرسمية“ للشيفرات الخارجية وستُستعمل عند الاستيراد: // ? main.js import * as say from './say.js'; // لاحِظ الفرق say.hi('John'); // Hello, John! say.bye('John'); // Bye, John! التصدير المبدئي في الواقع العملي، ثمّة نوعين رئيسين من الوحدات. تلك التي تحتوي مكتبة (أي مجموعة من الدوال) مثل وحدة say.js أعلاه. وتلك التي تصرّح عن كيانٍ واحد مثل وحدة user.js التي تُصدّر class User فقط. عادةً ما يُحبّذ استعمال الطريقة الثانية كي يكون لكلّ ”شيء“ وحدةً خاصة به. ولكن هذا بطبيعة الحال يطلب ملفات كثيرة إذ يطلب كلّ شيء وحدةً تخصّه باسمه، ولكنّ هذه ليست بمشكلة، أبدًا. بل على العكس هكذا يصير التنقل في الشيفرة أسهل (لو كانت تسمية الملفات مرضية ومرتّبة في مجلدات). توفر الوِحدات طريقة لصياغة عبارة export default (التصدير المبدئي) لجعل "سطر تصدير واحد لكلّ وِحدة" تبدو أفضل. ضَع export default قبل أيّ كيان لتصديره: // ? user.js export default class User { // ‫نُضيف ”default“ فقط constructor(name) { this.name = name; } } لكلّ ملف سطر تصدير export default واحد لا أكثر. وبعدها… نستورد الكيان بدون الأقواس المعقوفة: // ? main.js import User from './user.js'; // ‫لا نضع {User}، بل User new User('John'); أسطر الاستيراد التي لا تحتوي الأقواس المعقوفة أجمل من تلك التي تحتويها. يشيع خطأ نسيان تلك الأقواس حين يبدأ المطورون باستعمال الوِحدات. لذا تذكّر دائمًا، يطلب سطر الاستيراد import أقواس معقوفة للكيانات المُصدّرة والتي لها أسماء، ولا يطلبها لتلك المبدئية. التصدير الذي له اسم التصدير المبدئي export class User {...}‎ export default class User {...}‎ import {User} from ...‎ import User from ...‎ table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } يمكننا نظريًا وضع النوعين من التصدير معًا في نفس الوحدة (الذي له اسم والمبدئي)، ولكن عمليًا لا يخلط الناس عادةً بينها، بل للوِحدة إمّا تصديرات لها أسماء، أو التصدير المبدئي. ولأنّه لا يمكن أن يكون لكلّ ملف إلا تصديرًا مبدئيًا واحدًا، فيمكن للكيان الذي صُدّر ألّا يحمل أيّ اسم. فمثلًا التصديرات أسفله كلّها صحيحة مئة في المئة: export default class { // لا اسم للصنف constructor() { ... } } export default function(user) { // لا اسم للدالة alert(`Hello, ${user}!`); } // نُصدّر قيمةً واحدة دون صنع متغيّر export default ['Jan', 'Feb', 'Mar','Apr', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; لا مشكلة بتاتًا بعدم كتابة الاسم إذ لا نرى export default إلّا مرّة في الملف، بهذا تعرف تمامًا أسطر import (بدون استعمال الأقواس المعقوفة) ما عليها استيراده. ولكن دون default فهذا التصدير سيُعطينا خطأً: export class { // Error! (non-default export needs a name) constructor() {} } الاسم المبدئي تُستعمل في حالات معيّنة الكلمة المفتاحية default للإشارة إلى التصدير المبدئي. فمثلًا لتصدير الدالة بنحوٍ منفصل عن تعريفها: function sayHi(user) { alert(`Hello, ${user}!`); } // ‫كما لو أضفنا ”export default“ قبل الدالة export {sayHi as default}; أو لنقل بأنّ الوحدة user.js تُصدّر شيئًا واحدًا ”مبدئيًا“ وأخرى لها أسماء (نادرًا ما يحدث، ولكنّه يحدث): // ? user.js export default class User { constructor(name) { this.name = name; } } export function sayHi(user) { alert(`Hello, ${user}!`); } هكذا نستورد التصدير المبدئي مع ذلك الذي لديه اسم: // ? main.js import {default as User, sayHi} from './user.js'; new User('John'); وأخيرًا، حين نستورد كلّ شيء * على أنّه كائن، فستكون خاصية default هي كما التصدير المبدئي: // ? main.js import * as user from './user.js'; let User = user.default; // the default export new User('John'); كلمتين بخصوص سوء التصديرات المبدئية التصديرات التي لها أسماء تكون صريحة، أي أنّها تقول تمامًا ما الّذي يجب أن نستورده، وبذلك يكون لدينا هذه المعلومات منهم، وهذا شيء جيد. تُجبرنا التصديرات التي لها أسماء باستعمال الاسم الصحيح كما هو بالضبط لاستيراد الوحدة: import {User} from './user.js'; // ‫ولن تعمل import {MyUser}‎ إذ يجب أن يكون الاسم {User} بينما في حالة التصدير المبدئي نختار نحن الاسم حين نستورد الوِحدة: import User from './user.js'; // works import MyUser from './user.js'; // works too // ‫ويمكن أيضًا أن تكون ”استورِد كل شيء“ import Anything... وستعمل بلا أدنى مشكلة هذا قد يؤدّي إلى أن يستعمل أعضاء الفريق أسماء مختلفة لاستيراد الشيء ذاته، وهذا طبعًا ليس بالجيد. عادةً ولنتجنّب ذلك ونُحافظ على اتساق الشيفرة، نستعمل القاعدة القائلة بأنّ أسماء المتغيرات المُستورَدة يجب أن تُوافق أسماء الملفات، هكذا مثلًا: import User from './user.js'; import LoginForm from './loginForm.js'; import func from '/path/to/func.js'; ... مع ذلك تنظُر بعض الفِرق لهذا الأمر على أنه عقبة للتصديرات المبدئية فتفضّل استعمال التصديرات التي لها اسم دومًا. فحتّى لو كانت نصدّر شيئًا واحدًا فقط فما زالت تُصدّره باسم دون استعمال default. كما يسهّل هذا إعادة التصدير (طالِع أسفله). إعادة التصدير تُتيح لنا صياغة ”إعادة التصدير“ export ... from ...‎ استيراد الأشياء وتصديرها مباشرةً (ربما باسم آخر) هكذا: export {sayHi} from './say.js'; // ‫نُعيد تصدير sayHi export {default as User} from './user.js'; // نُعيد تصدير المبدئي ولكن فيمَ نستعمل هذا أصلًا؟ لنرى مثالًا عمليًا. لنقل بأننا نكتب ”حزمة“، أي مجلدًا فيه وحدات كثيرة وأردنا تصدير بعض ميزاتها إلى الخارج (تتيح لنا الأدوات مثل NPM نشر هذه الحزم وتوزيعها)، ونعلم أيضًا أن الكثير من وحداتها ما هي إلّا وحدات مُساعِدة يمكن أن تكون بنية الملفات هكذا: auth/ index.js user.js helpers.js tests/ login.js providers/ github.js facebook.js ... ونريد عرض مزايا الحزمة باستعمال نقطة واحدة (أي الملف الأساسي auth/index.js) لتُستعمل هكذا: import {login, logout} from 'auth/index.js' الفكرة هي عدم السماح للغرباء (أي المطوّرين مستعملي الحزمة) بالتعديل على البنية الداخلية والبحث عن الملفات داخل مجلد الحزمة. نريد تصدير المطلوب فقط في auth/index.js وإخفاء الباقي عن أعين المتطفّلين. نظرًا لكون الوظيفة الفعلية المصدّرة مبعثرة بين الحزمة، يمكننا استيرادها إلى auth/index.js وتصديرها من هنالك أيضًا: // ? auth/index.js // ‫اِستورد login/logout وصدِرهن مباشرةً import {login, logout} from './helpers.js'; export {login, logout}; // ‫استورد الملف المبدئي كـ User وصدره من جديد import User from './user.js'; export {User}; ... والآن يمكن لمستخدمي الحزمة الخاصة بنا استيرادها هكذا import {login} from "auth/index.js"‎. إن الصياغة export ... from ...‎ ماهي إلا اختصار للاستيراد والتصدير: // ? auth/index.js // ‫اِستورد login/logout وصدِرهن مباشرةً export {login, logout} from './helpers.js'; // ‫استورد الملف المبدئي كـ User وصدره من جديد export {default as User} from './user.js'; ... إعادة تصدير التصديرات المبدئية يحتاج التصدير المبدئي لمعالجة منفصلة عند إعادة التصدير. لنفترض أن لدينا user.js، ونود إعادة تصدير الصنف User منه: // ? user.js export default class User { // ... } لن تعمل التعليمة export User from './user.js'‎. ما الخطأ الذي حدث؟ ولكن هذا الخطأ في صياغة! لإعادة تصدير الملفات المصدرة إفتراضيًا ، علينا كتابة export {default as User}‎ ، كما في المثال أعلاه. تعيد التعليمة export * from './user.js'‎ تصدير التصديرات الّتي لها أسماء فقط، ولكنها تتجاهل التصديرات المبدئية. إذا رغبنا في إعادة تصدير التصديرات المبدئية والتي لها أسماء أيضًا، فسنحتاج إلى العبارتين: export * from './user.js'; // لإعادة تصدير التصديرات الّتي لها أسماء export {default} from './user.js'; // لإعادة تصدير التصديرات المبدئية هذه الغرابة في طريقة إعادة تصدير التصديرات المبدئية هي من أحد الأسباب لجعل بعض المطورين لا يحبونها. خلاصة والآن سنراجع جميع أنواع طرق التصدير export التي تحدثنا عنها في هذا الفصل والفصول السابقة. تحقق من معلوماتك بقراءتك لهم وتذكر ما تعنيه كلُّ واحدةٍ منهم: قبل التعريف عن صنف / دالّة / ..: export [default] class/function/variable ...‎ تصدير مستقل: export {x [as y], ...}‎. إعادة التصدير: export {x [as y], ...} from "module"‎ export * from "module"‎ (لا يُعيد التصدير المبدئي). export {default [as y]} from "module"‎ (يعيد التصدير المبدئي). استيراد: الصادرات التي لها أسماء من الوِحدة: import {x [as y], ...} from "module"‎ التصدير المبدئي: import x from "module"‎ import {default as x} from "module"‎ استيراد كل شيء: import * as obj from "module"‎ استيراد الوحدة (وشغِّل شيفرتها البرمجية)، ولكن لا تُسندها لمتغير: import "module"‎ لا يهم مكان وضع عبارات (تعليمات) import/export سواءً في أعلى أو أسفل السكربت فلن يغير ذلك أي شيء. لذا تقنيًا تعدُّ هذه الشيفرة البرمجية لا بأس بها: sayHi(); // ... import {sayHi} from './say.js'; // اِستورد في نهاية الملف عمليًا عادة ما تكون تعليمات الاستيراد في بداية الملف فقط لتنسيق أفضل للشيفرة. لاحظ أن تعليمتي import/export لن يعملا إن كانا في داخل جملة شرطية. لن يعمل الاستيراد الشرطي مثل هذا المثال: if (something) { import {sayHi} from "./say.js"; // Error: import must be at top level } .. ولكن ماذا لو احتجنا حقًا لاستيراد شيء ما بشروط معينة؟ أو في وقتٍ ما؟ مثل: تحميل الوِحدة عند الطلب، عندما تكون هناك حاجة إليها حقًا؟ سنرى الاستيراد الديناميكي في المقالة التالية. ترجمة -وبتصرف- للفصل Export and Import من كتاب The JavaScript language
    2 نقاط
  36. في مقال اليوم نقدم دليلًا سريعًا مدعمًا بالأمثلة العملية شرح لغة PHP التي تعد واحدة من لغات البرمجة القوية المستخدمة بشكل أساسي لتطوير الويب، فعلى الرغم من ظهور العديد من لغات البرمجة الأحدث في مجال تطوير الويب إلا أن لغة PHP لا تزال اللغة الأكثر شيوعًا واستخدامًا، وهي تتطور باستمرار لإصلاح أي عيوب أو أخطاء فيها وتعزيز أمان وأداء المواقع المبنية باستخدامها. نبذة مختصرة عن لغة PHP يشير اسم PHP إلى عبارة Hypertext Pre-processor أي المعالج المسبق للنصوص الفائقة وكلمة النصوص الفائقة تعني النصوص التي تملك روابط تنقلك لنصوص أو صفحات صفحات ويب أخرى عند النقر فوقها. وهي لغة برمجة مفتوحة المصدر وشائعة الاستخدام تستخدم في إنشاء وتطوير مواقع الويب الديناميكية، وقد طور باستخدامها أكثر من 75% من المواقع الموجودة على شبكة الإنترنت بحسب w3techs. تتميز لغة PHP بسهولتها ودعمها لمجموعة متنوعة من قواعد البيانات وبروتوكولات الإنترنت وتوفيرها للعديد من مكتبات وأطر العمل المساعدة للمبرمجين، وما زاد من شهرتها وحافظ على مكانتها وأهميتها بين مطوري الويب اعتماد العديد من منصات إدارة المحتوى ومنصات التجارة الإلكترونية المشهورة عليها مثل ووردبريس WordPress ودروبال Drupal وماجنتو Magneto وغيرها الكثير، فإذا كنت مهتمًا بمجال تطوير الويب فإن تعلم لغة PHP خيار مناسب وغني بالفرص. تعمل لغة PHP على الخادم server-side بخلاف لغات برمجة أخرى تعمل على المتصفح أو العميل client-side مثل لغة جافا سكريبت JavaScript أي أنها لا تنفذ الشيفرة البرمجية في متصفح الويب، بل تشغلها مباشرة على خادم الويب وبعدها يرسل خادم الويب نتيجة التنفيذ إلى المتصفح لعرضها، وتفترض هذه المقالة أنك تمتلك معلومات أساسية عن لغة PHP وطريقة عملها في الخلفية عند زيارتك لصفحة ويب من خلال متصفح الويب الخاص بك، وبأنك تعرف مسبقًا كيف تحول جهاز حاسوبك إلى خادم محلي وكيف تعد كل الأدوات اللازمة لكتابة أوامر PHP وتنفيذها، فإذا لم تكن على دراية بهذه المعلومات الأساسية أنصحك قبل ذلك ان تقرأ مقال تعرف على لغة PHP ثم تتابع قراءة هذا المقال. ملاحظة: تعمل الأكواد الواردة في الفقرات التالية مع إصدار PHP 5 والإصدارات اللاحقة فقد قدم الإصدار الخامس من PHP العديد من التغييرات والتحسينات المهمة على الإصدارات السابقة وأبرز هذه التغييرات دعم البرمجة كائنية التوجه oop في PHP ووفر العديد من تحسينات الأداء والأمان، وتابعت الإصدارات اللاحقة التحسين وأضافت ميزات جديدة للغة. كيف تكتب أكواد PHP تكتب أكواد PHP بعد وسم الفتح php?> وقبل وسم الإغلاق ‎<? ثم تحفظ داخل ملفات لها الامتداد ‎.php على خادم الويب، ومن الأفضل عمليًا تجاهل كتابة وسم الإغلاق إذا كان ملف php يحتوي على شفرة php فقط، لتلافي نتيجة خرج غير متوقعة. <?php echo "Hello World!"; ?> كما يمكن أن تدمج أكواد PHP مع أكواد HTML لإنشاء صفحات ويب ديناميكية بالشكل التالي: <!DOCTYPE html> <html> <head> <title> HTML and PHP </title> </head> <body> <h1>PHP code mixed with HTML</h1> <?php echo "Hello World!"; ?> </body> </html> التعليقات Comments التعليقات هي أجزاء من الكود البرمجي لا تنفذ عند تشغيل البرنامج وهي تستخدم لشرح وتوثيق الكود وتوضيح عمله للمطورين الآخرين الذين يقرأون هذا الكود، أو لتوضيحها للمبرمج الذي كتبها نفسه فقد ينسى ما كتبه عند العودة لقراءة الكود بعد فترة من الزمن. يمكن كتابة التعليقات في لغة PHP بعدة طرق كما في المثال التالي: // استخدم علامة القوسين المائلين // لبدأ تعليق بسطر واحد // يمكن استخدام العلامة # لكن علامة // أكثر شيوعيا. /* إحاطة نص بالقوس المائل متبوعا بالنجمة بداية وبالنجمة متبوعة بالقوس المائل نهاية يجعل من هذا النص تعليقا متعدد الأسطر */ طباعة الخرج في PHP يمكنك استخدم تعليمة echo أو print لطباعة الخرج أو عرض البيانات المطلوبة على صفحة الويب. print('Hello '); // بدون سطر فاصل "Hello " طباعة استخدام القوسين ( ) اختياري مع تعليمتي echo و print echo "World\n"; // مع سطر فاصل "World" طباعة يجب أن تنتهي كل العبارات في لغة PHP بالفاصلة المنقوطة ";" وأي شيء مكتوب خارج وسوم php?> ستتم طباعته على الشاشة بشكل تلقائي. دورة تطوير تطبيقات الويب باستخدام لغة PHP احترف تطوير النظم الخلفية وتطبيقات الويب من الألف إلى الياء دون الحاجة لخبرة برمجية مسبقة اشترك الآن الأنماط Types والمتغيرات Variables تستخدم المتغيرات في PHP لتخزين وحفظ قيم البيانات، ويمكن أن تخزن هذه المتغيرات قيمًا مختلفة كالأرقام والنصوص والقيم المنطقية. يمكنك التصريحعن المتغيرات في PHP بكتابة الرمز $ يليه مباشرة اسم المتغير، ويجب ان تبدأ أسماء المتغيرات تبدأ بحرف أو تسطيرة سفلية _ يتبعها بأي عدد من الأحرف أو الأرقام أو التسطيرات السفلية. وتكون أسماء المتغيرات حساسة لحالة الأحرف case-sensitive. من أهم أنماط المتغيرات في لغة PHP نذكر: المتغيرات المنطقية Boolean ويملك المتغير من هذا النمط القيمة true أي صحيح أو القيمة false أي خاطئ. $boolean = true; // TRUE أو True $boolean = false; // FALSE أو False الأعداد الصحيحة Integer حيث يملك المتغير من هذا النمط قيمة صحيحة موجبة أو سالبة $int1 = 12; // => 12 $int2 = -12; // => -12 $int3 = 012; // => 10 (البادئة 0 تدل على عدد ثماني) $int4 = 0x0F; // => 15 (0x تدل على رقم ستة عشري) المحارف الصحيحة الثنائية Binary integer literals متاحة اعتبارًا من PHP 5.4.0 وهي تستخدم لتمثيل الأعداد الصحيحة بالنظام الثاني $int5 = 0b11111111; // 255 (0b يدل على عدد ثنائي) الأرقام العائمة Floats أو (المضاعفة doubles) وهي تستخدم لتمثيل الأعداد العشرية $float = 1.234; $float = 1.2e3; $float = 7E-10; لحذف متغير في PHP وتحرير موارد الذاكرة المحجوزة لأجله نستخدم تعليمة unset unset($int1); يمكن إجراء العمليات الحسابية على المتغيرات العددية كما يلي: $sum = 1 + 1; // 2 $difference = 2 - 1; // 1 $product = 2 * 2; // 4 $quotient = 2 / 1; // 2 كما يمكن إجراء العمليات الحسابية المختزلة بالشكل التالي: $number = 0; $number += 1; // بمقدار 1 $number زيادة echo $number++; // (طباعة 1 (الزيادة بعد التقييم echo ++$number; // (طباعة 3 (الزيادة قبل التقييم $number /= $float; // $number قسمة واسناد ناتج القسمة إلى السلاسل النصية Strings وهي تستخدم لتخزين النصوص ويجب أن تكون النصوص محدودة ضمن إشارة تنصيص واحدة ’ من كل جانب كما يلي: $sgl_quotes = '$String'; // => '$String' تجنب استخدام علامات التنصيص المزدوجة إلا في حالة تضمين متغيرات أخرى $dbl_quotes = "This is a $sgl_quotes."; // => 'This is a $String.' تحدد المحارف الخاصة حصريًا باقتباسات مزدوجة $escaped = "This contains a \t tab character."; $unescaped = 'This just contains a slash and a t: \t'; قم بإحاطة المتغيرات بالقوسين المائلين عند الحاجة $apples = "I have {$number} apples to eat."; $oranges = "I have ${number} oranges to eat."; $money = "I have $${number} in the bank."; منذ الإصدار الخامس يمكن استخدام nowdocs في حالة عدة أسطر غير مجمعة $nowdoc = <<<'END' Multi line string END; ستقوم heredocs بتجميع النصوص $heredoc = <<<END Multi line $sgl_quotes END; يتم وصل النصوص أو دمجها باستخدام النقطة "." echo 'This string ' . 'is concatenated'; يمكن تمرير النصوص كبارامتر لـ echo echo 'Multiple', 'Parameters', 'Valid';// 'MultipleParametersValid' يعيد الثوابت في PHP يعرّف الثابت باستخدام ()define ولا يمكن تغيير قيمته خلال فترة التشغيل. ويجب أن تبدأ أسماء الثوابت الصحيحة بحرف أو تسطيرة سفلية, متبوعة بأية حروف أو أرقام أو تسطيرات سفلية. define("FOO", "something"); الوصول إلى المتغير الثابت متاح دون الحاجة الى استخدام الرمز $ echo FOO; // 'something' يعيد echo 'This outputs ' . FOO; // 'This outputs something' يعيد المصفوفات Arrays المصفوفات في PHP هي هياكل بيانات تسمح بتخزين مجموعة من القيم ضمن متغير واحد، وكل المصفوفات في PHP هي مصفوفات مترابطة (تسمى hashmaps في بعض اللغات البرمجية) وتعمل في جميع إصدارات php $associative = array('One' => 1, 'Two' => 2, 'Three' => 3); تم إدخال تركيب قواعدي syntax جديد في PHP 5.4 $associative = ['One' => 1, 'Two' => 2, 'Three' => 3]; echo $associative['One']; // 1 تطبع إضافة عنصر للمصفوفة المترابطة $associative['Four'] = 4; القوائم المحرفية يسند لها مفاتيح صحيحة حكمًا $array = ['One', 'Two', 'Three']; echo $array[0]; // => "One" إضافة عنصر إلى نهاية المصفوفة $array[] = 'Four'; أو array_push($array, 'Five'); حذف عنصر من مصفوفة unset($array[3]); المزيد حول تعلميات الطباعة في PHP echo('Hello World!'); تقوم التعليمة السابقة بطباعة !Hello World على شاشة الاظهار القياسية stdout، وstdout هي صفحة الوب إذا كنت تستخدم متصفحًا print('Hello World!'); // echo مشابه لـ // هي أيضًا من تركيبات اللغة لذلك يمكنك إلغاء الأقواس echo و print echo 'Hello World!'; print 'Hello World!'; $paragraph = 'paragraph'; echo 100; // اطبع المتغيرات العددية مباشرة echo $paragraph; // أو المتغيرات إذا تم إعداد الوسوم القصيرة المفتوحة أو كانت نسخة PHP الخاصة بك 5.4.0 أو أحدث يمكنك استخدام قواعد بناء الجمل القصيرة لـ echo <p><?= $paragraph ?></p> $x = 1; $y = 2; $x = $y; المتغير x$ يحتوي نفس قيمة المتغير y$ $z = &$y; المتغير z$ يحتوي إسناد إلى قيمة y$، وأي تغيير في قيمة z$سيغير قيمة y$ وبالعكس المتغير x$ تبقى قيمته بدون تغيير كقيمة y$ الأصلية echo $x; // => 2 echo $z; // => 2 $y = 0; echo $x; // => 2 echo $z; // => 0 تخرج التفريغات Dumps نوع وقيمة المتحول إلى شاشة العرض القياسية stdout var_dump($z); // int(0) يطبع تطبع التعليمة Print المتغيرات إلى شاشة الإظهار القياسية stdout بصيغة مقروءة للإنسان print_r($array); // Array ( [0] => One [1] => Two [2] => Three ) يطبع العمليات المنطقية $a = 0; $b = '0'; $c = '1'; $d = '1'; يقوم assert بإصدار تنبيه إذا كانت معطياته غير صحيحة وهذه المقارنة ستكون دومًا صحيحة حتى إذا كانت الأنواع مختلفة assert($a == $b); // equality المساواة assert($c != $a); // inequality عدم المساواة assert($c <> $a); // alternative inequality عدم المساواة بشكل بديل assert($a < $c); assert($c > $b); assert($a <= $b); assert($c >= $d); التالي سيكون صحيحًا فقط في حال كانت القيم متساوية ومن نفس النوع assert($c === $d); assert($a !== $d); assert(1 === '1'); assert(1 !== '1'); المشغل `Spaceship` <=> (منذ PHP 7) يعيد 0 إذا كانت القيم على طرفيه متساوية، ويعيد 1 إذا كانت القيمة على اليسار أكبر، ويعيد -1 إذا كانت القيمة على اليمين أكبر $a = 100; $b = 1000; echo $a <=> $a; // النتيجة 0 كونهما متساويين echo $a <=> $b; // $a < $b النتيجة -1 كون echo $b <=> $a; // $b > $aالنتيجة 1 كون يمكن تحويل المتغيرات إلى أنواع مختلفة بحسب استخدامها $integer = 1; echo $integer + $integer; // => 2 $string = '1'; echo $string + $string; // => 2 (تم تحويل النصوص الى أعداد صحيحة) $string = 'one'; echo $string + $string; // => 0 النتيجة 0 لأن المشغل + لا يستطيع موائمة النص `one` الى رقم. موائمة الأنواع Type casting يمكن استخدامها للتعامل مع متغير من نوع معين كنوع آخر. $boolean = (boolean) 1; // => true $zero = 0; $boolean = (boolean) $zero; // => false يوجد أيضًا توابع مخصصة لموائمة أغلب الأنواع $integer = 5; $string = strval($integer); null هي قيمة خالية $var = null; بنى التحكم Control Structures تمكنك بنى التحكم في لغة PHP من التحكم في تنفيذ الكود البرمجي بناءً على شروط معينة أو تكرار تنفيذ جزء من الكود عدة مرات ومن أشهر بنى التحكم المستخدمة في لغة PHP العبارات الشرطية if وعبارات الحلقات مثل for و while وعبارات switch. if (true) { print 'I get printed'; } if (false) { print 'I don\'t'; } else { print 'I get printed'; } if (false) { print 'Does not get printed'; } elseif (true) { print 'Does'; } المشغل الثلاثي ternary print (false ? 'Does not get printed' : 'Does'); بدأ استخدام المشغل الثلاثي المختصر من PHP 5.3 وهو مكافئ لـ "$x ? $x : 'Does'"" $x = false; print($x ?: 'Does'); بدأ مشغّل دمج القيم الفارغة null coalesce operator من php 7 $a = null; $b = 'Does print'; echo $a ?? 'a is not set'; // 'a is not set' تطبع echo $b ?? 'b is not set'; // 'Does print' تطبع $x = 0; if ($x === '0') { print 'Does not print'; } elseif ($x == '1') { print 'Does not print'; } else { print 'Does print'; } القواعد البديلة لبناء الجمل مفيدة لبناء النماذج <?php if ($x): ?> This is displayed if the test is truthy. <?php else: ?> This is displayed otherwise. <?php endif; ?> استخدم التعليمة switch لتوفير كتابة جزء من العمليات المنطقية كما يلي switch ($x) { case '0': print 'Switch does type coercion'; break; // 'two' و'three' وإلا سينتقل الى الحالة break يجب تضمين case 'two': case 'three': // 'two' أو 'three' تساوي $variable قم بعمل شيء ما اذا كانت قيمة break; default: // قم بعمل الاجراء الافتراضي } الحلقات while، do…while، for هي حلقات مألوفة غالبًا وتستخدم لتكرار تنفيذ مجموعة من التعليمات البرمجية كما يلي: $i = 0; while ($i < 5) { echo $i++; } // "01234" اطبع $i = 0; do { echo $i++; } while ($i < 5); // "01234" اطبع for ($x = 0; $x < 10; $x++) { echo $x; } // "0123456789" اطبع $wheels = ['bicycle' => 2, 'car' => 4]; يمكن أن تعمل حلقات foreachعلى المصفوفة بالشكل التالي: foreach ($wheels as $wheel_count) { echo $wheel_count; } // "24"اطبع ويمكنك لحلقة foreach المرور إما عبر المفاتيح أو القيم الخاصة بالمصفوفة foreach ($wheels as $vehicle => $wheel_count) { echo "A $vehicle has $wheel_count wheels"; } $i = 0; while ($i < 5) { if ($i === 3) { break; // while اخرج من حلقة } echo $i++; } // "012" اطبع for ($i = 0; $i < 5; $i++) { if ($i === 3) { continue; // تجاوز هذا التكرار من الحلقة } echo $i; } // "0124" اطبع الدوال Functions الدوال في البرمجة هي مجموعات من الأوامر التي لها اسم محدد وتستخدم لأداء مهمة معينة وهي تساعد في تنظيم واختصار التعليمات البرمجية. ونعرّف الدالة PHP باستخدام الكلمة المفتاحية function function my_function () { return 'Hello'; } echo my_function(); // => "Hello" الاسم المقبول للدالة يجب أن يبدأ بحرف أو تسطيرة سفلية متبوعة بأي عدد من الأحرف ،الأرقام، أو التسطيرات السفلية function add ($x, $y = 1) { // اختيارية وقيمتها الإفتراضية تساوي 1 $y $result = $x + $y; return $result; } echo add(4); // => 5 echo add(4, 2); // => 6 لا يمكن الوصول للمتغير result$ من خارج الدالة واستخدام الأمر ;print $result هنا سيعطي خطأ منذ النسخة PHP 5.3 أصبح من الممكن تعريف دوال مجهولة anonymous functions أي دوال لا تملك اسمًا وتخزن قيمها في متغيرات كما يلي: $inc = function ($x) { return $x + 1; }; echo $inc(2); // => 3 function foo ($x, $y, $z) { echo "$x - $y - $z"; } يمكن للدوال أن تعيد دوالًا أخرى function bar ($x, $y) { // استخدم use لإحضار المتغيرات الخارجية return function ($z) use ($x, $y) { foo($x, $y, $z); }; } $bar = bar('A', 'B'); $bar('C'); // "A - B - C" يطبع يمكنك استدعاء الدوال المسماة named functions باستخدام النصوص $function_name = 'add'; echo $function_name(1, 2); // => 3 وهو هام من أجل تحديد أي دالة يتوجب تشغيلها برمجيًا، أو استخدم الدالة التالية call_user_func (callable $callback [, $parameter [, … ]]); يمكنك الحصول على كل البارمترات الممررّة للدالة function parameters() { $numargs = func_num_args(); if ($numargs > 0) { echo func_get_arg(0) . ' | '; } $args_array = func_get_args(); foreach ($args_array as $key => $arg) { echo $key . ' - ' . $arg . ' | '; } } parameters('Hello', 'World'); // Hello | 0 - Hello | 1 - World | يمكنك الحصول على عدد متغير من المعطيات ابتداء من PHP 5.6 function variable($word, ...$list) { echo $word . " || "; foreach ($list as $item) { echo $item . ' | '; } } variable("Separate", "Hello", "World"); // Separate || Hello | World | التضمين في PHP باستخدام include و require يفيد التضمين في PHP لتضمين محتوى ملف في ملف آخر ويمكن القيام بتضمين ملف في آخر باستخدام include كما يلي: include 'my-file.php'; وبهذا تكون الشفرة ضمن الملف my-file.php متاحة ضمن مجال الرؤية، إذا لم يكن بالإمكان تضمين الملف (على سبيل المثال إذا كان الملف غير موجود ) يظهر تنبيه. include_once 'my-file.php'; إذا كانت شفرة الملف my-file.php متضمنة في مكان أخر ، لن يتم تضمينها ثانية. وهذا يمنع الاخطاء التي تحدث بسبب تكرار التصريح عن الصفوف require 'my-file.php'; require_once 'my-file.php'; تقوم الدالة ()require بنفس عمل ()include إلا أنها ستتسبب بخطأ فادح إذا لم يتمكن من تضمين الملف. محتويات ملف my-include.php <?php return 'Anything you like.'; يمكن الدوال Includes، requires أيضًا أن تعيد قيمة $value = include 'my-include.php'; تضمن الملفات بالاعتماد على المسار المعطى، وإذا لم يحدد المسار يتم اعتماد مسار توجيه الاعداد include_path فإذا لم يتم إيجاد الملف يتم البحث في مسار استدعاء السكريبت ومسار العمل الحالي قبل الاعلان عن الاخفاق الأصناف Classes في PHP الأصناف classes في البرمجة هي أنماط بيانات خاصة تستخدم كقوالب لإنشاء الكائنات objects وتعرف الأصناف في PHP باستخدام العبارة class class MyClass { const MY_CONST = 'value'; // ثابت static $staticVar = 'static'; المتغيرات الثابتة Static ومجال رؤيتها public static $publicStaticVar = 'publicStatic'; يمكن الوصول إليها خلال الصنف فقط private static $privateStaticVar = 'privateStatic'; يمكن الوصول اليها من خلال الصنف والأصناف المشتقة protected static $protectedStaticVar = 'protectedStatic'; يجب تحديد مجال الرؤية للخصائص Properties public $property = 'public'; public $instanceProp; protected $prot = 'protected'; يمكن الوصول إليها من الصنف والأصناف الفرعية private $priv = 'private'; // يمكن الوصول إليها من الصنف فقط قم بإنشاء الباني باستخدام __construct public function __construct($instanceProp) { // $this قم بالوصول إلى متغيرات الحالة باستخدام $this->instanceProp = $instanceProp; } تعرًف الطرق methods كدوال داخل الصنف public function myMethod() { print 'MyClass'; } تجعل الكلمة المفتاحية final الدالة غير قابلة للتحميل الزائد unoverridable final function youCannotOverrideMe() { } الطرق السحرية Magic Methods الطرق السحرية في PHP هي طرق أو وظائف خاصة يبدأ اسمها بشرطة سفلية مزدوجة تسمح لك بإضافة وظائف إلى الأصناف دون الحاجة لتعريف هذه الدوال بشكل صريح. على سبيل المثال الدالة toString__ هي دالة سحرية تستدعى تلقائيًا عند استخدام عمليات أو وظائف معينة تتطلب تحويل الكائن إلى سلسلة نصية public function __toString() { return $property; } ومن الدوال السجرية لدينا دالة الهدم ()destruct__ وهي عكس دالة البناء()construct__ وتستدعى عندما لا تعود هنالك حاجة لأن يكون العنصر مشارًا إليه كمرجع public function __destruct() { print "Destroying"; } الكلمة المفتاحية static في PHP تستخدم الكلمة المفتاحية static في PHP لتعريف خصائص الصنف والطرق على أنها ثابتة وهذا يجعلها قابله للوصول بدون الحاجة إلى إنشاء كائن من الصنف. الخاصية المعرّفة بأنها ثابتة لا يمكن الوصول إليها من العنصر المشتق من الصنف (لكن يمكن ذلك في الطرق الثابتة) public static function myStaticMethod() { print 'I am static'; } ثوابت الصنف Class constants يمكن الوصول إليها دائمًا بشكل ثابت echo MyClass::MY_CONST; // 'value' الخرج; echo MyClass::$staticVar; // 'static' الخرج; MyClass::myStaticMethod(); // 'I am static' الخرج; اشتقاق حالات الأصناف instance باستخدام new $my_class = new MyClass('An instance property'); استخدام القوسين اختياري إذا كنت لا تريد تمرير أيّة معطيات يمكننك الوصول إلى أعضاء الصنف class members باستخدام <- echo $my_class->property; // => "public" echo $my_class->instanceProp; // => "An instance property" $my_class->myMethod(); // => "MyClass" قم بتوسيع الصنف باستخدام extends class MyOtherClass extends MyClass { function printProtectedProperty() { echo $this->prot; } // التحميل الزائد للطرق Override function myMethod() { parent::myMethod(); print ' > MyOtherClass'; } } $my_other_class = new MyOtherClass('Instance prop'); $my_other_class->printProtectedProperty(); // => "protected" يطبع $my_other_class->myMethod(); // "MyClass > MyOtherClass" يطبع final class YouCannotExtendMe { } يمكنك استخدام الطرق السحرية magic methods لإنشاء دوال الجلب أو الإرجاع getters وداول الاسناد setters class MyMapClass { private $property; public function __get($key) { return $this->$key; } public function __set($key, $value) { $this->$key = $value; } } $x = new MyMapClass(); echo $x->property; // __get() سوف تستخدم طريقة $x->property = 'Something'; // __set() سوف تستخدم طريقة يمكن أن تكون الأصناف تجريدية (باستخدام الكلمة المفتاحية abstract) أو واجهات تنفيذ (باستخدام الكلمة المفتاحية implements). الواجهات Interfaces في لغة PHP الواجهات في PHP هي طريقة مجردة لتعريف الكائنات، ويصرح عن الواجهة بالكلمة المفتاحية interface. interface InterfaceOne { public function doSomething(); } interface InterfaceTwo { public function doSomethingElse(); } يمكن أن توسّع الواجهات interface InterfaceThree extends InterfaceTwo { public function doAnotherContract(); } abstract class MyAbstractClass implements InterfaceOne { public $x = 'doSomething'; } class MyConcreteClass extends MyAbstractClass implements InterfaceTwo { public function doSomething() { echo $x; } public function doSomethingElse() { echo 'doSomethingElse'; } } يمكن أن يكون للأصناف أكثر من واجهة واحدة class SomeOtherClass implements InterfaceOne, InterfaceTwo { public function doSomething() { echo 'doSomething'; } public function doSomethingElse() { echo 'doSomethingElse'; } } السمات Traits trait هي ميزة تستخدم للسماح بإعادة استخدام مجموعة من الوظائف داخل الأصناف ويمكنك اعتبارها بمثابة طريقة لتضمين سلوك مشترك بين الأصناف وهي ميزة متوفره بدءًا من النسخة PHP 5.4.0 ويصرّح عنها باستخدام trait trait MyTrait { public function myTraitMethod() { print 'I have MyTrait'; } } class MyTraitfulClass { use MyTrait; } $cls = new MyTraitfulClass(); $cls->myTraitMethod(); // Prints "I have MyTrait" فضاءات الأسماء Namespaces في PHP تستخدم فضاءات الأسماء في PHP لتنظيم الشيفرة وتجنب تعارض أسماء الأصناف والوظائف والمتغيرات فهي تجمع العناصر ضمن في مجموعات أو مساحات لها نفس الاسم لتميزها عن غيرها وللقيام بذلك نكتب namespace كأول عبارة في الملف. دعونا نتظاهر بأن هذا ليس هو الحال <?php افتراضيًا, توجد الأصناف في namespace عام, ويمكن أن تستدعى صراحة بـ backslash $cls = new \MyClass(); ضبط namespace لملف namespace My\Namespace; class MyClass { } من ملف آخر $cls = new My\Namespace\MyClass; أو من داخل namespace آخر namespace My\Other\Namespace; use My\Namespace\MyClass; $cls = new MyClass(); أو يمكنك استبدال namespace باسم مستعار namespace My\Other\Namespace; use My\Namespace as SomeOtherNamespace; $cls = new SomeOtherNamespace\MyClass(); الربط الساكن المتأخر Late Static Binding class ParentClass { public static function who() { echo "I'm a " . __CLASS__ . "\n"; } public static function test() { // على الصف الذي عُرّف التابع ضمنه self تؤشر self::who(); // على الصف الذي استدعي التابع منه static تؤشر static::who(); } } ParentClass::test(); /* ParentClass أنا ParentClass أنا */ class ChildClass extends ParentClass { public static function who() { echo "But I'm " . __CLASS__ . "\n"; } } ChildClass::test(); /* ParentClass أنا ChildClass ولكن أنا */ الثوابت السحرية Magic constants الثوابت السحرية هي ثوابت معرفة مسبقًا في PHP يبدأ اسمها وينتهي بشرطتين سفليتين ولها استخداماات مختلفة، على سبيل المثال للحصول على اسم الصنف الحالي نستخدم الثابت السحري __CLASS__ داخل تصريح الصنف كما يلي: echo "Current class name is " . __CLASS__; وللحصول على مسار الدليل الكامل لملف نستخدم __DIR__ echo "Current directory is " . __DIR__; الاستخدام النموذجي require __DIR__ . '/vendor/autoload.php'; الحصول على المسار الكامل للملف echo "Current file path is " . __FILE__; الحصول على اسم الدالة الحالية echo "Current function name is " . __FUNCTION__; الحصول على رقم السطر الحالي echo "Current line number is " . __LINE__; الحصول على اسم الطريقة الحالية. يرجع قيمة فقط عندما يستخدم داخل تصريح سمة أو كائن echo "Current method is " . __METHOD__; الحصول على اسم namespace الحالي echo "Current namespace is " . __NAMESPACE__; الحصول على اسم السمة الحالية. ترجع قيمة فقط عندما تستخدم داخل التصريح عن السمة أو الكائن. echo "Current trait is " . __TRAIT__; معالجة الأخطاء Error Handling في PHP يمكن أن تتم معالجة أخطاء بسيطة باستخدام كتلة try catch try { // افعل شيء ما } catch (Exception $e) { // معالجة استثناء } عند استخدام كتلة try catch في بيئة namespace استخدم التالي try { // افعل شيء ما } catch (\Exception $e) { // معالجة استثناء } استثناءات مخصّصة class MyException extends Exception {} try { $condition = true; if ($condition) { throw new MyException('Something just happened'); } } catch (MyException $e) { // معالجة استثنائية } ترجمة -وبتصرّف- للمقال Learn PHP in Y Minutes
    2 نقاط
  37. قدّمنا في الدرس السابق جافاسكريبت وذكرنا تموضعها في الوِب بالنسبة لـHTML وCSS، كما تحدّثنا عن واجهات برمجة التطبيقات الخاصّة بالمتصفّح وتلك القادمة من طرف ثالث. سنبدأ في هذا الجزء من الدرس النظر في بعض التعليمات البرمجية، وأثناء ذلك، يمكنك استكشاف ما يحدث فعليًا عند تشغيل شفرة جافاسكريبت في صفحتك. ما الذي تفعله جافاسكريبت على صفحتك؟ لنلخص بإيجاز قصة ما يحدث عند تنزيل صفحة وِب في المتصفح. عندما يُنزّل المتصفّح الشفرة التي كتبتها، والمكوّنة من وسوم HTML، أنماط CSS وتعليمات جافاسكريبت فإنه يشغّلها داخل بيئة تنفيذ (علامة تبويب Tab في المتصفح). تشبه هذه العملية المصنع الذي يأخذ المواد الخام (الشفرة) ويُخرج المنتح (صفحة وِب). يُنفّذ معالج جافاسكريبت JavaScript engine الموجود في المتصفّح تعليمات جافاسكريبت بعد أن تُجمَّع HTML وCSS وتوضعان في صفحة وِب. يضمن انتظار التجميع أنّ بنية الصفحة وتنسيقها موجودان بالفعل عند بدء تشغيل جافاسكريبت، أي أنه عند تشغيل جافاسكريبت تكون جميع تعليمات HTML وCSS موجودة ونفّذها المتصفّح. يعدّ هذا الأمر جيّدًا، إذ أن استخدام جافاسكريبت الشائع هو تعديل HTML و CSS ديناميكًيا لتحديث واجهة المستخدم، من خلال واجهة برمجة التطبيقات DOM التي تحدّثنا عنها في الدرس السابق؛ فإن نُزِّلت تعليمات جافاسكريبت وحاول المتصفّح تشغيلها قبل أن يكون هناك HTML و CSS فستحدث أخطاء. أمان المتصفح تعدّ كل علامة تبويب Tab في المتصفح دلوًا منفصلًا لتشغيل الشفرة (تسمى هذه الدلاء “بيئات التنفيذ” Execution environments من الناحية التقنية). يعني هذا أنه في معظم الحالات تُشغَّل الشفرة في كل علامة تبويب منفصلة عن الشفرات في بقية التبويبات، ولا يمكن للتعليمات البرمجية في علامة تبويب واحدة أن تؤثر مباشرة على التعليمات البرمجية في علامة تبويب أخرى - أو على موقع وِب آخر. هذا إجراء أمني جيد. لو لم يكن هذا هو الحال، لكان بإمكان القراصنة كتابة صفحات وِب مهمّتها سرقة المعلومات من المواقع الأخرى التي يزورها المتصفّح، وغيرها من هذه الأشياء السيئة. ملاحظة: هناك طرق لإرسال التعليمات البرمجية والبيانات بين مواقع وِب / علامات تبويب مختلفة بطريقة آمنة، ولكن هذه تقنيات متقدمة لن نغطيها في هذا الدرس. جافاسكريبت قيد التشغيل عندما يواجه المتصفح كتلة تعليمات برمجية من جافاسكريبت، فإنه يعمل بالترتيب، من أعلى إلى أسفل. وهذا يعني أنك تحتاج إلى توخي الحذر في الترتيب الذي تضعه فيه. على سبيل المثال، في شفرة جافاسكريبت التي شاهدناها في المثال الأول: var para = document.querySelector('p'); para.addEventListener('click', updateName); function updateName() { var name = prompt('Enter a new name'); para.textContent = 'Player 1: ' + name; } قمنا باختيار فقرة نصية (السطر 1)، ثم استدعينا مستمع الحدث Event listener بتطبيق التابعaddEventListener على الفقرة النصية المُخزَّنة في المتغيّر para (السطر 3)؛ لذا عندما يُنقر على النص تُشغَّل كتلة التعليمات البرمجية في الدالة updateName(). تُسمّى كُتلة التعليمات البرمجية القابلة لإعادة الاستخدام باستدعاء اسمها “وظائف” أو “دوال” Functions. يُطلب من المستخدم اسم جديد ثم يُدرَج هذا الاسم في الفقرة لتحديث العرض. إذا بدّلت ترتيب أول سطرين من التعليمات البرمجية، فإن الشفرة البرمجية لن تعمل . ستحصُل بدلا من ذلك خطأ في وحدة تحكم المتصفح الخاصة بالمطورين Console: -TypeError: para is undefined. وهذا يعني أن الكائن para غير موجود بعد، لذلك لا يمكننا إضافة مستمع الحدث إليه. ملاحظة: هذا خطأ شائع جدًا. يجب أن تكون حذرًا أن الكائنات Objects المشار إليها في التعليمات البرمجية موجودة قبل محاولة استخدامها. الفرق بين التعليمات البرمجية المفسَّرة Interpreted و المُترجَمة Compiled لابد وأنك سمعت في سياق البرمجة بمصطلحيْ التفسير Interpretation و الترجمة Compilation. جافاسكريبت هي لغة مفسَّرة. تُشغَّل تعليمات جافاسكريبت البرمجية من أعلى إلى أسفل وتُرجَع نتيجة تشغيل التعليمات البرمجية على الفور. لست بحاجة لتحويل التعليمات البرمجية إلى شكل مختلف قبل أن يقوم المتصفح بتشغيلها. من ناحية أخرى، تُحوَّل الشفرة البرمجية للغات المترجمة إلى شكل آخر قبل أن يشغّلها الحاسوب. على سبيل المثال تُجمَّع C / C ++ في لغة Assembly التي يُشغّلها الحاسوب. لكلّ من المنهجيْن ميزات، لكنّها خارج نطاق هذا الدرس. جانب الخادوم Server Side و جانب العميل Client Side لابد وأنك سمعت بمصطلحي من جانب الخادوم وجانب العميل، خاصة في سياق تطوير الوِب: الشفرة من جانب العميل Client side هي شفرة تُشغَّل على حاسوب المستخدم. يُنزّل العميل التعليمات البرمجية التي ينفّذها المتصفّح ليعرض صفحة الوٍب. سنتحدّث في هذا الدرس عن جافاسكريبت من جانب العميل. من ناحية أخرى تُنفَّذ شفرة جانب الخادوم على الخادوم، ثم تُرسَل نتيجة التنفيذ إلى المتصفّح ليعرضها. مثال على لغات الوِب الشائعة من جانب الخادوم PHP وبايثون وروبي و ASP.NET. وجافاسكريبت! يمكن أيضا استخدام جافاسكريبت كلغة من جانب الخادوم، على سبيل المثال في بيئة Node.js الشائعة. يُستخدم مصطلح ديناميكي Dynamic لوصف كل من جافاسكريبت من جانب العميل واللغات من جانب الخادوم. تشير كلمة ديناميكي إلى القدرة على تحديث عرض صفحة الوِب أو التطبيق لإظهار أشياء مختلفة في ظروف مختلفة، وتوليد محتوى جديد حسب الطلب. تُنشِئ الشفرة من جانب الخادوم ديناميكيا محتوى جديدًا على الخادوم، سحب بيانات من قاعدة بيانات على سبيل المثال؛ في حين أن جافاسكريبت من جانب العميل تُنشِئ ديناميكيا محتوى جديدًا داخل المتصفح (العميل)، على سبيل المثال إنشاء جدول HTML جديد، وإدراج البيانات المطلوبة من الخادوم في ذلك الجدول، ثم عرض الجدول في صفحة وِب للمستخدم. يعمل المنهجان معًا عادة. يشار إلى صفحة الوِب التي لا يوجد بها محتوى ديناميكي بأنها ثابتة Static، حيث يظهر دائما نفس المحتوى بغضّ النظر عن الزائر. كيف تضيف جافاسكريبت إلى صفحتك؟ يتم تطبيق جافاسكريبت على صفحة HTML بطريقة مشابهة لـ CSS. في حين تستخدم CSS عناصر <link> لتطبيق الأنماط الخارجية وعناصر <style> لتطبيق الأنماط الداخلية على HTML، تحتاج جافاسكريبت إلى صديق واحد فقط في عالم HTML، العنصر <script>. دعونا نتعلم كيفية العمل. جافاسكريبت داخلي أنشئ مستند HTML بالمحتوى التالي <!DOCTYPE html> <html lang="ar" dir="rtl"> <head> <title>مثال تطبيقي لجافاسكريبت</title> </head> <body> <button>انقر هنا</button> </body> </html> </html> استعرض الملف في متصفح الوِب وفي محرر النصوص. سترى أن HTML أنشأت صفحة وِب بسيطة تحتوي على زر قابل للنقر. بعد ذلك، انتقل إلى محرر النصوص وأضف ما يلي مباشرة قبل وسم الإغلاق <body/>: <script> // سنضع تعليمات جافاسكريبت هنا </script> سنضيف الآن بعض جافاسكريبت داخل عنصر <script> لجعل الصفحة تفعل شيئا أكثر إثارة للاهتمام. أضف الشفرة التالية أسفل السطر // سنضع تعليمات جافاسكريبت هنا مباشرة: function createParagraph() { var para = document.createElement('p'); para.textContent = 'لقد نقرت على الزرّ!'; document.body.appendChild(para); } var buttons = document.querySelectorAll('button'); for (var i = 0; i < buttons.length ; i++) { buttons[i].addEventListener('click', createParagraph); } احفظ الملف في محرّر النصوص ثم حدّث الصفحة على المتصفح. يجب أن الآن أن تظهر فقرة جديدة أسفل الزّر عند النقر عليه. ملاحظة: إذا لم يعمل المثال الخاص بك، راجع الخطوات مرة أخرى وتحقق من أنك فعلت كل شيء بشكل صحيح. هل حفظت الملف بامتداد html (مثلا lesson1.html)؟ هل أضفت العنصر <script> بعد علامة <body/> مباشرة؟ هل أدخلت جافاسكريبت تماما كما هو موضح؟ جافاسكريبت حساسة لحالة الأحرف +(صغيرة Lowercase أو كبيرة Uppercase)، لذلك تحتاج إلى إدخال الشفرة تماما كما هو مبين، وإلا فلن تعمل. جافاسكريبت خارجي ماذا لو أردنا وضع جافاسكريبت لدينا في ملف خارجي؟ دعونا نستكشف هذا الآن. أولا، أنشئ ملفًا جديدا في نفس المجلّد الذي يوجد به ملف HTML وسمّه script.js. تأكد من أنه يحتوي على امتداد اسم الملفjs، وهذه هي الطريقة التي يُتعرَّف بها على أننا أمام ملف يحوي شفرات برمجية مكتوبة بجافاسكريبت. بعد ذلك، انسخ كل النص البرمجي من الوسم <script> في ملف HTML (تلك التعليمات الموجودة في الخطوة 4 من الفقرة السابقة) وألصقه في الملف script.js ثم احفظ هذا الملف. الآن استبدل العنصر الحالي <script> بما يلي. <script src="script.js"></script> يصبح محتوى الملف HTML على النحو التالي: <!DOCTYPE html> <html lang="ar" dir="rtl"> <head> <title>مثال تطبيقي لجافاسكريبت</title> </head> <body> <button>انقر هنا</button> <script src="script.js"></script> </body> </html> احفظ الملفّ ثم حدّث صفحة الوِب في المتصفح. ويجب أن تحصُل على نفس النتيجة تمامًا! ولكن الآن لدينا جافاسكريبت في ملف خارجي. يعدّ هذا عموما أمرا جيّدًا من حيث تنظيم التعليمات البرمجية الخاصة بك، وجعلها قابلة لإعادة الاستخدام عبر ملفات HTML متعددة. بالإضافة إلى HTML تصبح أسهل للقراءة دون وجود قطع ضخمة من السكربت ملقاة فيها. شفرات جافاسكريبت المضمنة في وسوم HTML تُكتَب شفرة جافاسكريبت أحيانا داخل HTML على النحو التالي: function createParagraph() { var para = document.createElement('p'); para.textContent = 'You clicked the button!'; document.body.appendChild(para); } <button onclick="createParagraph()">Click me!</button> استعرض المثال على Jsfiddle لهذا العرض التوضيحي نفس الوظائف التي عرضناها في الحالتيْن أعلاه، إلا أن عنصر <button> يتضمن خاصيّة onclick مضمنة لتشغيل وظيفة الدالة عند الضغط على زر. رجاءً لا تضمّن شفرات جافاسكريبت في وسوم HTML فهذه الطريقة من الممارسات السيئة (خلط HTML مع جافاسكريبت)، كما أنها غير فعالة لأن عليك أن تدرج الخاصيّة onclick="createParagraph()" على كل زر تريد تطبيق جافاسكريبت عليه. أما باستخدام شفرة جافاسكريبت منفصلة عن HTML فيمكنك تحديد كافة الأزرار باستخدام تعليمة واحدة. الشفرة التي استخدمناها أعلاه لهذا الغرض تبدو كما يلي: var buttons = document.querySelectorAll('button'); for (var i = 0; i < buttons.length ; i++) { buttons[i].addEventListener('click', createParagraph); } قد يبدو هذا الأمر أطول قليلا من الخاصيّة onclick، ولكنه سيعمل على جميع الأزرار بغض النظر عن عدد الأزرار الموجودة في الصفحة وعدد العناصر التي أُضيفت أو أزيلت، فلا يلزم تغيير جافاسكريبت. ملاحظة: جرب تعديل ملف HTML وإضافة بضعة أزرار أخرى في الملف. عند إعادة التحميل، يجب أن تجد أن جميع الأزرار عند النقر عليها سوف تُظهر فقرة. هذا رائع أليس كذلك؟ التعليقات Comments كما هو الحال مع HTML و CSS، يمكنك كتابة تعليقات في شفرة جافاسكريبت وسيتجاهلها المتصفح. تُستخدم التعليقات لتقديم توضيحات لزملائك المطورين عن كيفية عمل الشفرة، كذلك تمثل مرجعًا لك عن التعليمات البرمجية التي كتبتها عندما تعود مثلًا بعد 6 أشهر لتتذكر مالذي فعلته. التعليقات مفيدة جدًا، ويجب عليك استخدامها في كثير من الأحيان، وخاصة بالنسبة للتطبيقات الكبيرة. هناك نوعان من التعليقات: تعليقات من سطر واحد، وتُكتَب بعد عموديْن مائليْن؛ مثلا: // هذا تعليق تعليق متعدّد الأسطر. يُكتَب بين المحارف / * و * / على النحو التالي: /* هذا تعليق هو الآخر */ تطبيق التعليقات على تعليمات جافاسكريبت السابقة: // دالة تنشئ فقرة جديدة وتضيفها إلى نهاية متن الصفحة function createParagraph() { var para = document.createElement('p'); para.textContent = 'You clicked the button!'; document.body.appendChild(para); } /* 1. نحصُل على مراجع بجميع الأزرار الموجودة في الصفحة ونضعها في مصفوفة 2. نمرّ على جميع الأزرار ونضيف إلى كلّ منها مستمعًا لحدث النقر تُنفَّذ الدالة ()createParagraph عندما ينقر على زرّ في الصفحة. */ var buttons = document.querySelectorAll('button'); for (var i = 0; i < buttons.length ; i++) { buttons[i].addEventListener('click', createParagraph); } كانت هذه خطوتك الأولى في عالم جافاسكريبت. لقد بدأنا بالمفاهيم النظرية فقط لجعلك تفهم لماذا تُستخدم جافاسكربت وما الأشياء التي يمكنك القيام بها باستخدام هذه اللغة. تعرّفت في هذا المقال على بضعة أمثلة من التعليمات البرمجية وتعلّمت كيفية تتفاهم لغةُ جافاسكريبت مع بقية التعليمات البرمجية على موقع الوِب. قد تبدو الآن جافاسكريبت شاقة بعض الشيء، ولكن لا تقلق - في هذه السلسلة من الدروس سوف نأخذك في خطوات بسيطة تمكّنك من المضي قدمًا في عالم جافاسكربت. ترجمة - بتصرف - للمقال What is JavaScript? الذي اشترك في كتابته مساهمو موزيللا.
    2 نقاط
  38. تُقدّم هذه المقالة مجموعةً من الأسئلة والأجوبة المتقدمة حول تخصص الذكاء الاصطناعي Artificial Intelligence. تشمل الأسئلة موضوعات عديدة مثل تأثير استخدام تقنيات الذكاء الاصطناعي وتعلّم الآلة Machine Learning، واستراتيجيات التعامل مع نماذج اللغة الكبيرة Large language models، ورؤى حول التطبيقات المستقبليّة للذكاء الاصطناعي. طُرحت هذه الأسئلة على مهندس ذكاء اصطناعي، ونظمت إجاباتها ضمن فقرات هذا المقال، ونرجو أن تقدم لكم المعرفة التي تفيدهم حول هذا التخصص الرائد. أسئلة حول التأثير الحالي والمستقبلي للذكاء الاصطناعي هناك العديد من الأسئلة التي تطرح نفسها حول التأثير الحالي والمستقبلي للذكاء الاصطناعي في العديد من المجالات والقطاعات. إليك أهم هذه الأسئلة وإجاباتها. ما هي التطبيقات والفوائد الجوهريّة للذكاء الاصطناعي في مجال الرعاية الصحية؟ يستخدم الذكاء الاصطناعي في العديد من التطبيقات ويعد الذكاء الاصطناعي جزءًا أساسيًّا في قطاع الرعاية الصحية في وقتنا الراهن، وهناك تمويل جيد لتعزيز تطبيق الذكاء الاصطناعي في هذا القطاع بهدف تطويره وتحسينه. ولعل أكثر الاتجاهات البحثية المثيرة للاهتمام المُتعلقة بهذا المجال هو استخدام تقنيات التعلّم العميق Deep Learning لاكتشاف الأدوية المناسبة (مثل اكتشاف المُركبات الدوائية ذات الخصائص المضادة لبكتيريا محددة) وسيعود بفوائد كبيرة لقطاع الرعاية الصحيّة، ويُعتقد أنها ستعطي دفعة كبيرة لمستقبل البشرية. لكن من ناحيةٍ أخرى، فإن أحد المخاوف المرتبطة باستخدام تقنيات الذكاء الاصطناعي في مجال الطب والرعاية الصحية هو بطء وتيرة إجراءات الموافقة القانونيّة على استخدام هكذا تقنيات، والتأخر في صياغة ووضع اللوائح التنظيميّة والقواعد ذات الصلة، مقارنًة بوتيرة التقدّم السريع للذكاء الاصطناعي. ماهي حدود قدرات التحليلات التنبؤية التي تُقدّمها أنظمة الذكاء الاصطناعي وما أفضل خوارزميات التحليل التنبؤي؟ قد يعتقد البعض أن بإمكان تقنيات الذكاء الاصطناعي الحاليّة أن تتنبأ بأي شيء تريده لكن هذا غير صحيح إطلاقًا في الوقت الحالي. فقدرة الذكاء الاصطناعي على التنبؤ تعتمد على عدة عوامل، مثل توفر البيانات الضرورية والملائمة للمهمة التي يُراد التنبؤ بها، ودرجة تعقيد المهمة فبعض المهام أكثر تعقيدًا وصعوبة من غيرها وجودة وفعالية النموذج المستخدم للتنبؤ. فإذا لم يكن النموذج جيدًا أو لم يتم تدريبه بشكل كافٍ، سيكون التنبؤ غير دقيق. بالنسبة للشق الثاني من السؤال والمتعلّق بأفضل خوارزميات الذكاء الاصطناعي، فالعديد من الخبراء يميلون إلى استخدام خوارزميات الشبكات العصبيّة Neural Networks في وقتنا الحالي، وهي خوارزميات مفيدة لكنها ليست بالضرورة هي الخيار الأفضل لكل المهام مثل حالات تحليل الانحدار Regression analysis التي تركز على توقع القيم المستقبلية استنادًا إلى العلاقات الإحصائية بين المتغيرات، أو الحالات التي تكون فيها البيانات مُنظّمة في جداول، في هذه الحالة تكون خوارزميات أشجار القرار Decision Trees وخوارزميات الغابات العشوائية Random Forests أنسب منها. كيف يمكن أن تحسن تقنيات الذكاء الاصطناعي مثل معالجة اللغة الطبيعية والرؤية الحاسوبيّة محركات البحث؟ تُطرَحُ تساؤلات عديدة حول تأثير تقنيات معالجة اللغة الطبيعية ونماذج اللغة الكبيرة مثل ChatGPT على سيو SEO محركات البحث، فهو موضوع يثير اهتمام العديد من الأشخاص والشركات، إذ يمكن أن يؤثر استخدام التقنيات الذكية في إنتاج المحتوى على أداء مواقع الويب في نتائج محركات البحث. ويُتوقّع أن الأفراد والشركات بعيدي النظر والذين يفهمون كيف تُدار الأعمال، سيعتمدون على استخدام تقنيات معالجة اللغة الطبيعية ونماذج اللغة الكبيرة والتحليلات الإحصائية المُعتمدة على الذكاء الاصطناعي في العديد من المهام مثل تحليل السوق ومراقبة وتحليل المنافسين، ويُعتقد أن هذه الأدوات والممارسات ستصبح مُنتشرة في المستقبل وستكون متاحة للجميع. هل من المتوقّع أن تُحدث شريحة الذكاء الاصطناعي التي كشفت عنها شركة AMD ثورةً في مجال الحوسبة؟ توفر شريحة AMD على معالجة البيانات بسرعة فائقة ويتوقع أن تكون مثالية لتطبيقات الذكاء الاصطناعي، لكن لا نمتلك حاليًا بيانات كافية لتحديد ما إذا كانت هذه الشريحة ستُحدث ثورة حقيقية في الحوسبة أم لا. لكنها بالتأكيد ستخلق جوًا من المنافسة بين الشركات التي تطوّر شرائح خاصة لمهام الذكاء الاصطناعي. ما هي أهمية تعلم المواضيع الأساسيّة في الذكاء الاصطناعي للجيل القادم؟ لقد أحدثت التطورات الأخيرة في الذكاء الاصطناعي ضجة كبيرة، وكثر الحديث عن أنها ستُغيّر شكل الصناعات وحياتنا عمومًا، وكما يبدو فالذكاء الصناعي قادر على ذلك وهو موجود ليبقى. لذا فنحن بحاجة فعلًا إلى تدريس أساسيات الذكاء الاصطناعي لطلاب الثانويّة وحتى الطلاب الأصغر سنًا، وأحد أهم المواضيع التي يجب أن تُدرّس، هي أن الذكاء الاصطناعي ليس سحرًا ولا يملك وعيًا، إنّه ببساطة علم يعتمد على الرياضيات وتكمن أهمية تعليم أدوات الذكاء الاصطناعي للجيل القادم، بأنه سيُمهّد الطريق لهم، ويعزّز رغبتهم بالانخراط في هذا العلم، ويجعلهم أكثر وعيًا بحقيقته، وما يمكنه ولا يمكنه فعله، فالإنسان يخاف مما يجهله بل هو عدو ما يجهله كما يقول المثل. كيف يمكن الاستفادة من الذكاء الاصطناعي والتعلم الآلي ونماذج اللغة الكبيرة في تطوير التطبيقات من الضروري لك لمطوّر ليس لديه خبرة في نظريات الذكاء الاصطناعي وتعلّم الآلة، البدء باستخدام هذه التقنيات في عمليات تطوير المنتجات، هناك أدوات سهلة الاستخادم وعالية المستوى تُغلّف كل التفاصيل البرمجية المُعقدة لكن يفضل أن يعتمد المطور عليها في بداية رحلته (لاحقًا نعم، لكن في البداية لابد أن تعرف كواليس تلك الأدوات والتنفيذات). أما إذا لم يكن هناك الوقت الكافي أو أن المرء لايرى شغفًا في الذكاء الاصطناعي أو التعلّم الآلي، فإن الأدوات الجاهزة عالية المستوى فكرة رائعة. كما تجدر الإشارة إلى أنه في الآونة الأخيرة حدث تطوّر كبير في أدوات الذكاء الاصطناعي، وهذا يجعل عمليّة التعلّم أصعب بالتأكيد، وفي نفس الوقت يجعل فكرة استخدام الأدوات الجاهزة أسهل. باختصار، اختر معاركك بحكمة. هل من الممكن تحسين نموذج لغة كبير LLM ليجيب على الأسئلة في الزمن الحقيقي؟ نعم بالتأكيد هناك إمكانية للتحسين. فالنماذج اللغوية الكبيرة هي نماذج معقدة تجري ضمنها العديد من العمليات الحسابيّة قبل إعطاء الخرج أو التنبؤ، وهذا مايترتب عليه تأخيرًا في الاستجابة، ويزداد هذا التأخير كلما زاد حجم النموذج أو الموارد اللازمة لتشغيل هذا النموذج (مثل وحدات معالجة الرسومات GPUs). كيف يمكن نشر النماذج اللغوية في بيئة الإنتاج؟ بالنسبة لشخص يريد نشر نموذج لغة كبير LLM لأغراض الإنتاج. قد تتضمّن خطة النشر إنشاء واجهة برمجة تطبيقات باستخدام FastAPI ونشرها إما على Hugging Face أو منصة سحابية أخرى. العامل المركزي المؤثر على القرار هو الميزانية المخصصة للمشروع. إذا كانت الميزانيّة كبيرة نسبيًّا يمكنك شراء وحدات GPUs باهظة الثمن من Amazon Web Services، وبالتالي ضمان أداء عالي المستوى. أما إذا كانت الميزانيّة التي لديك محدودة فربما استخدام FastAPI (إطار ويب سريع لبناء واجهات برمجة التطبيقات) ونموذج لغة أقل تعقيدًا مثل بيرت BERT سيكون خيارًا أقل كلفة، ولاسيما مع إمكانية تشغيله على وحدة المعالجة المركزية CPU بدلاً من GPU. أسئلة حول تطوير المهارات وتعلّم تطوير الذكاء الاصطناعي يطرح المهتمون يتطوير تطبيقات ذكية الكثير من التساؤلات حول المهارات الأساسية التي يحتاجون إليها لمواكبة التطورات ودمج تقنيات الذكاء الاصطناعي في تطبيقاتهم، نسلط الضوء في فقراتنا التالية على أهم هذه الأسئلة. ما هي المهارات الأساسية التي يجب أن يكتسبها المطوّر لينافس في ظل تطور الذكاء الاصطناعي؟ في ظل ظهور نماذج اللغات الكبيرة LLMs القادرة على كتابة التعليمات البرمجية تظهر مخاوف عديدة حول إمكانية الاستغناء عن المطورين والمبرمجين لكننا في الواقع لم نصل بعد إلى هذه النقطة حاليًا ولا يُتوقع أن الذكاء الاصطناعي سوف يتفوق في أمور مثل التعامل مع المواقف أو الظروف غير العادية أو غير النمطيّة أو متطلبات وتفضيلات المُستخدم الخاصة (على الرغم من أن هذا قد يحدث خلال السنوات العشر إلى الخمس عشرة القادمة). لذا يُنصح بتعلم كيفية استخدام الذكاء الاصطناعي التوليدي، فمن شأنه توفير الوقت والجهد في كتابة التعليمات البرمجية، وتوفير قدراتنا العقلية لإجراء مهام مثل التأكد من أن التعليمات البرمجية تعمل على النحو المنشود في السيناريوهات العملية المختلفة. بالتالي بدلاً من قضاء 40 ساعة في تطوير برنامج واحد، يمكن أن نعمل على تطوير 10 برامج في نفس المدة. ما هي الدورات والمهارات اللازم تعلّمها للانتقال إلى مجال تطوير نماذج اللغات الكبيرة؟ بالنسبة لشخص لديه معلومات حول أساسيات الذكاء الصناعي، يجب بدايةً التركيّز على أساسيات معالجة اللغة الطبيعيّة NLP، ثم الخوض واستكشاف النماذج اللغوية الكبيرة عبر منصات التعلّم عبر الإنترنت لفهم الأمور الأساسيّة المتعلّقة بها مثل التضمينات Embeddings والمحوّلات Transformers، ثم الانتقال إلى مكتبة HuggingFace والتعرّف عليها وعلى كيفيّة استخدام نماذج اللغة من خلالها، وهذا يفترض أن يكون أكثر سهولة بالنسبة لشخص لديه خلفية في الذكاء الصناعي ومكتباته. ماهي المصادر أو الأدوات أو أطر العمل أو المشاريع النموذجية لمهندسي الذكاء الاصطناعي؟ يقترح الخبراء أمرين رئيسيين غالبًا؛ الأمر الأول هو الدورات عبر الإنترنت التي توفّر لك مواردًا متنوعةً وقيّمة، أو في حال كنت جديدًا على مجال الذكاء الاصطناعي وعلوم البيانات.الأمر الثاني هو المشاركة في ورش العمل فهي تعمل على صقل ماتعلمته من خلال البدء في بناء وتجربة نماذج التعلّم الآلي والذكاء الاصطناعي. الخلاصة وصلنا لختام هذا المقال الذي أجبنا فيه على أبرز أسئلة الذكاء الاصطناعي، واستكشفنا فيه أهمية تعلم الذكاء الاصطناعي وأبرز المهارات الواجب تعلمها للتخصص في مجال الذكاء الاصطناعي ومصادر مفيدة لتعلم استخدام نماذج اللغات الكبيرة LLMs في التطبيقات المختلفة. هل لديك أي سؤال آخر وتود معرفته حول تخصص الذكاء الاصطناعي، لا تتردد في طرحه في قسم النقاش أسفل المقال. ترجمة -وبتصرُّف- للمقال Ask an AI Engineer: Trending Questions About Artificial Intelligence لصاحبه Joao Diogo de Oliveira. اقرأ أيضًا مدخل إلى الذكاء الاصطناعي وتعلم الآلة. تعلم الآلة Machine Learning - الذكاء الاصطناعي. عشرة مشاريع عملية عن الذكاء الاصطناعي. أدوات برمجة نماذج تعلم الآلة.
    1 نقطة
  39. إذا كنت مهتمًا لأن تصبح مهندس برمجيات وتتساءل عن طبيعة عمل مهندس البرمجيات وعن المهام التي ستوكل إليك عند العمل في هذه الوظيفة في شركة ما، وهل راتب مهندس البرمجيات مجزي أم لا ويتناسب مع الجهد المبذول، ففي مقال اليوم سنجيبك على كل هذه التساؤلات ونساعدك في معرفة أهم التقنيات والمتطلبات التي عليك تعلمها كي تصبح مهندس برمجيات محترف ونضع لك قائمة بأهم مصادر تعلمها. من هو مهندس البرمجيات مهندس البرمجيات هو المبرمج الذي يطبق مبادئ الهندسة في عملية تصميم وتطوير البرمجيات، فهو شخص خبير يمتلك معرفة دقيقة بأنواع البرمجيات المختلفة مثل برامج النظام والبرامج التطبيقية ويعرف الكثير من لغات البرمجة والتقنيات الرقمية. كما يعرف مهندس البرمجيات كيف يحدد احتياجات مستخدمي البرامج والتطبيقات بدقة وكيف يصفها ويعبر عنها بشكل واضح ومفهوم ويقسمها لمهام متعددة لتنفيذها وفق خطوات محددة ومنظمة، فهو يطور هذه البرمجيات خلال مراحل متخلفة وباتباع منهجيات محددة لتطوير البرمجيات مثل منهجية الشلال Waterfall أو منهجية أجايل Agile ويطبق المبادئ الهندسية في كل مرحلة من هذه المراحل للحصول على برمجيات عالية الأداء تلبي المتطلبات. الفرق بين المبرمج ومهندس البرمجيات؟ انتبه فليس كل مبرمج أو مطور تطبيقات هو مهندس برمجيات، وعلى الرغم من أن مصطلحات مثل مطور ومبرمج ومهندس برمجيات تستخدم في كثير من الأحيان للدلالة على نفس الوظيفة إلا أن هناك اختلافات بينهما، فمسؤوليات مهندسي البرمجيات أشمل وأوسع. فدور المبرمج يقتصر على مهمة محددة وهي كتابة الشيفرات والأكواد البرمجية ويتطلب هذا الدور فهمًا قويًا بلغات البرمجة والخوارزميات وأنواعها وهياكل البيانات واستخداماتها، في حين يشرف مهندس البرمجيات على كامل عملية تطوير البرمجيات بدءًا من مرحلة وضع المتطلبات والتصميم الأولي وصولًا لمرحلة البرمجة وكتابة الأكواد، وانتهاء بمرحلة الاختبار والصيانة، ويتطلب منه هذا الدو الشامل فهمًا قويًا بدورة حياة تطوير البرمجيات ومنهجيات تطويرها وأنماط تصميم البرمجيات إضافة لفهم لغات البرمجة والخوارزميات. بمعنى آخر يهتم المبرمج بأمور تنفيذ المشروع ويكتب الكود البرمجي الخاص به وهو ما يعرف بمصطلح implementation، أما مهندس البرمجيات فيقوم بأكثر من ذلك بكثير فهو يخطط ويحلل متطلبات المشروع ويقدم أنسب الحلول لتحقيقه بناءً على معرفته وخبرته الهندسية ويبدأ دوره قبل بدء المبرمج بمرحلة كتابة الكود إذ يكون لديه تصور واضح عن مراحل العمل ككل قبل البدء بإنجازه. أهمية هندسة البرمجيات تعد هندسة البرمجيات واحدة من أكثر الوظائف المطلوبة اليوم والتي ستظل مطلوبة في المستقبل، نظرًا للتطور التقني المتسارع والمتشعب في مختلف المجالات ما يستدعي الحاجة إلى توظيف مهندسي البرمجيات لتطوير برامج وتطبيقات تحل مختلف المشكلات بشرعة واحترافية. ولا تقتصر أهمية هندسىة البرمجيات على شركات التطوير البرمجي بل تلجأ معظم القطاعات والصناعات اليوم مثل شركات الاتصالات والبنوك ومؤسسات القطاع الصحي وغيرها من قطاعات العمل إلى التحول الرقمي وتحتاج إلى تعيين مهندسي البرمجيات للاستفادة من مهاراتهم في برمجة التطبيقات المختلفة وصيانتها وتحسينها. وهذا الطلب المرتفع يجعل رواتب مهندسي البرمجيات أعلى بكثير من المهن الأخرى، وبالطبع يختلف راتب مهندس البرمجيات اعتمادًا على الخبرة ومكان العمل لكنه بالعموم يتقاضى رواتب مرتفعة ومجزية مقارنة ببقية الوظائف لذا احرص على تطوير خبراتك ومهاراتك إذا أردت أن تضمن راتبًا مجزيًا. مهام مهندس البرمجيات قد تختلف مهام مهندس البرمجيات من مكان عمل لآخر وحسب نوع البرمجيات التي يطلب منه تطويرها، لكن بشكل عام إذا قررت العمل في وظيفة مهندس برمجيات فقد يطلب منك القيام بالمهام التالية: تحليل متطلبات مستخدمي المنتج البرمجي المطلوب تطويره وتحديد مواصفاته بناء على هذه المتطلبات تصميم البرمجيات وإعداد وثائق تخطيط المشروع والمواصفات ووثائق اختبار الوحدات التي تحدد التصور العام للبرامج المطلوب تطويرها وتوضح تفاصيل عملها وهيكليتها ومكوناتها المختلفة قبل البدء بنتفيذها. اختيار لغة البرمجة والتقنيات المناسبة لتطوير التطبيقات وكتابة الشيفرات البرمجة اللازمة لتنفيذها. اختبار البرمجيات بشكل مؤتمت أو يدوي والتأكد من خلوها من الأخطاء وإصلاحها في حال وجودها. الإشراف على عملية نشر البرمجيات وإتاحتها للمستخدمين. فحص أي عيوب في البرمجيات بعد نشرها، وصيانتها بصورة دورية وضمان توافقها مع أي أجهزة أو تقنيات جديدة. وضع تصور لتطويرات مستقبلية وإضافة ميزات جديدة تحسن هذه البرمجيات. مهارات مهندس البرمجيات يحتاج أي مهندس البرمجيات لامتلاك مجموعة من المهارات الفنية والسمات الشخصية ومن أهم هذه السمات نذكر: مهارات في التفكير المنطقي والتحليلي ومرونة في التعامل مع المشكلات وإيجاد حلول فعالة لها. معرفة جيدة بالخوارزميات وهياكل البيانات مهارات تقنية ومعرفة جيدة بلغات البرمجة وأهم أطر العمل والمكتبات المساعدة التنظيم ومهارات التواصل الجيدة للتفاعل مع فريق العمل البرمجي والعملاء ومدراء المشاريع. معرفة بدورة حياة البرمجيات ومراحل تطويرها ومعرفة بمنهجيات تطوير البرمجيات وآلية تطبيقها. القدرة على التطور المستمر ومتابعة أحدث التقنيات واستخدامها فالمجال البرمجي سريع التطور. ولمطالعة المزيد من السمات الشخصية التي تحتاج لامتلاكتها لتكون مهندس برمجيات ناجح أنصحك بمشاهدة الفيديو التالي: مجالات عمل هندسة البرمجيات إذا قررت العمل في وظيفة هندسة البرمجيات فلن يقتصر عملك على الإشراف على عملية تطوير البرمجيات وتطبيق مبادئ الهندسة على البرمجيات كما شرحنا سابقًا، فمجالات البرمجة كثيرة ومتنوعة لذا ستجد العديد من المجالات التي يمكنك العمل بها بحسب خبرتك والمهارات التي تتقنها والتقنيات التي تهتم للعمل بها. ومن أهم مجالات عمل هندسة البرمجيات نذكر: مطور برمجيات أو مطور تطبيقات مثل تطبيقات الويب أو تطبيقات الجوال أو التطبيقات المدمجة وإنترنت الأشياء IoT. مهندس DevOps أو مهندس حوسبة سحابية مسؤول عن إدارة دورة حياة تطوير البرمجيات ونشر التطبيقات. عالم بيانات أو مهندس بيانات تحلل وتستخرج رؤى وقرارات مفيدة من البيانات باستخدام الأساليب الإحصائية وخوارزميات التعلم الآلي. مهندس ذكاء اصطناعي وتعلم آلي تطور وتنفذ خوارزميات التعلم الآلي لحل المشكلات والتنبؤ بالتوقعات المستقبلية. مهندس أمن سيبراني تكتشف وتعالج أي ثغرات أو تهديدات أمنية تهدد الشبكات والأنظمة الحاسوبية. مهندس قواعد بيانات مسؤول عن تصميم وإنشاء وإدارة قواعد البيانات الخاصة بالجهة التي تعمل بها أو التطبيقات التي تستخدم هذه البيانات. كانت هذه نبذة سريعة عن أهم مجالات عمل مهندسي البرمجيات، وبالطيع تختلف طبيعة عمل مهندس البرمجيات بحسب الدور الذي يؤديه، وحجم مكان العمل، والتقنيات المستخدمة لتأدية هذا العمل، لذا إذا وجدت فرصة عمل تتطلب تخصص هندسة البرمجيات في شركة ما، فمن الأفضل أن تتأكد أولًا من الوصف الوظيفي لها وتسأل عن المهام والمسؤوليات المطلوبة منك بشكل دقيق لتعرف إن كانت هذه الوظيفة تلائمك أم لا. كيف أصبح مهندس برمجيات إذا كنت تطمح لأن تدرس برمجة الحاسوب وتتعلم كافة المهارات اللازمة للتصبح مهندس برمجيات محترف، فأمامك طريقان الأول هو الدراسة الأكاديمية لتخصص هندسة البرمجيات والتسجيل في إحدى الجامعات المتخصصة في هندسة الحاسوب أو هندسة البرمجيات أو أي تخصص مشابه، لكن هذا الطريق طويل ويستغرق مدة لا تقل عن أربع إلى خمس سنوات وقد لا يتاح للجميع بسبب تكلفة الدراسة الجامعية وعدد المقاعد المحدود في كل كلية. لذا قد ترغب في اختصار الجهد والتكاليف وتلجأ إلى تعلم هندسة البرمجيات بشكل ذاتي من خلال اكتساب المؤهلات والمهارات التقنية بنفسك والجيد في هذا الخيار أنه يساعدك على اختصار وقت التعلم ودخول سوق العمل التقني لاسيما أن الكثير من الشركات اليوم لم تعد تشترط الشهادات بل تهتم بوجود الخبرات اللازمة والمثبتة لتوظيفك. ستجد الكثير من مصادر التعلم المفيدة من دروس مقالات وكتب ودورات تدريبية على الإنترنت تساعدك على احتراف لغات البرمجة ومبادئ هندسة البرمجيات لكن معظمها باللغة الإنجليزية، وإذا كنت تبحث عن مصدر عربي عالي الجودة لتعلم هندسة البرمجيات فقد وفرت لك أكاديمية حسوب العديد من الدورس والمقالات المجانية التي تساعدك على تعلم كافة لغات البرمجة المشهورة والمطلوبة مثل لغة بايثون Python أو جافا Java أو C++ أو غيرها من لغات البرمجة، ومن الأفضل أن تركز على لغات البرمجة المطلوبة في سوق العمل الذي تستهدفه أو المنطقة التي تهدف للبحث عن وظيفة فيها. كما توفر دروس متعددة لتعلم أساسيات الخوارزميات وهياكل البيانات والتعرف على دورة حياة تطوير البرمجيات وكيفية وأنماط التصميم البرمجية وغيرها من المفاهيم التي تساعدك على تعلم مبادئ الهندسة وتطبيقها على تطوير البرمجيات، وبالتدريب وتطوير العديد من المشاريع البرمجية التي تحل مشكلات برمجية مختلفة ستتمكن تطبيق ما تعلمته من مهارات واكتساب خبرة أكبر في هندسة البرمجيات وبناء معرض أعمال يعزز فرصتك في الحصول على العمل. ولا تنسى أن تعزز مهاراتك الناعمة كالتنظيم والتفكير المنطقي والإبداعي والقدرة على التواصل والعمل الجماعي فهذه المهارات لا تقل أهمية عن المهارات البرمجية ويركز عليها أصحاب العمل، وبعد اكتسابك لهذه الخبرات أنصحك بالبحث عن فرصة للتدرب او التطوع في إحدى الشركات التي توفر فرصًا لمهندسي البرمجيات الجدد للتدرب واكتساب خبرة عملية وقد هذه الفرص تكون مدفوعة أو غير مدفوعة لكنها تساعدك بشكل كبير لاكتساب الخبرات اللازمة التي تؤهلك للعمل في إحدى مجالات عمل مهندس البرمجيات في الشركات والمؤسسات. وإذا كنت مهتمًا بتعلم مهارات هندسة البرمجيات الأساسية لكنك مشتت وتائه ولا تعرف من أين تبدأ أنصحك بالبدء مع دورة علوم الحاسوب من أكاديمية حسوب فهي توفر العديد من المسارات التعليمية المفيدة التي يحتاج أي مهندس برمجيات لمعرفتها، تمتد هذه الدورة لأكثر من 60 ساعة تدريبية تتعلم من خلالها مبادئ البرمجة وأسس هندسة البرمجيات وغيرها من المعلومات القيمة، كما توفر لك مدربين أكفاء يرشدونك خلال التعلم ويجيبون على أي تساؤل يواجهك كما يمكنك الحصول في النهاية على شهادة معتمدة تعزز فرصتك في الحصول على فرصة العمل التي تطمح لها. أوجزنا لك في هذه الفقرة أهم الخطوات التي يمكنك اتباعها لتكون مهندس برمجيات محترف، وإذا كنت مهتمًا بمطالعة المزيد من المعلومات حول هذا الموضوع أنصحك بمطالعة مقالنا الطريقة الأمثل لدراسة تخصص هندسة البرمجيات. الخلاصة تعرفنا في مقال اليوم على وظيفة مهندس البرمجيات وأهميتها، وأهم المهارات التي تحتاجها لتصبح مهندس برمجيات والواجبات التي عليك القيام بها عند العمل في هذه الوظيفة، وفي ختام المقال تذكر أن أي شخص اليوم يمكنه أن يتعلم البرمجة ويدرس هندسة البرمجيات وينجح في مزاولة هذا التخصص، كل ما يحتاجه هو امتلاك الصبر والإرادة والكثير من الالتزام والمثابرة. اقرأ أيضًا تعرف على تخصص هندسة البرمجيات تعرف على وظائف البرمجة الأعلى أجرًا مدخل إلى تطوير البرمجيات Software Development الأخطاء السبع القاتلة لأيّ مشروع برمجيات شهادات البرمجة: أهميتها وسبل الحصول عليها ما هي مدة تعلم البرمجة؟
    1 نقطة
  40. وُلد الذكاء الصناعي في الخمسينيات من القرن الماضي عندما بدأ بعض الباحثين في مجال علوم الحاسب بالتساؤل عما إذا كان من الممكن جعل أجهزة الحاسب "تفكر" -وهو سؤال ما زلنا نستكشف تداعياته حتى اليوم. إن التعريف المختصر لمجال الذكاء الصناعي على النحو التالي: هو الجهد المبذول لأتمتة المهام الفكرية التي يؤديها البشر عادة. تشكل خوارزميات الذكاء الصناعي أساس الأنظمة الذكية الحديثة، حيث تمكّن الآلات من التعلم والاستنتاج واتخاذ القرارات باستقلالية. أحدثت هذه الخوارزميات ثورة في مختلف المجالات، بدءًا من الرؤية الحاسوبية ومعالجة اللغة الطبيعية إلى الروبوتات وأنظمة التوصية. يعد فهم المفاهيم والأنواع الأساسية لخوارزميات الذكاء الصناعي أمرًا بالغ الأهمية لفهم تعقيدات الذكاء الصناعي وتطبيقاته الواسعة. لقد حققت خوارزميات الذكاء الصناعي في السنوات الأخيرة تقدمًا كبيرًا، وذلك بفضل توفر كميات هائلة من البيانات وزيادة القدرة الحسابية وتحقيق اختراقات في البحث الخوارزمي. تتمتع هذه الخوارزميات بالقدرة على معالجة مجموعات البيانات الضخمة وتحليلها واكتشاف الأنماط المخفية واستخلاص رؤى قيّمة من البيانات. لقد أصبحوا فعّالين في حل المشكلات المعقدة التي كانت تعتبر ذات يوم تتجاوز قدرات الآلات. يشمل مجال الذكاء الاصطناعي العديد من مناهج الخوارزميات، كل منها مصمم لمعالجة مهام ومجالات مشكلة محددة، ويمكن فرز أنواع هذه الخوارزميات بطرق عديدة: حسب طريقة التدريب أو نوع البيانات التي تتعامل معها أو حجم البيانات التي يمكن أن تستفيد منها، لكن التصنيف الأشيع يكون وفقًا للمهمة التي يمكن أن تؤديها. بينما توفر خوارزميات الذكاء الاصطناعي إمكانات هائلة، فإنها تطرح أيضًا تحديات واعتبارات أخلاقية. يجب معالجة قضايا مثل تحيز البيانات وقابلية التفسير والإنصاف والخصوصية لضمان النشر المسؤول والأخلاقي لأنظمة الذكاء الاصطناعي. علاوة على ذلك، يستمر مجال الذكاء الاصطناعي في التطور بسرعة، مع استمرار البحث والتقدم في تقنيات الخوارزميات. تعد مواكبة أحدث التطورات وفهم نقاط القوة والقيود الخاصة بالخوارزميات المختلفة أمرًا ضروريًا للممارسين والباحثين وصناع السياسات. سوف نستكشف في هذا المقال الأنواع الرئيسية لخوارزميات الذكاء الاصطناعي وفقًا للمهمة التي تؤديها ونناقش خصائصها وكيفية تطبيقها ونفحص التحديات التي تطرحها هذه الخوارزميات. من خلال اكتساب فهم شامل لخوارزميات الذكاء الاصطناعي، يمكننا تقدير أهميتها في قيادة الابتكار وحل المشكلات المعقدة وتشكيل مستقبل الذكاء الاصطناعي والحياة. تمهيد إلى خوارزميات الذكاء الاصطناعي لابد من التنويه لبعض النقاط المهمة لكي نضمن لك قراءةً مستنيرة خلال هذه المقالة. المتطلبات لتكون على بينةٍ أثناء قراءة هذه المقالة، لابد وأن يكون لديك: معرفة مسبقة بالذكاء الصناعي وفروعه وأساسياته، سيكون من الأفضل أن تقرأ المقالة الأولى في هذه السلسلة على الأقل. معرفة بمجالات الذكاء الصناعي. يمكنك قراءة مقالة مجالات الذكاء الاصطناعي. (اختياري) أن يكون لديك اطلاع على تعلم الآلة. يمكنك قراءة مقالة تعلم الآلة. هل يجب أن أعرف جميع أنواع خوارزميات الذكاء الاصطناعي؟ لكي تصبح مبرمجًا للذكاء الاصطناعي، ليس من الضروري معرفة جميع أنواع خوارزميات الذكاء الاصطناعي. مجال الذكاء الاصطناعي واسع ويشمل مجموعة واسعة من الخوارزميات والتقنيات. بصفتك مبرمجًا للذكاء الاصطناعي، يمكنك اختيار التخصص في مجالات أو خوارزميات محددة بناءً على اهتماماتك وأهدافك المهنية ومتطلبات المشاريع التي تعمل عليها. ومع ذلك فإن وجود فهم عام للمفاهيم الأساسية والخوارزميات شائعة الاستخدام في الذكاء الاصطناعي أمر مفيد. يتضمن ذلك معرفة خوارزميات التعلم الآلي مثل التعلم الخاضع للإشراف والتعلم غير الخاضع للإشراف والتعلم المعزز. إضافةً إلى ذلك يمكن أن يكون الإلمام بالشبكات العصبية وتقنيات التعلم العميق مفيدًا للغاية، حيث يتم استخدامها على نطاق واسع في تطبيقات الذكاء الاصطناعي المختلفة. خلال قراءتك للمقالة سترى مراجعة شاملة للمناهج والخوارزميات وسياق تطورها، لكن ليس من الضروري أن تتعرّف عن قرب عن جميعها أو حتى نصفها، فكما ذكرت؛ هذا يعتمد على المجال الذي ستختص فيه. مثلًا إن كان اهتمامك في معالجة اللغات الطبيعية أو الرؤية الحاسوبية، فلن تحتاج إلى الخوارزميات التطورية أو التعلم المعزز كقاعدة عامة. ما الفرق بين خوارزميتن الذكاء الاصطناعي ونموذج الذكاء الاصطناعي خوارزمية الذكاء الاصطناعي هي مجموعة التعليمات التي تحدد كيفية تنفيذ مهمة حسابية، بينما نموذج الذكاء الاصطناعي هو التمثيل المكتسب الناتج عن تطبيق الخوارزمية على بيانات التدريب. لتوضيح الفرق ضع في اعتبارك السيناريو التالي: تريد إنشاء نموذج لتصنيف صور القطط والكلاب. يمكن أن تكون الخوارزمية التي تختارها عبارة عن شبكة عصبية تلافيفية CNN، والتي تحدد بنية الشبكة وعملية التدريب عليها. النموذج في هذه الحالة سيكون CNN المُدرّبة أي بعد أن تعلّمت من مجموعة البيانات. يمكن بعد ذلك استخدام النموذج لتصنيف الصور الجديدة غير المرئية كقطط أو كلاب. باختصار النموذج هو ناتج الخوارزمية، أي يمكن القول أن النموذج هو خوارزمية مُدرّبة جاهزة للاستخدام والتطبيق الفعلي. تجدر الإشارة إلى أنهما مصطلحان يُستخدمان غالبًا بالتبادل، لكن يجب معرفة الفرق بينهما. ما المقصود بالأنماط تشير الأنماط في سياق الذكاء الاصطناعي إلى الهياكل أو العلاقات المتكررة في البيانات التي يمكن تحديدها واستخدامها لعمل تنبؤات أو استخلاص رؤى. من خلال تحليل كميات كبيرة من البيانات، يمكن لخوارزميات الذكاء الاصطناعي تحديد الأنماط والتعلم منها لتحسين الأداء أو اتخاذ قرارات ذكية. يمكن أن تظهر الأنماط في أشكال مختلفة، مثل السلاسل الرقمية أو السلاسل النص أو الصور أو الإشارات الصوتية. صُمّمت خوارزميات الذكاء الاصطناعي للتعرف على الأنماط داخل أنواع البيانات هذه واستخراج الخصائص ذات الصلة التي تساعد في حل مهام محددة. على سبيل المثال، في التعرف على الصور، تتعلم خوارزميات الذكاء الاصطناعي أنماطًا من قيم البكسل تتوافق مع كائنات أو ميزات مختلفة. في معالجة اللغة الطبيعية، تتعلم نماذج الذكاء الاصطناعي أنماطًا في تراكيب اللغة والسياق لفهم وإنشاء نص يشبه الإنسان. باختصار، النمط هو شكل معيّن تتكرر فيه المعلومات، وهي صفات وخصائص تُميّز الأشياء، وهو مصطلح أساسي في تعلّم الآلة. مثلًا: كل التفاحات لها شكل شبه كروي (نمط)، العرب ينطقون لغة خاصة هي اللغة العربية (نمط)، يمكن تمييز الطبيب في المستشفى من لباسه (نمط). تطور خوارزميات الذكاء الاصطناعي: من الأنظمة المعتمدة على القواعد إلى أعجوبة التعلم العميق شهدت خوارزميات الذكاء الصناعي تطورًا ملحوظًا على مر السنين، مما دفع مجال الذكاء الصناعي إلى آفاق جديدة للابتكار والتطبيق. من البدايات المتواضعة إلى أحدث التطورات، تُظهر رحلة خوارزميات الذكاء الصناعي التقدم الملحوظ الذي تم إحرازه في تطوير الأنظمة الذكية. يستكشف هذا القسم من المقالة تطور خوارزميات الذكاء الصناعي وتتبع أسسها والمعالم الرئيسية والاتجاهات الناشئة التي تشكل مستقبل الذكاء الصناعي. الأيام الأولى: الذكاء الاصطناعي المعتمد على القواعد والأنظمة الخبيرة يمكن إرجاع جذور خوارزميات الذكاء الاصطناعي إلى الأيام الأولى من المجال عندما ركز الباحثون على الذكاء الصناعي المعتمد على القواعد والأنظمة الخبيرة. تضمنت هذه الأساليب تمثيل المعرفة البشرية في أنظمة قائمة على القواعد، وتمكين أجهزة الحاسب من محاكاة التفكير البشري وحل مشكلات محددة ضمن مجالات محددة مسبقًا. كان التطور الملحوظ خلال هذه الفترة هو إنشاء أنظمة خبيرة يمكن أن تحاكي قدرات صنع القرار للخبراء البشريين في المجالات المتخصصة. ثورة التعلم الآلي: الانتقال من القواعد الصريحة إلى التعلم من البيانات كان ظهور التعلم الآلي بمثابة تحول كبير في خوارزميات الذكاء الاصطناعي، والانتقال من البرمجة الصريحة القائمة على القواعد إلى الخوارزميات التي تتعلم من البيانات. اكتسبت المناهج الإحصائية بدايةً مكانة بارزة، مما سمح للآلات بالتعرف على الأنماط وإجراء التنبؤات بناءً على الأمثلة المرصودة. شهد لاحقًا هذا العصر ظهور خوارزميات مثل الانحدار الخطي والانحدار اللوجستي وأشجار القرار، مما مكّن الآلات من التعلم من البيانات المصنفة واتخاذ قرارات مستنيرة. كما أدى تطوير الشبكات العصبية وخوارزمية الانتشار العكسي في هذه الفترة إلى دفع المجال بشكل أكبر من خلال تقديم مفهوم تدريب الشبكات العميقة. التعلم المعزز: التعلم من خلال التفاعل مع البيئة اكتسبت خوارزميات التعلم المعزز مكانة بارزة من خلال تمكين الآلات من التعلم من خلال التفاعلات مع البيئة، وهي مستوحاة من علم النفس السلوكي. تعمل هذه الخوارزميات على تحسين عمليات اتخاذ القرار من خلال تعظيم المكافآت والعقوبات وبشكل تراكمي. تشمل المعالم الرئيسية لهذه المرحلة تطوير خوارزمية Q-Learning وتمهيد الطريق للتعلم المعزز الحديث والتطورات اللاحقة مثل شبكات كيو العميقة DQN وغيرهم. حقق التعلم المعزز نجاحًا ملحوظًا في مجالات مثل لعب الألعاب والروبوتات، حيث أُظهرت قوة التعلّم من خلال التجربة والخطأ. الخوارزميات التطورية: التحسين والبحث تستمد الخوارزميات التطورية الإلهام من التطور الطبيعي والمبادئ الجينية لتحسين المشكلات المعقدة والبحث عن الحلول المثلى. تعد الخوارزميات الجينية وخوارزميات أسراب الطيور وخوازميات مستعمرات النمل -أمثلة على الخوارزميات التطورية التي أثبتت فعاليتها في حل بعض مشكلات التحسين المعقدة. وجدت هذه الخوارزميات تطبيقات في مجالات مثل التصميم الهندسي والجدولة واستخراج البيانات. التعلم العميق: إطلاق العنان لقوة الشبكات العصبية ظهرت خوارزميات التعلم العميق كقوة مهيمنة في الذكاء الصناعي، تغذيها التطورات في القوة الحسابية وتوافر كميات هائلة من البيانات. من خلال الاستفادة من فكرة الطبقات المتعددة للشبكات العصبية، تفوقت خوارزميات التعلم العميق على خوارزميات التعلّم الآلي الأخرى في جميع المهام الحسية والإدراكية. أحدثت الشبكات العصبية التلافيفية CNNs ثورة في مهام الرؤية الحاسوبية، بينما أظهرت الشبكات العصبية المتكررة RNNs أداءً استثنائيًا في تحليل البيانات النصية والزمنية. يتيح عمق وتعقيد هذه الشبكات استخراج معلومات عالية الدقة من البيانات، وإطلاق العنان لإمكانيات جديدة في مجالات مثل التعرف على الصور ومعالجة اللغة الطبيعية والتعرّف على الكلام. ظهور النهج الهجين مع استمرار تطور خوارزميات الذكاء الاصطناعي، اكتسبت الأساليب الهجينة التي تجمع بين تقنيات متعددة مكانة بارزة. مثلًا أدى دمج التعلم العميق مع التعلم المعزز إلى حدوث تطورات في مجالات مثل القيادة المستقلة ولعب الألعاب. أتاح اندماج الخوارزميات التطورية مع تقنيات التعلم الآلي إنشاء استراتيجيات تحسين أكثر قوة. تستفيد المناهج الهجينة من نقاط القوة في النماذج الحسابية المختلفة لمواجهة تحديات العالم الحقيقي المعقدة. يعد تطوّر خوارزميات الذكاء الصناعي عملية مستمرة، مع العديد من الاتجاهات الناشئة التي تشكل مستقبل المجال. دورة الذكاء الاصطناعي احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة. اشترك الآن أنواع خوارزميات الذكاء الاصطناعي وفقًا لنواع المهمة هناك عدة أنواع من خوارزميات الذكاء الصناعي وفقًا لنوع المهمة، وهي تندرج عمومّا تحت 6 أنواع هي: الانحدار والتصنيف والعنقدة والتجميع والتوليد والتفاعل. خوارزميات الانحدار أو التوقع Regression يُعد هذا النوع من الخوارزميات من خوارزميات تعلم الآلة الخاضعة للإشراف، وتستخدم لعمل تنبؤات. يتضمن التطبيق الرئيسي لخوارزميات الانحدار التنبؤ بسعر سوق الأسهم والتنبؤ بالطقس، وما إلى ذلك. هناك أنواع مختلفة من الانحدار مثل الانحدار الخطي والانحدار متعدد الحدود وما إلى ذلك. الخوارزميات الأكثر شيوعًا في هذا القسم هي خوارزمية الانحدار الخطي Linear Regression. تُستخدم خوارزمية الانحدار الخطي لتحليل العلاقة بين متغيرين: متغير إدخال (غالبًا ما يسمى المتغير المستقل) ومتغير الإخراج (غالبًا ما يسمى المتغير التابع). يهدف إلى العثور على علاقة خطية أو اتجاه يناسب نقاط البيانات بشكل أفضل. تعمل الخوارزمية من خلال إيجاد معادلة مستقيم تساهم في تقليل الفرق بين القيم المتوقعة والقيم الحقيقية لمتغير الإخراج. يمكن استخدام هذه المعادلة لاحقًا لعمل تنبؤات لقيم الإدخال الجديدة بناءً على العلاقة التي تم تعلمها. غالبًا ما يستخدم الانحدار الخطي في مهام مثل التنبؤ بأسعار المنازل بناءً على عوامل مثل الحجم والموقع ، أو تقدير المبيعات بناءً على نفقات الإعلان ، أو تحليل تأثير المتغيرات على نتيجة معينة. يوفر طريقة بسيطة وقابلة للتفسير لفهم العلاقة بين المتغيرات وعمل تنبؤات بناءً على تلك العلاقة. خوارزميات التصنيف Classification خوارزميات تُستخدم لتصنيف البيانات إلى فئتين أو أكثر، وتعتبر خوارزميات التصنيف جزءًا من التعلم الخاضع للإشراف. على سبيل المثال، يمكن استخدام خوارزميات التصنيف لتصنيف رسائل البريد الإلكتروني كرسائل عادية أو عشوائية Spam. هناك نوعان أساسيان من التصنيف: تصنيف الثنائي Binary classification: هنا يكون لدينا فئتين. مثلًا في مهمة تصنيف المرضى المصابين بكوفيد 19، يجب على الخوارزمية أن تحدد فيما إذا كان الشخص مريضًا أو غير مريض. تصنيف متعدد الفئات Multiclass classification: هنا يكون لدينا أكثر من فئة. مثلًا في مهمة تصنيف مراجعات الأفلام. يجب على الخوارزمية أن تحدد فيما إذا كان الشخص معجبًا بالفيلم أو غير معجب أو محايد. من أشهر خوارزميات التصنيف خوارزمية الانحدار اللوجستي Logistic regression والغابات العشوائية Random Forest و SVM إضافةً إلى الشبكات العصبية والتعلم العميق. غالبًا ما يستخدم الانحدار اللوجستي لمشاكل التصنيف الثنائي، بينما تُعرف الغابات العشوائية و SVM بقدرتهما على التعامل مع مهام التصنيف الثنائية ومتعددة الفئات. اكتسبت الشبكات العصبية، بما في ذلك نماذج التعلم العميق، شعبية هائلة بسبب قدرتها على تعلم الأنماط المعقدة في البيانات، مما يجعلها مناسبة لمجموعة واسعة من مشاكل التصنيف. توفر هذه الخوارزميات أدوات قوية للباحثين والممارسين لتحليل البيانات وتصنيفها، مما يتيح التقدم في مجالات مثل التعرف على الصور ومعالجة اللغة الطبيعية والتشخيص الطبي ..إلخ. خوارزميات العنقدة Clustering تُستخدم لتجميع العناصر المتشابهة بغية فرزها أو تصنيفها أو اختزالها. تعتمد هذه الخوارزميات على تقسيم البيانات إلى مجموعات مميزة من العناصر المتشابهة. خذ مثلًا عملية تحميل الصور على أحد مواقع التواصل الاجتماعي كمثال. هنا قد يرغب الموقع في تجميع الصور التي تُظهر الشخص نفسه مع بعضها بغية تنظيم صورك. إلا أن الموقع لا يعرف من يظهر في الصور ولا يعرف عدد الأشخاص المختلفين الذين يظهرون في مجموعة الصور خاصتك. تتمثل الطريقة المعقولة لحل المشكلة في استخراج كل الوجوه وتقسيمها إلى مجموعات من الوجوه المتشابهة، ومن أجل كل صورة جديدة تحملها يضعها في المجموعة الأكثر شبهًا لها. هذا مايُسمّى بالعنقدة. أبرز أمثلتها هي الخوارزمية التصنيفية K-Means. خوارزميات التعلم الجماعي Ensemble learning يشير التعلم الجماعي إلى الخوارزميات التي تجمع التنبؤات من نموذجين أو أكثر. على الرغم من وجود عدد غير محدود تقريبًا من الطرق التي يمكن من خلالها تحقيق ذلك، ربما توجد ثلاث فئات من تقنيات التعلم الجماعي التي تتم مناقشتها بشكل شائع واستخدامها في الممارسة العملية: التعبئة Bagging: يعتمد على استخدام عدة نماذج لإنشاء التوقعات، ثم أخذ قرار الغالبية. أي مثلًا كان هناك 3 نماذج تتوقع أن الشخص مريض ونموذج واحد يتوقع أنه غير مريض، فتكون النتيجة أنه غير مريض بتصويت الغالبية. التكديس Stacking: هنا يُستخدم نموذج آخر لمعرفة أفضل طريقة للجمع بين تنبؤات النماذج. التعزيز Boosting: هنا يكون لدينا عدة نماذج وكل منها يُصحح أخطاء الآخر على التسلسل، وصولًا إلى نموذج نهائي قوي (هذا هو النوع الأنجح والأكثر استخدامًا). أبرز الأمثلة على هذه الخوارزميات هي خوارزمية تعزيز التدرج الشديد XGBoost، وتعتبر من خوارزميات التعلم الآلي المستخدمة في مهام التصنيف أو الانحدار، وتندرج تحت مفهوم أساليب التعلم الجماعي التي تجمع بين العديد من النماذج الأضعف (غالبًا أشجار القرار) لإنشاء نموذج تنبؤي قوي. تعزيز التدرج هو مصطلح عام يشير إلى فئة من الخوارزميات حيث يركز كل نموذج لاحق في المجموعة على تصحيح الأخطاء التي ارتكبتها النماذج السابقة. إنه يعمل عن طريق إضافة نماذج جديدة باستمرار، مع تدريب كل نموذج جديد لتقليل الأخطاء التي ارتكبتها النماذج السابقة. الخوارزميات التوليدية Generative هي فئة من خوارزميات الذكاء الاصطناعي التي تهدف إلى إنشاء عينات بيانات جديدة تشبه مجموعة بيانات تدريب معينة. تتعلم هذه النماذج التوزيع الأساسي لبيانات التدريب وتستخدمها لتوليد عينات جديدة تظهر خصائص متشابهة. تُستخدم النماذج التوليدية على نطاق واسع في العديد من التطبيقات، بما في ذلك إنشاء الصور وتوليد النصوص (مثل ChatGPT) وتوليف البيانات. فيما يلي بعض الأنواع الشائعة من النماذج التوليدية: شبكات الخصومة التوليدية GANs: تتكون شبكات GAN من مكونين رئيسيين: شبكة المولدات وشبكة التمييز. يهدف المولد إلى إنتاج عينات بيانات واقعيّة، بينما يحاول المميّز التمييز بين العينات الحقيقية والمولدة، ومن خلال عملية التدريب تتعلم شبكات GAN إنشاء عينات بيانات واقعية. أحد أمثلتها هو توليد صور أشخاص غير حقيقيين. النماذج التوليدية لمعالجة اللغة الطبيعية: يمكن لنماذج مثل شبكات الخصومة التوليدية والشبكات العصبية المتكررة RNN ونماذج المحولات Transformers إنشاء نصوص بيانات واقعية (مثل ChatGPT). تحتوي النماذج التوليدية على مجموعة واسعة من التطبيقات، بما في ذلك تركيب الصور وزيادة حجم مجموعات البيانات وإنشاء النصوص واكتشاف الشذوذ. إنها ذات قيمة في السيناريوهات التي يكون الهدف فيها هو إنشاء عينات بيانات جديدة تلتقط خصائص بيانات التدريب وتوزيعها. خوارزميات التفاعل أو التعلم المعزز RL خوارزميات التعلم المعزز هي فئة من خوارزميات الذكاء الاصطناعي التي تمكّن الوكيل Agents (يمكنك اعتباره الآلة) من تعلم كيفية اتخاذ القرارات أو اتخاذ الإجراءات في بيئة ما لزيادة المكافأة التراكمية. تتعلم خوارزميات RL من خلال التجربة والخطأ، حيث يتفاعل الوكيل مع البيئة ويتلقى تعليقات في شكل مكافآت أو عقوبات بناءًا على صحة الإجراء المُتخذ أو عدم صحته، ويقوم بتعديل سلوكه لتحقيق أعلى مكافأة ممكنة. هناك العديد من المكونات الرئيسية في خوارزميات RL. أولاً، هناك وكيل يتخذ إجراءات في البيئة. هدف الوكيل هو تعلم "سياسة Policy"، وهي رسم خرائط بين الحالات التي يمكن أن يمر بها الوكيل في البيئة والإجراءات التي يمكن أن يقوم بها عند كل حالة، والتي تزيد من المكافأة المتوقعة على المدى الطويل. البيئة هي النظام الخارجي الذي يتفاعل معه الوكيل، والتي تُقدّم ملاحظات للوكيل من خلال المكافآت. تستخدم خوارزميات RL عادةً دالة قيمة أو دالة Q لتقدير المكافأة التراكمية المتوقعة لزوج معين من إجراءات الحالة (مثلا إذا كنت في الحالة S5 واتخذت الإجراء A1 ستحصل على مكافأة 10+). تمثل دالة القيمة المكافأة طويلة الأجل التي يمكن أن يتوقعها الوكيل من كونه في حالة معينة واتباع سياسة معينة. تقدر دالة Q المكافأة التراكمية المتوقعة على وجه التحديد لأزواج (إجراء، حالة). تستخدم خوارزميات RL تقديرات القيمة هذه لتوجيه عملية اتخاذ القرار لدى الوكيل. هناك خوارزميات RL مختلفة مثل Q-Learning وتدرجات السياسة Policy gradients ..إلخ، ولكل منها نهجها الخاص في التعلم والتحسين. تم تطبيق خوارزميات التعلم المعزز بنجاح في مجالات مختلفة، مثل الروبوتات والأنظمة المستقلة ولعب الألعاب وأنظمة التحكم. إنها تمكن الوكلاء من التعلم من التجربة والتكيف مع البيئات المتغيرة واكتشاف الاستراتيجيات المثلى لحل المشكلات المعقدة. تطبيق خوارزميات الذكاء الاصطناعي في الذكاء الصناعي عمومًا ومجال تعلم الآلة خصوصًا، يختلف نهج الخوارزمية عن الخوارزمية التقليدية. السبب هو أن الخطوة الأولى هي معالجة البيانات -وبعد ذلك، سيبدأ الحاسوب في التعلّم. أي عند الحديث عن الخوارزميات في سياق الذكاء الصناعي وتعلم الآلة نتحدث عن الإجراءات والعمليات التي تُطبّق على البيانات لاستكشاف وفهم الأنماط Patterns والعلاقات السائدة في البيانات والتعلّم منها، ويكون نتاج هذه الخوارزميات هو نماذج Models يمكن تطبيقها على أرض الواقع. ملاحظة 1: النموذج هو ناتج الخوارزمية، أي يمكن القول أن النموذج هو خوارزمية مُدرّبة جاهزة للاستخدام والتطبيق الفعلي. تجدر الإشارة إلى أنهما مصطلحان يُستخدمان غالبًا بالتبادل (لافرق في أن تقول نموذج أو خوارزمية)، لكن وجب التنويه للفرق بينهما. ملاحظة 2: النمط هو شكل معيّن تتكرر فيه المعلومات، وهي صفات وخصائص تُميّز الأشياء، وهو مصطلح أساسي في تعلّم الآلة. مثلًا: كل التفاحات لها شكل شبه كروي (نمط)، العرب ينطقون لغة خاصة هي اللغة العربية (نمط)، يمكن تمييز الطبيب في المستشفى من لباسه (نمط). من السهل بناء وتطبيق بعض الخوارزميات، إلا أن بعضها الآخر يتطلّب خطوات برمجية ورياضيات معقدة. الخبر السار هو أنه لا يتعين عليك في معظم الأوقات أن تبني هذه الخوارزميات من الصفر، لأن هناك مجموعة متنوعة من اللغات البرمجية مثل Python و R والعديد من أطر العمل كتنسرفلو Tensorflow وكيراس Keras وباي تورش Pytorch وسكايت ليرن Sklearn التي تجعل العملية سهلة ومباشرة. هناك المئات من خوارزميات تعلم الآلة المتاحة، إلا أنّه يمكن تقسيمها فعليًا إلى أربع فئات رئيسية: التعلم الخاضع للإشراف supervised learning، والتعلم غير الخاضع للإشراف unsupervised learning، والتعلم المعزز reinforcement learning، والتعلم شبه الخاضع للإشراف semi-supervised learning، وقد ألقينا نظرة عن هذه الأنواع في مقالة تعلم الآلة. خطوات تدريب خوارزميات الذكاء الاصطناعي إن الهدف من عملية تدريب الخوارزمية هو إنشاء نموذج يعتمد على تلك الخوارزمية لإعطاء قرارات في أرض الواقع. بالتالي لتحقيق النجاح في تطبيق خوارزميات الذكاء الصناعي على مشكلة ما، من المهم اتباع نهج منظّم، وإلا قد تكون النتائج بعيدة عن المتوقع. إذًا يجب أن نختار خوارزمية مناسبة وأن ندربها بأفضل شكل ممكن لكي نحصل على قرارات مثالية قدر الإمكان. بدايةً تحتاج إلى إجراء عمليات معالجة البيانات، ثم من الجيد (إن أمكن) إجراء تمثيل مرئي لهذه البيانات، حيث يفيدنا التمثيل المرئي في الإجابة على أسئلة مثل: هل هناك بعض الأنماط؟ إذا كانت الإجابة بنعم، فقد تكون البيانات سهلة التعلّم وواضحة للخوارزمية. الخطوة 1: تحديد المشكلة وجمع البيانات: بدايةً يجب أن تحدد المشكلة التي تعمل عليها، وهذا يتضمن الإجابة على أسئلة مثل: ماذا ستكون البيانات التي تعطيها للخوارزمية (أي ما هو الدخل)؟ ما هي المشكلة التي تحاول حلها (أي ماهو الخرج)؟ لا يمكنك الانتقال إلى المرحلة التالية حتى تعرف ما هي المدخلات والمخرجات، والبيانات التي ستستخدمها. تتضمن هذه المرحلة أيضًا فحص البيانات التي تم جمعها وتنظيفها وإصلاح أية مشاكل فيها. الخطوة 2: اختيار الخوارزمية المناسبة: تحتاج الآن إلى تحديد خوارزمية مناسبة لحل هذه المشكلة، وسيكون الأمر أشبه بالتخمين المستنير، أي يجب أن تستفيد من النظريات وتجارب الآخرين، وهذا سيتضمن عملية تجربة وخطأ (قد تجرب عدة خورازميات). الخطوة 3: تحضير البيانات للتدريب: بمجرد أن تعرف ما الذي تريد أن تُدرّب الخوارزمية عليه، تكون جاهزًا تقريبًا لبدء نماذج التدريب. إن تحضير البيانات يعني تنسيقها بطريقة يمكن إدخالها في خوارزمية التعلّم. الخطوة 4: تدريب النموذج: سيتم استخدام حوالي 70% من البيانات المتاحة من أجل تدريب الخوارزمية وإنتاج النموذج. افترض أنك تبني نظامًا للتعلم الآلي للتنبؤ بقيمة السيارة المستعملة. ستشمل البيانات عوامل مثل: سنة التصنيع والطراز والمسافة المقطوعة والحالة. من خلال معالجة بيانات التدريب هذه، ستحسب الخوارزمية أوزان كل من هذه العوامل (وزن تأثيرها في قيمة السيارة) لتعطي نموذجًا يتوقع القيمة بناءًا على هذه العوامل. الخطوة 5: تقييم أداء النموذج: سيتم استخدام حوالي 30% من البيانات المتاحة من أجل تقييم أداء النموذج. في هذه المرحلة يمكنك معرفة ما إذا كان النموذج دقيقًا في قراراته. في مثالنا على السيارات المستعملة، سيكون السؤال: هل تتوافق توقعات النموذج مع قيم السوق في أرض الواقع؟ الخطوة 6: تحسين أداء النموذج: من خلال إضافة بيانات جديدة أو التلاعب بالخوارزمية ومعاملاتها أو حتى تغيير الخورازمية. في القسم التالي سنتحدث عن أنواع خوارزميات الذكاء الاصطناعي. هذه الأنواع تتضمن خوارزميات مختلفة وكلها تندرج تحت الفئات الرئيسية الأربعة سالفة الذكر. خوارزميات الذكاء الاصطناعي والمجتمع تسلط هذه الفقرة الضوء على الأهمية المتزايدة للاعتبارات الأخلاقية والتفسير والإنصاف في خوارزميات الذكاء الصناعي، حيث يستمر تأثير الذكاء الاصطناعي على المجتمع في التوسع. دعونا نتعمق في كل جانب! الاعتبارات الأخلاقية تشمل الاعتبارات الأخلاقية في الذكاء الصناعي معالجة الآثار الأخلاقية والتأثير المجتمعي المحتمل لأنظمة الذكاء الصناعي. نظرًا لأن خوارزميات الذكاء الاصطناعي أصبحت أكثر تكاملًا في جوانب مختلفة من حياتنا، فمن المهم ضمان تطويرها ونشرها بطريقة أخلاقية. يتضمن ذلك اعتبارات مثل حماية الخصوصية وأمن البيانات والتحيّز الخوارزمي والشفافية والمساءلة. تظهر المخاوف الأخلاقية عندما تتخذ خوارزميات الذكاء الصناعي قرارات قد يكون لها عواقب وخيمة على الأفراد أو المجموعات، ومن المهم وضع مبادئ توجيهية وأطر لتقليل الضرر المحتمل وضمان ممارسات الذكاء الاصطناعي الأخلاقية. قابلية التفسير يشير التفسير إلى القدرة على فهم وشرح القرارات أو التنبؤات التي تتخذها خوارزميات الذكاء الصناعي. نظرًا لأن الذكاء الصناعي يصبح أكثر تعقيدًا مع خوارزميات مثل شبكات التعلم العميق، يصبح تفسير النتائج التي تعطيها أصعب. من الضروري تطوير أساليب وتقنيات تمكّن البشر من فهم الأسباب الكامنة وراء قرارات خوارزميات الذكاء الاصطناعي من أجل الثقة بها. يساعد التفسير في تحديد التحيزات المحتملة وضمان المساءلة وبناء ثقة المستخدم. بالإضافة إلى ذلك تسمح القابلية للتفسير لخبراء المجال بالتحقق من صحة نماذج الذكاء الاصطناعي وتحسينها، مما يجعلها أكثر موثوقية وفعالية. الإنصاف يشير الإنصاف في خوارزميات الذكاء الصناعي إلى المعاملة غير المنحازة للأفراد أو المجموعات، بغض النظر عن سماتهم الشخصية مثل الجنس أو العرق أو الحالة الاجتماعية والاقتصادية. يمكن أن يظهر التحيّز عن غير قصد في أنظمة الذكاء الاصطناعي بسبب بيانات التدريب المتحيزة أو الافتراضات الأساسية. يعد تعزيز العدالة في خوارزميات الذكاء الاصطناعي أمرًا بالغ الأهمية لتجنب استمرار عدم المساواة الاجتماعية وضمان تكافؤ الفرص للجميع. تنبع الأهمية المتزايدة لهذه الجوانب من الاعتراف بأن أنظمة الذكاء الاصطناعي لديها القدرة على التأثير بشكل كبير على الأفراد والمجتمعات والمجتمعات ككل. تتم معالجة هذه الاعتبارات بنشاط من قبل الباحثين وصانعي السياسات والمتخصصين في الصناعة لوضع مبادئ توجيهية أخلاقية وتطوير مقاييس الإنصاف وتعزيز الشفافية في خوارزميات الذكاء الاصطناعي. من خلال دمج هذه الاعتبارات في عمليات التطوير والنشر، يمكننا أن نسعى جاهدين من أجل بناء بيئة للذكاء الاصطناعي أكثر أخلاقية وشمولية، ليعود بالنفع على المجتمع ككل. خاتمة خوارزميات الذكاء الاصطناعي مجال واسع يتكون من خوارزميات التعلم الآلي وخوارزميات التعلم العميق وغيرها من الخورازميات. تمنح خوارزميات الذكاء الصناعي الآلات القدرة على اتخاذ القرارات والتعرّف على الأنماط واستخلاص استنتاجات مفيدة والتي تعني أساسًا تقليد الذكاء البشري. في المقالة السابقة ناقشنا تطوّر هذه الخوارزميات منذ ولادة هذا المجال وكيفية تصنيف هذه الخوارزميات إلى 6 فئات. هي: الانحدار والتصنيف والعنقدة والتجميع والتوليد والتفاعل. تعرّفنا على كيفية تطبيق هذه الخوارزميات والخطوات العامة لذلك. لضمان النشر المسؤول والمفيد للذكاء الاصطناعي، تحدثنا عن ضرورة مراعاة الآثار الأخلاقية وضمان القابلية للتفسير من أجل الشفافية والمساءلة والسعي لتحقيق العدالة لتجنب التمييز والتحيز. إن تطوّر خوارزميات الذكاء الصناعي مثير للاهتمام ومحفّز للتفكير. لقد كان لها نصيب من الإخفاقات والاختراقات الهائلة. مع تطبيقات مثل ChatGPT و Dalle.E وغيرهما، نكون قد خدشنا سطح التطبيقات الممكنة للذكاء الصناعي. هناك تحديات أيضًا، وهناك بالتأكيد المزيد في المستقبل. اقرأ أيضًا أنواع الذكاء الاصطناعي الذكاء الاصطناعي: مراحل البدء والتطور والأسس التي نشأ عليها تطبيقات الذكاء الاصطناعي أهمية الذكاء الاصطناعي المرجع الشامل إلى تعلم الخوارزميات للمبتدئين
    1 نقطة
  41. يتوجه العالم بخطى حثيثة نحو حقبة ما بعد الثورة الرقمية، فقد غيرت هذه الثورة طريقة رؤيتنا للواقع والمستقبل ودفعتنا إلى حدود جديدة في شتى المجالات العلمية والاقتصادية والاجتماعية. لهذا تسعى الفعاليات البشرية بكافة أشكالها إلى التماشي مع هذه الثورة والاستفادة مما تتيحه من تقنيات لتطوير قدراتها الذاتية ومكاسبها في نفس الوقت. لقد أضحت عملية التحول الرقمي والتطوير المستمر لوسائل العمل والاتصال ميزة هذه الحقبة وأساسها، وغدت صناعة البرمجيات وتطوير الأنظمة المعلوماتية المحرك الأساسي لهذه المرحلة جنبًا إلى جنب مع تطور البنية التحتية لتقديم الخدمات الرقمية بالشكل الأكفأ والأسرع. ولهذا السبب أخذت هذه الصناعة بالنضوج اعتمادًا على مفاهيم ومسارات واستراتيجيات مدروسة وواضحة في التخطيط لها وتحليل متطلباتها ثم تصميمها وتنفيذها ضمن حلقة متكاملة من المراحل المتلاحقة لتلبي الغرض من بنائها وإنشائها. ونظرًا لاعتماد الأعمال بكل أشكالها على صناعة البرمجيات وتطوير الأنظمة الرقمية فلن يكون أمام هذه الصناعة هامش للخطأ مهما صَغُر لأن التكلفة على الصعيدين المادي والزمني ستكون باهظة جدًا. تحدثنا في مقال "مدخل إلى تطوير البرمجيات" عن المجال وعملية تطوير البرمجيات عمومًا، وأما الهدف من هذا المقال هو الوقوف على دورة الحياة التي يجب أن تسلكها عملية تطوير البرمجيات حتى يكون المنتج النهائي فعالًا ومحققًا للغاية التي صُمم لأجلها بأدنى هامش للخطأ انطلاقًا من الفكرة وحتى التنفيذ والصيانة. كما سيبحث في أهم الاستراتيجيات المتبعة في إدارة دورة حياة تطوير البرمجيات Software Development Life Cycle واختصارًا SDLC. كما يساعدك هذا المقال في تنمية معارفك ومهاراتك في تحليل الأنظمة إن كنت تفكر فيها كمهنة مستقبلية. من أين تأتي الأفكار؟ فما يخلق البرمجيات هو الحاجة لها، وتظهر الحاجة إلى بناء نظام معلوماتي جديد لإدارة نشاط معين عندما يبدأ هذا النشاط أو العمل بالمعاناة جراء أسباب متنوعة منها: انخفاض الحصة السوقية لمنتجاته. ضعف في الخدمات التي يقدمها لعملائه. ظهور منافسين جدد يستغلون تقنيات أحدث في إدارة أعمالهم. مشاكل في المنظومة القائمة وانخفاض كفاءتها. وقد تكون الحاجة إلى المنظومة الجديدة رؤية مستقبلية لواقع العمل والرغبة في تحسين واقعه: الرغبة في الوصول إلى عملاء جدد أو أسواق جديدة. مواكبة أكثر التقنيات انتشارًا وأحدثها كالحوسبة السحابية ومنصات البيانات الضخمة أو الانتقال إلى تطبيقات الهواتف الذكية. تقديم ابتكارات واختراقات ثورية تبقي الشركات التقنية في حيز المنافسة والهيمنة على الصناعة. لا يمكن لأي كان أن يتخذ قرار تطوير برمجيات المنظومة المعلوماتية القائمة as-is system أو استبدالها بمنظومة جديدة to-be system في الجهة التي تحتاج إلى ذلك، بل يأتي هذا القرار عادة عن أشخاص تقنيين أو غير تقنيين على تماس مباشر مع المنظومة ومع أصحاب القرار. يُدعى هؤلاء بالمعنيين أو أصحاب المصلحة stakeholders في بناء أو تطوير المنظومة وقد يكون هؤلاء: مالكو أنظمة مشرفون على تشغيل أنظمة مبرمجون مصممو ومحللو أنظمة مستشارون أو مزودون للخدمات المعلوماتية يمتلك هؤلاء الخبرة والدراية التي تؤهلهم لمعرفة الإيجابيات والسلبيات في المنظومات القائمة واستشعار الفرص الجديدة التي قد يأتي بها التغيير. دورة إدارة تطوير المنتجات احترف إدارة تطوير المنتجات الرقمية بدءًا من التخطيط وتحليل السوق وحتى إطلاق منتج مميز وناجح اشترك الآن هل نبدأ بكتابة الشيفرة مباشرة؟! عندما نتحدث عن تطوير منظومة برمجية لا نتحدث عن تطبيق بسيط لعرض منتجات أو لإجراء اتصال مع قاعدة بيانات بسيطة، بل منظومة متكاملة تضم عددًا كبيرًا من الحزم البرمجية التي تنفذ مهام مختلفة وتتكامل مع بعضها لتلبي المتطلبات المتوقعة من هذه المنظومة. وفي هذا السياق، لا يمكن بأي شكل من الأشكال أن تعتبر عملية بناء المنظومات البرمجية عملية بديهية سهلة التنفيذ. يتطلب بناء المنظومات المركبة عملًا هائلًا وتخطيطًا دقيقًا للمتطلبات التي ينبغي لهذه المنظومة تنفيذها في المراحل المبكرة قبل اتخاذ القرار النهائي بالمضي في العمل. فهناك قاعدة ذهبية لا بد من إدراكها تنص على أنّ التكلفة ستزداد بشكل أسي مع كل تغيير في متطلبات منظومة برمجية أثناء التنفيذ. والأسوأ من ذلك كله تسليم منظومة غير مكتملة إلى العميل. لم تأتي هذه القاعدة من فراغ، بل من الإخفاقات التي عانتها الكثير من الشركات العالمية، وإليك بعض الأمثلة من الواقع: الشركة العام المنظومة البرمجية الخسارة بالدولار فورد موتورز الأمريكية 2004 شراء منظومة جرى التخلي عنها بعد نشرها مباشرة 400 m$ هيوليت باكارد الأمريكية 2004 منظومة برمجية لتخطيط الموارد كثُرت فيها الأخطاء m160‏$ HRM Inland البريطانية 2004 أخطاء برمجية في المنظومة قادت إلى تحميل ضرائب إضافية 3.45 m$ Sainsburys البريطانية 2004 منظومة لإدارة سلسلة المزودين فشلت بعد النشر مباشرة 527 m$ وزارة الصحة البريطانية 2006 منظومة متكاملة لإدارة الصحة الوطنية وتسجيل المرضى لم تنجح بعد 4 سنوات من التأخير ولم ينجز أكثر من 80% منها. 20 b$ وزارة العدل البريطانية 2007 التخلي عن منظومة لتسجيل ومراقبة المدانين 245 m$ وكالة الحدود البريطانية 2009 تأخير في تسليم منظومة إدارة الحدود الإلكترونية حتى 2015 1.7 b$ BBC البريطانية 2014 فشل مشروع رقمنة أرشيف الإذاعة نظرًا للتخبط وضعف التخطيط. 153 m$ فالبدء إذًا في كتابة الشيفرة بمجرد أن تستشف فكرة المشروع سيقودك إلى الفشل لا محالة. لهذا لا بدّ من أن يمر مشروعك ضمن سلسلة من المراحل التي ينضج فيها وتتخذ القرارات التحليلية والتصميمة الصحيحة. دورة حياة البرمجيات تمر البرمجيات والأنظمة المعلوماتية عمومًا أثناء تطويرها بأربعة مراحل رئيسة وفي كل مرحلة مجموعة من الخطوات. ينتج عن كل مرحلة مجموعة من المخرجات deliveries تُبنى عليها مراحل لاحقة. هذه المراحل الأربعة هي: التخطيط planning التحليل analysis التصميم design التنفيذ implementation سنتحدث باختصار عن كل مرحلة وسنتكلم بإسهاب عن كل مرحلة في مقالات لاحقة. مرحلة التخطيط لبناء منظومة برمجية لا بد في هذه المرحلة من الإجابة على الأسئلة التالية: لم علينا بناء هذه المنظومة أو هذا البرنامج؟ ما الذي ستقدمه هذه المنظومة إلى الفعالية التي طلبتها أو للجهة التي تنتجها؟ هل يمكننا بناء هذه المنظومة؟ كم يستغرق بناؤها؟ وكما أشرنا سابقًا أن لكل مرحلة مجموعة من الخطوات التي تمر بها حتى تكتمل، وعادة ما تضم مرحلة التخطيط خطوتين أساسيتين هما: تهيئة المشروع Project initiation: يٌقصد بتهيئة المشروع هو التخطيط المبدئي له، وتضم هذه الخطوة مجموعة خطوات فرعية هي: تحديد أهمية المشروع وضرورة بنائه بالنسبة للعميل أو صاحب المصلحة المعني مباشرة بتطويره. دراسة جدوى المشروع Project feasibility بالتشاور المباشر بين محلل الأنظمة والعميل وتكون الدراسة على ثلاثة أصعدة تقنية تحدد إمكانية بناء المنظومة، واقتصادية تحدد ما إن كان ضروريًا بناء المنظومة الجديدة أو تحسين القديمة، وتنظيمية تحدد ما إن كان سيلقى المنتج الجديد ترحيبًا من مستخدميه وهل يتماشى مع أسلوب العمل في الجهة التي طلبت بناءه. دراسة المخاطر، وتختلف طريقة دراسة المخاطر من شركة إلى أخرى إلا أنها تسعى عمومًا إلى تحديد مصدر الخطر واحتمالية وقوعه وأثره المتوقع على المنظومة وطريقة تفادي الخطر أو التخفيف من أثره. إدارة المشروع Project management: وهي عملية التحكم بتطوير المشروع خلال مدة محددة بأقل تكلفة للحصول على المنظومة المطلوبة صحيحة وفعالة. يراقب مديرو المشروع عادة العمل ككل ويتحكمون بكل المهمات ويحددون الأدوار الوظيفية وينسقون بينها وتضم هذه الخطوة الخطوات الفرعية التالية: تحديد عدد الموظفين سواء محللي نظم أو مصممين أو مبرمجين. البحث عن المهارات اللازمة لإنجاز كل مهمة من مهام المنظومة. تحفيز فريق العمل لتحقيق الأهداف. الحد بين النزاعات والخلافات وتقريب وجهات النظر في فريق العمل. اقتراح التقنيات اللازمة لإنجاز العمل. وضع خطة عمل تعتمد على الاستراتيجية المتبعة في إدارة دورة حياة المنظومة. أما مخرجات هذه المرحلة فتأتي في مستندين الأول يضم خطة العمل والثاني مستند دراسة الجدوى والمخاطر ويعرض على الشخص المسؤول أو على لجنة القبول acceptance committee فإما أن يُقبل أو يُرفض أو يؤجل وفقًا للفائدة المضافة موازنة بالمخاطر. مرحلة تحليل المنظومة لا بد أن تتمكن هذه المرحلة من الإجابة عن الأسئلة التالية: ماذا نتوقع من المنظومة؟ ما هو المطلوب منها؟ من سيستخدم المنظومة الجديدة أو المطوّرة؟ أين ومتى ستُستخدم المنظومة الجديدة؟ تضم هذه المرحلة خطوتين رئيسيتين: تحديد متطلبات المنظومة بناء نماذج تحليلية للمنظومة تحديد متطلبات المنظومة define requirements وهي أكثر خطوات هذه المرحلة (إن لم يكن دورة التطوير بأكملها) أهمية وحساسية. إذ يمكن أن نناقش في هذه المرحلة ماهو المطلوب من المنظومة البرمجية وفقًا لرؤية المعنيين بتطويرها على مختلف المستويات والمرجعيات. فالنقاش في هذه المرحلة ووضع التصورات والنماذج سيكون متاحًا إلى أقصى الحدود دون أي آثار سلبية موازنة بالتغييرات التي يُضطر فريق العمل إلى إجرائها في مرحلة التنفيذ، إذ سيرفع ذلك من نسبة فشل المشروع إلى أكثر من 50%. وتتميز هذه المرحلة بأنها تدريجية أي يجري تطوير نماذج عن متطلبات المنظومة تدريجيًا وليس دفعة واحدة كما تتميز بأنها تكرارية أي يكون تحسين النماذج بالتكرار. ما هو المتطلب؟ المتطلب هو تصريح عما يُراد من المنظومة فعله أو تصريح عن الخصائص التي تتمتع بها المنظومة التي نريد بناءها. هنالك نوعان من المتطلبات: متطلبات وظيفية functional ومتطلبات غير وظيفية nonfunctional. أما المتطلبات الوظيفية functional، فتضم التصريحات التي تحدد ما على المنظومة فعله أو تحدد إمكانياتها. وكمثال على المتطلب الوظيفي هو أن تسمح المنظومة للمستخدم مثلًا بتسجيل دخوله إليها فهذا المتطلب يتعلق مباشرة بطريقة عمل المنظومة وبالتالي هو متطلب وظيفي. وأما المتطلبات غير الوظيفية nonfunctional، فتضم تصريحات عن ميزات هذه المنظومة التي لا تتعلق بطريقة عملها. وكمثال عليها أن تعمل المنظومة مثلًا على الحواسب وأن تعمل أيضًا على الهواتف الذكية. كما تجد أحيانًا متطلبات إضافية مثل: متطلبات عمل: وهو تصريح عما يحتاجه العميل. متطلبات مستخدمين: وتضم تصريحات عن طريق استخدام المنظومة. متطلبات منظومة: وتضم تصريحات عن أسلوب وطريقة بناء المنظومة. ينتج عن مرحلة تحديد المتطلبات مستند يُدعى "تصريح تحديد المتطلبات requirements definition statement"ويضم المتطلبات الوظيفية وغير الوظيفية على شكل قائمة مفصّلة قد تُعطى فيها الأولوية لمتطلبات على أخرى إضافة إلى بعض المعلومات الضرورية للخطوات القادمة، كما يحدد هذا المستند ما يُدعى بنطاق عمل أو إطار عمل المنظومة system domain الذي ينبغي العمل في حدوده دون رفع أو تخفيض المتطلبات. بناء نماذج تحليلية للمنظومة يحاول فريق العمل خلال هذه المرحلة بناء نماذج models عن المتطلبات الوظيفية. وتوصِّف هذه المتطلبات مداخل ومخارج كل متطلب وطريقة تنفيذه. وغالبًا ما تُستخدم نماذج حالات الاستخدام use-case model التي توصّف كل وظيفة من وظائف المنظومة ومن سيشارك في إنجاز هذه الوظيفة سواء وظائف أخرى أو مستخدم خارجي، كما تُستخدم نماذج النشاط Activity models لتوصيف تسلسل تنفيذ العمليات التي تحقق وظيفة محددة وطريقة التفاعل المتبادل بين الوظائف المختلفة في المنظومة. فلو كان لدينا مثلًا منظومة برمجية لإدارة صراف آلي ATM ستكون إحدى حالات الاستخدام هو "سحب نقود" وسترتبط حالة الاستخدام هذه بحالة استخدام أخرى "التحقق من هوية المستخدم" ولا بد من وجود مشارك خارجي وهو "مستخدم الصراف". إن ما يمثّل هذه الترابطات هو مخطط حالات الاستخدام أما بالنسبة لمخطط النشاط فسيوُصف على الشكل التالي مثلًا: الصراف: يعرض رسالة ترحيب. المستخدم: يدخل البطاقة. الصراف: يحلل البطاقة ويعرض للمستخدم قائمة الخيارات. المستخدم: يضغط زر "سحب النقود". الصراف: يعرض قائمة بالمبالغ التي يمكن سحبها. المستخدم: يختار المبلغ المطلوب. الصراف: يعدّ النقود ويخرجها. تمثل هذه النماذج على شكل ملف يُدعى توصيف حالات الاستخدام use-case description أو عن طريق مخططات UML -لغة النمذجة الموحدة unified mark language- تُعرف بمخططات حالات الاستخدام ومخططات النشاط. تُبنى بعد تكوين النماذج الوظيفية أيضًا النماذج البنوية التي تستفيد من نماذج حالات الاستخدام وملفات توصيفها في توصيف المتطلبات على شكل أصناف لها خصائص (سمات attributes) وطرق methods وذلك إن كانت استراتيجية التحليل هي استراتيجية كائنية التوجّه object oriented strategy وهي الاستراتيجية الأكثر شيوعًا. تمثّل هذه الأصناف ضمن مخططات تُدعى مخططات الأصناف ويُستفاد منها لاحقًا في عملية برمجة المتطلب الوظيفي. وأخيرًا تُبنى النماذج السلوكية behavioral models وهي نماذج تعبّر عما يجري داخليًا خلف الستار حتى تؤدي المنظومة الوظائف المطلوبة منها ظاهريًا أي كما يراها المستخدم الخارجي. تتشكل هذه النماذج انطلاقًا من النماذج البنيوية والوظيفية لأنها تعبير عن التفاعل بين النماذج البنيوية (الكائنات التي تشكل المنظومة). وتُمثّل النماذج السلوكية باستخدام مخططات UML منها مخطط التتابع sequence diagram التي تمثل تتابع الرسائل بين الكائنات، ومخططات الاتصال communication diagram التي تمثل الطرق التي تسلكها تلك الرسائل ومخططات التوقيت timing diagrams. ينتج عن هذه المرحلة ورقة تُدعى "اقتراح المنظومة system proposal" وتضم تفاصيل عن وظائف المنظومة الجديدة وطريقة إنجازها مُدعّمًا بالنماذج والمخططات التي بنيت في هذه المرحلة وتُرفع إلى لجنة القبول لاتخاذ القرار بالمضي أو إعادة تحليل المتطلبات. مرحلة تصميم المنظومة البرمجية وتجيب هذه المرحلة عن سؤال مهم وهو كيف سنبني المنظومة؟ إذ تُقرر في هذه المرحلة نوعية العتاد الصلب التي ستُستخدم والبرمجيات اللازمة والبنية التحتية لشبكات الاتصالات وواجهات المستخدم وقواعد البيانات ونماذج إرسال البيانات والتقارير. تضم هذه المرحلة الخطوات التالية: وضع استراتيجية التصميم: وفيها يجيب فريق العمل بالتعاون مع الجهة المعنية عن الأسئلة التالية: هل ستُطوّر المنظومة محليًا في الجهة التي تحتاج المنظومة اعتمادًا على كوادرها الخاصة؟ هل ستطور المشروع شركة مختصة أخرى؟ هل ستشتري الشركة حزم برمجية جاهزة تحقق متطلبات مرحلة التحليل؟ تطوير المعمارية الأساسية للمنظومة: بما في ذلك العتاد الصلب والبرمجي وواجهة المستخدم والبنية التحتية لشبكة الاتصال وهل سيتم البناء على البنية التحتية السابقة أم تحتاج المنظومة الجديدة إلى بنية تحتية جديدة كليًا. تطوير مواصفات لقواعد البيانات والملفات: أي تحديد طبيعة البيانات التي تُخزن وحجمها وأين وكيف ستُخزن. تصميم البرمجيات التي ستُبنى: أي ما هي البرامج التي ينبغي للمبرمجين العمل عليها وما وظيفة كل برنامج وما هي علاقته بغيره. ينتج عن هذه المرحلة مجموعة المخرجات التالية: مستندات تصميم المعمارية. مستندات تصميم واجهة المستخدم. مستندات مواصفات قواعد وملفات البيانات. مستند تصميم البرامج. تستخدم هذه المستندات لاحقًا في توجيه مرحلة إنجاز المنظومة. مرحلة إنجاز المنظومة وهي المرحلة الأخيرة من دورة تطوير البرمجيات، وتحظى هذه المرحلة بكامل الانتباه لأنها تعد المرحلة الأطول والأكثر تكلفة. تضم هذه المرحلة الخطوات التالية: بناء المنظومة اختبار المنظومة توثيق المنظومة تركيب المنظومة إدارة التغيير التدريب على استخدام المنظومة الصيانة ودعم المنظومة التقييم الراجع للمشروع بناء المنظومة ويقصد فيها برمجة كل وظيفة من وظائف المنظومة والربط بين هذه البرمجيات وتعتمد بشكل كامل على مخرجات مرحلتي التحليل والتصميم. تُعد هذه المرحلة بأنها الأقل خطرًا على فشل المنظومة ولا يأتي فشل المنظومة نتيجة لضعف البرمجة بل لضعف مخرجات عمليتي التحليل والتصميم. تجري في هذه المرحلة أيضًا عملية توثيق الإجرائيات بدقة للاستفادة منها في خطوات الاختبار والصيانة. اختبار المنظومة تهدف هذه الخطوة إلى كشف أكبر قدر ممكن من العيوب التي قد تتسبب في إخفاق البرنامج، وعادة ماتكون الخطوة الأطول والأكثر تركيزًا في هذه المرحلة لأنه من الصعب إنشاء منظومة خالية تمامًا من العيوب، كما أن عملية البحث والاستقصاء عن جميع العيوب أمر مرهق زمنيًا وماديًا. لتلك الأسباب يجري اختبار المنظومة على مبدأ ما الذي تقدمه فعليًا موازنةً مع ما يتوجب عليها فعله. يختبر فريق متخصص المنظومة بواحدة أو بجميع الطرق التالية: اختبارات الوحدات unit tests: ويجري على دالة أو صنف أو جزء محدد من وحدة برمجية للتأكد من أن الدخل الصحيح يعطي الخرج المطلوب. اختبارات التكامل integration tests: يختبر التفاعل المتبادل بين مجموعة محددة من الأصناف لإنجاز وظيفة محددة. اختبارت المنظومة system tests: يختبر تفاعل جميع الأصناف مع بعضها لإعطاء وظيفة متكاملة للمنظومة دون أخطاء، وهو مشابه لاختبار التكامل لكن على صعيد أوسع. اختبارات القبول acceptance tests: وينفذها المستخدمون النهائيون للمنظومة تحت إشراف عضو أو أكثر من فريق العمل وذلك لتقييم قبول المستخدم لهذه المنظومة الجديدة. توثيق المنظومة وهي عملية ممتدة عبر جميع المراحل لكنها تُنظم في هذه الخطوة وتضم توثيق عن المنظومة بما يساعد المبرمجين والمحللين في بناء وصيانة المنظومة وتوثيق المستخدم الذي يساعده على استثمار المنظومة. وقد يكون التوثيق مرجعيًا لمساعدة المستخدم على إنجاز مهمة محددة أو إجرائيًا لوصف إنجاز خطوة ما أو مواد تعليمية. تركيب المنظومة وتتضمن هذه الخطوة تثبيت العتاد الصلب والبرمجيات اللازمة وفقًا لمعايير المعيارية المقترحة. إدارة التغيير لا يجري الانتقال إلى استخدام المنظومة الجديدة مباشرة بل على مراحل لمساعدة المستخدمين النهائيين على التأقلم معها بأقل توتر ممكن. ولأن لكل تغيير مقاومة لا بد أن يتشارك محللو المنظومة وأصحاب القرار ومديرو المشروع في إدارة مرحلة التحوّل وتوجيه المستخدمين وتحفيزهم على تبني المنظومة الجديدة. التدريب على استخدام المنظومة لا بد في هذه المرحلة من تقديم المهارات اللازمة لاستثمار النظام دون الافتراض المسبق بأن المنظومة سهلة التعلّم. كما ينبغي التركيز في هذه المرحلة على مساعدة المتدرب على تنفيذ المهام الموكلة إليه فقط دون الغوص في تفاصيل وميزات المنظومة الجديدة، فهنا تأتي أهمية وجود توثيق شامل. الصيانة ودعم المنظومة وهي عملية تحسين المنتج البرمجي كي يلبي دائمًا متطلبات العمل، وقد تكون خطوة الصيانة ذات تكلفة عالية. يُكلف بعملية الصيانة عادة محللو الأنظمة والمبرمجون المبتدئون. ويأتي دعم المنظومة عبر خيارات عدة منها: التدريب عند الطلب أو الحاجة. الدعم المباشر عبر الإنترنت: من خلال التوثيق والأسئلة أكثر شيوعًا وحتى المحادثة المباشرة. مكاتب الدعم: وذلك لاستشارة الخبراء مباشرة حول مشاكل محددة بناء على مواعيد مسبقة. التقييم الراجع للمشروع أي تقييم نجاح المشروع أو فشله والطرق الكفيلة بتحسينه وتطويره وأخذ العبر منه. وتنفذ هذه الخطوة عادة وفق مسارين: مراجعة منظومة: والهدف هو موازنة التكلفة والفائدة الحقيقية موازنة مع التكلفة والفوائد المقدرة في مرحلتي التخطيط والتحليل. مراجعة فريق العمل: إذ يقيِّم كل فرد من أفراد فريق العمل أخطاءه ونجاحاته في إنجاز المهام الموكلة إليه. يمكن بعد ذلك لمدير المشروع أن يجمع التقييمات ويضيف إليها بعض التوضيحات والشروحات ليخرج بملف يُدعى "دروس تعلمناها lesson learned" والتي تلعب دورًا مهمًا في تدريب وتعليم الأعضاء الجدد وفي تفادي أية أخطاء مماثلة في مشاريع مستقبلية. خاتمة تعرفنا في هذا المقال على الأساسيات المتبعة في التخطيط لتطوير البرمجيات أو المنظومات المعلوماتية عمومًا ورأينا أهمية التخطيط التدقيق والتحليل لمتطلبات البرمجيات للوصول إلى منتج قادر على الصمود والمنافسة. كما تعرفنا على المراحل الأساسية الأربعة لعملية تطوير المنتجات البرمجية وهي مراحل التخطيط والتحليل والتصميم والتنفيذ، وتعرفنا على مجموعة الأعمال التي ينبغي القيام بها في كل مرحلة والمخرجات التي تنتج عن كل منها وصولًا إلى المنتج النهائي وصيانته ودعمه. اقرأ أيضًا كيف تتجنب كارثة الاستعانة بفريق خارجي في تطوير البرمجيات دليل المبتدئين لمنهجية أجايل Agile الأخطاء السبع القاتلة لأيّ مشروع برمجيات
    1 نقطة
  42. سنطّلع في هذا المقال على مشاكل التوافق مع المتصفحات Cross-browser الشائعة التي ستواجهها في شيفرة HTML و CSS، بالإضافة إلى الأدوات التي يمكن استخدامها لمنع حدوثها أو إصلاحها، إذ يتضمن ذلك كشف الأخطاء المحتملة في الشيفرة البرمجية والتعامل مع بادئات CSS واستخدام أدوات تطوير المتصفح لتعقّب المشاكل واستخدام تعويض نقص دعم المتصفحات Polyfill لإضافة الدعم إليها، ومعالجة مشاكل التصميم المتجاوب مع الشاشات وغير ذلك. المتطلبات الأساسية: يجب أن تتعلم أساسيات لغات HTML و CSS وجافاسكربت JavaScript، وأن تكون لديك فكرة عن المبادئ عالية المستوى لاختبار التوافق مع المتصفحات. الهدف: أن تكون قادرًا على تشخيص مشاكل التوافق مع المتصفحات المختلفة الشائعة في شيفرة HTML و CSS واستخدام الأدوات والتقنيات المناسبة لإصلاحها. مشاكل لغتي HTML و CSS تكمن مشاكل لغتَي HTML و CSS في حقيقة أنهما لغتان بسيطتان إلى حد ما، ولا يأخذها المطورون على محمل الجد في أغلب الأحيان من حيث التأكد من أن الشيفرة مُعَدّة جيدًا وفعالة وتصف الغرض من الميزات الموجودة في الصفحة. تُستخدَم لغة جافاسكربت في أسوأ الحالات لإنشاء محتوى صفحة الويب وتنسيقها بالكامل، مما يجعل صفحاتك غير شاملة وذات أداء ضعيف، ويُعَد إنشاء عناصر DOM مكلفًا، كما لا تُدعَم الميزات الجديدة في حالات أخرى باستمرار على متصفحات متعددة، مما يجعل بعض الميزات والتنسيقات لا تعمل عند بعض المستخدِمين. تُعَدّ مشاكل التصميم المتجاوب مع الشاشات شائعًا أيضًا، إذ يمكن أن يوفر الموقع الذي يبدو جيدًا في متصفح على حاسوب تجربةً سيئةً على هاتف محمول، لأن المحتوى صغير جدًا بحيث لا يمكن قراءته أو بسبب كون الموقع بطيئًا بسبب الحركات الثقيلة. لننتقل الآن إلى كيفية تقليل الأخطاء على المتصفحات التي تنتج عن شيفرة HTML أو CSS. إصلاح المشاكل العامة يُعَدّ اختبار بعض المتصفحات الحديثة على الحاسوب وعلى الهاتف المحمول استراتيجيةً جيدةً للتأكد من عمل شيفرتك بنجاح قبل التركيز على مشاكل التوافق مع المتصفحات. قدّمنا في مقالَي تنقيح أخطاء شيفرة HTML وتنقيح أخطاء شيفرة CSS بعض الإرشادات الأساسية حول تنقيح أخطاء شيفرة HTML و CSS، فإذا لم تكن على دراية بالأساسيات، فيجب عليك بالتأكيد مراجعة هذين المقالين قبل المتابعة، إذ يتعلق الأمر بالتحقق مما إذا كانت شيفرة HTML و CSS منسقةً جيدًا ولا تحتوي على أيّ أخطاء صياغية. ملاحظة: تظهر إحدى المشاكل الشائعة في لغتَي CSS و HTML عندما تبدأ قواعد CSS المختلفة في التعارض مع بعضها البعض، ويمكن أن يشكّل ذلك مشكلةً خاصةً عند استخدام شيفرة خارجية مثل استخدام إطار عمل خاص بلغة CSS ثم تجد أن أحد أسماء الأصناف Class التي يستخدِمها هذا الإطار يتعارض مع اسم استخدَمته مسبقًا لغرض مختلف، أو يمكن أن تجد أن شيفرة HTML التي تنشئها واجهة برمجة تطبيقات جهة خارجية -مثل إنشاء إعلانات- تتضمن اسم صنف أو معرّف ID استخدمته مسبقًا لغرض مختلف، ويمكنك ضمان عدم حدوث ذلك من خلال البحث في الأدوات التي تستخدِمها أولًا وتصميم شيفرتك على أساسها، ويمكنك استخدام فضاء أسماء Namespace في CSS إذا كان لديك عنصر واجهة مستخدم Widget مثلًا، ولكن تأكد من أنه يحتوي على صنف مميز، ثم استخدم المحدّدات Selectors التي تحدد العناصر ضمن عنصر واجهة المستخدم باستخدام هذا الصنف، وبالتالي تقل احتمالية التعارضات مثل ‎.audio-player ul a. التحقق من صحة شيفرة HTML و CSS يتضمن التحققُ من صحة شيفرة HTML التأكدَ من أن جميع الوسوم Tags مغلقة ومتداخلة بطريقة صحيحة، وأنك تستخدِم DOCTYPE والوسوم لغرضها الصحيح، كما يجب التحقق من صحة الشيفرة البرمجية بانتظام، وإحدى الخدمات التي يمكنها التحقق من صحة الشيفرة البرمجية هي خدمة Markup Validation Service من W3C التي تسمح لك بالإشارة إلى شيفرتك البرمجية ثم تعيد قائمةً بالأخطاء: كما تحتاج إلى شيفرة CSS للتحقق من أنّ أسماء الخاصيات مكتوبة بطريقة صحيحة وأنّ قيم الخاصيات صحيحة وصالحة مع الخاصيات المستخدَمة فيها، وللتحقق من عدم فقدان أي أقواس معقوصة وما إلى ذلك، كما تحتوي W3C على أداة التحقق CSS Validator أيضًا. منقحات الصياغة Linters لا يشير تطبيق منقّح الصياغة Linter إلى الأخطاء فقط، وإنما يمكنه إعطاء تحذيرات حول الممارسات السيئة في شيفرة CSS، ويمكن تخصيص منقّحات الصياغة لتكون أكثر أو أقل صرامةً في تقارير الأخطاء أو التحذيرات الناتجة. هناك العديد من تطبيقات منقحات الصياغة على الإنترنت وأفضلها تطبيق Dirty Markup لشيفرات HTML و CSS وجافاسكربت وتطبيق CSS Lint لشيفرة CSS فقط، إذ تسمح لك هذه التطبيقات بلصق شيفرتك في نافذة ما ثم ستضع علامة x على الأخطاء، ويمكن بعد ذلك تحريك مؤشر الفأرة فوقها للحصول على رسالة خطأ تخبرك ما هي المشكلة، ويسمح لك تطبيق Dirty Markup بإجراء إصلاحات على شيفرة HTML باستخدام زر التنظيف "Clean". ولكن لا يُعَدّ ذلك ملائمًا، إذ ستضطر إلى نسخ شيفرتك ولصقها في صفحة ويب للتحقق من صحتها عدة مرات، إذ تريد منقّح صياغة يتناسب مع سير عملك بأقل قدر من المتاعب، كما تحتوي العديد من محرّرات الشيفرات البرمجية على إضافات تنقيح الصياغة، إذ يحتوي المحرّر Atom من GitHub مثلًا على نظام بيئي غني بالإضافات مع العديد من خيارات تنقيح الأخطاء، وإليك مثال عن كيفية عمل هذه الإضافات Plugins: ثبّت المحرّر Atom إذا لم يكن لديك إصدار حديث مثبَّت مسبقًا. انتقل إلى مربع حوار تفضيلات Atom من خلال اختيار قائمة Atom ثم التفضيلات Preferences على نظام Mac أو من قائمة ملف File ثم Preferences في نظامَي Windows و Linux، ثم اختر خيار التثبيت Install في القائمة اليسرى. اكتب الكلمة "lint" في حقل البحث عن الحزم Search Packages واضغط على الزر Enter أو Return للبحث عن الحِزم المتعلقة بتنقيح الصياغة. يجب أن ترى حزمة تسمى "lint" في أعلى القائمة، لذا ثبّتها باستخدام زر التثبيت Install، إذ تعتمد منقّحات الصياغة الأخرى عليها في العمل، ثم ثبّت الإضافة linter-csslint لتنقيح صياغة شيفرة CSS والإضافة linter-tidy لتنقيح صياغة شيفرة HTML. حاول تحميل ملف HTML وملف CSS بعد انتهاء تثبيت الحزم، حيث سترى المشاكل مميزةً باللون الأخضر للتحذيرات وسترى دوائر حمراء للأخطاء بجوار أرقام الأسطر، ولوحةً منفصلةً في الأسفل توفِّر أرقام الأسطر ورسائل الخطأ وقيمًا مقترحة أو إصلاحات أخرى في بعض الأحيان. يتوفر لدى المحررات المشهورة الأخرى حزم تنقيح صياغة مماثلة مثل: SublimeLinter للمحرّر Sublime Text. Notepad++ Linter. VSCode linters. أدوات المطور في المتصفحات تتميز أدوات المطور المُضمَّنة في معظم المتصفحات بأدوات مفيدة لتعقب الأخطاء خاصة في شيفرة CSS. ملاحظة: لا تظهر أخطاء شيفرة HTML بسهولة في أدوات المطور، إذ سيحاول المتصفح تصحيح الوسوم ذات التنسيق السيئ تلقائيًا، حيث تُعَدّ أداة التحقق W3C Validator أفضل طريقة للعثور على أخطاء HTML. يعرض فاحص CSS في المتصفح Firefox مثلًا تصريحات CSS غير المُطبَّقة مشطوبة مع مثلث تحذير بجانبها، وسيوفر تحريك الفأرة فوق مثلث التحذير رسالةً تشرح الخطأ كما يلي: تمتلك أدوات التطوير في المتصفحات الأخرى ميزات مماثلة أيضًا. المشاكل الشائعة للتوافق مع المتصفحات لننتقل الآن إلى إلقاء نظرة على بعض مشاكل HTML و CSS الأكثر شيوعًا للتوافق مع المتصفحات، فالمجالات الرئيسية التي سنركز عليها هي نقص دعم الميزات الحديثة ومشاكل التخطيط. لا تدعم المتصفحات القديمة الميزات الحديثة تُعَدّ هذه المشكلة شائعةً خاصةً عندما تحتاج إلى دعم المتصفحات القديمة مثل إصدارات IE القديمة، أو إذا أردت استخدام ميزات تُطبَّق باستخدام بادئات CSS، إذ تعمل معظم وظائف HTML و CSS الأساسية مثل عناصر HTML وتنسيق CSS الأساسي للألوان والنصوص على معظم المتصفحات التي تريد دعمها، ولكن يظهر مزيد من المشاكل عندما تبدأ في استخدام ميزات أحدث من HTML و CSS. يُفضَّل البحث عن المتصفحات المدعومة والتقنيات ذات الصلة المفيدة بعد تحديد قائمة بالتقنيات غير المدعومة بصورة عامة التي ستستخدمها. سلوك HTML الاحتياطي يمكن حل بعض المشاكل بمجرد الاستفادة من الطريقة التي تعمل بها لغة HTML و CSS. تُعامَل عناصر HTML التي لا يتعرّف عليها المتصفح بوصفها عناصر مضمنةً مجهولة الاسم، أي هي عناصر مضمنة فعالة بدون قيمة دلالية مثل عناصر <span>، ولا يزال بإمكانك الإشارة إليها باستخدام أسماءها وتنسيقها باستخدام لغة CSS، فما عليك سوى التأكد من أنها تتصرف كما تريدها أن تتصرف مثل إعداد الخاصية display‎ إلى شيء آخر غير inline إن كان هنالك حاجة. تحتوي عناصر HTML الأكثر تعقيدًا مثل <video> و <audio> و <canvas> على آليات احتياطية لإضافتها، والتي تعمل باستخدام المبدأ السابق نفسه، إذ يمكنك إضافة محتوًى احتياطيًا بين وسمَي الفتح والإغلاق، وستتجاهل المتصفحات غير الداعمة العنصر الخارجي بفعالية وتشغّل المحتوى المتداخل. إليك المثال التالي: <video id="video" controls preload="metadata" poster="img/poster.jpg"> <source src="video/tears-of-steel-battle-clip-medium.mp4" type="video/mp4"> <source src="video/tears-of-steel-battle-clip-medium.webm" type="video/webm"> <!-- Offer download --> <p>Your browser does not support HTML5 video; here is a link to <a href="video/tears-of-steel-battle-clip-medium.mp4">view the video</a> directly.</p> </video> يتضمن هذا المثال رابطًا بسيطًا يسمح لك بتنزيل الفيديو إذا لم يعمل مشغل فيديو HTML، لذا لا يزال على الأقل بإمكان المستخدِم الوصول إلى الفيديو. تعرض عناصر نموذج HTML صفات احتياطية، إذ أدخلت لغة HTML5 أنواعًا خاصة من عناصر <input> لإدخال معلومات محددة في النماذج مثل الأوقات والتواريخ والألوان والأعداد وما إلى ذلك أو يستعمل النوع النصي type="text"‎ إن لم يدعم المتصفح نوعًا حديثًا يقدم ميزة جديدة، وهي مفيدة جدًا لا سيما على منصات الهاتف المحمول، إذ توفر طريقةً لإدخال البيانات التي تُعَدّ مهمةً جدًا لتجربة المستخدِم، كما توفر المنصات الداعمة أدوات واجهة مستخدِم خاصةً عند استخدام هذه الأنواع من حقول الإدخال مثل أداة التقويم لإدخال التواريخ. يوضِّح المثال التالي حقول إدخال التاريخ والوقت: <form> <div> <label for="date">Enter a date:</label> <input id="date" type="date"> </div> <div> <label for="time">Enter a time:</label> <input id="time" type="time"> </div> </form> يكون خرج الشيفرة السابقة كما يلي: ملاحظة: يمكنك مشاهدة هذا الخرج قيد التشغيل مباشرةً على forms-test.html، كما يمكنك الاطلاع على شيفرة هذا المثال على GitHub. إذا عرضت هذا المثال على متصفح داعم مثل المتصفح Chrome للحاسوب ولنظام Android أو iOS Safari، فسترى عناصر واجهة المستخدِم أو الميزات الخاصة قيد التشغيل أثناء إدخال البيانات. بينما ستعود المدخلات إلى مدخلات نص عادية على منصة غير داعمة مثل Internet Explorer، لذا لا يزال بإمكان المستخدِم إدخال بعض المعلومات على الأقل. سلوك CSS الاحتياطي يمكن القول أنّ لغة CSS أفضل من لغة HTML في الإجراءات الاحتياطية، فإذا صادف المتصفح تصريحًا أو قاعدةً لا يفهمها، فسيتخطاها دون تطبيقها أو ارتكاب خطأ ما، ويمكن أن يكون ذلك محبطًا لك وللمستخدِمين إذا انتقل هذا الخطأ إلى شيفرة الإنتاج، ولكن هذا يعني على الأقل عدم انهيار الموقع بأكمله بسبب خطأ واحد. لنلقِ نظرةً على المثال التالي الذي يحوي مربعًا بسيطًا مُنسَّقًا باستخدام CSS المختلفة: ملاحظة: يمكنك مشاهدة هذا المثال قيد التشغيل مباشرةً على button-with-fallback.html. يحتوي الزر على عدد من التصريحات الخاصة بتنسيقه، ولكن أكثر ما نهتم به هو ما يلي: button { ... background-color: #ff0000; background-color: rgba(255,0,0,1); box-shadow: inset 1px 1px 3px rgba(255,255,255,0.4), inset -1px -1px 3px rgba(0,0,0,0.4); } button:hover { background-color: rgba(255,0,0,0.5); } button:active { box-shadow: inset 1px 1px 3px rgba(0,0,0,0.4), inset -1px -1px 3px rgba(255,255,255,0.4); } استخدمنا هنا الخاصية background-color من النمط RGBA التي تغير العتامة Opacity عند التمرير على الزر لمنح المستخدم تلميحًا إلى أنّ الزر تفاعلي، وبعض الظل شبه الشفاف الداخلي box-shadow لإعطاء الزر ملمسًا وعمقًا. تكمن المشكلة في أن ألوان RGBA وخاصية الظلال box-shadow لا تعمل في إصدارات IE الأقدم من الإصدار 9، إذ لن تظهر الخلفية على الإطلاق في الإصدارات القديمة، لذا سيكون النص غير قابل للقراءة وسيئًا جدًا. يمكن حل هذه المشكلة من خلال إضافة تصريح ثانٍ للخاصية background-color الذي يحدد فقط اللون السداسي عشر المدعوم في المتصفحات القديمة، ويعمل بوصفه بديلًا احتياطيًا عن الميزات الحديثة إذا لم تعمل بنجاح، فما يحدث هو أن المتصفح الذي يزور هذه الصفحة يطبّق أولًا القيمة الأولى للخاصية background-color، ثم يبدّل القيمة الأولية بقيمة التصريح الثاني عندما يصل إليه إذا دعم هذا المتصفح ألوان RGBA، فإذا لم يكن الأمر كذلك، فسيتجاهل التصريح بالكامل وسيمضي قدمًا. ملاحظة: ينطبق الأمر نفسه على ميزات CSS الأخرى مثل استعلامات الوسائط Media Queries وكتل ‎@font-face و ‎@supports، فإذا لم تكن مدعومةً، فسيتجاهلها المتصفح فقط. دعم المحددات Selector لن تُطبَّق ميزات CSS على الإطلاق إذا لم تستخدِم محددات CSS الصحيحة لتحديد العنصر الذي تريد تنسيقه، فإذا كتبتَ محددًا في قائمة محددات مفصولة بفاصلة بصورة غير صحيحة، فقد لا يُحدد أو يطابق أي عنصر، وإذا كان المُحدد غير صالح، فسيجري تجاهل كل القائمة مع كتلة التنسيقات طبعًا، لذلك أضف لاحقة الصنف الزائف ‎:-moz-‎ فقط في قائمة محددات متسامحة forgiving selector list مثل ‎:where(::-moz-thumb)‎ واحذر أن تضيفها أو تستعملها في قائمة محددات ليست ضمن ‎:is()‎ أو ‎:where()‎ التي تتسامح مع محددات غير صالحة أو صحيحة لأن كل المتصفحات سوى متصفح Firefox سيراها غير صالحة وبالتالي يتجاهل كل القائمة، ولاحظ أن كلا من ‎:is()‎ أو ‎:where()‎ يمكن تمريرهما ضمن قائمة محددات أخرى من ضمنها ‎:has()‎ و ‎:not()‎. وقد وجدنا أن فحص العنصر الذي تحاول تنسيقه باستخدام أدوات التطوير في المتصفح أمر مفيد، ثم يجب النظر إلى مسار تنقل شجرة DOM الذي تميل أدوات فحص DOM إلى توفيره لمعرفة ما إذا كان المحدِّد منطقيًا بالمقارنة به. يمكنك الحصول على هذا النوع من الخرج أسفلَ أداة فحص DOM مثلًا في أدوات تطوير فايرفوكس Firefox: إذا أردت استخدام المحدد التالي مثلًا، فستتمكن من رؤية أنه لن يحدد العنصر input كما تريد: form > #date لا يُعَدّ عنصر الإدخال date في النموذج ابنًا مباشرًا للعنصر <form>، لذا يُفضَّل استخدام محدد حفيد Descendant Selector عام بدلًا من محدد ابن Child Selector. التعامل مع بادئات CSS تأتي مجموعة أخرى من المشاكل من استخدام البادئات Prefixes الخاصة بلغة CSS، وهي آلية مستخدمة للسماح لبائعي المتصفحات بتطبيق إصدارهم من ميزة CSS أو جافاسكربت أثناء وجود التقنيات في حالة تجريبية ليتمكنوا من تعديلها لتكون صحيحة دون التعارض مع تطبيقات المتصفح الأخرى أو عمليات التطبيق النهائية التي تكون بدون بادئات مثل ما يلي: يستخدِم Mozilla البادئة -moz-. تستخدِم المتصفحات Chrome و Opera و Safari و Edge البادئة -webkit-. يستخدِم Microsoft البادئة -ms-. تستخدِم الإصدارات الأصلية من المتصفح Opera البادئة o-. لا يُفترَض أبدًا استخدام الميزات ذات البادئات في مواقع الإنتاج، فهي عرضة للتغيير أو الإزالة دون سابق إنذار، وتتسبب في حدوث مشاكل على المتصفحات المختلفة عندما يقرر المطورون استخدام الإصدار -webkit- فقط من خاصية ما، مما يعني أن الموقع لن يعمل في متصفحات أخرى، ويحدث ذلك كثيرًا لدرجة أنّ المتصفحات الأخرى بدأت في تنفيذ إصدارات مع البادئة -webkit- من خاصيات CSS المختلفة، لذلك ستعمل مع مثل هذه الشيفرة البرمجية، وقد انخفض استخدام البادئات لدى بائعي المتصفحات مؤخرًا بسبب هذه الأنواع من المشاكل، ولكن لا يزال هناك بعض البادئات التي يجب الاهتمام بها. إذا أصريت على استخدام الميزات ذات البادئات، فتأكد من استخدام الميزات الصحيحة (استعمل مثلًا موقع caniuse.com)، فإذا لم تكن متأكدًا من ذلك، فيمكنك التأكد من خلال إجراء بعض الاختبارات في المتصفحات مباشرةً. وحاول تضمين الإصدار الذي لا يحوي أي بادئات بعد الذي يحوي بادئات، حيث سيُتجاهل إن لم يكن مدعومًا ويُستخدَم إن كان مدعومًا مثل: .masked { -webkit-mask-image: url(MDN.svg); mask-image: url(MDN.svg); -webkit-mask-size: 50%; mask-size: 50%; } جرب المثال البسيط التالي: افتح موقع google.com أو أيّ موقع آخر يحتوي على عنوان بارز أو أيّ عنصر كتلي آخر Block-level Element. انقر بزر الفأرة الأيمن أو اضغط على مفتاح Cmd مع الضغط على العنصر، ثم اختر فحص Inspect أو فحص العنصر Inspect element أو أيًا كان الخيار الموجود في متصفحك، إذ يجب أن يؤدي ذلك إلى فتح أدوات التطوير في متصفحك مع تحديد العنصر في أداة فحص نموذج DOM. ابحث عن ميزة يمكنك استخدامها لتحديد هذا العنصر، فقد كان لشعار جوجل الرئيسي مثلًا المعرّف hplogo في وقت كتابة هذا المقال. خزّن مرجعًا لهذا العنصر في متغير كما يلي: const test = document.getElementById("hplogo"); حاول الآن ضبط قيمة جديدة لخاصية CSS التي تهتم بها في هذا العنصر، إذ يمكنك تطبيق ذلك باستخدام الخاصية style الخاصة بالعنصر، أي اكتب ما يلي في طرفية جافاسكربت مثلًا: test.style.transform = 'rotate(90deg)' يجب أن تكمِل طرفية جافاسكربت تلقائيًا أسماء الخاصيات الموجودة في المتصفح ومطابقة ما كتبته حتى الآن عندما تكتب تمثيل اسم الخاصية بعد النقطة الثانية (لاحظ كتابة أسماء خاصيات CSS في جافاسكربت بحالة أحرف سنام الجَمل وليس باستخدام الواصلة - )، ويُعَدّ ذلك مفيدًا لمعرفة إصدارات الخاصية المُطبَّقة في ذلك المتصفح. إن أردت تضمين ميزة حديثة، فاختبر دعمها باستعمال ‎@support التي تساعدك على معرفة دعم الميزة من المتصفح أساسًا من عدمه حتى تعرف إن كنت بحاجة إلى بادئات أو حلول أخرى. مشاكل التصميم المتجاوب مع الشاشات Responsive Design التصميم المتجاوب مع الشاشات هو إنشاء تخطيطات الويب التي تتغير لتناسب عوامل أشكال الأجهزة المختلفة مثل عروض الشاشات المختلفة أو الاتجاهات (عموديًا أو أفقيًا) أو درجات الدقة، إذ سيبدو تخطيط الحاسوب مثلًا سيئًا عند عرضه على هاتف محمول، لذا يجب توفير تخطيط مناسب للهاتف المحمول باستخدام استعلامات الوسائط Media Queries والتأكد من تطبيقه بطريقة صحيحة باستخدام إطار العرض Viewport. تُعَدّ الدقة Resolution مشكلةً كبيرةً أيضًا، فليس مرجحًا أن تحتاج الأجهزة المحمولة إلى صور ثقيلة وكبيرة مثل الحواسيب، ويمكن أن يكون لديها اتصالات إنترنت أبطأ وخطط بيانات باهظة الثمن تجعل عرض النطاق الترددي الضائع مشكلةً أكبر، كما يمكن أن تحتوي الأجهزة المختلفة على مجالات من درجات الدقة المختلفة، مما يعني أنّ الصور الأصغر يمكن أن تكون غير واضحة، وهناك عدد من الأساليب التي تسمح لك بالتغلب على مثل هذه المشاكل بدءًا من استعلامات الوسائط البسيطة للهاتف المحمول أولًا وحتى تقنيات الصور المتجاوبة مع الشاشات الأكثر تعقيدًا. البحث عن المساعدة هناك العديد من المشاكل الأخرى التي ستواجهها مع شيفرة HTML و CSS، مما يجعل معرفة كيفية العثور على إجابات عبر الإنترنت لا تقدر بثمن. يمكنك طرح مشكلتك في قسم الأسئلة والأجوبة من أكاديمية حسوب للحصول على حل لمشكلتك التي تواجهها، إذ يُحتمَل أنّ المطورين الآخرين قد واجهوا المشاكل نفسها التي تواجهها أنت الآن، أو يمكنك مساعدتهم، كما يمكنك الانتقال إلى مجتمع تطوير الويب في حسوب IO، وهو مجتمع خاص بمناقشة وطرح المواضيع والقضايا العامة المتعلقة بتطوير الويب ولغاتها المختلفة. يمكنك البحث أيضًا في موسوعة حسوب والتعرف على أي ميزة أو قسم تحتاج إلى استخدامه، كما يمكنك الرجوع إلى الموقع الشهري CanIUse لمعرفة دعم الميزات في المتصفحات. الخلاصة يجب أن تكون الآن على دراية بالأنواع الرئيسية لمشاكل توافق HTML و CSS على المتصفحات التي ستواجهها في تطوير الويب وكيفية إصلاحها. ترجمة -وبتصرُّف- للمقال Handling common HTML and CSS problems. اقرأ أيضًا المقال السابق: استراتيجيات اختبارات مشاريع الويب للتوافق مع المتصفحات مدخل إلى اختبار مشاريع الويب للتوافق مع المتصفحات الأدوات المستخدمة في بناء مواقع ويب
    1 نقطة
  43. تعرف البرمجة بأنها من الوظائف عالية المردود، لذلك نجد أن العديد من الأشخاص يتجهون إلى تعلم تخصصات البرمجة والعمل في أحد مجالاتها المختلفة رغبة منهم بالحصول على مهنة مرتفعة الدخل تضمن لهم مستقبلهم. وإذا كنت تتساءل ما هي أعلى تخصصات البرمجة مردودًا وما هي المسؤوليات المنوطة بكل تخصص في سوق العمل فأنت في المكان الصحيح حيث سنوضح لك في هذه المقالة أهم التخصصات البرمجية التي تحقق لك رواتب مجزية. ما هي أعلى تخصصات البرمجة أجرا؟ أظهر موقع Stack Overflow الشهير الذي يجمع خبرات آلاف المبرمجين لتبادل الأسئلة حول أي موضوع يتعلق بالبرمجة والتقنية، أن متوسط رواتب البرمجة قد ارتفع بنحو 23% بين عامي 2021 و2022 وقد اخترنا لكم اليوم من بين التخصصات الأعلى أجرًا وفق الاستبيان الذي أصدره الموقع نفسه نهاية عام 2022 عشرة تخصصات برمجية عالية المرود عالميًا. دعنا في الفقرات التالية نستكشف المزيد حول كل تخصص من هذه التخصصات، ونتعرف على متوسط أجره السنوي ونستعرض أهم الأعمال والمهام الوظيفية والتقنيات المنوطة بكل تخصص منها. 1. تخصص محترف أمن تكنولوجيا المعلومات Security professional محترف أمن تكنولوجيا المعلومات هو الشخص المسؤول بشكل أساسي عن حماية أجهزة الحاسوب والشبكات والبرامج والبيانات الخاصة بالشركة أو المؤسسة التي يعمل بها من الوصول غير المصرح به وحمايتها من التلف أو التخريب. يعتبر هذا التحصص أعلى تخصصات البرمجة أجرًا حيث يبلغ متوسط دخله السنوي في الولايات المتحدة الأمريكية 91 ألف دولار، ولا غرابة في ذلك فهو دور محوري ومهم ومطلوب منه أن يتعامل مع المعلومات الحساسة الخاصة بالشركات التجارية أو المستشفيات أو الدوائر الحكومية التي تخزن كميات كبيرة من البيانات والمعلومات على أنظمتها ويبقى متيقظًا دومًا للتعامل مع أي انتهاكات أمنية تطالها كي تظل آمنة. قد يضم المجال نفسه عدة تخصصات تشمل استكشاف أخطاء الشبكة وإصلاحها وإدارة جدار الحماية والاختراق الأخلاقي وإدارة النظام وتحليل أمن المعلومات …إلخ. ويحتاج العمل فيه لامتلاك مجموعة من المهارات أهمها خلفية قوية في مجال تكنولوجيا المعلومات أو علوم الحاسوب وتوفر مهارات التحليل والتفكير المنطقي، ومعرفة بمفاهيم الأمن السيبراني وآخر المستجدات في هذا المجال وفهم قواعد البيانات والشبكات والأنظمة، وخبرة في التعامل مع برامج مكافحة الفيروسات وجدران الحماية وبروكسي الويب إضافة لضرورة امتلاك معرفة كافية بقوانين وسياسات أمن المعلومات المعمول بها في بلده. 2. تخصص برمجة DevOps متخصص DevOps أو ما يعرف أحيانًا بمهندس DevOps وإذا كنت تتساءل عن معنى DevOps فهي دمج لكلمتين هما التطوير development والعمليات operations وقد ظهر هذا المفهوم لسد الفجوة الحاصلة بين تطوير البرامج وعمليات تكنولوجيا المعلومات فهو بمثابة غراء لاصق يربط كافة وظائف تكنولوجيا المعلومات مع بعضها البعض. ومتخصص DevOps هو شخص متخصص في تكنولوجيا المعلومات يعمل مع فريق مطوري البرمجيات وفريق مشغلي النظام والمسؤولين وموظفي عمليات تكنولوجيا المعلومات وغيرهم للإشراف على عمليات إصدارات الكود وضمان التعاون الفعال بينهم وإزالة العوائق التي تؤخر سير عملهم ويجعل عمليات تطوير البرمجيات أكثر كفاءة. يساوي أخصائي DevOps المحترف وزنه ذهبًا ويتقاضى راتبًا سنويًا مجزيًا يبلغ في الولايات المتحدة حوال 79 ألف دولار فهو يقدم فوائد جلية لأصحاب العمل من خلال جعل فرق التطوير وتقنية المعلومات تعمل معًا بشكل أفضل وتسريع إصدار تحديثات المنتجات وأتمتة جزء كبير من العمليات الداخلية وتوفير الكثير من الوقت على مهام أخرى. كي يقوم أخصائي DevOps بعمله على أكمل وجه عليه القيام بعدة أمور أهمها المهام الإدارية التي تحدد أوقات وأماكن وكيفية تنفيذ المشروع والتأكد من وضوح الأهداف والمواعيد النهائية للجميع وتصميم بنية تحتية تساعد على تسريع إصدار البرامج وإجراء اختبارات الأداء وتقييم جودة ووثوقية الأنظمة وأتمتة المهام المتكررة لجعلها تنفذ بوتيرة أسرع. ومن أهم المهارات التي يتوجب على متخصص DevOps امتلاكها هي المهارات الناعمة كالانضباط والتنظيم والتعامل مع الآخرين إضافة للمعرفة التقنية في هندسة البرمجيات أو علوم الحاسب فبالرغم من أن مهندسي DevOps لا يعملون بشكل مباشر على كتابة الأكواد البرمجية لتطوير المشاريع البرمجية، فهذه مهمة مطوري البرامج عادةً، إلا أنهم قد يحتاجون لكتابة أكواد برمجية لأتمتة المهام الرئيسية أو إنشاء مكونات إضافية تجعل أدوات التطوير والنشر تلبي احتياجات فرق العمل بشكل أفضل. ومن المفيد كذلك أن يتقن متخصص DevOps استخدام أي أدوات تساعده في أداء عمله وأهمها أدوات الأتمتة مثل Jenkins وأدوات التحكم بالإصدارات مثل Git ومستودعات استضافة الكود مثل Github و Bitbucket وبرامج الحاويات مثل Docker وأدوات إدارة المشاريع مثل أنا و تريللو للتحقق من تقدم أعضاء الفرق والتأكد من أن الجميع يعمل وفق المسار الصحيح. إن أردت التعرف على المجال أكثر، فارجع إلى مقال ما هو DevOps 3. تخصص محلل بيانات أو محلل أعمال Data or business analyst يتطلب كل من مجال تحليل البيانات أو تحليل الأعمال الفهم الدقيق لتحليلات البيانات ويفيد في هذا المجال استخدام تقنيات الذكاء الاصطناعي لتعزيز عملية اتخاذ القرارات، وهو من التخصصات المربحة التي يبلغ أجرها السنوي في الولايات المتحدة حوالي 69 ألف دولار ولكن قد تختلف المهام المطلوبة قليلًا بين المجالين. يحتاج محلل البيانات لامتلاك فهم قوي لكافة الأمور المتعلقة بعلوم البيانات، في حين يحتاج محلل الأعمال إلى التفاعل مع الأشخاص بصورة أكبر. فمحلل البيانات يعمل فقط مع البيانات ويستخدم العديد من الأدوات والتقنيات لجمع وتحليل البيانات وتحديد الضروري منها وإزالة كل ما هو خاطئ أو غير ضروري ثم معالجتها وإدارتها والتنبؤ بأي قرارات من شأنها مساعدة الأعمال على تحقيق أهدافها الاستراتيجية. أما محلل الأعمال فهو يعمل على حل المشكلات التنظيمية المختلفة وقد تختلف طبيعة عمله حسب احتياجات كل مؤسسة إلا أنه يكون مسؤولًا بشكل أساسي عن التحقق من متطلبات العمل وتحليل البيانات التجارية كالميزانيات ونتائج المبيعات وتقدير التكاليف والأرباح والتعاون مع فرق تكنولوجيا المعلومات لتنفيذ تغييرات معينة مثل تطوير منتج جديد أو التوسع في سوق جديد أو تحسين تجربة العملاء أو إحداث أنظمة جديدة لتكنولوجيا المعلومات بهدف تحسين العمل وحل مشاكله وزيادة أرباحه. كلا الاختصاصين ضروريان ومطلوبان بكثرة في المؤسسات المختلفة ومجالات العمل العديدة التي تولد يوميًا كمية هائلة من البيانات وتحتاج لإدارتها واستثمارها بأفضل طريقة، وهما يتطلبان وجود مجموعة مهارات أهمها معرفة قوية بالرياضيات والإحصاء والتحليل الرياضي وعلوم الحاسوب وبلغات البرمجة الإحصائية مثل Python أو R وبرامج الجداول الإلكترونية مثل Excel إضافة لمهارات جيدة أساسيات الذكاء الاصطناعي وقدرة جيدة على التواصل وإدارة المهمام. لمزيد من التفاصيل، ارجع إلى مقال الدليل الشامل إلى تحليل البيانات. دورة الذكاء الاصطناعي احترف برمجة الذكاء الاصطناعي AI وتحليل البيانات وتعلم كافة المعلومات التي تحتاجها لبناء نماذج ذكاء اصطناعي متخصصة. اشترك الآن 4. تخصص برمجة الواجهة الخلفية Back-end Development مطور الواجهة الخلفية هو المسؤول عن كتابة الكود البرمجي الذي يعمل من طرف الخادم والذي يعالج بيانات المواقع وينفذ كافة العمليات والإجراءات المطلوبة على مواقع الويب ويعمل على صيانتها وتحسين أمنها ويتعامل مع قواعد البيانات وواجهة برمجة التطبيقات API وغيرها من الوظائف الأخرى التي تجري خلف كواليس متصفحات المستخدمين عند تنفيذ أي إجراء على مواقع الويب. من أهم المهارات التقنية التي عليك تعلمها لتتمكن من العمل كمطور واجهة خلفية معرفة بأحد لغات برمجة الويب التي تعمل على الخادم مثل بايثون و PHP وروبي …إلخ. وكيفية التعامل مع قاعدة البيانات وواجهة برمجة التطبيقات API وإدارة ذاكرة التخزين المؤقت والتعامل مع الاستضافات إضافة لمعرفة أهم الأدوات وأطر العمل التي تساعده في عملية التطوير ومعرفة قواعد البرمجة التي تمكنه من بناء مواقع عالية الجودة ومكتوبة بكود نظيف. من المستحسن كذلك أن يكون لديه معرفة أساسية بتقنيات الواجهة الأمامية مثل HTML و CSS وجافا سكريبت، إضافة للمهارات الأخرى مثل التفكير التحليلي وحل المشكلات والتعاون الفعال ومهارات التواصل الشفوي والكتابة لأنه يحتاج عادة للتواصل مع مدراء المشاريع البرمجية ومطوري الواجهة الأمامية. 5. تخصص برمجة الواجهة الأمامية Front-end Development مطور الواجهة الأمامية هو المسؤول عن تطوير واجهة المستخدم UI أو الجزء الأمامي من مواقع وتطبيقات الويب وإنشاء عناصر التصميم التي يراها المستخدمون ويتفاعلون معها ويتأكد من أن مظهر وتخطيط الموقع مناسب على كافة المتصفحات وأنظمة التشغيل ومتجاوب مع كافة أحجام الشاشات وأنه سهل التصفح ويحسن من تجربة المستخدم. كما أن مطور الواجهة الأمامية قد يحترف بالتصميم أيضًا فهذا يكسبه ميزة إضافية في مجال العمل لأن مطور الواجهة الأمامية الذي يعرف كيف يصمم الموقع ويدرك نظريات التصميم ودلالات الألوان ويصمم واجهات احترافية ثم يبرمجها إلى مواقع ويب سيغني صاحب العمل عن تعيين مصمم أو الاعتماد على تصاميم جاهزة. كي تختص في مجال تطوير الواجهة الأمامية لمواقع الويب والتطبيقات عليك بداية تعلم لغات الويب التالية HTML و CSS و JavaScript التي تعمل معًا لتحديد شكل صفحات الويب وتسمح للمستخدمين بالوصول إلى الموقع والتفاعل معه. عند زيارة أحد مواقع الويب في حين يهتم مطور الواجهة الخلفية كما ذكرنا بتطوير كل ما يجري وراء الكواليس لموقع الويب هذا مثل تخزين البيانات أو الأمان أو أداء الموقع أو أي وظائف أخرى من جانب الخادم. كما أن امتلاكك للحس الفني وللمعرفة الأساسية في مبادئ تصميم واجهة المستخدم التي تحدد التخطيط الرسومي للتطبيق UI و تصميم تجربة المستخدم التي تحدد كيف يتفاعل المستخدم مع التطبيق UX واطلاعك على كل جديد في اتجاهات التصميم سيكون نقطة في صالحك. يعد تطوير الواجهة الأمامية هو أحد اختصاصات البرمجية مستمرة النمو والتي عليها طلب مرتفع في سوق العمل كما أنها توفر لك إمكانية العمل بشكل مستقل عن بعد وأنت مرتاح في منزلك ويبلغ متوسط الراتب الأساسي لمطور الواجهة الأمامية 60 ألف دولارًا كما يتوجب عليك تعلم أطر عمل هذه التقنيات وفهمها بشكل جيد لتطوير المواقع بشكل فعال واحترافي إضافة لبرامج التحكم في الإصدارات مثل GitHub التي تتعقب وتتحكم في التغييرات في الكود الخاص بك. 6. تخصص برمجة التطوير الشامل Full-stack Development التطوير الشامل Full Stack Development هو أحد مجالات البرمجة المطلوبة بكثرة في سوق العمل والتي تتطلب منك أن تكون محترفًا وخبيرًا في تطوير كل ما يتعلق بمواقع وتطبيقات الويب سواء الواجهة الأمامية من طرف العميل أو الواجهة الخلفية من طرف الخادم. توظف الشركات هذا النوع من المطورين إما ليكونوا مسؤولين عن تطوير المواقع من الألف إلى الياء لا سيما في المواقع البسيطة والمتوسطة أما في حال تطوير تطبيقات ويب كبيرة ومعقدة فتحتاج الشركات إلى تعيين مطوري واجهة أمامية وخلفية إضافة لمطور مكدس كامل بغرض الاستفادة من خبراتهم في تقديم الدعم والمساعدة لفريق تطوير الواجهة الخلفية وفريق تطوير الواجهة الأمامية على حد سواء وهم دائمًا متأهبون لتقديم المساعدة كلما دعت الحاجة كما يمكنهم العمل مع مصممي الجرافيك لتصميم ميزات جديدة للتطبيقات. مطور الويب الشامل شخص موهوب ولهذا يحظى براتب مرتفع يبلغ وسطيًا في الولايات المتحدة الأمريكية 66 ألف دولار سنويًا وهو يملك مهارات شاملة متنوعة في لغات البرمجة التي تعمل من طرف العميل مثل HTML و CSS وجافا سكربت أو التي تعمل على الخادم مثل مثل Python و Ruby و PHP ولديه معرفة جيدة في التعامل مع قواعد البيانات المختلفة مثل SQL و NoSQL والتعامل مع أنظمة التحكم في الإصدارات مثل Git وواجهات برمجة التطبيقات مثل REST إضافة لامتلاك مهارات في التصميم الجرافيكي وإدارة واجهات المستخدم UI UX. ولكونه شخص متعدد المهارات يحتاج للقيام بعدة مهام في وقت واحد لذا من الضروري أن يتمتع ببعض المهارات الشخصية مثل إدارة الوقت والقدرة على تحديد الأولويات لتسليم العمل ضمن الوقت المطلوب. احصل على موقع إلكتروني مخصص لأعمالك أبهر زوارك بموقع احترافي ومميز بالاستعانة بأفضل خدمات تطوير وتحسين المواقع على خمسات أنشئ موقعك الآن 7. تخصص برمجة العتاد أو التطبيقات المدمجة Embedded applications or devices Development مع تقدم التقنيات ونمو إنترنت الأشياء IoT ومساهمة البرمجة في كافة الأجهزة من حولنا كالساعات الذكية والألعاب والأجهزة الطبية وصولًا للروبوتات المختلفة، أصبح التخصص في مجال تصميم وتنفيذ برامج مخصصة لهذه الأجهزة المحددة والذي يؤدي غرضًا محددًا اسم تطوير التطبيقات المدمجة أو تطوير العتاد. هذا الاختصاص البرمجي تنافسي وعالي الأجر ضمن مجالات البرمجة فإذا كنت ترغب في العمل في تخصصات متقدمة مثل العلوم الطبية أو صناعة السيارات أو صناعة الإلكترونيات أو حتى علوم الفضاء فهذا الاختصاص يناسبك. لكنك تحتاج للعمل في هذا التخصص البرمجي إلى امتلاك مجموعة من المهارات أهمها تعلم إحدى لغات البرمجة المخصصة لتطوير العتاد مثل بايثون أو C أو C++‎ وفهم أنظمة الشرائح الإلكترونية والأجهزة المدمجة والإلكترونيات والأجهزة الطرفية والمترجمات ومعرفة جيدة بالأمن السيبراني للتأكد من أن البرامج والتطبيقات التي تطورها آمنة وموثوقة وتحتاج بالطبع لامتلاك مهارات في التواصل وحل المشكلات والقدرة على العمل ضمن فريق. كما يمكنك البدء في مجال برمجة العتاد بنفسك من خلال استخدام شرائح مثل أردوينو Arduino أو راسبيري باي Raspberry Pi فهي متوفرة في الأسواق ويمكنك من خلالها تعلم استخدام وتطوير الإلكترونيات والتحكم في الأشياء من حولك. 8. تطوير التطبيقات تجارية أو تطبيقات سطح المكتب Desktop or Enterprise Applications Development هذا التخصص البرمجي يهتم بتطوير البرامج التي تعمل على سطح المكتب وتكون مخصصة للعمل على نظام تشغيل ويندوز Windows أو ماك macOS أو لينكس Linux أو غيرها من أنظمة تشغيل سطح المكتب الأخرى. بمعنى آخر البرامج أو التطبيقات المخصصة للتثبيت والإعداد على أجهزة الحاسوب الشخصية وهي تتميز بوجود واجهة مستخدم رسومية ولا تحتاج للاتصال بالإنترنت كي تعمل ولا يخفى عليك هذا النوع من التطبيقات فأنت تستعملها يوميًا. كما يمكن تطوير تطبيقات سطح مكتب مخصصة تسمى في هذه الحالة تطبيقات الأعمال أو التطبيقات المؤسساتية enterprise applications وهي برامج تطورها الشركات لتحسين أعمالها وزيادة كفاءتها وإنتاجيتها مثل برامج المحاسبة وإدارة المخزون وبرامج إدارة رواتب الموظفين والموارد البشرية وغيرها من الوظائف المهمة لتسيير عمل المؤسسة وإدارة مواردها. كان الاعتماد على تطبيقات سطح المكتب بصورة أكبر قبل أن تشتهر تطبيقات الويب التي تكون مثبتة على خادم بعيد نصل إليه عبر متصفحاتنا إلا أن تطبيقات سطح المكتب لم تفقد زهوتها ولا زالت أجهزة حواسيبنا ممتلئة بهذه التطبيقات التي نعتمد عليها لأداء العديد من المهام ولا زال تخصص تطوير سطح المكتب مطلوبًا لاسيما للتطبيقات التي تتطلب سرعة في التنفيذ ودرجة أمان عالية ولا تتطلب الاتصال بالإنترنت وهو تخصص مجزٍ ومطلوب في سوق العمل ويبلغ متوسط راتب مطور هذه التطبيقات في الولايات المتحدة حوالي 67 ألف دولار سنويًا. كي تتخصص في مجال تطوير وبرمجة تطبيقات سطح المكتب عليك تعلم إحدى لغات البرمجة المخصصة وأبرزها جافا وبايثون و C و C++‎ و C#‎ و Java و Go …إلخ. كما يفيدك في هذا التخصص تعلم أحد أطر عمل تطوير تطبيقات سطح المكتب مثل Electron و WPF. 9. تخصص برمجة الألعاب Game Development تعد برمجة ألعاب الفيديو إحدى تخصصات البرمجة المربحة والمميزة والتي تشهد ازدهارًا كبيرًا في الآونة الأخيرة وهي تخصص يجمع بين مهارات البرمجة ومهارات تصميم الرسوميات ويصل متوسط راتبها في الولايات المتحدة إلى 63 ألف دولار سنويًا فمبرمج الألعاب هو مسؤول عن عدة أمور متقدمة من بينها تصميم كافة العناصر المرئية للألعاب كالنار والجليد والأشجار بحرفية عالية ثم البدء ببرمجتها من خلال دمج كافة العناصر المرئية والصوتية وتحويلها إلى منتج نهائي قابل للعب. للتخصص في تصميم الألعاب والرسومات تحتاج إلى معرفة جيدة بالرياضيات واستراتيجيات اللعب ورواية القصص وبإحدى لغات البرمجة المخصصة لتطوير الألعاب مثل بايثون أو جافا أو C++‎ ومعرفة منصات ومحركات الألعاب الاحترافية مثل Unity 3D و Unreal Engine/ إضافةً لمعرفة أدوات إنشاء الرسومات ثنائية الأبعاد وثلاثية الأبعاد مثل Maya و Blender و3D Max وأدوات الصوت التي تمكنك من إنشاء مؤثرات صوتية مثل Pro Tools كما تحتاج لمعرفة بالذكاء الاصطناعي في حال كنت تريد تطوير ألعاب تتضمن شخصيات ذكية تحاكي شخصيات العالم الحقيقة وقادرة على إظهار المشاعر المناسبة واكتشاف العناصر من حولها واتخاذ القرارات بشأنها من خلال التعلم الآلي. 10.تخصص برمجة تطبيقات الجوال يعد تطوير تطبيقات الهاتف المحمول أحد تخصصات البرمجة المطلوبة والرائجة في سوق العمل نظرًا للاعتماد الكبيرة على استخدام الجوالات لتسيير الأعمال اليومية كالتعلم والتسوق ودفع الفواتير …إلخ، ويصل متوسط راتبها في الولايات المتحدة إلى 56 ألف دولار سنويًا. الجدير بالذكر أن تخصصك في هذا المجال يمكنك من إنشاء تطبيقات تعمل على الهواتف الذكية والأجهزة المحمولة الأخرى وتفتح لك باب العمل ضمن شركة أو بشكل مستقل. وكي تتمكن من تعلمه عليك تعلم أساسيات علوم الحاسوب وامتلاك معرفة جيدة بلغات البرمجة المخصصة لتطبيقات الجوال مثل بايثون وجافا و كوتلن والتعامل مع أنظمة التشغيل لمختلف أنواع الأجهزة مثل iOS وأندرويد ومعرفة كيفية تخزين البيانات على الجوال وكيفية تحديثها وحذفها ومعالجتها. ويمكن أن يمتلك مطور الأجهزة المحمولة معرفة أساسية بتصميم واجهات المستخدم UX و UI أو يعتمد على مصممين متخصصين في تصميم واجهة المستخدم ومصممي UX ومصممي الجرافيك لتصميم التطبيقات التي يحتاج إلى تطويرها. الخلاصة تعرفنا في مقال اليوم على أفضل لغات البرمجة وأكثر تخصصات البرمجة المربحة التي تدر مبالغ طائلة للمتخصصين فيها وتوفر لهم مستقبلًا آمنًا ماليًا، وتعرفنا على أهم المهارات التي عليك تعلمها لتتقن كل تخصص من هذه التخصصات وتضمن مستقبلًا مهنيًا ناجحًا ومهنة مميزة ومرموقة تحقق لك أحلامك، وإذا كنت مهتمًا بمعرفة المزيد من التخصصات البرمجية التي يمكنك العمل بها ومعرفة أهم تقنياتها أنصحك بمطالعة مقال مجالات البرمجة. ما هو التخصص المفضل لك من بين هذه التخصصات وهل بدأته بتعلمه فعلًا؟ شاركنا رأيك في التعليقات أسفل المقال. اقرأ أيضًا تعلم البرمجة برمجة تطبيقات الجوال أسهل لغات البرمجة دليلك الشامل إلى برمجة التطبيقات
    1 نقطة
  44. يمثل المخزن المؤقت buffer مساحة ما في الذاكرة RAM تحتوي على البيانات بالصيغة الثنائية binary، ويمكن لنود Node.js أن تتعامل مع هذه الذاكرة باستخدام الصنف ‎Buffer‎، حيث يمثل البيانات كسلسلة من الأعداد بطريقة مشابهة لعمل المصفوفات في جافاسكربت، إلا أن الفرق أن هذه البيانات لا يمكن التعديل على حجمها بعد إنشاء المخزن، وكثيرًا ما نتعامل مع المخازن المؤقتة عند تطوير البرامج ضمن بيئة نود دون أن نشعر، فمثلًا عند قراءة ملف ما باستخدام التابع ‎fs.readFile()‎ فسيمرر كائن من نوع مخزن مؤقت يحوي بيانات الملف الذي نحاول قراءته إلى تابع رد النداء callback أو كنتيجة للوعد Promise، وحتى عند إنشاء طلبات HTTP فالنتيجة هي مجرى stream من البيانات المخزنة مؤقتًا في مخزن مؤقت داخلي يساعد المستخدم على معالجة بيانات جواب الطلب على دفعات بدلًا من دفعة واحدة. ونستفيد من المخازن المؤقتة أيضًا عند التعامل مع البيانات الثنائية عند كتابة البرامج منخفضة المستوى مثل التي تتعامل مع إرسال واستقبال البيانات عبر الشبكة، كما توفر القدرة على التعامل مع البيانات على أخفض مستوى ممكن والتعديل عليها في الحالات التي نحتاج بها لذلك. سنتعرف في هذا الفصل على المخازن المؤقتة وطريقة إنشائها والقراءة والنسخ منها والكتابة إليها، وحتى تحويل البيانات الثنائية ضمنها إلى صيغ ترميز أخرى. المستلزمات هذا الفصل جزء من سلسلة دليل تعلم Node.js لذا يجب قبل قراءته: تثبيت بيئة Node.js على الجهاز، حيث استخدمنا في هذا المقال الإصدار رقم 10.19.0. معرفة التعامل مع حلقة REPL في نود، يمكنك الاطلاع على المقال الثاني من هذه السلسلة للتعرف أكثر على طريقة استخدام هذا الوضع. معرفة بأساسيات جافاسكربت وأنواع البيانات المتوفرة ضمن اللغة. إنشاء المخزن المؤقت سنتعرف في هذه الفقرة على طريقتين لإنشاء كائن التخزين المؤقت في نود، حيث يجب يجب أن نسأل أنفسنا دومًا في ما إذا كنا نريد إنشاء مخزن مؤقت جديد، أو استخراج مخزن مؤقت من بيانات موجودة مسبقًا، وعلى أساس ذلك سنحدد الطريقة المستخدمة لإنشائه، ففي حال أردنا تخزين بيانات غير موجودة ونتوقع أن تصل لاحقًا ففي تلك الحالة يجب إنشاء مخزن مؤقت جديد باستدعاء بالتابع ‎alloc()‎ من الصنف ‎Buffer‎، ولنوضح هذه الطريقة نبدأ بفتح جلسة جديدة من وضع حلقة REPL بتنفيذ الأمر ‎node‎ في سطر الأوامر كالتالي: $ node يظهر الرمز ‎>‎ في بداية السطر، ما يدل على استعداد هذا الوضع لتلقي التعليمات البرمجية وتنفيذها، حيث يقبل التابع ‎alloc()‎ تمرير عدد كمعامل أول إجباري يشير إلى حجم المخزن المؤقت الذي نود إنشاءه، أي يمثل هذا المعامل عدد البايتات التي ستُحجز في الذاكرة للمخزن المؤقت الجديد، فمثلًا لإنشاء مخزن مؤقت بسعة 1 كيلوبايت أي ما يعادل 1024 بايت يمكننا استخدام التابع السابق كالتالي: > const firstBuf = Buffer.alloc(1024); نلاحظ أن الصنف ‎Buffer‎ متاح بشكل عام في بيئة نود، ومنه يمكننا الوصول مباشرة إلى التابع ‎alloc()‎ لاستخدامه، ونلاحظ كيف مررنا القيمة ‎1024‎ كمعامل أول له لينتج لدينا مخزن مؤقت بسعة 1 كيلوبايت، حيث ستحوي المساحة المحجوزة للمخزن المؤقت الجديد مؤقتًا على أصفار افتراضيًا، وذلك ريثما نكتب البيانات ضمنه لاحقًا، وبإمكاننا تخصيص ذلك فإذا أردنا أن تحتوي تلك المساحة على واحدات بدلًا من الأصفار يمكننا تمرير هذه القيمة كمعامل ثاني للتابع ‎alloc()‎ كالتالي: > const filledBuf = Buffer.alloc(1024, 1); ينتج لدينا مخزنًا مؤقتًا بمساحة 1 كيلوبايت من الذاكرة المملوءة بالواحدات، ويجب التأكيد أن البيانات التي يمثلها المخزن المؤقت ستكون بيانات ثنائية binary مهما كانت القيمة التي نحددها له كقيمة أولية، حيث يمكن تمثيل العديد من صيغ البيانات بواسطة البيانات الثنائية، فمثلًا البيانات الثنائية التالية تمثل حجم 1 بايت: ‎01110110‎، ويمكن تفسيرها كنص بترميز ASCII باللغة الإنكليزية وبالتالي ستُعبّر عن الحرف ‎v‎، ويمكن أيضًا تفسير هذه البيانات بسياق آخر وترميز مختلف على أنها لون لبكسل واحد من صورة ما، حيث يمكن للحاسوب التعامل مع هذه البيانات ومعالجتها بعد معرفة صيغة ترميزها. ويستخدم المخزن المؤقت في نود افتراضيًا ترميز UTF-8 في حال كانت القيمة الأولية المخزنة ضمنه عند إنشاءه هي سلسلة نصية، حيث يمكن للبايت الواحد في ترميز UTF-8 أن يمثل حرفًا من أي لغة أو عددًا أو رمزًا ما، ويعتبر هذا الترميز توسعة لمعيار الترميز الأمريكي لتبادل البيانات أو ASCII والذي يقتصر على ترميز الأحرف الإنكليزية الكبيرة والصغيرة والأعداد وبعض الرموز القليلة الأخرى فقط، كعلامة التعجب "!" وعلامة الضم "&"، ويمكننا تحديد الترميز المستخدم من قبل المخزن المؤقت عبر تمريره كمعامل ثالث للتابع ‎alloc()‎، فمثلًا لو اقتصرت حاجة برنامج ما على التعامل مع محارف بترميز ASCII يمكننا تحديده كترميز للبيانات ضمن المخزن المؤقت كالتالي: > const asciiBuf = Buffer.alloc(5, 'a', 'ascii'); نلاحظ تمرير المحرف ‎a‎ كمعامل ثانِ وبذلك سيتم تخزينه ضمن المساحة الأولية التي ستُحجز للمخزن المؤقت الجديد، ويدعم نود افتراضيًا صيغ ترميز المحارف التالية: ترميز ASCII ويُمثّل بالسلسلة النصية ‎ascii‎. ترميز UTF-8 ويُمثّل بالسلسلة النصية ‎utf-8‎ أو ‎utf8‎. ترميز UTF-16 ويُمثّل بالسلسلة النصية ‎utf-16le‎ أو ‎utf16le‎. ترميز UCS-2 ويُمثّل بالسلسلة النصية ‎ucs-2‎ أو ‎ucs2‎. ترميز Base64 ويُمثّل بالسلسلة النصية ‎base64‎. الترميز الست عشري Hexadecimal ويُمثّل بالسلسلة النصية ‎hex‎. الترميز ISO/IEC 8859-1 ويُمثّل بالسلسلة النصية ‎latin1‎ أو ‎binary‎. حيث يمكن استخدام أي من أنواع الترميز السابقة مع أي تابع من الصنف ‎Buffer‎ يقبل ضمن معاملاته معاملًا بالاسم ‎encoding‎ لتحديد صيغة الترميز، ومن ضمنها التابع ‎alloc()‎ الذي تعرفنا عليه. قد نحتاج أحيانًا لإنشاء مخزن مؤقت يُعبر عن بيانات جاهزة موجودة مسبقًا، كقيمة متغير أو سلسلة نصية أو مصفوفة، حيث يمكننا ذلك باستخدام التابع ‎from()‎ الذي يدعم إنشاء مخزن مؤقت جديد من عدة أنواع من البيانات وهي: مصفوفة من الأعداد التي تتراوح قيمها بين ‎0‎ و ‎255‎،حيث يمثل كل عدد منها قيمة بايت واحد. كائن من نوع ‎ArrayBuffer‎ والذي يخزن داخله حجمًا ثابتًا من البايتات. سلسلة نصية. مخزن مؤقت آخر. أي كائن جافاسكربت يملك الخاصية ‎Symbol.toPrimitive‎ التي تُعبر عن طريقة تحويل هذا الكائن إلى بيانات أولية، مثل القيم المنطقية ‎boolean‎ أو ‎null‎ أو ‎undefined‎ أو الأعداد ‎number‎ أو السلاسل النصية ‎string‎ أو الرموز ‎symbol‎. لنختبر الآن طريقة إنشاء مخزن مؤقت جديد من سلسلة نصية باستخدام التابع from كالتالي: > const stringBuf = Buffer.from('My name is Hassan'); ينتج بذلك لدينا كائن مخزن مؤقت جديد يحتوي على قيمة السلسلة النصية ‎My name is Hassan‎، ويمكننا كما ذكرنا إنشاء مخزن مؤقت جديد من مخزن مؤقت آخر مثلًا كالتالي: > const asciiCopy = Buffer.from(asciiBuf); ينتج بذلك لدينا المخزن المؤقت ‎asciiCopy‎ والذي هو نسخة مطابقة من المخزن الأول ‎asciiBuf‎، وبذلك نكون قد تعرفنا على طرق إنشاء المخازن المؤقتة، وفي الفقرة التالية سنتعلم طرق قراءة البيانات منها. القراءة من المخزن المؤقت يوجد عدة طرق تمكننا من قراءة بيانات المخزن المؤقت، حيث يمكنن قراءة بايت واحد محدد فقط منه إذا أردنا، أو قراءة كل البيانات دفعة واحدة، ولقراءة بايت واحد فقط يمكن الوصول إليه عبر رقم ترتيب مكان هذا البايت ضمن المخزن المؤقت، حيث تُخزِّن المخازن المؤقتة البيانات بترتيب متتابع تمامًا كالمصفوفات، ويبدأ ترتيب أول مكان للبيانات داخلها من الصفر ‎0‎ تمامًا كالمصفوفات، ويمكن استخدام نفس صيغة الوصول إلى عناصر المصفوفة لقراءة البايتات بشكل مفرد من المخزن مؤقت. لنختبر ذلك نبدأ بإنشاء مخزن مؤقت جديد من سلسلة نصية كالتالي: > const hiBuf = Buffer.from('Hi!'); ونحاول قراءة أول بايت من هذا المخزن كالتالي: > hiBuf[0]; بعد الضغط على زر الإدخال ‎ENTER‎ وتنفيذ التعليمة السابقة سيظهر لنا النتيجة التالية: 72 حيث يرمز العدد ‎72‎ ضمن ترميز UTF-8 للحرف ‎H‎ وهو أول حرف من السلسلة النصية المُخزنة، حيث تقع قيمة أي بايت ضمن المجال من صفر ‎0‎ إلى ‎255‎، وذلك لأن البايت يتألف من 8 بتات أو bits، وكل بت بدوره يمثل إما صفر ‎0‎ أو واحد ‎1‎، فأقصى قيمة يمكن تمثيلها بسلسلة من ثمانية بتات تساوي 2⁸ وهو الحجم الأقصى للبايت الواحد، أي يمكن للبايت تمثيل قيمة من 256 قيمة ممكنة، وبما أن أول قيمة هي الصفر فأكبر عدد يمكن تمثيله في البايت الواحد هو 255، والآن لنحاول قراءة قيمة البايت الثاني ضمن المخزن كالتالي: > hiBuf[1]; سنلاحظ ظهور القيمة ‎105‎ والتي ترمز للحرف الصغير ‎i‎، والآن نحاول قراءة آخر بايت من هذا المخزن كالتالي: > hiBuf[2]; نلاحظ ظهور القيمة ‎33‎ والتي ترمز إلى إشارة التعجب ‎!‎، ولكن ماذا سيحدث لو حاولنا قراءة بايت غير موجود بتمرير قيمة لمكان خاطئ ضمن المخزن كالتالي: > hiBuf[3]; سنلاحظ ظهور القيمة التالية: undefined وهو نفس ما سيحدث لو حاولنا الوصول إلى عنصر غير موجود ضمن مصفوفة ما. والآن بعد أن تعرفنا على طريقة قراءة بايت واحد من البيانات ضمن المخزن مؤقت، سنتعرف على طريقة لقراءة كل البيانات المخزنة ضمنه دفعة واحدة. يوفر كائن المخزن مؤقت التابعين ‎toString()‎ و ‎toJSON()‎ والذي يعيد كل منهما البيانات الموجودة ضمن المخزن دفعة واحدة كل منهما بصيغة مختلفة، ونبدأ بالتابع ‎toString()‎ والذي يحول البايتات ضمن المخزن المؤقت إلى قيمة سلسلة نصية ويعيدها، لنختبر ذلك باستدعائه على المخزن المؤقت السابق ‎hiBuf‎ كالتالي: > hiBuf.toString(); سنلاحظ ظهور القيمة التالية: 'Hi!' وهي قيمة السلسلة النصية التي خزناها ضمن المخزن المؤقت عند إنشاءه، ولكن ماذا سيحدث لو استدعينا التابع ‎toString()‎ على مخزن مؤقت تم إنشاءه من بيانات من نوع مختلف؟ لنختبر ذلك بإنشاء مخزن مؤقت جديد فارغ بحجم ‎10‎ بايت كالتالي: > const tenZeroes = Buffer.alloc(10); ونستدعي التابع ‎toString()‎ ونلاحظ النتيجة: > tenZeroes.toString(); سيظهر ما يلي: '\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000' حيث تقابل السلسلة النصية ‎\u0000‎ المحرف في ترميز Unicode المقابل للقيمة ‎NULL‎، وهو ما يقابل قيمة الصفر ‎0‎، حيث يعيد التابع ‎toString()‎ ترميز UTF-8 للبايتات المخزنة في حال كانت البيانات ضمن المخزن المؤقت ليست من نوع سلسلة نصية، ويقبل التابع ‎toString()‎ معامل اختياري بالاسم ‎encoding‎ لتحديد ترميز البيانات المطلوب، حيث يمكن باستخدامه تعديل ترميز قيمة السلسلة النصية التي يعيدها التابع، فيمكن مثلًا قراءة نفس البيانات للمخزن ‎hiBuf‎ السابق لكن بالترميز الست عشري كالتالي: > hiBuf.toString('hex'); سنلاحظ ظهور النتيجة التالية: '486921' حيث تُعبر تلك القيمة عن الترميز الست عشري للبايتات التي تتألف منها السلسلة النصية ‎Hi!‎. ويُستفاد في نود من تلك الطريقة لتحويل ترميز بيانات ما من شكل لآخر، بإنشاء مخزن مؤقت جديد يحوي قيمة السلسلة النصية المراد تحويلها ثم استدعاء التابع ‎toString()‎ مع تمرير الترميز الجديد المرغوب به. أما وفي المقابل يعيد التابع ‎toJSON()‎ البيانات ضمن المخزن المؤقت كأعداد تمثل قيم البايتات المخزنة مهما كان نوعها، والآن لنختبر ذلك على كل من المخزنين السابقين ‎hiBuf‎ و ‎tenZeroes‎ ونبدأ بإدخال التعلمية التالية: > hiBuf.toJSON(); سنلاحظ ظهور القيمة التالية: { type: 'Buffer', data: [ 72, 105, 33 ] } يحوي الكائن الناتج من استدعاء التابع ‎toJSON()‎ على خاصية النوع ‎type‎ بالقيمة نفسها دومًا وهي ‎Buffer‎، حيث يُستفاد من هذه القيمة لتمييز نوع كائن JSON هذا عن الكائنات الأخرى، ويحتوي على خاصية البيانات ‎data‎ وهي مصفوفة من الأعداد التي تمثل البايتات المخزنة، ونلاحظ أنها تحتوي على القيم ‎72‎ و ‎105‎ و ‎33‎ بالترتيب وهي نفس القيم التي ظهرت لنا سابقًا عند محاولة قراءة البايتات المخزنة بشكل مفرد. والآن لنختبر استدعاء التابع ‎toJSON()‎ على المخزن الفارغ ‎tenZeroes‎: > tenZeroes.toJSON(); سنلاحظ ظهور النتيجة التالية: { type: 'Buffer', data: [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] } الخاصية ‎type‎ تحوي نفس القيمة السابقة، بينما البيانات في المصفوفة هي عشرة أصفار تمثل البايتات العشرة الفارغة التي يحويها المخزن المؤقت، وبذلك نكون قد تعلمنا طرق قراءة البيانات من المخازن المؤقتة، وفي الفقرة التالية سنتعلم طريقة التعديل على تلك البيانات ضمن المخزن المؤقت. التعديل على المخزن المؤقت يوجد عدة طرق للتعديل على البيانات ضمن المخزن المؤقت، وهي مشابهة لطريقة قراءة البيانات حيث يمكن إما تعديل قيمة بايت واحد مباشرة باستخدام نفس صيغة الوصول لعناصر المصفوفات، أو كتابة محتوى جديد وتبديل المحتوى المخزن مسبقًا. ولنبدأ بالتعرف على الطريقة الأولى لذلك سنستخدم المخزن السابق ‎hiBuf‎ الذي يحتوي على قيمة السلسلة النصية ‎Hi!‎ داخله، ولنحاول تعديل محتوى كل بايت منه على حدى إلى أن تصبح القيمة الجديدة هي ‎Hey‎، حيث نبدأ بتعديل الحرف الثاني من المخزن ‎hiBuf‎ إلى الحرف ‎e‎ كالتالي: > hiBuf[1] = 'e'; نتأكد من صحة التعديل السابق بقراءة محتوى المخزن المؤقت الجديد باستدعاء التابع ‎toString()‎ كالتالي: > hiBuf.toString(); نلاحظ ظهور القيمة التالية: 'H\u0000!' القيمة الغريبة التي ظهرت تدل على أن المخزن مؤقت يقبل فقط القيم العددية عند تخزينها داخله، لذا لا يمكن تمرير الحرف ‎e‎ كسلسلة نصية مباشرةً، بل يجب تمرير القيمة الثنائية المقابلة له كالتالي: > hiBuf[1] = 101; الآن يمكننا معاينة القيمة الجديدة والتأكد: > hiBuf.toString(); نحصل على القيمة التالية: 'He!' نعدل الحرف الأخير من هذه القيمة وهو العنصر الثالث ونضع القيمة الثنائية المقابلة للحرف ‎y‎ كالتالي: > hiBuf[2] = 121; نتأكد من المحتوى بعد التعديل: > hiBuf.toString(); نحصل على القيمة: 'Hey' ماذا سيحدث لو حاولنا تعديل قيمة بايت يقع خارج مجال بيانات المخزن المؤقت؟ سنلاحظ تجاهل المخزن لتلك العملية وتبقى القيمة المخزنة ضمنه كما هي، لنختبر ذلك بكتابة الحرف ‎o‎ إلى المحرف الرابع الغير موجود ضمن المخزن السابق كالتالي: > hiBuf[3] = 111; نعاين قيمة المخزن بعد ذلك التعديل: > hiBuf.toString(); ونلاحظ أن القيمة بقيت كما هي دون تعديل: 'Hey' الطريقة الأخرى للتعديل على محتوى المخزن تكون بكتابة عدة بايتات معًا باستخدام التابع ‎write()‎ الذي يقبل سلسلة نصية كمعامل له تعبر عن المحتوى الجديد للبيانات، لنختبر ذلك عبر تعديل محتوى المخزن ‎hiBuf‎ إلى محتواه السابق ‎Hi!‎ كالتالي: > hiBuf.write('Hi!'); نلاحظ أن تنفيذ التعليمة السابقة يعيد القيمة ‎3‎ وهي عدد البايتات التي تم تعديلها ضمن المخزن في تلك العملية، حيث يعبر كل بايت عن محرف واحد لأننا نستخدم الترميز UTF-8، وفي حال كان المخزن يستخدم ترميز آخر مثل UTF-16 ففيه يُمثَّل كل محرف على 2 بايت، عندها سيعيد تنفيذ تابع الكتابة ‎write()‎ بنفس الطريقة القيمة ‎6‎ للدلالة على عدد البايتات التي تمثل المحارف الثلاث المكتوبة. والآن لنتأكد من المحتوى الجديد بعد التعديل نستدعي‎toString()‎ كالتالي: > hiBuf.toString(); نحصل على القيمة: 'Hi!' هذه الطريقة أسرع من طريقة تعديل كل بايت على حدى، ولكن ماذا سيحدث لو كتبنا بيانات بحجم أكبر من حجم المخزن الكلي؟ سيقبل المخزن البيانات المقابلة لحجمه فقط ويهمل البقية، لنختبر ذلك بإنشاء مخزن مؤقت بحجم 3 بايت كالتالي: > const petBuf = Buffer.alloc(3); ونحاول كتابة سلسلة نصية بأربعة محارف مثلًا ‎Cats‎ كالتالي: > petBuf.write('Cats'); نلاحظ أن ناتج التعليمة السابقة هي القيمة ‎3‎ أي تم تعديل قيمة ثلاث بايتات فقط وتجاهل باقي القيمة المُمررة، لنتأكد من القيمة الجديدة كالتالي: > petBuf.toString(); نلاحظ القيمة الجديدة: 'Cat' حيث يُعدل التابع ‎write()‎ البايتات بالترتيب فعدّل أول ثلاث بايتات فقط ضمن المخزن وتجاهل البقية. والآن لنختبر ماذا سيحدث لو كتبنا قيمة بحجم أقل من حجم المخزن الكلي، لهذا نُنشئ مخزن مؤقت جديد بحجم 4 بايت كالتالي: > const petBuf2 = Buffer.alloc(4); ونكتب القيمة الأولية داخله كالتالي: > petBuf2.write('Cats'); ثم نكتب قيمة جديدة حجمها أقل من حجم المخزن الكلي كالتالي: > petBuf2.write('Hi'); وبما أن البيانات ستكتب بالترتيب بدئًا من أول بايت سنلاحظ نتيجة ذلك عند معاينة القيمة الجديدة للمخزن: > petBuf2.toString(); ليظهر القيمة التالية: 'Hits' تم تعديل قيمة أول بايتين فقط، وبقيت البايتات الأخرى كما هي دون تعديل. تكون البيانات التي نود كتابتها موجودة أحيانًا ضمن مخزن مؤقت آخر، حيث يمكننا في تلك الحالة نسخ محتوى ذلك المخزن باستدعاء التابع ‎copy()‎، لنختبر ذلك بداية بإنشاء مخزنين جديدين كالتالي: > const wordsBuf = Buffer.from('Banana Nananana'); > const catchphraseBuf = Buffer.from('Not sure Turtle!'); يحوي كل من المخزنين ‎wordsBuf‎ و ‎catchphraseBuf‎ على بيانات من نوع سلسلة نصية، فإذا أردنا تعديل قيمة المخزن ‎catchphraseBuf‎ ليحوي على القيمة ‎Nananana Turtle!‎ بدلًا من ‎Not sure Turtle!‎ يمكننا استدعاء تابع النسخ ‎copy()‎ لنسخ القيمة ‎Nananana‎ من المخزن ‎wordsBuf‎ إلى ‎catchphraseBuf‎، حيث نستدعي التابع ‎copy()‎ على المخزن الحاوي على المعلومات المصدر لنسخها إلى مخزن آخر، ففي مثالنا النص الذي نريد نسخه موجود ضمن المخزن ‎wordsBuf‎، لذا نستدعي تابع النسخ منه كالتالي: > wordsBuf.copy(catchphraseBuf); حيث يُعبّر معامل الوجهة ‎target‎ المُمرر له عن المخزن المؤقت الذي ستُنسخ البيانات إليه، ونلاحظ ظهور القيمة ‎15‎ كنتيجة لتنفيذ التعليمة السابقة وهي تعبر عن عدد البايتات التي تم كتابتها، ولكن بما أن النص ‎Nananana‎ مكوّن من ثمانية محارف فقط فهذا يدل على عمل مختلف نفذه تابع النسخ، لنحاول معرفة ماذا حدث ونعاين القيمة الجديدة باستخدام التابع ‎toString()‎ ونلاحظ النتيجة: > catchphraseBuf.toString(); نلاحظ القيمة الجديدة: 'Banana Nananana!' نلاحظ أن تابع النسخ ‎copy()‎ قد نسخ كامل المحتوى من المخزن ‎wordsBuf‎ وخزنه ضمن ‎catchphraseBuf‎، ولكن ما نريده هو نسخ قسم من تلك البيانات فقط وهي القيمة ‎Nananana‎، لنعيد القيمة السابقة للمخزن ‎catchphraseBuf‎ أولًا ثم نحاول تنفيذ المطلوب كالتالي: > catchphraseBuf.write('Not sure Turtle!'); يقبل التابع ‎copy()‎ عدة معاملات تمكننا من تحديد البيانات التي نرغب بنسخها إلى المخزن المؤقت الوجهة وهي: الوجهة ‎target‎ وهو المعامل الإجباري الوحيد، ويعبر عن المخزن المؤقت الوجهة لنسخ البيانات. ‎targetStart‎ وهو ترتيب أول بايت ستبدأ كتابة البيانات إليه ضمن المخزن الوجهة، وقيمته الافتراضية هي الصفر ‎0‎، أي بدء عملية الكتابة من أول بايت ضمن المخزن الوجهة. ‎sourceStart‎ وهو ترتيب أول بايت من البيانات التي نرغب بنسخها من المخزن المصدر. ‎sourceEnd‎ وهو ترتيب آخر بايت من البيانات الذي ستتوقف عملية النسخ عنده في المخزن المصدر، وقيمته الافتراضية هي الطول الكلي للبيانات ضمن المخزن المصدر. باستخدام تلك المعاملات يمكننا تحديد الجزء ‎Nananana‎ من المخزن ‎wordsBuf‎ ليُنسخ إلى المخزن ‎catchphraseBuf‎، حيث نمرر المخزن ‎catchphraseBuf‎ كمعامل الوجهة ‎target‎ كما فعلنا سابقًا، ونمرر القيمة ‎0‎ للمعامل ‎targetStart‎ لكتابة القيمة ‎Nananana‎ في بداية المخزن ‎catchphraseBuf‎، أما للقيمة ‎sourceStart‎ سنمرر ‎7‎ وهو ترتيب بداية أول محرف من القيمة ‎Nananana‎ ضمن المخزن ‎wordsBuf‎، وللقيمة ‎sourceEnd‎ نمرر الحجم الكلي للمخزن المصدر، ليكون الشكل النهائي لاستدعاء تابع النسخ بعد تخصيص المعاملات السابقة كالتالي: > wordsBuf.copy(catchphraseBuf, 0, 7, wordsBuf.length); سيظهر هذه المرة القيمة ‎8‎ كنتيجة لتلك العملية ما يعني أن القيمة التي حددناها فقط هي ما تم نسخه، ونلاحظ كيف استخدمنا الخاصية ‎wordsBuf.length‎ لتمرير حجم المخزن كقيمة للمعامل ‎sourceEnd‎، وهي نفس الخاصية ‎length‎ الموجودة ضمن المصفوفات، والآن لنعاين القيمة الجديدة للمخزن ‎catchphraseBuf‎ ونتأكد من النتيجة: > catchphraseBuf.toString(); نلاحظ القيمة الجديدة: 'Nananana Turtle!' بذلك نكون قد عدلنا البيانات ضمن المخزن ‎catchphraseBuf‎ عن طريق نسخ جزء محدد من بيانات المخزن ‎wordsBuf‎ إليه. والآن بعد أن انتهينا من تنفيذ الأمثلة في هذا الفصل يمكنك الخروج من جلسة REPL حيث ستُحذف كل المتغيرات السابقة التي عرفناها بعد عملية الخروج هذه، ولذلك ننفذ أمر الخروج كالتالي: > .exit ختامًا تعرفنا في هذا المقال على المخازن المؤقتة والتي تمثل مساحة محددة من الذاكرة محجوزة لتخزين البيانات بالصيغة الثنائية، وتعلمنا طرق إنشاء المخازن المؤقتة، سواء الجديدة أو التي تحتوي على بيانات موجودة مسبقًا، وتعرفنا بعدها على طرق قراءة تلك البيانات من المخزن سواء بقراءة كل بايت منه على حدى أو قراءة المحتوى كاملًا باستخدام التابعين ‎toString()‎ و ‎toJSON()‎، ثم تعرفنا على طرق الكتابة إلى المخازن لتعديل البيانات المخزنة ضمنها، سواء بكتابة كل بايت على حدى أو باستخدام التابعين ‎write()‎ و ‎copy()‎. يفتح التعامل مع المخازن المؤقتة في نود Node.js الباب للتعامل مع البيانات الثنائية مباشرة، فيمكن مثلًا دراسة تأثير صيغ الترميز المختلفة للمحارف على البيانات المخزنة، كمقارنة صيغ الترميز المختلفة مع الصيغتين UTF-8 و ASCII وملاحظة فرق الحجم بينها، كما يمكن مثلًا تحويل البيانات المخزنة من صيغة UTF-8 إلى صيغ الترميز الأخرى، ويمكنك الرجوع إلى التوثيق الرسمي العربي من نود للكائن ‎Buffer‎ للتعرف عليه أكثر. ترجمة -وبتصرف- للمقال Using Buffers in Node.js لصاحبه Stack Abuse. اقرأ أيضًا المقال السابق: إنشاء خادم ويب في Node.js باستخدام الوحدة HTTP مقدمة إلى Node.js أساسيات التخزين المؤقت للويب Web Caching: المصطلحات الأساسية أساسيات التخزين المؤقت للويب Web Caching: ترويسات HTTP واستراتيجيات التخزين المؤقت
    1 نقطة
  45. سنتحدث في هذا المقال عن مفهوم العلاقات بين جداول قاعدة البيانات، وما أنواع هذه العلاقات وكيف تتمثل وما هو أثرها على العمل. ما هي العلاقات بين الجداول عند إنشاء جداول في قاعدة البيانات، فإن الظاهر لنا أننا نقوم ببناء جداول منفصلة وغير مترابطة، ولكننا في الواقع العملي نحتاج لربط هذه الكيانات المنفصلة بحيث تُبنَى علاقات تحكم البيانات الموجودة في هذه الجداول، وتحكم طريقة التعامل مع هذه البيانات. تنشَأ العلاقة بين جدوليْن عندما يُربط عمودان فيهما مع بعضهما عن طريق وجود قيود مطبقة على العمودين، بحيث يكون قيد المفتاح الرئيسي على عمود في الجدول “الأب” وقيد المفتاح الأجنبي على العمود في الجدول “الابن”، وعادة يكون اسم العمودين واحدًا في كلا الجدولين. مثلا، لحفظ عناوين الأشخاص نستطيع إنشاء جدول باسم Address ونربطه بجدول الأشخاص Persons بعلاقة تحكم البيانات الموجودة في الجدولين، بحيث يكون لكل شخص في الجدول Persons عنوان واحد مرتبط به في الجدول Address. يُربَط الجدولان عن طريق عمود باسم Person_Id في كلا الجدولين. مثال آخر، لو أردنا أن نتابع عملية استعارة الكتب في مكتبة، فإننا سننشئ جدولًا باسم Borrowed_Books (كُتُب مُعارة) ونربطها بالجدول Persons عن طريق العمود Person_Id. يستطيع الشخص الواحد - في هذا النوع من الربط - أن يستعير أكثر من كتاب. في هذا المثال، لو أننا حفظنا بيانات الأشخاص والكتب المستعارة في جدول واحد، ستظهر لنا مشكلة تكرار البيانات Data Redundancy لأننا سنكرّر بيانات الشخص لكل كتاب يستعيره. ماذا نستفيد من بناء العلاقات بين الجداول؟ التخلص من مشكلة تكرار البيانات عن طريق فصلها وحفظها في أكثر من جدول، فمشكلة تكرار البيانات هي عدو مستخدمي قواعد البيانات ومسؤوليها، لأنها تتسبب بزيادة حجم قاعدة البيانات بقدر كبير وبسرعة، وترفع السرعات المطلوبة لتنفيذ الاستعلامات، وتجعل من موضوع صيانة قاعدة البيانات كابوسا مقلقا. الحفاظ على دقة وسلامة البيانات في قاعدة البيانات، فمع وجود العلاقات بين الجداول، سوف تضمن مثلا عدم وجود كتاب مُعار ليس له شخص استعاره، أو عنوان وهمي ليس له صاحب، وقس على ذلك العديد من الأمثلة. استخراج البيانات من أكثر من جدول بكفاءة وسرعة عن طريق بناء جمل ربط استعلامية تطلب المعلومات من أعمدة مختلفة في جداول مختلفة، وإخراج النتيجة بطريقة مفيدة ومرتبة. أنواع العلاقات توجد أربعة أنواع من العلاقات بين الجداول كالتالي: علاقة واحد إلى واحد (One-to-One). علاقة واحد إلى كثير أو علاقة كثير إلى واحد (One-to-Many / Many-to-One). علاقة كثير إلى كثير (Many-to-Many). علاقة المرجعية الذاتية (Self Referencing). علاقة واحد إلى واحد لنفترض أن الجدول Persons لديه البنية والبيانات التالية: Person_ID First_Name Last_Name Age Address 101 Ibrahim Mohammed 31 12 Main St, Doha 102 Mohammed Khaled 25 Gaza, Middle Center نستطيع أن نضع بيانات العنوان في جدول منفصل ونسميه Address وتكون بنية الجدوليْن كالتالي. الجدول Persons: Person_ID First_Name Last_Name Age Address_Id 101 Ibrahim Mohammed 31 1 102 Mohammed Khaled 25 2 الجدول Address: Address_ID Address 1 12 Main St, Doha 2 Gaza, Middle Center لاحظ أنه أصبح لدينا عمود بنفس الاسم Address_Id في كلا الجدولين. لبناء العلاقة بين الجدولين، طبّقنا قيد المفتاح الأجنبي على العمود Address_Id في الجدول Persons بحيث يأخذ قيمه من العمود Address_Id في الجدول Address والمطبق عليه قيد المفتاح الرئيسي. أصبحت لدينا الآن علاقة بين الجدولين، وفي حال كان كل عنوان في الجدول Address يقترن فقط بشخص واحد في الجدول Persons فعندها نسمي هذه العلاقة واحدًا إلى واحد. يجب التنويه إلى أن هذا النوع من العلاقات غير مستخدم كثيرا، فالجدول الأول الذي يحتوي العنوان وبيانات الشخص يفي بالغرض في أغلب الأحيان. نستطيع تمثيل العلاقة بالشكل التالي: لاحظ أن وجود العلاقة اختياري، فمن الممكن أن يكون لدينا سجل في الجدول Persons دون عنوان له في الجدول Address وهذا مرتبط بعدم تطبيق قيد القيمة غير الفارغة على العمود Address_Id. في حال طُبِّق قيد غير القيمة غير الفارغة على العمود، فهنا تصبح العلاقة واجبة بين الجدولين، ولا يمكن أن نُنْشئ سجلًّا في الجدول Persons إلا بإدخال قيمة موجودة للعمود Address_Id وهو في مثالنا هذا غير منقطي نوعا ما. دورة علوم الحاسوب دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب اشترك الآن علاقة واحد إلى كثير أو علاقة كثير إلى واحد هذا النوع من العلاقات هو الشائع بين أنواع العلاقات بين الجداول في قاعدة البيانات، لوجود تطبيقات كثيرة عليه، فمثلا: الطالب (واحد) يستطيع أن يدرس أكثر من مساق (كثير). الطبيب يعالج ويتابع حالة مريض واحد أو أكثر. طلبية الشراء تحتوي على أكثر من عنصر. الشخص يستعير أكثر من كتاب. وقس على ذلك العديد من الأمثلة. لنفترض وجود جدول للزبناء Customers بالهيكلية التالية: Customer_ID Customer_Name 1 Ibrahim Mohammed 2 Mohammed Ahmed نستطيع ربط جدول الزبناء السابق بجدولٍ للطلبيات Orders بعلاقة واحد إلى كثير، لتعبر العلاقة عن الطلبيات التي قام بها العملاء وقيمة كل طلبية وتاريخها. يمكن أن تكون هيكلية الجدول Orders كالتالي: Order_ID Customer_ID Order_Date Order_Value 997 101 1/5/2017 100 998 102 21/4/2016 150 999 101 21/4/2015 1500 تسمح هذه العلاقة للعميل بأن يطلُب طلبيةً أو أكثر، ويمكن ألا تكون له أية طلبية. ولكنّ كل طلبية في الجدول Orders ستكون تابعة لعميل واحد. ونستطيع تمثيل هذه العلاقة بالشكل التالي: علاقة كثير إلى كثير في علاقة كثير إلى واحد، تكون العلاقة مبنية على أن يكون أحد أطرافها “واحدًا”، مثل طالب واحد، عميل واحد، طلبية واحدة، وفي الطرف الثاني “كثير”. نحتاج أحيانا أن يكون طرفا العلاقة كثيرين. فمثلا، قد تكون لدينا طلبية تحتوي أكثر من عنصر، ونفس العنصر يكون متواجدًا في أكثر من طلبية. في هذه الحالة نحتاج لوجود جدول إضافي لبناء العلاقة، فمثلا تكون هيكلية جدول Orders كالتالي: Order_ID Customer_ID Order_Date Order_Value 997 101 1/5/2017 100 998 102 21/4/2016 150 999 101 21/4/2015 1500 وهيكلية جدول Items كالتالي: Item_Id Item_Name Item_Description 201 Hard Disk 1 1 Tera SSD Hard 202 Mouse Microsoft Optical Mouse 203 LCD 42 42” LCD نستطيع بناء علاقة كثير إلى كثير بين الجدولين السابقين بإضافة جدول ثالث يحلّ مكان الرابط وغرضه الوحيد هو بناء هذا النوع من العلاقات. نطلق عليه مثلا الاسم Orders_Items، ويكون بالهيكلية التالية: Order_Id Item_Id 997 201 997 202 999 201 999 202 999 203 998 203 يمثّل الشكل التالي علاقة كثير إلى كثير كما تظهر في الجدول Orders_Items: علاقة المرجعية الذاتية يُبنى هذا النوع من العلاقات عندما نريد أن نبني علاقة بين جدول ونفس الجدول، وأوضح مثال على هذا النوع من العلاقات هو جدول الموظفين الذي يحتوي على عمود رقم الموظف المسؤول، حيث يمكن ربط كل موظف بموظف آخر (مدير أو مسؤول) من نفس الجدول. فمثلا، لو كان لدينا جدول باسم Employees خاص بحفظ بيانات الموظفين، ستكون هيكليته على النحو التالي لتطبيق علاقة مرجعية ذاتية عليه: Employee_ID Employee_Name Manager_Id 100 Ibrahim Elbouhissi 101 Khaled Saber 100 102 Yasmeen Hadi 100 103 Duaa Yousef 101 104 Sami Saber بعلاقة المرجعية الذاتية، من الممكن أن يكون للموظف مسؤولًا أو لا يكون، ومن الممكن أن يكون الموظف مسؤولا عن موظف أو أكثر، ويمكن تمثيل العلاقة بالشكل التالي.
    1 نقطة
  46. لا يملك الكثير من المبرمجين الذين يصنعون أروع البرامج وأكثرها فائدةً اليوم -مثل العديد من الأشياء التي نراها على الإنترنت أو نستخدمها يوميًا- خلفيةً نظريةً في علوم الحاسوب، لكنهم لا يزالون مبرمجين رائعين ومبدعين ونقدِّر ما يبنونه، حيث تملك علوم الحاسوب النظرية استخداماتها وتطبيقاتها، ويمكن أن تكون عمليةً تمامًا. يستهدف هذا المقال المبرمجين الذين يعرفون عملهم جيدًا ولكنهم لا يملكون خلفيةً نظريةً في علوم الحاسوب، وذلك من خلال واحدة من أكثر أدوات علوم الحاسوب واقعيةً، وهي: صيغة O الكبير Big O notation، وتحليل تعقيد الخوارزمية algorithm complexity. تُعَدّ هذه الأداة واحدةً من الأدوات المفيدة عمليًا للأشخاص العاملين في المجال الأكاديمي لعلوم الحاسوب، وفي إنشاء برامج على مستوى الإنتاج في الصناعة، لذلك نأمل أن تتمكن من تطبيقها في الشيفرة الخاصة بك لتحسينها بعد قراءة هذا المقال، كما يُفتَرض أن تكون قادرًا على فهم جميع المصطلحات الشائعة التي يستخدمها المختصون في علوم الحاسوب، مثل مصطلحات: التعقيد "Big O"، و"السلوك المقارب asymptotic behavior"، و"تحليل الحالة الأسوأ worst-case analysis" بعد قراءة هذا المقال. يستهدف هذا المقال أيضًا طلاب المدارس الإعدادية والثانوية في أي مكان في العالم، والذين يتنافسون دوليًا في الأولمبياد الدولي للمعلوماتية، أو مسابقة الخوارزميات الطلابية، أو مسابقات أخرى مماثلة. لا يحتوي هذا المقال على أي متطلبات رياضية مسبقَة، كما سيمنحك الخلفية التي ستحتاجها لمواصلة دراسة الخوارزميات مع فهمٍ أقوى للنظرية الكامنة وراءها، وننصح الأشخاص الذين يشاركون في هذه المسابقات الطلابية بشدة بقراءة هذا المقال التمهيدي بأكمله ومحاولة فهمه تمامًا، لأنه سيكون ضروريًا أثناء دراسة الخوارزميات وتعلُّم المزيد من التقنيات المتقدِّمة. سيكون هذا المقال مفيدًا للمبرمجين الصناعيين الذين ليس لديهم خبرة كبيرة في علوم الحاسوب النظرية، ونظرًا لتخصيص هذا المقال للطلاب، فقد يبدو في بعض الأحيان مثل كتاب مدرسي، حيث قد ترى بعض الموضوعات شديدة الوضوح لأنك رأيتها خلال سنوات دراستك على سبيل المثال، لذلك يمكنك تخطيها إذا شعرت أنك تفهمها. تصبح الأقسام الأخرى أقل عمقًا ونظريًا، حيث يحتاج الطلاب المشاركون في هذه المسابقات إلى معرفة المزيد عن الخوارزميات النظرية أكثر من ممارس المهنة العادي، ولا تزال معرفة هذه الأشياء أمرًا جيدًا بما أنها ليست صعبةً كثيرًا، لذا يستحق ذلك الأمر إعطاءه بعضًا من وقتك. لا تحتاج إلى خلفية رياضية لأن النص الأصلي لهذا المقال قد استهدف طلاب المدارس الثانوية، لذلك سيكون أي شخصٍ لديه بعض الخبرة في البرمجة -أي إن عرف ما هي العَودية recursion على سبيل المثال- قادرًا على المتابعة دون أي مشكلة. ستجد خلال هذا المقال العديد من الروابط التي تنقلك للاطلاع على مواد مهمة خارج نطاق موضوع المقال، إذ يُحتمل درايتك بمعظم هذه المفاهيم إذا كنت مبرمجًا صناعيًا؛ أما إذا كنت طالبًا مشاركًا في المسابقات، فسيعطيك اتباع هذه الروابط أفكارًا حول مجالات أخرى من علوم الحاسوب أو هندسة البرمجيات التي ربما لم تستكشفها بعد، والتي يمكنك الاطلاع عليها لتوسيع اهتماماتك. يصعب على الكثير من المبرمجين والطلاب فهم تحليل تعقيد الخوارزمية وصيغة Big O، أو يخافون منه، أو يتجنبونه تمامًا ويعدّونه عديم الفائدة، لكنه ليس صعبًا أو نظريًا كما قد يبدو للوهلة الأولى. يُعَدّ تعقيد الخوارزمية طريقةً لقياس سرعة تشغيل برنامج ما أو خوارزمية ما، لذلك يُعَد أمرًا عمليًا. الدافع Motivation يوجد أدوات لقياس مدى سرعة تشغيل البرنامج، فهناك برامج تسمى المشخِّصات profilers، حيث تقيس وقت التشغيل بالميلي ثانية ويمكنها مساعدتنا في تحسين الشيفرة الخاصة بنا عن طريق تحديد الاختناقات bottlenecks، وعلى الرغم من فائدة هذه الأداة إلا أنها ليست ذات صلة فعلية بتعقيد الخوارزمية، فتعقيد الخوارزمية مصمَّمٌ لمقارنة خوارزميتين ضمن المستوى المثالي، أي تجاهل التفاصيل منخفضة المستوى، مثل: لغة برمجة التطبيق، أو العتاد الذي تعمل عليه الخوارزمية، أو مجموعة تعليمات وحدة المعالجة المركزية CPU. عندما نريد مقارنة الخوارزميات من حيث ماهيتها -أي الأفكار التي تُعرّفنا كيفية حساب شيءٍ ما-، فلن يساعدنا العد بالميلي ثانية في ذلك، إذ يُحتمَل أن تعمل الخوارزمية السيئة والمكتوبة بلغة برمجة منخفضة المستوى مثل لغة التجميع Assembly، بصورة أسرع بكثير من خوارزمية جيدة مكتوبة بلغة برمجة عالية المستوى مثل بايثون، أو روبي، لذلك يجب تحديد معنى "الخوارزمية الأفضل". بما أن الخوارزميات هي برامج تجري عمليات حسابية فقط، ولا تجري أشياءً أخرى تقوم بها الحواسيب، مثل: مهام الشبكات، أو دخل المستخدم، وخرجه؛ فسيسمح لنا ذلك بتحليل التعقيد بقياس مدى سرعة البرنامج عند إجراء العمليات الحسابية. تتضمن أمثلة العمليات الحسابية البحتة العمليات العشرية العددية numerical floating-point operations، مثل: الجمع والضرب، أو البحث داخل قاعدة بيانات متناسبة مع الذاكرة العشوائية RAM عن قيمة معينة، أو تحديد المسار الذي ستمر به شخصية ذكاء اصطناعي في لعبة فيديو، بحيث يتعين عليها فقط السير مسافةً قصيرةً داخل عالمها الافتراضي (كما في الشكل الآتي)، أو تشغيل تطابق نمط تعبير نمطي regular expressions مع سلسلة، فالعمليات الحسابية موجودة في كل مكان في البرامج الحاسوبية. تستخدم شخصيات الذكاء الاصطناعي في ألعاب الفيديو الخوارزميات لتجنب العقبات عند تنقّلها في العالم الافتراضي يُعَدّ تحليل التعقيد أداةً لشرح كيفية تصرّف الخوارزمية مع زيادة حجم الدخل. وهنا نتساءل، إذا زدنا الدخل، فكيف ستتصرّف الخوارزمية؟ أي إذا كانت الخوارزمية الخاصة بنا تستغرق ثانيةً واحدةً للتشغيل بالنسبة إلى دخلٍ بحجم 1000، فكيف ستتصرف الخوارزمية إذا ضاعفنا حجم الدخل؟ هل ستعمل بالسرعة نفسها، أم بنصف السرعة، أم أبطأ بأربع مرات؟ يُعَدّ هذا مهمًا في البرمجة العملية لأنه سيسمح لنا بالتنبؤ بسلوك الخوارزمية عندما تصبح بيانات الدخل أكبر؛ فمثلًا، إذا أنشأنا خوارزميةً لتطبيق ويب يعمل جيدًا مع 1000 مستخدِم، وقِسنا وقت تشغيله باستخدام تحليل تعقيد الخوارزمية، فيمكننا توقُّع ما سيحدث بمجرد حصولنا على 2000 مستخدِم بدلًا من ذلك. يمنحنا تحليل التعقيد في مسابقات الخوارزميات رؤيةً عن المدة التي سيستغرقها تشغيل الشيفرة لأكبر حالات الاختبار التي تُستخدَم لاختبار صحة البرنامج، لذلك إذا قِسنا سلوك برنامجنا مع دخل صغير، فسنعرف سلوكه مع الدخل الأكبر. لنبدأ بمثال بسيط هو إيجاد العنصر الأكبر في مصفوفة. عد التعليمات سنستخدم لغات برمجة مختلفة لأمثلة هذا المقال، لكن لا تيأس إن لم تعرف لغة برمجة معينة، وبما أنك تعرف البرمجة، فيجب أن تكون قادرًا على قراءة الأمثلة دون أي مشكلة حتى إن لم تكن على دراية بلغة البرمجة المختارة، لأنها ستكون بسيطةً ولن نستخدم أية ميزات خاصة بلغة معينة. إذا كنت طالبًا منافسًا في مسابقات الخوارزميات، فيُرجَّح استخدمك لغة C++‎، لذلك لن تواجه مشكلة، وبالتالي نوصي في هذه الحالة التدرّب باستخدام لغة C++‎. يمكن البحث عن العنصر الأكبر في مصفوفة باستخدام شيفرة لغة جافا سكريبت التالية، بافتراض أن مصفوفة الدخل هي A، وحجمها n: var M = A[ 0 ]; for ( var i = 0; i < n; ++i ) { if ( A[ i ] >= M ) { M = A[ i ]; } } أول شيء سنفعله هو حساب عدد التعليمات الأساسية التي ينفذها هذا الجزء من الشيفرة، حيث سنفعل هذا مرةً واحدةً فقط، ولن يكون ضروريًا لاحقًا، لذلك تحمَّل لبضع لحظات. نقسّم الشيفرة إلى تعليماتٍ بسيطة عندما نحللها، فهذه التعليمات البسيطة هي ذات التعليمات، أو قريبة منها، والتي يمكن لوحدة المعالجة المركزية من تنفيذها مباشرةً، كما سنفترض أن معالجنا يمكنه تنفيذ العمليات التالية على أساس تعليمة واحدة لكل منها: إسناد قيمة لمتغير. البحث عن قيمة عنصر معين في مصفوفة. مقارنة قيمتين. زيادة قيمة. العمليات الحسابية الأساسية، مثل: الجمع، والضرب. سنفترض أن التفرع -أي الاختيار بين جزئي if وelse بعد تقييم شرط if- سيحدث على الفور ولن يحسب هذه التعليمات. السطر الأول من الشيفرة السابقة هو: var M = A[ 0 ]; يتطلب هذا السطر تعليمتين: إحداهما للبحث عن العنصر A[ 0 ]، والأخرى لإسناد قيمته إلى M، حيث سنفترض أن قيمة n تساوي 1 على الأقل دائمًا، كما تتطلّب الخوارزمية هاتين التعليمتين دائمًا، بغض النظر عن قيمة n، ويجب أيضًا تشغيل شيفرة تهيئة حلقة for دائمًا، ويعطينا هذا تعليمتين أخريين، هما: الإسناد assignment، والمقارنة comparison: i = 0; i < n; ستشغَّل هاتان التعليمتان قبل أول تكرار من حلقة for، كما نحتاج إلى تعليمتين إضافيتين للتشغيل بعد كل تكرار لحلقة for، وهما: زيادة المتغير i، ومقارنة للتحقق من أننا ما زلنا ضمن الحلقة، أي كما يلي: ++i; i < n; إذا تجاهلنا جسم الحلقة، فسيكون عدد التعليمات التي تحتاجها هذه الخوارزمية هو 4 + 2n، أي 4 تعليمات في بداية حلقة for، وتعليمتين في نهاية كل تكرار من n تكرار. يمكننا الآن تحديد دالة رياضية f( n )، حيث تعطينا عدد التعليمات التي تحتاجها الخوارزمية عند إعطاء n، أي لدينا f( n ) = 4 + 2n عندما يكون جسم حلقة for فارغًا. تحليل الحالة الأسوأ Worst-case analysis لدينا بالنظر إلى جسم حلقة for عملية بحث في مصفوفة، وعملية مقارنة تحدث دائمًا، كما يلي: if ( A[ i ] >= M ) { … أي يوجد تعليمتان، ولكن اعتمادًا على قيم المصفوفة، فقد يعمل جسم تعليمة if وقد لا يعمل. فإذا تحقق A[ i ] >= M، فسنشغّل هاتين التعليمتين الإضافيتين -أي البحث في مصفوفة والإسناد-، كما يلي: M = A[ i ] لكن لا يمكننا الآن تحديد الدالة f( n ) بسهولة، وذلك لعدم اعتماد عدد التعليمات على n فقط، وإنما على الدخل أيضًا، فإذا كان الدخل A = [ 1, 2, 3, 4 ] مثلًا، فستحتاج الخوارزمية إلى تعليمات أكثر مما إذا كان الدخل A = [ 4, 3, 2, 1 ]. نفكر عند تحليل الخوارزميات في أسوأ سيناريو غالبًا، فما هو أسوأ شيء يمكن حدوثه لخوارزميتنا؟ ومتى تحتاج الخوارزمية إلى معظم التعليمات لإكمالها؟ في هذه الحالة، يحدث ذلك عندما يكون لدينا مصفوفة بترتيب تصاعدي مثل A = [ 1, 2, 3, 4 ]، حيث يجب استبدال المتغير M في كل مرة، وبالتالي، سينتج عن ذلك تنفيذ معظم التعليمات، ويُطلَق على هذه الحالة اسم تحليل الحالة الأسوأ Worst-case analysis؛ وهذا ليس أكثر من مجرد التفكير في الحالة التي تحدث عندما نكون الأقل حظًا. لدينا في أسوأ الحالات 4 تعليمات للتشغيل داخل جسم حلقة for، لذلك لدينا f( n ) = 4 + 2n + 4n = 6n + 4، حيث تعطينا الدالة f عدد التعليمات التي قد تكون مطلوبةً في الحالة الأسوأ بالاعتماد على حجم المشكلة n. السلوك المقارب Asymptotic behavior تمنحنا الدالة السابقة فكرةً جيدةً عن مدى سرعة الخوارزمية، ولكن كما وعدناك، فلن تحتاج إلى القيام بالمهمة الشاقة المتمثلة في عد التعليمات في البرنامج. يعتمد عدد تعليمات وحدة المعالجة المركزية الفعلية اللازمة لكل عبارة لغة برمجة، على مُصرِّف compiler لغة البرمجة، وكذا على مجموعة تعليمات وحدة المعالجة المركزية المتاحة، سواءً كان معالج AMD أو Intel Pentium على حاسوبك، أو كان معالج MIPS على Playstation 2 الخاصة بك، وسنتجاهل ذلك أيضًا كما ذكرنا سابقًا. سنشغّل الآن الدالة "f" الخاصة بنا من خلال "مرشِّح filter" ليساعدنا في التخلص من التفاصيل الصغيرة التي يفضّل المتخصصون في علوم الحاسوب تجاهلها. يوجد قسمان في الدالة f التي تساوي 6n + 4، وهما: 6n، و4، كما لا نهتم في تحليل التعقيد إلا بما يحدث لدالة عد التعليمات عندما يكبر دخل البرنامج (n)، ويتماشى هذا مع الأفكار السابقة لسلوك "السيناريو الأسوأ" الذي ينص على الاهتمام بكيفية تصرّف الخوارزمية عند معالجتها بصورة سيئة، أي عندما تفعل هذه الخوارزمية شيئًا صعبًا، وهذا مفيد حقًا عند مقارنة الخوارزميات. إذا تغلبت خوارزمية على خوارزمية أخرى عند استخدام دخل كبير، فيُرجَّح أن الخوارزمية الأسرع ستبقى أسرع عند إعطاء دخلٍ أسهل وأصغر. سنحذف الأقسام التي تنمو ببطء ونبقي فقط الأقسام التي تنمو بسرعة عندما تصبح n أكبر، ومن الواضح أن 4 ستبقى 4 لأن n تنمو بصورة أكبر؛ أما 6n فتنمو بصورةٍ أكبر وأكبر، لذلك تميل إلى كونها أهم بالنسبة للمشكلات الأكبر، وبالتالي، أول شيء سنفعله هو حذف 4 والاحتفاظ بالدالة على صورة f( n ) = 6n. يُعَدّ ما سبق منطقيًا، وذلك لأنّ الرقم 4 هو "ثابت التهيئة initialization constant" ببساطة، وقد تتطلب لغات البرمجة المختلفة وقتًا مختلفًا لعملية الإعداد، فمثلًا، تحتاج لغة جافا إلى بعض الوقت لتهيئة آلتها الافتراضية virtual machine، وبما أننا نتجاهل الاختلافات في لغات البرمجة، فمن المنطقي تجاهل هذه القيمة فقط. الشيء الثاني الذي سنتجاهله هو معامل الضرب الثابت أمام n، وبالتالي ستصبح الدالة f( n ) = n، مما يجعل الأمور أكثر بساطةً. يُعَدّ إهمال معامل الضرب أمرًا منطقيًا إذا فكرنا في كيفية تصريف لغات البرمجة المختلفة، فقد تُصرَّف عبارة "البحث في المصفوفة" في إحدى لغات البرمجة إلى تعليمات مختلفة عن لغات برمجةٍ مختلفة، كما لا يتضمّن الإجراء A[ i ] التحقق من عدم تجاوز المتغير i لحجم المصفوفة المُصرَّح عنها في لغة سي C على سبيل المثال، ولكنه يتضمّن ذلك في لغة باسكال Pascal؛ إذًا فالشيفرة التالية المكتوبة بلغة باسكال: M := A[ i ] تكافئ الشيفرة التالية المكتوبة بلغة سي: if ( i >= 0 && i < n ) { M = A[ i ]; } لذلك نتوقّع أن لغات البرمجة المختلفة ستنتج عوامِلًا مختلفةً عندما نعُد تعليماتها. تستخدِم لغة باسكال مصرِّفًا غبيًا يغفَل عن التحسينات الممكنة في هذا المثال، كما تتطلب ثلاث تعليمات لكل وصول إلى مصفوفة، في حين تتطلب لغة سي تعليمةً واحدةً. يُطبَّق إهمال هذا العامل على جميع الاختلافات بين لغات البرمجة والمصرِّفات أيضًا، وبالتالي، تُحلَّل فكرة الخوارزمية فقط. يُسمَّى المرشِّح المتمثِّل بعمليتَي "إهمال جميع العوامل"، و"الإبقاء على القسم الذي يكبر أكثر" كما هو موصوف أعلاه بالسلوك المقارب asymptotic behavior، ولذلك نمثِّل السلوك المقارب للدالة f( n ) = 2n + 8 من خلال الدالة f( n ) = n. نهتم رياضيًا بنهاية الدالة f لأن n يميل إلى اللانهاية؛ ولكن إن لم تفهم ما تعنيه هذه العبارة، فلا تقلق لأنّ هذا كل ما تحتاج إلى معرفته، كما لن نستطيع إهمال الثوابت في النهاية في إطار رياضي صارم، ولكننا نفعل ذلك لأغراض علوم الحاسوب وللأسباب الموضَّحة أعلاه. سنحل بعض الأمثلة لفهم الفكرة أكثر، فمثلًا، لنجد السلوك المقارب لدوال المثال التالي بإهمال العوامِل الثابتة، والحفاظ على الأقسام التي تكبر بسرعة: تعطي الدالة f( n ) = 5n + 12 الدالة f( n ) = n باستخدام الاستنتاج نفسه بالضبط كما هو مذكور أعلاه. تعطي الدالة f (n) = 109 الدالة f( n ) = 1، حيث سنهمل معامل الضرب 109 * 1، لكن لا يزال يتعين علينا وضع 1 هنا للإشارة إلى أنّ لهذه الدالة قيمة غير صفرية. تعطي الدالة f( n ) =n2 + 3n + 112 الدالة f( n ) = n2، حيث تكبرn2 أكثر من 3n بالنسبة لقيمة n كبيرة بدرجة كافية، لذلك نحتفظ بها. تعطي الدالة f( n ) = n3 + 1999n + 1337 الدالة f( n ) = n3، فعلى الرغم من أنّ العامل الموجود أمام n كبير جدًا، لكن لا يزال بإمكاننا العثور على قيمة n كبيرة بما يكفي، بحيث يكون n3 أكبر من 1999n، وبما أننا مهتمون بسلوك قيم n الكبيرة جدًا، فسنبقي على n3 فقط، أي تصبح الدالة n3 المرسومة باللون الأزرق في الشكل التالي أكبر من الدالة 1999n المرسومة باللون الأحمر بعد القيمة n = 45، كما تبقى هي الأكبر بعد هذه النقطة إلى الأبد. تعطي الدالة f( n ) = n +√n الدالة f (n) = n، وذلك لأنّ n تنمو أسرع من ‎√n كلما زادتn ويمكنك تجربة الأمثلة الآتية بنفسك. تمرين 1 f( n ) = n6 + 3n f( n ) = 2n + 12 f( n ) = 3n + 2n f( n ) = nn + n (اكتب نتائجك، وسترى الحل أدناه). إذا واجهتك مشكلة مع أحد العناصر المذكورة أعلاه، فجرِّب بعض قيم n الكبيرة لمعرفة القسم الأكبر، وهذا بسيط جدًا، أليس كذلك؟ التعقيد Complexity بما أنه يمكننا إهمال كل هذه الثوابت "الشكلية"، فمن السهل جدًا معرفة السلوك المقارب لدالة عدّ تعليمات البرنامج، حيث يملك البرنامج الذي لا يحتوي على حلقات، الدالة f( n ) = 1، لأن عدد التعليمات التي يحتاجها هو مجرد عددٍ ثابت -إلا في حالة استخدامه العودية كما سنرى لاحقًا-. يملك البرنامج الذي يحتوي حلقةً واحدةً تمتد من 1 إلى n، الدالة f( n ) = n، حيث سينفِّذ عددًا ثابتًا من التعليمات قبل الحلقة، وعددًا ثابتًا من التعليمات بعد الحلقة، وعددًا ثابتًا من التعليمات داخل الحلقة التي تُشغَّل جميعًا n مرة. يجب أن يكون هذا أكثر سهولةً وأقل مللًا من عدّ التعليمات الفردية، لذلك لنلقِ نظرةً على بعض الأمثلة لفهم ذلك أكثر. يتحقق البرنامج التالي المكتوب بلغة PHP من وجود قيمة معيَّنة داخل مصفوفة A لها الحجم n: <?php $exists = false; for ( $i = 0; $i < n; ++$i ) { if ( $A[ $i ] == $value ) { $exists = true; break; } } ?> تسمَّى هذه الطريقة للبحث عن قيمة داخل مصفوفة البحث الخطي linear search، وهذا اسم معقول لاحتواء هذا البرنامج على الدالة f( n ) = n، كما سنحدد بالضبط ما تعنيه كلمة "خطي" في القسم التالي. لاحظ وجود عبارة "break" هنا، والتي قد تؤدّي إلى إنهاء البرنامج في وقت قريب، وربما بعد تكرارٍ واحد؛ لكن تذكّر اهتمامنا بالسيناريو الأسوأ، وهو بالنسبة لهذا البرنامج عدم احتواء المصفوفة A على القيمة التي نبحث عنها، لذلك لا يزال لدينا الدالة f( n ) = n. تمرين 2 حلّل عدد التعليمات التي يحتاجها برنامج PHP أعلاه بالنسبة إلى n في الحالة الأسوأ للعثور على الدالة ( f( n، وذلك على غرار الطريقة التي حلّلنا بها البرنامج الأول المكتوب بلغة جافا سكريبت، ثم تحقق من أنه لدينا f( n ) = n بصورةٍ مقاربة. لنلقِ نظرةً على البرنامج المكتوب بلغة بايثون Python، والذي يجمع عنصرين من مصفوفة معًا لينتج مجموع يُخزَّن في متغير آخر: v = a[ 0 ] + a[ 1 ] لدينا هنا عددٌ ثابت من التعليمات، لذلك f (n) = 1. يتحقق البرنامج التالي المكتوب بلغة C++‎ من احتواء متّجه -مصفوفة مختارة أو جزء من مصفوفة- يُسمَّى A، وذو حجم n على قيمتين متماثلتين في أي مكان ضمنه: bool duplicate = false; for ( int i = 0; i < n; ++i ) { for ( int j = 0; j < n; ++j ) { if ( i != j && A[ i ] == A[ j ] ) { duplicate = true; break; } } if ( duplicate ) { break; } } بما أنه توجد هنا حلقتان متداخلتان داخل بعضهما البعض، فسيكون لدينا سلوكًا مقاربًا موصوفًا بالدالة f( n ) = n2. إذا استدعى برنامج دالةً داخل حلقة وعرفنا عدد التعليمات التي تجريها الدالة المستدعاة، فمن السهل تحديد عدد تعليمات البرنامج بأكمله. لنلقِ نظرةً على المثال التالي المكتوب بلغة ? int i; for ( i = 0; i < n; ++i ) { f( n ); } إذا علمنا أن f( n ) هي دالة تنفِّذ n تعليمة بالضبط، فيمكننا حينئذٍ معرفة أن عدد تعليمات البرنامج بأكمله هو n2 بصورةٍ مقاربة، حيث تُستدعى الدالة n مرة تمامًا. ننتقل الآن إلى الصيغة التخيُّلية التي يستخدمها علماء الحاسوب للسلوك المقارب، حيث سنقول أن برنامجنا هو Θ ( f( n )) عندما نحدِّد الدالة f بصورة مقاربة، فمثلًا، البرامج المذكورة أعلاه هي Θ (1) وΘ( n2 ) وΘ( n2 ) على التوالي، حيث تُقرَأ Θ( n ) "ثيتا بالنسبة إلى n". نقول أحيانًا أنّ f( n ) -وهي الدالة الأصلية التي تحسب عدد التعليمات بما في ذلك الثوابت- هي شيء ما Θ، حيث نقول مثلًا أنّ f( n ) = 2n هي دالة Θ( n )، كما يمكننا كتابة 2n ∈ Θ (n)‎ أيضًا، والتي تُنطَق "2n هي ثيتا بالنسبة إلى n". لا ترتبك بشأن هذا الصيغة، فكل ما تنص عليه هو أنه إذا حسبنا عدد التعليمات التي يحتاجها البرنامج وهي 2n، فسيُوصَف السلوك المقارب للخوارزمية بـ n والذي نتج بإهمال الثوابت. فيما يلي بعض العبارات الرياضية الصحيحة باستخدام هذا الصيغة: n6 + 3n ∈ Θ( n6 ) 2n + 12 ∈ Θ( 2n ) 3n + 2n ∈ Θ( 3n ) nn + n ∈ Θ( nn ) بالمناسبة، إذا حللت التمرين 1 السابق، فهذه هي بالضبط الإجابات التي يجب أن تصل إليها. نسمّي ما نضعه ( هنا )Θ التعقيد الزمني time complexity، أو تعقيد complexity الخوارزمية، لذلك فللخوارزمية التي تحتوي على الصيغة Θ( n ) تعقيدٌ هو n. لدينا أيضًا أسماءً خاصةً للصيغ التالية: Θ( 1 )، وΘ( n )، وΘ( n2 ) وΘ( log( n ) )، وذلك لكثرة ظهورها، حيث نقول أنّ خوارزمية Θ( 1 ) هي خوارزمية ذات وقت ثابت constant-time algorithm، والخوارزمية Θ( n ) خطية linear، وΘ( n2 ) تربيعية quadratic؛ أما الخوارمية Θ( log( n ) ) فهي لوغاريتمية logarithmic. لا تقلق إن لم تعرف ما هي اللوغاريتمات حتى الآن، سنشرح ذلك لاحقًا. صيغة O الكبير Big-O notation قد تكون معرفة سلوك الخوارزمية بهذه الطريقة كما فعلنا أعلاه أمرًا صعبًا، خاصةً بالنسبة للأمثلة الأعقد، ولكن يمكننا القول بأن سلوك خوارزميتنا لن يتجاوز أبدًا حدًا معينًا، وبالتالي لن نضطر إلى تحديد السرعة التي تعمل بها الخوارزمية، وذلك حتى عند تجاهل الثوابت بالطريقة التي طبّقناها سابقًا، فكل ما علينا فعله هو إيجاد حدٍ معين، حيث سنشرح ذلك بمثال. مشكلة الفرز (sorting problem) هي إحدى المشكلات الشهيرة التي يستخدمها علماء الحاسوب لتدريس الخوارزميات، حيث تُعطَى مصفوفة A بحجم n في مشكلة الفرز، ويُطلَب منا كتابة برنامج لفرز أو ترتيب هذه المصفوفة، وتُعَدّ هذه المشكلة مشكلةً مهمةً كونها مشكلةً واقعيةً في الأنظمة الحقيقية، إذ يحتاج مستكشف الملفات إلى فرز الملفات التي يعرضها حسب الاسم حتى يتمكن المستخدِم من التنقل بينها بسهولة، أو قد تحتاج لعبة فيديو إلى فرز الكائنات ثلاثية الأبعاد المعروضة في العالم بناءً على بعدها عن عين اللاعب داخل العالم الافتراضي من أجل تحديد ما هو مرئي وما هو غير مرئي، وهو ما يسمى مشكلة الرؤية Visibility Problem، فالكائنات التي تكون أقرب للاعب هي المرئية، في حين أنّ الكائنات البعيدة قد تخفيها الكائنات الموجودة أمامها، ويوضّح الشكل الآتي هذه المشكلة، إذ لن يرى اللاعب الموجود في النقطة الصفراء المناطق المظلَّلة، كما يُعَدّ تقسيم العالم إلى أجزاء صغيرة وفرزها حسب المسافة التي تفصلها عن اللاعب إحدى طرق حل مشكلة الرؤية. يُعَدّ الفرز أيضًا مهمًا بسبب وجود العديد من الخوارزميات لحله، كما يكون بعضها أسوأ من البعض الآخر، وهي أيضًا مشكلة سهلة التحديد والشرح، لذلك لنكتب جزءًا من شيفرة تفرز مصفوفة. الطريقة التالية هي طريقة غير فعالة لفرز مصفوفة في لغة روبي Ruby، حيث تدعم لغة روبي فرز المصفوفات باستخدام دوال مبنيّة مسبقًا يجب استخدامها بدلًا من ذلك، وهي بالتأكيد أسرع مما سنراه هنا، ولكن ما سنستخدمه هنا هي شيفرة بغرض التوضيح فقط: b = [] n.times do m = a[ 0 ] mi = 0 a.each_with_index do |element, i| if element < m m = element mi = i end end a.delete_at( mi ) b << m end تسمى هذه الطريقة الفرز الانتقائي Selection sort، حيث تجد هذه الخوارزمية الحد الأدنى من المصفوفة -يُرمَز إلى المصفوفة بالمتغير a في الشيفرة السابقة، بينما يُرمَز إلى الحد الأدنى بالمتغير m، والمتغير mi هو دليله في المصفوفة-، وتضعه في نهاية مصفوفة جديدة -أي المصفوفة b في حالتنا-، ثم تزيله من المصفوفة الأصلية، وبعدها تجد الحد الأدنى بين القيم المتبقية للمصفوفة الأصلية، وتلحِقه بالمصفوفة الجديدة التي تحتوي على عنصرين الآن، ثم تزيله من المصفوفة الأصلية؛ وتستمر هذه العملية إلى حين إزالة جميع العناصر من المصفوفة الأصلية وإدخالها في المصفوفة الجديدة، مما يعني فرز المصفوفة. نلاحظ وجود حلقتين متداخلتين في الشيفرة السابقة، حيث تعمل الحلقة الخارجية n مرة، وتعمل الحلقة الداخلية مرةً واحدةً لكل عنصر من عناصر المصفوفة a. تحتوي المصفوفة a في البداية على n عنصر، ونزيل عنصر مصفوفة واحد في كل تكرار، لذلك تتكرر الحلقة الداخلية n مرة خلال التكرار الأول للحلقة الخارجية، ثم n - 1 مرة، وبعدها n - 2 مرة، وهكذا دواليك حتى التكرار الأخير للحلقة الخارجية التي تعمل خلالها مرةً واحدةً فقط. من الصعب قليلًا تقييم تعقيد هذا البرنامج، حيث يجب معرفة المجموع 1 + 2 + … +(n+(n-1، ولكن يمكننا بالتأكيد إيجاد "الحد الأعلى" لهذا المجموع، وهذا يعني أنه يمكننا تغيير برنامجنا - أي يمكنك فعل ذلك في عقلك، وليس في الشيفرة الفعلية- لجعله أسوأ مما هو عليه، ومن ثم إيجاد تعقيد هذا البرنامج الجديد، فإذا تمكّنا من العثور على تعقيد البرنامج الأسوأ الذي أنشأناه، فسنعلم أنّ برنامجنا الأصلي أسوأ أو ربما أفضل. بالتالي إذا أوجدنا تعقيدًا جيدًا لبرنامجنا المعدَّل الذي هو أسوأ من برنامجنا الأصلي، فيمكننا معرفة أنه سيكون لبرنامجنا الأصلي تعقيدًا جيدًا جدًا أيضًا، أي إما جيدًا بمستوى برنامجنا المعدَّل أو أفضل منه. لنفكّر في طريقة تعديل هذا البرنامج لتسهيل معرفة تعقيده، ولكن ضع في بالك أنه لا يمكننا سوى جعل الأمر أسوأ هكذا، إذ سيأخذ البرنامج مزيدًا من التعليمات، وبالتالي سيكون تقديرنا مفيدًا لبرنامجنا الأصلي. يمكن تغيير الحلقة الداخلية للبرنامج بجعلها تتكرر n مرة دائمًا بدلًا من تكرارها عددًا متغيرًا من المرات، كما ستكون بعض هذه التكرارات عديمة الفائدة، لكنها ستساعدنا في تحليل تعقيد الخوارزمية الناتجة؛ وإذا أجرينا هذا التغيير البسيط، فمن الواضح أن الخوارزمية الجديدة التي أنشأناها هي Θ( n2 ) وذلك لوجود حلقتين متداخلتين بحيث يتكرر كل منهما n مرة بالضبط، وبالتالي، يمكننا القول أنّ الخوارزمية الأصلية هي O( n2 ). تُنطَق O( n2 ) "أوه كبيرة لمربع n، أي big oh of n squared"، وهذا يقودنا للقول بأن برنامجنا ليس أسوأ من n2 بصورةٍ مقاربة، فقد يكون أفضل من ذلك أو مثله. إذا كان برنامجنا هو بالفعل Θ( n2 ) فلا يزال بإمكاننا القول أنه O( n2 ) أي تخيل تغيير البرنامج الأصلي بطريقة لا تغيره كثيرًا، لكنها لا تزال تجعله أسوأ قليلًا مثل إضافة تعليمات لا معنى لها في بداية البرنامج، بحيث سيؤدي فعل ذلك إلى تغيير دالة عدّ التعليمات بواسطة ثابت بسيط، والذي سنتجاهله عندما يتعلق الأمر بالسلوك المقارب، وبالتالي فالبرنامج Θ( n2 ) هو O( n2 ) أيضًا. قد لايكون البرنامج O( n2 ) هو Θ( n2 ) أيضًا، فأيّ برنامج Θ( n ) مثلًا هو O( n2 ) وO( n ) كذلك، وإذا تخيلنا أن برنامج Θ( n ) هو عبارة عن حلقة for بسيطة تتكرر n مرة، فيمكن جعلها أسوأ بتغليفها ضمن حلقة for أخرى تتكرر n مرة أيضًا، وبالتالي ينتج برنامج له دالة f( n ) = n2، كما يمكن تعميم ذلك بالقول أنّ أي برنامج Θ( a ) هو O( b ) عندما يكون b أسوأ من a. لا يحتاج التغيير الذي أجريناه على البرنامج إلى إعطائنا برنامجًا له معنى أو مكافئًا لبرنامجنا الأصلي، حيث يحتاج فقط إلى تنفيذ تعليمات أكثر من التعليمات الأصلية بالنسبة إلى قيمة n معينة، أي نستخدم هذا التغيير من أجل حساب عدد التعليمات فقط وليس لحل مشكلتنا. لذا يمكن القول بأن برنامجنا هو O( n2 ) بطريقةٍ آمنة، وذلك لأننا حلّلنا خوارزميتنا، ووجدناها ليست أسوأ من n2، ولكنها في الواقع قد تساوي n2، وبالتالي يمكننا تقدير سرعة تشغيل برنامجنا. لنستعرض بعض الأمثلة لتساعدك على التعرف على هذه الصيغة الجديدة. تمرين 3 أيٌّ مما يلي صحيح؟ خوارزمية Θ( n ) هي O( n ) خوارزمية Θ( n ) هي O( n2 ) خوارزمية Θ( n2 ) هي O( n3 ) خوارزمية Θ( n ) هي O( 1 ) خوارزمية O( 1 ) هي Θ( 1 ) خوارزمية O( n ) هي Θ( 1 ) الحل هذا صحيح لأنّ برنامجنا الأصلي كان Θ( n )، ويمكننا تحقيق O( n ) دون تغيير برنامجنا على الإطلاق. هذا صحيح لأنّ n2 أسوأ من n. هذا صحيح لأنّ n3 أسوأ من n2. هذا خطأ لأنّ 1 ليس أسوأ من n، فإذا أخذ البرنامج n تعليمةً بصورةٍ مقاربة -أي عددًا خطيًا من التعليمات-، فلا يمكننا جعله أسوأ ولا يمكن جعله يأخذ تعليمةً واحدةً بصورةٍ مقاربة -أي عددًا ثابتًا من التعليمات-. هذا صحيح لأنّ التعقيدان متماثلان. قد يكون هذا صحيحًا أو غير صحيح وذلك اعتمادًا على الخوارزمية، لكنه خاطئ في الحالة العامة، فإذا كانت الخوارزمية Θ( 1 )، فمن المؤكد أنها O( n )؛ أما إذا كانت O( n ) فقد لا تكون Θ( 1 )، فمثلًا، خوارزمية Θ( n ) هي O ( n ) وليست Θ( 1 ). تمرين 4 استخدم متتالية الجمع الحسابية arithmetic progression sum لإثبات أنّ البرنامج أعلاه ليس O( n2 ) فقط، وإنما Θ( n2 ) أيضًا، ويمكنك البحث عن معنى المتتالية الحسابية في ويكيبيديا في حالة عدم معرفتك بها. يعطي التعقيد O-complexity لخوارزمية ما حدًا أعلى لتعقيد الخوارزمية الفعلي - أي الوقت الأكبر الذي قد تستغرقه الخوارزمية-، بينما تعطي الصيغة Θ تعقيد الخوارزمية الفعلي، حيث نقول أحيانًا أن الصيغة Θ تعطينا حدًا تامًا، وإذا علمت أننا وجدنا حد تعقيدٍ غير تام، فيمكنك استخدام الحرف الصغير o للإشارة إلى ذلك، فمثلًا، إذا كان للخوارزمية التعقيد Θ( n )، فسيكون تعقيدها التام n، وبالتالي سيكون لهذه الخوارزمية O( n ) و O( n2 ) معًا. بما أن الخوارزمية هي Θ( n )، فسيكون حد O( n ) هو الحد التام؛ أما حد O( n2 ) فليس تامًا، ولذلك يمكننا كتابة أن الخوارزمية هي o( n2 ) والتي تُنطق "o الصغير بالنسبة إلى مربع n"، وذلك لتوضيح أن الحد ليس تامًا. كما يُفضَّل إيجاد حدود تامة للخوارزميات لأنها تعطينا مزيدًا من المعلومات حول سلوكها، ولكنه ليس أمرًا سهلًا دائمًا. تمرين 5 حدّد أيًا من الحدود التالية هي حدودًا تامةً وأيها لا، ثم تحقق من صحتها أو خطئها، ويجب عليك استخدام الصيغة o لتحديد الحدود غير التامة: خوارزمية Θ (n) التي لها الحد الأعلى O (n). خوارزمية Θ (n2) التي لها الحد الأعلى O (n3). خوارزمية Θ(1) التي لها الحد الأعلى O (n). خوارزمية Θ (n) التي لها الحد الأعلى O (1). خوارزمية Θ (n) التي لها الحد الأعلى O (2n). الحل الحد تام لأنّ تعقيد Θ وتعقيد O متماثلان في هذه الحالة. الحد غير تام لأنّ تعقيد O أكبر من تعقيد Θ، وقد يكون حد O( n2 ) تامًا، لذلك يمكننا كتابة أن الخوارزمية هي o( n3). الحد غير تام، لأنّ تعقيد O أكبر من تعقيد Θ، وقد يكون حد O( 1 ) تامًا، لذلك يمكننا الإشارة بأنّ الحد O( n ) ليس تامًا من خلال كتابته بالشكل o( n ). الحد خاطئ، فقد اُرتكِب خطأ في حسابه، فلا يمكن أن يكون لخوارزمية Θ( n ) حد أعلى من O( 1 )‎، وذلك لأنّ التعقيد n أكبر من التعقيد 1 -تذكر أنّ O تعطي حدًا أعلى. الحد تام، فقد يبدو مثل حد غير تام، لكن هذا ليس صحيحًا في الواقع، -تذكر أنّ سلوك 2n وn المقارب هو نفسه، وأنّ الصيغتَين O وΘ تهتمان بالسلوك المقارب؛ إذًا لدينا O( 2n ) = O( n )، وبالتالي، فهذا الحد تام لأن التعقيد هو نفس Θ. قد تجد نفسك تائهًا قليلًا في هذه الصيغة الجديدة، ولكن سنقدم صيغتين آخرين بسيطتين بالنسبة للصيغ Θ، وO، وo قبل انتقالنا إلى بعض الأمثلة، ويُستحسَن أن تعرف هاتين الصيغتَين الآن، حيث لن نستخدمهما كثيرًا في هذا المقال لاحقًا. عدّلنا برنامجنا في المثال أعلاه ليصبح أسوأ -أي أخذ المزيد من التعليمات، وبالتالي المزيد من الوقت- وأنشأنا الصيغة O، حيث تُعَدّ الصيغة O ذا مغزىً لأنها تخبرنا بأن برنامجنا لن يكون أبدًا أبطأ من حدٍ معين، ولهذا فهي توفر معلومات قيّمةً تمكننا من القول بأن برنامجنا جيد بما فيه الكفاية، وإذا فعلنا العكس وعدّلنا برنامجنا ليصبح أفضل، ثم أوجدنا تعقيد البرنامج الناتج، فنستخدم الصيغة Ω التي تعطينا تعقيدًا يخبرنا بأن برنامجنا لن يكون أفضل، وهذا مفيد إذا أردنا إثبات أن البرنامج يعمل ببطء أو أن الخوارزمية سيئة، وقد يكون هذا مفيدًا للقول بأن الخوارزمية بطيئة جدًا عند استخدامها في حالة معينة، فمثلًا، خوارزمية Ω( n3 ) ليست أفضل من n3. قد تكون الصيغة Θ( n3 ) سيئًة مثل Θ (n4) أو أسوأ منها، لكننا نعلم أنها سيئة إلى حد ما على الأقل. إذًا تعطينا الصيغة Ω حدًا أدنى لتعقيد خوارزمية، كما يمكننا كتابة الصيغة ω على غرار الصيغة ο عندما يكون الحد ليس تامًا، فمثلًا، خوارزمية Θ ( n3 ) هي ο( n4 ) وω( n2 ) وتُقرَأ Ω( n ) "أوميغا كبيرة بالنسبة إلى n"، بينما تُقرَأ ω( n ) "أوميغا صغيرة بالنسبة إلى n". تمرين 6 اكتب حد O تام وآخر غير تام، وحد Ω تام وآخر غير تام من اختيارك للتعقيدات التالية، ولكن بشرط وجودهما طبعًا: Θ( 1 ) Θ(√n) Θ( n ) Θ( n2 ) Θ( n3 ) الحل هذا هو تطبيق مباشر للتعاريف أعلاه: الحدود التامة هي O( 1 ) وΩ( 1 )، كما يكون حد O غير التام هو O( n ) -تذكّر أن O تعطينا حدًا أعلى-، وبما أن n أكبر من 1، فسيمثِّل حدًا غير تام يمكننا كتابته بالشكل o( n ) أيضًا، كما لا يمكننا إيجاد حد غير تام للصيغة Ω لعدم تمكننا من الحصول على أقل من 1 لهذه الدوال، إذًا يجب تعاملنا مع الحد التام فقط. يجب أن تكون للحدود التامة تعقيد Θ نفسه، لذا فهي O(√n) وΩ(√n) على التوالي؛ أما الحدود غير التامة فقد تكون O( n )، حيث تُعَدّ n أكبر من ‎√n وبالتالي فهي حد أعلى لها. وبما أننا نعلم أن هذا حدًا أعلى غير تام، فيمكننا أيضًا كتابته بالصورة o( n )؛ أما الحد الأدنى غير التام، فيمكننا ببساطة استخدام Ω( 1 )، وبما أننا نعلم أن هذا الحد ليس تامًا، فيمكننا كتابته بالصورة ω( 1. 3 ). الحدود التامة هي O( n ) وΩ( n ). قد يكون الحدان الغير تامين هما ω( 1 ) وo( n3 ) وهي في الواقع حدودٌ سيئة للغاية، لأنها بعيدة كل البعد عن التعقيدات الأصلية، إلا أنها لا تزال صالحة باستخدام التعاريف. الحدود التامة هي O( n2 ) وΩ( n2 ) ويمكننا استخدام ω( 1 ) وo( n3 ) بالنسبة للحدود غير التامة كما في المثال السابق. الحدود التامة هي O( n3 ) وΩ( n3 ) على التوالي، وقد يكون الحدان غير التامَين هما ω(‎n2 √n)‎ وω(n3 √n)، وعلى الرغم من أنّ هذه الحدود ليست تامة، إلا أنها أفضل من تلك الموجودة في جواب رقم 3 و4 من هذا التمرين أعلاه. قد تعطي الصيغتان O وΩ أيضًا حدودًا تامة، وسبب استخدامنا لهما بدلًا من الصيغة Θ هو أننا قد لا نكون قادرين على معرفة ما إذا كان الحد الذي أوجدناه تامًا أم لا، أو ربما لا نرغب في متابعة العملية باستخدام الصيغة Θ التي تحتاج تدقيقًا عميقًا. إذا لم تتذكر تمامًا جميع الرموز المختلفة واستخداماتها، فلا تقلق بشأنها كثيرًا الآن، حيث يمكنك دائمًا العودة والبحث عنها، وأهم الرموز هي O وΘ. لاحظ أيضًا أنه على الرغم من كون الصيغة Ω تعطينا سلوكًا ذو حدٍ منخفض للدالة -أي تحسّن برنامجنا وأصبح ينفّذ تعليماتٍ أقل-، إلا أننا ما زلنا نشير إليها بتحليل "الحالة الأسوأ"، لأننا نزوّد برنامجنا بأسوأ دخلٍ ممكن من n ونحلّل سلوكه في ظل هذا الافتراض. يوضح الجدول التالي الرموز التي قدمناها للتو وتوافقاتها مع الرموز الرياضية المعتادة للمقارنات التي نستخدمها مع الأعداد، كما يعود السبب في عدم استخدامنا للرموز المعتادة هنا واستخدام الأحرف الإغريقية بدلًا منها، إلى الإشارة إلى إجراء مقارنة سلوك مقارب وليس مقارنة بسيطة: table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } عامل المقارنة المقارب Asymptotic comparison operator عامل المقارنة العددي Numeric comparison operator الخوارزمية هي ( شيء ما )o يوجد عدد < هذا الشيء الخوارزمية هي ( شيء ما )O يوجد عدد ≤ هذا الشيء الخوارزمية هي ( شيء ما )Θ يوجد عدد = هذا الشيء الخوارزمية هي ( شيء ما )Ω يوجد عدد ≥ هذا الشيء الخوارزمية هي ( شيء ما )ω يوجد عدد > هذا الشيء اللوغاريتمات Logarithms هل تعرف ما هي اللوغاريتمات؟ إن كانت إجابتك نعم، فلا تتردد في تخطي هذا القسم، فهذا القسم هو مقدمة لمن ليس على دراية باللوغاريتمات، أو لمن لم يستخدمها كثيرًا مؤخرًا، فهو موجَّهٌ للطلاب الأصغر سنًا، والذين لم يروا اللوغاريتمات في المدرسة بعد. تُعَدّ اللوغاريتمات مهمة بسبب ظهورها بكثرة عند تحليل التعقيد، ويُعَدّ اللوغاريتم عمليةً تُطبَّق على رقم ما ليصبح أصغر، حيث تشبه هذه العملية الجذر التربيعي لرقم إلى حد كبير؛ لذلك إذا كان هناك شيء واحد تريد تذكره حول اللوغاريتمات، فهو أنها تأخذ رقمًا وتجعله أصغر بكثير من الأصل. يوضِّح الشكل الآتي مقارنةً بين الدوال n، و‎√n، وlog( n )، إذ تنمو الدالة n -أو كما تُسمَّى الدالة الخطية linear function- المرسومة باللون الأخضر في أعلى الشكل، أسرع بكثير من دالة الجذر التربيعي المرسومة باللون الأحمر في المنتصف، والتي بدورها تنمو أسرع بكثير من الدالة log( n ) المرسومة باللون الأزرق في الجزء السفلي من هذا الرسم البياني، ويكون الفرق واضحًا تمامًا حتى بالنسبة إلى n صغيرة مثل n = 100. تُعَدّ اللوغاريتمات عمليةً عكسيةً لرفع شيءٍ ما إلى أس مثل الجذور التربيعية التي هي عملية عكسية لتربيع شيءٍ ما، وسنشرح ذلك بمثال. ضع في بالك المعادلة التالية: 2x = 1024 نريد حل هذه المعادلة لإيجاد قيمة x، لذلك لنسأل أنفسنا: ما هو الرقم الذي يجب رفع الأساس 2 إليه حتى نحصل على 1024؟ هذا الرقم هو 10. بالفعل لدينا ‎210 = 1024، وهو أمر سهل التحقق منه؛ كما تساعدنا اللوغاريتمات من خلال الإشارة إلى هذه المشكلة باستخدام صيغة جديدة، فالرقم 10 في هذه الحالة هو لوغاريتم 1024 ونكتبه بالصورة ( log( 1024 ونقرأه "لوغاريتم 1024". بما أننا نستخدم العدد 2 أساسًا، فتسمى هذه اللوغاريتمات لوغاريتمات الأساس 2، كما توجد لوغاريتمات لها أساسات أخرى، ولكننا سنستخدم فقط لوغاريتمات الأساس 2 في هذا المقال، وإذا كنت طالبًا منافسًا في مسابقات دولية ولا تعرف شيئًا عن اللوغاريتمات، فنوصيك بشِدة بالتدرّب على اللوغاريتمات بعد الانتهاء من هذا المقال. تُعَدّ لوغاريتمات الأساس 2 أكثر أنواع اللوغاريتمات شيوعًا في علوم الحاسوب لأنه غالبًا ما يكون لدينا كيانان مختلفان فقط هما: 0 و1، كما نميل أيضًا إلى تقسيم مشكلة كبيرة واحدة إلى نصفين، لذلك ما عليك سوى معرفة لوغاريتمات الأساس 2 لمتابعة هذا المقال. تمرين 7 حُلّ المعادلات أدناه، وأوجد اللوغاريتم في كل حالة باستخدام اللوغاريتمات ذات الأساس 2 فقط: 2x = 64 ‎(22)x= 64 4x = 4 2x = 1 2x + 2x = 32 ‎(2x) * (2x) = 64 الحل لا يتضمن الحل أكثر من تطبيق الأفكار المُعرَّفة أعلاه: يمكننا باستخدام طريقة التجربة والخطأ إيجاد أن x = 6، وبالتالي، log( 64 ) = 6. يمكن كتابة ‎(22)x بالصورة 22x من خلال تطبيق خصائص الأس، إذًا لدينا 2x = 6 لأن log( 64 ) = 6 من النتيجة السابقة، وبالتالي، x = 3. يمكننا كتابة 4 بالشكل 22 باستخدام معرفتنا من المعادلة السابقة، وبهذا تصبح المعادلة ‎(22)x= 4 وهي 22x = 4 نفسها، ونلاحظ أن log( 4 ) = 2 لأن ‎22 = 4، وبالتالي، لدينا أن 2x = 2، وعليه فـ x = 1؛ كما يمكن ملاحظة ذلك بسهولة من المعادلة الأصلية، حيث أن ناتج الرفع للأس 1 هو الأساس نفسه. تذكر أن ناتج الرفع للأس 0 هو 1، لذلك لدينا log( 1 ) = 0، بما أنّ ‎20= 1، وبالتالي، x = 0. لا يمكننا أخذ اللوغاريتم مباشرةً بسبب وجود المجموع، ولكن يمكن ملاحظة أنّ 2x+ 2x هي ‎2 * (2x) نفسها، حيث ضربنا هنا بالعدد 2 أي لهما الأساس نفسه، وبالتالي، ينتج 2x + 1، والآن كل ما علينا فعله هو حل المعادلة 2x + 1= 32، حيث نجد أنّ log( 32 ) = 5، وهكذا x + 1 = 5، وبالتالي، x = 4. نضرب هنا قوتين للعدد 2 معًا، ولذلك يمكننا ضمهما من خلال ملاحظة أن (2x) * (2x) هي 22x نفسها، وبالتالي كل ما علينا فعله هو حل المعادلة 22x= 64 التي حللناها بالفعل أعلاه، حيث x = 3. التعقيد العودي Recursive complexity لنلقِ نظرةً على دالة عودية recursive function، فالدالة العودية هي دالة تستدعي نفسها. هل يمكننا تحليل تعقيدها؟ توجِد الدالة الآتية والمكتوبة بلغة بايثون، حيث تُقيِّم مضروب factorial عددٍ معين، إذ يمكن إيجاد مضروب عدد صحيح موجب بضربه بجميع الأعداد الصحيحة السابقة معًا، فمثلًا، مضروب العدد 5 هو 5 * 4 * 3 * 2 * 1؛ كما نعبِّر عن ذلك بالصورة "!5" ونقرؤها "مضروب العدد خمسة five factorial"، ويفضِّل بعض الناس نُطقها بصوت عالٍ مثل "خمسة !!!". def factorial( n ): if n == 1: return 1 return n * factorial( n - 1 ) لنحلّل تعقيد هذه الدالة، فعلى الرغم من عدم احتواء هذه الدالة على أية حلقات، إلا أنّ تعقيدها ليس ثابتًا constant، حيث يجب علينا متابعة عد التعليمات مرةً أخرى لمعرفة تعقيدها، فإذا مرّرنا المتغير n إلى هذه الدالة، فستنفّذ n مرة؛ وإذا لم تكن متأكدًا من ذلك، فشغّل هذه الدالة "يدويًا" الآن من أجل n = 5 للتحقق منها. ستنفَّذ هذه الدالة مثلًا 5 مرات من أجل n = 5، بحيث ستستمر في إنقاص قيمة n بمقدار 1 في كل استدعاء، وبالتالي، يكون تعقيد هذه الدالة هو ( Θ( n. إذا لم تكن متأكدًا من هذه الحقيقة، فتذكر أنه يمكنك دائمًا العثور على التعقيد الدقيق عن طريق حساب عدد التعليمات، وإذا رغبت في ذلك، فيمكنك محاولة حساب عدد التعليمات الفعلية التي تطبّقها هذه الدالة لإيجاد الدالة f( n )، والوصول إلى نتيجة أنها خطية بالفعل، مع العلم أنّ خطية تعني Θ( n ). يحتوي الشكل التالي على رسم بياني لمساعدتك على فهم مفهوم العودية المُطبَّقة عند استدعاء الدالة factorial( 5 )، ويجب على هذا الشكل توضيح لماذا تعقيد هذه الدالة هو تعقيد خطي: العودية (معاوة الاستدعاء) التي تطبّقها الدالة factorial التعقيد اللوغاريتمي Logarithmic complexity إحدى المشكلات الشهيرة في علوم الحاسوب هي البحث عن قيمة داخل مصفوفة، ولقد حلّلنا هذه المشكلة سابقًا من خلال الحالة العامة، كما تصبح هذه المشكلة ممتعةً إذا كان لدينا مصفوفة مرتَّبة ونريد إيجاد قيمة معينة بداخلها، حيث تُسمَّى إحدى طرق القيام بذلك البحث الثنائي binary search. ننظر إلى العنصر الأوسط في المصفوفة، وإذا وجدنا العنصر هناك، فقد انتهينا؛ وإلّا فإذا كانت القيمة التي وجدناها أكبر من القيمة التي نبحث عنها، فسنعلم أن العنصر سيكون في الجزء الأيسر من المصفوفة؛ وإلّا فإننا نعلم أنه سيكون في الجزء الأيمن من المصفوفة، كما يمكننا الاستمرار في تقسيم هذه المصفوفات الصغيرة إلى نصفين حتى يتبقّى عنصر واحد فقط، وتوضّح الشيفرة الوهمية التالية هذه الفكرة: def binarySearch( A, n, value ): if n = 1: if A[ 0 ] = value: return true else: return false if value < A[ n / 2 ]: return binarySearch( A[ 0...( n / 2 - 1 ) ], n / 2 - 1, value ) else if value > A[ n / 2 ]: return binarySearch( A[ ( n / 2 + 1 )...n ], n / 2 - 1, value ) else: return true تُعَدّ هذه الشيفرة الوهمية تبسيطًا للتطبيق الفعلي، كما يُعَدّ وصفها أسهل من تطبيقها عمليًا، حيث يحتاج المبرمج إلى الاهتمام ببعض مشاكل التطبيق. يجب تطبيق الدالة floor()‎ أو ceil()‎ بسبب وجود أخطاء بفارق الواحد off-by-one، وقد لا ينتج عن القسمة على العدد 2 قيمةً صحيحةً، فالجزء الصحيح أو المتمم الصحيح الأسفل floor لعدد حقيقي ما x، هو أكبر عدد صحيح ليس أكبر من x، فصحيح العدد 2.6 هو 2، أي أنّ أكبر عدد صحيح ليس أكبر من 2.6. بينما السقف أو المتمم الصحيح الأعلى ceil لعدد حقيقي x، فهو أصغر عدد صحيح ولكنه ليس أصغر من x، لأن سقف العدد 2.15 هو 3، أي أنّ أصغر عدد صحيح ليس أصغر من 2.15. لكن يمكننا افتراض أن هذه الطريقة ستنجح دائمًا، وسنفترض أنّ تطبيقنا الفعلي يهتم بأخطاء الفراق الواحد off-by-one، وذلك لأننا نريد تحليل تعقيد هذه الطريقة فقط. إذا لم تطبّق البحث الثنائي مطلقًا، فقد ترغب في فعل ذلك باستخدام لغة البرمجة المفضلة لديك. يوضّح الشكل الآتي لصاحبه لوك فرانكل Luke Francl طريقة عمل البحث الثنائي باستخدام العودية، حيث يُميَّز الوسيط A لكل استدعاء باللون الأسود، وتستمر العودية حتى تصبح المصفوفة مكوّنةً من عنصر واحد فقط. إذا لم تكن متأكدًا من عمل هذه الطريقة، فشغّلها يدويًا باستخدام مثال بسيط واقنع نفسك بأنها تعمل بالفعل. لنحاول تحليل هذه الخوارزمية العودية، حيث سنفترض -من أجل التبسيط- أن المصفوفة تُقسَم دائمًا إلى نصفين تمامًا، متجاهلين الجزأين 1+ و 1- من الاستدعاء العودي. كما يجب اقتناعك بعدم تأثير إجراء تغيير بسيط على نتائج التعقيد مثل تجاهل الجزأين 1+ و1-، وهذه حقيقة يجب عادةً إثباتها إذا أردنا أن نكون حريصين من وجهة نظر رياضية، لكنها بديهية عمليًا. سنفترض للتبسيط أن حجم المصفوفة هو بالضبط قوة للعدد 2. بحيث لا يغير هذا الافتراض النتائج النهائية لتعقيدنا الذي سنصل إليه، وسيحدث السيناريو الأسوأ لهذه المشكلة عند عدم ظهور القيمة التي نبحث عنها في مصفوفتنا على الإطلاق، كما سنبدأ في هذه الحالة بمصفوفة ذات حجم n في الاستدعاء الأول للعودية، ثم سنحصل على مصفوفة بحجم n / 2 في الاستدعاء التالي. وبعدها سنحصل على مصفوفة بحجم n / 4 في الاستدعاء العودي التالي، ثم مصفوفة بحجم n / 8، وهكذا؛ حيث تقسَم المصفوفة إلى نصفين في كل استدعاء، حتى نصل إلى عنصر واحد فقط، لذلك لنكتب عدد العناصر في المصفوفة الخاصة بنا لكل استدعاء كما يلي: 0th iteration: n 1st iteration: n / 2 2nd iteration: n / 4 3rd iteration: n / 8 … ith iteration: n / 2i last iteration: 1 لاحظ احتواء المصفوفة على n / 2i عنصر في التكرار i بسبب تقسيم المصفوفة في كل تكرار إلى نصفين، مما يعني أننا نقسم عدد عناصرها على 2، أي نضرب المقام بـ 2؛ وإذا فعلنا ذلك i مرة، فسنحصل على n / 2i، إذ يستمر هذا الإجراء ونحصل على عدد أصغر من العناصر مع كل قيمة أكبر للمتغير i، حتى نصل إلى التكرار الأخير الذي يتبقى فيه عنصر واحد فقط، وإذا رغبنا في معرفة التكرار i الذي يتبقى فيه عنصرٌ واحد فقط، فعلينا حل المعادلة التالية: 1 = n / 2i سيكون هذا صحيحًا فقط عندما نصل إلى الاستدعاء النهائي للدالة ()binarySearch، وليس في الحالة العامة، لذلك فإيجاد قيمة i هنا سيساعدنا في العثور على التكرار الذي ستنتهي فيه العودية. وإذا ضربنا كلا الطرفين بـ 2i فسنحصل على: 2i= n يجب أن تبدو هذه المعادلة مألوفة إذا قرأت قسم اللوغاريتمات أعلاه، وبالتالي ينتج: i = log( n ) يخبرنا هذا أن عدد التكرارات المطلوبة لإجراء بحث ثنائي هو log( n )، حيث n هي عدد عناصر المصفوفة الأصلية، ويُعَدّ ذلك أمرًا منطقيًا. بافتراض أنّ n = 32 فسيكون لدينا مصفوفة مؤلفة من 32 عنصرًا، فكم مرةً يجب تقسيم هذه المصفوفة إلى نصفين للحصول على عنصر واحد فقط؟ سنحتاج إلى تقسيمها خمس مرات للحصول إلى عنصر واحد، أي بالترتيب التالي: 32 ← 16 ← 8 ← 4 ← 2 ← 1، والعدد 5 هو لوغاريتم 32، لذلك يكون تعقيد البحث الثنائي هو Θ( log( n ) ). تسمح لنا هذه النتيجة الأخيرة بمقارنة البحث الثنائي والبحث الخطي، وبما أن ( log( n أصغر بكثير من n، فيمكن استنتاج أن البحث الثنائي أسرع بكثير من البحث الخطي للبحث داخل مصفوفة، لذلك يُستحسَن إبقاء المصفوفات مرتبةً عند العمل على عدة عمليات بحث فيها. الفرز الأمثل Optimal sorting تهانينا! لقد بتّ الآن تعرف كلًا من تحليل تعقيد الخوارزميات، وسلوك الدوال المقارب، وصيغة big-O؛ بالإضافة إلى كيفية إيجاد تعقيد الخوارزمية ليكون O( 1 )، وO( log( n ) )، وO( n )، وO( n2 ) وما إلى ذلك بديهيًا، كما أصبحت تعرف الرموز o، وO، وω، وΩ، وΘ، وماذا يعني تحليل الحالة الأسوأ أيضًا. يُعَدّ هذا القسم الأخير من المقال أعقد قليلًا، لذا لا تتردد في أخذ راحة إذا تعبت، حيث سيتطلب منك التركيز وقضاء بعض الوقت في حل التمارين، لكنه سيوفر لك طريقةً مفيدةً للغاية في تحليل تعقيد الخوارزمية وهذا أمرٌ مهم، لذلك فهو بالتأكيد يستحق الفهم. يُدعى الفرز الذي طبقناه سابقًا بالفرز الانتقائي، حيث ذكرنا أنه ليس الفرز الأمثل؛ والخوارزمية المثلى هي الخوارزمية التي تحل المشكلة بأفضل طريقة ممكنة، مما يعني عدم وجود خوارزميات أفضل منها، وهذا يعني أن لدى جميع الخوارزميات الأخرى الموجهة لحل المشكلة تعقيدًا أسوأً أو مساويًا لتلك الخوارزمية المثلى، كما قد يكون هناك العديد من الخوارزميات المثلى لمشكلةٍ ما بحيث تشترك جميعها في التعقيد نفسه، ويمكن حل مشكلة الفرز على النحو الأمثل بطرق مختلفة، كما يمكن استخدام فكرة البحث الثنائي نفسها من أجل الفرز بسرعة، وتسمى طريقة الفرز المثلى هذه الفرز بالدمج mergesort. سنحتاج أولًا في إجراء فرز الدمج، إلى إنشاء دالة مساعدة والتي سنستخدمها بعد ذلك لإجراء الفرز الفعلي، حيث تأخذ دالة الدمج merge مصفوفتين مرتّبتَين سابقًا، ثم تدمجهما معًا في مصفوفة كبيرة مرتبة، ويمكن القيام بذلك بسهولة كما يلي: def merge( A, B ): if empty( A ): return B if empty( B ): return A if A[ 0 ] < B[ 0 ]: return concat( A[ 0 ], merge( A[ 1...A_n ], B ) ) else: return concat( B[ 0 ], merge( A, B[ 1...B_n ] ) ) تأخذ الدالة concat عنصرًا يُسمى "الرأس head" ومصفوفة تُسمى "الذيل tail"، ثم تبني وتعيد مصفوفةً جديدةً تحتوي على عنصر "الرأس" الذي يمثِّل العنصر الأول في المصفوفة الجديدة، وعلى عنصر "الذيل" الذي يمثِّل بقية العناصر الموجودة في المصفوفة، حيث تعيد الدالة concat( 3, [ 4, 5, 6 ] ) مثلًا، ما يلي: [ 3, 4, 5, 6 ]. ونستخدم المتغيرين An وBn للإشارة إلى أحجام المصفوفتين A وB على التوالي. تمرين 8 تحقق من إجراء الدالة المذكورة أعلاه لعملية الدمج، ثم أعد كتابتها بلغة البرمجة المفضلة لديك بطريقة تكرارية -أي باستخدام حلقات for- بدلًا من استخدام العودية. يكشف تحليل هذه الخوارزمية أن وقت تشغيلها Θ( n )، حيث يمثِّل n طول المصفوفة الناتجة أي n = A_n + B_n. تمرين 9 تحقق من أن وقت تشغيل الدالة merge هو Θ( n ). يمكننا بناء خوارزمية فرز أفضل باستخدام هذه الدالة، حيث نقسم المصفوفة إلى قسمين، ونرتِّب كل جزء من الجزأين عوديًا، ثم ندمج المصفوفتين المرتبتين في مصفوفة واحدة كبيرة، وذلك كما يلي: def mergeSort( A, n ): if n = 1: return A # it is already sorted middle = floor( n / 2 ) leftHalf = A[ 1...middle ] rightHalf = A[ ( middle + 1 )...n ] return merge( mergeSort( leftHalf, middle ), mergeSort( rightHalf, n - middle ) ) يُعَدّ فهم هذه الدالة أصعب مما مررنا به سابقًا، لذلك قد يأخذ منك التمرين التالي بضع دقائق. تمرين 10 تحقق من صحة الدالة mergeSort، وذلك من خلال التحقق من تمكّن الدالة mergeSort من فرز المصفوفة المعطاة بصورة صحيحة، وإذا واجهتك مشكلة في فهم سبب نجاحها في ذلك، فجرّبها باستخدام مصفوفة صغيرة على أساس مثال ثم شغّلها "يدويًا"، وتأكد عند تشغيل هذه الدالة يدويًا من حصولك على النصف الأيسر leftHalf والنصف الأيمن rightHalf. وإذا قسّمت المصفوفة في المنتصف تقريبًا، فليس من الضروري قسم المصفوفة في المنتصف تمامًا إذا احتوت على عدد فردي من العناصر وهذا الهدف من استخدام الدالة floor أعلاه. لنحلل الآن تعقيد الدالة mergeSort، حيث سنقسم المصفوفة إلى نصفين متساويين في الحجم على غرار دالة البحث الثنائي binarySearch في كل خطوة من خطوات الدالة mergeSort، ولكننا سنحافظ في هذه الحالة على كلا النصفين طوال فترة التنفيذ، ثم نطبّق الخوارزمية عوديًا في كل نصف، كما نطبّق عملية الدمج merge على النتيجة التي تستغرق وقتًا مقداره Θ( n ) بعد أن تعيد الخوارزمية العودية. لبهذا نكون قد قسمنا المصفوفة الأصلية إلى مصفوفتين بحجم n / 2 لكل منهما، ثم دمجنا هذه المصفوفات، وهي عملية لدمج n عنصرًا وبالتالي تستغرق وقتًا (Θ (n، كما يوضح الشكل التالي هذه العملية العودية: شجرة العودية لطريقة الفرز بالدمج merge sort تمثِّل كل دائرة استدعاءً للدالة mergeSort كما يشير الرقم المكتوب في الدائرة إلى حجم المصفوفة التي يجري فرزها، إذ تكون الدائرة الزرقاء العلوية الاستدعاء الأصلي للدالة mergeSort، بحيث نحصل على فرز مصفوفة بالحجم n، كما تشير الأسهم إلى الاستدعاءات المتكررة التي تجريها الدوال فيما بينها. يعمل الاستدعاء الأصلي للدالة mergeSort على استدعائها مرتين في مصفوفتين وحجم كل منهما n / 2، حيث يشار إلى ذلك بواسطة السهمين الموجودين في الأعلى، ثم يجري كل من هذين الاستدعائَين بدورهما استدعائين خاصين بهما لدمج مصفوفتين بحجم n / 4 لكل منهما، وهكذا دواليك حتى نصل إلى مصفوفات ذات حجم 1؛ ويسمَّى هذا الرسم البياني بالشجرة العودية recursion tree، لأنه يوضح كيفية حدوث العودية ويظهر مثل شجرة، لكن الجذر root في الأعلى والأوراق في الأسفل، لذلك يظهر مثل شجرة مقلوبة. لاحظ أن العدد الإجمالي للعناصر هو n في كل مستوى من الرسم البياني أعلاه، حيث يحتوي المستوى الأول على استدعاء واحد فقط للدالة mergeSort مع مصفوفة بحجم n أي العدد الإجمالي للعناصر هو n، كما يحتوي المستوى الثاني على استدعائين للدالة mergeSort وكل منهما بحجم n / 2. لكن n / 2 + n / 2 = n وهكذا يكون العدد الإجمالي للعناصر هو n في هذا المستوى، كما توجد 4 استدعاءات في المستوى الثالث، بحيث يُطبَّق كل استدعاء على مصفوفة بحجم n / 4، أي سيساوي عدد العناصر الإجمالي n / 4 + n / 4 + n / 4 + n / 4 = 4n / 4 = n، وبالتالي نحصل على n عنصر. يجب على المستدعي في كل مستوى من هذا الرسم البياني إجراء عملية دمج merge على العناصر التي يعيدها المستدعَى، إذ يجب على الدائرة المشار إليها باللون الأحمر مثلًا، ترتيب عدد n / 2 من العناصر، وذلك بتقسيم المصفوفة ذات الحجم n / 2 إلى مصفوفتين بحجم n / 4، ثم تُستدعَى الدالة mergeSort عوديًا لفرز تلك المصفوفة، ثم تُدمَجان معًا، ويُشار إلى هذه الاستدعاءات بالدوائر ذات اللون الأخضر. تحتاج عملية الدمج إلى دمج n / 2 عنصر في كل مستوى من الشجرة، ويكون العدد الإجمالي للعناصر المدموجة هو n. حيث تدمج الدالة في ذلك المستوى n / 2 عنصر، ويجب على الدالة الموجودة على يمينها -ذات اللون الأزرق- دمج n / 2 عنصرأيضًا، وبالتالي ينتج عدد العناصر الإجمالي التي يجب دمجها في هذا المستوى . تعقيد كل مستوى هو Θ( n )، كما يكون عدد المستويات في هذا الرسم البياني، والذي يُطلق عليه أيضًا عمق depth شجرة العودية مساويًا لـ log( n )، وسبب ذلك هو السبب ذاته تمامًا الذي استخدمناه عند تحليل تعقيد البحث الثنائي. لدينا log( n ) مستوى وتعقيد كل مستوى هو Θ( n )، وبالتالي، يكون تعقيد الدالة mergeSort هو Θ(n * log( n ))، وهذا أفضل بكثير من Θ( n2 ) الذي هو تعقيد خوارزمية الفرز الانتقائي -تذكر أنّ log( n ) أصغر بكثير من n، وبالتالي يكون n * log (n) أصغر بكثير من n * n = n2-، وإذا وجدت ذلك معقدًا، فلا تقلق لأن الأمر ليس سهلًا في المرة الأولى. يسمح لنا تحليل التعقيد بمقارنة الخوارزميات لمعرفة أيها أفضل كما رأيت في هذا المثال الأخير، ويمكننا الآن أن نكون على يقينٍ تام من تفوّق خوارزمية الفرز بالدمج على خوارزمية الفرز الانتقائي للمصفوفات الكبيرة، كما سيكون استخلاص هذا الاستنتاج صعبًا إذا لم تملك الخلفية النظرية لتحليل الخوارزمية. تُستخدَم خوارزميات الفرز التي لها وقت تشغيل Θ( n * log( n ) )عمليًا، إذ تستخدم نواة نظام لينكس مثلًا، خوارزمية فرز تسمى heapsort، والتي لها وقت تشغيل مماثل لخوارزمية الفرز بالدمج mergesort الذي أوجدناه للتو، والذي هو Θ( n log( n ) )، لذلك فهو الأمثل. لاحظ أننا لم نثبت أن خوارزميات الفرز هذه هي الأمثل، لأن ذلك يتطلب معرفةً رياضيةً أكبر، لكن كن مطمئنًا أنه لا يمكن لهذه الخوارزميات المثلى التحسن أكثر من ذلك من وجهة نظر التعقيد. يجب الآن بعد قراءة هذا المقال أن يكون حدسك الذي طورته لتحليل تعقيد الخوارزمية قادرًا على مساعدتك في تصميم برامج أسرع، ويجب عليك تركيز جهودك المثلى على الأشياء المهمة حقًا بدلًا من الأشياء الصغيرة التي لا تهمك، مما يتيح لك العمل بصورةٍ أكثر إنتاجية. كما يجب أن تكون اللغة الرياضية والتمثيل الذي طُوِّر في هذا المقال مثل صيغة Big-O مفيدَين أيضًا في التواصل مع مهندسي البرمجيات الآخرين عندما تنقاشهم بموضوع وقت تشغيل الخوارزميات. ترجمة -وبتصرف- للمقال A Gentle Introduction to Algorithm Complexity Analysis لصاحبه Dionysis "dionyziz" Zindros. اقرأ أيضًا المرجع الشامل إلى تعلم الخوارزميات للمبتدئين تعقيد الخوارزميات Algorithms Complexity ترميز Big-O في الخوارزميات خوارزمية ديكسترا Dijkstra’s Algorithm
    1 نقطة
  47. إحدى أولى المفاهيم التي يتعلمها مبرمج أنظمة يونكس هي أنّ عمل كل برنامج يبدأ بثلاث ملفات تكون مفتوحةً مسبقًا: table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } الاسم الوصفي الاسم المختصر رقم الملف الشرح مجرى الدخل القياسي stdin 0 الدخل من لوحة المفاتيح مجرى الخرج القياسي stdout 1 الخرج الظاهر على الطرفية مجرى الخطأ القياسي stderr 2 خرج رسائل الخطأ على الطرفية (ملفات يونيكس الافتراضية) يستحضر هذا إلى أذهاننا السؤال عمّا يمثله الملف المفتوح وكيفية فتحه، إذ تسمى القيمة التي يعيدها استدعاء open لفتح الملف اصطلاحًا بواصف الملف file descriptor، وهي أساسًا فهرس لمصفوفة من الملفات المفتوحة المخزَّنة في النواة. (فائدة واصفات الملفات في عملية التجريد) تُعَدّ واصفات الملفات فهرسًا لجدول واصفات الملفات تخزنه النواة، بحيث تنشئ النواة واصف ملف استجابةً لاستدعاء open وتربطه ببعض التجريد لكائن يشبه الملف سواءً كان جهازًا فعليًا أو نظام ملفات أو شيء بعيد عن هذا كل البعد، وبالتالي توجه النواة استدعاءات عمليات القراءة read والكتابة write التي تشير إلى واصف الملف ذاك إلى الموضع الصحيح لتنفذ مهمة مفيدة في النهاية. تعرض الصورة نظرةً عامةً على تجريد العتاد، وباختصار يُعَدّ واصف الملف البوابة إلى تجريدات النواة للعتاد والأجهزة الأساسية. لنبدأ من المستوى الأدنى، إذ يتطلب نظام التشغيل وجود مبرمج ينشئ تعريفًا للجهاز device driver أو برنامج تعريف حتى يتمكن من التواصل مع أحد أجهزة العتاد، ويُكتَب تعريف الجهاز هذا إلى واجهة API التي توفرها النواة بالطريقة نفسها والتي وردت في مثال المقال السابق، إذ سيوفر تعريف الجهاز مجموعة دوال تستدعيها النواة استجابةً للمتطلبات المختلفة، ويمكننا في المثال المبسَّط في الصورة السابقة رؤية أن تعريف الجهاز يوفِّر دالة القراءة read والكتابة write اللتين ستُستدعيان استجابةً للعمليات المماثلة التي تنفذ على واصف الملف، كما يعلم تعريف الجهاز كيف يحوِّل هذه الطلبات العامة إلى طلبات أو أوامر محددة لجهاز محدد. تقدم النواة واجهة-ملف file-interface لتوفير التجريد لمساحة المستخدِم عبر ما يسمى بطبقة الجهاز device layer عمومًا، إذ تمثَّل الأجهزة المادية على المضيف بملف له نظام ملفات خاص مثل dev‎/، ففي أنظمة يونكس وما يشابهها تحتوي عقد الجهاز device-nodes على ما اصطلح تسميته بالعدد الرئيسي major number والعدد الثانوي minor number، مما يتيح للنواة ربط عقد محددة بما يقابلها ببرنامج التعريف الموفر، كما يمكنك الاطلاع عليها من خلال الأمر ls كما هو موضح في المثال التالي: $ ls -l /dev/null /dev/zero /dev/tty crw-rw-rw- 1 root root 1, 3 Aug 26 13:12 /dev/null crw-rw-rw- 1 root root 5, 0 Sep 2 15:06 /dev/tty crw-rw-rw- 1 root root 1, 5 Aug 26 13:12 /dev/zero ينقلنا هذا إلى واصف الملف، وهو الأداة التي تستخدِمها مساحة المستخدِم للتواصل مع الجهاز الأساسي، وبصورة عامة ما يحدث عند فتح الملف هو أنّ النواة تستخدِم معلومات المسار لربط map واصف الملف بشيء يوفِّر واجهتّي API قراءة وكتابة وغيرهما مناسبة، فعندما تكون عملية فتح الملف open للجهاز مثل ‎/dev/sr0‎ في مثالنا السابق، فسيوفر العدد الرئيسي والثانوي لعقدة الجهاز المفتوح المعلومات التي تحتاجها النواة للعثور على تعريف الجهاز الصحيح وإتمام عملية الربط mapping، كما ستعلم النواة بعد ذلك كيف توجه الاستدعاءات اللاحقة مثل القراءة read إلى الدوال الأساسية التي يوفرها تعريف الجهاز. يعمل الملف غير المرتبط بجهاز non-device file بآلية مشابهة، على الرغم من وجود طبقات أكثر خلال العملية، فالتجريد هنا هو نقطة الوصل أو الربط mount point، وكما تملك عملية توصيل نظام الملفات file system mounting غايةً مزدوجةً تتمثل في إعداد عملية الربط mapping، بحيث يتعرف نظام الملفات على الجهاز الأساسي الذي يوفِّر التخزين وتعلم النواة أنّ الملفات المفتوحة في نقطة التوصيل تلك يجب أن توجَّه إلى تعريف نظام الملفات، كما تُكتَب أنظمة الملفات على واجهة API محددة لنظام الملفات العام التي توفرها النواة على غرار تعريفات الأجهزة. بالطبع الصورة الكاملة معقدة أكثر في الواقع، إذ تضم عدة طبقات أخرى، فتبذل النواة على سبيل المثال جهدًا كبيرًا لتخزين cache أكبر قدر ممكن من البيانات الواردة من الأقراص في الذاكرة الخالية، ويقدِّم هذا العديد من الميزات التي تحسِّن السرعة، كما تحاول النواة تنظيم الوصول إلى الجهاز بأكثر طريقة فعالة وممكنة مثل محاولة طلب الوصول إلى القرص للتأكد من أن البيانات المخزَّنة فيزيائيًا بالقرب من بعضها ستستعاد معًا حتى لو لم ترد الطلبات بترتيب تسلسلي، بالإضافة إلى انتماء العديد من الأجهزة إلى فئة أعم مثل أجهزة USB أو SCSI التي توفِّر طبقات التجريد الخاصة بها للكتابة عليها، وبالتالي ستمر أنظمة الملفات في هذه الطبقات المتعددة بدلًا من الكتابة مباشرةً على الأجهزة، أي يكون فهم النواة هو فهم كيفية ترابط واجهات API المتعددة تلك وتواجدها مع بعضها. الصدفة Shell تُعَدّ الصدفة بوابة التفاعل مع نظام التشغيل سواءً كانت باش bash أو zsh أو csh أو أيّ نوع من أنواع الأصداف الأخرى العديدة، إذ تشترك جميعها أساسًا في مهمة رئيسية واحدة فقط، وهي أنها تتيح لك تنفيذ البرامج، كما ستبدأ بفهم آلية تنفيذ الصدفة لهذه المهمة فعليًا عندما سنتحدث لاحقًا عن بعض العناصر الداخلية لنظام التشغيل. لكن الأصداف قادرة على تنفيذ مهام أكبر بكثير من مجرد إتاحة تنفيذ برنامج، إذ تتميز بقدرات قوية لإعادة توجيه الملفات، وتتيح لك تنفيذ عدة برامج في الوقت نفسه وكتابة نصوص برمجية تبني برامج متكاملة، وهذا كله يعيدنا إلى مقولة كل شيء هو عبارة عن ملف. إعادة التوجيه Redirection لا نريد في معظم الأحيان أن تشير واصفات الملفات القياسية التي تحدثنا عنها في بداية المقال إلى مواضع محددة افتراضيًا، فقد ترغب مثلًا في تسجيل كامل خرج البرنامج على ملف تحدده على القرص أو في جعله يتلقى أوامره من ملف أعددته مسبقًا، وقد ترغب في تمرير خرج برنامج ليكون دخل برنامج آخر، إذ تيسّر الصدفة ذلك وأكثر بالعمل مع نظام التشغيل. الاسم الأمر الوصف مثال إعادة التوجيه إلى ملف filename < أخذ كامل الخرج الناتج عن Standard Out وتسجيله في الملف filename (استبدل filename باسم الملف). ملاحظة: استخدم << لتُلحق الخرج بنهاية محتوى الملف بدلًا من استبدال محتواه ls > filename القراءة من ملف filename > نسخ كافة البيانات من الملف إلى دخل البرنامج القياسي standard input echo < filename التمرير Pipe program1 | program2 أخذ كامل خرج standard out البرنامج الأول program1 وتمريره إلى دخل standard input البرنامج الثاني program2 ls | more تنفيذ عملية التمرير pipe يُعَدّ تنفيذ الأمر ls | more مثالًا آخرَ على قدرة التجريد، فما يحدث هنا بصورة أساسية هو أنه بدلًا من ربط واصف الملف لمجرى الخرج القياسي بإحدى الأجهزة الأساسية مثل الطرفية لعرض الخرج عليها، يوجَّه الواصف إلى مخزن مؤقت buffer في الذاكرة توفِّره النواة ويطلق عليه عادةً الأنبوب pipe، والمميز هنا هو إمكانية عملية أخرى أن تربط دخلها القياسي standard input بالجانب الآخر من المخزن المؤقت ذاته buffer وتستحوذ على خرج العملية الأخرى بفعالية كما هو موضَّح في الصورة التالية: (الأنبوب) الأنبوب هو مخزن مؤقت في الذاكرة يربط عمليتين معًا، وتشير واصفات الملف إلى كائن الأنبوب الذي يخزن البيانات المرسلة إليه من خلال عملية الكتابة ليصرِّفها من خلال عملية القراءة. تخزِّن النواة عمليات الكتابة في الأنبوب حتى تصرّف عملية قراءة مقابلة من الجانب الآخر للمخزن المؤقت، وهذا مفهوم قوي جدًا وهو أحد الأشكال الأساسية للتواصل بين العمليات inter-process communication -أو IPC اختصارًا- في أنظمة يونكس وما يشابهها، كما لا تقتصر عملية التمرير على نقل البيانات، إذ يمكن أن تؤدي دور قناة إشارات signaling channel، فإذا قرأت إحدى العمليات أنبوبًا فارغًا، فستعطله أو تجمده block افتراضيًا أو تضعه في حالة سبات hibernation إلى حين توفر بعض البيانات، وسنتعمق في هذا أكثر في مقال لاحق من هذه السلسلة، وبالتالي قد تستخدِم عمليتان أنبوبًا للإبلاغ عن اتخاذ إجراء ما عن طريق كتابة بايت واحد من البيانات، فبدلًا من أن تكون البيانات الفعلية مهمةً، فإن مجرد وجود أية بيانات في الأنبوب يمكن أن تشير إلى رسالة، فلنفترض مثلًا أنّ إحدى العمليات تطلب طباعة عملية أخرى لملف وهو أمر سيستغرق بعض الوقت، لذا قد تُعِدّ العمليتان أنبوبًا بينهما بحيث تقرأ العملية التي أرسلت الطلب الأنبوب الفارغ، وبما أنه فارغ، فسيعطّل هذا الاستدعاء وتبطِل العملية، لكن بمجرد الانتهاء من الطباعة، ستكتب العملية الأخرى رسالةً في الأنبوب ويؤدي ذلك إلى إيقاظ العملية التي أرسلت الطلب بصورة فعالة وإرسال إشارة تدل على انتهاء العمل. ينبثق عن السماح للعمليات بتمرير البيانات بين بعضها بهذه الطريقة مصطلح شائع آخر في يونكس للأدوات الصغيرة التي تنفذ أمرًا معينًا، ويضفي تسلسل هذه الأدوات الصغيرة مرونةً لا تستطيع أداة موحَّدة إضفاءها في معظم الأحيان. ترجمة -وبتصرُّف- لقسم من الفصل Chapter 1. General Unix and Advanced C من كتاب Computer Science from the Bottom Up. اقرأ أيضًا المقال التالي: تعرف على نظام العد الثنائي Binary أساس الحوسبة المقال السابق: مفهوم التجريد abstraction في أنظمة التشغيل وأهميته للمبرمجين التجريد (Abstraction) والواجهات (Interfaces) والسمات (Traits) في PHP النسخة العربية الكاملة لكتاب: أنظمة التشغيل للمبرمجين
    1 نقطة
  48. إن كنت مطور ويب أو أحد المهتمين بتطوير الأنظمة المعلوماتية المختلفة في بيئة الويب، فإنك تعلم حجم التنوع الكبير للغات البرمجة المستخدمة في تطوير مواقع الويب وخدماته، ولربما كنت أحد مطوري هذه الخدمات وترغب بأن تكون خدماتك سريعة الانتشار وسهلة الاستخدام من قبل التطبيقات المختلفة ، وكما تعلم فإن كثرة لغات البرمجة المستخدمة في تطوير خدمات الويب تجعل من الصعب التواصل والتكامل بين هذه التطبيقات. إن المصطلح REST وهو اختصار لـ Representational state transfer يعبر عن المعمارية المستخدمة في تطوير خدمات الويب، التي تهدف إلى وضع معايير تضبط إدارة موارد الأنظمة resources وتحدد كيفية عنونتها ونقلها عبر بروتوكل HTTP إلى طيف واسع من التطبيقات المختلفة بغض النظر عن لغات البرمجة التي طورت بها تلك التطبيقات، وتعد معمارية REST أكثر معماريات تصميم الويب هيمنة خلال السنوات الماضية وذلك لسهولة استخدامها والتعامل معها. بعد التعرف على RESTful ستكون قادر على الانطلاق لتصميم الخدمة الخاصة بك دون القلق بشأن من سيستخدم الخدمة الخاصة بك.
    1 نقطة
  49. اللغات المصرفة (Compiled) واللغات المفسرة (Interpreted) تندرج لغات البرمجة تحت صنفين اثنين: إما مُصرَّفة (compiled) أو مُفسَّرة (interpreted)، فيعني المصطلح لغة مُصرَّفة (compiled) ترجمة البرامج إلى لغة الآلة (machine language) لينفذها العتاد (hardware)، أما مصطلح لغة مُفسَّرة (interpreted) فيعني وجود برنامج يدعى «المفسِّر» (interpreter) يقرأ البرامج وينفذها مباشرةً وآنيًا . تُعَد لغة البرمجة C على سبيل المثال لغة مُصرَّفة (compiled) عادًة، بينما تُعَد لغة Python لغة مُفسَّرة (interpreted)، لكنّ التمييز بين المصطلحين غير واضح دائمًا حيث: أولًا يمكن للغات البرمجة المُفسَّرة أن تكون مُصرَّفة والعكس صحيح، فلغة C مثلًا هي لغة مصرَّفة ولكن يوجد مفسِرات لها تجعلها لغة مفسَّرةً أيضًا والأمر مماثل للغة Python المفسَّرة التي يمكن أن تكون مصرَّفة أيضًا. ثانيًا توجد لغات برمجة، جافا (Java) مثلًا، تستخدم نهجًا هجينًا (hybrid approach) يجمع بين التصريف والتفسير، حيث يبدأ هذا النهج بترجمة البرنامج إلى لغة وسيطة (intermediate language) عبر مصرِّف ثم تنفيذ البرنامج عبر مُفسِّر. تَستخدم لغة Java لغةً وسيطةً (intermediate language) تُدعى جافا بايتكود Java bytecode شبيهة بلغة الآلة، لكنها تُنفَّذ باستخدام مُفسِّر برمجيات يدعى بآلة جافا الافتراضية (Java virtual machine وتختصر إلى JVM). وسم لغة البرمجة بكونها لغة مفسَّرة أو مصرَّفة لا يكسبها خاصية جوهرية، على كل حال توجد اختلافات عامة بين اللغتين المُصرَّفة والمُفسَّرة. الأنواع الساكنة (Static Types) تدعم العديد من اللغات المُفسَّرة الأنواع الديناميكية (Dynamic Types)، وتقتصر اللغات المُصرَّفة على الأنواع الساكنة (Static Types). فيمكن في اللغات ساكنة النوع معرفة أنواع المتغيرات بمجرّد قراءة شيفرة البرنامج أي تكون أنواع المتغيرات محدَّدة قبل تنفيذ البرنامج، بينما تكون أنواع المتغيرات في اللغات التي توصف بأنها ديناميكية النوع غير معروفة قبل التنفيذ وتحدد وقت تنفيذ البرنامج. ويشير مصطلح ساكن (Static) إلى الأشياء التي تحدث في وقت التصريف (Compile time) (أي عند تصريف شيفرة البرنامج إلى شيفرة التنفيذ)، بينما يشير مصطلح Dynamic إلى الأشياء التي تحدث في وقت التشغيل (run time) (أي عندما يُشغَّل البرنامج). يمكن كتابة الدالة التالية في لغة Python على سبيل المثال: def add(x, y): return x + y لا يمكن معرفة نوع المتغيرين y وx بمجرد قراءة الشيفرة السابقة حيث لا يحدَّد نوعهما حتى وقت تنفيذ البرنامج، لذلك يمكن استدعاء هذه الدالة عدة مرات بتمرير قيمة بنوع مختلف إليها في كل مرة، وستعمل عملًا صحيحًا ما دام نوع القيمة المُمرَّرة إليها مناسبًا لتطبيق عملية الجمع عليها، وإلا سترمي الدالة اعتراضًا (exception) أو خطأً وقت التشغيل. يمكن كتابة نفس الدالة السابقة في لغة البرمجة C كما يلي: int add(int x, int y) { return x + y; } يتضمّن السطر الأول من الدالة تصريحًا واضحًا وصريحًا بنوعي القيمتين التي يجب تمريرهما إلى الدالة ونوع القيمة التي تعيدها الدالة أيضًا، حيث يُصرَّح عن y وx كأعداد صحيحة (integers)، وهذا يعني أنه يمكن التحقق في وقت التصريف (compiled time) فيما إذا كان مسموحًا استخدام عامل الجمع مع النوع integer أم لا (إنه مسموح حقًا)، ويُصرَّح عن القيمة المُعادة كعدد صحيح (integer) أيضًا. وعندما تُستدعى الدالة السابقة في مكان آخر من البرنامج يستطيع المصرِّف (compiler) باستخدام التصريحات أن يتحقق من صحة نوع الوسطاء (arguments) الممررة للدالة، ومن صحة نوع القيمة التي تعيدها الدالة أيضًا. يحدث التحقق في اللغات المصرَّفة قبل بدء تنفيذ البرنامج لذلك يمكن إيجاد الأخطاء باكرًا، ويمكن إيجاد الأخطاء أيضًا في أجزاء البرنامج التي لم تُشغَّل على الإطلاق وهو الشيء الأهم. علاوًة على ذلك لا يتوجب على هذا التحقق أن يحدث في وقت التشغيل (runtime)، وهذا هو أحد الأسباب التي تجعل تنفيذ اللغات المُصرَّفة أسرع من اللغات المُفسَّرة عمومًا. يحافظ التصريح عن الأنواع في وقت التصريف (compile time) على مساحة الذاكرة في اللغات ساكنة النوع أيضًا، بينما تُخزَّن أسماء المتغيرات في الذاكرة عند تنفيذ البرنامج في اللغات ديناميكية النوع التي لا تحوي تصريحات واضحة لأنواعها وتكون أسماء هذه المتغيرات قابلة للوصول من قبل البرنامج. توجد دالة مبنيّة مسبقًا في لغة Python هي locals، تعيد هذه الدالة قاموسًا (dictionary) يتضمن أسماء المتغيرات وقيمها. ستجد تاليًا مثالًا عن مفسِّر Python: >>> x = 5 >>> print locals() {'x': 5, '__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None} يبيّن المثال السابق أنه يُخزَّن اسم المتغير في الذاكرة عند تنفيذ البرنامج (مع بعض القيم الأخرى التي تُعَد جزءًا من بيئة وقت التشغيل الافتراضية). بينما تتواجد أسماء المتغيرات في اللغات المُصرَّفة في الذاكرة في وقت التصريف (compile time) ولا تتواجد في وقت التشغيل (runtime). حيث يختار المصرّف موقعًا في الذاكرة لكل متغير ويسجل هذه المواقع كجزء من البرنامج المُصرَّف (سنتطرّق إلى مزيد من التفاصيل عن ذلك لاحقًا). يدعى موقع المتغير في الذاكرة عنوانًا (address) حيث تُخزَّن قيمة كل متغير في عنوانه، ولا تُخزَّن أسماء المتغيرات في الذاكرة على الإطلاق في وقت التشغيل (ولكن هذا شيء اختياري للمصرف فيمكن أن يضيف المصرِّف (compiler) أسماء المتغيرات إلى الذاكرة في وقت التشغيل بهدف تنقيح الأخطاء (debugging)، أي لمعرفة أماكن تواجد الأخطاء في البرنامج). عملية التصريف (The compilation process) يجب أن يفهم المبرمج فهمًا تامًا ما يحدث خلال عملية التصريف (compilation)، فإذا فُهِمت هذه العملية جيدًا سيساعد ذلك في تفسير رسائل الخطأ وتنقيح الأخطاء في الشيفرة وأيضًا في تجنُّب الزلات الشائعة. للتصريف خطوات هي: المعالجة المسبقة (Preprocessing): تتضمن لغة البرمجة C موجِّهات معالجة مسبقة (preprocessing directives) والتي تدخل حيز التنفيذ قبل تصريف البرنامج، فمثلًا يسبّب الموجِّه ‎#include إدراج شيفرة مصدرية (source code) خارجية موضع استعماله. التحليل (Parsing): يقرأ المُصرِّف (compiler) أثناء هذه الخطوة الشيفرة المصدرية (source code) ويبني تمثيلًا داخليًّا internal) (representation للبرنامج يُدعى بشجرة الصيغة المجردة (abstract syntax tree). تُسمى عادًة الأخطاء المكتشفة خلال هذه الخطوة بأخطاء صياغية (syntax errors). التحقق الساكن (Static checking): يتحقق المصرِّف من صحة نوع المتغيرات والقيم وفيما إذا اُستدعيت الدوال بعدد ونوع وسطاء صحيحين وغير ذلك من التحققات. يُدعى اكتشاف الأخطاء في هذه الخطوة أحيانًا بالأخطاء الدلالية الساكنة (static semantic errors). توليد الشيفرة (Code generation): يقرأ المصرِّف التمثيل الداخلي (internal representation) للبرنامج ويولّد شيفرة الآلة (machine code) أو الشيفرة التنفيذية (byte code) للبرنامج. الربط (Linking): إذا استخدم البرنامج قيمًا ودوالًا مُعرَّفة في مكتبة، فيجب أن يجد المُصرِّف المكتبة المناسبة وأن يُضمِّن (include) الشيفرة المطلوبة المتعلقة بتلك المكتبة. التحسين (Optimization): يحسّن المصرف دومًا خلال عملية التصريف من الشيفرة ليصبح تنفيذها أسرع أو لجعلها تستهلك مساحةً أقل من الذاكرة. معظم هذه التحسينات هي تغييرات بسيطة توفر من الوقت والمساحة، ولكن تطبِّق بعض المُصرِّفات (compilers) تحسيناتٍ أعقد. ينفذ المصرف كل خطوات التصريف ويولّد ملفًا تنفيذيًا (executable file) عند تشغيل الأداة gcc. المثال التالي هو شيفرة بلغة C: #include <stdio.h> int main() { printf("Hello World\n"); } إذا حُفِظت الشيفرة السابقة في ملف اسمه hello.c فيمكن تصريفها ثم تشغيلها كما يلي: $ gcc hello.c $ ./a.out تخزّن الأداة gcc الشيفرة القابلة للتنفيذ (executable code) في ملف يدعى افتراضيًا a.out (والذي يعني في الأصل خرج مُجمَّع (assembler output)). ينفذ السطر الثاني الملف التنفيذي، حيث تخبر البادئة ‎./‎ الصدفة (shell) لتبحث عن الملف التنفيذي في المجلّد (directory) الحالي. من الأفضل استخدام الراية ‎-o لتوفير اسم أفضل للملف التنفيذي، حيث يُعطى الملف التنفيذي الناتج بعد عملية التصريف اسمًا افتراضيًا (a.out) بدون استخدام الراية ‎-o، ولكن يُعطى اسمًا محددًا باستخدام الراية ‎-o كما يلي: $ gcc hello.c -o hello $ ./hello التعليمات المُصرَّفة (Object code) تخبر الراية ‎-c الأداة gcc بأن تصرِّف البرنامج وتولّد شيفرة الآلة (machine code) فقط، بدون أن تربط (link) البرنامج أو تولّد الملف التنفيذي. $ gcc hello.c -c النتيجة هي توليد ملف يُدعى hello.o، حيث يرمز حرف o إلى object code وهو البرنامج المُصرّف. والتعليمات المُصرَّفة (object code) غير قابلة للتنفيذ لكن يمكن ربطها بملف تنفيذي. يقرأ الأمر nm في UNIX ملف التعليمات المُصرَّفة (object file) ويولّد معلومات عن الأسماء التي يُعرِّفها ويستخدمها الملف، فمثلًا: $ nm hello.o 0000000000000000 T main U puts يشير الخرج السابق إلى أن hello.o يحدد اسم التابع الرئيسي main ويستخدم دالة تدعى puts، والتي تشير إلى (put string). وتطّبق gcc تحسينًا (optimization) عن طريق استبدال printf (وهي دالة كبيرة ومعقدة) بالدالة puts البسيطة نسبيًا. يمكن التحكم بمقدار التحسين الذي تقوم به gcc مع الراية ‎-O، حيث تقوم gcc بإجراء تحسينات قليلة جدًا افتراضيًا مما يجعل تنقيح الأخطاء (debugging) أسهل. بينما يفعّل الخيار ‎-O1 التحسينات الأكثر شيوعًا وأمانًا، وإذا استخدمنا مستويات أعلى (أي O2 وما بعده) فستفعِّل تحسينات إضافية، ولكنها تستغرق وقت تصريف أكبر. لا ينبغي أن يغير التحسين من سلوك البرنامج من الناحية النظرية بخلاف تسريعه، ولكن إذا كان البرنامج يحتوي خللًا دقيقًا (subtle bug) فيمكن أن تحمي عملية التحسين أثره أو تزيل عملية التحسين هذا الخلل. إيقاف التحسين فكرة جيدة أثناء مرحلة التطوير عادةً، وبمجرد أن يعمل البرنامج ويجتاز الاختبارات المناسبة يمكن تفعيل التحسين والتأكد من أن الاختبارات ما زالت ناجحة. الشيفرة التجميعية (Assembly code) تتشابه الرايتان ‎-S و‎-c، حيث أن الراية ‎-S تخبر الأداة gcc بأن تصرف البرنامج وتولد الشيفرة التجميعية (assembly code), والتي هي بالأساس نموذج قابل للقراءة تستطيع شيفرة الآلة (machine code) قراءته. $ gcc hello.c -S ينتج ملف يدعى hello.s والذي يبدو كالتالي .file "hello.c" .section .rodata .LC0: .string "Hello World" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $.LC0, %edi call puts movl $0, %eax popq %rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3" .section .note.GNU-stack,"",@progbits تُضبَط gcc عادةً لتولد الشيفرة للآلة التي تعمل عليها، ففي حالتي، يقول المؤلف، وُلِّدت شيفرة لغة آلة لمعمارية x86 للمعالجات والتي يمكن تنفيذها على شريحة واسعة من معالجات Intel ومعالجات AMD وغيرهما وفي حال استهداف معمارية مختلفة، فستولد شيفرة أخرى مختلفة عن تلك التي تراها الآن. المعالجة المسبقة (Preprocessing) يمكن استخدام الراية ‎-E لتشغيل المعالج المُسبق (preprocessor) فقط بدون الخطوات الأخرى من عملية التصريف: $ gcc hello.c -E سينتج خرج من المعالج المسبق فقط. يحتوي المثال السابق تلقائيًا على الشيفرة المُضمَّنة (included code) المبنية مسبقًا والمتعلقة بالمكتبة stdio.h المذكورة في بداية البرنامج، وبالتالي يتضمن كل الملفات المُضمَّنة المتعلقة بتلك المكتبة، وكل الملفات الفرعية التابعة للملفات السابقة والملفات الموجودة في الملفات الفرعية أيضًا وهكذا. فعلى حاسوبي، يقول المؤلف، وصل العدد الإجمالي للشيفرة الإجمالية المضمنة إلى 800 سطر، ونظرًا أن كل برنامج C يتضمّن ملف الترويسات stdio.h تقريبًا، لذلك تُضمَّن تلك الأسطر في كل برنامج مكتوب بلغة C. وتتضمّن العديد من برامج C المكتبة stdlib.h أيضًا، وبالتالي ينتج أكثر من 1800 سطر إضافي من الشيفرة يجب تصريفها جميعًا. فهم الأخطاء (Understanding errors) أصبح فهم رسائل الخطأ أسهل بعد معرفة خطوات عملية التصريف، فمثلًا عند وجود خطأ في الموجّه ‎#include ستصل رسالة من المعالج المسبق هي: hello.c:1:20: fatal error: stdioo.h: No such file or directory compilation terminated. أما عند وجود خطأ صياغي (syntax error) متعلق بلغة البرمجة، ستصل رسالة من المُصرِّف (compiler) هي: hello.c: In function 'main': hello.c:6:1: error: expected ';' before '}' token عند استخدام دالة غير معرَّفة في المكتبات القياسية ستصل رسالة من الرابط (linker) هي: /tmp/cc7iAUbN.o: In function `main': hello.c:(.text+0xf): undefined reference to `printff' collect2: error: ld returned 1 exit status ld هو اسم رابط UNIX ويشير إلى تحميل (loading)، حيث أن التحميل هو خطوة أخرى من عملية التصريف ترتبط ارتباطًا وثيقًا بخطوة الربط (linking). تجري لغة C تحققًا سريعًا جدًا ضمن وقت التشغيل بمجرد بدء البرنامج، لذلك من المحتمل أن ترى بعضًا من أخطاء وقت التشغيل (runtime errors) فقط وليس جميعها، مثل خطأ القسمة على صفر (divide by zero)، أو تطبيق عملية عدد عشري غير مسموحة وبالتالي الحصول على اعتراض عدد عشري (Floating point exception)، أو الحصول على خطأ تجزئة (Segmentation fault) عند محاولة قراءة أو كتابة موقع غير صحيح في الذاكرة. ترجمة -وبتصرّف- للفصل Compilation من كتاب Think OS A Brief Introduction to Operating Systems
    1 نقطة
  50. عادة ما يرتكب القادم الجديد إلى عالم HTML5 أخطاء عديدة ترجع إما لعدم فهمه للعناصر الجديدة أو الإفراط في استخدامها مكان العناصر القديمة. سنحاول في هذا المقال تسليط الضوء على أكثر الأخطاء شيوعا وكيفية تجنب الوقوع فيها. لا تستخدم <section> كأداة للتغليف بدل <div>أحد أكثر الأخطاء شيوعا هو الاستبدال المفرط لكل عناصر <div> بعناصر <section> في شفرات HTML5 وخاصة لما يتعلق الأمر بعناصر <div> المستخدمة لأغراض تنسيقية styling. سابقا لدى استخدامنا لـ XHTML و HTML4 كنا نكتب الشفرات على النحو التالي: <!-- HTML 4-style code --> <div id="wrapper"> <div id="header"> <h1>My super duper page</h1> <!-- Header content --> </div> <div id="main"> <!-- Page content --> </div> <div id="secondary"> <!-- Secondary content --> </div> <div id="footer"> <!-- Footer content --> </div> </div>بعض ظهور HTML5 أصبح العديد يكتبونها على النحو التالي: <!-- Don’t copy this code! It’s wrong! --> <section id="wrapper"> <header> <h1>My super duper page</h1> <!-- Header content --> </header> <section id="main"> <!-- Page content --> </section> <section id="secondary"> <!-- Secondary content --> </section> <footer> <!-- Footer content --> </footer> </section>وهو أمر خاطئ لأنه وبكل بساطة لا يعتبر عنصر <section> أداة تغليف wrapper، حيث أنه يتم استخدام هذا العنصر مع الأجزاء الدلالية للصفحة لبناء مخطط واضح المعالم لها، كما أنه من الواجب أن يحتوي على ترويسة heading. إن كان كل ما ترغب في القيام به هو إضافة نمط style لصفحتك فحاول أن تنفذه مباشرة على عنصر <body> ، أما لو احتجت عناصر إضافية للنمط الذي تود تنفيذه فعليك استخدام <div> في هذه الحالة وهو العنصر الأنسب لما يكون كل ما تحتاجه هو أداة لتنفيذ الأنماط. بناء على ما سبق ذكره فإن الطريقة الصحيحة لكتابة الشفرة السابقة باستخدام HTML5 وبعض وظائف ARIA (ملاحظة: قد تحتاج إلى عنصر <div> واحد فقط بناء على التصميم الذي ترغب فيه) هو على النحو التالي: <body> <header> <h1>My super duper page</h1> <!-- Header content --> </header> <div role="main"> <!-- Page content --> </div> <aside role="complementary"> <!-- Secondary content --> </aside> <footer> <!-- Footer content --> </footer> </body>إذا لم تكت تعلم ما هي العناصر التي يجب عليك استخدامها فيُمكنك الاستعانة بالصورة التالية التي ستسهل عليك الاختيار لا تستخدم عنصر header ما لم يكن هناك حاجة إليهملاحظة: في المقال الأصلي تم الحديث عن عنصري header و hgroup، وبما أنه تم التخلص من هذا الأخير من مواصفات HTML5 فلم أقم بتضمينه في الترجمة. لا توجد أية معنى لإضافة عناصر إضافية إلى صفحتك ما لم يكن هناك حاجة لها، لكن رغم ذلك عادة ما نلحظ استخدام عنصر <header> لما لا تكون هناك أية حاجة إلى استخدامه. يُمكنك معرفة كيفية استخدام هذا العنصر بقراءتك لهذا المقال والذي يُمكن تلخيصه في أن العنصر <header> يلعب دور عنصر مساعد أو مقدم لمحتوى الجزء الذي يحتويه. وبما أنه يُمكن استخدام عنصر <header> أكثر من مرة واحدة في نفس الصفحة فإنه عادة ما تتم إساءة استخدامه على النحو التالي: <!-- Don’t copy this code! No need for header here --> <article> <header> <h1>My best blog post</h1> </header> <!-- Article content --> </article>إن كان عنصر header الذي تستخدمه لا يحتوي سوى على عنصر رأسي heading element واحد فمن الأفضل تجنب استخدامه، حيث أن عنصر article سيضمن تضمين هذا العنصر الرأسي في مُخطط الصفحة document outline. وبما أنه سيحتوي عنصرا واحدا فقط (عكس ما تشير إليه مواصفات العنصر) فإنه من الأفضل كتابة الشفرة بشكل مبسط على النحو التالي: <article> <h1>My best blog post</h1> <!-- Article content --> </article>لا تُغلف كل قوائم الروابط باستخدام navلم يعد من السهل -مع كل العناصر الجديدة التي تمت إضافتها إلى HTML5- اختيار العنصر الأنسب لكثرة الاختيارات المتاحة، لكنه في المقابل لا يجب علينا أن نُفرط في استخدام العناصر الدلالية الجديدة وهو أمر عادة ما نلاحظه مع العنصر nav والذي تنص مواصفاته على التالي: يُمثل عنصر nav قسما من الصفحة تقوم بالربط إلى صفحات أخرى أو إلى أجزاء أخرى من نفس الصفحة. ملاحظة: لا يجب أن تكون كل مجموعات الروابط داخل عناصر <div>، يجب اقتصار استعمال هذا العنصر على كتل التصفح Navigation blocks الرئيسية فقط. فعلى سبيل المثال عادة ما يحتوي أسفل الصفحات footers على قوائم قصيرة لروابط لمختلف صفحات الموقع مثل قواعد استخدام المواقع، صفحة البداية وصفحة حقوق الملكية الفكرية. في مثل هذه الحالات يكفي استخدام عنصر footer لكنه يبقى استخدام عنصر nav ممكنا رغم أنه غير ضروري. WHATWG HTML spec الكلمة المفتاحية في هذه المواصفات هي "الرئيسية"، قد نختلف فيما تعنيه هذه الكلمة على وجه التحديد، لكنه عادة ما يُقصد بها: روابط تصفح الموقع الرئيسيةمحرك بحث الموقعروابط تصفح الموقع الثانويةروابط التنقل داخل الصفحة الواحدة (خاصة في الصفحات والمقالات الطويلة).بالرغم من أنه يصعب تمييز الصحيح من الخطأ في الكثير من الحالات إلا أنه يبدو بأنه من الأفضل تجنب استخدام nav في الحالات التالية: ترقيم الصفحاتالروابط الاجتماعية (قد يكون لهذا الأمر استثناءات خاصة إذا ما كانت هذه الروابط جزءا أساسيا في الصفحة مثلما هو الحال مع موقعي about me و flavours)الوسوم أو التصنيفات في التدويناتالروابط الثانويةأسفل الصفحات (footers)إن لم تعرف ما إذا كان بإمكانك استخدام عنصر nav اسأل نفسك، هل الروابط التي تنوي تغليفها داخل عنصر nav هي وسيلة أساسية للانتقال داخل الصفحة أو داخل الموقع؟ يمكنك الاستعانة بالنقطتين التاليتين للإجابة على هذا السؤال: لا تستخدم nav ما لم تعتقد بأنه يُمكن استبدال الأمر بعنصر <section> باستخدام عنصر hxهل كنت ستضيف عنصر "اذهب مباشرة إلى" للوصول إليها لتحسين قابلية وصول الموقع؟إن كانت إجابتك بالنفي فإنه من الأجدر بك عدم استخدام عنصر nav. أخطاء شائعة مع عنصر figureليس من السهل إتقان استخدام عنصر figure (وعنصر figcaption الذي يلازمه). إليكم بعض الأخطاء الشائعة التي يقع الكثيرون لدى استعمالهما. لا تستعمل figure مع جميع الصوركما سبق وأن أشرنا إليه ، لا توجد أية فائدة من كتابة شفرات إضافية ما لم يكن هناك داع لها، وهو نفس الأمر الذي يتكرر مع هذا العنصر أيضا. هناك من يقوم بتحويل جميع الصور إلى figure رغم أننا في غنى عن تغليف كل صورة في هذا العنصر، كلما تقوم به لدي قيامك بهذا الأمر هو إضافة شفرات إضافية لا تقدم أية إضافة للصفحة. تحدد مواصفات HTML5 عنصر figure على النحو التالي: بعبارة أخرى figure عبارة عن محتوى قائم بذاته يحتوي وصفا يتم إضافته إلى محتوى الصفحة رغم أنه ليس جزءا أساسيا فيها. وهنا يبرز جمال عنصر figure حيث أنه بالإمكان تغيير مكانه في الصفحة إلى القائمة الجانبية sidebar مثلا دون الإخلال بمحتوى الصفحة. إن كان ما تحاول وضعه داخل figure عبارة عن محتوى جمالي فقط لا يقدم أية إضافة للمحتوى، وإن لم يكن بالإمكان الإشارة إليه في محتوى صفحتك فإنه من المحتمل جدا أن لا يكون العنصر الواجب استخدامه هو figure. يُمكنك أيضا أن تسأل نفسك "هل هذه الصورة (أو غيرها) أساسية لفهم محتوى الصفحة" إن لم يكن جوابك بالإيجاب فقد لا يكون figure هو العنصر الأنسب لك (فكر في استخدام aside حينها). أما لو أجبت بالإيجاب فاسأل نفسك "هل يمكنني تغيير مكان هذه الصورة إلى ملف ملحق appendix ؟" إن كانت إجابتك بالنفي هنا أيضا فقد لا يكون عنصر figure هو الأنسب لك أيضا. لا تستخدم figure مع شعار موقعكلا يصح أيضا استخدام figure مع شعارات المواقع أيضا. عادة ما نشاهد مثل هذه الشفرات الخاطئة في بعض المواقع: <!—Don't copy this code! It's wrong! --> <header> <h1> <figure> <img src="/img/mylogo.png" alt="My company" /> </figure> My company name </h1> </header> <!—Don't copy this code! It's wrong! --> <header> <figure> <img src="/img/mylogo.png" alt="My company" /> </figure> </header>ليس لدينا ما نقوله هنا سوى أن استخدام figure للشعارات هو استخدام خاطئ. يجب عليك تجنب استخدام figure ما لم تتم الإشارة إلى المحتوى المراد تغليفه في هذا العنصر داخل الصفحة. وبما أنه من السهل أن نجزم بأنه لن تتم الإشارة إلى شعار موقعك في أي جزء من أجزاء صفحتك، فإن كل ما تحتاجه هو: <header> <h1>My company name</h1> <!-- More stuff in here --> </header>لا يقتصر استخدام figure على الصور فقطالاعتقاد السائد هو أن استخدام عنصر figure يقتصر على الصور فقط وهو اعتقاد خاطئ حيث أنه من المُمكن استخدام figure مع الفيديوهات، الملفات الصوتية، الرسوم البيانية (على هيأة SVG مثلا)، الاقتباسات، الجداول، الشفرات المصدرية وغيرها. يعني أي محتوى يساعد على فهم المحتوى الرئيسي للصفحة وإعطاء تفاصيل إضافية حوله يصلح أن يكون داخل عنصر figure. يُمكن معرفة المزيد حول عنصر figure بقراءتك لهذا المقال. استخدام خاصية type غير الضروريةاستخدام خاصية type شائعة جدا ما بين المبرمجين، رغم أنه ليس خطأ في حد ذاته، إلا أنه من الأفضل تجنبه. ليس من الضروري لدى استخدام HTML5 التصريح بنوع عنصري script و style. قد لا يكون من السهل التخلص من الأمر خاصة إن كان إضافة هذه الخاصية يتم بشكل آلي خاصة لدى استخدام أنظمة إدارة المحتوى إلا أنه لا توجد أية حاجة ماسة لاستخدامها لما تقوم بكتابة كامل شفرة تطبيقك بشكل يدوي لأنه وبكل بساطة تتوقع جميع المتصفحات أن تكون السكربتات التي تستخدمها من نوع javascript وكل الأنماط من نوع css، وعليه فإنك لن تحتاج إلى كتابة التالي: <!-- Don’t copy this code! It’s attribute overload! --> <link type="text/css" rel="stylesheet" href="css/styles.css" /> <script type="text/javascript" src="js/scripts.js"></script>بل كل ما تحتاجه هو <link rel="stylesheet" href="css/styles.css" /> <script src="js/scripts.js"></script>كما أننا لم نعد في حاجة إلى كتابة الكثير للإشارة إلى نوعية الترميز المستخدم في الصفحة character set إضافة إلى أمور أخرى لم يعد هناك حاجة إليها ستجدها مشروحة بشكل مفصل في هذا المقال. استخدامات خاطئة لبعض خصائص النماذجكما سبق وأن أشرنا إليه، يوفر HTML5 خصائص عديدة للنماذج، ويرافق استخدام هذه الخصائص أخطاء يجب تجنبها: الخصائص المنطقيةالعديد من الخصائص الجديدة في نماذج HTML5 هي خصائص منطقية، ونعني بذلك بأنه تتم إضافة سلوك معين للنموذج أو لعنصر ما بمجرد إضافة هذا العنصر إليه، ومن بين هذه الخصائص المنطقية نجد كلا من autofocus، autocomplete و required. قد لا يكون هذه المشكل كثير الشيوع، إلا أن هناك من يستخدم هذه الخصائص المنطقية (عنصر required مثلا) على النحو التالي: <!-- Don’t copy this code! It’s wrong! --> <input type="email" name="email" required="true" /> <!-- Another bad example --> <input type="email" name="email" required="1" />لكن ماذا لو أردت "العبث" بالشفرة السابقة قليلا وأعطيت قيمة false لخاصية required، ما الذي تتوقع أن يقوم به المتصفح في هذه الحالة؟ <!-- Don’t copy this code! It’s wrong! --> <input type="email" name="email" required="false" />على غير ما تتوقع فإن المتصفح وبمجرد أن يلاحظ وجود خاصية required فإنه يقوم بجعل العنصر الذي تمت إضافته إليه ضروريا رغم أنك أعطيت الخاصية قيمة false. هناك 3 صيغ لاستخدام الخصائص المنطقية مع HTML5 (يتم استخدام الصيغتين الثانية والثالثة مع XHTML): required required="" required="required"وأفضل طريقة لكتابة الشفرة السابقة هي على النحو التالي: <input type="email" name="email" required />خلاصةاستعرضنا في هذا المقال بعضا من الأخطاء الأكثر شيوعا مع HTML5. بطبيعة الحال فإنه يستحيل حصر كل هذه الأخطاء، وبالتالي إن كانت هناك أخطاء أخرى سبق وأن شاهدتها أكثر من مرة فلا تتردد في مشاركتها معنا في التعليقات. ترجمة -وبتصرف- للمقال Avoiding common HTML5 mistakes لصاحبه Richard Clark
    1 نقطة
×
×
  • أضف...