إما فيضان من البيانات أو جفاف في المعلومات: كيف أنقذنا GraphQL من جحيم طلبات REST المتعددة؟

يا جماعة الخير، السلام عليكم ورحمة الله.

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

لما بلّشنا نربط الواجهة الأمامية (Frontend) اللي عملوها الشباب بالواجهة الخلفية (Backend)، بدأت المأساة. عشان نعرض الصفحة الرئيسية بس، كان التطبيق يحتاج يعمل سلسلة من الطلبات: طلب يجيب معلومات المستخدم، وطلب ثاني يجيب آخر 5 منشورات إله، وطلب ثالث يجيب الإشعارات الجديدة، وطلب رابع يجيب صور أصحابه اللي “أونلاين” حالياً… يا زلمة، سلسلة ما بتخلص! التطبيق صار بطيء زي السلحفاة، خصوصاً على الإنترنت الضعيف. قلنا “بسيطة”، بنعمل endpoint واحد “أبو العرّيف” يرجع كل إشي مرة وحدة. والنتيجة؟ صرنا نستقبل ملف JSON حجمه قد رواية “الحرب والسلام”، مع إنه كل اللي محتاجينه هو اسم المستخدم وصورته وكم معلومة بسيطة. كنا عايشين في حالة غريبة: إما فيضان من البيانات اللي ما بدنا إياها، أو جفاف في المعلومات ونضطر نلاحقها بطلبات متتالية.

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

جحيم الـ REST API: القصة الكاملة للمعاناة

قبل ما نحكي عن المنقذ، خلونا نفهم طبيعة الوحش اللي كنا بنواجهه. معمارية REST عظيمة وقدمت الكثير للويب، لكنها مثل أي أداة، لها حدودها ومشاكلها اللي بتظهر في سيناريوهات معينة.

مشكلة الجلب الزائد (Over-fetching): فيضان لا نريده

تخيل أنك تريد فقط معرفة اسم المستخدم وصورته الشخصية لعرضها في رأس الصفحة. في عالم REST التقليدي، قد تضطر لاستدعاء نقطة نهاية (endpoint) مثل /api/users/123. المشكلة أن هذه النقطة قد تكون مصممة لخدمة أغراض أخرى أيضاً، فتعيد لك كل شيء عن المستخدم:


// GET /api/users/123
{
  "id": "123",
  "name": "أبو عمر الفلسطيني",
  "username": "abu_omar_dev",
  "email": "abu.omar@example.com",
  "bio": "مبرمج ومطور برمجيات فلسطيني خبير...",
  "birth_date": "1985-01-15",
  "address": {
    "street": "شارع يافا",
    "city": "القدس",
    "country": "فلسطين"
  },
  "followers_count": 5000,
  "following_count": 250,
  "created_at": "2020-05-10T10:00:00Z"
  // ... والمزيد من البيانات التي لا تحتاجها الآن
}

أنت احتجت حقلين فقط (name و profile_picture – لنفترض أنها جزء من البيانات)، لكنك استلمت حمولة ضخمة. هذا هو “الفيضان” أو الـ Over-fetching. إنه استهلاك غير ضروري للشبكة والذاكرة، ويجعل تطبيقك بطيئاً دون أي مبرر.

مشكلة الجلب الناقص (Under-fetching): رحلة الشلالات المتتالية

هذه هي المشكلة الثانية والمكملة للأولى. تخيل الآن أنك تريد عرض صفحة المستخدم الشخصية، والتي تحتوي على معلوماته الأساسية وآخر 3 منشورات له.

باستخدام REST، ستكون الرحلة كالتالي (وهذا ما يعرف بـ “شلال الطلبات” أو Request Waterfall):

  1. الطلب الأول: جلب معلومات المستخدم.

    GET /api/users/123
  2. الطلب الثاني: بعد أن حصلت على معلومات المستخدم، تستدعي نقطة نهاية أخرى لجلب منشوراته.

    GET /api/users/123/posts?limit=3

وفي بعض التصاميم الأسوأ، قد تضطر لعمل طلب لكل منشور على حدة! هذا هو “الجفاف” أو الـ Under-fetching، حيث لا يمنحك الطلب الأول كل ما تحتاجه، فتضطر للقيام برحلات متعددة ذهاباً وإياباً إلى الخادم، مما يزيد من زمن الاستجابة الكلي بشكل كبير.

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

