Faragiri

تعلم البرمجة

البداية ليست اختيار لغة. الترتيب الذي يعمل، والجدار الذي يقف عنده من يتعلم بالعربية بعد أربعة أشهر، وما يفتحه.

6الأقسام
8دقائق القراءة
1العمق

البرمجة

ما يتضمنه تعلم البرمجة فعلا

كل فرع عمل قائم بذاته وله طريقة فشل خاصة به. المادة العربية المتاحة تقع في فرعين، والوقوف يقع في الثالث.

  • لغة واحدةأصغر الأجزاء، وهو الجزء الوحيد الذي يدرس بالعربية
    • القواعد
    • الأنواع
    • المكتبة القياسية
  • الأدوات حول اللغةهنا تضيع الأسابيع، وأسماؤها كلها لاتينية
    • الطرفية
    • Git
    • المحرر
    • الحزم
  • إخراجه من جهازكلا شيء يعمل حتى يعمل في مكان آخر
    • النشر
    • السجلات
    • التراجع
تعلم البرمجة
  • التفكير في خطواتتحويل رغبة إلى ترتيب عمليات
    • التفكيك
    • الحالة
    • الحالات الطرفية
  • قراءة كود غيركالمهارة التي تفصل السنة الثانية عن الأولى
    • تتبع المكدس
    • التوثيق
    • المصدر

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

هدى تدير مخبزا صغيرا في عمان، وكتبت سطرين بلغة Python يرتبان أسماء العاملات والعاملين معها ويطبعانها. البرنامج عمل من أول مرة. القائمة خرجت مرتبة، وترتيبها خاطئ.

الأسماء خمسة في ملف نصي، اسم في كل سطر: إبراهيم، أحمد، آمنة، بشرى، عادل. أي دفتر عربي يضعها بهذا الترتيب. البرنامج أخرجها هكذا: آمنة، أحمد، إبراهيم، بشرى، عادل.

  • names = open("names.txt", encoding="utf-8").read().split()
  • print("\n".join(sorted(names)))

الخلل ليس في السطرين. الترتيب الافتراضي يقارن أرقام الحروف، لا مواضعها في الأبجدية، وصور الألف أربعة أرقام لا رقم واحد: آ هي U+0622، وأ هي U+0623، وإ هي U+0625، والألف المجردة ا هي U+0627. الألف بهمزة والألف بلا همزة رقمان مختلفان، فتفترق الأسماء قبل أن يصل المقارن إلى الحرف الثاني أصلا.

الإصلاح ثلاثة أسطر ولا يحتاج حزمة خارجية:

  • from unicodedata import normalize, combining
  • fold = lambda s: "".join(c for c in normalize("NFD", s) if not combining(c))
  • print("\n".join(sorted(names, key=fold)))

تفكيك النص إلى NFD ثم حذف العلامات المركبة يوحد صور الألف، فتعود القائمة إبراهيم، أحمد، آمنة، بشرى، عادل. لهذه العلة وجه ثان أسوأ، يظهر عند المقارنة لا عند الفرز: الاسم المنسوخ من ملف يفصل الهمزة عن الألف والاسم المكتوب مباشرة شكلان متطابقان على الشاشة وغير متساويين في المقارنة، فيسجل العميل مرتين ولا يجده البحث بأي من الكتابتين. توحيد كل نص داخل إلى NFC عند حافة البرنامج يغلق هذا الباب. ولا يظهر شيء من هذا في درس مكتوب بالحرف اللاتيني، لأن اللاتيني صورة واحدة لا تحتاج توحيدا.

ثلاثة من الثمانية تصح أينما انتهى الكود، وخمسة أماكن لكل مكان منها ما يقتل البرنامج فيه

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

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

القسمة على اللغة هي التي تعرفها الرفوف العربية: دورة اسمها Python، وأخرى اسمها JavaScript، وثالثة اسمها Java. وهي تفشل لسبب واحد: درس اسمه Python عليه أن يغطي طلب ويب وتدريب نموذج وحلقة لعبة وبرنامجا يعيد تسمية ملفات، فلا يقول إلا ما يصح على الأربعة، وهو القواعد. لذلك اللغة موضوع من ثمانية هنا لا المستوى الأعلى. ومن أنهى ثلاث دورات كهذه يملك ثلاث لغات ولا يملك مكانا واحدا يضع فيه برنامجا.

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

لغة واحدة، تمسك حتى يعمل شيء منك على جهاز لا تجلس أمامه

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

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

والأساسيات ليست مقررا يفرغ منه أولا مهما أوحى ترتيب الجامعة بذلك. تصل في اليوم الذي يسجل فيه طلبان في الثانية نفسها فيأخذان الرقم نفسه، فيتبين أن قراءة الرقم ثم زيادته ليستا خطوة واحدة. والدرس نفسه مقروءا في فصل مجرد لا يبقى أسبوعا، وذلك هو الترتيب الخاطئ الآخر: الأساسيات كلها أولا، قبل أن يوجد برنامج تظهر فيه.

المفترق

المفترق الذي يلي أول برنامج يعمل

الطريقان يشبهان التقدم. وواحد منهما فقط ينتهي بشيء يفتحه غريب.

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

