على مائدة أَكْوَادٍ دسمة !

استدعى مدير الشركة أفضل أربعة مبرمجين عنده، وقال لهم: لقد أَبْهَرْتُمُونِي بما تحققونه من نجاح منقطع النظير في كل ما أكلفكم به، ولا أملك إلا أن أقف لكم وقفة إجلال وإكبار لَعَلِّيَ بها أُوَفِّيكُمْ بعض أفضالكم، وما أحوجني - وأنا مديركم - أن أجالسكم على هذه المائدة وأستفيد من خبراتكم وتجاربكم، لعلي أصطنع بها يدا جديدة في البرمجة، أو أُزِيحَ بها ركام الجهل الذي يعوقني على أن أكون مثلكم!
ابتسم أكبر المبرمجين سنا في خجل وهو يقول:
هذا تواضع منك يا حضرة المدير، وما دام جلوسنا معك على هذه المائدة سيضفي عليك بهجة وسرورا فَلْيَطِبْ خاطرك إذا، فإن لك عندنا أياد بيضاء، ونتودد إليك برد بعض جمائلك!
أطرق المدير برأسه، ثم رفعه مبتسما وهو يقول:
على مائدة أكواد دسمة إذن!
فجلسوا أربعتهم، خامسهم مديرهم، وَخَيَّمَ على القاعة صمت طويل قبل أن يكسره أصغر المبرمجين قائلا:
إن كنت ذاكرا سببا من أسباب تطويع الكود في يدي، فلن أغفل عن سبب الحفظ، ولست أعني بالحفظ كتابة الكود على ورق واستظهاره، أبدا..
فإن الكود يُحفظ بالممارسة، وكثرة المدارسة..
وإذا تحقق رسوخ الكود في الذهن، كان حل المعضلات المتعلقة به أو القريبة منه من أيسر ما يكون، ألا ترى معي قدرة الحلاق على قص الشعر والمقص في يده؟ فكذلك حيازة الكود في الذهن، فهو أداة المبرمج، ووسيلته لبلوغ غايته..
ولا أزيد على سبب الممارسة في ترسيخ الحفظ إلا سبب البحث والتنقيب، فإنني كلما واجهت مشكلة بحثت عنها، وما خذلتني محركات البحث أبدا ما دمت أكتب المشكلة على الوجه الذي ينبغي!
هذا سر براعتي: ترسيخ الكود عبر الممارسة، وتجاوز المشكلات عبر آليات البحث!
ابتسم المدير في إعجاب، ثم التفت إلى المبرمج الثاني آذنا له بالكلام، فقال بهدوء:
أما أنا يا حضرة المدير، فقد طَوَّعْتُ الكود عبر حيازتي للأساس المعرفي المتين، فما خضت غمار مشروع إلا وقدمت له بالدراسة والاجتهاد، وأذكر جَلِيًّا أنك حينما كلفتني بمشروع ويب بتقنية ASP.NET MVC، وكان من ضمن مكونات المشروع مجزوءة متعلقة بالمراسلات السريعة بين الدعم الفني وبين زوار الموقع، وأبلغتك حينها أنني أمام خيارين:
1. إن كنا في حرج وضيق من الوقت، اعتمدت على المراسلات بواسطة قاعدة بيانات، وهو أمر سهل لكنه غير فعال!
2. وإن كان أمامنا وقت فاسمح لي بالبحث عن الحل الأنسب!
وقد أذنت لي حينها بالبحث عن الحل الأنسب، فوجدت مكتبة تسمى SignalR، لم أكن قد سمعت بها، لكنني وسعت صدري، ودرستها من كتاب، حتى فهمتها، فأقحمتها في المشروع فكانت النتيجة كما رأيتها، عمل مشرف وبالتقنية المناسبة!
ولا أزيد على سبب القراءة والدراسة في تطويع الكود وبلوغ المساعي إلا سبب تقليل الموارد، فلو حملت أكثر من كتاب، ما كنت لأنجز شيئا، لأن الكثرة تدفع إلى الانتقائية، والانتقائية مدعاة إلى المماطلة!
حملت كتابا واحدا فقط يا سيدي، فالتهمته وأسقطت ما جاء فيه على المشروع فكان على ما كان عليه!
وإنني لأذكر نصيحتك جيدا حينما قلت لي مؤكدا:
أصعب من بدئك من الصفر: شعورك بأنك صفر!
ابتسم المدير من جديد مفتخرا، وأدار وجهه ناحية المبرمج الثالث وأومأ له بالكلام، فقال بصوت دافئ:
أما أنا فقد نفعتني لما صفعتني!
كنتُ مبرمجا محترفا، حُزْتُ طَرَفَيْ البرمجة: تنظيرا وتطبيقا..
لكنني كنت متهاونا، لا أعير للوقت بالا، أنغمس في المشروع غير جاد، فيمضي الوقت ويغضب العميل...
فأترنح أنا وأميل!
أذكر جيدا حينما صفعتني بكلام قاس، قلت لي حينها:
كن أنت وكفى، فإذا بدر الخطأ قل: مني، وإن برز الخلل قل: أنا السبب!
كفاك تهربا، وتحميلا للجن الأزرق مسؤولية تقصيرك، فتكون بذلك كتلك التي "خانها ذراعها فقالت مسحورة" على حد تعبير إخوتنا في ليبيا..
وذكرتني بمقولة نابليون بونابرت المؤلمة: "لا تفسر بالفأل السيء قلة كفاءتك"!
كان كلامك جارحا حينها لكنه كان بصدق وسيلة نجاة، علمت يومها أنها قسوة كقسوة الأب، وإنما جنحتَ إليها لمصلحتي..
فَغَيَّرْتُ من حالي، وبدأت أُقَسِّمُ عملي على الوقت المتاح، واشتغلت بجد واجتهاد، فكان من نجاحي ما رأيت يا حضرة المدير..
وأعود وأقول:
نَفَعْتَنِي لما صَفَعْتَنِي!
حرك المدير ثغره بابتسامة عريضة، ثم أومأ للمبرمج الرابع وكان أكبرهم سنا مشيرا إليه بالكلام فقال:
حضرة المدير، لقد وظفتني عندك وأنا كبير السن..
قد اشْتَدَّ عودي، وَضَعُفَ كودي..
كنت أبرمج بلغات أكل الدهر عليها وشرب، لكن مع ذلك وضعتَ ثقتك فِيَّ، وقلت لي:
كن نوحا، واجعل أعداء نجاحك قومه.. ولسوف تنجح وسيغرقون!
زرعت كلماتُك فِيَّ حماسا رهيبا، فكنت أصل الليل بالنهار من أجل تحصيل مستجدات التقنية، لكنني كنت لا أتقدم قيد أنملة..
فبدأت أفقد الثقة في نفسي، وصرت ألجأ إلى زملائي في البرمجة، كلما وقعت في مشكلة اعتمدت عليهم وأتيت إليهم..
فَكَثُرَ زَلِّي وَتَقَلَّصَ ظِلِّي..
لأن كثرة السؤال مذلة، وماذا لدى فاقد الأداة إلا السؤال؟!
نسيت أنني مبرمج وفقدت ثقتي في نفسي، فكان كل العمل الذي أقوم به قوامه دعم زملائي، بل إنني كنت في كثير من الأحيان أكتب الكود على ورق، وأمضي في الباحة جيئة وذهابا مستظهرا..
فلما يئست وقررت ترك البرمجة..
جاءت كلمتك الباعثة..
كلمتك التي انتشلتني من براثن الفشل، ووضعت على رأسي تاج الثقة..
أ تذكر حينما وجدتني أعتمد على أحد الزملاء في عملي فقلت لي باقتضاب:
لا تعتمد على أحد، اعتمد على الأحد!
بهذه الكلمة صنعتني، وأردفتها بكلمة أخرى قائلا:
إنْ تاجُك قَل، إنتاجُك قَل..
فسألتك عن معناها، فأجبتني: إذا قَلَّتْ ثقتك بنفسك قل إنتاجك!
فحددتُ حينها حقل تخصصي، وانكببتُ عليه متعلما، لا يذعرني عن هدفي شيء حتى بلغته، وما بلغته إلا باعتمادي على الحي الذي لا يموت، ثم بثقتي في نفسي وإيماني بمقدرتي على بلوغ الرغاب وتذليل الصعاب..
وكذلك كان!
فإن كنت في القمة فَلِأَنَّ كلماتك كانت سلالم..
وطوبى لمن وجد من يغرس في سويداء قلبه معاني التعلق بالله واليقين التام أَنْ لا غايةَ تُنْشَد إلا بمشيئته ولا تُبْلَغ إلا بإرادته ولا تُدْرَك إلا بتوفيقه..
ولن أنسى كلماتك ما حييت:
لا تعتمد على أحد، اعتمد على الأحد..
وإن تاجك قل..
إنتاجك قل!
فَلِلَّهِ دَرُّكَ مِنْ مُديرٍ، فإن قضينا مساعيك فنحن صنائعك، وما توفيقنا إلا بالله!

