تفتقر معظم منشورات المحتوى العربيّ لوجود دليل إرشاديّ جامع ومانع يبيّن المسار الذي ينبغي أن يسلكه المرء للمضي قدمًا نحو فضاء البرمجة إلى جانب العديد من اﻷسئلة التي تثير حيرة المبتدئ والتي قد تجعله يتعثّر في منتصف الطريق، لذلك إذا كنت حديث العهد (أو غير ذلك) بعالم البرمجة وقد وقعت عيناك على هذه المقالة فأنا أعِدك بأنها ستسدّ رمق جوعك، وستمنحك استفادة عظيمة، ولذلك فأنا أنصحك بالاحتفاظ بها لديك ﻷن معظم ما تريده ستجده هنا. 


مدخل لتاريخ الحوسبة والبرمجة


🙷تاريخ الحوسبة بحر واسع وعملية تراكمية على مرّ السنين🙷


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


لغة اﻵلة (Machine-language)


عندما يتبادر إلى أذهان الناس مصطلح "اﻵلة" فإنهم يتذكرون ذلك النظام الرقمي الصارم والجامد القائم على اﻷلواح اﻹلكترونية والدارات الكهربية، إن اﻵلات الكهربائية -بشكل عام- تتفرّد بلغة محددة تتكلم بها، وهذه اللغة هي الصفر والواحد، فالصفر يشير للدارة المفتوحة والواحد يشير للدارة المغلقة التي يمرّ الكهرباء خلالها، وتقع لغة اﻵلة ضمن تصنيف Low-level-languages، تلك البعيدة عن لغة اﻹنسان.


إذًا كيف صُنعت البرامج اﻷولى؟



عرفتَ أن لغة اﻵلة هي أصفار وواحدات، إذًا كيف بدأت تلك الشرارة؟ لعلك تتساءل كيف كُتبت البرامج اﻷولى قديمًا في ظل غياب بيئات التطوير ولغات البرمجة، وكيف صُنعت بعض مترجمات لغات البرمجة التي نستعملها اﻵن لكتابة وتشغيل برامجنا بيسر وسهولة مقارنة بالعصر القديم، إن برامج اﻵلة ليست بالطريقة التي تظنها، فأنت لن تفتح الكود الخاص بأحد تلك البرامج وتجد مكتوبًا بداخله مجموعة من اﻷصفار والواحدات، كلّا؛ بل لغة اﻵلة ما هي إلا مجرّد جهد كهربائي لا نستطيع رؤيته. إلا أنها قابلة للتمثيل رياضيًا على الورق نظريًا باﻷصفار والواحدات، هذا يعني أن البرامج تكتب كهربائيًا (دارات كهربية وبوابات منطقية "Logic Gates").


لعلّ أول برنامج في التاريخ (كيف بدأت الحياة) كتب كهربائيًا بواسطة الكروت المثقبة (Punched Cards) كما تراها بالصورة، يرجع هذا اﻷمر إلى ما يزيد عن نيّف وستين عامًا:



وحاليًا لا تكتب البرامج المتعمّقة -إلا فيما ندر واستوجب- بهذه الطريقة ﻷنه عمل غير فعّال، وليس إلا مضيعة للوقت، بل حاليا تستخدم اﻷسمبلي (Assembly) وذلك في كتابة أنوية نظم التشغيل (OS Kernels) إلى جانب لغة البرمجة C، وفي الـ BIOS (نظام اﻹدخال واﻹخراج اﻷساسي الذي يظهر ﻷول وهلة تشغّل فيها الحاسوب)، وفي بعض الـMicro-controllers (متحكمات الهاردوير الدقيقة).


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



لغة التجميع (Assembly)



ارتأى المهندسون لتخفيف صعوبة لغة اﻵلة (Machine-code) وتقليل الوقت اللازم ﻹنتاج البرمجيات ابتكار لغة أكثر سهولة وأقرب إلى لغة البشر، حيث أنها تستعمل كلمات مفهومة إلى حدٍ ما يمكن للمتخصصين كتابتها لجعل الحاسوب ينفّذ أمرًا معينًا، هذه اللغة كانت (Assembly) وقد أحدثت نقلة نوعية كبيرة في تلك الفترة.


على الرغم من التسهيلات التي قدمتها اﻷسمبلي مقارنة بلغة اﻵلة، إلا أنها ظلّت قابعة في ظلال التصنيف Low-level-languages، إذّ أن فهمها لا زال بعيدًا عن لغة البشر.


تتمتع كلًا من لغة اﻵلة واﻷسمبلي بقدرتهما الفائقة على التحاور بشكل مباشر مع عتاد الحاسوب (Hardware) مما يجعلهما سريعتين بشكل لا يصدق مقارنة باللغات عالية المستوى (High-level-languages). عادةً ما نحتاج لهذه السرعة عندما نبني شيئًا يهمنا فيه فرق التوقيت بشكل دقيق، مثل كتابة برمجيّة للتحكم بصاروخ أو مركبة فضائية! 



اللغات عالية المستوى (High-level languages)


لكن اﻷسمبلي لم تكن تكفي، وقد كانت هي اﻷخرى غاية في الصعوبة، مما اضطر بنا إلى إنتاج لغات جديدة تكون أقرب بشدة إلى لغة اﻹنسان، لذلك انتقلنا إلى مستوىً أعلى فيما يطلق عليه حديثًا اسم "لغات البرمجة (Programming languages)" مثل C, C++, Java, PHP, Python, JavaScript, C# وغيرها المئات من لغات البرمجة. يقوم المترجم (Compiler) بترجمة الكود الذي كتبته بأحد اللغات عالية المستوى (Programming languages) إلى لغة اﻵلة (Machine-code) ليفهمه الحاسوب، ذلك أن الحاسوب لا يفهم سوى النبضات الكهربائية.



خلاصة في صورة


 تأمل الصورة التالية (ولاحظ أن كلما تعمقنا نحو اﻷسفل فإننا نهبط نحو درجات أشد وأشد من التعقيد) :





هل تعلم البرمجة يحتاج إلى رياضيات؟ 




🙷 الرياضيات تحثّك على التفكير وتقوية الدماغ🙷



لابدّ أنك وقد صُدِمت عندما قرأت هذه اللمحة الموجزة عن تاريخ الحوسبة اﻹعجازيّ والمبهر، ولعلك قلق اﻵن حيال القدرات الرياضية، دعنى اﻵن أقضي على قلقك تمامًا، تعلم البرمجة لا يحتاج إلى رياضيات متقدمة باستثناء فهم العمليات اﻷساسية واﻷولويات الحسابية، إلا أن هذا لا يمنع أن معرفتك المتقدمة بالرياضيات سوف تكون مفيدة بشكل لا يصدق في قدرتك على التفكير المنطقي وحل المشكلات، ذلك أن علم البرمجة والحاسوب عموما مبني بكامل جزئياته على الرياضيات، لذلك إن سنحت لك الفرصة لتقوية نفسك بالرياضيات فلا تتردد بذلك لكن هذا ليس إلزاميًا بقدر قدرتك على التحليل المنطقي والذي هو اﻷهم.


إلا أن هنالك بعض الميادين في الحاسوب لابدّ من وجود رياضيات متقدمة لدى متعلمها، فمثلًا مجال الذكاء الاصطناعي (AI) وتعلّم اﻵلة (ML) يحتاج إلى بعض من الرياضيات اﻹحصائية وبعض من المعرفة في التفاضل والتكامل.


هنالك العديد من المواقع التي تعلّمك الرياضيات مثل KhanAcademy و ipracticemath.


هل يجب أن أتعلم الخوارزميات وهياكل البيانات قبل تعلم البرمجة؟



هذا السؤال منتشر عبر اﻹنترنت ولكن بعض المواقع العربية قد تجيب عليه بشكل غير دقيق.


