tarekamr.com — عودة الكتابة الديناميكية: هل ده ممكن؟
~ / pages / عودة الكتابة الديناميكية: هل ده ممكن؟

عودة الكتابة الديناميكية: هل ده ممكن؟

ولا الكتابة الثابتة كانت النموذج الصح من البداية؟

صورة بواسطة Michael Marais على Unsplash

لو بتتابع عالم البرمجة دلوقتي، هتلاحظ حاجة: الكتابة الثابتة (Static Typing) كسبت المعركة!

مش مصدقني؟ روح على Stack Overflow أو كورا واسأل: "إيه أحسن: Static ولا Dynamic Typing؟" - هتلاقي معظم الإجابات بتفضل Static Typing.

الدليل في كل حتة:

  • JavaScript → بيتحول لـ TypeScript (إضافة types)
  • Python و PHP → بيتضاف ليهم Type Hints (تلميحات الأنواع)
  • Java، Go، Rust → شعبيتهم بتزيد كل يوم!

ولو حاولت تعارض الوضع ده (زي ما DHH - مخترع Ruby on Rails - عمل)، ممكن تتعرض للإلغاء (cancel) من المجتمع!

السؤال: ليه Static Typing كسب؟ وهل فيه مستقبل لـ Dynamic Typing؟

عشان نفهم ده، لازم الأول نفهم: Static Typing مش بس مصطلح تقني - ده عقلية كاملة.

الكتابة الثابتة عقلية قبل ما تكون مصطلح علوم حاسب

تعالى نفهم المصطلحات الأول

1. Static vs. Dynamic Type Checking (فحص النوع الثابت ضد الديناميكي):

Static (ثابت):

  • نوع المتغير معروف وقت الترجمة (compile time)
  • مش بيتغير بعد ما يتحدد
  • مثال: لو x عدد صحيح، هيفضل عدد صحيح طول عمره
// Java - Static Typing
int x = 5;        // x هو عدد صحيح
x = "hello";      // ❌ خطأ! مش ممكن

Dynamic (ديناميكي):

  • نوع المتغير مش معروف إلا وقت التشغيل (runtime)
  • المتغير ممكن يتغير نوعه
  • مثال في بايثون:
# Python - Dynamic Typing
x = 5             # x عدد صحيح دلوقتي
x = "hello"       # ✅ تمام! دلوقتي x نص

2. Strong vs. Weak Typing (الكتابة القوية ضد الضعيفة):

Strong (قوي):

  • اللغة مش بتحول الأنواع تلقائياً
  • لو x عدد، مش هتقدر تدمجه مع نص من غير تحويل صريح
# Python - Strong Typing
x = 5
y = "عمر "
print(y + x)      # ❌ خطأ! مش ممكن
print(y + str(x)) # ✅ تمام: "عمر 5"

Weak (ضعيف):

  • اللغة بتحول الأنواع تلقائياً
  • ممكن يسبب نتائج غريبة!
// JavaScript - Weak Typing
"11" + 1          // "111" (دمج نصوص!)
"11" - 1          // 10 (طرح أرقام!)

المصفوفة: أربع احتمالات

مصفوفة الكتابة

اللغات بتقع في أربع خانات:

  • Static + Strong: Java، Rust
  • Static + Weak: C
  • Dynamic + Strong: Python، Ruby ← بايثون هنا!
  • Dynamic + Weak: JavaScript (القديم)

الملاحظة المهمة: بايثون Dynamic لكن Strong! - يعني القيم (Values) هي اللي ليها أنواع، مش المتغيرات.

إيه هي "عقلية" Static Typing؟

لو جمعنا خصائص Static + Strong، هنلاقي:

"إحنا (المبرمجين) اللي بنقرر إيه نوع كل متغير، والكمبيوتر مش هيغيره أبداً من غير إذننا."

الكلمات المهمة: "إحنا اللي بنقرر"

ده بيدي المبرمج السلطة عشان يضمن صحة الكود. زي ما تيد نيلسون قال:

"الأخبار الكويسة عن الكمبيوترات: إنها بتعمل اللي بتقوله." — تيد نيلسون

التركيز على الصحة (Correctness) ده هو جوهر عقلية Static Typing - وبتتجاوز مجرد مصطلحات علوم الحاسب.

خليني أوضحلك إزاي العقلية دي موجودة في بايثون، حتى من غير Type Hints!

عقلية الكتابة الثابتة في بايثون (من غير Type Hints!)

ممكن تقول: "بس يا عم الحاج، بايثون Dynamic! إزاي فيها عقلية Static؟"

الإجابة: العقلية موجودة في طريقة كتابة الكود، مش في اللغة نفسها! (زي البرمجة الكائنية - ممكن تعملها في أي لغة)

مثال 1: Data Classes ضد Dictionaries

