1- طبق مبادئ البرمجة الوظيفية Functional Programming

تعلم مبادئ البرمجة الوظيفية حتى اذا كنت مقتنع بانماط اخرى للبرمجة (مثل البرمجة الموجهة للكائنات Object Oriented Programming) فيسختلف اسلوبك و جودة الكود الذي تنتجه تماماً بعد فهمك للمبادئ العامة و الاتجاهات الفكريه التي تحكم البرمجة الوظيفية، عالم مثير و شيق من الافكار الجديدة عليك و التي ستغير طريقة تفكيرك الى الافضل بالتأكيد.
المثير في الامر انه في الاونه الاخيره انتشرت لغات البرمجة الوظيفية التوجه بشكل كبير جداً و اصبحت اخر صيحه في موضة لغات البرمجة بعد ان ظلت لسنوات طويله مشهوره بأنها لغات اكاديميه بحته لا تصلح للبرمجيات العمليه في الصناعة، لذا من الممكن ان دراستك لهذه المبادئ ان تشجعك لدراسه لغه من لغات البرمجة الوظيفية لتواكب موضة لغات البرمجة و تنافس نجوم البرمجة في العالم!
شفافيه المرجعية (Referential Transparency) من المبادئ الهامة في البرمجة الوظيفية Functional Programming و التي تعني ان الدوال (Functions) تنتج نفس النتيجة عند كل مره يدخل لها نفس المعطيات (arguments) بغض النظر عن متى و اين تم استخدام تلك الداله، و الذي يعني عدم الاعتماديه على الحالة المتغيره للكائنات او التغيرات (mutable state) و هو الامر الاهم في لغات البرمجة الوظيفية، تفادي المتغيرات المشتركة (الحالة المتغيره mutable variables/state).
ستشعر بقيمة هذا التوجه اذا كنت من مستخدمين نظام “البرمجة المبنيه على الاختبار” و هو اسلوب في البرمجة يعتمد على كتابه اختبارات للكود المطلوب كتابنه قبل كتابته و يسمى بالانجليزية Test Driven Development TDD و في هذا النظام يكون عليك فصل مكونات البرنامج الى قطع صغيره يسهل اختبارها بواسطه اكواد اختبار للوظائف (Unit Tests) و هذا يجبرك ان تكون عمارة البرامج مبنيه على شفافيه المرجعية حتى يتسنى لك عزل جزء معين و اختباره بشكل منفصل. اذن فمبدأ الشفافية المرجعية يساعدك على كتابه كود اكثر اختبارية و اوضح في الاستخدام و “متوقع”!
بالتأكيد هذا المبدأ لا يصلح في كل الاحوال و يجب ان تراعى مبادئ البرمجة الكائنية بشكل واضح لكن مع فهمك للموضوع بشكل عملي ستستطيع ان تحدد متى و كيف يمكن تطبيق هذا المبدأ بشكل يجعل البرنامج مُصمم بشكل اكثر استقلاليه و كل المكونات مستقله و متفاعله بشكل مرن
2- إسأل دائما “ماذا كان ليفعل المستخدم هنا؟” فأنت لست المستخدم

من المواضيع الهامة جداً الاهتمام بالمستخدم فتذكر دائماً انك تفكر بمخ المبرمج و ليس المستخدم فهناك فارق كبير بين المستخدم و المبرمج (المطور) و هذا الفارق يكمن في ان هناك العديد من الاشياء يعتبرها المبرمج من “البديهيات” او من الامور الواضحة و التي لا تحتاج للتوضيح في حين ان المستخدم يرى الامور من زاوية اخرى. ايضآً من الامور الهامة هي ان المبرمج يريد ان يظهر كل امكانيات البرنامج و ذلك قد يتم بطريقة قد تربك المستخدم بسبب وضع كل خصائص البرنامج في مكان واحد او محاولة وضع كل ما يخطر على بال المبرمج من خصائص او مميزات جديدة بدون دراسة ما يريده المستخدم. لحل هذه المشكلة فكر بشكل ابسط و اسأل عينه حقيقية من مستخدمين محتملين عن كل ما يدور في خاطرهم و اسألهم عن ما اذا كانت المميزات التي تفكر في دمجها في برنامجك هي “اساسية” لهم ام لا.
3- لا تتعلم لغة البرمجة فقط لكن تعلم الثقافة المحيطة بها