المنقذ GraphQL: كيف غيّر قواعد اللعبة؟

GraphQL ليست مكتبة أو إطار عمل، بل هي “لغة استعلام” للـ API. الفكرة عبقرية وبسيطة في آن واحد: بدلاً من أن يكون للخادم نقاط نهاية متعددة وثابتة، يكون لديه نقطة نهاية واحدة فقط (عادة /graphql)، والعميل (Client) هو من يحدد شكل وبنية البيانات التي يريدها بالضبط في طلبه.

لا زيادة ولا نقصان. أنت تطلب، والخادم يُلبي طلبك بالحرف.

بنية طلب GraphQL: أنت تطلب، والخادم يُلبي

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


query GetUserProfileAndPosts {
  user(id: "123") {
    name
    bio
    posts(last: 3) {
      id
      title
      createdAt
      comments(first: 1) {
        body
        author {
          name
        }
      }
    }
  }
}

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

والاستجابة التي ستعود من الخادم ستكون مطابقة تماماً لهيكل طلبك:


{
  "data": {
    "user": {
      "name": "أبو عمر الفلسطيني",
      "bio": "مبرمج ومطور برمجيات فلسطيني خبير...",
      "posts": [
        {
          "id": "post-1",
          "title": "مقالتي الجديدة عن GraphQL",
          "createdAt": "2023-10-27T12:00:00Z",
          "comments": [
            {
              "body": "مقال رائع يا أبو عمر!",
              "author": {
                "name": "أحمد"
              }
            }
          ]
        },
        // ... منشورين آخرين
      ]
    }
  }
}

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

مقارنة عملية: REST مقابل GraphQL وجهاً لوجه

دعونا نلخص الفروقات الرئيسية في نقاط بسيطة:

  • نقاط النهاية (Endpoints): في REST، لديك العديد من نقاط النهاية (/users, /posts, /comments). في GraphQL، لديك عادةً نقطة نهاية واحدة (/graphql).
  • هيكلية البيانات: في REST، الخادم هو من يقرر هيكل البيانات المُرجعة. في GraphQL، العميل هو من يصف ويطلب هيكل البيانات الذي يحتاجه.
  • مشاكل الجلب: REST يعاني من الـ Over-fetching والـ Under-fetching. GraphQL مصمم خصيصاً لحل هاتين المشكلتين.
  • التوثيق والأنواع (Schema & Typing): في REST، تحتاج لأدوات خارجية مثل Swagger/OpenAPI لتوثيق الـ API. في GraphQL، الـ Schema (المخطط) هو جزء أساسي من التقنية نفسها، وهو موثّق ذاتياً ومكتوب بلغة قوية الأنواع (Strongly-typed)، مما يمنع الكثير من الأخطاء ويسهل التكامل بين الفرق.

نصائح من “أبو عمر”: متى تختار GraphQL ومتى تبقى مع REST؟

بعد كل هذا المديح لـ GraphQL، قد تعتقد أن REST قد “راح زمانه”. هذا غير صحيح إطلاقاً. كما نقول في فلسطين “كل فولة وإلها كيّال”. لكل تقنية مكانها وزمانها.

متى يكون GraphQL هو الخيار الأمثل؟

  • تطبيقات الموبايل: حيث تكون كفاءة الشبكة وسرعة الاستجابة أمراً حاسماً.
  • الأنظمة المعقدة: عندما يكون لديك بيانات متشابكة ومترابطة (مثل شبكة اجتماعية أو نظام إدارة محتوى ضخم).
  • تعدد الواجهات (Clients): إذا كان لديك تطبيق ويب، وتطبيق موبايل (iOS/Android)، وربما لوحة تحكم داخلية، كل منها يحتاج مجموعة مختلفة من البيانات. GraphQL يسمح لكل واجهة بطلب ما تحتاجه فقط دون الحاجة لتعديل الواجهة الخلفية.