الكود "الديناميكي" (مش محبب في المشاريع الكبيرة):

def get_user_details() -> Dict:
    return {
        "first_name": "بارت",
        "last_name": "سيمبسون",
    }

المشكلة:

  • اللي بيستدعي الـ function مش عارف إيه المفاتيح الموجودة في الـ Dictionary
  • لو غيرت "first_name" لـ "First_Name"الكود هينكسر!
  • Strings ديناميكية جداً - ممكن أي حد يغير الهجاء

الكود "الثابت" (المفضل في المشاريع الكبيرة):

@dataclass
class UserDetails:
    first_name: str
    last_name: str

def get_user_details():
    return UserDetails(
        first_name="بارت",
        last_name="سيمبسون",
    )

المميزات:

  • الـ attributes ثابتة - مفيش غموض في الأسماء
  • الـ IDE هيساعدك بـ autocomplete
  • لو غلطت في الهجاء → خطأ فوري مش بعدين

لاحظ: ماستخدمتش Type Hints في الـ method، لكن العقلية موجودة!

مثال 2: Enums ضد Strings

الكود "الديناميكي":

if state == "alive":
    normal_walk()
elif state == "dead":
    lie_down()
elif state == "zombie":
    zombie_walk()

المشكلة:

  • لو كتبت "Alive" بدل "alive"مش هيشتغل (ومش هتعرف ليه!)
  • Typos ممكن تحصل بسهولة: "aliev" مثلاً

الكود "الثابت" (بيستخدم Enum):

class State(Enum):
    ALIVE = 1
    DEAD = 2
    ZOMBIE = 3

if state == State.ALIVE:
    normal_walk()
elif state == State.DEAD:
    lie_down()
elif state == State.ZOMBIE:
    zombie_walk()

المميزات:

  • مفيش typos - الـ IDE هيكملك الأسماء
  • لو كتبت State.ALIEVخطأ فوري
  • الكود أوضح وأسهل في القراءة

مرة تانية: مفيش Type Hints، لكن العقلية موجودة!

مزايا العقلية دي

لازم أعترف: العقلية دي مفيدة جداً!

الفوائد:

  • بتمنع أخطاء كتير - الأخطاء بتتكتشف بدري
  • الـ IDE بيساعدك - PyCharm وVS Code بيدوك autocomplete ويلفتوا انتباهك للأخطاء
  • الكود أسهل في الفهم - واضح إيه نوع كل حاجة
  • Refactoring أسهل - لو غيرت اسم حاجة، الـ IDE هيساعدك تغيرها في كل حتة

أنا شخصياً بستفيد منها كل يوم!

لكن... فيه سؤال مهم

بس هل العقلية دي هي الحل المثالي لكل حاجة؟ هل فيه عقلية Dynamic Typing كمان؟ إيه اللي هنخسره لو تخلينا عن النهج الديناميكي؟

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

الذكاء الاصطناعي الرمزي = الكتابة الثابتة للذكاء الاصطناعي

في الأيام الأولى للذكاء الاصطناعي (الستينات والسبعينات)، النهج السائد كان Symbolic AI (الذكاء الاصطناعي الرمزي).

الفكرة الأساسية:

  • المبرمجين البشر هم الأذكياء في الغرفة
  • بيدوا الكمبيوتر قواعد مصنوعة يدوياً (hand-crafted rules)
  • الكمبيوتر بيستخدم قوته الحسابية عشان يطبق القواعد دي

ملخص النهج ده:

"إحنا (المبرمجين) اللي بنقرر إيه القواعد نستخدمها، والكمبيوتر مش هيغيرها أبداً من غيرنا."

هل لاحظت التشابه؟ قارن مع تعريف Static Typing:

"إحنا اللي بنقرر إيه نوع كل متغير، والكمبيوتر مش هيغيره أبداً من غيرنا."

نفس العقلية بالضبط!

المشكلة المشتركة

في السعي للصحة (Correctness)، بنحد من قدرات البرمجيات/الذكاء الاصطناعي لبس اللي إحنا نفسنا نقدر نستوعبه.

والحقيقة: عقولنا البشرية محدودة! مش هنقدر نتخيل كل الحالات الممكنة.

Machine Learning = Dynamic Typing للذكاء الاصطناعي

لو Symbolic AI هو Static Typing للذكاء الاصطناعي، فـ Machine Learning هو Dynamic Typing بتاعه!

الفرق:

  • Symbolic AI: المبرمج بيحط القواعد (صريحة ومحددة)
  • Machine Learning: النموذج بيتعلم القواعد من البيانات (مرنة وقابلة للتغيير)

في المجالين (البرمجة والذكاء الاصطناعي)، إحنا بنتأرجح من Static لـ Dynamic والعكس على مر السنين!

