
" يعتبر مخزن الكود المصدري عند المبرمجين و شركات البرمجيات كخزانة الأموال التي يحتفض فيها الناس أموالهم أو أغراضهم الثمينة مثل الذهب و الأموال و الصكوك"
في حياة أي شركة تطوير برمجيات او حتى مطور هاوي برامج عديدة طوروها خلال حياتهم، جوهر هذه البرامج و روحها هو الكود المصدري Source Code، فمنه تم بناء البرنامج و منه يمكن التعديل عليه و تحديثه و إصلاح العيوب الفنية فيه.
عملية جمع المعلومات و المتطلبات Requirements و تصميم Design النظام كلها عمليات تحضيرية للعملية الرئيسية في التطوير، الا وهي كتابة الكود، و خلال ذلك يجتمع فريق التطوير developers لتحويل التصميم إلى كود بلغة برمجة معينة، و في قلب هذه العملية تبرز أهمية مخزن الكود المصدري، فهو المركز الرئيسي لإستقبال الأكواد المكتوبة من جميع أعضاء الفريق و فيه تعيش ملفات الكود التي سيحولها المترجم compiler إلى البرنامج النهائي.
النقاط الرئيسية:
نستعرض في هذا الموضوع النقاط الرئيسية التالية:
- شرح ما هو مخزن الكود المصدري Source Control System.
- أهميته وفوائده.
- كيفية استخدامه.
- طريقة عمله.
- استعراض للمخزن Source Safe.
- عرض المخازن المتوفرة في السوق.
مقدمة
نعرف المخزن في حياتنا اليومية بالمكان الذي نحتفظ به كافة أغراضنا في المنزل بمختلف اشكالها ليكون مكان موحد رئيسي لحفظها ليسهل الرجوع إليها وضبط استخدامها، و هو مرادف لكلمة مستودع (اعتقد مستودع تطلق على المخزن الكبير، اليس كذلك؟)، في هذا الموضوع لا نتكلم عن هذه المخازن التي نعرفها بل عن نوع اخر من المخازن تستخدمه شركات البرمجيات و إدارات تقنية المعلومات و المطورين المحترفين في حفظ أكوادهم المصدرية Source Code.
يحفظ في هذا المخزن ملفات الكود المصدري Source Code و المستندات المتصلة به، و قد يستغرب البعض لماذا نستخدم كلمة مخزن هنا، بمعنى اخر هل الكود المصدري شيء يفسد و يجب علينا حفظه؟ الجواب نعم، ففي تراثنا مثل يقول "بريق الشراكة ما يفوح" بمعنى أن اي عملية يكثر العاملين عليها لا تنجح و كذلك مشاريع تطوير البرمجيات التي يشترك في تطويرها اكثر من مطور developer لن تنجح بدون اليات تنظيمية تضبط عملية كتابة الكود المصدري الذي يعتبر الشكل المنطقي للبرنامج النهائي.
يعتقد الكثيرين ان استخدام مخزن الكود المصدري يقتصر على مشاريع التطوير الضخمة التي يشترك فيها عدد كبير من المطورين ، وانه غير فعال في المشاريع الشخصية التي يعمل عليها مبرمج واحد، لكن كما سنرى في السطور القادمة ان هذا الكلام غير صحيح و ان مخزن الكود المصدري ضرورة في اي مشروع مهما كبر أو صغر حجمه أو قل و كثر مبرمجيه، لكن قبل الدخول في الموضوع لنستعرض الطريقة التقليدية التي يستخدمها المبرمجين في كتابة أكوادهم و الاحتفاظ بها.
الطريقة التقليدية
يتم كتابة الكود المصدري Source Code عادة في ملفات Files على جلسات متفرقة تستغرق شهورا و سنين في بعض الأحيان، و يستخدم في كتابة الكود محرر نصوص (مثل Ultra Editor او Emacs) .... ثم يتم حفظه، أو يتم كتابة داخل بيئة تطوير متكاملة مثل Visual C++ او Visual Basic و Delphi التي توفر أدوات Tools لتسريع كتابة الكود و تصفحه. و عند اكتمال جزئية من البرنامج نقوم بعمل الترجمة Compilation و نشغل البرنامج، و عند اشتراك اكثر من مطور في كتابة الكود يتم تقسيم الوظائف الرئيسية للبرنامج في ملفات و التي بدورها توزع على كل مبرمج، فعاصم يركز على وظيفة الطباعة التي في ملف appPrint.cpp و خالد في وظيفة حفظ البيانات في ملف docsave.cpp، و خلال هذه العملية لا نعلم كيف كتب عاصم الوظائف في ملف appPrint.cpp و لا كيف كتب خالد الوظائف في ملف docsave.cpp، و لا حتى المراحل و الأشكال التي مرت بها الملفات.
على سبيل المثال، عند تشغيلك للمفكرة notepad و كتابة "حسام يحب الفلسفة"، ثم حفظت الملف، و فتحته مره اخرى و عدلت علية ليكون "محمد و حسام يحبون الفلسفة" و قمت بالحفظ، من سيفتح الملف لاحقا لن يعرف انك كتبت الملف ثم قمت بتعديله، تاريخ الملف ضائع هنا.
الطريقة النموذجية
يتم كتابة البرامج بالطريقة النموذجية بنفس الطريقة الطريقة التقليدية، ولكن عوضا عن حفظه في نظام الملفات العادي في نظام التشغيل يتم حفظها داخل قاعدة بيانات، تنظم و تسيطر على عملية التعديل و التحديث التي يقوم بها المطورون، بحيث يحتفظ بجميع النسخ revisions للملف الواحد، من اول ما كتب حتى الوقت الحالي.
ماذا يخزن فيه
- ملفات الكود المصدري Source Code .
- ملفات المتطلبات Requirements و التحليل Analysis و التصميم Design للنظام و التي غالبا ما تكون ملفات وورد Word او PDF.
- ملفات سيناريوز الأختبار الفني Test Cases.
ببساطة تستطيع حفظ اي ملف فيه، ما دمت مهتما بتاريخ هذا الملف!.
فوائده
وظيفة مخزن الأكواد الرئيسية المتمثلة في حفظ نسخ الملف و إمكانية استرجاع جميع نسخها لا تحتاج إلى مزايده، لكن بالإضافة إلى ذلك فهو يقدم فوائد اخرى:
- تسهيل العمل في بيئة فريق، بحيث يعمل كل الفريق في نفس الملفات في نفس الوقت.
- التراجع عن تعديل في الملف بعد حفظه، طبعا كلنا نعلم انه عند تعديل الملف و حفظه فإننا لا نستطيع استرجاع النسخة السابقة من الملف قبل التعديل، و لكن بمخزن الأكواد المصدرية نستطيع، و تسمى عملية الاسترجاع هذه بالـ revert.
- التحكم بصلاحيات الوصول للملفات.
- مكان مركزي امن لحفظ كافة اكودك الشخصية او اكواد المؤسسة.
كيف يعمل
يعمل مخزن الأكواد بنفس الطريقة التي يعمل بها نظام الملفات، فيوجد جذر أساسي (مثل C: في ويندوز)، و تحته تعيش مجلدات Folders و ملفات عادية Files تماما مثل ال C:\ في ويندوز.
الفرق بين المخزن و نظام الملفات التقليدي الذي نستخدمه في نظام التشغيل كل يوم هو ميزة الأرشفة فكما يحتفظ ويندوز بالمجلدات و الملفات فمخزن الأكودا المصدري كذلك ينظم البيانات على شكل مجلدات و ملفات بالإضافة إلى تاريخهم و قصة حياة الملف، و كافة النسخ التي حفظت له.
يقوم النظام على عمليتنين اساسيتين:
- الاستعارة Check out
- الإرجاع Check In
طبعا كما وضحنا سابقا كل عملية سحب للملف و تعديله ثم حفظه سيتم التحديث مع الاحتفاظ بالنسخة السابقة.
و نتحدث الان على العمليتين بالتفصيل.
الاستعارة Check out
يطلب المبرمج من مخزن الأكواد استعارة نسخة من ملف معين للإطلاع عليه أو للتعديل، و عند الإستعارة يستطيع المبرمج استعارة اي نسخة revision من الملف.
الإرجاع Check In
تتم عملية الإرجاع بعد تعديل الملف و حفظه، و الرغبة في اعتماد هذا التعديل في المخزن، الشكل التالي يظهر تاريخ احد الملفات.