بداية فتعلمك لهياكل البيانات والخوارزميات هو أمر لا ريب فيه وآتٍ لا محالة، لكن متى؟! لابدّ أن تتعلم أساسيات أيّة لغة برمجة بالبداية، ثم عندما تفهم اﻷساسيات جيدًا يمكنك الشروع في تعلم الخوارزميات وهياكل البيانات، ولكن العكس غير صحيح، فلو أنك بدأت بتعلم الخوارزميات وهياكل البيانات قبل تعلم أساسيات البرمجة لمَا فهمت شيئًا! ﻷنهما قائمان باﻷساس على الصياغة البرمجية، إذًا يجب أن تتعلمهما بعد تعلمك أساسيات البرمجة. 


الخوارزمية (Algorithm) هي وصفة عمل البرنامج، إنها مثل وصفات الطبخ، إنها مجموعة من الخطوات المنطقية المتسلسلة للقيام بأمرٍ معين. 



أما هياكل البيانات (Data Structures) فهو أسلوب لتنظيم البيانات داخل الحاسوب، ومن أبسط اﻷمثلة عليها المصفوفات (Arrays)، فمثلًا نقوم بتعبئة أسماء الموظفين داخل مصفوفة تُخزن داخل الـ RAM أثناء عمل البرنامج ليستطيع الحاسوب أن يجري عملياتٍ عليها.



لعل أبرز موقعٍ يعلّمك الخوارزميات وهياكل البيانات هو GeeksForGeeks و codechef.


*هناك شيء مهم آخر في الخوارزميات يسمى "تحليل درجة تعقيد الخوارزمية Algorithm analysis - Time & Space Complexity، هذا العلم يجعل برامجنا أسرع وأفضل أداءً، وهذا العلم مهم جدًا لكنه ليس مطلوبًا منك وأنت في بداية الطريق، وهو يحتاج إلى قليلٍ من الرياضيات.



ماذا عن اللغة اﻹنجليزية؟




🙷اقرأ المقالات التقنيّة اﻷجنبية بكثرة🙷



لا يجب أن تكون ضليعًا في اﻹنجليزية، ولكن لا ريب في أنك تحتاج إلى إلمامٍ معقول بالعديد من المصطلحات والمعاني التي تجعلك تقف على قدميك، ذلك أن معظم المحتوى البرمجي على اﻹنترنت هو إنجليزي وجُلّ لغات البرمجة في العالم تستعمل اللغة اﻹنجليزية؛ ومع ذلك فأنا أشجّع وبشدة على ضرورة تقوية نفسك باللغة اﻹنجليزية، ﻷنك بالمستقبل سوف تتواصل مع الناس وتراهم يتكلمون بمصطلحات برمجية كثيرة، كما لا تنسَ تحسين قدراتك على الكلام والتفاعل مع اﻵخرين، لا تكن جامدًا (مهم جدًا).


لتقوية نفسك باﻹنجليزية، راجع موقع Britishcouncil وأيضا موقع BBC.



هل يجب أن أمتلك شهادة جامعية؟



🙷التعلّم الذاتي فوق كل شيء🙷



هل تعلم أن جوجل وآبل وIBM و13 شركة أخرى أعلنوا في وقتٍ سابق من عام 2018 أنهم لم يعودوا يهتمون ﻷمر الشهادات الجامعية بشأن المتقدمين لوظائف تقنية المعلومات؟! نعم. هذ المجال مختلف عن المجالات اﻷخرى، فالشهادة الجامعية فيه لم تعدّ بشيء ذهبي، وإنما الاعتماد فيه أكثر على قدرتك في التعلّم الذاتي (Self-learning).


لكن هل هذا يعني أن لا أدخل\أوقف جامعتي؟ بالطبع لا! أنا لا أقول لك أن تتمنّع عن الجامعة، فالتعليم اﻷكاديمي مفيد جدًا كذلك وسوف تتعلم فيه أشياء كثيرة جدًا، ولكن أنا أشدد على ضرورة التعليم الذاتي فهو مهم جدًا.


تذكّر أيضًا أن الجامعة ليس وظيفتها أصلًا أن تعلمك الموضة الدارجة في السوق، ذلك أن سوق تقنية المعلومات يتغيّر باستمرار وباضطراب، إنها تعلمك فقط البناء المنطقي واﻷساس النظري اللازم الذي استقرّ عليه العلم التقنيّ لسنين طوال، ذلك اﻷساس الذي يهمك والذي يرتكز عليه كل شيء وهو الذي يجعلك تكمل الطريق وتُساير موضات السوق المتقلبة.


 إذا كنت لا تستطيع دخول الجامعة ﻷسباب مادية أو أخرى، فلربما تود -في منزلك- دارسة المنهج اﻷكاديمي الذي يُدرّس في أعرق الجامعات. أودّ أن أقدّم لك منهج OSSU الذي يوفّر لك خطة كاملة من الصفر -كما في الجامعات- لتعلّم تخصص علوم الحاسوب بشكل مثالي.



التعلم الذاتي يحتاج إلى التحفيز الذاتي



🙷التعلّم الذاتي يتطلب عزمًا وإصرارًا🙷



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


مهارة البحث في جوجل



🙷صدقني؛ ليس الجميع يعرف كيف يبحث في جوجل!🙷



إن القدرة على البجث في جوجل بمهارة والقدرة على الوصول للمطلوب بكفاءة هو فنّ بحدٍ ذاته لا يتقنه الكثير من الناس! حقًا ليس الجميع لديه القدرة على صياغة استعلامه لمحرك البحث بطريقة محددة توصله لمبتغاه، نحن في عالم البرمجة نحتاج بشدة للاعتماد على محرك البحث في إيجاد حلول لمشاكلنا، لذلك يجب أن تكون محددًا ودقيقًا في صياغة استعلامك والقدرة عن التعبير حياله.


هنالك العديد من الحيل للبحث في جوجل بأفضل طريقة ممكنة، لعل أول حيلة هي الخبرة النابعة من كثرة التجربة، وأما الحيل اﻷخرى فهي تنطوي على استعمال تعابير خاصة أثناء البحث وهي مشروحة في المقالات التالية، أرجو منك أن تقرأها:


How to search on Google


Search operators


Advanced Search


Filter your search results


ولا تنسَ، عندما تريد أن تبحث عن حل لمشكلتك فابحث باﻹنجليزية لا العربية، ذلك أن معظم المحتوى البرمجي هو أجنبي وقلّما تجد حلولا بالعربية.



هل تكفي مشاهدة الفيديوهات بدون الممارسة؟ 




🙷فكما أنه لا يمكنك تعلّم القيادة بمجرد مشاهدة السائقين، فكذا أنه لا يمكنك تعلم البرمجة بمجرد مشاهدة الكاتبين🙷




دعنا نتفق أن مشاهدة الفيديوهات بدون تطبيق هي مجرّد هراء، ذلك أن المرء لا يتعلم إلا حينما يجرب الشيء ويتحسسه بيده، عندما تجرب الشيء بيدك فأنت سوف تقع في أخطاء وهذه اﻷخطاء هي سبيلك للتعلم، نحن لا نتعلم إلا بالتجربة والخطأ، لذلك إذا كنتَ تظن لوهلة أن إفراطك في مشاهدة الفيديوهات دون الاستفادة منها تطبيقيًا ما هو إلا ضياع للوقت الثمين وكالنفخ في قِربة مثقوبة.




أنا محتار؟ ماذا أتعلم؟



🙷ادرس سوق البلاد، ثم اتبع ميولك🙷




سوق تقنية المعلومات شديد الاضطراب والتقلّب بين الفينة واﻷخرى، لذلك إذا كنتً محتارًا بشأن التقنية التي تريد تعلمها فخذ بعين الاعتبار اﻷمور التالية:


