Menu
flag Ar iconالعربيةdown icon

برومبت البرمجة: كيف تحصل على كود يعمل

موجّهات البرمجة تنجح عندما تُقرأ كمواصفات صغيرة: اللغة وإصدارها، والمُدخلات والمخرجات، والحالات الحدّية، والاختبارات التي يجب أن يجتازها الكود. واطلب خطوة صغيرة واحدة في كل مرة.

يمكنك تعديل كل موجّه في هذه الصفحة ثم فتحه في ChatGPT أو Claude أو أي تطبيق ذكاء اصطناعي آخر.

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

اكتب المواصفات قبل الكود

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

دالة من مواصفات
Fill in
Parts
أنت مطوّر Python دقيق يكتب دوال صغيرة مختبرة.
اكتب دالة `parse_duration(text)` تحوّل نص مدة زمنية إلى عدد من الثواني.
المُدخلات الصالحة تبدو مثل "1h30m" و"45m" و"2h" و"90s": ساعات ودقائق وثوانٍ، كل منها اختياري، ودائمًا بهذا الترتيب. "1h30m" تُرجع 5400. أي شيء آخر، ومنه النص الفارغ، غير صالح.
Python 3.11، المكتبة القياسية فقط. أطلق ValueError للمُدخل غير الصالح، مع المُدخل في الرسالة. لا تقبل الكسور العشرية مثل "1.5h".
أعطِ الدالة أولًا، ثم اختبارات pytest تغطي كل مثال أعلاه وثلاثة مُدخلات غير صالحة. لا شرح أكثر من جملة واحدة.
Try it
Example replyReplies vary between models and runs.

تطابق الدالة الأجزاء الاختيارية الثلاثة بالترتيب وترفض أي تطابق تكون فيه الأجزاء الثلاثة فارغة.

import re

_PATTERN = re.compile(r"(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?")

def parse_duration(text: str) -> int:
    match = _PATTERN.fullmatch(text)
    if not match or not any(match.groups()):
        raise ValueError(f"invalid duration: {text!r}")
    hours, minutes, seconds = (int(g) if g else 0 for g in match.groups())
    return hours * 3600 + minutes * 60 + seconds
import pytest
from duration import parse_duration

@pytest.mark.parametrize("text, expected", [
    ("1h30m", 5400), ("45m", 2700), ("2h", 7200), ("90s", 90),
])
def test_valid(text, expected):
    assert parse_duration(text) == expected

@pytest.mark.parametrize("text", ["", "1m1h", "1.5h"])
def test_invalid(text):
    with pytest.raises(ValueError):
        parse_duration(text)

أربعة تفاصيل في ذلك الموجّه تؤدي معظم العمل:

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

الشرط any(match.groups()) يستحق الانتباه أيضًا: النمط وحده يطابق النص الفارغ، لأن كل جزء اختياري. وسطر الموجّه عن النص الفارغ هو ما يجعل هذه الحالة تظهر في الكود وفي الاختبارات.

سمِّ الإصدار والتقنيات وما هو موجود أصلًا

تميل النماذج إلى الأسلوب الأكثر شيوعًا في بيانات تدريبها. في JavaScript قد يعني ذلك require بأسلوب CommonJS في مشروع يستخدم وحدات ES، وفي Python قد يعني واجهة مكتبة تغيّرت منذ ذلك الحين (Pydantic 1 مقابل 2 حالة شائعة)، وفي أي إطار عمل سريع التطور قد يعني نمطًا من إصدارين رئيسيين سابقين. سطر واحد يصلح ذلك عادةً: "Node 22، وحدات ES، دون TypeScript" أو "React 19، مكوّنات الدوال، وحدات CSS عادية".

عندما تضيف إلى مشروع قائم، يحتاج النموذج إلى رؤية الأجزاء التي سيلمسها الكود الجديد. الصق توقيع الدالة التي يجب أن يستدعيها، وشكل البيانات التي سيتلقاها، وملفًا قائمًا واحدًا يُظهر أعرافك. عبارة "استخدم الدالة المساعدة db.query(sql, params) من الملف التالي" تعطيك كودًا يتلاءم مع مشروعك، ومن دونها قد تحصل على اتصال جديد بقاعدة البيانات مكتوب من الصفر. واترك الملفات التي لا علاقة لها بالتغيير، لأن كل سطر غير ذي صلة شيء قد يحاول النموذج إعادة استخدامه.

اطلب خطوة صغيرة واحدة في كل مرة

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

ابنِ لي تطبيق مهام فيه حسابات مستخدمين وقاعدة بيانات وتذكيرات ووضع داكن.
Try it
Example replyReplies vary between models and runs.

إليك تطبيق مهام متكاملًا باستخدام React وNode.js مع Express وMongoDB.

بنية المشروع

todo-app/
  client/   (واجهة React الأمامية)
  server/   (واجهة Express البرمجية، والمصادقة، والتذكيرات)

server/index.js

const express = require("express");
const mongoose = require("mongoose");
const app = express();
app.use(express.json());
// ... auth routes, todo routes and the reminder scheduler go here

للمصادقة يمكنك إضافة JWT باستخدام jsonwebtoken، وللتذكيرات مجدول مثل node-cron. أخبرني إن أردت أن أكمل أيًا من هذه الأجزاء.

الرد الأول ليس خاطئًا، لكنه هيكل فقط: اختار ثلاث تقنيات نيابة عنك وترك العمل الحقيقي تعليقات. أما الرد الثاني فقصير بما يكفي لقراءته، ويعمل بمجرد فتح الملف، ويعطيك قاعدة عاملة للخطوة 2 ("الآن احفظ القائمة في localStorage حتى تبقى بعد إعادة التحميل"). كل خطوة صغيرة بما يكفي لتعرف، حين ينكسر شيء، أي تغيير كسره.

هذه سلسلة موجّهات يدوية: مخرجات طلب تصبح نقطة بداية التالي. الصق النسخة الحالية من الملف في كل خطوة جديدة، حتى يعدّل النموذج الكود الموجود لديك فعلًا، لا الكود الذي يتذكر أنه كتبه.

اطلب خطة قبل التغيير الكبير

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

افحص ما يعود

يفشل الكود المولَّد بطرق قليلة متوقعة، ولكل منها عادة في الموجّه تلتقطها:

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

عندما يعمل الكود لكنه يتصرف بشكل خاطئ، انتقل إلى موجّه تصحيح أخطاء: تشرح صفحة موجّهات لتصحيح الأخطاء ما تلصقه. وقبل دمج أي شيء مهم، قد تلتقط مراجعة ثانية بـموجّه لمراجعة الكود مشكلات لم يفكر موجّه الكتابة في السؤال عنها.

الأسئلة الشائعة

ما أفضل موجّه للبرمجة مع ChatGPT أو Claude؟

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

ما هي موجّهات vibe coding؟

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

هل أخبر الذكاء الاصطناعي بإصدار لغة البرمجة الذي أستخدمه؟

نعم. اللغات والمكتبات تتغير بين الإصدارات، ومن دون ذلك سيكتب النموذج الأسلوب الأكثر شيوعًا في بيانات تدريبه، وقد يكون أقدم من بيئتك. تسمية الإصدار ("Python 3.12"، "React 19 مع مكوّنات الدوال"، "Node 22، وحدات ES") تتجنب إجابات مبنية على واجهات لا تملكها.

هل يمكنني الثقة بالكود الذي يكتبه الذكاء الاصطناعي؟

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

لماذا ينكسر الكود الذي يولّده الذكاء الاصطناعي حين يكبر مشروعي؟

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

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن