م. علي ماهر كتب
بالنسبة لرأيي في برنامج "الخليل":
Windows XP SP2, Xeon 2GHz, 2GB
1/ في اللغة وما إليها
a) البرنامج يتجاهل التشكيل الموضوع، يقوم بحذف كل العلامات ثم توليد أخرى من البداية هذا تصرف حكيم مبدئياً لكن عدم الثقة في صحة النص المدخل من المستعمل تطرف لا مبرر له في برنامج غير تجاري، اقترح إزالة القيود ثم تجربة إدخال نصوص محكمة التشكيل، فأول طريقة للاختبار تكون بمدخلات يمكن للمطورين توقع نتائجها.
b) بالنسبة للبند أعلاه اقترح التحقق من علامات التشكيل بدلاً عن خرطها عن النص هكذا فهذا يضيف قتامة (opacity) للبرنامج يسهل بسببها عمل المبرمج ولكنها تضيف غموضاً يسبب كثافة النتائج فإن كان لا بد من خرط التشكيل أقترح إدراج النتائج للنص الأصلي أو الأفضل التصرف فيها كما يلي:
a. النص المجرد من التشكيل
b. النص المحقق بعلامات التشكيل من وضع البرنامج
c. النص بلا تدخل من البرنامج (التشكيل الأصلي)
c) البرنامج يتجاهل أسماء الأعلام (شرب أحمد الحليب) هذا ممتاز في هذه المرحلة. اقترح إضافة فرضية أن كل الأسماء وبعض الأفعال يمكن أن تكون أعلاماً أيضاً ثم تنقيح الفرضية بإدراج القوالب المحتملة وعرضها مع النتائج.
d) طريقة العرض قد تبدو مناسبة في مرحلة الاختبار لكن إذا أخذنا جملة (شرب أحمد الحليب) فمن الأفضل تهيئة العرض بحيث يكون كما يلي: شَرِبَ أحْمَد الحَليبَ يليها كل وصفها التصريفي ثم ذات الجملة بالتشكيل الذي يليه. هذه المسألة ليست صعبة برمجياً فقد قطع مطورو البرنامج الشوط الأطول بتجهيز كل تلك الجداول والقوالب، وأنصح بعدم التورط في إخراجها تباديلاً رياضية.
e) البرنامج صعب التعديل من ناحية اللغة، لا أعرف الوقت الذي استغرقه مطوروه في إعداد كل هذه الجداول أو البرامج التي نسقتها لكن إذا أراد أي شخص أن يشارك في التطوير يجب عليه معرفة الطريقة التي يتم بها إيداع صيغة أو قالب معين، هذا غير عملي، عدد شفرات الجذور لخمسة حروف فقط من فئة الأفعال بلغ المليون هذا قطعاً يعني أن برنامجاً ما قام بكتابتها، فإذا أردنا تعديل خطأ ما يجب أن يتم ذلك في البرنامج الذي يقوم بتوليد تلك القوالب والجداول وليس مباشرة فهذه الجداول معدة لاستخدام البرنامج النهائي تحديداً.
f) الفكرة غير ذكية، أن يتم إدخال الصيغ والقوالب للحاسوب بهيئتها الطبيعية أي كما يتلقاها بنو آدم ولكن هذه الجداول بالإضافة لنصوص مرسلة مختارة بعناية تصلح عينة للتدريب إذا أراد المطورون استخدام الطرق الإحصائية مثل (HMM).
2/ في هندسة البرنامج:
a) البرنامج لا يضيف أعباء للريجستري ولا يتطلب تنصيب أو طريقة مخصصة للإزالة، هذه ميزة مريحة.
b) لا تتضح الرؤية العامة للبرنامج، هل سيكون برنامجاً قائماً بذاته لغرض التصريف (standalone) أم هو جزء من منظومة أم مجرد مشروع اختباري (pilot project) سيتم بناء عليه تجهيز مشروع أكبر، أنا أجهل كل ذلك فالمعلومة لا تتوفر بالنسبة لي حتى أقدم مقترحات أشمل.
c) يحتل البرنامج حوالي 26 ميغابايت من الذاكرة قبل معالجة أي كلمة وترتفع إلى 50 أثناء التحليل. هذا غير مناسب نظراً لطبيعة المشكلة و حجم ملف البرنامج الذي بالكاد يبلغ واحد ميغابايت، فلغة الجافا نضجت كفاية ومكونها الأساسي (VM) يدير الذاكرة بطريقة مميزة بحيث يمكن أن لا يأخذ برنامجاً مثله نصيباً كبيراً من الذاكرة ويقيني أن برمجة الطريقة التي يدير بها موارده (قواعد البيانات تحديداً) غير محكمة، لن أستطيع تقديم تعليق أدق لعدم توفر الشفرة فلعل الجهة المطورة تضع هنا خوارزمية أو نص الإجرائية الأساسية لتوليد التصريف ولكني أنصح بإعادة تصميمها والانتباه إلى أن النصوص (strings) تعامل كثوابت (constants) في لغة جافا، هذه أهم نقطة يجب أن ينطلق منها المطورون لتحسين كفاءة البرنامج.
d) البرنامج مستقل (single threaded) هذا يسبب التوقف الفجائي (freeze) إذا اعتمد عليه برنامج آخر في المنظومة ويهدر موارد الكمبيوتر لأن كل نسخة يتم تشغيلها تكرر ذات الفعل (تحميل الملفات) وتخزن ذات البيانات في الذاكرة، فإذا كان هذا هو الأثر المطلوب فلماذا لم يتم استعمال نافذة جامعة (MDI) تتفرع منها نوافذ لذات التطبيق، هذا مجرد اقتراح فلعل المطورين سيرغبون في إضافة مكونات أخرى حتى لا يضيع الوقت في إعادة هيكلة البرنامج عند دمجه في منظومات أخرى.
e) استعمال اللغة العربية (CP1256) يناسب جهة التطوير لكن ليس ضرورياً لتشغيل البرنامج فما يحدث هو أن جافا تقوم بتحويل كل الحروف إلى اليونيكود أولاً ثم تحويل كل الجداول بما فيها إلى كائنات، فتحميل كل هذه القوائم في الذاكرة أمر غير مناسب خاصة أنها بلغة البشر التي لا يفهمها الحاسوب ولا يصر عليها، ولاحقاً عندما يدمج هذا المصرف في منظومة أكبر سيشكل أكبر عائق من ناحيتين بطء السرعة ومنطق الحشد (brute force) الذي يعمل به، يجب التعامل مع اليونيكود مباشرة أو استخدام ترميز وسيط (transliteration) أنا استعمل كاتس (KATS) (http://www.kamasoft.com/devtool.htm) في البرامج البسيطة ونماذج منها هنا (http://www.kamasoft.com/modiacr.htm ) ويمكنني تزويدكم ببرنامج التحويل مجاناً.
f) يستهلك البرنامج 50% من زمن المعالج لجملة من أربعة كلمات، قد يكون السبب في أن لغة جافا تعامل كل أنواع البيانات باعتبارها كائنات (objects) وأنواع البيانات في البرنامج قوائم دسمة من النصوص العربية المشكلة، فهي ليست موجهة ولكني أعتقد أن 80% من هذا الوقت يضيع في التحويلات والجلب أي في غير المعالجة والتصريف (النسبة تقريبية قد تقل أو تزيد بعد الإطلاع على الشفرة)، وضع البيانات جامدة لا تتغير (persistent) في ملفات خارجية بلغة مفهومة للإنسان يجبر الكمبيوتر استعادتها كلها ثم تخزينها بصيغة كائنات (حسب لغة جافا) ثم جلبها كل مرة يحتاج إليها وهي هناك في الذاكرة بذات الصيغة (أي نصوص عربية)، لا أعرف الحكمة في هذا المنطق لكني قد اقترح مبدئياً تخزين هذه القوائم بهيئة مختزلة (serialized) في كل مراحلها (ملفات وبيانات في الذاكرة) هكذا لن يتغير هيكل البرنامج كثيراً وستتحسن السرعة شيئاً ما، أعتقد أن جافا توفر دوال لمثل هذه الأغراض.
g) بيانات البرنامج (مجلد باسم db) تأتي في حوالي 30 ميغابايت قابلة للضغط إلى 5% فقط من حجمها، إذا كانت البيانات بمثل هذا الحجم لِمَ لم تدمج في البرنامج؟ أشير لميزة الاختزال في النقطة أعلاه. طالما البرنامج متاح جزئياً أعتقد يجب فصل نسختين منه الأولى تتاح للتطوير (development) والثانية تختزل قبل الإخراج (deployment) وتعرض لجهات الاختبار الراشدة وبعض مهووسي الإعراب لتجربتها بعبارات "تفشخط الفشخاط ..." و"واحد اثنين سرجي مرجي انت حكيم ولا تمرجي" وما شاكلها.
h) البرنامج نهم جداً (greedy) بمعنى أنه يبحث عن النصوص العربية في أي ملف على إطلاقه، فقد حاول تصريف ملف صورة (PNG) مستغرقاً دقيقتين ومستهلكاً 60 ميغابايت و 53% من وقت المعالج، هذا ليس تصميماً جيداً للمرحلة الأولى من شفرة البرنامج، أقترح تغيير فكرة (Black Hole) بفحص نوع الملف قبل فتحه أو استخدام ميزة التلخيص (short circuiting) بتعديل الدوال المخصصة للبحث بحيث تنسحب بمجرد الاصطدام بعثرات أو نصوص غير متوقعة، وكذلك استخدام التعبيرات الوصفية (ٌRegular Expression) بدلاً عن البحث بالمقارنة النصية المباشرة، على مصمم البرنامج (رئيس المطورين) أن يغير من طريقة تفكيره فاستخدام مفاهيم البرمجة السلسة (linear programming) مع لغة مبنية على توظيف الكائنات (Object oriented) أسلوب قد لا يناسب حل مشاكل من هذا النوع.
i) النقطة أعلاه تكشف عن حقيقة مهمة هي خلو البرنامج من خوارزمية التحقق من صحة النص (spell checker) ولو جزئياً، فإذا لم يثق البرنامج في تشكيل الحرف فالأحرى أن لا يثق في الحرف ذاته،وما لم يكن في نية المطورين إضافة مرشح ابتدائي (front end lexical scanner) لاحقاً فهذه ثغرة خطيرة يجب سدها مبكراً لأنها مدخل لأخطاء لن يعرفوا من أين تأتيهم وستعيق تطور البرنامج، بإمكاني إبداء بعض الأفكار هنا عند الطلب.
j) ميزة غريبة أدهشتني فعلاً هي أن البرنامج مع شراهته للنصوص العربية ينشل تماماً ويتوقف عند كلمة واحدة إذا لم يستطع تجاوزها، اختبرته في عبارة من كلمتين فتوقف عند الأولى ولم يبارحها مطلقاً، هذا عيب برمجي ولغوي، برمجي في أنه لم يزود بإمكانية للتغاضي (exception handling) وكذلك جعلت أهم مكوناته بعيدة عنه لا يعلم عنها شيئاً حتى يجد أول كلمة عربية ثم يشرع في تحليلها، لن أقترح شيئاً هنا فهذه أساسيات البرمجة بل الاحتراز من أساسيات الحياة. لغوي لأن المصرفات تعمل عادة بنمط متكرر (passes)، يجب على البرنامج أن يقوم بعمل تحليل أولي (shallow scan) للجملة قبل الشروع في تحليلها، هذا بالضبط ما يفعله ابن آدم قبل استيعاب النص.
k) البرنامج لا يميز بين الحرف والبايت أو لنقل الشفرات بصورة أكثر تحديداً، لقد استطعت إدخال ملف صورة (PNG) وظل يبحث عن الكلمات العربية فيها، فوجد واحدة! لا أعرف كيف تنطق لكن من المناسب تحديد النطاق الذي يبحث فيه فمجرد استخدام التشفير (CP1256) لا يعني ضمان استخدام اللغة العربية فذات الشفرة تضم كل الحروف اللاتينية ورموز أخرى.
l) البرنامج يحفظ ملف النتائج في موقعين مجلد البرنامج والجهة التي يحددها المستعمل، الثانية مبررة ولكن الملف الأول غير لم ألحظه إلا مصادفة وهو يستعمل تشفير (CP1256) بصيغة (HTM) لكنه لا يستخدم اليونيكود لذا تأتي كل الحروف العربية علامات استفهام. السبب هو استخدام قوالب جاهزة توفرها جافا دون تعديلها، التشفير المبين في السطر الأول (charset=windows-1256) يعمل فقط إذا كانت الحروف مشفرة (encoded) بطريقة صحيحة، جافا تدعم اليونيكود لذا على المطورين جعل البرنامج تهيئة الحروف بالتشفير (encoding) المناسب قبل توضيبها بصيغة (HTM).
m) كذلك البرنامج لا يضع قيوداً (filters) على الملفات المدخلة ولا يميز الملفات المخرجة (adds extension) ملف النتائج في حال تحديد موقع غير مجلد البرنامج.
أخيراً، أرجو لمطوري البرنامج التوفيق وأنصحهم بعد الالتفات للتخذيل ومثبطي الهمم فهؤلاء كانوا منذ خلق آدم وحواء.
علي ماهر
مبرمج تطبيقات