ومتى لا يزال لـ REST مكانه؟ (لسّا الختيار فيه نفس)

  • الـ APIs البسيطة: إذا كان لديك API بسيط يقوم بعمليات CRUD (إنشاء، قراءة، تعديل، حذف) على موارد محددة وغير مترابطة بشكل معقد، فإن REST يكون أسهل وأسرع في التنفيذ.
  • التعامل مع الملفات: عمليات رفع وتحميل الملفات لا تزال أبسط وأكثر مباشرة باستخدام REST.
  • التخزين المؤقت (Caching): بما أن طلبات REST تستخدم أفعال HTTP القياسية (GET, POST, DELETE)، فمن السهل جداً تخزين نتائج طلبات GET مؤقتاً على مستوى الـ HTTP (المتصفح، CDN، إلخ). في GraphQL، معظم الطلبات تكون POST، مما يجعل التخزين المؤقت على هذا المستوى أكثر تعقيداً (وإن كان ممكناً).
  • عندما يكون فريقك معتاداً عليه: لا تقلل من أهمية خبرة فريقك. إذا كان فريقك خبيراً في REST ويمكنه بناء APIs فعالة بسرعة، فقد لا تكون تكلفة تعلم واعتماد GraphQL مبررة لمشروع بسيط. “القديم نديم” كما يقولون.

الخلاصة: لا تكن ضحية بياناتك 💡

في النهاية، القصة ليست “GraphQL ضد REST”. القصة هي عن فهم المشكلة واختيار الأداة المناسبة لحلها. لقد أنقذنا GraphQL في ذلك المشروع المعقد لأنه عالج مباشرةً مشكلة “الفيضان والجفاف” التي كنا نعاني منها.

REST لم يمت ولن يموت قريباً، فهو لا يزال الخيار الأمثل للكثير من الحالات. ولكن GraphQL قدم لنا طريقة جديدة وقوية للتفكير في كيفية تواصل تطبيقاتنا مع البيانات.

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

أبو عمر

سجل دخولك لعمل نقاش تفاعلي

كافة المحادثات خاصة ولا يتم عرضها على الموقع نهائياً

آراء من النقاشات

لا توجد آراء منشورة بعد. كن أول من يشارك رأيه!

آخر المدونات

تجربة المستخدم والابداع البصري

كانت واجهاتنا خليطاً عجيباً: كيف أنقذتنا ‘رموز التصميم’ (Design Tokens) من فوضى التناقضات؟

أشارككم قصة من قلب المعركة البرمجية، كيف انتقلنا من فوضى الألوان والأحجام المتضاربة بين تطبيقاتنا على الويب وiOS وأندرويد، إلى نظام متناغم وموحد. الفضل يعود...

29 أبريل، 2026 قراءة المزيد
الحوسبة السحابية

كانت الأحمال المفاجئة تكسر ظهرنا: كيف أنقذتنا الحوسبة بدون خوادم (Serverless) من جحيم التوسع اليدوي؟

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

29 أبريل، 2026 قراءة المزيد
التوظيف وبناء الهوية التقنية

كنت أعرف الإجابة التقنية ولكني أرسب: كيف أنقذتني طريقة ‘STAR’ من جحيم المقابلات السلوكية؟

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

29 أبريل، 2026 قراءة المزيد
التوسع والأداء العالي والأحمال

كان فشل خدمة واحدة ينهار النظام بأكمله: كيف أنقذنا نمط ‘قاطع الدائرة’ من جحيم الفشل المتتالي؟

أشارككم قصة حقيقية عن ليلة كاد فيها تطبيقنا أن ينهار بالكامل بسبب فشل خدمة صغيرة. اكتشفوا كيف أنقذنا نمط تصميم "قاطع الدائرة" (Circuit Breaker) من...

29 أبريل، 2026 قراءة المزيد
التكنلوجيا المالية Fintech

من كوابيس التحقق اليدوي إلى ثورة الـ eKYC: قصتي مع إنقاذ الشركات من الاحتيال والتأخير

أتذكر جيداً أكوام الورق التي كادت أن تدفننا في أحد المشاريع الناشئة. في هذه المقالة، أشارككم قصة تحولنا من جحيم التحقق اليدوي لهوية العملاء إلى...

29 أبريل، 2026 قراءة المزيد
ادارة الفرق والتنمية البشرية

اجتماعاتنا كانت حقل ألغام: كيف أنقذتنا ‘السلامة النفسية’ من جحيم الصمت والخوف من الخطأ؟

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

29 أبريل، 2026 قراءة المزيد
البودكاست