# عودة الكتابة الديناميكية: هل ده ممكن؟ ## ولا الكتابة الثابتة كانت النموذج الصح من البداية؟ ![صورة بواسطة Michael Marais على Unsplash](/static/img/return-of-dynamic-typing-1.jpg) لو بتتابع عالم البرمجة دلوقتي، هتلاحظ حاجة: **الكتابة الثابتة (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 // Java - Static Typing int x = 5; // x هو عدد صحيح x = "hello"; // ❌ خطأ! مش ممكن ``` **Dynamic (ديناميكي)**: - نوع المتغير **مش معروف** إلا وقت التشغيل (runtime) - المتغير **ممكن يتغير نوعه** - مثال في بايثون: ```python # Python - Dynamic Typing x = 5 # x عدد صحيح دلوقتي x = "hello" # ✅ تمام! دلوقتي x نص ``` **2. Strong vs. Weak Typing (الكتابة القوية ضد الضعيفة)**: **Strong (قوي)**: - اللغة **مش بتحول الأنواع تلقائياً** - لو `x` عدد، **مش هتقدر** تدمجه مع نص من غير تحويل صريح ```python # Python - Strong Typing x = 5 y = "عمر " print(y + x) # ❌ خطأ! مش ممكن print(y + str(x)) # ✅ تمام: "عمر 5" ``` **Weak (ضعيف)**: - اللغة **بتحول الأنواع تلقائياً** - ممكن يسبب نتائج غريبة! ```javascript // JavaScript - Weak Typing "11" + 1 // "111" (دمج نصوص!) "11" - 1 // 10 (طرح أرقام!) ``` ### المصفوفة: أربع احتمالات ![مصفوفة الكتابة](/static/img/return-of-dynamic-typing-2.png) اللغات بتقع في أربع خانات: - **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 **الكود "الديناميكي" (مش محبب في المشاريع الكبيرة)**: ```python def get_user_details() -> Dict: return { "first_name": "بارت", "last_name": "سيمبسون", } ``` **المشكلة**: - اللي بيستدعي الـ function مش عارف **إيه المفاتيح الموجودة** في الـ Dictionary - لو غيرت `"first_name"` لـ `"First_Name"` → **الكود هينكسر!** - Strings ديناميكية جداً - ممكن أي حد يغير الهجاء **الكود "الثابت" (المفضل في المشاريع الكبيرة)**: ```python @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 **الكود "الديناميكي"**: ```python if state == "alive": normal_walk() elif state == "dead": lie_down() elif state == "zombie": zombie_walk() ``` **المشكلة**: - لو كتبت `"Alive"` بدل `"alive"` → **مش هيشتغل** (ومش هتعرف ليه!) - Typos ممكن تحصل بسهولة: `"aliev"` مثلاً **الكود "الثابت"** (بيستخدم Enum): ```python 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: كود "حي-ميت-زومبي"** ```python 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)**: ```javascript "11" + 1 // "111" (دمج نصوص - مش منطقي!) "11" - 1 // 10 (طرح أرقام - منطقي!) ``` **Python 2 (Strong Typing)**: ```python 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