الفرق بين الواجهات Interfaces وبين الفئات المجردة Abstract Classes

الفئات المجردة Abstract Classes

الفئات المجردة Abstract Classes هي تمثيل مجرد لنوع معين، ومن مقتضيات هذا التمثيل ألا يكون له وجود واقعيا إذ يبقى في جيز التجريد والاصطلاح فقط، مما يترتب على هذا المعنى من إلغاء لعملية الاستنساخ  Instanciation، إذ من المعلوم أن الفئات المجردة في البرمجة الكائنية التوجه لا تسمح باستنساخ كائنات منها ويبقى دورها محصورا في عملية تعريف العناصر الأساسية للفئات بغرض توريثها إلى الفئات المشتقة.
ويمكن للفئة المجردة أن تشتمل على وظائف مجردة abstract methods قابلة لإعادة التعريف على مستوى الفئات المشتقة، كما يمكنها أيضا ألا تشتمل على أية وظيفة مجردة، والوظائف المجردة هي وظائف لا تحتوي على أية أوامر برمجية Implementation، بل تعرض فقط تعريف الوظيفة أو ما يعرف بالتوقيع Signature كما يوضح المثال التالي:

    abstract class Person
    {
        string _name;
        public Person (string name)
        {
            _name = name;
        }
        abstract public void Work();
    }
