كتاب صُدِرَ سنة ١٩٨٤م، كان مقدمة إلى علم الحاسوب في معهد MIT طيلة عقدين ونيف، ذاع صيته وطار في الآفاق حتى لُقِّب بكتاب الساحر Wizard Book، فما هذا الكتاب؟ ولِمَ سندرسه؟
تعريف بالكتاب
اسمه (هيكلة وتفسير برامج الحاسوب Structure and Interpretation of Computer Programs)، وصُدِر قبل ما أربعة عقود، سنة ١٩٨٤م، الكتاب يشرح الأصول والأساسات Principles التي لا تفنى على طول الزمان وتعاقب الملوان، فكل تقنية إنما تُشيَّد على تلك الأصول ومردها إليها.
قيل: «إنك متى أحكمت الأصول = استقام لك الصراط، ولهذا فالمعتمد في الهندسة أن تُحكِم الأصول لا أن تحكم تطبيقاتها. فكل لغة برمجة تعلمها الآن ستبلى بعد ١٠ سنين أو ١٥، ومثلها ستَبيد كل تقنية تطبيقية تعلمها. بل إن التغيُّرات في تسارع.
فلا تستمسكنَّ بالتقنيات، ولُذ بالأصول والأساسات = حينئذ تتأتى لك مجاراة تلك التغيُّرات».
الكتاب طال عمره لكن نفعه دائم ما انقطع حتى اليوم لشرحه الأصول والأساسات، وهو كتاب هامٌ وله عظيم نفع وله منزلة سامية.
لما رأيت أهله ذوي حفاوة به إذ تلقونه بالدراسة والتلخيص، فلو أنك بحثت عن حل لتمرين فيه لرأيتهم قد حلوا كل تمرين ورد في الكتاب، درسوه ولخصوه كله، وصفحاته ٨٠٠ صفحة، لما رأيت ما رأيت عزمتُ على دراسته وتلخيصه، ونشر ما ألخصه هاهنا في موقعنا بلغة عربية، ليكون علمًا يُنتفع به إن شاء اللّٰه.
سأدرس الكتاب معتمدًا على الكتاب نفسه وعلى المحاضرات التي أُلقِيت في معهد MIT لشرحه، وهن أربعون محاضرة، هذا رابطها، وكلها باللغة الإنجليزية، لكني ملخصها تلخيصًا يغنيك عنها إن شاء اللّٰه.
ماذا سنتعلم في الكتاب ولمن هو؟
الكتاب للمبرمجين، لمن كان مبرمجًا
سنتعلم في الكتاب: التجريد Abstraction واستعماله لتقليص التعقيد، وتصميم وبناء البرامج، وفهم العَودية وشرح بنى معطيات Data Structures، وأسلوب البرمجة الوظيفي functional programming paradigm، وكيف نصمم ونبني لغة برمجة، وحتى أنه سيعلمنا كيف نصمم ونبني مفسِّر للغة lisp باستعمال اللغة نفسها!
باقي الأشياء ندع الكتاب يخبرنا بها، وخلاصة الأمر كله فهم غائر يضرب في عمق الأصول، أصول إدارة التعقيد Complext Control، تعقيد الأنظمة والبرامج (الفقرة الآتية عنه).
سألخص المحاضرات وما أدرسه في الكتاب بأسلوبي، وسأعيد ترتيب مواضيعها (أي المحاضرة) حتى تكون في شكل أحسبه أقرب إلى الفهم وأسهل حسب الحاجة.
هيا لأحدثك عن التعقيد في البرمجيات، فالكتاب غرضه معالجته، وقبل أن نشرع جهز مشروبك المفضل. 🤩
إدارة التعقيد
الحواسيب معقدة لما تحويه من التفاصيل، والبرمجيات ليس بمعزلٍ عن ذلك، نواة لينكس مثلًا كم عدد الأسطر البرمجية فيها؟
لو سطَّرناها في كتاب فكم حجمه؟
ضخم جدًا. وما يزيد البرمجيات تعقيدًا أنها ليست بكيانٍ مادي، ليست كالسيارة تتحسسها بيديك، فلو تعطلت لن تجد شيئًا تمسكه لترى الخلل أين، وهذا ما يجعلها مغايرًا لغيرها.
كلما زاد حجم البرمجية أو النظام = زاد تعقيدها
البرنامج معقد جدًّا كلما كبر، لذا ليس متيسرًا أن تفهم كل السطور البرمجية في البرنامج جملةً واحدة.
قال في المحاضرة:
المعضلات العِظام تأتي حين تبني الأنظمة العملاقة، فلا يتأتى لآدمي أن يحيط في ذهنه بكامل هذا النظام العملاق وتفاصيله، وإنما يتأتى له ذلك باستعمال أساليب لإدارة التعقيد complexity controlling، وهذه السلسلة والكتاب كله، بل ولُبّ علم الحاسوب ليس إلا أساليب إدارة التعقيد!
والآن صار جليًّا واضحًا موضوع الكتاب، فالكتاب عن أساليب لإدارة التعقيد، تعقيد الأنظمة الكبيرة أو البرامج، ولو سبق لك البرمجة وبرمجت مشروعا متوسطا قد ترى بعض هذا التعقيد.
لكن ما هذه الأساليب التي ندير بها التعقيد؟
عدة أساليب يشرحها الكتاب، وأول أسلوب منها التجريد، وهو أول فصول الكتاب، ولن نذكر باقي الأساليب، ولما نصل لها سندرسها.
أول باب في الكتاب اسمه: التجريد بالإجراء
Building Abstractions with Procedures
وبدأ بتضمين quote، وضمن هذا القول:
«إن للعقل لسلطان على الأفكار، وشأنه في ذلك ثلاث:
١. الدمج، إذ يعمد إلى الأفكار البسيطة ويضمها في فكرة واحدة مركبة، وهذا منشأ الأفكار الكبرى.
٢. المقابلة، إذ يعمد إلى فكرتين، سواء كانتا بسيطتين أو مركبتين دون ضمهما، فيستنبط العلائق بينهما.
٣. التمييز والفصل، إذ يعمد إلى الفكرة ويفصلها عن الأفكار المصاحبة لها حتى يُجلِّيها فيميزها عن غيرها، وهذا اسمه التجريد Abstraction.
وبهذه الثلاث تُخلَق كل الأفكار». اهـ
ابقِ اسم الباب على ذُكْرٍ منك أبدًا، فكل موضوع فيه إنما هو عن التجريد، وما التجريد إلا لإدارة التعقيد، فلا تنس ما قدمنا وإلا ضعت في حيرة وتركت الكتاب غير آبهٍ بلا رجعة.
العملية Process

