البرمجة

بنى المعطيات للمبتدئين

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

  • الدرس 8 من 14
  • مبتدئ
  • مجاني، دون تسجيل

اختيار بنية المعطيات انطلاقا من السؤال الذي ستطرحه لاحقا

ما الذي ستسأله عن هذه المعطيات لاحقا؟جواب هذا السؤال هو بنية معطياتك
  • القائمة

    هل يغير تبديل عضوين المعنى؟ إذن فالترتيب نفسه معلومة.

    الترتيب
  • القاموس

    هل تصل إلى شيء بعينه باسم بعينه؟ فالمفتاح، خلافا للرقم، لا ينزاح.

    المفتاح
  • المجموعة

    هل تريد فقط أن تعرف هل هو موجود؟ وهي تحذف المكرر أيضا لحظة دخوله.

    العضوية
  • الصف المرتب

    كالقائمة نفسها، مع ضمان أنه لا يتغير بعد بنائه.

    ثابت

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

آخر مراجعة: تُراجع الحقائق وأسماء الأدوات في هذا الدرس مقابل مصادرها في هذا التاريخ.

ما بنية المعطيات، ولماذا يهم اختيارها؟

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

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

وهذه هي القاعدة التي تأخذها من هذا الدرس. حين تقرر في أي شكل تحفظ المعطيات، لا تنظر إلى المعطيات نفسها؛ انظر إلى السؤال الذي ستطرحه عليها لاحقا. فـ«أي عضو هو الثالث» سؤال، و«ما قيمة هذا المفتاح» سؤال آخر، و«هل هذا الشيء موجود هنا أصلا» سؤال ثالث. ثلاثة أسئلة، ثلاثة أشكال.

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

القائمة: حين يكون الترتيب نفسه معلومة

القائمة عدة أشياء واحدا تلو الآخر مع حفظ ترتيبها. وحفظ الترتيب هذا هو الشيء الوحيد الذي يفصل القائمة عن غيرها، وهو أهم مما يبدو.

prices = [12000, 8000, 15000]

prices.append(9000)
print(prices[0])
print(len(prices))

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

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

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

القاموس: حين يحل المفتاح محل الرقم

القاموس أزواج من مفتاح وقيمة. فبدل أن تجد شيئا برقمه، تجده باسمه. وتسميه اللغات المختلفة بأسماء مختلفة، لكن الفكرة واحدة.

user = {"name": "sara", "city": "shiraz"}

print(user["city"])
user["city"] = "tabriz"

وإليك الفرق المهم الذي يُتخطى عادة: حين تكتب user["city"]، لا يبحث البرنامج داخل القاموس. بل يذهب مباشرة إلى الموضع الصحيح. ولو كنت قد حفظت المعطيات نفسها في قائمة من الأزواج، لكان إيجاد المدينة يعني قراءة القائمة كلها من أولها حتى تصل إلى الزوج الذي مفتاحه المدينة.

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

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

رقم أم مفتاح؟ يظهر الفرق حين تتغير المعطيات

القائمة: العنوان رقم

الأرقام تبدأ من الصفر

  • الرقم يقول أين يقف الآن
  • احذف عضوا يتغير كل رقم بعده
كلاهما يحفظ المعطيات نفسها

القاموس: العنوان مفتاح

أنت من يختار المفتاح

  • المفتاح يقول من هو العضو لا أين هو
  • مهما أُضيف أو حُذف يبقى المفتاح كما هو

وهنا يظهر الفرق

إيجاد عضو بعينه

العمل الذي يُنجَز عادة داخل حلقة

  • في القائمة: اقرأ من الأول حتى تجده
  • في القاموس: اذهب مباشرة إلى المفتاح

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

المجموعة: حين تريد فقط أن تعرف هل هو موجود

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

tags = {"seo", "speed", "seo"}

print(len(tags))
print("seo" in tags)

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

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

$used = array();

// ... داخل حلقة تبني معرِّفا لكل عنوان:
while ( isset( $used[ $id ] ) ) {
    $id = $base . '-' . $n++;
}
$used[ $id ] = true;

انظر إلى true تلك: لا تُقرأ في أي موضع من البرنامج. فالمخزَّن حقا هو المفتاح نفسه، أي «هذا المعرِّف مستعمل من قبل». وهذا بالضبط تعريف المجموعة، مبنيا من الأداة التي كانت متاحة. وسبب عدم صلاح القائمة هنا هو سبب القسم السابق نفسه: isset تذهب مباشرة إلى المفتاح، أما البحث عن معرِّف في قائمة معرِّفات فيعني قراءة القائمة كلها، وذلك داخل حلقة تُنفَّذ مرة لكل عنوان.

