أهلاً بكم. في هذا المقال، سنتناول موضوعاً مهماً: الفارق بين المبرمج ومهندس البرمجيات.
سبق وأن تحدثت عن أنني بعد ستة أشهر من تخرجي، تعلمت كيف أصبح مهندس برمجيات. يعتقد البعض أنني تعلمت البرمجة في هذه الأشهر الستة، ولكن هذا غير صحيح. ما تعلمته هو كيف أصبح مهندس برمجيات.
قد تتساءلون كيف ذلك، خاصة وأنني خريج هندسة حاسوب. في الحقيقة، لم تكن لدي فكرة واضحة عن بناء البرمجيات، بل كانت لدي فقط الفكرة البسيطة التي يمتلكها أي شخص درس هندسة الحاسوب أو أي تخصص آخر غير هندسة البرمجيات. كان مفهومي لكيفية بناء البرمجيات يقتصر على أن لدي كوداً صغيراً يجب تعديله وإنجازه. لكن هذه ليست مهمة مهندس البرمجيات، بل هي مهمة المبرمج. وهنا يكمن الاختلاف الجوهري بين المفهومين.
أتحدث هنا بناءً على خبرتي ومعرفتي، وسأحاول قدر الإمكان تقديم التعريفات الدقيقة حتى تكونوا على دراية بالفارق عندما يُطرح هذا الموضوع أمامكم، وتتمكنوا من التمييز بين المبرمج ومهندس البرمجيات.
من هو المبرمج (Programmer)؟
المبرمج هو شخص يستطيع كتابة الكود. ببساطة، أي شخص يعرف كتابة الكود يسمى مبرمجاً (Programmer). فمثلاً، إذا كان لدي كلاس (Class) يحتوي على ثلاث دوال (Functions) وأريد من شخص كتابتها، فأنا أستعين بمبرمج للقيام بذلك.
ومن هو مهندس البرمجيات (Software Engineer)؟
إذًا، من هو مهندس البرمجيات، ولماذا يجب أن تطمح لتكون واحداً؟ دائماً ما أقول للطلاب إن البرمجة هي مهارة (Skill). إذا كنت تعرف كتابة الكود، فهذه مهارة، وأنت بذلك تُسمى مبرمجاً.
أما هندسة البرمجيات (Software Engineering) فهي مجموعة المعارف والمهارات المتعلقة ببناء البرمجيات ككل، والبرمجة هي واحدة فقط من هذه المهارات. إذا أردنا تبسيط الأمر، يمكننا القول إن المبرمج هو بمثابة فئة فرعية (Sub-class) تندرج تحت مظلة مهندس البرمجيات.
قد تسأل: هل يجب على كل مهندس برمجيات أن يكون مبرمجاً؟ برأيي، نعم، بالتأكيد. على الرغم من أنه يتم الترويج كثيراً الآن لفكرة أن مساعدي الذكاء الاصطناعي (AI Assistants) سيجعلون دور المبرمج غير ضروري، وأن مهندس البرمجيات لم يعد بحاجة لهذه المهارة ويكتفي بتعلم الدورة الكاملة ليصبح موجهاً للأوامر (Prompter)، إلا أنني لا أرى أن هذا سيحدث في المستقبل القريب. ما زال أمامنا وقت طويل جداً لذلك.
البرمجة مهارة، وهندسة البرمجيات منظومة متكاملة
لذلك، برأيي يجب أن تفهموا أن مهارات مهندس البرمجيات تنقسم إلى مهارات تقنية (Hard Skills) ومهارات شخصية (Soft Skills). المهارات التقنية تشمل المعرفة، ومنها البرمجة (القدرة على كتابة الكود). لكن الفكرة لا تقتصر على كتابة الكود فحسب، بل تمتد إلى التفكير في الكود كجزء من منظومة متكاملة: من مجرد كود إلى منتج حي، قابل للتطوير والتوسع (Scalable)، يمكن نشره على السحابة (Cloud)، ويستخدمه الآخرون ويقومون بصيانته.
لقد لاحظت، وهذه نقطة أراها في كثير من الحالات، أن معظم من يدرّسون البرمجة يركزون على إعدادك لتكون مبرمجاً، وليس مهندس برمجيات. إنهم يجهزونك لاكتساب مهارة واحدة فقط من ضمن المهارات العديدة التي يمتلكها مهندس البرمجيات.
برأيي، يجب أن تكون هناك برامج مخصصة للمبرمجين. مرة أخرى، أنا لست هنا لأعلمك البرمجة أو لأخبرك أن تتعلم هياكل البيانات (Data Structures) أو المكدس (Stack) أو غيرها. أنا هنا لأخبرك أنه بعد إتقان البرمجة، هناك مجموعة من المعارف (Set of Knowledge) التي يجب أن تكتسبها. هذه المعرفة هي التي ستمكنك من الحصول على وظيفة حقيقية.
الفجوة بين التعليم وسوق العمل
قد تقول: ‘لكن عادةً، أول وظيفة هي التي تعلمك هذه الأمور’. أتفق معك، في الغالب لن تتعلم شيئاً عن هندسة البرمجيات إلا في وظيفتك الأولى. لكنني سأخبركم بما رأيته مع الطلاب الذين اجتهدوا في اكتساب هذه المهارات بأنفسهم: لقد مكنتهم من تجاوز مرحلة المبتدئ (Junior) عند دخولهم سوق العمل.
تخيل أنك مبرمج لديك تصنيف محترم على منصات مثل LeetCode أو Codeforces، وقمت بحل مسائل برمجية متقدمة، وفي نفس الوقت أنت مهندس برمجيات. حينها أستطيع أن أؤكد أنك تعرف حقاً جميع دورات حياة تطوير البرمجيات (Software Cycles). بالنسبة لي، أنت جاهز تماماً للاندماج مباشرة في أي فريق عمل.
بدلاً من أن نحتاج لشرح مفاهيم مثل التكامل المستمر والنشر المستمر (CI/CD)، وأننا نمر بمراحل معينة، وأن لدينا فترة عمل (Sprint) تسلم فيها مهامك، وهناك تقييم للقصص (Stories)، وغيرها. أنا أدرك أنك تستطيع تعلم كل هذا في وقت قصير، لكن ما أريد منك أن تفكر فيه وتضعه دائماً في اعتبارك كمبرمج هو: بمجرد أن تصبح مبرمجاً، يجب أن تسعى لتصبح مهندس برمجيات.
ماذا يعني أن تكون مهندس برمجيات؟
قلت مرة لأحد طلابي: عندما تريد أن تعرّف عن نفسك، قل مطور (Developer)، قل مهندس (Engineer)، قل ما تشاء. لكن برأيي، أن تكون مهندس برمجيات يعني أنني أستطيع اليوم أن أكلفك بأي تقنية ويمكنك تعلمها. (وهنا لا أعني تعلم أي لغة برمجة جديدة، فالبعض يفهم ذلك على أنه تغيير كامل للمسار المهني من Python إلى .NET مثلاً). أنا أتحدث عن قدرتك على تعلم أي شيء ضمن المنظومة من البداية إلى النهاية (End-to-End).
يعني، أستطيع اليوم أن أقول لك: ‘اسمع، كنت تعمل على تطبيقات الموبايل مع ذلك الفريق، والآن ستعمل معنا على تطبيقات الويب. هذا هو تدفق العمل الخاص بالويب’. بما أنك تفهم العملية من الألف إلى الياء في تطبيقات الموبايل، ستفهمها أيضاً في الويب، وفي تطبيقات سطح المكتب، وفي أي مجال آخر. هذا برأيي هو جوهر فهم مصطلح مهندس البرمجيات.
كيف أصبحتُ مهندس برمجيات؟
قد تسألني: ‘يا حمزة، كيف تعلمت كل هذا وأنت خريج هندسة حاسوب ولم تدرس هذه المواد؟’. في الواقع، أول شيء فعلته هو التواصل مع صديق لي يدرس هندسة البرمجيات ويعمل في المجال، وقلت له: ‘أعطني قائمة بكل الكتب التي تراها مفيدة وتستخدمها حالياً’. قد أعود لاحقاً لذكر أسماء تلك الكتب، لكنني أتذكر أنني بعد أن اطلعت عليها، بدأت أبحث عن مصادر أخرى. ومنذ ذلك الحين أصبحت هذه عادتي: لا أعتمد أبداً على مصدر واحد، بل آخذ الأساس ثم أبحث في مصادر متعددة. سأحاول أن أجمع لكم قائمة بالكتب المفيدة التي تساعدكم على فهم هذا المجال.
التطبيق العملي هو المفتاح
تحدثت مرة عن أحد طلابنا الذي حصل هو ومجموعة من أصدقائه على وظيفة بسبب مشروع واحد قدموه. لماذا؟
أولاً، أثبتوا أنهم يعرفون كتابة الكود، فهم مبرمجون، وهذا مؤكد.
لكن الأهم أنهم أظهروا قدرتهم على العمل كفريق في مشروع مفتوح المصدر (Open Source). كان الكود متاحاً، وكذلك سجل التعديلات (Commits)، والتكامل والنشر المستمر (CI/CD)، وكل ما قد يخطر ببالك. كان الفريق موزعاً في أربع أو خمس دول مختلفة حول العالم. جمع هؤلاء الشباب كل شيء في مستودع (Repository) واحد، وهذا المستودع بحد ذاته كان مثالاً على إدارة المشاريع: فترات عمل (Sprints)، قصص مستخدم (User Stories)، تقديرات (Estimation)، وكل ما يتعلق بهندسة البرمجيات كان مطبقاً في هذا المشروع.
أتذكر عندما قيّمت المشروع، قلت لنفسي: ‘هؤلاء جاهزون للعمل في أي فريق’. أي خبير يراجع هذا العمل ويفهم في هندسة البرمجيات سيقول إن هؤلاء الطلاب، الذين لم يعملوا في شركة بعد، قادرون على الاندماج في أي فريق عمل يمكن تخيله.
وهذه هي النقطة التي أريد إيصالها لكم: بعد تعلم البرمجة، يجب أن تتعلموا هندسة البرمجيات. يجب أن تفهموا تفاصيلها. ابحثوا، اقرأوا، واطلعوا، ولكن برأيي، كل هذه القراءة والعلم لا يكتمل إلا بالتطبيق العملي.
قد تقول: ‘سأنتظر أول شركة توظفني ثم أطبق’. لا تفعل ذلك. ابحث عن مشروع مفتوح المصدر وساهم فيه. انظر كيف يساهم الآخرون في البرمجيات، مهما كانت. أو حتى يمكنك العودة إلى مشروع عملت عليه مع صديقك، وحاولا تطبيق المعايير (Standards) عليه. قررا مثلاً: ‘سنكتب رسائل التعديلات (Commit Messages) بهذا الشكل’، ‘سنعقد اجتماعاً لجمع هذه المعلومات’، ‘سننشئ قصص مستخدم (User Stories)’، ‘سندير المشروع بشكل منظم’. افعلوا كل هذه الأشياء.
صدقوني، بمجرد أن تفعلوا هذه الأشياء، ستكونون مؤهلين للعمل في أي شركة. وأنا على استعداد لوضعكم في أي فريق في العالم.
الخاتمة: من مبرمج إلى مهندس واثق
برأيي، هذه المهارات ضرورية جداً لتتعلمها. وأقولها لكم بصراحة من تجربة شخصية: أتذكر عندما كنت مبرمجاً ثم أصبحت مهندس برمجيات. عندما كنت مبرمجاً فقط، كنت أعرف كيف أكتب أي كود، لكنني لم أكن واثقاً بنفسي أو بكيفية عمل الفرق. ولكن، بمجرد أن كتبت الكود ضمن دورة حياة برمجية متكاملة، أدركت أنني أصبحت قادراً على العمل مع أي شركة، في أي مكان، وفي أي مشروع، دون أي خوف أو رهبة من معنى كلمة ‘برمجيات’.