مجلة ماجد.. أربعون عاماً

السلام عليكم ورحمة اللهMajid

فكرت في كتابة هذه التدوينة اليوم و بعد مروري بالمكتبة التي اشتري منها مجلة ماجد لأبنائي، ووجدت العنوان كما يظهر في الصورة وهو مرور أربعون عاماً لمجلة ماجد، ففكرت في الكتابة عنها بل والدعاية لها لأن قراءتها بالنسبة للأطفال أفضل من أشياء كثيرة تضييع الوقت في هذا الزمن.

المجلات عموماً والكتب بالنسبة للأطفال هي وسيلة جيدة للتعلم واكتساب الثقافة وتحثهم على تمضية وقتهم في شيء مفيد بدلاً من تمضيته في اللعب، خصوصاً من بداية اﻹجازة.

في فترة الإمتحانات وما يسبقها من وقت اعتدت على عدم شراء تلك المجلة حتى لا تشغلهم عن الدراسة، لكن هذا العام فكرت في أن اشتري العدد اﻹسبوعي ثم إخفائه عنهم، إلى أن وصلت إلى أربع أو خمس أعداد مع نهاية آخر إمتحان لهم، ثم فاجئتهم بها، فكانت مفاجأة سارة لهم بعد إنتهائهم من الإمتحانات، فانكبوا لقراءتها.

في الصغر كُنت اشتري مجلة ماجد باستمرار أثناء المرحلة الإبتدائية والمتوسطة، حينما لم يكن هُناك شيء يسمى اﻹنترنت، حينها كنت في السعودية، وفي إحد المرات اشتريت منهم طوابع بريدية، وقد ارسلت لهم بضعة ريالات، لا أذكر بالضبط كم، خمس أو عشر ريالات فأرسلو لي عبر البريد عدد من طوابع الدول المختلفة ما زلت احتفظ بها إلى اﻵن.

بعد رجوعي إلى السودان كُنت قد وصلت إلى الثانوية وتوقفت عن شرائها وقراءتها – واظن أنها لم تكن متوفرة في المكتبات ذلك الوقت-، لكن رجعت لشراءها لأبنائي بعد عقدين من الزمان.

احببت أن اتكلم ايضاً عن استمراريتها وبقائها في السوق طوال هذه المدة وبعد التغييرات التي حدثت في العالم من ثورة رقمية وإنترنت وغيرها من اﻷشياء التي اصبحت تنافس الكتب والمجلات، لذلك تُعتبر هي قصة نجاح تستحق الكتابة عنها. ولا أعتقد أنها مؤسسة كبيرة، بل متخصصة فقط في إنتاج تلك المجلة، لذلك يمكن أن يكون هذا سبب نجاحها، هو أنه متخصصة ولم تتوسع في مجالات أخرى كان يمكن أن تؤثر سلباً في استقرارها.

أتمنى لو زرت أبوظبي أن أزور مقر هذه المجلة العريقة والتي هي معلم من معالم تاريخ الكُتب والمجلات في العالم العربي.

Advertisements

التطور الطبيعي للمبرمج: العام السابع

السلام عليكم ورحمة الله وربركاتهprogramming.

طرحت تساؤل عام 2011 عن ما هو التطور الطبيعي للمبرمج خلال مسيرة حياته المهنية. واعتدت أن اجاوب عليه نهاية كل عام حسب تجربتي الشخصية كمبرمج بناءً على ما تحولت عليه مسيرتي.

في عام 2017 لم اتوقف عن البرمجة وتطوير البرامج، لكن قلّت كثيراً مقارنة بالأعوام السابقة لها، بحيث لم أقم بالمشاركة في كتابة أي مشروع جديد، لكن بالطبع شاركت في تحليل ووضع المعمارية لكل نظام جديد. لكن بالنسبة لكتابة الكود فقط اكتفيت بما لدي من مشروعات آتية من أعوام سابقة ما زلت أقوم بدعمها وتطويرها حتى تظل تعمل وعمل إضافات بسيطة حسب طلب الزبائن أو متغيرات بيئة التشغيل، وكان هذا قد أخذ مني حيز كبيرفي البرمجة، أي المشاريع القديمة، وخصوصاً البرامج التي عملت عليها وحدي.