وضع سوق البلد التي تقطنها، اذهب واستكشف أكثر التقنيات المشهورة لديكم.


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


لا ترهق نفسك كثيرًا بالمقارنات، ﻷن كل جماعة سوف تنحاز لما تحبه وتريده من التقنيات.



مواقع حل المشكلات (Problem solving)



🙷على الرغم من كون هذه المرحلة اختيارية، إلا أنها فائقة اﻹفادة واﻹمتاع🙷




بعد أن تتعلم لغة برمجة معينة، ابدأ بتحدي نفسك في حل المشكلات البرمجية التي يطرحها الناس كأسئلة على بعض المواقع، هذه المواقع تحتوي على الكثير من أسئلة الذكاء المثيرة وبعضٍ من الرياضيات التي يُطلب منك حلّها باستخدام أحد لغات البرمجة التي تفضّلها.


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


من المواقع المشهورة التي تطرح أسئلة المشكلات البرمجية:


Code forces


Code wars


Hacker rank


Top coder


Coder byte


Hacker earth


Exercism


Sphere Online Judge


Codility


Code fights


Project Euler


Leet code


Tech gig




اقرأ أكواد اﻵخرين



🙷لا يوجد شيء أفضل من الاطلاع على خبرات اﻵخرين🙷




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


عادة ما تجِد المشاريع التي كتبها اﻵخرون على الموقع الشهير GitHub، حيث يحتوي على عدد هائل من اﻷكواد مفتوحة المصدر التي يساهم الناس في تطويرها ومشاركتها مع اﻵخرين.


شارك في المنتديات والحلقات النقاشية



🙷التعليم مثل التعلّم، بل ربما هو أفضل منه!🙷





لا تتردد أبدًا في مساعدة الناس، كلما تعلمت شيئًا جديدًا ثم صادفت شخصًا يسأل عن جزئية تعرفها فلا تتوانى عن إجابته، ولا تتكبر على اﻵخرين، فقد كنت مثله في وقتٍ مضى، اﻷمر اﻵخر هو أن مساعدتك للناس سوف تحسب لك في ناحية العمل وتبني اسمًا لك في السوق، نحن نتعلم أكثر عندما نُعلّم الآخرين.


أشكال المساعدة مختلفة: كاﻹجابة على اﻷسئلة أو كتابة المقالات أو تسجيل الفيديوهات وما إلى ذلك.



لا تقلق بشأن المدة 


🙷طالما أنك لا تماطل، فلا تقلق بشأن شيء🙷



لمَ الجميع في عجلة من أمرهم؟! فور دخولك إلى أي مكتبة ستجد العديد من الكتب من قبيل “علم نفسك لغة Java سبعة أيام أو بضع ساعات وما إلى ذلك"، طالما أنك تهتم بالتخلص من اﻷمر في أيام أو ساعات فأنت لن تتعلم وهذا لن ينفع معك، في التأني السلامة وفي العجلة الندامة، وهو لا يعني بأي حال أن تكون مماطلا، فلا بد من الوسطيّة.


منسق البحث العلمي في شركة جوجل "بيتر نورفيج" كتَب مقالة سابقة حول هذا اﻷمر بعنوان (علّم نفسك البرمجة في 10 أعوام!)، أنصحك بقراءتها.



الشروحات الكتابية أم الفيديو؟ 


🙷بل الاثنان مكمّلان🙷





لا يمكنك أن تستغني عن واحدٍ منهما، فالفيديو يكون مفيدًا جدًا عندما تكون مبتدئًا ﻷنك تحتاج في أول الطريق أن ترى اﻷشياء بعينيك وتحسّ بها، وكذلك عندما لا تفهم جيدًا من مقال كتابي معيّن.


أما التعلم من الكتب والشروحات الكتابية فهو يصبح أشدّ فائدة من الفيديو عندما تتعمق بالمجال أكثر، ذلك أن العقل يتعلم من الكلام المكتوب أكثر من الكلام المسموع، ﻷن المقروء يُثبّت المعلومة تثبيتًا.


وكذلك فإن الكتب هي مراجع لا غنى عنها وأسهل في عملية البحث عن جزئية معينة أكثر من الفيديو، وغالبًا عندما تصبح مبرمجًا متمرسًا فإنه سوف يكون جُلّ اعتمادك على الكتب والمراجع الرسمية. 



لا تنظر للنظام على أنه كتلة واحدة



🙷فرِّق تسُد، يصبح الموضوع أسهل عندما تقسّم اﻷمور ﻷجزاء صغيرة🙷



عملية بناء البرمجيات هي فنّ مثل فنّ بناء العمارة، لا يمكنك أن تشعر بالراحة عندما تنظر للنظام على أنه كتلة واحدة، سوف يُصاب عقلك باﻹحباط ويتساءل كيف بُني مثل هذا النظام العملاق؟! الجواب بسيط وهو أن هذا النظام في يومٍ ما لم يكن إلا مجموعة من القطع الصغيرة جدًا ثم سرعان ما أصبح يتضخم ويتضخم، هكذا تجري اﻷمور بالتدريج وإن أول الغيث قطرة، فدائمًا عندما تتطلع لبناء برمجية جديدة حاول أن تُقطِّع البرمجية في عقلك وعلى الورق إلى أجزاء ووحدات مستقلة بذاتها، هكذا يكون الموضوع أيسر وأكثر تنظيمًا.


اﻷساس هو اﻷهم



🙷بدون أساسٍ متين يهوي البناء🙷



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


مكافأة النفس



🙷النفس تحتاج للاهتمام لتستطيع مواصلة المثابرة🙷




ﻷن التعلم الذاتي يحتاج إلى تحفيز ذاتي، فيجب أن تكافئ نفسك كلما وصلت إلى مرحلة معينة وشعرت نفسيًا أنك أنجزت فيها، هذا اﻷمر مفيد جدًا ومثبت علميًا، يمكنك مكافأة نفسك بالطعام أو لعب اﻷلعاب أو مشاهدة اﻷفلام.



القدرة على تأجيل المكافأة



🙷الذكاء هو القدرة على الصمود في وجه الملهيات🙷



ذكرنا باﻷعلى أن مكافأة النفس هو أمر مهم، ولكن هذه المكافأة لها وقتها ولا يجوز أن تستبقها، لقد أثبت العلماء (تجربة المارشملو) أن اﻷشخاص القادرين على تأجيل المكافأة هم اﻷشخاص الأكثر ذكاء وعلى القدر من المسؤولية والذين يمكن الاعتماد عليهم، يسمى هذا بالمتعة المؤجّلة (Delayed gratification).


تعدد المصادر سلبية وإيجابية


🙷فلا طَالَ بلح الشام ولا عنب اليمن🙷




إذا كنت تظن أن إفراطك في الاعتماد على المصادر سوف يفيدك فأنت مخطئ، لا تتشتت وابقَ على مرجع واحد وإن فتنك وأعجبك مرجع آخر، أكمل ما أنت عليه حاليًا ثم انتقل إلى مرجع جديد ولا تتقطع في منتصف الطريق.


يظن الناس أنهم عند إكثارهم بالدراسة من مصادر مبعثرة بشكل مشتت سوف يجعلهم يجنون ثمارًا من ذلك، هذا الكلام غير صحبح، كثرة المصادر هي سلبية كما أنها إيجابية، وعدم استغلالك وتوظيفك لهذه المصادر بالشكل اﻷمثل كمثل من الذي يملك العدّة اللازمة لتصميم البناء ولكنه لا يعرف كيف يستخدم هذه العدّة! هذا عوضًا عن الوقت الضائع في التنقل بين المرجع واﻵخر.


اختر شرحًا يناسبك



🙷كل فردٍ له ميوله الخاصة في التعلم🙷




