مراجعة لبعض الكتب

كتبه بركات يوم الخميس, 02 حزيران 2016

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

درست العديد من المواد، ومرت علي عدة كتب، سأكتب عن خمسة كتب لازلت أراجعها حتى بعدما أنتهيت موادها:

كتاب Digital Design and Computer Architecture، هذا الكتاب من أفضل الكتب التي قرأتها من ناحية التنظيم وغناه بالمادة العلمية، يتحدث الكتاب تقريباً عن كل ماتراه على اللوحة الأم في الكمبيوتر مع تركيزه على بنية المعالج نفسه، حيث يدرس كيف تبنى الدرات الأساسية في المعالج مثل دارات العمليات الحسابية والمنطقية من دارات أبسط انتهاءً ببناء وحدة حساب ومنطق ALU متكاملة، ويدرس أيضاً كيف تمثل البيانات في الكمبيوتر كالأعداد الصحيحة وأعداد الفاصلة العائمة، وكذلك دارات التخزين بدأ من دارات التخزين البسيطة مثل الـflip-flops انتهاءً بالذواكر مثل الـDRAM والـSRAM، ثم يتحدث الكتاب عن الأسمبلي وكيف تحول إلى لغة آلة وكيف تبني العتاد الذي يفسر هذه الأوامر، وكيف تبني معالج باستخدام لغة أعلى مستوى مثل VHDL و Verilog وهي الطريقة العملية التي تصمم بها المعالجات، يتحدث الكتاب أيضاً عن أساليب تصميم المعالجات مثل معالجات الـsingle-cycle والـmulti-cycle والـpipelining، طرق الوصول للذاكرة والكاش، والـI/O وغيرها من المواضيع الخاصة ببنية الحاسب.

قد تلاحظ أن الكتاب يهم بالدرجة الأولى من يريد تصميم معالج، وهذا ليس من اهتمامتي لا الشخصية ولامجال تخصصي، لكنني لا زلت أراجع الكتاب بين فترة وفترة لتذكر بعض المواضيع، ففهم هذا الكتاب مهم لمن يريد كتابة برامج عالية الأداء والـoptimization، حيث تتأثر البرامج كثيراً ببنية المعالج والذاكرة وأشياء مثل الـpipeline flushing، والـbranch misprediction والـcache missing وغيرها، وكذلك لإشباع الفضول :).

كتاب Introduction to Algorithms، هذا الكتاب من أشهر كتب الخوارزميات وتدرسه الكثير من الجامعات، حيث يعلم مبادئ تحليل الخوارزميات وفهم أشياء مثل تعقيد الخوارزميات كالـbig-O، الكتاب يدرس العديد من الخوارزميات مثل خوارزميات البحث والترتيب وتراكيب البيانات الأساسية كالمصفوفات والقوائم المتصلة وجداول الهاش، وتحليل كلاً منها، أرى أن الكل يحتاج أن يفهم فهم عام عن كيفية خوارزمية معينة أو تركيب بيانات، لكن الحاجة لكتابتها من الصفر قلت كثيراً خصوصاً أن كثير من لغات البرمجة توفر الأحد الأدنى من تراكيب البيانات والخوارزميات الأساسية والشائعة، حيث تجد أن الكود محسن جداً micro-optimized قد يمر وقت طويل حتى يصل كودك لمثل كفاءته، إلا أنه بين فترة وفترته ستحتاج لتركيب بيانات أو خوارزمية قد لاتجدها مع مكتبات لغتك، أو تحتاج لمراجعته لفهم تركيب أو خوارزمية معينة.

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

كتاب Concepts of Programming Languages، هذا كتاب مهم للغاية ومتخصص بلغات البرمجة، حيث يدرس العديد من أساليب تصميم لغات البرمجة، الكتاب لايتحدث عن لغة برمجة معينة، بل يتطرق لكثير من اللغات خصوصاً اللغات التي بها أشياء تميزها، ويتحدث عن أشياء مثل البرمجة الإجرائية، البرمجة الكائنية، البرمجة الوظيفية، وكيف تطبق عادةً في لغات البرمجة، قواعد لغات البرمجة النحوية والصرفية وحتى نظرة على أساسيات بناء المترجمات، مفاهيم مثل المتغيرات والـscope وأنواع البيانات، الـruntime الخاص بلغات البرمجة والمسؤول مثلاً عن الاستثناءات وإدارة الذاكرة والكثير من الأشياء، هذا الكتاب مهم جداً لأنه سيسهل عليك تعلم وفهم أي لغة برمجة.