الفئة Person فئة مجردة وعلامة ذلك أمر التعريف abstract الذي تقدمها، وهي تحتوي على حقل من نوع نصي اسمه _name يأخذ قيمته في مشيد الفئة Constructor (علما أن المشيد في الفئات المجردة لا معنى له، بيد أن دور المشيد هو تشييد الكائنات في زمن الاستنساخ، ومادام الاستنساخ غير ممكن من الفئات المجردة فلا قيمة لوضع المشيد هنا، لكن يتم وضعه لتحديد قيم بدئية للحقول المشتركة بين جميع الفئات المشتقة التي ترث من الفئة المجردة، ويمكن تغيير قيمة الحقل في المشيدات الفرعية عبر الكلمة base  كما سيأتي معنا).
بعد ذلك قمنا بتعريف وظيفة مجردة abstract method أسميناها Work، هاته الوظيفة سنقوم بإعادة تعريفها في الفئات المشتقة عبر استخدام الأمر Override كما يعرض الكود التالي:
    class Programmer:Person
    {
        string _speciality;

        public Programmer(string speciality, string name) : base(name)
        {
            _speciality = speciality;
        }

        public override void Work()
        {
            Console.WriteLine("I am Programmer :) ");
        }
    }
في الكود أعلاه، قمنا بإنشاء فئة اسمها Programmer مشتقة من الفئة الرئيسية المجردة Person، داخل هاته الفئة المشتقة قمنا بإسناد قيمة بدئية للحقل _name من جديد عبر الأمر base الذي يحيل إلى الفئة الأصلية، كما قمنا بإعطاء قيمة بدئية لحقل جديد أسميناه Speciality.
ثم في الجزء الأهم، قمنا بإعادة تعريف الوظيفة المجردة Work من خلال الأمر Override، وبالتالي عند استدعاء هاته الوظيفة عبر كائن مستنسخ من الفئة Programmer  سيتم تنفيذ الكود الموافق لها، كما يوضح الكود التالي:
class TestProg
    {
        static void main()
        {
            //Create new instance from Programmer Class
            Programmer programmer = new Programmer("Desktop", "Khalid ESSAADANI");

            //Call Work method from derived class
            programmer.Work(); //Print: I am Programmer
        }
    }
إذن كخلاصة، فالفئات المجردة هي عبارة عن فئات تقوم بتعريف العناصر العامة لنوع معين، ولا تسمح بعملية الاستنساخ المباشر منها بل تسمح بذلك فقط عبر آلية التوريث /  الاشتقاق Inheritance بحيث يمكننا استنساخ كائنات فقط من الفئات الفرعية المشتقة من هذه الفئات المجردة.