تعلمت لغة Golang في هذا العام، وقد كتبت بها عدد من البرامج الصغيرة وكذلك قمت بتحويل بعض برامج جافا إلى لغة قو بسبب خفتها في استخدام الذاكرة والمعالج، وكانت النتيجة جيدة جداً، وقد اعادني تعلمي هذه اللغة – بفضل الله – لأيام الشباب، وكانت تجربة ممتعة وزادت ارتباطي بالبرمجة. فزادت لغات البرمجة التي اكتب بها البرامج إلى ثلاث: أوبجكت باسكال، و جافا، ولغة قو، واحياناً استخدمها الثلاث في يوم واحد وفي جلسة واحدة دون أن اخلط بينها. في الحقيقة نحن في كثير من اﻷحيان نقلل من قدراتنا  مما هي عليه، فإجادة أكثر من لغة والعمل عليها جميعها يمكن أن نراها أمراً مستحيلاً ، لكن يزول ذلك الحاجز عندما نقوم بالتجربة.

كان النصيب الأكبر هو للإدارة، حيث اصبحت هي مسماي الوظيفتي وهي اﻷولوية لي في العمل. فيبدأ يوم العمل بقراءة البريد وإرسال آخر، ومتابعة المشروعات، من الصباح إلى وقت متأخر من الليل وحتى أيام اﻹجازة، حيث بفضل الله حدث لنا توسع في الزبائن والمشروعات، والعمل مع شركات اﻹتصالات يتطلب توفر تلك اﻷنظمة للعمل والدعم الفني عليها بنسبة 100% طوال الوقت.

كان هناك أيضاً نصيب للتسويق، حيث قمت بعمل عدد من العروض للبرامج التي لدينا أو عن المشروعات التي يمكننا تنفيذها، وشاركنا في عطاءات وفزنا ببعضها. لكن بسبب قلة المبرمجين فلم اجتهد كثيراً في هذا الجانب لعدم مقدرتنا لتنفيذ مشروعات أكثر من طاقتنا.

ضبط جودة البرامج كان له نصيب كبير بسبب زيادة تعقيدات المشروعات واستخدامها لأكثر من زبون، فكان لابد أن يتم تصميمها بصورة جيدة، وقد عملت بحث عن مباديء البرمجة الصحيحة  في هذا العام وختمته بكتابة كتاب (نحو مباديء برمجية صحيحة)

تنمية مهارات أفراد الفريق الذي يعمل معنا كانت من اﻷولويات في كل اﻷعوام، أما العام الماضي فكانت اﻷهمية أكبر وذلك لزيادة المسؤولية في أي مشروع لأي مبرمج ولفائدتهم الشخصية وبناء سيرة مهنية جيدة  لهم. فبدأنا العام برحلة ترفيهية وثقافية وتعليمية إلى مدينة بورتسودان حضرنا بها بعض المحاضرات التي قمت بتحميلها مسبقاً من اليوتبوب عن اﻹبداع  وقد قمنا بتلخيصها ونقاشها.،

حضرت عدد من المناقشات لمشروعات التخرج في الجامعة وذلك لاختيار عدد من المبرمجين حتى يعملوا معنا. واصبحت هذه مهمة جديدة بالنسبة لي وقد أخذت حيزاً لا يُستهان به، وهي البحث عن مبرمجين جدد، واختبارهم، ثم تدريبهم للعمل معنا.

هناك مهارات اخرى اكسبتها مثل صياغة العقود ، إدارة الحسابات المالية، محاسبة التكاليف، وزيادة مهارة اﻹتصالات والتواصل . هذا باﻹضافة إلى تطوير المهارات الفنية والتي هي جزء أصيل من عملي وهو التصميم الداخلي للبرامج والمعمارية، والتي اصبحت مستشاراً بها لكل مشروعاتنا، بالنسبة لباقي فريق العمل..