كتاب Compilers: Principles, Techniques, and Tools، يعرف بكتاب التنين، وهو متخصص بتصميم المترجمات وأحد أفضل الكتب في هذا المجال، الكتاب صدر على طبعتين الطبعة الأولى في الثمانينيات وهي مادرستها، والطبعة الثانية في 2006 وهي ماكنت أعتمد عليها وأراها أفضل من الأولى حيث تغير اسلوب الكتاب كاستخدام Java بدلاً من C، الكتاب يوضح كيف تبنى المترجمات بالتفصيل، من التحليل الصرفي والتعابير القياسية regex، والتحليل النحوي وأساليبه وأنواع المحللات النحوية، وكذلك توليد الكود وتحسينه، الكتاب متعمق بطبيعة الحال، وربما تقرأ الكتاب السابق إذا كنت تريد نظره عامة وتريد فقط كتابة مترجم بسيط، ويمكنك استخدام هذا الكتاب إذا أردت التعمق واستخدام تقنيات أفضل،البعض قد يعتقد أن هذه التقنيات مهمة فقط لمن يريد بناء لغة برمجة، وهذا ليس صحيح تماماً، بل كثير من هذه التقنيات مهمة حتى لكتابة لغات مختصة مثل domain specific languages DSL أو لغات الـscripting، قد تكتب تطبيق يستخدم هذه التقنيات لإضافة ميزة لغة بسيطة للاستعلام مثلاً، ويمكنك استخدام تلك التقنيات لتحسين قابلية استخدام البرنامج بجعل البرنامج يتساهل مع أخطاء المستخدمين، أو كتابة ملفات إعدادات خاصة ببرنامجك، فليس الأمر محصور على لغات البرمجة.

هناك بعض الكتب التي درستها ولم تكن بالكتب الجيدة، مثل كتاب System Software: An Introduction to Systems Programming، كتاب سيء جداً ومخيب، فليس له من برمجة النظم سوى عنوانه، صدقاً لا أبالغ، اطلع فقط على جدول المحتويات، عندما يقال برمجة النظم، فأتوقع كتاب يكون إكمال لكتاب أنظمة التشغيل، فبدل أن يكون عام ككتب نظم التشغيل، يكون كتاب برمجة النظم متخصص بنظام تشغيل معين غالباً لينكس، كيف تنشأ العمليات وخيوط المعالجة وتخصيص الذاكرة والوصول للملفات، مع فصل واحد على الأكثر عن تحميل البرامج باستخدام صيغة تنفيذية مشهورة مثل ELF، لكن أكثر من نصف هذا الكتاب يركز على تحميل البرنامج، بدأ من ترجمتها إلى تحميلها باستخدام لغة أسمبلي خاصة قبيحة تسمى SIC ونظام ملفات تنفيذي خاص (خمسة فصول لهذا الموضوع من أصل ثمانية!)، مع غياب تام لكل الأمور الأخرى.

من يريد تعلم برمجة النظم من أنصحة اختيار كتاب أفضل مثل The Linux Programming Interface مع كتاب Linux System Programming، أو كتاب Windows via C/C++ لويندوز، هذه الكتب عملية وممتازة لا أعتقد أنها تدرس في الجامعات.

كتاب Artificial Intelligence: A Modern Approach أحد الكتب التي حيرتني، وهو كتاب عن الذكاء الإصطناعي، الكتاب لم يعجبني بشكل عام ولن أنصح به كخيار أول على الأقل، أرى أنه من الكتب التي تراد لها أن تغطي كل شيء والنتيجة أنها لاتغطي شيء بالدرجة الكافية، لو نظرت إليه ستجد أنه إن أعطى مثال عن موضوع ما، أعطى مثال بسيط جداً ثم انتهى الموضوع، وعند التطبيق تجد أن هذا الكتاب ذو الألف صفحة لايفيديك كثيراً، صديقي كان يشاركني نفس الرأي، المؤسف أنني لا أعرف بديل آخر جيد له.

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