الواجهات Interfaces:

تقوم الواجهة Interface بتعريف الوظائف التي على الفئات - التي ستقوم بتطبيقها – إعادة تعريفها، وكما هو الحال في الوظائف المجردة فإن الواجهات لا تحتوي على أية أوامر برمجية Implementation، بل تحتوي فقط على تعريف لتوقيعات الوظائف الواجب إعادة تعريفها على مستوى الفئات التي ستستخدم هاته الواجهة.
ولعل سؤالا ملحا ينخر في ذهنك الآن: إذن لماذا تصلح الواجهات مادامت تؤدي تقريبا نفس الدور الذي تؤديه الفئات المجردة؟
سؤال وجيه و حق له أن يطرح، وكجواب مبدئي يمكننا القول، أن الواجهات في اللغات الحديثة مثل سي شارب وجافا وفيجوال بيسك دوت نيت، أتت كحل حاسم لأزمة الوراثة المتعددة Multiple inheritance، إذ من المعلوم أن هذه اللغات الثلاثة التي ذكرناها لا تسمح بالوراثة المتعددة، بمعنى أن فئة معينة لا تستطيع أن ترث من أكثر من فئة رئيسية، بيد أن التسلسل المسموح به هو فئة فرعية ترث من فئة رئيسية واحدة.
فلما كان الأمر كذلك، قامت هذه اللغات بتقديم بديل للوراثة المتعددة متمثلا في الواجهات، حيث صار للفئة الواحدة أن تطبق واجهة أو عدة واجهات في الوقت عينه وبالتالي يكفي أن ننشئ الواجهات التي سنحتاجها ونضع فيها ما نشاء من تعريفات للوظائف Specification، شريطة ألا يتعدى التعريف حدود التوقيع Signature لأن الواجهات لا تحتوي على أوامر برمجية Implementation، ثم بعد ذلك نأتي إلى الفئة المستهدفة ونعيد تعريف عناصر الواجهات عليها بكيفية قريبة جدا من طريقة الوراثة، حيث في لغة الفيجوال بيسك دوت نيت نقوم بتطبيق الواجهة في فئة ما من خلال الكلمة المحجوزة Implements وكذلك في لغة جافا تتم عملية التطبيق عبر استخدام الكلمة المحجوزة implements، بينما في لغة سي شارب، يبقى رمز تطبيق الواجهات هو نفسه رمز الوراثة (نقطتان هكذا : ).
وهذا مثال على إنشاء واجهة في لغة سي شارب:
public interface IVehicle
    {
        string Model { get; set; }
        DateTime ManuFacturedDate { get; set; }
        byte Age();
    }
الواجهة أعلاه اسمها IVehicle / المركبات، تحتوي على تعريف لخاصيتين وهما موديل المركبة Model و تاريخ التصنيع ManuFacturedDate، وعلى وظيفة اسمها Age، لو لاحظت معي فإننا اكتفنيا في تعريف الخصائص بذكر get و set  فقط دون تحديد التفاصيل، لأن الواجهات كما ذكرنا تشمل التعريف Specification وليس الكود Implementation.
إذا أردنا تطبيق هاته الواجهة في فئة ما، فالمسألة بسيطة وصيغتها كما تقدم شبيهة بصيغة الوراثة أي كما يلي:
    class Car : IVehicle
    {
        public string Model { get; set; }
        public DateTime ManuFacturedDate { get; set; }


        public byte Age()
        {
            return (byte)(DateTime.Now.Year - ManuFacturedDate.Year);
        }
    }