الشكل 1: تاريخ حياة ملف.
في الشكل 1 نرى ان الملف source-control-features.aspx و لد في تاريخ اكتوبر 24 عام 2004، ثم قام ال Administrator باستعارة نسخة لقرائتها و أرجعها بدون تعديل، فرقم النسخة version لم يتغير، ما زال 1، ثم قام بالإستعارة مرة أخرى و قام بعمل بعض التعديل و إرجاعه، حيث تغير رقم النسخة version إلى 2، و نفس العملية تكررت ليوصله إلى النسخة 3.
المقارنة Diff
كما رأينا في الشكل 1، يحتفظ النظام بجميع النسخ versions لكل ملف في المخزن، الشيء الذي يولد الحاجة إلى أداة تقوم بعمل مقارنة بين نسختين لمعرفة التعديل الذي قام به المطور، الشكل 2 التالي يستعرض أداة توجد في جميع مخازن الكود المصدري، تسمى Diff Tool، اي الفرق بين نسختين.

الشكل 2: الفرق بين نسختين لنفس الملف.
كما نرى في الشكل 2، النسخة الأولى من الملف على الجانب الأيسر و النسخة الثانية من الملف في الجانب الأيمن، وقد تم اضافة 5 سطور ملونه باللون الأخضر، كذلك تم حذف 11 سطر ملونه باللون الزهري، و تم تعديل السطر:
Console.WriteLine("Helo, Word!");
إلى:
Console.WriteLine("Hello, Word!");
لاحظ كلمة Helo تم تصحيحها في النسخة الثانية إلى Hello.
الدمج Merge
عندما يتم استعارة ملف للإضافة عليه او للتعديل، ممكن ان يكون الملف قد تم استعارته بالفعل من قبل مطور اخر، بمعنى اخر هناك مطورين يعملون على نفس الملف في نفس الوقت!... وظيفة الدمج هي اخذ التعديل من المطور الأول و دمجها بتعديلات المطور الأخر، هذه العملية حرجة للغاية، لانها تتطلب في بعض الأحيان تدخل بشري.