بالنسبة لبقية الفريق من المبرمجين الجدد والقدامى فاصبح لديهم خبرات إدارية متفاوتة حسب المشروعات التي يعملون بها والزبائن الذين يعملون معهم. ويتم مشاركة المعلومات اﻹدارية والفنية للإستفادة منها ومناقشتها بكل شفافية مع كل أفراد الفريق في مناسبات مختلفة، وقد لاحظت استجابة كبيرة لزيادة تلك المهارات اﻹدارية والفنية لكن بتفاوت حسب شخصية الفرد وعزيمته على التعلم والتغيير واﻹكتساب.

العام الحالي، والذي مضى منه أكثر من شهر، انوي استثماره – بإذن الله – في البحث عن المبرمجين المتميزين واختبارهم ثم تدريبهم بطريقة دقيقة وصحيحة ليتمكنوا من الوصول إلى مرحلة يعتمد عليها في وقت وجيز.،

وَيَتَفَكَّرُونَ فِي خَلْقِ السَّمَاوَاتِ وَالْأَرْضِ

السلام عليكم ورحمة الله

يقو ل الله عز وجل في سورة آل عمران “الَّذِينَ يَذْكُرُونَ اللَّـهَ قِيَامًا وَقُعُودًا وَعَلَىٰ جُنُوبِهِمْ وَيَتَفَكَّرُونَ فِي خَلْقِ السَّمَاوَاتِ وَالْأَرْضِ رَبَّنَا مَا خَلَقْتَ هَـٰذَا بَاطِلًا سُبْحَانَكَ فَقِنَا عَذَابَ النَّارِ ﴿١٩١

واحب أن أتكلم في التفكر في خلق الله. كشخص أعمل في مجال تقنية المعلومات والكمبيوتر واﻹتصالات  فإن هذا كله لا يساوي ما خلق الله من السماوات والأرض والبحار والنبانات والطيور وغيرها من اﻷشياء التي تجعلنا نردد هذه اﻷية الكريمة. فإن أكثر ما نستعجب منه هذه الطبيعة وجمالها وبديعها. واﻵن مع تقدم التقنية فنحن لا نتعجب من الكاميرات شديدة الدقة، ولا الدرون التي تصور من اﻷعالي مناظر لم نحلم برؤيتها، لكننا نتعجب من الطبيعة نفسها والتي هي مادة هذه التقنية وما صُنعت لأجله هذه اﻷدوات التي ترينا عظمة خلق الله.

تأمل هذه المخلوقات العظيمة له أثر كبير من النفس من حيث الراحة  برؤية هذا الجمال، فلزيادة فائدتها لابد أن نتذكر هذه اﻷية ونتفكر في خلق الله حتى تكون عبادة بالتفكر في عظمة الله.

اترككم مع بعض الصور – والتي بحثت عنها في دقائق فقط ولم أعدها مسبقاً، وهو صور بسيطة لا تُمثل شيء  يُذكر – والتي تأسر النفس، فما بال لو رآها الشخص بطبيعتها وليس صورة فقط

شاطيء رملي شرق جزيرة توتي

السلام عليكم ورحمة اللهtuti-1

منذ أكثر من خمسة عشر عاماً وأنا أنظر من شرفة المكتب الذي كُنت أعمل فيه في الخرطوم إلى نهر النيل اﻷزرق وجزيرة توتي التي تتوسطه، كنت أرى شريطاً رملياً يفترق فيه النيل اﻷزرق ليحيط بجزيرة توتي ثم يلقى النيل اﻷبيض ليكونا نهر النيل شمال الخرطوم والذي يصب في النهاية طريقة الطويل في البحر أﻷبيض المتوسط..