من المهم أن تعرف أن المصادر على اﻹنترنت متنوعةً جدًا، وكل مُدرِّس ومصدر يشرح بطريقة مختلفة عن اﻵخر، وهذه ميزة، حيث أنك إن لم ترتح مع أسلوبٍ معين فإنه يمكنك الانتقال إلى واحد آخر.


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


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



الوثائق الرسمية فوق كل شيء



🙷أسند اﻷمر إلى أصحابه اﻷصليين🙷



حتى لو كنت تتعلم من الفيديوهات والكتب التي ألّفها اﻵخرون، احرص دائمًا على الاستعانة بالوثائق الرسمية لتقنية معيّنة، ﻷن هذه الوثائق قد ألّفها المؤلفون الرسميّون للتقنية، وهم يضيفون التحديثات باستمرار على تقنيتهم الخاصة والتي لن تجدها دائمًا في المصادر غير الرسمية، كما أن الوثائق الرسمية هي مرجع الاستشهاد اﻷول ضد أي مرجع آخر قد يُضلِّلك عن جزء معيّن.


على سبيل المثال: فإن المرجع الرسمي للغة جافا هي مواقع شركة أوراكل.



ابدأ باﻷصعب فاﻷسهل



🙷اللغات الحديثة هي مقبرة المتعلمين الجدد🙷




خذّ هذه القاعدة ولا تسمع لكلام البعض، لغات البرمجة الحديثة مثل Python وJS وغيرها هي لغات مختزلة جدًا وهي مقبرة للمبتدئين! هذا يعني أنها لن تساعدك لتفهم المنطق البرمجي بشكل كامل ﻷن الكثير من المفاهيم ستكون مختزلة ومختصرة في ثنايا اللغة دون أن تلاحظ ذلك.


يجب أن تبدأ بتعلم لغة C أو C++ بالمقام اﻷول، ثم تدرس مبادئ البرمجة الكينونية (OOP)، ثم أتّبع ذلك بتعلّم لغة JAVA (تعلّم جافا هو أمر اختياري لكنه مستحسن بشدة، ذلك أن جافا هي أفضل لغة تطبّق مفاهيم البرمجة الكينونية، كما أنها مشابهة جدًا للغة C وC++ لذلك لن تبذل جهدًا كبيرًا)، ثم تعلم الخوارزميات وهياكل البيانات ثم أكمل طريقك كيفما تشاء.



لا تخشَ المصطلحات الرنانة (buzzwords)


🙷ليس هنالك سحر، كل شيء له تفسير🙷



في كل سنة تطلّ علينا موضة المصطلحات التقنية الجديدة، وهذه المصطلحات يتم استخدامها لجعل اللفظ مُستساغًا أكثر بين عامة الناس وليضفي انطباعًا رنانًا على هذه التقنية، لذلك سُميت بالمصطلحات الرنانة، قد يتضايق البعض من هذا الاختزال الذي نراه في بعض المصطلحات ويفسره بغير ما فُسِر، لا تخشَ أبدًا من هذه المصطلحات وابحث عنها لكي تفهم مغزاها.


أعلاه تغريدة على تويتر يوضح فيها المؤلف بعض المصطلحات الرنانة في اﻵونة اﻷخيرة، فعلى سبيل المثال المصطلح "الكلاود (Cloud)" الذي شاع مؤخرًا ما هو إلا دلالة على "اﻹنترنت" أصلا!


طموح سقفه السماء



🙷علم الحاسوب لا نهاية له، ابقَ طوال عمرك تتعلم🙷




لن تتوقف عن التعلم، إذا كنتَ تظنّ أنك سوف تنتهي من إتمام تعلم تقنية معينة فأنت واهم، هذا المجال كالبحر لا ينفد ويتجدد دائمًا. إذا اخترت أن تتوقف عن التعلم فأنت تضع حدًا لطموحك ومستقبلك المهني.


قواعد البيانات


🙷بدون قاعدة بيانات تضيع البيانات في الهواء🙷




قاعدة البيانات هي المكان الذي تُخزّن فيه البيانات وعلى نحو مرتب ضمن نمط معيّن، تعلّمك لقواعد البيانات هو أمر حتميّ ولا مفرّ منه، ذلك أن الغالبية الساحقة من التطبيقات التي سوف تبنيها أو تتعامل معها بلا شك تستعين بقواعد البيانات، فمثلًَا تطبيقات المراسلة الفورية مثل Whatsapp تستخدم قواعد البيانات لتخزين رسائل المستخدمين وملفاتهم الشخصية وكل شيء تقريبًا.


وبوجهٍ عام، يوجد نوعان شائعان من قواعد البيانات في العصر الحديث:


  • أنظمة إدارة قواعد بيانات تعمل بـ SQL. (اﻷكثر شيوعًا)
  • أنظمة إدارة قواعد بيانات تعمل بـ NoSQL.
  • توجد أنظمة أخرى تعمل بتنسيقات مغايرة، لكنها غير شائعة في عصرنا هذا، مثل: Hierarchical databases, Network databases, Object-oriented databases, Graph databases.


توجد العديد من أنظمة قواعد البيانات (DBMSs)، فمثلا اﻷنظمة التي تعمل بـ SQL من اﻷمثلة عليها (MySQL, SQL-Server, PostgreSQL)، أما NoSQL فمن أمثلتها (MongoDB, Casandra) وغيرها العديد من الـDBMSs.


كل DBMS يتفوق على غيره في جزئية معيّنة، فمثلا قد تجد أحدهم يتفوق على اﻵخر في سرعة تنفيذ الاستعلام من قاعدة البيانات، وقد تجد واحدًا آخر يتفوق في قوة تحمّله للعدد الهائل من الناس الذين ينفذون الاستعلام في الوقت الواحد. إن عملية اختيار الـDBMS المناسب ترجع إلى طبيعة المشروع وليس إلى اﻷهواء والعواطف، لا أريد أن أخوض في هذا الموضوع المتشعب ها هنا، بل سأترك لك حرية البحث والتنقيب عنه.


ﻷنك في أول الطريق فلا بدّ أن تتعلم SQL بالبداية، فعدا عن كونها اﻷكثر شيوعًا فهي تتبع تركيبًا ثابتًا وستعلمك اﻷساسيات الحقيقية لقواعد البيانات العلائقية، لاحقًا يمكنك التوسع أكثر وتعلم NoSQL.



ولكن ما الفرق بين SQL وNoSQL؟


المبدأ العام الذي تقوم عليه قواعد SQL هي الطبيعة العلائقية (Relational)، هذا يعني أنها تقوم على تخزين البيانات في جداول (Tables) والعلاقات المترابطة بين تلك الجداول، هذه الجداول تحوي صفوفًا وأعمدة (Rows and Columns).



لقد صُممت SQL لتتبع مُخططًا واحدًا (Schema) لا يمكن التلاعب به ولا يمكن تجاهله، هذا يعني أن SQL صارمة ومتشددة جدًا، بمعنى أنه لا يمكننا إضافة بيانات لعمودٍ غير موجود في الجدول أصلًا، فعلى سبيل المثال لنفرض أن لديك جدول الموظفين (Employees table)، هذا الجدول يحتوي على عمود الرقم الوطني فقط (National Number)، ولكنه لا يحتوي عمودًا لاسم الموظف (Name)، اﻵن عندما تريد أن تضيف موظفًا جديدًا فإنك مجبر على الالتزام باﻷعمدة المصممة مسبقًا (الرقم الوطني) ولن تستطيع إضافة اسمٍ للموظف ﻷن عمود الاسم غير مُصمم مسبقًا أصلًا، لذلك أنت تحتاج إلى تعديل بنية الجدول وإضافة عمود الاسم.


تُشجّع SQL على مبدأ شهير يسمى الـ Normalization، وهو التقليل من تكرار البيانات قدر ما أمكن.