الشكل 3: عملية الدمج بين نسختين.
كما هو واضح في الصورة، سيقوم المخزن بعملية دمج تغييرات المطور الأحمر في الملف بتغييرات المطور الأزرق، و بهذه الطريقة يمكن المخزن مطورين بالعمل في نفس الملف.
تفريع Branch:
بصراحة... لم أجد كلمة مناسبة لكلمة Branch، و سميتها تفريع.
لنفترض انك تعمل على تطوير برنامج و انتهيت منه، ثم قمت بطرحه للإستخدام، و بينما الناس يستخدمونه رجعت إلى العمل على الكود الأساسي و قمت بإضافة مميزات ووظائف اخرى، و فجأه و صلتك شكوى في ان البرنامج يقوم بعملية حساب بشكل خاطئ، ببساطة خطأ فني في البرنامج المطروح!!! كيف ستسطيع تصحيح الخطأ و طرح نسخة تصحيحية؟ فالكود الذي تمت ترجمة النسخة المطروحة قد تغير و تم التعديل عليه و لم تنتهي منه بعد، بمعنى اخر لا تستطيع تصحيح الخلل و عمل ترجمة و طرحه بالكود الحالي، هنا يدخل التفريع في الصورة، فالتفريع هو عملية نسخ الكود الذي منه تم إنتاج النسخة الأولى و وضعها في مجلد باسم انت تختاره، ليتسنى لك الرجوع لهذا الكود عند الحاجة و التعديل عليه، و بهذه الطريقة تستطيع العمل على الكود الأساسي بدون مقاطعة، الشكل التالي يوضح هذه العملية:

هنا قمنا بإنتاج النسخة 1.0 و توزيعها على المستخدمين ، و تم تفريع كودها في مجلد اسمه 1.0 و تم الاستمرار في تطوير الكود الرئيسي، بهذه الطريقة استطاع فريق التطوير الرجوع في أي وقت لتصحيح اي خطأ فني في النسخة 1.0 و في نفس الوقت الاستمرار في اضافة مميزات ووظائف على الكود الرئيسي.
يمكن ان تتسأل لماذا هذه الميزه موجوده، فيمكنك ان تقوم بها بشكل يدوي و تقوم بنسخ كافة الملفات ووضعها في مجلد اخر، لمذا تقوم مخزن الكود المصدري بتوفيرها لك؟ الجواب ببساطة هو الدمج Merge، التفريع Branching يقوم بعملية النسخ في مجلد اخر و في نفس الوقت يربط بين المجلدين (الأساس و المجلد الجديد) ليعطيك امكانية دمج التغييرات التي تحدث في ملفات المجلد الأساسي إلى المجلد الجديد.
البرامج المتوفرة:
على الرغم من أن الكثير من المطورين ثبتوه مع Visual Studio 6 إلا ان قليل منهم استخدموه،
مخزن كود تقليدي من شركة SourceGear الفرق ان يحفظ كل الملفات في قاعدة بيانات SQL Server.
من أشهر مخازن الكود في عالم Open Source، و يعتمد في انظام لينكس بشكل كبير.

* سب فيرجين Subversion:
يريد فريق السب فيرجين ان يستبدل المطورين السي في اس CVS بالسب فيرجين Subversion..

· سورس ديبوت Source Depot
المخزن الذي تستخدمه مايكروسفت داخليا، تم تطويره من قبل مايكروسفت و تستخدمها لوحدها، يللأنانية!
· بت كيبر Bitkeeper
المخزن الذي اختاره لينوس تروفالدس (كاتب نظام لينكس) ليضع فيه كود نواة لينكس