اليوم أصبحت البرمجة مهارة متزايدة الأهمية: كمصمم، قد يساعدك فهم بعض أساسيات البرمجة على فهم عملك بشكل أفضل؛ وكمؤسس شركة ناشئة، فإن كونك مؤسس تقني يجعل العديد من أعمالك أسهل. وبالنسبة للمبتدئ الذي يرغب في الدخول إلى المجال، قد لا يعرف من أين يبدأ أمام كم هائل من المعلومات؛ وبعد أن تتجاوز مرحلة التعلم الأولي للمواد الأساسية، ستجد أن التعلم يصبح أكثر صعوبة، ومنحنى التعلم الحاد يجعلك تتراجع؛ أنت تعرف كيف تطبع نصًا على الصفحة، لكنك لا تعرف متى تبدأ مشروعًا حقيقيًا وفعّالًا؛ أنت لا تدرك ما الذي لا تعرفه بعد، وحتى أنك لا تعرف ما الخطوة التالية التي يجب أن تتعلمها.
محتوى هذا المقال لن يقدم لك فقط بعض النصائح التوجيهية، بل سيتضمن أيضًا دليلًا أساسيًا ومركزيًا لمدخل البرمجة. بالطبع، مسار خطوة بخطوة غير واقعي، وكل شخص لديه خصائصه، لذا فإن هذا الدليل للمبتدئين يهدف أكثر إلى إثارة تفكير القارئ، وفي النهاية يساعدك على تشكيل مسار تعلم يناسبك.
لكن يجب أن تنتبه: هذا المقال موجه لأولئك الذين يرغبون حقًا في تعلم البرمجة — أولئك الذين يملكون عزيمة قوية ويصرون على إنجاز شيء حقيقي، ولا يرضون إلا بعد أن يصنعوا شيئًا، ولا يكتفون بالتعلم دون تطبيق؛ وليس لأولئك الذين يقولون “سمعت أن البرمجة ممتعة”، فبرأيي، هؤلاء لن يدخلوا باب البرمجة أبدًا، ناهيك عن أن يصنعوا شيئًا لائقًا.
على الرغم من أن نغمة المقال تعتمد على ما يُعرف بـ “آراء قوية، التزام ضعيف” (Strong Opinions, Weakly Held)، إلا أن على القارئ أن يتشكك في صحة ما نكتب، تمامًا كما يتشكك في كل شيء حوله. وإذا كانت لديك أي أسئلة ذات صلة، فمرحبًا بك في النقاش المفتوح.
تعديل الحالة النفسية
تحديد الهدف
قبل أن تبدأ تعلم البرمجة، فكر في هدفك. عندما يكون لديك هدف نهائي، سيكون الطريق أكثر وضوحًا. فماذا تريد أن تكتب؟ موقع إلكتروني؟ لعبة؟ تطبيق iOS أو Android؟ أم أنك تريد أتمتة مهام مملة لتوفير وقتك لمشاهدة المنظر من النافذة؟ ربما فقط تريد أن تكون أكثر تنافسية في سوق العمل وتجد وظيفة جيدة. كل هذه أهداف ذات قيمة، وهي جزء من الدافع وراء تعلم البرمجة. بدون دافع، لن تتمكن من المضي قدمًا في رحلة التعلم الطويلة والمملة أحيانًا.
ربما يلهمك هذا الفيديو: “الأشياء التي لن تعلمها في معظم المدارس”
لا تتسرع
البرمجة السيئة سهلة. حتى المبتدئ يمكنه تعلمها في 21 يومًا. البرمجة الجيدة تتطلب تفكيرًا، لكن الجميع يمكنه فعل ذلك وتجربة الإحساس بالرضا الشديد الناتج عنها.
البرمجة السيئة سهلة. حتى المبتدئ يمكنه تعلمها في 21 يومًا. البرمجة الجيدة تتطلب تفكيرًا، لكن الجميع يمكنه فعل ذلك وتجربة الإحساس بالرضا الشديد الناتج عنها.
سواء في المكتبات التقليدية أو الرقمية، غالبًا ما تجد كتبًا سريعة مثل “تعلم X في 21 يومًا”، وتعدك بأنها ستجعلك تتقن التقنية خلال فترة قصيرة. Matthias Felleisen في كتابه “كيف تصمم برامجًا” يوضح بشكل ساخر توجه “الاختصار” هذا ويشير إلى مخاطره.
ما يُعرف بـ “الطريق المختصر” أو “الفضة السحرية” غير موجودة. قال الحكماء إن إتقان شيء يتطلب 10 سنوات أو 10,000 ساعة، أي “عشرة أعوام من طحن السيف”، فلا تتعجل، فالجهد لا يذهب سدى.
تنمية الاهتمام
معظم المبرمجين الجيدين لا يبرمجون لأنهم يتوقعون الحصول على أجر أو إعجاب الجمهور، بل لأن البرمجة ممتعة.
– Linus Torvalds
الانغماس في البرمجة، والبرمجة من أجل المتعة. الاهتمام هو مصدر لا ينضب للدافع، حافظ على هذا الشعور بالفضول، لكي تدمجه في سنواتك العشر/10,000 ساعة من البرمجة. البرمجة ممتعة، فهي فرحة الاكتشاف. فرحة الإبداع. رؤية عملك يظهر على الشاشة ممتعة. أن يندهش الآخرون من كودك ممتع. أن يمدح الناس منتجك، ويستخدمه جيرانك، ويناقشونه في وسائل الإعلام ممتع. يجب أن تكون البرمجة ممتعة جدًا، وإذا لم تكن كذلك، فابحث عن سبب عدم متعتها، وحله.
ابدأ التعلم
قصة تثير اليقظة
عندما دخلت المدرسة الإعدادية، بدأت أتعلم البرمجة، وللأسف قرأت العديد من الكتب السيئة المنتشرة آنذاك مثل “إتقان C++ في 21 يومًا”. لم تكن مشكلة كبيرة حينها، بل كنت أكتب بعض البرامج الصغيرة. لكن عندما حدثت أعطال في البرمجيات، لم أكن أعرف السبب، ولم أستطع حل المشاكل الكبيرة، وعندما كانت المكتبات الموجودة لا تلبي حاجتي، كنت أرفع يدي يأسًا. على الرغم من أنني كنت أبرمج يوميًا، إلا أن قدراتي كانت تتطور ببطء، وكانت مفاهيم “التكرار” و"الاستدعاء الذاتي" محدودة جدًا، وكأنني أستخدم الكمبيوتر كآلة حاسبة فقط.
بعد دخولي الجامعة، تخصصت في الفيزياء، وكنت أكرر حفظ المعادلات دون فهم كيف تم استنتاجها، وما علاقاتها، أو معانيها. كنت أتعلم كيف أحسب وأحل بعض المسائل الفيزيائية الشائعة، لكنني لم أفهم لماذا تعمل بهذه الطريقة، وما السبب وراء ذلك.
وعندما حاولت تصميم ألعاب حاسوب تعتمد على الفيزياء، واجهت نفس الصعوبات: لم أكن أستطيع حل المشاكل الجديدة، وتراكمت لدي مخاوف من مواجهة تحديات جديدة، وبدأت أتهرب من الفهم الحقيقي، وكنت أظن أنني يمكن أن أبحث في Google وأنسخ وألصق الحلول.
لكن، في إحدى محاضرات المرحلة الثانوية، تغيرت طريقة تعلمي تمامًا. شعرت لأول مرة بـ “فتح العين”، وأدركت أنني أملك فهمًا ضئيلًا جدًا لبعض المواد، بما في ذلك الفيزياء التي تخصصت فيها، وعلوم الحاسوب التي دراستها مساعدة لي.
عن تلك المحاضرة: كنا قد أنهينا للتو دراسة الكهرباء والنسبية، وكتب الأستاذ على السبورة هذين الموضوعين، ورسم خطًا يربط بينهما. قال: “افترض أن لدينا إلكترونًا يتحرك على طول سلك بسرعة نسبية…”، في البداية، كان يكتب المعادلات المعروفة للكهرباء والنسبية، لكن بعد عدة استنتاجات على السبورة، ظهرت معادلة المجال المغناطيسي بشكل سحري. على الرغم من أنني كنت أعرف هذه المعادلة منذ سنوات، إلا أنني لم أدرك في ذلك الوقت أن هناك علاقة عميقة بين الظواهر. الفرق بين الكهرباء والمغناطيسية هو مجرد “زاوية المراقبة”، وأدركت فجأة أنني لم أعد أبحث فقط عن “كيف” أفعل شيئًا، بل عن “لماذا”. بدأت أعود إلى الأساس، وأتعلم تلك المعرفة التي كان من المفترض أن أتعلمها جيدًا من قبل. هذه العودة كانت مؤلمة، وأتمنى أن تكونوا قد استفدتم من ذلك، ولا ترتكبوا هذا الخطأ أبدًا.
تأملات بعد اليقظة
هذه الصورة مأخوذة من كتاب Douglas Hofstadter “Gödel, Escher, Bach”. كل حرف فيها يتكون من حروف أصغر منه. على أعلى مستوى، نرى “MU”، حيث يتكون حرف M من ثلاثة مفاهيم كلية (Holism)، وU يتكون من مفهوم تقليل (Reductionism)، وكل منهما يحتوي على الآخر، والعكس صحيح. وعلى أدنى مستوى، ستجد أن أصغر حرف هو مكون من تكرار لـ “MU”.
كل مستوى من التجريد يحمل معلومات، وإذا نظرت إليه بشكل أحادي باستخدام نظرية الكل أو التحليل، فإنك لن تحصل إلا على “MU” (وفي بعض المناطق، تعني كلمة mu لا شيء). السؤال هو: كيف تحصل على أكبر قدر من المعلومات من كل مستوى؟ أو بعبارة أخرى، كيف تتعلم مجالات معقدة مثل البرمجة، التي تحتوي على العديد من المعارف؟
هناك مشكلة رئيسية في عملية التعليم والتعلم: غالبًا ما يركز المبتدئون على الصورة الكلية ويتجاهلون الأساسيات. على سبيل المثال، يرغب الطلاب في صنع روبوت، لكنهم لا يفهمون النماذج الفيزيائية وراء ذلك، أو أساسيات الإلكترونيات، أو أنظمة التحكم وأجهزة الاستشعار، مما يجعلهم غير قادرين على بناء شيء حقيقي في المستقبل، ويصعب عليهم التشخيص وحل المشاكل.
هناك فخ آخر: الاعتماد المفرط على النهج الشمولي (الكلية)، حيث يبدون فعالين أحيانًا، لكن بعد سنة أو سنتين، عندما يبتعدون أكثر عن الأساسيات، يصبح من الصعب عليهم العودة وتصحيح أخطائهم. عليهم أن يتخلوا عن مفاهيمهم القديمة، ويصبروا على التعلم خطوة خطوة، وهو أمر أصعب بكثير من التعلم من البداية.
لكن، لا ينبغي المبالغة في التحليل التفكيكي (التحليل إلى أجزاء صغيرة)، فالسعي المفرط نحو النظريات الكبرى قد يؤدي إلى ملل وركود، خاصة في علوم الحاسوب، حيث يواجه الطلاب خطر الانغماس في النظريات فقط، دون تطبيق عملي، مما يقتل الدافع.
يمكن تشبيه تعلم البرمجة بتعلم فن الطهي: إذا اشتريت كتب وصفات فقط، وطبخت بها لأجل أسرتك، فستكون بداية جيدة، ويمكنك إعداد أطباق لائقة. لكن إذا أردت أن تصبح طباخًا محترفًا، وتقدم أطباقًا فريدة، وتصبح “طباخًا كبيرًا”، فعليك أن تفهم أفكار الشيف وراء الوصفات، وتعلم النظريات، وليس مجرد تطبيق الوصفات بشكل عشوائي.
وإذا كانت مهمتك اليومية فقط قراءة الكتب النظرية، وبدون ممارسة، فستصبح طباخًا سيئًا، وربما لن تتعلم الطهي أبدًا، لأن الملل سيدفعك للاستسلام.
باختصار، البرمجة هي الرابط بين النظرية والتطبيق، وهي مجال يتداخل فيه علم الحاسوب مع التطبيقات العملية. يجب أن يكون أسلوب التعلم الصحيح هو: استكشاف ذاتي من أعلى إلى أسفل، مع تطبيق المشاريع، لاكتساب الحدس والدافع؛ ومن الأسفل إلى الأعلى، لبناء الأساس، مع فهم المبادئ العامة وتثبيتها.
كمبتدئ، يجب أن تركز على الجانب الأول، مع استخدام الجانب الثاني كمساعد.
أساسيات تصميم البرامج
“ما لغة البرمجة التي يجب أن أتعلمها؟” هو السؤال الأكثر تكرارًا من المبتدئين، لكن هذا سؤال خاطئ. يجب أن يكون السؤال الأول هو: “ما العناصر التي تشكل أساس تعلم البرمجة؟”
هناك ثلاثة أجزاء رئيسية في هرم المعرفة البرمجية:
الأفكار الخوارزمية: مثل كيف أجد أكبر رقم في مجموعة من الأرقام؟ أولًا، يجب أن يكون لديك متغير maxSoFar، ثم لكل رقم…
القواعد النحوية: كيف أستخدم لغة برمجة معينة للتعبير عن هذه الخوارزميات، بحيث يفهمها الحاسوب.
أساسيات النظام: لماذا لا تنتهي خيوط التنفيذ عند استخدام while(1)؟ لماذا يكون الكود التالي غير ممكن: int *foo() { int x = 0; return &x; }؟
بالنسبة للمبتدئين في مرحلة التهيئة، سيكون من الصعب جدًا ومملًا أن يختاروا لغة C كلغة أولى، لأنهم يضطرون لتعلم هذه الأجزاء الثلاثة في آن واحد، قبل أن يتمكنوا من عمل شيء.
لذلك، لتقليل عبء تعلم “القواعد النحوية” و"أساسيات النظام"، يُنصح باستخدام بايثون كلغة أولى، على الرغم من أن بايثون ودود جدًا للمبتدئين، إلا أنه ليس مجرد “لعبة”، ففي المشاريع الكبيرة، نرى قوته ومرونته. بعد إتقان بايثون، يمكن تعلم C، لأنها ستساعدك على التفكير من منظور قريب من مستوى النظام، وفهم بعض مبادئ أنظمة التشغيل لاحقًا.
إليك دليلًا مرجعيًا لمرحلة التهيئة، بعد إكماله، ستبني إطارًا عامًا في ذهنك، يساعدك على استكشاف البرمجة من أعلى إلى أسفل. لا يوجد ترتيب محدد للمواد أدناه، يمكنك اختيار أي منها، وإذا واجهت مشكلة، فكر في تبديل المادة.
MIT 6.00.1x (مقدمة في علوم الحاسوب وبرمجة بايثون). على الرغم من أن لغة التدريس هي بايثون، إلا أن هذه الدورة تعتبر مقدمة ممتازة، تركز على المفاهيم والنماذج الأساسية في علوم الحاسوب، وليس فقط على تعلم لغة معينة. إذا لم تكن طالبًا في علوم الحاسوب، فهذه الدورة توسع آفاقك أثناء التعلم الذاتي؛ محتوى الدورة: المفاهيم الحسابية، برمجة بايثون، هياكل بيانات وخوارزميات بسيطة، الاختبار والتصحيح.
Harvard CS50x (جامعة هارفارد: علوم الحاسوب). دورة تمهيدية أيضًا، لكنها تكمل دورة MIT. لغة التدريس تشمل C، PHP، JavaScript + SQL، HTML + CSS، وتغطي نطاقًا وعمقًا معقولين، وتتيح لك الاطلاع على أحدث الإنجازات التكنولوجية، مما يحفز اهتمامك بالتعلم.
مهمة داعمة: قراءة “الترميز”
بعد الانتهاء من مرحلة التهيئة، سيكون لديك بعض الخبرة في كتابة الكود، وفهم معين للبرمجة. عندها، قد ترغب في تعلم تقنية محددة، مثل تطوير الويب، أو تطوير تطبيقات Android أو iOS، ويمكنك تجربة بناء أشياء بسيطة، وتقديم ردود فعل إيجابية لنفسك، وزيادة دافعك. لكن تذكر، لا تتعمق كثيرًا، فهذه التقنيات تحتوي على العديد من التفاصيل، وسيأتي الوقت لتعلمها لاحقًا؛ وأيضًا، لا تتعمق في الأُطُر أو اللغات المحددة الآن، فحان وقت تعلم أساسيات علوم الحاسوب العامة، ولا تحاول أن تسرق الطريق وتتعلم ما تريد مباشرة، فهذا طريق محكوم عليه بالفشل.
فماذا تفعل في مرحلة الدخول؟ عليك أن تعيد التفكير في البرامج التي كتبتها من قبل، وتفكر: لماذا صممتها بهذه الطريقة؟ كيف أكتب برامجًا أفضل؟ حاول فهم جوهر البرمجة: استخدام الحاسوب لحل المشكلات.
افترض أن:
X = وقت التفكير في حل المشكلة، أي “حل المشكلة”
Y = وقت تنفيذ الكود، أي “استخدام الحاسوب”
القدرة على البرمجة = F(X, Y) (X>Y)
لرفع قدراتك البرمجية، عليك تحسين X وY، وفهم وظيفة F(X, Y). قليل من الكتب تركز على هذه النقاط الثلاث، لكن هناك كتاب واحد حقق ذلك: “هيكلة وتفسير برامج الحاسوب” (SICP). هذا الكتاب يوضح لك هذه الأوجه الثلاثة، قبل قراءة SICP، يمكنك حل مشكلة بسيطة باستخدام بعض الدوال، لكن بعد قراءته، ستتعلم كيف تعقلن وتقسم المشكلة، مما يمكنك من التعامل مع مشاكل أكثر تعقيدًا، وهو قفزة هائلة في قدرات البرمجة، ستغير طريقة تفكيرك وحل المشكلات بشكل جوهري.
بالأكثر، لغة التدريس في SICP هي Scheme، مما يمنحك لمحة عن البرمجة الوظيفية، وكونها بسيطة جدًا، ستتمكن من تعلمها بسرعة، وتوجيه وقتك أكثر نحو فهم الأفكار البرمجية وحلول المشاكل المعقدة.
كتبها Peter Norvig عن تقييمه لكتاب SICP:
لأعطيك تشبيهًا، لو كان SICP عن السيارات، لكان موجهًا لمن يريد أن يعرف كيف تعمل السيارات، وكيف تُبنى، وكيف يمكن تصميم مركبات موفرة للوقود وآمنة وموثوقة للقرن الواحد والعشرين. أما من يكره SICP، فهم من يريد فقط أن يتعلم كيف يقود سيارته على الطريق السريع، مثل الجميع.
إذا كنت من النوع الأول، فإن قراءة SICP ستكون نقطة ربط بين التأسيس والمرحلة الأولى.
رغم أن SICP هو “كتاب تمهيدي”، إلا أن للمبتدئين بعض الصعوبة، وهنا بعض الموارد المفيدة جدًا:
Udacity CS212 تصميم برامج الحاسوب: يقدمه Peter Norvig، وهو من باحثي Google، لغة التدريس بايثون، ومحتواه يتطلب جهدًا.
How to Design Programs، الطبعة الثانية: أقل مستوى من SICP، ويشرح بشكل تدريجي، مناسب للمبتدئين، وإذا وجدت أن إتمام SICP صعب جدًا، فابدأ بـ HtDP.
فيديوهات محاضرات SICP من جامعة كاليفورنيا بيركلي، بالإضافة إلى تسجيلات لاثنين من مؤلفي الكتاب أثناء تدريبهم لموظفي شركة Hewlett-Packard (مشاريع باللغة الصينية).
Composing Programs: مقدمة في البرمجة تعتمد على أفكار SICP، وتستخدم بايثون، وتحتوي على بعض المشاريع الصغيرة.
مجموعة حل مسائل SICP: للمسائل في نهاية الكتاب، يجب على المبتدئ أن يبذل جهدًا كبيرًا في إكمالها.
بعد إتمام هذه المرحلة، ستبني نموذجًا برمجيًا خاصًا بك، ولن تكون عالقًا في تذكر المكتبات أو القواعد، وستدرك أن حفظ القواعد لا يعلمك حل المشكلات، وأن ما ستتعلمه بعد ذلك هو التطبيق العملي، وهو الوقت المناسب لممارسة المشاريع.
بالنسبة للمشاريع: للمبتدئين، المشاركة في مشاريع مفتوحة المصدر قد يكون مبكرًا جدًا، وبدلاً من ذلك، ابدأ بمشاريع بسيطة، مثل بناء موقع إلكتروني وصيانته، أو برمجة لعبة صغيرة وتطويرها تدريجيًا. إذا لم تكن لديك أفكار واضحة، فتابع “معمل التقطيع” أو اختر مشروعًا من “قائمة المشاريع الكبرى” التي تفضلها.
وإذا وجدت أن SICP صعب جدًا، فلا تفرض على نفسك، وتجاوزها، وابدأ بـ “مبادئ أنظمة الحوسبة” (The Elements of Computing Systems)، التي ستعلمك بناء حاسوب من بوابة NAND الأساسية، حتى يعمل على حاسوبك بشكل كامل.
هذه الكتابة سترافقك طوال مرحلة التأسيس، وهدفك هو إكمال جميع مشاريعها (بما في ذلك مترجم و نظام تشغيل بسيط).
لإتقان هذا الكتاب، ولتعزيز الأساس، وللتمهيد لمستقبل أكثر قوة، عليك أن تجهز نفسك في عدة مجالات (ملاحظة: لا يوجد ترتيب محدد هنا):
أساسيات أنظمة الحاسوب
بعد أن تتقن تصميم البرامج، وتريد فهم أعمق لعلوم الحاسوب، يمكنك الاطلاع على هذا الكتاب: “أنظمة الحاسوب: منظور المبرمج” (Computer Systems: A Programmer’s Perspective، 3rd Edition).
انتقد البعض الترجمة العربية لاسم الكتاب، لكن الحقيقة أن الكتاب هو منهج “مقدمة في أنظمة الحاسوب” من جامعة كارنيجي ميلون (CMU). تخصص علوم الحاسوب في CMU يميل أكثر نحو البرمجيات، والكتاب يركز على فهم كيف تنفذ البرامج داخل أنظمة الحاسوب، ويشرح التفاصيل الداخلية بشكل شامل.
إذا وجدت أن القراءة مملة، يمكنك متابعة دورة على Coursera بعنوان “واجهة الأجهزة والبرامج” (The Hardware/Software Interface)، وهي جزء من منهج CSAPP، مع نقل أهم التجارب المختبرية.
كما يمكنك مراجعة كتاب “لغة البرمجة C”، لاستعادة مفاهيم C الأساسية.
بعد إتمام هذا الكتاب، ستكون لديك قاعدة قوية في أنظمة الحاسوب، مما يمكنك من دراسة أنظمة التشغيل، والمترجمات، وشبكات الحاسوب، وغيرها. وعند دراسة أنظمة أكثر تقدمًا، ستجد أن مراجعة فصول منه، وتنفيذ الأمثلة برمجياً، يعزز فهمك النظري، ويجعلك ملمًا بكود عملي، ومرتبك من أعلى مستوى إلى أدنى، وتستطيع تتبع تدفق البيانات عبر الشبكة، والذاكرة، والذاكرة المخبأة، والمعالج.
أساسيات هياكل البيانات والخوارزميات
اليوم، يعتقد الكثيرون أن البرمجة (خصوصًا تطوير الويب) تعتمد بشكل رئيسي على استخدام كود الآخرين، وأن التعبير الواضح عن الأفكار أهم من إتقان الرياضيات والخوارزميات، فهل كل شيء مدمج في هياكل البيانات وخوارزميات البحث والفرز؟
هل العمل الحقيقي لا يتطلب ذلك، وما فائدة تعلم الخوارزميات؟
هذه الأفكار التي ترفع شعار “البرمجيون” وتؤمن أن البرمجة مجرد وظيفة، غير صحيحة. بدون أساس نظري قوي، ستواجه حواجز لا مفر منها.
هياكل البيانات والخوارزميات مترابطة، ويجب أن تتقن معرفة أي الخوارزميات وهياكل البيانات تصلح لحل مشكلة معينة بسرعة أكبر.
وهذا يتطلب أن تكون على دراية جيدة بهياكل البيانات والخوارزميات الشائعة، وليس بالضرورة أن تكتب الكود، بل أن ترسم المخططات على الورق، وتفهم الاستخدامات.
إليك موارد دراسية مقترحة:
“مقدمة في الخوارزميات” (Introduction to Algorithms): يقول البعض إنه ليس كتابًا للمبتدئين، لكن اسمه “مقدمة”، وهو كذلك، ويمكن تخطي التمارين والأدلة في البداية، ثم العودة إليه بعد إتقان “تحليل هياكل البيانات والخوارزميات”.
“الخوارزميات: التصميم والتحليل” (Algorithms: Design and Analysis) [الجزء 1 و 2]: دورة من ستانفورد، غير محدودة باللغة، وتغطي أساسيات الخوارزميات؛ وإذا كانت الإنجليزية مشكلة، فكتاب “مقدمة في الخوارزميات” من معهد ماساتشوستس للتكنولوجيا (MIT).
في مرحلة التأسيس، من المهم أيضًا أن تتعلم حل المشكلات الصغيرة باستخدام خوارزميات عادية، ويمكنك مراجعة كتب مثل: “اللآلئ البرمجية” (Programming Pearls)، و"ممارسات تصميم البرامج" (The Practice of Programming).
موارد أخرى أساسية
هناك نقاط مهمة غالبًا ما يغفل عنها المبتدئون في مرحلة التأسيس:
تعلم كيف تطرح الأسئلة: أثناء التعلم، ستواجه مشكلات، ويجب أن تتعلم كيف تستخدم محركات البحث بشكل صحيح. وعندما تعجز عن الحل، استعن بـ Stack Overflow أو Zhihu، وقراءة هذا المقال: “طرق طرح الأسئلة التي تحل المشكلات بشكل فعال”.
لا تكن ذئبًا وحيدًا: حاول التواصل مع الآخرين، وشارك أفكارك. أنشئ موقعًا شخصيًا بسيطًا، وسجل أفكارك في مدونة، واشتراك في مدونات برمجية تحبها، مثل: Joel on Software، Peter Norvig، Coding Horror.
حسن لغتك الإنجليزية: فهي أداتك الأساسية للوصول إلى موارد عالية الجودة، لكن في البداية، قد تكون الكتب المترجمة كافية، فوازن بين قدراتك واحتياجاتك.
ختامًا
لا ينبغي أن تخاف من المحتوى السابق، فدخول عالم البرمجة ليس مهمة في بضعة أسابيع. ستواجه العديد من التحديات، وعند العقبات، جرب تقنية “فرايمان”: قسم المشكلة إلى أجزاء صغيرة، وتعامل معها واحدًا تلو الآخر، ثم اختبر فهمك من خلال شرحها للآخرين.
بالطبع، ستظل هناك مشاكل لا تستطيع حلها، وعندها لا تفرض على نفسك، فغالبًا عند العودة إليها بعد فترة، ستجد الحل بوضوح.
إضافة إلى ذلك، هناك كتب أخرى مهمة، وتكرار قراءتها مفيد جدًا في مراحل التأسيس والتطوير.
وفي قائمة الكتب التي يوصي بها مجتمع المبرمجين على Stack Overflow، هناك اثنان في المقدمة:
“إكمال الكود” (Code Complete): مناسب للمبرمجين ذوي الخبرة، وللمبتدئين أيضًا، لملء الثغرات المعرفية، خاصة في فصول التغيرات، الاختبارات، والشخصية.
“المبرمج العملي” (The Pragmatic Programmer): يُعرف بأنه “كتاب صغير عن الكود”، يغطي من مبادئ “الابتعاد عن التكرار” (DRY) إلى “بساطة الحل” (KISS)، ويشجع على أن تكون مبرمجًا عمليًا.
مؤلف الكتاب، Dave، قال في بداية الكتاب:
أنت مبرمج عملي. لست متمسكًا بتقنية معينة، لكن لديك خلفية واسعة في العلم، وخبرتك في المشاريع العملية تمكنك من اختيار الحلول الجيدة في المواقف المختلفة. الجمع بين النظرية والتطبيق يجعلك قويًا. تعدل أسلوبك وفقًا للظروف، وتفعل ذلك باستمرار أثناء العمل. المبرمجون العمليون ينجزون العمل بشكل جيد.
هذه الكلمات، وأسلوب “الكتب العملية” الذي أسسه، أثر فيّ بشكل دائم، ولهذا فإنني أتبنى هذا الفكر في هذا الدليل، وأرغب أن تصبح أنت أيضًا مبرمجًا عمليًا حقيقيًا.
ختامًا
إذا تمكنت من إكمال جميع المهام السابقة، فتهانينا، لقد حققت دخول عالم البرمجة بشكل حقيقي. هذا يعني أنك لن تخاف من تعلم لغات جديدة، أو من التعامل مع واجهات برمجة التطبيقات المعقدة، أو من تعلم تقنيات محددة، بل ستجد الأمر سهلاً.
بالطبع، ستحتاج إلى الكثير من الممارسة، وسيظل ظهرك يؤلم، وستتعب من المشي، ولن تصل إلى الطابق الخامس بصوت عالٍ. لكنني أضمن أن لديك تحولًا فكريًا كبيرًا، وثقة عالية بنفسك، وسينظر إليك الآخرون بنظرة مختلفة، فبالرغم من أنك أنجزت دخول عالم البرمجة، إلا أنك أصبحت “نجمًا” في عالم الروح البرمجية.
لا، لقد أخطأت، حتى النجم الغني لا يملك قوة روحية قوية، فهو يشك في نفسه، ويظن أن الفقر يجعله لا شيء.
لكن، على أي حال، إذا قرأت هذا الدليل جيدًا، فستشعر بـ “الوقوف على القمة”.
شاهد النسخة الأصلية
قد تحتوي هذه الصفحة على محتوى من جهات خارجية، يتم تقديمه لأغراض إعلامية فقط (وليس كإقرارات/ضمانات)، ولا ينبغي اعتباره موافقة على آرائه من قبل Gate، ولا بمثابة نصيحة مالية أو مهنية. انظر إلى إخلاء المسؤولية للحصول على التفاصيل.
دليل المبتدئين في البرمجة - منصة تبادل العملات الرقمية المشفرة
دليل المبتدئين في البرمجة
مقدمة
اليوم أصبحت البرمجة مهارة متزايدة الأهمية: كمصمم، قد يساعدك فهم بعض أساسيات البرمجة على فهم عملك بشكل أفضل؛ وكمؤسس شركة ناشئة، فإن كونك مؤسس تقني يجعل العديد من أعمالك أسهل. وبالنسبة للمبتدئ الذي يرغب في الدخول إلى المجال، قد لا يعرف من أين يبدأ أمام كم هائل من المعلومات؛ وبعد أن تتجاوز مرحلة التعلم الأولي للمواد الأساسية، ستجد أن التعلم يصبح أكثر صعوبة، ومنحنى التعلم الحاد يجعلك تتراجع؛ أنت تعرف كيف تطبع نصًا على الصفحة، لكنك لا تعرف متى تبدأ مشروعًا حقيقيًا وفعّالًا؛ أنت لا تدرك ما الذي لا تعرفه بعد، وحتى أنك لا تعرف ما الخطوة التالية التي يجب أن تتعلمها.
محتوى هذا المقال لن يقدم لك فقط بعض النصائح التوجيهية، بل سيتضمن أيضًا دليلًا أساسيًا ومركزيًا لمدخل البرمجة. بالطبع، مسار خطوة بخطوة غير واقعي، وكل شخص لديه خصائصه، لذا فإن هذا الدليل للمبتدئين يهدف أكثر إلى إثارة تفكير القارئ، وفي النهاية يساعدك على تشكيل مسار تعلم يناسبك.
لكن يجب أن تنتبه: هذا المقال موجه لأولئك الذين يرغبون حقًا في تعلم البرمجة — أولئك الذين يملكون عزيمة قوية ويصرون على إنجاز شيء حقيقي، ولا يرضون إلا بعد أن يصنعوا شيئًا، ولا يكتفون بالتعلم دون تطبيق؛ وليس لأولئك الذين يقولون “سمعت أن البرمجة ممتعة”، فبرأيي، هؤلاء لن يدخلوا باب البرمجة أبدًا، ناهيك عن أن يصنعوا شيئًا لائقًا.
على الرغم من أن نغمة المقال تعتمد على ما يُعرف بـ “آراء قوية، التزام ضعيف” (Strong Opinions, Weakly Held)، إلا أن على القارئ أن يتشكك في صحة ما نكتب، تمامًا كما يتشكك في كل شيء حوله. وإذا كانت لديك أي أسئلة ذات صلة، فمرحبًا بك في النقاش المفتوح.
تعديل الحالة النفسية
تحديد الهدف
قبل أن تبدأ تعلم البرمجة، فكر في هدفك. عندما يكون لديك هدف نهائي، سيكون الطريق أكثر وضوحًا. فماذا تريد أن تكتب؟ موقع إلكتروني؟ لعبة؟ تطبيق iOS أو Android؟ أم أنك تريد أتمتة مهام مملة لتوفير وقتك لمشاهدة المنظر من النافذة؟ ربما فقط تريد أن تكون أكثر تنافسية في سوق العمل وتجد وظيفة جيدة. كل هذه أهداف ذات قيمة، وهي جزء من الدافع وراء تعلم البرمجة. بدون دافع، لن تتمكن من المضي قدمًا في رحلة التعلم الطويلة والمملة أحيانًا.
ربما يلهمك هذا الفيديو: “الأشياء التي لن تعلمها في معظم المدارس”
لا تتسرع
البرمجة السيئة سهلة. حتى المبتدئ يمكنه تعلمها في 21 يومًا. البرمجة الجيدة تتطلب تفكيرًا، لكن الجميع يمكنه فعل ذلك وتجربة الإحساس بالرضا الشديد الناتج عنها.
البرمجة السيئة سهلة. حتى المبتدئ يمكنه تعلمها في 21 يومًا. البرمجة الجيدة تتطلب تفكيرًا، لكن الجميع يمكنه فعل ذلك وتجربة الإحساس بالرضا الشديد الناتج عنها.
سواء في المكتبات التقليدية أو الرقمية، غالبًا ما تجد كتبًا سريعة مثل “تعلم X في 21 يومًا”، وتعدك بأنها ستجعلك تتقن التقنية خلال فترة قصيرة. Matthias Felleisen في كتابه “كيف تصمم برامجًا” يوضح بشكل ساخر توجه “الاختصار” هذا ويشير إلى مخاطره.
ما يُعرف بـ “الطريق المختصر” أو “الفضة السحرية” غير موجودة. قال الحكماء إن إتقان شيء يتطلب 10 سنوات أو 10,000 ساعة، أي “عشرة أعوام من طحن السيف”، فلا تتعجل، فالجهد لا يذهب سدى.
تنمية الاهتمام
معظم المبرمجين الجيدين لا يبرمجون لأنهم يتوقعون الحصول على أجر أو إعجاب الجمهور، بل لأن البرمجة ممتعة.
– Linus Torvalds
الانغماس في البرمجة، والبرمجة من أجل المتعة. الاهتمام هو مصدر لا ينضب للدافع، حافظ على هذا الشعور بالفضول، لكي تدمجه في سنواتك العشر/10,000 ساعة من البرمجة. البرمجة ممتعة، فهي فرحة الاكتشاف. فرحة الإبداع. رؤية عملك يظهر على الشاشة ممتعة. أن يندهش الآخرون من كودك ممتع. أن يمدح الناس منتجك، ويستخدمه جيرانك، ويناقشونه في وسائل الإعلام ممتع. يجب أن تكون البرمجة ممتعة جدًا، وإذا لم تكن كذلك، فابحث عن سبب عدم متعتها، وحله.
ابدأ التعلم
قصة تثير اليقظة
عندما دخلت المدرسة الإعدادية، بدأت أتعلم البرمجة، وللأسف قرأت العديد من الكتب السيئة المنتشرة آنذاك مثل “إتقان C++ في 21 يومًا”. لم تكن مشكلة كبيرة حينها، بل كنت أكتب بعض البرامج الصغيرة. لكن عندما حدثت أعطال في البرمجيات، لم أكن أعرف السبب، ولم أستطع حل المشاكل الكبيرة، وعندما كانت المكتبات الموجودة لا تلبي حاجتي، كنت أرفع يدي يأسًا. على الرغم من أنني كنت أبرمج يوميًا، إلا أن قدراتي كانت تتطور ببطء، وكانت مفاهيم “التكرار” و"الاستدعاء الذاتي" محدودة جدًا، وكأنني أستخدم الكمبيوتر كآلة حاسبة فقط.
بعد دخولي الجامعة، تخصصت في الفيزياء، وكنت أكرر حفظ المعادلات دون فهم كيف تم استنتاجها، وما علاقاتها، أو معانيها. كنت أتعلم كيف أحسب وأحل بعض المسائل الفيزيائية الشائعة، لكنني لم أفهم لماذا تعمل بهذه الطريقة، وما السبب وراء ذلك.
وعندما حاولت تصميم ألعاب حاسوب تعتمد على الفيزياء، واجهت نفس الصعوبات: لم أكن أستطيع حل المشاكل الجديدة، وتراكمت لدي مخاوف من مواجهة تحديات جديدة، وبدأت أتهرب من الفهم الحقيقي، وكنت أظن أنني يمكن أن أبحث في Google وأنسخ وألصق الحلول.
لكن، في إحدى محاضرات المرحلة الثانوية، تغيرت طريقة تعلمي تمامًا. شعرت لأول مرة بـ “فتح العين”، وأدركت أنني أملك فهمًا ضئيلًا جدًا لبعض المواد، بما في ذلك الفيزياء التي تخصصت فيها، وعلوم الحاسوب التي دراستها مساعدة لي.
عن تلك المحاضرة: كنا قد أنهينا للتو دراسة الكهرباء والنسبية، وكتب الأستاذ على السبورة هذين الموضوعين، ورسم خطًا يربط بينهما. قال: “افترض أن لدينا إلكترونًا يتحرك على طول سلك بسرعة نسبية…”، في البداية، كان يكتب المعادلات المعروفة للكهرباء والنسبية، لكن بعد عدة استنتاجات على السبورة، ظهرت معادلة المجال المغناطيسي بشكل سحري. على الرغم من أنني كنت أعرف هذه المعادلة منذ سنوات، إلا أنني لم أدرك في ذلك الوقت أن هناك علاقة عميقة بين الظواهر. الفرق بين الكهرباء والمغناطيسية هو مجرد “زاوية المراقبة”، وأدركت فجأة أنني لم أعد أبحث فقط عن “كيف” أفعل شيئًا، بل عن “لماذا”. بدأت أعود إلى الأساس، وأتعلم تلك المعرفة التي كان من المفترض أن أتعلمها جيدًا من قبل. هذه العودة كانت مؤلمة، وأتمنى أن تكونوا قد استفدتم من ذلك، ولا ترتكبوا هذا الخطأ أبدًا.
تأملات بعد اليقظة
هذه الصورة مأخوذة من كتاب Douglas Hofstadter “Gödel, Escher, Bach”. كل حرف فيها يتكون من حروف أصغر منه. على أعلى مستوى، نرى “MU”، حيث يتكون حرف M من ثلاثة مفاهيم كلية (Holism)، وU يتكون من مفهوم تقليل (Reductionism)، وكل منهما يحتوي على الآخر، والعكس صحيح. وعلى أدنى مستوى، ستجد أن أصغر حرف هو مكون من تكرار لـ “MU”.
كل مستوى من التجريد يحمل معلومات، وإذا نظرت إليه بشكل أحادي باستخدام نظرية الكل أو التحليل، فإنك لن تحصل إلا على “MU” (وفي بعض المناطق، تعني كلمة mu لا شيء). السؤال هو: كيف تحصل على أكبر قدر من المعلومات من كل مستوى؟ أو بعبارة أخرى، كيف تتعلم مجالات معقدة مثل البرمجة، التي تحتوي على العديد من المعارف؟
هناك مشكلة رئيسية في عملية التعليم والتعلم: غالبًا ما يركز المبتدئون على الصورة الكلية ويتجاهلون الأساسيات. على سبيل المثال، يرغب الطلاب في صنع روبوت، لكنهم لا يفهمون النماذج الفيزيائية وراء ذلك، أو أساسيات الإلكترونيات، أو أنظمة التحكم وأجهزة الاستشعار، مما يجعلهم غير قادرين على بناء شيء حقيقي في المستقبل، ويصعب عليهم التشخيص وحل المشاكل.
هناك فخ آخر: الاعتماد المفرط على النهج الشمولي (الكلية)، حيث يبدون فعالين أحيانًا، لكن بعد سنة أو سنتين، عندما يبتعدون أكثر عن الأساسيات، يصبح من الصعب عليهم العودة وتصحيح أخطائهم. عليهم أن يتخلوا عن مفاهيمهم القديمة، ويصبروا على التعلم خطوة خطوة، وهو أمر أصعب بكثير من التعلم من البداية.
لكن، لا ينبغي المبالغة في التحليل التفكيكي (التحليل إلى أجزاء صغيرة)، فالسعي المفرط نحو النظريات الكبرى قد يؤدي إلى ملل وركود، خاصة في علوم الحاسوب، حيث يواجه الطلاب خطر الانغماس في النظريات فقط، دون تطبيق عملي، مما يقتل الدافع.
يمكن تشبيه تعلم البرمجة بتعلم فن الطهي: إذا اشتريت كتب وصفات فقط، وطبخت بها لأجل أسرتك، فستكون بداية جيدة، ويمكنك إعداد أطباق لائقة. لكن إذا أردت أن تصبح طباخًا محترفًا، وتقدم أطباقًا فريدة، وتصبح “طباخًا كبيرًا”، فعليك أن تفهم أفكار الشيف وراء الوصفات، وتعلم النظريات، وليس مجرد تطبيق الوصفات بشكل عشوائي.
وإذا كانت مهمتك اليومية فقط قراءة الكتب النظرية، وبدون ممارسة، فستصبح طباخًا سيئًا، وربما لن تتعلم الطهي أبدًا، لأن الملل سيدفعك للاستسلام.
باختصار، البرمجة هي الرابط بين النظرية والتطبيق، وهي مجال يتداخل فيه علم الحاسوب مع التطبيقات العملية. يجب أن يكون أسلوب التعلم الصحيح هو: استكشاف ذاتي من أعلى إلى أسفل، مع تطبيق المشاريع، لاكتساب الحدس والدافع؛ ومن الأسفل إلى الأعلى، لبناء الأساس، مع فهم المبادئ العامة وتثبيتها.
كمبتدئ، يجب أن تركز على الجانب الأول، مع استخدام الجانب الثاني كمساعد.
أساسيات تصميم البرامج
“ما لغة البرمجة التي يجب أن أتعلمها؟” هو السؤال الأكثر تكرارًا من المبتدئين، لكن هذا سؤال خاطئ. يجب أن يكون السؤال الأول هو: “ما العناصر التي تشكل أساس تعلم البرمجة؟”
هناك ثلاثة أجزاء رئيسية في هرم المعرفة البرمجية:
int *foo() { int x = 0; return &x; }؟بالنسبة للمبتدئين في مرحلة التهيئة، سيكون من الصعب جدًا ومملًا أن يختاروا لغة C كلغة أولى، لأنهم يضطرون لتعلم هذه الأجزاء الثلاثة في آن واحد، قبل أن يتمكنوا من عمل شيء.
لذلك، لتقليل عبء تعلم “القواعد النحوية” و"أساسيات النظام"، يُنصح باستخدام بايثون كلغة أولى، على الرغم من أن بايثون ودود جدًا للمبتدئين، إلا أنه ليس مجرد “لعبة”، ففي المشاريع الكبيرة، نرى قوته ومرونته. بعد إتقان بايثون، يمكن تعلم C، لأنها ستساعدك على التفكير من منظور قريب من مستوى النظام، وفهم بعض مبادئ أنظمة التشغيل لاحقًا.
إليك دليلًا مرجعيًا لمرحلة التهيئة، بعد إكماله، ستبني إطارًا عامًا في ذهنك، يساعدك على استكشاف البرمجة من أعلى إلى أسفل. لا يوجد ترتيب محدد للمواد أدناه، يمكنك اختيار أي منها، وإذا واجهت مشكلة، فكر في تبديل المادة.
MIT 6.00.1x (مقدمة في علوم الحاسوب وبرمجة بايثون). على الرغم من أن لغة التدريس هي بايثون، إلا أن هذه الدورة تعتبر مقدمة ممتازة، تركز على المفاهيم والنماذج الأساسية في علوم الحاسوب، وليس فقط على تعلم لغة معينة. إذا لم تكن طالبًا في علوم الحاسوب، فهذه الدورة توسع آفاقك أثناء التعلم الذاتي؛ محتوى الدورة: المفاهيم الحسابية، برمجة بايثون، هياكل بيانات وخوارزميات بسيطة، الاختبار والتصحيح.
Harvard CS50x (جامعة هارفارد: علوم الحاسوب). دورة تمهيدية أيضًا، لكنها تكمل دورة MIT. لغة التدريس تشمل C، PHP، JavaScript + SQL، HTML + CSS، وتغطي نطاقًا وعمقًا معقولين، وتتيح لك الاطلاع على أحدث الإنجازات التكنولوجية، مما يحفز اهتمامك بالتعلم.
مهمة داعمة: قراءة “الترميز”
بعد الانتهاء من مرحلة التهيئة، سيكون لديك بعض الخبرة في كتابة الكود، وفهم معين للبرمجة. عندها، قد ترغب في تعلم تقنية محددة، مثل تطوير الويب، أو تطوير تطبيقات Android أو iOS، ويمكنك تجربة بناء أشياء بسيطة، وتقديم ردود فعل إيجابية لنفسك، وزيادة دافعك. لكن تذكر، لا تتعمق كثيرًا، فهذه التقنيات تحتوي على العديد من التفاصيل، وسيأتي الوقت لتعلمها لاحقًا؛ وأيضًا، لا تتعمق في الأُطُر أو اللغات المحددة الآن، فحان وقت تعلم أساسيات علوم الحاسوب العامة، ولا تحاول أن تسرق الطريق وتتعلم ما تريد مباشرة، فهذا طريق محكوم عليه بالفشل.
فماذا تفعل في مرحلة الدخول؟ عليك أن تعيد التفكير في البرامج التي كتبتها من قبل، وتفكر: لماذا صممتها بهذه الطريقة؟ كيف أكتب برامجًا أفضل؟ حاول فهم جوهر البرمجة: استخدام الحاسوب لحل المشكلات.
افترض أن:
X = وقت التفكير في حل المشكلة، أي “حل المشكلة”
Y = وقت تنفيذ الكود، أي “استخدام الحاسوب”
القدرة على البرمجة = F(X, Y) (X>Y)
لرفع قدراتك البرمجية، عليك تحسين X وY، وفهم وظيفة F(X, Y). قليل من الكتب تركز على هذه النقاط الثلاث، لكن هناك كتاب واحد حقق ذلك: “هيكلة وتفسير برامج الحاسوب” (SICP). هذا الكتاب يوضح لك هذه الأوجه الثلاثة، قبل قراءة SICP، يمكنك حل مشكلة بسيطة باستخدام بعض الدوال، لكن بعد قراءته، ستتعلم كيف تعقلن وتقسم المشكلة، مما يمكنك من التعامل مع مشاكل أكثر تعقيدًا، وهو قفزة هائلة في قدرات البرمجة، ستغير طريقة تفكيرك وحل المشكلات بشكل جوهري.
بالأكثر، لغة التدريس في SICP هي Scheme، مما يمنحك لمحة عن البرمجة الوظيفية، وكونها بسيطة جدًا، ستتمكن من تعلمها بسرعة، وتوجيه وقتك أكثر نحو فهم الأفكار البرمجية وحلول المشاكل المعقدة.
كتبها Peter Norvig عن تقييمه لكتاب SICP:
لأعطيك تشبيهًا، لو كان SICP عن السيارات، لكان موجهًا لمن يريد أن يعرف كيف تعمل السيارات، وكيف تُبنى، وكيف يمكن تصميم مركبات موفرة للوقود وآمنة وموثوقة للقرن الواحد والعشرين. أما من يكره SICP، فهم من يريد فقط أن يتعلم كيف يقود سيارته على الطريق السريع، مثل الجميع.
إذا كنت من النوع الأول، فإن قراءة SICP ستكون نقطة ربط بين التأسيس والمرحلة الأولى.
رغم أن SICP هو “كتاب تمهيدي”، إلا أن للمبتدئين بعض الصعوبة، وهنا بعض الموارد المفيدة جدًا:
بعد إتمام هذه المرحلة، ستبني نموذجًا برمجيًا خاصًا بك، ولن تكون عالقًا في تذكر المكتبات أو القواعد، وستدرك أن حفظ القواعد لا يعلمك حل المشكلات، وأن ما ستتعلمه بعد ذلك هو التطبيق العملي، وهو الوقت المناسب لممارسة المشاريع.
بالنسبة للمشاريع: للمبتدئين، المشاركة في مشاريع مفتوحة المصدر قد يكون مبكرًا جدًا، وبدلاً من ذلك، ابدأ بمشاريع بسيطة، مثل بناء موقع إلكتروني وصيانته، أو برمجة لعبة صغيرة وتطويرها تدريجيًا. إذا لم تكن لديك أفكار واضحة، فتابع “معمل التقطيع” أو اختر مشروعًا من “قائمة المشاريع الكبرى” التي تفضلها.
وإذا وجدت أن SICP صعب جدًا، فلا تفرض على نفسك، وتجاوزها، وابدأ بـ “مبادئ أنظمة الحوسبة” (The Elements of Computing Systems)، التي ستعلمك بناء حاسوب من بوابة NAND الأساسية، حتى يعمل على حاسوبك بشكل كامل.
هذه الكتابة سترافقك طوال مرحلة التأسيس، وهدفك هو إكمال جميع مشاريعها (بما في ذلك مترجم و نظام تشغيل بسيط).
لإتقان هذا الكتاب، ولتعزيز الأساس، وللتمهيد لمستقبل أكثر قوة، عليك أن تجهز نفسك في عدة مجالات (ملاحظة: لا يوجد ترتيب محدد هنا):
أساسيات أنظمة الحاسوب
بعد أن تتقن تصميم البرامج، وتريد فهم أعمق لعلوم الحاسوب، يمكنك الاطلاع على هذا الكتاب: “أنظمة الحاسوب: منظور المبرمج” (Computer Systems: A Programmer’s Perspective، 3rd Edition).
انتقد البعض الترجمة العربية لاسم الكتاب، لكن الحقيقة أن الكتاب هو منهج “مقدمة في أنظمة الحاسوب” من جامعة كارنيجي ميلون (CMU). تخصص علوم الحاسوب في CMU يميل أكثر نحو البرمجيات، والكتاب يركز على فهم كيف تنفذ البرامج داخل أنظمة الحاسوب، ويشرح التفاصيل الداخلية بشكل شامل.
إذا وجدت أن القراءة مملة، يمكنك متابعة دورة على Coursera بعنوان “واجهة الأجهزة والبرامج” (The Hardware/Software Interface)، وهي جزء من منهج CSAPP، مع نقل أهم التجارب المختبرية.
كما يمكنك مراجعة كتاب “لغة البرمجة C”، لاستعادة مفاهيم C الأساسية.
بعد إتمام هذا الكتاب، ستكون لديك قاعدة قوية في أنظمة الحاسوب، مما يمكنك من دراسة أنظمة التشغيل، والمترجمات، وشبكات الحاسوب، وغيرها. وعند دراسة أنظمة أكثر تقدمًا، ستجد أن مراجعة فصول منه، وتنفيذ الأمثلة برمجياً، يعزز فهمك النظري، ويجعلك ملمًا بكود عملي، ومرتبك من أعلى مستوى إلى أدنى، وتستطيع تتبع تدفق البيانات عبر الشبكة، والذاكرة، والذاكرة المخبأة، والمعالج.
أساسيات هياكل البيانات والخوارزميات
اليوم، يعتقد الكثيرون أن البرمجة (خصوصًا تطوير الويب) تعتمد بشكل رئيسي على استخدام كود الآخرين، وأن التعبير الواضح عن الأفكار أهم من إتقان الرياضيات والخوارزميات، فهل كل شيء مدمج في هياكل البيانات وخوارزميات البحث والفرز؟
هل العمل الحقيقي لا يتطلب ذلك، وما فائدة تعلم الخوارزميات؟
هذه الأفكار التي ترفع شعار “البرمجيون” وتؤمن أن البرمجة مجرد وظيفة، غير صحيحة. بدون أساس نظري قوي، ستواجه حواجز لا مفر منها.
هياكل البيانات والخوارزميات مترابطة، ويجب أن تتقن معرفة أي الخوارزميات وهياكل البيانات تصلح لحل مشكلة معينة بسرعة أكبر.
وهذا يتطلب أن تكون على دراية جيدة بهياكل البيانات والخوارزميات الشائعة، وليس بالضرورة أن تكتب الكود، بل أن ترسم المخططات على الورق، وتفهم الاستخدامات.
إليك موارد دراسية مقترحة:
موارد أخرى أساسية
هناك نقاط مهمة غالبًا ما يغفل عنها المبتدئون في مرحلة التأسيس:
ختامًا
لا ينبغي أن تخاف من المحتوى السابق، فدخول عالم البرمجة ليس مهمة في بضعة أسابيع. ستواجه العديد من التحديات، وعند العقبات، جرب تقنية “فرايمان”: قسم المشكلة إلى أجزاء صغيرة، وتعامل معها واحدًا تلو الآخر، ثم اختبر فهمك من خلال شرحها للآخرين.
بالطبع، ستظل هناك مشاكل لا تستطيع حلها، وعندها لا تفرض على نفسك، فغالبًا عند العودة إليها بعد فترة، ستجد الحل بوضوح.
إضافة إلى ذلك، هناك كتب أخرى مهمة، وتكرار قراءتها مفيد جدًا في مراحل التأسيس والتطوير.
وفي قائمة الكتب التي يوصي بها مجتمع المبرمجين على Stack Overflow، هناك اثنان في المقدمة:
مؤلف الكتاب، Dave، قال في بداية الكتاب:
أنت مبرمج عملي. لست متمسكًا بتقنية معينة، لكن لديك خلفية واسعة في العلم، وخبرتك في المشاريع العملية تمكنك من اختيار الحلول الجيدة في المواقف المختلفة. الجمع بين النظرية والتطبيق يجعلك قويًا. تعدل أسلوبك وفقًا للظروف، وتفعل ذلك باستمرار أثناء العمل. المبرمجون العمليون ينجزون العمل بشكل جيد.
هذه الكلمات، وأسلوب “الكتب العملية” الذي أسسه، أثر فيّ بشكل دائم، ولهذا فإنني أتبنى هذا الفكر في هذا الدليل، وأرغب أن تصبح أنت أيضًا مبرمجًا عمليًا حقيقيًا.
ختامًا
إذا تمكنت من إكمال جميع المهام السابقة، فتهانينا، لقد حققت دخول عالم البرمجة بشكل حقيقي. هذا يعني أنك لن تخاف من تعلم لغات جديدة، أو من التعامل مع واجهات برمجة التطبيقات المعقدة، أو من تعلم تقنيات محددة، بل ستجد الأمر سهلاً.
بالطبع، ستحتاج إلى الكثير من الممارسة، وسيظل ظهرك يؤلم، وستتعب من المشي، ولن تصل إلى الطابق الخامس بصوت عالٍ. لكنني أضمن أن لديك تحولًا فكريًا كبيرًا، وثقة عالية بنفسك، وسينظر إليك الآخرون بنظرة مختلفة، فبالرغم من أنك أنجزت دخول عالم البرمجة، إلا أنك أصبحت “نجمًا” في عالم الروح البرمجية.
لا، لقد أخطأت، حتى النجم الغني لا يملك قوة روحية قوية، فهو يشك في نفسه، ويظن أن الفقر يجعله لا شيء.
لكن، على أي حال، إذا قرأت هذا الدليل جيدًا، فستشعر بـ “الوقوف على القمة”.