يقدم للباب الأول بذكر العملية، ويقول (مشبهًا علم الحاسوب بالسحر) إن «العملية عفريت يسكن الحاسوب».
العملية قد تكون حسابًا للجذر التربيعي لأي رقم، وقد تكون تحويلًا لعمرك من سنوات إلى أيام. العلمية هي ما تود من الحاسوب فعله، وقد تكون أي شيء. وظيفة المبرمج أن يكتب العمليات التي يمليها عليه رَبُّ العمل أو نفسه وحاجته.
الإجراء

بما أنها عفريت فكيف نستحضر ذا العفريت ونأمره، أي كيف ندير هذه العملية ونوجهها حتى تفعل ما نريد؟
يقول الكاتب مرة أخرى مشبهًا علم الحاسوب بالسحر إنا سنلقي تعويذة، تأمر العفريت وتوجهه لتأدية ما هو منوط به.
هذه التعويذة اسمها إجراء Procedure، وإن كنت مبرمجًا فأنت تعرفها باسم الوظيفة Function. استعملَ في المحاضرة لفظة دالة (Function) عند حديثه عن الرياضيات، أما عن الحاسوب فاستعمل لفظة إجراء (Procedure). بعضهم فرق بين الوظيفة والإجراء بأن الوظيفة ترجع قيمة أما الإجراء فلا. ليس بالأمر الجلل، فاستعمل ما تشاء، وظيفة أو إجراء.
عرَّفَ الإجراء في الكتاب بقوله: الإجراء/الوظيفة: نمط من القواعد تدار به العملية. صفحة ٢. أما في المحاضرة تفلسف وصعب كثيرًا.
فذهب يخبرنا عن:
١) المعرفة الإخبارية Declarative Knowledge التي تقول لك عن ماهية الشيء what is، مثلا هذه الوظيفة تحسب عمرك بالأيام،
٢) وعن المعرفة التفصيلية Imperative Knowledge التي تخبرك بكيفية تأدية الشيء how to، مثلا الخطوات بالتفصيل لكيفية تحويل العمر إلى أيام.
الأولى تخبر ولا تفصِّل القول، والثانية تفصِّل وتبيَّن الطريق وتصيره لاحبًا مستتبًا.
وجب التنبيه اسم Declarative وImperative تختلف ترجمتها لو كنا نقصد نماذج برمجة Programming Paradigm (ابحث عنها).
وهذا التفصيل من باب التجريد حتى تفصل كل شيء إلى أجزائه الأصلية. وإن قد برمجت فاسم الوظيفة معرفة إخبارية (تخبرنا بما ستفعله الوظيفة دون تفصيل)، أما تفاصيل الوظيفة الداخلية فمعرفة تفصيلية.
الصندوق الأسود
لتفهم ما مضى هب أن أمامك صندوقًا له فتحة من اليمين وأخرى من اليسار، وعلى واجهة الصندوق مكتوب: (حساب الجذر التربيعي)، في الجهة اليمنى تدخل الرقم ومن الجهة اليسرى ترى الخرج output؛ الرقم بعد تربيعه.