جدير بالذكر أن تطبيق واجهة ما في إحدى الفئات يستلزم إعادة تعريف جميع العناصر التي قامت الواجهة بتعريفها، كما هو الحال في المثال أعلاه، فقد قمنا بتعريف الخصائص Model و ManuFacturedDate وكذلك الوظيفة Age التي تسمح لنا بالحصول على عمر السيارة من خلال طرح تاريخ التصنيع من التاريخ الحالي سنويا.
ويمكن للفئة الواحدة أن تطبق عدة واجهات كما يعرض المثال الآتي:
public interface IVehicle
    {
        string Model { get; set; }
        DateTime ManuFacturedDate { get; set; }
        byte Age();
    }

    public interface IColor
    {
        string Color { get; set; }

        bool CompareColors(string color);
    }

    class Car : IVehicle, IColor
    {
        //IVehicle
        public string Model { get; set; }
        public DateTime ManuFacturedDate { get; set; }


        public byte Age()
        {
            return (byte)(DateTime.Now.Year - ManuFacturedDate.Year);
        }


        //IColor
        public string Color { get; set; }

        public bool CompareColors(string color)
        {
            if (Color.Equals(color))
                return true;
            else return false;
        }


    }

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

الفروق بين الفئات المجردة والواجهات:

1. الفئات المجردة يمكنها أن تحتوي على وظائف بأوامر برمجية Implementation، بينما الواجهات لا تسمح بذلك وتكتفي فقط بتقديم تعريفات للعناصر.
2. يمكن للفئات المجردة أن تحتوي على ما تحتويه الفئات العادية كالمشيدات Constructors  والمهدمات Destructors بينما بنية الواجهات لا تسمح بذلك.
3. يمكن للفئة الواحدة أن ترث من فئة مجردة واحدة، بينما يمكنها أن تطبق أكثر من واجهة.
4. الفئات المجردة تبدأ بالكلمة abstract بينما تبدأ الواجهات بالكلمة interface.
5. على الفئة التي تستخدم واجهة ما، إعادة تعريف جميع عناصرها، بينما في حال الوراثة من فئة مجردة فهي ليست ملزمة بذلك.
6. يستحسن استخدام الفئات المجردة حينما نحتاج إلى إعادة تعريف بعض عناصر الفئة الرئيسية فقط على مستوى الفئات البنات، بينما يستحسن استخدام الواجهات حينما نحتاج إلى إعادة تعريف جميع العناصر على مستوى الفئة.

لهذه الأسباب يفشل الناس في البرمجة !