في بعض اللغات قد يكون طبيعياً و منطقياً ان تجد الكثير من الدوارات (loops) لكن ستجد نفس الكود يثير الدهشه و الانتباه اذا كتبته في لغة برمجة مختلفه، لأن في اللغة الثانيه السائد هو استخدام ال recursion، اذا كنت واحداً من الذين يكتبون نفس نمط و اسلوب الكود في كل لغات البرمجة فأنت بحاجة ماسة الى تلك النصيحة.
لغات البرمجة كاللغات الحية، يحيط بها ثقافه و عادات و تقاليد. كل لغة لها اسلوبها البلاغي في التعبير و تستطيع ان ترى هذا بوضوح في اللغات الحية، فمثلاً قراءة القرآن الكريم باللغة العربية تختلف تماماً عن اي نسخة مترجمة الى اي لغة اجنبيه، كذلك اي كتاب ادبي فرنسي له طعم آخر اذا استطعت ان تقرأه بالفرنسيه و ليس مترجم. في كتاب The Pragmatic Programmer ينصحنا “اندي هانت” و “ديف توماس” ان نتعلم لغة برمجة جديدة كل عام، لا تستسلم لنفسك و انت تحاول ان تكتب اكواد طويلة و دوال static كثيره و تبعد عن البرمجة الكائنية التوجه في لغة جافا لأنك قادم من ثقافة لغة ال C، عندما تتعلم لغة برمجة، احتضنها و تعلم و افهم الثقافة المحيطة بها. احياناً يكون من الممتع جداً ان تفهم الاسباب وراء تطوير اللغة بهذا الشكل من احد مطوريها و يغير هذا في طريقة تفكيرك و تعبيرك في هذه اللغة لتصبح في النهاية كالشعراء يستخدم افضل ما في اللغة للتعبير عن افكاره
الفائدة الاكثر اهمية هي انك بعد ان تتعلم عدة لغات ستجد نفسك تكتب اكواد بشكل مختلف تماماً في اللغات التي كنت تتقنها قبل ان تتعلم غيرها، سيتكون لديك حس راقي في الكتابه و ذوق يمزج افضل ما تعلمته في كل لغة من اللغات لكن بثقافة الغة التي تكتبها، انه امر حقاً ممتع.
4- الجمال في البساطة

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

في اغلب الاوقات ستجد نفسك تلوم بيئة العمل انها سبب المشكله التي تواجهك او نظام التشغيل و احيانا ال compiler و ستلعن اكواد الاخرين من النظرة الاولى و سترى دائماً ان الكود الخاص بك هو اجمل و اكمل ما يكون و لا يمكن ان يكون به مشكله….في الحقيقة ان تريد ان تفيق من احلامك
اكثر من 90٪ من المرات التي رأيت فيها اشخاصاً يزعمون ان الخطأ الذين يواجهونه بسبب اكواد اناس اخرين، كانوا مخطئين! في الحقيقة النسبة اكثر من هذا لكن هؤلاء هم من لديهم الشجاعة بالاعتراف
تذكر دائماً هذه النصيحة و اجعل اخر ما تفكر فيه هو اكواد الاخرين لأن هذا يشتت تفكيرك عن النظر في الكور الخاص بك و سيجعلك تشعر بالخجل عندما يأتي احدهم ليقول لك ان الخطأ في الكود الخاص بك و يستطيع اثبات ذلك في ثواني، لأنك ببساطة انشغلت عن مراجعة عملك و رميت كل الخطأ على الآخرين. تذكر انه حتى في اكثر الامور التي قد تبدو غير معقوله على الاطلاق، قد يكون هذا خطؤك.