السلام عليكم ورحمة الله
كان هذا المشروع خطة شهر مايو، وقُمت بإنجازه والحمد لله، فأحببت أن أشارككم تفاصيل التجربة من تحليل وتخطيط وبرمجة وتجربة.
تكلمنا سابقاً عن مشروع TurboBird، وهو برنامج لإدارة قواعد بيانات فيربيرد وهو مفتوح المصدر وقد بدأته بنهاية عام 2009. وأصبحت استخدمه كأداة مُساعدة في تطوير البرامج التجارية التي أقوم بعملها. وأثناء التطوير في البرامج التجارية أقوم بتصحيح المشاكل الموجودة في برنامج توربو بيرد وأحياناً أقوم بعمل إضافات فيه، وهذا حال كثير من الأدوات مفتوحة المصدر، إذ يقوم الداعم لها بإستخدامها في أعماله التجارية وتطويرها.
إحدى العقبات التي واجهتني في دعم البرامج التجارية هو أن تطوير البرنامج يصحبه في كثير من اﻷحيان تغيير في هيكل قاعدة البيانات، مثل إضافة جدول جديد، إضافة حقل في جدول، إضافة فهرس ثانوي، أو تغيير حقل أو Trigger، وغيرها من اﻷشياء التي كُنت أقوم بتعديلها في قاعدة بيانات العميل بصورة يدوية كُلما أقوم بإنتاج نسخة جديدة من برامج العُملاء. وإذا اصبح عدد العملاء كبير، فيصعب تذكر التغييرات التي تمت وإدارة النُسخ المختلفة الموجودة عند العملاء. فقررت أن أقوم بعمل ميزة مقارنة هيكل قاعدة البيانات في برنامج توربو بيرد، وبعد المقارنة يقوم البرنامج بتنفيذ التغييرات في قاعدة بيانات الزبون حتى يصبح هيكل قاعدة البيانات مطابقاً لأخر نسخة من البرنامج الذي أقوم بتطويره. وإختيار أن يكون الحل في برنامج توربو بيرد له أهداف هي:
- أن الحل سوف يكون عام وممكن استخدامه مع أي مشروع آخر يستخدم قاعدة البيانات فيربيرد
- أن تعم الفائدة لبقية المبرمجين الذين يستخدمون قاعدة البيانات فيربيرد
- أن تكون ميزة تنافسية لصالح برنامج توربوبيرد من مما يُزيد من استخدامه
وفي الآونة اﻷخيرة أصبحت أجد أن هناك من يتكلم عن برنامج توربو بيرد، مثل هذا الخبر
استخدمت في إضافة ميزة مقارنة هيكل قاعدة البيانات طريقة البرمجة الرشيقة Extreme programming والتي تكلمنا عنها سابقاً، حيث بدأت بوضع الخطة والهدف العام، واﻷشياء السهلة، مثل مقارنة الوحدات الناقصة في قاعدة البيانات الثانية، مثل الجداول، والحقول وغيرها. ثم المرحة الثانية الوحدات التي تم تغييرها، مثل تغيير حجم حقل أو تغيير محتويات إجراء أو تغيير خصائص فهرس ثانوي أو رئيسي. والمرحلة اﻷخيرة حذف الخصائص التي تم حذفها في قاعدة البيانات اﻷصلية، مثل الحقول التي تم اﻹستغناء عنها في النسخة المتطورة من قاعدة البيانات. وفي المرحلة الرابعة (إختيارية) تعديل الصلاحيات التي تغيرت.
بعدها قُمت مباشرة بتصميم فورم بسيط به قاعدة البيانات اﻷصلية وإختيار قاعدة البيانات لمقارنتها بها. بعد ذلك قُمت بعمل إجراء لقراءة أسماء وحدات قاعدة البيانات في كلتا القاعدتين ثم مقارنتها وإنتاج قائمة بالمفقود. بعد ذلك قُمت بعمل إجراء لإنتاج Script ليقوم بإنشاء هذه الوحدات الناقصة في قاعدة البيانات الثانية. بعد ذلك أقوم بعمل إختبارات مكثفة للتأكد من أن هذه اﻹجراء تمت بصورة جيدة.
وفي المرحلة الثانية قُمت بكتابة إجراء لمقارنة الحقول الناقصة في الجداول الموجودة في كلتا القاعدين، ثم إنتاج Script لإنشائها في قاعدة البيانات الثانية.
بعد ذلك قُمت بإضافة إجراء لمقارنة الوحدات الموجودة في كلتا القاعدتين لمعرفة إذا كان هُناك فرق، مثل الحقول المتغيرة، الفهارس، والإجراءات، والـ Triggers، والـ Domains. وعند وجود فرق أقوم بتطبيق الفرق، أو حذف تلك الوحدة أو الخاصية ثم إنشائها بالطريقة الموجودة في قاعدة البيانات اﻷولى.
بعد ذلك كُنت أقوم بعمل إختبارات ومعالجة المشاكل، وإستمر ذلك لعدة أيام تكون فيها كل دورات البرمجة الرشيقة والتي تتم بصورة متقاربة ودورية: تصميم، كتابة كود، عمل إختبارات، ثم إعادة تصميم وكتابة كود ثم إعادة اﻹختبارات.
وفي المرحلة اﻷخيرة حذف الخصائص التي تم حذفها من قاعدة البينات الأصلية. واستثنيت من ذلك المستخدمين، حيث أن المستخدمين لم أعتبرهم جزء من هيكل البيانات، وإنما جزء من الإعدادات الخاصة بالزبائن. كذلك لم أقم بحذف الـ Roles، وذلك لأنه لم يتضح بشكل قاطع، هل هو خاصية من هيكل البيانات وجزء من البرامج أم أنه كسابقه جزء من إعدادات البرنامج.
الجزء اﻷخير والذي لم أقم بعمله لضيق الوقت وهو الصلاحيات التي تغيرت بين القاعدتين. وكانت المقولة التي استندت عليها في وضع الخطة للبرنامج هي “مالايُدرك كله لا يُترك جُله“. فكان الجزء الذي تم بفضل الله يكفي لهذه المرحلة ويُأتمم جزء كبير من عملية إصدار نُسخ جديدة للبرامج التجارية.
والبرامج الطوعية أو المفتوحة المصدر لها طريقة مختلفة في التخطيط والتنفيذ، حيث لا يوجد وقت مرتبط به تنفيذ ميزات مُعينة، ولا أستثمر فيه كل وقتي، حيث أقوم بقطع جزء إضافي من وقت البرمجة للمشاريع الطوعية والبرامج المفتوحة المصدر. لذلك فإن الخطط تكون مُيسرة ولها وقت محدود في التنفيذ، فإذا لم تُنجز كلها يتم تأجيلها إلى وقت آخر.
وهذا مثال لأحد اﻹجراءات في عملية المقارنة مكتوبة بلغة أوجكت باسكال:
procedure TfmComparison.ScriptRemovedFields;
var
i: Integer;
Line, ATableName, AFieldName: string;
begin
if RemovedFieldsList.Count > 0 then
begin
fQueryWindow.meQuery.Lines.Add('');
fQueryWindow.meQuery.Lines.Add('-- Removed Fields');
end;
for i:= 0 to RemovedFieldsList.Count - 1 do
begin
Line:= RemovedFieldsList[i];
ATableName:= copy(Line, 1, Pos(',', Line) - 1);
System.Delete(Line, 1, Pos(',', Line));
AFieldName:= Line;
fQueryWindow.meQuery.Lines.Add('alter table ' + ATableName + ' drop '
+ AFieldName + ';');
end;
end;