يا جماعة الخير، السلام عليكم ورحمة الله.
خليني أحكيلكم قصة صارت معي قبل فترة مش طويلة. كنا شغالين على مشروع ضخم، نظام إدارة متكامل لشركة كبيرة، والموعد النهائي للتسليم (الـ deadline) كان بيقرّب علينا زي الصاروخ. الفريق كله كان تحت ضغط رهيب، سهرانين الليالي وبنشتغل زي النحل. المشكلة ما كانت في منطق العمل (Business Logic) المعقد، بالعكس، هاد هو الجزء الممتع. المشكلة كانت في “الحشو”.
كنا بنقضي ساعات وساعات في كتابة نفس الكود تقريبًا مرة ورا مرة. اعمل لي API endpoint جديد، لازم تكتب الـ route، والـ controller، والـ validation، والتعامل مع الأخطاء… كله شبه بعضه مع تغييرات بسيطة. كل ما بدنا نعمل واجهة جديدة في التطبيق، لازم نكتب نفس الهيكل الأساسي للمكون (Component). حسيت حالي مش مبرمج، حسيت حالي عامل على خط إنتاج في مصنع، بيكبس نفس الكبسة ألف مرة في اليوم. وصلت مرحلة صرت أحكي للشباب: “يا زلمة، انجلطنا! لو في طريقة بس ننسخ ونلصق هالشغلات بشكل أذكى، كان وفرنا نص وقتنا”.
في ليلة من الليالي، وأنا بقلّب في تويتر بعد ما يأست من البحث في Stack Overflow عن حل لمشكلة تافهة، شفت حدا بيحكي عن GitHub Copilot. في الأول تجاهلته، قلت “كمان أداة ذكاء اصطناعي بدهم يبيعونا إياها”. بس الفضول غلبني، وقررت أجربه… ومن وقتها، يا جماعة، تغير كل شيء.
لماذا يعتبر الكود المعياري (Boilerplate) كابوسًا للمطورين؟
قبل ما نخش في تفاصيل Copilot، خلينا نتفق على تعريف “الكود المعياري” أو زي ما بنحكي بالإنجليزي “Boilerplate code”. هو ببساطة الكود اللي لازم تكتبه في أماكن كتير في مشروعك عشان تخلي الأشياء تشتغل، بس هو نفسه ما بيضيف أي قيمة “ذكية” أو “فريدة” للمشروع. هو مجرد هيكل أو إطار ضروري.
أمثلة بسيطة من واقعنا اليومي:
- إعداد ملفات الإعدادات (Config files).
- كتابة بنية الـ `try-catch` للتعامل مع الأخطاء.
- إنشاء واجهات (Interfaces) في TypeScript بناءً على استجابة من API.
- كتابة الهيكل الأساسي لمكون React أو Vue.
- إنشاء مسارات API (routes) بسيطة لعمليات CRUD (Create, Read, Update, Delete).
المشكلة في هذا الكود مش بس إنه ممل، المشكلة إنه بيستنزف طاقتنا الذهنية. كل مرة بتنتقل من التفكير في مشكلة معقدة لكتابة كود معياري تافه، بتعمل “context switch” بيكلفك وقت وتركيز. وهذا هو “جحيم التكرار” اللي بيقتل الإبداع والإنتاجية.
GitHub Copilot: الزميل اللي ما بنام
بعد ما جربته هذيك الليلة، وصحيت تاني يوم ورجيت الفريق كيف بيشتغل، صار Copilot هو “الزميل” الجديد في فريقنا. زميل ما بيطلب قهوة، ما بيتعب، وما بيطلب إجازة. هو عبارة عن مساعد ذكاء اصطناعي مدمج في محرر الأكواد (مثل VS Code)، تم تدريبه على مليارات الأسطر من الكود المفتوح المصدر على GitHub.
ما هو Copilot بالضبط؟
ببساطة، هو أداة بتفهم سياق الكود اللي بتكتبه، وبتقترح عليك إكمال الأسطر أو حتى كتابة دوال (functions) كاملة. أنت بس بتعطيه تلميح، إما عن طريق كتابة بداية الكود، أو عن طريق كتابة تعليق (comment) يشرح إيش بدك، وهو بيكمل عنك. مش سحر، هو عبارة عن نموذج لغوي ضخم (LLM) متخصص في البرمجة.
كيف أنقذنا من جحيم التكرار والبحث؟
خليني أكون عملي وأعطيكم أمثلة حقيقية من “مطبخنا البرمجي”:
- التخلص من كتابة الـ API Endpoints المملة: بدل ما نكتب كل مرة نفس الهيكل، صرنا نعمل هيك:
// in Express.js // POST route to create a new product with name, price, and description // the data comes from the request body // validate the input: name is required string, price is required number // save it to the database using Prisma client // return the created productوبدون مبالغة، في أقل من ثانية، Copilot بيقترح عليك الكود التالي كاملًا، مع التعامل مع الأخطاء وكل شيء:
app.post('/products', async (req, res) => { const { name, price, description } = req.body; if (!name || typeof name !== 'string') { return res.status(400).json({ error: 'Name is a required string.' }); } if (!price || typeof price !== 'number') { return res.status(400).json({ error: 'Price is a required number.' }); } try { const newProduct = await prisma.product.create({ data: { name, price, description, }, }); res.status(201).json(newProduct); } catch (error) { console.error(error); res.status(500).json({ error: 'Something went wrong while creating the product.' }); } });شوف كمية الوقت والجهد اللي وفرناها! بدل ما نكتب 20 سطر، كتبنا تعليق من 4 أسطر.
- الهروب من جحيم التوثيق (Documentation Hell): كنا بدنا نستخدم مكتبة جديدة للتعامل مع التواريخ اسمها `date-fns`. بدل ما أفتح موقعهم وأقعد أقرأ التوثيق لساعات، كتبت تعليق بسيط:
// using date-fns, format the current date to be like "Sunday, 25th of December 2023"Copilot فورًا اقترح السطر الصحيح مع الـ `import` اللازم. هذا الشيء صار ينطبق على كل شيء تقريبًا، من التعامل مع AWS SDK إلى مكتبات الرسوم البيانية. صرنا نستكشف المكتبات بشكل أسرع بكثير.
أمثلة عملية من المطبخ البرمجي (مع Copilot)
خلينا نتعمق أكتر في سيناريوهات متقدمة شوي.
1. كتابة اختبارات الوحدات (Unit Tests) بسرعة البرق
كتابة الاختبارات ضرورية، بس مملة جدًا. تخيل عندك دالة بسيطة زي هاي:
function calculateTotalPrice(items) {
if (!items || items.length === 0) {
return 0;
}
return items.reduce((sum, item) => sum + item.price * item.quantity, 0);
}
بكل بساطة، بروح على ملف الاختبار وبكتب تعليق:
// write unit tests for the calculateTotalPrice function
// test case 1: empty array
// test case 2: array with one item
// test case 3: array with multiple items
Copilot بيفهم السياق وبيقترح عليّ ملف اختبار كامل باستخدام Jest أو أي إطار عمل آخر أنت بتستخدمه في مشروعك.
2. التعامل مع البيانات المعقدة (JSON و APIs)
كتير بنتعامل مع APIs بترجع لنا كتل ضخمة من بيانات JSON. في TypeScript، من أفضل الممارسات إنه نعمل `interface` عشان نضمن النوع الصحيح للبيانات. بدل ما أكتبها يدويًا، بعمل هيك:
// From the JSON object below, create a TypeScript interface named "User"
/*
{
"id": 1,
"name": "Abu Omar",
"username": "abuomar",
"email": "abu.omar@example.com",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org"
}
*/
والنتيجة؟ Copilot بيولد الـ `interface` كاملة ومتداخلة بشكل صحيح، بدون أي خطأ إملائي أو نسيان لأي حقل.
3. ترجمة الكود بين اللغات (أو ما يشبه السحر)
مرات بنلاقي حل لمشكلة معينة بلغة برمجة ما بنعرفها كويس، مثلا Python، وإحنا مشروعنا بـ JavaScript. مع Copilot، هاي بطلت مشكلة. بقدر أنسخ كود الـ Python وأحطه في تعليق وأطلب منه يترجمه:
// Translate the following Python code to JavaScript
/*
def is_palindrome(s):
s = ''.join(filter(str.isalnum, s)).lower()
return s == s[::-1]
*/
وفجأة، بتحصل على النسخة المعادلة بالـ JavaScript. هاي الميزة لحالها بتستاهل سعر الاشتراك.
نصائح من أخوكم أبو عمر للاستفادة القصوى من Copilot
بعد شهور من الاستخدام اليومي، تعلمت كم شغلة بتخلي تجربتك مع Copilot أفضل بكثير. “اسأل مجرب ولا تسأل حكيم”.
- كن دقيقًا في تعليقاتك: Copilot زي الطفل الذكي، كل ما كان سؤالك أو طلبك أوضح، كانت إجابته أفضل. بدل ما تكتب `// function to get users`، اكتب `// async function to get all active users from the database, sorted by registration date descending`.
- لا تثق به ثقة عمياء: “دير بالك، مش كل شي بلمع ذهب”. Copilot أداة مساعدة، مش بديل عن عقلك. دائمًا راجع الكود اللي بيقترحه. هل هو آمن؟ هل هو فعال؟ هل هو أفضل طريقة لعمل الشيء؟ أنت القبطان، هو مجرد مساعد.
- استخدمه للتعلم، وليس للغش: لما يقترح عليك كود ما بتفهمه، لا تعمل “Tab” وتكمل. وقف لحظة وحاول تفهم ليش كتب الكود بهاي الطريقة. هاي فرصة ذهبية للتعلم.
- قسّم المشكلة: بدل ما تطلب منه يبني لك “نظام تسجيل دخول كامل مع Authenitcation و Authorization”، قسّمها. اطلب منه أولاً دالة للتحقق من كلمة المرور، بعدين دالة لإنشاء JWT، وهكذا.
الخلاصة: هل هو مجرد أداة أم ثورة في عالم البرمجة؟
بصراحة، هو الاثنين معًا. هو أداة بتخلينا أسرع وأكثر إنتاجية، ولكنه أيضًا بداية ثورة في كيفية تفاعلنا مع عملية كتابة الكود نفسها. هو ما لغى المبرمج، بالعكس، هو حرّر المبرمج من المهام المملة والمتكررة عشان يركز على الإبداع وحل المشاكل الحقيقية.
نصيحتي الأخيرة لكل مطور ومطورة، سواء كنت مبتدئ أو خبير: لا تخاف من أدوات الذكاء الاصطناعي. تعلم كيف تستخدمها لصالحك. المستقبل مش للمبرمج اللي بيعرف يكتب كل شيء من الصفر، المستقبل للمبرمج اللي بيعرف كيف يستخدم أفضل الأدوات المتاحة عشان يبني أفضل المنتجات بأسرع وقت.
تبني هذه الأدوات لا يجعلك مبرمجًا أقل شأنًا، بل يجعلك مهندسًا أكثر ذكاءً وفعالية. يلا، جربوه واحكولي رأيكم. 🚀