جذور فلسفية قديمة

الثنائية دي مش جديدة - أصولها بترجع لـ David Hume و "مشكلة الاستقراء":

  • Deduction (الاستنباط): منطق صارم، قواعد واضحة → صحيح لكن محدود
  • Induction (الاستقراء): تعلم من التجربة، تعميم → عام لكن مش مضمون

المعادلة الصعبة:

الصحة (Correctness) بتيجي على حساب العمومية (Generality)

أمثلة من الواقع

مثال 1: كود "حي-ميت-زومبي"

if state == State.ALIVE:
    normal_walk()
elif state == State.DEAD:
    lie_down()
elif state == State.ZOMBIE:
    zombie_walk()

المشكلة: لو صادف الكود يسوع المسيح (مات وقام!)، الكود هينكسر - مفيش حالة ليه!

ده مثال على: صحة على حساب عمومية

مثال 2: Symbolic AI ضد Machine Learning

كلنا عارفين إيه اللي حصل:

  • Symbolic AI: كان بطيء ومحدود
  • Machine Learning, Deep Learning, LLMs: بيدوسوا Symbolic AI دلوقتي!

طبعاً في مقابل العمومية، بنضحي بالصحة:

  • مفيش حد بيثق 100% في مخرجات ChatGPT
  • لكن مش تقدر تتجاهله - مفيد جداً رغم الأخطاء!

تكملة اقتباس تيد نيلسون

فاكر اللي قلناه في البداية؟

"الأخبار الكويسة عن الكمبيوترات: إنها بتعمل اللي بتقوله."

تيد نيلسون أضاف تكملة:

"الأخبار الوحشة: إنها بتعمل اللي بتقوله (مش اللي عايزه يعمله)!" — تيد نيلسون

الفرق مهم!

ساعات مش عايز الكمبيوتر يعمل بالضبط اللي قلته - عايزه يفهم اللي أنا قاصده ويعمله!

لغات الكمبيوتر في المستقبل

طبعاً مفيش حد يقدر يتنبأ بالمستقبل، لكن زي ما William Gibson بيقول:

"المستقبل موجود فعلاً - بس مش موزع بالتساوي."

يعني: تلميحات من المستقبل موجودة دلوقتي في أماكن مختلفة!

ChatGPT: تلميحة من المستقبل

تعالى نقارن: JavaScript و Python 2 ليهم مشاكل بسبب نظام الأنواع:

JavaScript (Weak Typing):

"11" + 1          // "111" (دمج نصوص - مش منطقي!)
"11" - 1          // 10 (طرح أرقام - منطقي!)

Python 2 (Strong Typing):

3 / 2             # 1 (مش 1.5 - مش منطقي!)

ChatGPT مش عنده المشاكل دي!

Prompt: 1 + 3

ChatGPT: حاصل جمع 1 و 3 هو 4.

Prompt: "2" + "2"

ChatGPT: التعبير "2" + "2" بيدمج النصين، والنتيجة "22".

Prompt: 1/1/2020 + two weeks

ChatGPT: لو 1/1/2020 يعني 1 يناير 2020، إضافة أسبوعين تدي 15 يناير 2020.

ChatGPT بيفهم السياق (Context) وبيعمل اللي إنت قاصده، مش بس اللي كتبته حرفياً!

لغات المستقبل

أتوقع إن لغات البرمجة في المستقبل هتكون:

  • أذكى - بتفهم القصد مش بس الأمر الحرفي
  • أكتر مرونة - بتتكيف مع السياق
  • بتجمع Static و Dynamic - تستخدم كل واحد في المكان المناسب

زي ChatGPT: مش Static ومش Dynamic - ذكي!

الخلاصة

الواقع: Static Typing كسب الجولة دي، ولأسباب وجيهة:

  • ✅ بيمنع أخطاء كتير
  • ✅ الأدوات (IDEs) بتدعمه بقوة
  • ✅ الكود بيبقى أوضح وأسهل في الصيانة

لكن:

  • ❌ بيحد من المرونة والعمومية
  • ❌ ساعات بنحتاج Dynamic للتجريب السريع
  • ❌ مش كل مشكلة محتاجة صرامة Static

موقفي الشخصي:

  • مش هبقى متعصب لنهج واحد
  • هستخدم الأنسب لكل مشكلة
  • هفضل أراقب تطور اللغات - المستقبل ممكن يجمع الاتنين بشكل أذكى

في النهاية: البرمجة مش دين - مفيش "الطريق الوحيد الصحيح". استخدم الأداة المناسبة للمشكلة المناسبة.


طارق عمرو، 22 يوليو 2023

الترجمات: [EN] [NL]   [↓ .md]
~ / pages / عودة الكتابة الديناميكية: هل ده ممكن؟
>