الصندوق الأسود أحسن مثال حتى تفهم المعرفة الإخبارية، والتي هي نفسها اسم الوظيفة، أما لو أردت فتح الصندوق لترى كيف يعمل وتفهم تفاصيله فأنت تود المعرفة التفصيلية. وضحت؟
لغة البرمجة Lisp
عرفنا العملية وأنها عفريت، وعرفنا الوظيفة (الإجراء) وأنها تعويذة تستحضر العفريت، لكن أي بأي لغة سنلقي التعويذة، فللسحرة لغتهم!
الكتاب يستعمل لغة scheme، المشتقة من Lisp، وهي لغة سهلة نتعلمها في ساعة ولا أبالغ.
غرض الكتاب تعليمك الأصول والأساسات Principles/Concepts لا لغة برمجة، وهذا الغرض غير محصور بلغة دون أخرى، وهذه اللغة (Scheme) مناسبة لتعليم الأصول لسهولتها وقلة الأشياء التي بها، فلن تتشعب في تعلم مواضيع اللغة حتى تشطّ بعيدًا عن غرض الكتاب، فبعض اللغات بحر لا تعلم آخره!
تدبر:
«التقى كارت غنديروث -وهو أحد المؤلفين الكبار في ال++C- بمخترع اللغة بيارن ستروسترب في إحدى المؤتمرات فسأله: كيف تقيم معرفتك في ++C؟ ليرد عليه ستروسترب بجواب صادم: 7 من 10».
اللغة (Scheme) سهلة، ليس فيها الشيء الكثير، حتى حلقات التكرار loops لا تحتويها مع أشياء أخرى غيرها، ونحن سنبنيها بأيدينا. فهم ضارب في الأصول!
حتى تطبق محتوى الكتاب وتشغل الرماز code المذكور سنثبت DrRacket، وهو بيئة تطوير متكاملة IDE للغة Racket المؤسسة على لغة Scheme.
وحتى يستعمل Scheme شغله (DrRacket) ثم اكتب في بداية الملف:
#lang scheme
ثم اكتب تحته ما سنتعلمه في الفصل الأول من الباب الأول، ألا وهو لبنات لغة برمجة.
الخاتمة
ها قد وصلنا إلى نهاية المقال، وهو مقدمة لمقال لسلسلة كاملة تلخص الكتاب، والله جل ثناؤه أسأل أن يجعل عملي كله صالحًا ولوجهه خالصًا ولعباده نافعًا إن ربي لسميع الدعاء.
وفي نهاية الأمر لا يسعني سوى أن أشكرك على حسن قراءتك لهذا المقال، وأني لبشر أصيب وأخطِئ، فإن وفِّقت في طرح الموضوع فمن اللّٰه عز وجل وإن أخفقت فمن نفسي والشيطان.
أرجو منك تقييم كفاءة المعلومات من أجل تزويدي بالملاحظات والنقد البناء في خانة التعليقات أو عبر حساب الموقع، والسلام عليكم ورحمة اللّٰه تعالى وبركاته.