مضت سنون طوال و "شادي" يداعب لوحة المفاتيح ويعبث بالأكواد، بعزيمة متقدة لا تَفْتُرْ، وبهمة عالية لا تكل، كان يسعى إلى بلوغ قمة النجاح البرمجي دون أن يستبين ملامح هذا النجاح، كان يجري فقط نحو صورة هلامية رسمها في ذهنه يخلط فيها بين نبوغ دنيس ريتشي وثراء بيل غيتس، كان يسعى إلى أن يجمع بين هاتين الملكتين، عقل قوي يقهر الخوارزميات، وجيب ثري يحقق أسباب العيش الكريم.
كان مقبلا على هذا النجاح التجريدي إقبال الظامىء على الماء البارد في اليوم القائظ، فلا يرى دورة برمجية على اليوتيوب أو على غيره من المنصات التعليمية إلا وسارع إلى تحميلها وحفظها عنده، ولا يرى كتابا يستفز نهمه المعرفي إلا وانقض عليه انقضاض الليث الهصور على الغزال اللاغب.
حاسوبه الخاص مكتبة غنية بالمصادر، بينما عقله منشفة تبتل بالأكواد ثم تجف..
ينسخ السورس كود ويغير تصميم الواجهات بحثا عن إرضاء نفسه وإبهار أقرانه، فيبتسم في حبور وفخر وفي داخل قرارة نفسه يردد: تبا لي من غبي، ألهذا أنهكت عقلي وبدني؟
استمر به الحال حينا من الزمن حتى ضجر من وضعه، وكره أن يستمر في خداع نفسه، وآن له أن يصدع بما يختلجه من قلق لعل المحاسبة تفضح العيوب، فتنفرج الكروب.
توجه إلى كوخ حكيم البرمجة، طرق بابه بأدب ففتح له و أذن له بالدخول.
لم يمهل "شادي" الحكيم حتى يرجع إلى مجلسه، بل خاطبه بشدة:
ألم تقل لي أن البرمجة سهلة؟ ألم تردد على الدوام أنها مدرة للأرباح؟
للأسف صدقتك وقطعت زمنا ليس باليسير ماضيا على الخط الذي رسمته لي فما ظفرت بشيء مما كنت قد خططت له، انظر إلى الناس كيف صاروا مبرمجين أفذاذا، منهم من أنشأ مؤسسته الخاصة، منهم من ترقى في عمله، ومنهم من يعمل حرا وقتما يشاء وحسابه المصرفي يزخر بالدولارات، أكلهم سلكوا الخط الذي رسمته؟ لا أظن ذلك أبدا، لأنهم لو سلكوه لوجدتهم معي الآن ساخطين يصبون عليك جام غضبهم. تكلم يا حكيم فقد خابت أكوادي وضاع معها مرادي !
انظر إلى الناس كيف صاروا مبرمجين أفذاذا، منهم من أنشأ مؤسسته الخاصة، منهم من ترقى في عمله، ومنهم من يعمل حرا وقتما يشاء وحسابه المصرفي يزخر بالدولارات، أكلهم سلكوا الخط الذي رسمته؟ لا أظن ذلك أبدا، لأنهم لو سلكوه لوجدتهم معي الآن ساخطين يصبون عليك جام غضبهم. تكلم يا حكيم فقد خابت أكوادي وضاع معها مرادي !
ابتسم الحكيم بهدوء، ثم تخلل لحيته الطويلة البيضاء بأصابعه في برود و"شادي" أمامه تصطك فرائصه كالصريع.
رفع الحكيم رأسه و نظر في عيني شادي وقال له هامسا:
لعلك لم تفهم الدرس يا بني.
ثم واصل بعد أن غير نبرة صوته ليشد انتباه "شادي" إليه:
البرمجة عالم خاص يقع بين الفن والعلم، فَمَنْ ظَنَّهَا فَنًّا صِرْفًا أمضى عمره يُنَمِّقُ الأكواد ويُزَيِّنُ الواجهات فيتفاجأ حينما يَخيب مسعاه ليعود منها بمثل مايعود به دارس الرياضيات صاحب الخط الجميل والفهم العليل.
ومن ظَنَّهَا علما بَحْتًا أمضى سني عمره يضع المعادلات، ويصوغ المخططات فينصدم لما ينجلي السواد ليعود منها بمثل مايعود به دارس الرسم ذو الفهم السليم والذوق العقيم.
لا يستقيمان يا بني، البرمجة فن وعلم، وإنما أصابك ما أصابك من فشل وسقوط بسبب لزومك لست خصال، فإن أنت تخلصت منها كان بينك وبين هدفك شعرة، وإن أنت لازمتها فإنني أضمن لك أنك لو أنفقت عمرك ومعه مثله لما تحركت من موضعك قيد أنملة.
سكت شادي في اندهاش، ثم قطع صمته متسائلا:
وما تلك الخصال الستة يا حكيم؟
رفع الحكيم سبابته مشيرا وهو يقول:

أولا: العجلة


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

ثانيا: كثرة الموارد


فلما نهجت للبرمجة نهج المستعجل، أكثرت من جمع الدورات والمحاضرات والدروس والكتب والمقالات، ولو سألتك الآن كم كتابا قرأت في البرمجة لأجبتني أنك لم تكمل كتابا واحدا، ولو سألتك كم دورة برمجية تابعتها من بدايتها حتى نهايتها ودونت ماجاء فيها من معلومات نظرية وأنجزت ما ورد فيها من تطبيقات وأمثلة وتوسعت فيها بالبحث والتنقيب لكان جوابك صفرا، لأنك تفتح المحاضرة وتمرر شريط القراءة لتسمع فقط ما تحب سماعه وما يغص به حلقك من معلومات مهمة تتجاهلها أو ترجئها إلى حين فتحرم نفسك من خير كثير لو صبرت عليه لبلغت ما تصبو إليه، تريد مثالا: تدرس لغة سي شارب وتشاهد فقط دروس برمجة الواجهات وتهرب من المفوضات Delegates و تقنية Linq وتعدد المسارات Multi-Threading هروب السليم من الأجرب، ولو أدركت مافي هذه المفاهيم - وغيرها مما تهرب منه - من الخير لعضضت عليها بالنواجذ.
قم بحذف جميع الكتب والدوارت والموارد المعرفية من حاسوبك واحتفظ بمصدر واحد فقط لأن الوفرة تدفع إلى الانتقائية، والانتقائية تدفع إلى المماطلة.

ثالثا: غياب الخطة والرؤية الواضحة


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

رابعا: السعي إلى الربح السريع


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

خامسا: النقاشات الجانبية


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

سادسا: التقليد


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