هذا الشاطيء الرملي كان في السابق غرب مدينة بحري، لكن بعد عدة فيضانات اختفي من بحري ليظهر في جزيرة توتي. وهذه الرمال تظهر في وقت إنحسار النيل (معظم العام) ويختفي ويُغمر بالمياه أثناء الفيضان من شهر يوليو إلى سبتمبر أو إلى اكتوبر.

في هذه الصورة تظهر جزيرة توتي التي تقع في قلب العاصمة المثلثة، تحدها جنوباً الخرطوم وغرباً أمدرمان وشمال شرقاً مدينة بحري.

tuti

وهذا موقعها في الخريطة:

http://wikimapia.org/#lang=en&lat=15.616341&lon=32.501550&z=14&m=b

منذ فترة عزمت على أن أزور هذا الشاطيء، إلى أن تمكنت – بفضل الله- أمس الجمعة من زيارته مع أبنائي، وكانت الرمال ممتدة والطريق طويل إلى الشاطيء الضحل. وهي من المناطق غير المنظمة من ناحية السياحة، حيث يوجد بها بعض الزوار فقط ولا توجد خدمات سياحية، وهذا أكثر ما يعجبني في مثل هذه المناطق الطبيعية البكر. حيث أن الإستثمار السياحي أحياناً يلوث مثل هذه المناطق الطبيعية فتجد أنهم قاموا ببناءات اسمنتية وغيرها من اﻷشياء غير الطبيعية التي تغيير شكل المنطقة الفطري.

الغريب أني طوال هذه الفترة الطويلة لم أزر هذه المنطقة والتي قمت بحساب بعدها من مكتبي السابق ووجدت أنها تبعد فقط 1 كيلومتر عند قياسها في الخريطة، لكن في الحقيقة الطريق غير مباشر، لابد من عبور جسر توتي مما يجعل الطريق حوالي 3 كيلومترات أو أقل.

هذه بعض الصور من تلك المنطقة:

صور من جزيرة توتي

مطلوب مبرمجي جافا حديثي التخرج في الخرطوم

السلام عليكمjava_logo

تُعلن كود لبرمجيات الكمبيوتر عن طلبها لمبرجي  جافا خريجي 2017 أو 2016 تكون لديهم خبرة في التالي:

  1. لغة البرمجة جافا
  2. نظام لينكس

وإختيارياً تطوير برامج أندرويد وبرمجة الويب باستخدام جافا

على أن يبدأ كمتدرب

يمكن للراغبين التعليق هُنا وتسجيل بريدهم اﻹلكتروني للتواصل معهم، والبريد الخاص بهم سوف لن يظهر في الصفحة

سوف يتم طلب إرسال سيرتهم الذاتية ثم عمل معاينة لمن يقع عليهم اﻹختيار بإذن الله

تحديث

العمل في الخرطوم

إصدار كتاب: نحو مبادئ برمجية صحيحة

السلام عليكم ورحمة اللهSmallCover

بفضل الله تمكنت اليوم من نشر كتاب (نحو مبادئ برمجية صحيحة) والذي قمت فيه بتجميع مواضيع المبادئ الصحيحة للبرمجة والتي كنت أكتبها في هذه المدونة تحت تصنيف هندسة البرمجيات، وقد قمت بإضافة فقرات ومبادئ أخرى لم أتكلم عنها في المدونة مثل (مبدأ التماسك، وفك اﻹرتباط، وإخفاء التفاصيل) كذلك قمت بإضافة عدة فقرات في البداية تتكلم عن التصميم والتحليل ودلالات التصميم الصحيحة ودلالات التصميم السيء للبرامج.

تأخرت كثيراً في نشره على أمل أن يكتمل واكتب فيه فقرات إضافية، لكن وجدت أن البحث عن هذا الموضوع لا يكتمل ويحتاج لمزيد من الوقت لدراسة هذه المفاهيم بصورة أعمق وانتظار نتائجها على الصعيد العملي. وحتى إنتظار هذه النتائج يمكن نشر ما تمت كتابته حتى يستفيد منه المبرمجين وربما أجد من يشاركني التجارب فأقوم بتكملة النواقص وتعديل الملاحظات في إصدار آخر من هذا الكتاب بإذن الله.