أما NoSQL فهي اختصار لـ Not Only SQL، هذا يعني أنها أتت مُكمّلة لـSQL لا نافية لها، مع العلم أنه يمكن الاستغناء عن SQL تمامًا إن أردت ذلك، وعمومًا: فإن NoSQL متحررة جدًا وفضفاضة ومرنة والسبب في اختراعها هو التغلب على بعض أوجه القصور المتواجدة في SQL عندما نقوم بعملية التوسع أكثر (Scalability) ونتعامل البيانات الضخمة (Big Data).


إن المبدأ الذي تقوم عليه NoSQL هو Document-oriented وهو تخزين البيانات على شكل مستندات (Documents)، هذه المستندات تُجمع داخل Collection، وهي لا تتبع تركيبة ثابتة و ولا تشجّع على مبدأ الـ Normalization وبالتالي هي لا تمانع أبدًا في تكرار البيانات.



منصات مهمة ينبغي أن تتابعها



Tutorialspoint: موقع يحتوي على دروس تقنية في كل شيء تتخيله تقريبًا


Medium: موقع يحتوي على الكثير من المواضيع المتفرقة والشروحات حول تقنيات البرمجة 


FreeCodeCamp: موقع يحتوي على عدد كبير من المواضيع لشرح أي جزئية تقنية تريدها


Qurora: موقع مشهور تشارك فيه كبار الشخصيات التقنية في الشركات للإجابة عن أسئلة الناس


Reddit: موقع يشبه السابق، ولكنه يحتوي على العديد من المجتمعات، يجب أن تشترك في مجموعة متعلقة بالبرمجة لتتابع اﻷسئلة المطروحة في هذا السياق


Mozilla MDN: يعد التوثيق الرسمي لشركة موزيلا من أفضل المواقع على اﻹطلاق في شرح تقنيات الويب


StackOverflow: أشهر موقع بين المبرمجين على اﻹطلاق لطرح المشاكل البرمجية واﻹجابة عليها وإيجاد حلول لها


Codecacademy: موقع مذهل يعلّمك البرمجة بطريقة تفاعلية تطبيقية، بحيث يجعلك تكتب اﻷكواد بنفسك ويتحقق من صحة جوابك، كلما أنهيت مستوى تنتقل إلى مستوى آخر 


Slack: موقع رائع يحتوي على مجتمعات تطويرية لكل تقنية، وتتحاور هذه المجموعات فيما بينها عن طريق المحادثات، لا بدّ أن تشترك به!


Telegram: هو تطبيق غني عن التعريف، يحتوي على  جروبات برمجية يمكنك أن تشترك فيها


Flipboard: هذا الموقع يجمع لك اﻷخبار في مكان واحد، يجب أن تقوم باختيار اهتماماتك عند تسجيل الدخول ليعرض لك اﻷخبار التقنية


GeeksForGeeks: موقع يحتوي على دروس رائعة في الخوارزميات وهياكل البيانات


Edraak: موقع عربي مشهور يقدم دورات في مجالات عدة أبرزها التقنية


W3schools: موقع مشهور لتعليم تقنيات الويب


Sitepoint: موقع يحتوي دروسا متعمقة في تقنيات الويب



مواقع الدورات الشاملة



Udemy


Udacity


Coursera


EdX


KhanAcademy


CodeAvengers


TreeHouse


Lynda


Pluralsight


MIT


Stanford




كتب ومراجع مهمة



في هذا الرابط ستجد كتبًا مجانية بلغات كثيرة في جميع المجالات التي تريدها.




يجب أن يكون StackOverflow صديقك الصدوق






ستاك-أوفر-فلو هو أشهر موقع للمبرمجين على اﻹطلاق، يحتوي على عدد هائل من اﻷسئلة التي يطرحها المبرمجون ليجدوا حلولًا لمشاكلهم من أشخاص آخرين، يمكنك أن تطرح سؤالًا فيه (لكن لا تنسَ البحث وقراءة الشروط قبل أن تضع سؤالًا) ثم سيجيبك الناس، وبوسعك أيضًا أن تجيب السائلين.


اصنع معرضًا ﻷعمالك


هذا الخطوة قد تكون مهمة جدًا، لقد أصبح أرباب العمل اليوم يركزون كثيرًا على موضوع معرض الأعمال (portfolio)، هنالك مواقع مشهورة تسمح لك بإنشاء موقع مجاني خاص بك وبوسعك عرض أعمالك فيها ليطلع عليها أرباب العمل، ومن هذه المواقع:


WordPress


Blogger


Tumblr


GitHub / GitHub Pages


Behance


مواقع العمل الحرّ (Freelancing)




🙷كنّ ذكيًا وعلى قدر المسؤولية في مواقع العمل الحرّ واحذر من المخادعين🙷





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


فيما يلي قائمة بأبرز مواقع الفريلانس المرموقة:



Freelancer


Upwork


Fiverr


Guru


Freelanced


لنتعلم بعض الـ C++ 



ولن أتعمّق فيها كثيرًا، ولكنني سوف أضعك على أول الطريق لتبدأ انطلاقتك بسرعة، ولذلك سوف أشرح لك المنطق العام (Logic) الذي تقوم عليه البرمجة، وكذلك التركيبة اللغوية (Syntax) للغة البرمجة سي بلس بلس، ولعلك تتذكر أنني أوصيتك سابقًا بضرورة تعلّم C++ في البداية وتجنب اللغات الحديثة المختزلة لئلا تتعثر في منتصف الطريق، لذلك دعنا نبدأ مع سي بلس بلس!



حول اللغة



سي بلس بلس هي لغة عالية المستوى High-level-language (وأحيانا يقال لها لغة متوسطة المستوى Middle-level-language ، ﻷنها تقع في منطقة وسطية بين اللغات المنخفضة جدًا واللغات شديدة العلوّ في المستوى مثل Python)، عموما هذا لا ينبغي أن يكون أمرًا مهمًا جدًا بالنسبة لك، على أيّة حال مخترع هذه اللغة اسمه Bjarne Stroustrup وهو عالِم حاسوب، تم تطويرها في مختبرات Bell عام 1979م وهي امتداد وتطوير للغة C ولهذا السبب سميت C++ وتسمى كذلك C with classes ﻷنها تسمح لك بتطبيق مبادئ البرمجة الكينونية (Object-Oriented-Programming) بعكس C.



تجهيز بيئة التطوير



لبدء كتابة اﻷكواد باستخدام لغة C++ يلزمك شيء اسمه IDE وهو عبارة عن محرر برمجي وبيئة تطوير متكاملة مع كومبايلر ليقوم بترجمة الكود ليفهمه الحاسوب، توجد الكثير من الـIDEs المجانية، وأنا أنصحك باستعمال CodeBlocks. لتحميل CodeBlocks لنظام ويندوز اضغط هنا.


*إذا كنتَ لا تريد حاليًا تحميل CodeBlocks فيمكنك استعمال محررات تعمل بشكل Online على اﻹنترنت مباشرة مثل موقع onlinegdb وهي تسمح لك بكتابة برامج C++ وتشغيلها بكل يسر وسهولة.

*الكومبايلر (المترجم) : هو برنامج صممه المبرمجون ليقوم بتحويل الكود المكتوب بلغة عالية المستوى إلى لغة اﻵلة التي يفمهاه الحاسوب.



الصيغة العامة (Syntax) لبرامج C++


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





#include <iostream>


using namespace std;


// main() is where program execution begins.


int main() {


   cout << "Hello World"; // prints Hello World


   return 0;


}



