نصيحة ذهبية: قلل اعتماديات برامجك قدر الإمكان
جزاك الله خيرا أخي وائل
أنا كنت أضع هذه القاعدة نصب عيناي دائما حيث كنت أحرص على أن أستخدم إضافات حتى لو كانت من مايكروسوفت نفسها طالما أنها لم تأتي افتراضيا مع المكتبة الأساسية.
إلا أنني غيرت نظرتي مؤخرا فقد ثبت لي أن استخدام أدوات وإضافات من قبل طرف ثالث ومدفوع الثمن سيجعل من تطبيقك متقدم على كثير من أقرانك.
أثناء عملي الأخير على تطبيق WPF وبعد البحث واستقراء الآراء والمقارنات اتخذت القرار باعتماد حزمة DevExpress و تم الاشتراك لمدة عام
وحقا حصلت على مميزات كنت سأقضي الكثير من الوقت عدا احتمال الخطأ والمشاكل حتى أصل إلى نصف تلك الميزات سواء على صعيد الواجهات و الستايل و سواء على صعيد الأداء والقوة وقلة الأخطاء
خصوصاً أن كثير من التطبيقات العربية قد تستبعد فكرة دفع مبالغ لقاء برامج من طرف ثالث فتحصر فريقها في استخدام المتاح أو المجاني ولهذا قلت أن اعتمادها سيجعلك تتقدم عن شريحة واسعة من التطبيقات المشابهة.
ولكن أن معك فأؤيد أن لا يتم استخدام برمجيات مضافة لأكثر من شركة لنفس الاختصاص حتى لا يحصل تشابك كمن يركب برنامجي حماية معاً .
و جزاك الله خيراً.
بالفعل فإن المكتبات و الإضافات التي تحس بأنها تعطي لبرنامجك قيمة و قوة إضافية شيء مطلوب بالفعل، كما أن برامجك التي تبنيها بنفسك و لا تطلب من الآخرين الاشتراك فيها (أو علي الأقل يكون عدد المشاركين فيها قليلاً للغاية) يمكن التصرف فيها بحرية أكبر. و المهم هنا هو إضافة ما يحتاج إليه البرنامج فقط بدون زيادة أو نقص، و كذلك تسهيل الأمر علي المشاركين قدر الاستطاعة (إن وُجدوا).
بعبارة أخرى هذه نصيحة للقيام بـ Reinventing the Wheel
يعني طرحت مثال لOpenSSL هل تريد أن نكتب نسخه خاصه بنا في كل مشروع بسبب أن مثل الثغرة الجديدة قد يحدث؟ ومن قال أن النسخه التي سيكتبها المبرمج لن يكون بها ثغرات؟ وهل يعرف المبرمج أن تطوير مثل هذه المكتبة قد يحتاج الى سنوات + Knowledge، بينما تطوير البرنامج مع هذه Dependeicies قد يأخذ عدة شهور فقط ..
قمت بعمل Forensic-Like Application من فترة، وكعادة هذا البرامج هي تقوم بالبحث داخل الملفات في جهازك واستخراج كل ما يمكن استخراجه، البرنامج مكتوب بجافا ولو قلت لك عدد ال Dependices لما صدقت ، وما زلت اصر على ان هذا مفيد للBusiness ، مثلاً هل تريد أن اكتب PDF/HTML.. Perser لكي انجز مهمه واحدة في المشروع؟ هل تريد أكتب Charting Library لكي ارسم كم Line Chart مثلاً؟ هل تريد ان اكتب محرك Indexing كامل بدلاً من استخدام شيء جاهز؟ وغيرها الكثير من الFunctions وحتى ابسط الأمور مثل Logging لو أردت ان تكتب واحدة في Multithreads Application لأخذت من وقتاً..
غالب الLibrary تكون لشيء مهم، فلا يوجد Library لطباعه hello world يمكنك الاستغناء عنها بسهولة، والنصيحة الأفضل هو ان ترى ال License للDependcies واخر تطوير حصل وهل لها مجتمع Active، وهل هناك Porting لها، كل هذه الأمور تبين لك مدى ثقل المكتبة وأنك تستطيع الاعتمادية عليها..
حالياً يمكنك استخدام اي Dependency Management مثلاً Maven أو Nuget حتى يدير لك ال Dependency بسهولة في المشروع .. ربما في c-Make مع مشاريع السي++ فالأمور اعقد قليلاً ولكن ما زال هذا الأمر ليس سبباً في ترك ال Dependencies.
في عنوان المقال هناك كلمة قدر الاستطاعة التي تجعلني أستغرب من استنتاجك بحثي للناس علي إعادة اختراع العجلة !
و قد قلتُ في بداية المقال:
و هكذا يمكنك أن تركز جهدك كله علي الأمور التي يتميز بها برنامجك بدون الحاجة لبناء ما بناه الآخرون بالفعل، كما أنك بهذه الطريقة ستستفيد في المستقبل من التحسينات و الإصلاحات التي يطبقونها علي مكتبتهم بدون أي جهد من ناحيتك.
و كذلك قلتُ: المشكلة أن المبالغة في عدد المكتبات الخارجية التي يستعين بها البرنامج لأداء عمله يؤدي في النهاية إلي تعقيد الأمور
أي أنني أتحدث عن الاعتماديات التي يضعها المبرمجون بدون حسبان و يمكن الاستغناء عنها، أو علي الأقل بناؤها بقليل من الجهد داخل الأكواد الرئيسة نفسها بحيث تصير جزءاً من البرنامج. و هكذا فإننا نتحدث جانبين مختلفين من العملية.
و مرة أخري لا أدري كيف استنتجتَ أنه من الممكن أن أدعو إلي بناء شبيه لـOpenSSL من الصفر بدلاً من الاعتماد علي الموجود حالياً، رغم أن المقال يقول العكس !!!
هات لي مثال واحد على مكتبة يمكن الاستغناء عنها بسهولة والتي يضعها المبرمجين بدون حسبان ؟
أغلب المكتبات هي بتحل مشكلة معينة وتحتاج ل domain expert لكي يبنيها ابدء من مكتبات التشفير والضغط ومعالجة الصور وحتى ال Encoding وCRC وحتى الAPI مثل Twitter API والخ
وكلما تزيد المكتبات ويقل الكود لديك كل ما كان المشروع أقل خطراً، لأن المكتبات (سواء كانت تجارية أو مفتوحة المصدر) تتطور والمشاكل تتحل بدون اي تدخل منك. لذلك النصيحة الذهبية "لا تكتب اي شيء سوى ال Business Code" الذي يحل المشكلة واستخدم المكتبات الخارجية لحل اي شيء آخر، واستخدم Depenency Manager وسوف ترتاح كثيراً.
فقط في حالة كان لديك domain expert ولديه الوقت وسبب ما فليس هناك مانع من عدم الاعتماد على مكتبة مشابه، مثلاً انظر لأغلب مشاريع Google ستجد حتى ال Collection API يبنوها بأنفسهم (الى ان بنو مكتبة Guava)، بينما مثلاً هناك مبرمج عادي هل ننصحه بكتابة Stack/Linked List بنفسة أو اي Complex Structure / Algorithm ؟
عدد المكتبات الخارجية الذي لا يؤثر على تعقيد الكود بالعكس يسهله، التعقيد في ال Build System وهناك حلول لهذا الأمر..
التعليقات