مبدأ الفتح واﻹغلاق في البرمجة

السلام عليكم

احد مباديء البرمجة بطريقة صحيحة هو مبدأ الفتح والإغلاق Open closed principle. وهو يعني سماحية توسيع إمكانات الجزئية البرمجية واﻹضافة لها واستخدامها بطريقة مختلفة دون التعديل فيها.

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

الهدف من هذه الطريقة هي إعادة الاستخدام، لكن دون المساس بالكود الأساسي كما ذكرنا. وعدم المساس بالكود اﻷساسي يحقق لنا استقرار البرنامج بحيث لا تتأثر اﻷجزاء التي تستخدم هذه المكتبة أو البرامج الأخرى التي تسخدم نفس المكتبة، ويحقق لنا توسعة قاعدة الاستخدام للكود بين البرامج. كذلك الهدف هو إمكانية التعديل واﻹضافة بطريقة سهلة لإستيعاب المطلوبات الجديدة.

ما يحقق هذا المبدأ هي عدة ميزات لابد أن تتوفر في لغة البرمجة التي نستخدمها وهي: البرمجة الكائنية، والوراثة، ووتعدد اﻷشكال. كذلك فإننا نستخدم التجريد لتحقيق هذا الهدف. ونلاحظ أننا اول مرة يتطلب منا المبدأ أن تكون لغة البرمجة تدعم البرمجة الكائنية. حيث أن المباديء السابقة التي ذكرناها في تدوينات سابقة يمكن تحقيقها في لغات هيكلية structured لكن هذه المرة البرمجة الهيكلية لا تسمح لنا بتحقيق مبدأ الفتح واﻹغلاق.

تعدد اﻷشكال Polymorphism مرتبط بالوراثة والتجريد، ومع أنه ليس الموضوع اﻷساسي في هذه التدوينة، لكون سوف نقوم بالتحدث عنه باختصار. تعدد الأشكال ببساطة هو أن تكون هُناك فئة كائن بها نوع من التجريد أي تصلح أن تكون عامة، مثلاً فئة كائن اسمها UserAuthenticationClass الغرض منها التأكد من المستخدم وكلمة المرور، وبها هذه الإجراءات:


CheckUser(String username, String password)

ChangeUserPassword(String username, String oldPassword, String newPassword)

InsertNewUser(String username, String password)

نحن نريد استخدام هذه الفئة مع أي قاعدة بيانات لكن تختلف كل قاعدة بيانات حسب تصميمها، مثلاً أحد المبرمجين يسمي الجدول المحتوي على أسماء المستخدمين users وآخر يسميه logins. كذلك فإن الحقول التي تحتويها هذه الجداول تختلف أسمائها، كذلك فإن كلمة المرور تختلف طريقة تخزينها، فمنهم من يستخرج منها ما يُسمى بالـ hash مثل MD5 ومنهم من يضع كلمة المرور كما هي في قاعدة البيانات. لذلك يكون من الصعب أن يكون لدينا نفس الكود أو نفس المكتبة التي يمكن استخدامها مع جميع هذه الجداول المختلفة التصميم.

لحل هذه المشكلة أولاً لابد من تجريد اﻹجراءات الداخلية والتي تتعامل مع الجداول مباشرة، مثلاً لابد من استخلاص هذا الجزء من الكود في إجراء منفصل:


query.Execute('select username, password from users where username = ?');

query.setParameter(1) = username;

مثلاً نُسميه getAuthenticationFromTable لكن المشكلة إذا كتبنا فيه أي كود فإننا نكون قد ربطناه بتصميم معين، وهو أن يكون اسم الجدول users وحقل اسم المستخدم username وكلمة المرور password فإذا اختلف أي من هذه التفاصيل فإن هذا الكود سوف لن يعمل.