الكود أعلاه يقوم بطباعة الجملة Hello World ويعرضها لك على الشاشة، دعنا نقوم بتحليل ذلك الكود.



  • في السطر اﻷول نقوم عبر الكلمة include باستدعاء مكتبة مُضمّنة داخل اللغة صممها المبرمجون، اسمها iostream وهي اختصار للجملة Input-Output-Stream وهذا يعني أن هذه المكتبة تسمح لنا بإجراء عمليات اﻹدخال (مثلا المستخدم يدخل اسمه) وعمليات اﻹخراج (مثلا النظام يطبع الاسم).



*المكتبة: هي عبارة عن مجموعة من اﻷكواد الجاهزة التي طوّرها المبرمجون مسبقًا لتسهيل العمل.



  • السطر الثاني لا أريدك حاليًا أن تفهمه ﻷنه يتطلب فهم أشياء أخرى ولكن تعوّد حاليًا أن تكتبه في جميع برامجك بلغة C++.


  • السطر الرابع لدينا تعليق (Comment) وهذا التعليق يتم استخدامه فقط ﻷغراض توضيحية ولا يتم تنفيذه نهائيًا بواسطة الكومبايلر، احرص دائمًا على أن يكون كودك موثقًا بالتعليقات ليكون فهمه سهلًا بواسطة المبرمجين اﻵخرين الذين يعملون معك أو الذين سوف يتسلمون المشروع مستقبلًا. 


  • السطر الخامس لدينا دالة (Function) اسمها main، هذه الدالة يتمّ تنفيذها دائمًا عند بداية إقلاع البرنامج ولذلك فإنها اسمها يدلّ علي وظيفتها، وهي إلزامية في أي برنامج C++ لا محالة، يسبق اسم الدالة الكلمة int وهي اختصار لـ integer أي عدد صحيح، هذا يعني الدالة ترجع عددًا صحيحًا عند انتهائها من مهمتها.


  • السطر السادس لدينا جملة تقوم بطباعة Hello World على الشاشة، حيث أن الكلمة cout هي اختصار للجملة Console Output أي طباعة المخرجات على شاشة الكونسول (الشاشة السوداء)، هل تتذكر معي المكتبة iostream، حسنا من اﻷشياء التي تحتوي عليها هذه المكتبة هي جملة الطباعة cout.


  • السطر السابع: هل تتذكر معي الدالة int main في السطر الخامس؟ لقد أخبرتك أن نوع اﻹرجاع في الدالة هو عدد صحيح (int)، هذا يعني أنه وبشكل إلزامي لا بدّ أن تكتب الجملة return متبوعة بعدد صحيح (مثلا صفر) عند نهاية آخر سطر بالدالة. (توجد أنواع أخرى من اﻹرجاع التي تكتب قبل اسم الدالة مثل void التي لا ترجع شيئًا إطلاقًا والنوع float الذي يرجع عددًا عشريًا).


قد تتساءل لماذا لا نستعمل النوع void بجانب الدالة main طالما أنها لا ينبغي أن ترجع قيمة ونستغني بهذا عن كتابة return 0؟! الجواب هو أن الدالة main هي حالة استثنائية، إذّ أن بعض الكومبايلرات ترفض تشغيل الدالة ما لم تقم بجعلها int وجعلها ترجع رقمًا صحيحًا، بعض الكومبايلرات لا تمانع في استخدام void وبدون أي إرجاع لقيمة، لكننا ننصحك بالبقاء على الخيار اﻷول لتلافي المشاكل.



التعليقات


تعرفنا بالأعلى في البرنامج بالسطر الرابع على شكل من أشكال كتابة التعليقات وذكرنا أن التعليقات هي أسلوب مهم للغاية في توضيح وشرح وتوثيق البرنامج وأن الكومبايلر يتجاهل هذه التعليقات ولا ينفذها، وبوجهٍ عام لدينا نوعان من التعليقات في لغة سي بلس بلس:



  • التعليقات ذات اﻷسطر المنفردة (single-line-comments)، تكتب على سطر واحد فقط.



// main() is where program execution begins.


  • التعليقات ذات اﻷسطر المتعددة (multi-line-comments)، يمكن أن تكتب على أكثر من سطر.





/* This is a comment */





/* C++ comments can also


   * span multiple lines


*/





أنواع البيانات (Data Types) الرئيسية





أخبرتك سابقًا أن هنالك العديد من أنواع البيانات مثل int وfloat و void وهنالك أيضًا bool وchar وdouble.


لغة C++ وﻷنها لغة صارمة ومتشددة في الكتابة فإنها تلزمك بتعريف نوع بيان الدالة أو المتغيّر (سنناقش المتغيرات باﻷسفل) قبل تعريفهما (لعلك تتذكر أن الدالة main حيث قبل تعريفها عرّفنا البيان int، هذا إجباري).



  • النوع int: اﻷعداد الصحيحة.
  • النوع float: اﻷعداد العشرية.
  • النوع double: يرجع أعداد عشرية ولكن بشكل أدق وبحجم أكبر.
  • النوع void: لا يرجع أي قيمة.
  • النوع bool: يرجع فقط قيمتين، إما True وإما False.
  • النوع char: يرجع حرفًا أو رقمًا أو رمزًا واحدًا فقط.



المتغيرات (Variables)



المتغيرات هي أماكن لتخزين البيانات، وذلك ﻷجل التعامل معها لاحقًا، وهي قابلة للتغيّر والتحديث طوال فترة عمل البرنامج، لو لم يكن هنالك متغيرات فإن البيانات سوف تُسكب وتضيع خلال فترة عمل البرنامج، يمكنك القول بأن المتغير هو (الكوب) الذي يحوي بداخله البيانات (الماء) ولولاه لتسربت وسكبت الماء.



طريقة تعريف المتغير كالتالي:


DataType VarName = Value


مثال:


int numberOfVisitors = 12;


عرّفنا متغيرًا من نوع int وأسميناه numberOfVisitors (عدد الزوار) وقيمته 12، تذكر أن تجعل دائمًا أسماء المتغيرات ذات معنىً ودلالة، ولا تُسمِ بأسماء عشوائية مثل X وY.


*هنالك قواعد إجبارية في تسمية المتغيرات في لغة C++ فمثلا: لا يجوز لك ترك مسافة فارغة داخل اسم المتغير ولا يجوز أن يكون كلمة محجوزة مثل cout ولا يجوز أن يبدأ برقم.


الثوابت


الثوابت بعكس المتغيرات، فهي ثابتة لا تتغير ولا يجوز تغييرها بأي شكل من اﻷشكال بعد أن يتم تعريفها، يتم تعريف الثوابت بطريقتين.


عبر الكلمة #define كاﻵتي:





#define LENGTH 10   


#define WIDTH  5


#define NEWLINE '\n'


أو عبر الكلمة const كاﻵتي:





const int  LENGTH = 10;


const int  WIDTH = 5;


const char NEWLINE = '\n';



الجمل الشرطية (Conditionals)




الجمل الشرطية من اسمها، يتمّ تنفيذ ما بداخل قلبها من كود إذا تحقق الشرط وكان صحيحًا (True)، عدا عن ذلك لا يُنفذ ما بداخلها (False).


يوجد نوعان من الجمل الشرطية في C++ وهما IF وSwitch، وأنا سوف أشرح لك فقط IF وأترك لك أمر البحث عن switch بنفسك، كلاهما يتبعان نفس المبدأ مع فروقات بسيطة.





#include <iostream>


using namespace std;


 


int main () {


   // local variable declaration:


   int a = 100;


 


   // check the boolean condition


   if( a < 20 ) {


      // if condition is true then print the following


      cout << "a is less than 20;" << endl;


   } else {


      // if condition is false then print the following


      cout << "a is not less than 20;" << endl;


   }


   cout << "value of a is : " << a << endl;


 


   return 0;


}