الفرع الثاني لا يلغي الأول: الدورة التالية تؤخذ بعده وقد صارت أسرع. المفترق في الترتيب لا في القيمة.

الجدار الذي يخص هذا القارئ خطأ لا يستطيع أن يبحث عنه

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

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

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

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

الجدار

منهج الموضوع الذي لم يقل لك أحد إنه موضوع

أربعة أشهر من التقدم تنتهي عند ضفة، والضفة المقابلة أسبوع أول لشيء آخر له مستوى مبتدئ خاص به.

حيث أوصلتك أربعة أشهرقواعد وحلقات ودوال، وشيء جديد كل أسبوع
  1. 01الطرفية (terminal)، وأن المسار شيء قائم بذاتهالمكان الذي ينفذ منه الأمر يقرر ما يستطيع أن يجده
  2. 02ملف القفل (lockfile)، لتكون الإصدارات إصداراتك عن قصدكود غيرك مثبتا، لا أحدث ما وجد اليوم
  3. 03مستودع (repository)، قبل أن يوجد ما يضيعتراجع يبقى بعد إغلاق الحاسوب
  4. 04جهاز واحد لم تعده أنتليس عليه شيء من سنواتك الأربع، وهذا هو المقصود
جهاز غريب يشغل برنامجكالشخص نفسه، وموضوع آخر، وأسبوعه الأول

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

أربع أدوات تفتح من أي بلد عربي، وواحدة منها تحسم أي درس عربي يتبع

VS Code هو المحرر الافتراضي منذ 2016 تقريبا، وهو مجاني ومصدره مفتوح. حل محل Sublime Text وAtom، وAtom أرشف في ديسمبر 2022، بعد أربع سنوات من شراء صانع VS Code لصانعه. والخطأ الشائع هنا عربي: تنصيب حزمة تعريب الواجهة، فتترجم القوائم وتبقى رسائل الخطأ وأسماء الأوامر لاتينية، فينقطع ما بين ما يراه وما يستطيع البحث عنه.

Git كتب سنة 2005 لنواة لينكس، وحل محل Subversion وعادة نسخ المجلد قبل تغيير شيء فيه، وهو مجاني ومفتوح المصدر. وهو موضوع قائم بذاته لا نصيحة عابرة، ويقع تحت إدارة الإصدارات. أما الوصول فيقال كما هو: GitHub وnpm وPyPI تفتح من الخليج ومن مصر والشام والمغرب العربي بلا وسيط ولا حيلة، وفي سوريا والسودان واليمن وليبيا يرفض بعضها التسجيل أو يعطله.

Python 3 هي الأداة التي تحسم قيمة أي درس عربي مطبوع. دعم Python 2 انتهى في 1 يناير 2020، والفرق يظهر في أول سطر: أمر print بلا قوسين يرد عليه المفسر بسطر واحد:

  • SyntaxError: Missing parentheses in call to 'print'

أكثر ما يجده الباحث بالعربية ملف PDF ممسوح ضوئيا، والممسوح قديم بطبيعته، فهذا السطر وحده يفرز الدرس الذي يستحق ساعة من الذي لا يستحقها. Python تنزل مجانا من أي بلد عربي بلا حساب ولا بطاقة.

المساعد داخل المحرر أكبر تغير في هذا العمل منذ صار GitHub Copilot متاحا للجميع سنة 2022، ونصف من يقرأ هذا يتعلم بواحد منها. حل محل البحث عمن سبق أن سأل سؤالك. هو جيد في الكود الذي كنت ستكتبه بنفسك ببطء، وهو أكثر الكود. ومخطئ بثقة في كل ما هو غير مألوف، بمخرجات منسقة تشبه الكود الذي يعمل، والمبتدئ لا يميز أيهما لأن التمييز بينهما هو الموضوع نفسه. النسخ المجانية تكفي للتعلم، والاشتراك المدفوع يحاسب بالدولار، وتلك عقبة في مصر والشام والمغرب العربي أكثر منها في الخليج. والعربية حالة غير مألوفة بامتياز: أعطه فرز الأسماء في أول هذه الصفحة، وقارن جوابه بما يعمل. هي الحركة نفسها التي تطلبها هندسة الأوامر.

إشارة الشهر الثالث مستودع لم تكتبه أنت

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

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

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

الإشارة

البرنامج نفسه في أربع حالات، وفي كل حالة منك أقل

لا يتغير في الكود شيء بين الإطار الأول والأخير. الذي يتغير مقدار ما يتكئ عليه من جهازك أنت.

  1. 01يعمل حين تضغط تشغيلداخل المحرر الذي نصب كل شيء نيابة عنك
  2. 02يعمل في طرفية فتحتهاالجهاز نفسه، ولا شيء يساعد
  3. 03يعمل من نسخة جديدة من المستودعأول جرد صادق لما لم تكتبه في مكان ما
  4. 04يعمل حيث لم تسجل دخولك يوماالإطار الذي يكف فيه البرنامج عن أن يكون لك

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

أساسيات البرمجة ولغات البرمجة أول بابين، والخمسة الباقية تختار بحسب أين ينتهي الكود

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

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

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

بجانب هذه العقدة

فوق هذه العقدة