أيها يُستعمل أين؟

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

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

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

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

قرار حقيقي: لماذا ليس سجل نشر هذه الدروس قائمة

قسم التعلم الذي تقرؤه الآن ينشر دروسه واحدا واحدا وفق جدول: ثلاثة دروس يوميا، بالتناوب بين ستة عشر مسارا. وترتيب هذه الأدوار لا يُخزَّن؛ بل يُعاد حسابه من الدروس نفسها في كل مرة.

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

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

'seo/how-search-engines-work' => 1788539040

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

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

حين يُعاد بناء الصف، ما الذي ينزاح وما الذي لا ينزاح

  1. 1

    يُملأ مسار جديد

    تُضاف بضعة دروس جديدة إلى القسم.

  2. 2

    يُعاد حساب الصف

    تُرتَّب الأدوار بالتناوب بين المسارات.

  3. 3

    تجلس الدروس الجديدة وسط الصف

    يتقدم موضع كل درس بعدها مرتبة واحدة.

  4. 4

    مع قائمة: يختفي درس الأمس

    لم يعد ضمن الخمسة الأولى، فيسقط من القائمة وتصير صفحته ٤٠٤.

  5. 5

    مع مفتاح: لا شيء ينزاح

    لم يكن المفتاح موضعا قط؛ بل كان اسم الدرس نفسه.

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

المسار السريع مع الذكاء الاصطناعي

ما صار أسرع فعلا في هذا الموضوع ليس كتابة قائمة أو قاموس، فذلك لم يكن بطيئا يوما. الذي صار أسرع هو اكتشاف أن معطيات موجودة أصلا في برنامجك محفوظة في الشكل الخاطئ. كان هذا يحتاج خبرة سنوات وصار الآن رسالة واحدة، بشرط أن تطرح السؤال الصحيح: لا تقل «حسّن هذه الشفرة»، بل قل «ما الأسئلة التي تُستعمل هذه المعطيات للإجابة عنها». وهذا عمل حكم فيريد نموذجا من الطبقة المتقدمة؛ واختيارنا الحالي بين نماذج البرمجة موجود في قسم الذكاء الاصطناعي في هذا الموقع.

  1. انسخ الموضع الذي تُبنى فيه المعطيات مع كل موضع تُقرأ فيه. فبنية المعطيات لا يمكن الحكم عليها من موضع إنشائها؛ إذ يحسمها السؤال الذي يُطرح عليها لاحقا، وذلك السؤال مكتوب في موضع آخر.
  2. أرسل الوصفة أدناه واقرأ أولا جدول الأسئلة وحده قبل أي اقتراح. فإن وجدت في الجدول سؤالا لم تظن أن برنامجك يطرحه، فتوقف هناك؛ فأنت على الأرجح عرفت للتو ما تفعله شفرتك.
  3. لا تقبل اقتراح تغيير الشكل إلا حين ترى سؤاله المقابل في الجدول. فإعادة تشكيل معطيات لا يطرح عليها أحد سؤالا باهظا مخاطرة صرفة بلا مكسب.
  4. بعد التغيير، ابحث عن كل موضع كان يحفظ رقما أو موضعا في مكان ما. فهذه هي المواضع التي تنكسر بهدوء، لأن الرقم الذي حفظته لم يعد يشير إلى العضو نفسه بعد تغير الشكل.

وصفة جاهزة للنسخ

أريد أن أعرف هل المعطيات أدناه محفوظة في الشكل الصحيح. لا تغير الشفرة.

الموضع الذي تُبنى فيه المعطيات:
{ضع الشفرة هنا}

المواضع التي تُقرأ فيها:
{ضع هنا كل موضع تُستعمل فيه هذه المعطيات}

أولا، أعطِ جدولا فقط بهذه الأعمدة الثلاثة وبلا أي تعليق آخر:
| السؤال الذي تطرحه الشفرة على هذه المعطيات | أين يُطرح | ما الذي يُفعل للإجابة عنه |

وبعد الجدول:
١. قل أي من هذه الأسئلة يُجاب عنه بثمن باهظ، أي تُقرأ المجموعة كلها للإجابة عنه.
٢. إن كان ينبغي تغيير الشكل، فقل إلى أي شكل وأي صف من الجدول يجعله رخيصا.
٣. وإن كان الشكل الحالي صحيحا، فقل ذلك واكتب سببه. و«كل شيء على ما يرام» جواب مقبول.
٤. عدّد كل موضع يعتمد على رقم الأعضاء أو مواضعها وسينكسر إن تغير الشكل.