البرنامج السابق يسأل ما إذا كان المتغير a قيمته أقل من 20 فإن كان هذا الكلام صحيحًا (True)، فإن كان كذلك فإنه ينفذ ما بداخل if، وعدا عن ذلك فإن كان الشرط خاطئًا (False) فإنه سوف يذهب فورًا إلى الجملة else وينفذ ما بداخلها، أمّا بالنسبة لجملة cout اﻷخيرة فهي مستقلة بذاتها وغير تابعة لـif ولا لـ else، وبالتالي سوف تُنفذ على أيّة حال.  



الحلقات التكرارية (Loops)





الحلقات التكرارية وجدت لتكرار مهمة معينة عدّة مرات عدا عن مرة واحدة، على سبيل مثال طباعة اﻷعداد من 1 إلى 10.


يوجد 3 أنواع من الحلقات التكرارية في C++ وهم For و While وDo/While وأنا سوف أشرح لك فقط For وأترك لك أمر البحث عن البقية بنفسك، وكلهم يتبعون نفس المبدأ مع بعض الفروقات. (لا تنسَ البحث أيضًا عن الجملتين break التي تكسر الـLoop واﻷخرى continue التي تتابع سير الـLoop).





#include <iostream>


using namespace std;





int main()


{


     // for loop execution


   for( int i = 1; i <= 10; i = i + 1 ) {


      cout << "value of i: " << i << endl;


   }


 


    return 0;


}


الكود السابق يطبع اﻷعداد من 1 إلى 10، لاحظ أن جملة for تتكون من 3 مقاطع مهمة:



int i=1 : هذا المقطع يقوم بتمهيد العداد ليبدأ العدّ من الرقم 1


i<=10 : هذا المقطع هو عبارة عن الشرط الخاص بالدوران، إن كان الشرط صحيحا (True) فاستمر بالدوران وإلا (False) فقم بالخروج من الحلقة التكرارية.


i=i+1 : هذا المقطع يقوم بزيادة العداد في كل مرّة.



الدوال (Functions)



لابدّ أنك تتذكر الدالة main؟! حسنًا؛ حان الوقت لنصنع الدوال بأنفسنا!


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


البنية العامة للدوال





return_type function_name( parameter list ) {


  // body of the function


}


return_type: وهو نوع البيانات الذي سوف تقوم الدالة بإرجاعه وقد يكون void أو int أو float أو غير ذلك


function_name: وهو اسم الدالة الذي تريده، وأسماء الدوال تتبع نفس قواعد تسمية المتغيرات


parameter_list: الباراميترات هي عبارة عن مجموعة من القيم التي يتم تمريرها إلى داخل الدالة، لتقوم الدالة بإجراء مجموعة من العمليات عليها، بوسعك تمرير أي عدد من اليارميترات مفصولة بينها بفواصل 


Function body: وهو محتوى الدالة الذي يكون داخل أقواسها المعقوفة { }







لاحظ البرنامج التالي:


#include <iostream>


using namespace std;


 


// function declaration


int max(int num1, int num2);


 


int main () {


   // local variable declaration:


   int a = 100;


   int b = 200;


   int ret;


 


   // calling a function to get max value.


   ret = max(a, b);


   cout << "Max value is : " << ret << endl;


 


   return 0;


}


 


// function returning the max between two numbers


int max(int num1, int num2) {


   // local variable declaration


   int result;


 


   if (num1 > num2)


      result = num1;


   else


      result = num2;





 // return statement will go to the place where you call 


   return result; 


}



البرنامج أعلاه يحتوي على دالة اسمها max تقوم بإعادة أكبر رقم من بين رقمين مختارين، ونوع اﻹرجاع الخاص بها int، دعنّا نحلل الكود اﻵن:



  • بدايةً في الدالة int main وهي تعتبر قلب البرنامج أو العقل المدبر، قمنا بتعريف مجموعة من المتغيرات (a, b, ret).


  • بعد ذلك قمنا باستدعاء الدالة max عبر ذكر اسمها مباشرة وقمنا بتمرير القيم a و b إليها (passing values).


  • عند استدعاء الدالة max يتم الذهاب إليها مباشرة وإعطاؤها تلكما القيم المُمرة مسبقًا، تتغلغل تلك القيم في أقواس الدالة ( ) لتتحول إلى num1 وnum2 (لاحظ أنه لا يجب بالضرورة  أن تكون أسماء المتغيرات في عملية الاستدعاء مثل أسمائها في عملية تعريف الدالة).


  • داخل جسم الدالة Function Body تم تعريف متغير اسمه result لتخزّن فيه نتيجة المقارنة بين الرقمين الناتجة من عملية المقارنة التي جرت عبر الجملة الشرطية IF-else.


  • وأخيرًا نقوم بإرجاع المتغير result إلى جملة الاستدعاء التي كانت في الـmain ثم لاحظ كذلك أننا قمنا بتخزين ما ترجعه الدالة من قيمة داخل متغير أسميناه ret.


  • قمنا بطباعة قيمة المتغير ret.



المصفوفات (Arrays)


المصفوفات هي أبسط شكل من أشكال الـ Data Structures، حيث تخزن البيانات في حاويةٍ بصورة خطية (كما تقوم بفرز كروت لعبة الورق أمامك أفقيًا)، يمكنك القول كذلك أن المصفوفة هي مثل الجدول، تحوي صفوفًا وأعمدة.



بوسعنا القول أن المصفوفة هي عبارة عن خليط متجانس (نفس النوع) من المتغيرات، تخيّل أننا نريد تعريف 1000 رقم داخل برنامجنا، هل يُعقل أن تقوم بتعريف ألف متغيّر؟! لهذا السبب اخترعت المصفوفات.



الصيغة العامة:


type arrayName [ arraySize ]; 


type: وهو نوع البيانات للمصفوفة مثل int أو float وغيرها.


arrayName: وهو اسم المصفوفة الذي تريده وهو يتبع نفس قواعد تسمية المتغيرات


[arraySize]: وهو حجم المصفوفة، بمعنى لو أن المصفوفة يوجد داخلها 10 أرقام فإن حجمها عشرة.



المصفوفة التالية قمنا بتخزين أرصدة 5 عملاء في البنك:




double balance[5] = {1000.0, 2.0, 3.4, 17.0, 50.0};


  • عملية العدّ في المصفوفة تبدأ من الرقم صفر وليس واحد (انتبه هذا مهم جدًا).
  • يسمى رقم كل عنصر في المصفوفة index، هذا يعني أن الـindex الخاص بالرصيد 2.0 هو 1
  • المصفوفات هو عالم واسع جدًا، يجب أن تبحث عنه أكثر وأكثر.



لنطلع على بعضٍ من Syntax اللغات اﻷخرى


لقد درسنا البعض من C++، أريد أن أطلعك اﻵن على حفنة من بعض اللغات المشهورة وكيف يُكتب الكود فيها، لا شك في أن هنالك لغة أسهل من اﻷخرى، لذلك سوف تلاحظ أن بعض اللغات لديها القدرة على كتابة البرامج في أقل عددٍ من اﻷسطر، هذا يسرّع اﻹنتاجية كثيرًا، لكنه لا يناسبك وأنت على أول الطريق كما ذكرت لك سابقًا باﻷعلى.



Hello World in ‘Java’:



public class HelloWorld {





    public static void main(String[] args) {


        // Prints "Hello, World" to the terminal window.


        System.out.println("Hello, World");


    }





}





Hello World in ‘C#’:





// A Hello World! program in C#.


using System;


namespace HelloWorld


{


    class Hello 


    {


        static void Main() 


        {


            Console.WriteLine("Hello World!");





            // Keep the console window open in debug mode.


            Console.WriteLine("Press any key to exit.");


            Console.ReadKey();


        }


    }


}




Hello World in ‘PHP’:





<?php 


Echo "Hello, World!";


?>




Hello World in ‘Python’:



print('Hello, world!')