نقوم ببساطة عدم كتابة متن هذا الإجراء في المكون، فقط نكتب اسمه والمدخلات والمخرجات أي نكتب رأس الإجراء header/interface ونحوله إلى إجراء إفتراضي virtual أي لا يوجد له كود في هذه المكتبة أو الفئة أو الوحدة، لكن على من يرث هذه المكتبة أن يقوم بكتابة كود هذا اﻹجراء بنفسه، فمثلاً هذا تعريف لهذا اﻹجراء في فئة الكائن اﻷساسي باستخدام لغة جافا:


public abstract ResultSet getAuthenticationFromTable(String username);

نلاحظ أنه لا يوجد كود بداخله، لكن مع ذلك يمكن نداءه من باقي إجراءات الفئة، مثلاً نقوم بمناداته داخل اﻹجراء checkUser:


public boolean checkUser(String username, String password) throws SQLException{

ResultSet result = getAuthenticationFromTable(username);
if (result.next()){
if (password.equals(result.getString(2))){
return true;
}
else {
return false;
}
}
else {
return false;
}
}

في هذه الحال لايمكن استخدام هذه الفئة مباشرة، إنما لابد من وراثتها ثم كتابة الإجراءات اﻹفتراضية فيها، مثلاً في برنامج للمبيعات نقوم بوراثتها في فئة جديدة نسميها PurchaseAuthentication وهذا هو الكود الذي تحتويه:


public class PurchaseAuthentication extends UserAuthenticationClass{

@Override
protected ResultSet getAuthenticationFromTable(String username){

// Do Database connection..
PreparedStatement statement = connection.prepareStatement("select username, password from users where username = ?");
statement.setString(1, username);
return statement.executeQuery();

}

}

عبارة @Override تعني أن هذا اﻹجراء سوف يقوم بإستبدال الإجراء الموروث، فكأنها وراثة عكسية، فبدلاً من أن ترث الفئة اﻹبن الفئة اﻷب، فإن اﻷب في هذه الحالة يرث اﻹبن ويستخدم إجراءه getAuthenticationFromTable

نلاحظ كذلك أننا فقط كتبنا إجراء واحد لكن في المقابل اعدنا استخدام كل اﻷجراءات الموجودة في الفئة اﻷصلية UserAuthenticationClass. عند استخدام الفئة نقوم بتعريفها ومناداتها كما في المثال التالي:


UserAuthenticationClass auth = new PurchaseAuthentication();
boolean success = auth.checkUser("mohammed", "mypassword");

نلاحظ أننا عرفنا الكائن على أنه من الفئة UserAuthenticationClass لكن عندما قمنا بعمل تهيئة له instantiation هيأناه على أنه من نوع  PurchaseAuthentication عندها يمكننا نداء أي إجراء من الفئة  UserAuthenticationClass. بهذه الطريقة يمكننا استخدام الفئة UserAuthenticationClass مع أي برنامج مهما كان شكل قاعدة بياناتها وجداولها دون أن نقوم بعمل أي تغيير في الفئة الرئيسة UserAuthenticationClass.

يمكننا كذلك تجريد اﻹتصال مع قاعدة البيانات ونجعلها افتراضية للسماح بإمكانية اﻹتصال مع أي نوع من محركات قواعد البيانات مثلا أوراكل، MySQL أو FireBird حيث أن لكل واحدة طريقة مختلفة أو مكتبة مختلفة للإتصال.

بهذه الطريقة نكون قد وسعنا إعادة استخدام الكود بالنسبة للفئات المجردة، أو نقوم بتجريد الفئات ثم نستخدمها في عدد من البرامج، أي يمكننا كتابة مكتبة بها كل هذه الفئات المجردة ثم نقوم باستخدام هذه المكتبة في باقي البرامج بدلاً من إعادة كتابة نفس الكود عدة مرات مع كل برنامج جديد مع اختلاف بسيط من برنامج لآخر. ويمكن للمبرمجين اﻷكثرخبرة أن يقومون بكتابة هذه المكتبات لتقليل اﻷخطاء التي يمكن أن يقع فيها المبرمجين المبتدئون.