وإن احتاج أي من ذلك شفرة لم أعطك إياها، فقل أيها؛ ولا تخمّن.

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

الذكاء الاصطناعي في هذا العمل

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

أدوات تساعد فعلا

  • Claude Code الأنسب لهذا الموضوع، لأن سؤال «أين تُقرأ هذه المعطيات» لا جواب له إلا برؤية المستودع كله ولا يكفي فيه مقطع واحد. يُثبَّت مجانا لكنه لا يعمل دون اشتراك كلود أو حساب في كونسول أنثروبيك، وإيران ليست في قائمة الدول المدعومة.
  • Claude خيار جيد حين تنسخ الشفرة بنفسك، وهو يؤدي عمل بناء جدول الأسئلة المذكور في المسار السريع. وإيران ليست في أي من قائمتي الدول المدعومة لدى أنثروبيك؛ قرأنا ذلك في صفحة أنثروبيك نفسها لا عبر اختبار شبكة.
  • Gemini وضع الدراسة فيه، Guided Learning، يطرح أسئلة بدل تسليم الأجوبة، وهو أنجع لترسيخ الفرق بين الفهرس والمفتاح، وهو لب هذا الدرس، من جواب جاهز. وصفحة غوغل نفسها تقول إن تطبيق جيميناي على الويب يعمل في أكثر من ٢٣٠ دولة وإقليما، وإيران ليست في تلك القائمة.

اين ينقلب ضدك

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

المصادر: Anthropic: reduce hallucinations Anthropic: supported countries Claude Code: overview and install Google: where the Gemini web app is available

حدود هذه النصيحة

كُتب هذا الدرس عمدا في حد العمل اليومي ونذكر حدوده صراحة. أولا، لم نتطرق في أي موضع من هذه الصفحة إلى التعقيد الحسابي ورمز O الكبير. وكلمتا «رخيص» و«باهظ» اللتان قرأتهما وصف لا قياس، ولا نعطي أي رقم عن السرعة لأننا لم نقسها على هذا الخادم. وثانيا، البنى التالية التي ترد في أي كتاب عن بنى المعطيات غائبة هنا: المكدس والطابور والشجرة والمخطط وطابور الأولوية. وكل منها يجعل سؤالا بعينه رخيصا، ويوم تصطدم بذلك السؤال ستعرف بنفسك ما تبحث عنه. وثالثا، الأسماء والضمانات تختلف بين اللغات: ففي PHP نوع مصفوفة واحد هو قائمة وقاموس معا، وفي جافاسكريبت الكائنات وMap شيئان منفصلان بسلوكين مختلفين. وأخيرا، هذا الدرس عن معطيات تسع في ذاكرة برنامج واحد؛ فحين تكبر المعطيات على الذاكرة ينتقل الحديث من بنى المعطيات إلى قواعد البيانات، وذلك موضوع درس آخر.

من عملنا نحن

المثالان الواردان في هذا الدرس كلاهما من شفرة هذا الموقع نفسه، وقد قُرئا من جديد يوم مراجعة هذه الصفحة. الأول هو المجموعة المبنية من مصفوفة: فعبارة $used[ $id ] = true; ترد في ثلاثة ملفات من القالب، هي inc/editorial.php وinc/helpers.php وinc/diagram-posts.php، وفي الثلاثة جميعا تجلس تحت while ( isset( $used[ $id ] ) ) مباشرة. ولا تُقرأ true في أي من هذه المواضع الثلاثة؛ فالمخزَّن هو المفتاح نفسه. والثاني هو سجل نشر قسم التعلم هذا بعينه: خيار في قاعدة البيانات اسمه rgbl_announced، كان يوم مراجعة هذا الدرس يحمل خمسة مفاتيح وشكله هذا بالضبط: عنوان درس مقابل طابع زمني. وما يبينه المثالان معا، ولا يكتبه أي كتاب تمهيدي، هو أنك في العمل كثيرا ما لا تختار بنية معطيات أصلا، بل تبنيها مما تعطيك إياه لغتك؛ والذي تختاره فعلا هو ماذا سيكون عنوان كل عضو، وذلك الاختيار هو ما يحدد ما الذي ينكسر حين تتغير المعطيات.

اسئلة متابعة حقيقية

ما الفرق بين المصفوفة والقائمة؟

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

متى أنقل المعطيات من قائمة إلى قاموس؟

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

هل يلزمني دراسة بنى المعطيات والخوارزميات بجدية لأبدأ؟

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