Hello World in ‘Ruby’:



puts 'Hello, world!'



Hello World in ‘JavaScript’:



alert( 'Hello, world!' );


خطط نهائية شاملة مقترحة


هنا سوف أستعرض مجموعة من المسارات التعليمية المقترحة لكلٍ من: مصمم الويب، مطور الويب، مطور الموبايل، عالم البيانات.


قبل الخطط، أشياء لا مفرّ من تعلّمها للجميع:


  • تعلّم C أو C++ (إجباري).
  • تعلم OOP (إجباري).
  • تعلم الخوارزميات وهياكل البيانات (إجباري).
  • تعلم لغة Java (اختياري، لكنه مستحسن بشدة).


اﻵن وبعد أن تعلمت التقنيات التي باﻷعلى والتي أعتبرها إلزامية ﻷي متعلّم حاسوب، حان الوقت لتختار الطريق الذي تريد أن تسلكه، توجد العديد من الطرق والتي سوف أطرحها لك أدناه:



تصميم الويب (Front-end) :








  • تعلم لغة البناء اﻷساسية لصفحات الويب HTML (إجباري).
  • تعلم لغة تزيين وتنسيق صفحات الويب CSS (إجباري).
  • تعلم لغة البرمجة جافاسكربت JS لجعل صفحات الويب تفاعليّة (إجباري).
  • تعلم JQuery لتسهيل استعمال وظائف JS (مستحسن بشدة).
  • تعلم AJAX ﻹعادة تحميل جزء معين بالصفحة دون إعادة تحميلها بالكامل (مستحسن بشدة).
  • تعلم أحد إطارات العمل للمواقع المتجاوبة مع الشاشات مثل Bootstrap (مستحسن بشدة).
  • تعلم أحد لغات برمجة التصميم مثل Less أو Sass (مستحسن بشدة) - اختر واحدة فقط.
  • تعلم أحد إطارات المواقع وحيدة الصفحة (SPA) مثل Angular أو React أو Vue.js. (مستحسن بشدة) - اختر واحدة فقط.
  • تعلم GulpJS لتقوم بتنفيذ مجموعة من المهام أوتوماتيكيًا.


*أينما ذكرت كلمة "مستحسن بشدة" أعلاه، فهذا يعني أنها سوف تصبح "إجبارية" كلما صرت أكثر احترافًا في هذا المجال.





تطوير الويب (Back-end) :








تعلم أساسيات HTML وCSS وJS. (إجباري)


تعلم أحد لغات السيرفر PHP أو Python أو NodeJS أو ASP أو Java أو Ruby. (إجباري) - اختر واحدة فقط.

تعلم أحد أنظمة قواعد البيانات، SQL أو noSQL.


بعد تعلمك واحدة من هذه اللغات، ولتسهيل العمل فاختر إطار عمل (Framework) بحسب اللغة التي تعلمتها، (مستحسن بشدة) - اختر واحدًا فقط :


  • Laravel: PHP framework.
  • Django: Python Framework
  • Express.js: NodeJS Framework
  • .NET: ASP Framework.
  • Spring: Java Framework.
  • RubyOnRails: Ruby Framework.





تطوير تطبيقات الموبايل




بشكل عام يوجد لدينا نوعان من تطبيقات الموبايل، التطبيقات الأصيلة (Native) التي يتم تصميمها بواسطة لغة البرمجة اﻷصلية لنظام التشغيل، والتطبيقات الهجينة (Hybrid) التي تصمم بغير اللغة الحقيقية لتطبيقات نظام التشغيل.





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





تكون التطبيقات اﻷصيلة استخدامها إجباريا عندما يكون التطبيق عملاقًا مثل Snapchat، حيث سوف تحتاج لتطوير نسخة مستقلة لكل نظام.





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



  • تطوير التطبيقات اﻷصيلة (Native apps) :


Java/Kotlin (Android).


Swift (iOS).


  • تطوير التطبيقات الهجينة (Hybrid apps) - اختر واحدًا فقط:


Flutter


React Native


Ionic



تعلم علوم البيانات (Data Science)




لتعلم تحليل البيانات تحتاج إلى معرفة مسبقة جيدة بالرياضيات وخصوصًا رياضيات اﻹحصاء، كما ستحتاج إلى تعلم لغة برمجة مثل Python أو R باﻹضافة إلى تعلم SQL وتعلم الآلة (ML) والبيانات العملاقة (Big Data).



نصائح أخيرة



  • تشرّب اﻷساسيات حتى تثبت في الدماغ.


  • فكّر كأنك حلال مشاكل.


  • كن صبورًا، لا تأتي اﻷمور إلا بالجهد، وابتعد عن كلام التنمية البشرية الزائف.


  • لا تسمع الموسيقى ولا أي مقطع صوتي خلال البرمجة، لقد أثبت العلماء أن سماع أي مقطع صوتي -مهما كان- خلال التفكير يؤدي إلى التشتيت.


  • لا تسمع لكلام المحبطين والمثبطين وشارك خطواتك اﻷولى على المجموعات.


  • لا يهم نوع نظام التشغيل الذي تستخدمه للبرمجة، إلا أنه لا مانع من أن تتعرف على أنظمة التشغيل اﻷخرى مثل Linux وMac، ولتكون مدير أنظمة (System Admin) فلا بد من التعرف على كل الأنظمة المشهورة.


  • وثّق كودك بالتعليقات داخل البرنامج (Comments) واجعله منظمًا مفهومًا واختر أسماء متغيرات ودوالٍ ذات دلالة ومعنىً ولا تختر أسماءً عشوائية.


  • تابع اﻷخبار أولا بأولا، ابق على اطلاع: مجال تقنية المعلومات لا ينفك عن التغيير، لذا ينبغي أن تواكب ما يحصل.


  •  المهم هو المنطق، لغات البرمجة تتشابه في المنطق وتختلف في الصيغة اللغوية (Syntax)، هذا لا ينفي أن لكل لغة دهاليزها وخفاياها لكن المهم هو اﻷساس.


  • ضع هدفًا لتطبيقك أمام نصب عينيك، بدون هدف لن تكمل التعلم، قُل مثلًا أنني أريد أبني تطبيقًا لمؤسسة وسوف يحتوي على المواصفات X وسوف أنهيه في الوقت Y.


  • ركّز على فهم المتطلبات جيدًا قبل الشروع في تصميم المشروع، إن عدم فهم المتطلبات بشكل صحيح سوف يؤدي إلى مشاكل جمّة لاحقًا.


  • شارك في معسكرات البرمجة وفي أعمال البرمجة التطوعية وساهم على GitHub.


  • تعلم كيف تقوم بعمل تصحيح وتتبع للأخطاء (Debugging).


  • اقرأ رسائل الخطأ التي يخرجها لك الكومبايلر، ﻷن أغلب الحلول تكون فيها.


  • تعلّم إدارة وتنظيم الوقت، فكما أن البرمجة منطق فهي كذلك تحتاج فنًا في اﻹدارة.


  • تعلم التفاعل مع اﻵخرين.


مصادر ومراجع



  • How was the first computer code created? - Quora.com, V: 21 May 2019.


  • Web development trends - Clockwise.com, V: 21 May 2019.


  • How to learn programming - WikiHow.com, V: 21 May 2019.


  • History of Programming languages - Wikipedia.org, V: 21 May 2019.


  • Timeline of programming languages - Wikipedia.org, V: 21 May 2019.


  • Assembly language - Wikipedia.org, V: 21 May 2019.


  • C++ Programming - Tutorialspoint.com, V: 21 May 2019.


  • How to become data scientist? - Geteducated.com, V: 21 May 2019.


  • High-Level vs. Low-Level Programming Languages - Makeofus.com, V: 21 May 2019. 


  • Head First with Java (Book), V: 21 May 2019.