جورج بول… الراجل اللي خلّى المنطق حساب (سلسلة أصل البرمجة — 3)
جورج بول… الراجل اللي خلّى المنطق حساب
لو فتحت أي كود في مشروعك الحالي، مستحيل تلف في فايلين تلاتة من غير ما تقابل العلامات دي:
if (isLoggedIn && hasActiveSubscription && !isBanned) {
// افتحله الـ Dashboard
}
بنكتب && و || و ! عشرات المرات كل يوم لدرجة إننا بنتعامل معاها كأنها “أدوات لغوية إنجليزية” عادية زي and و or.
بس عمرك سألت نفسك:
«هي العلامات دي اتولدت إزاي؟ وليه الكمبيوتر لما بيشوف شرط معقد فيه 5 حاجات، بيعرف يحسب النتيجة في أجزاء من النانو ثانية من غير ما يغلط؟»
القصة وراها مدرس رياضيات إنجليزي عبقري علم نفسه بنفسه اسمه جورج بول (George Boole)، عمل سنة 1854 نقلة غيرت شكل الحضارة الإنسانية لما قال:
«المنطق البشري مش فلسفة وكلام إنشا.. المنطق البشري فرع من فروع الجبر والحساب!»
المفاجأة الكبرى: المنطق هو عمليات حسابية عادية جداً
في المدرسة، علمونا الجبر العادي:
المتغيرات () بتشيل أرقام عادية ().
وفيه عمليات زي الجمع () والضرب ().
جورج بول جه وقال:
«تعالوا نعمل نوع جديد من الجبر.. المتغيرات فيه مش هتشيل أرقام، هتشيل قيمتين اتنين بس: صادق (1 / True) أو كاذب (0 / False)».
ومن هنا اتولد الجبر البولياني (Boolean Algebra). والمفاجأة اللي هتصدمك، هي إن العمليات المنطقية اللي بتكتبها في الكود هي في الأصل ضرب وجمع عاديين جداً!
1. الـ AND المنطقي (&&) هو في الحقيقة عملية “ضرب” ()
لو عندك شرطين وعايز الاتنين يتحققوا مع بعض:
- لو الأول والتاني : النتيجة (True)
- لو الأول والتاني : النتيجة (False)
- لو الأول والتاني : النتيجة (False ❌)
- لو الاتنين : النتيجة (False ❌)
الـ AND المنطقي (&&) = ضرب جبري بحت!
أي صفر يدخل في المعادلة بيصفّر الناتج كله فوراً.
عشان كده في الرياضيات وعلوم الحاسب، علامة الـ AND بتتكتب أحياناً كنقطة ضرب ( أو ):
2. الـ OR المنطقي (||) هو في الحقيقة عملية “جمع” ()
لو عندك شرطين ويكفيك واحد بس منهم يتحقق:
- لو الاتنين : النتيجة (False ❌)
- لو الأول والتاني : النتيجة (True ✅)
- لو الأول والتاني : النتيجة (True ✅)
- لو الاتنين : في الجبر البولياني، (لأن مفيش قيمة أعلى من الصدق المطلق).
الـ OR المنطقي (||) = جمع جبري!
أي واحد يظهر في المعادلة كافي إنه يخلي الناتج النهائي (1).
عشان كده علامة الـ OR في الجبر بتتكتب كعلامة زائد ( أو ):
3. الـ NOT المنطقي (!) هو “المتمم أو الطرح من واحد”
لما تقلب القيمة بالـ NOT:
- لو
- لو
قضية صادقة (1) ──[ ! ]──► قضية كاذبة (0)
قضية كاذبة (0) ──[ ! ]──► قضية صادقة (1)
الفكرة كلها في سطر واحدالكمبيوتر لما بيعمل
if (A && B)مبيقعدش “يفكر”؛ هو حرفياً بيضرب رقمين في بعض في دائرة السيليكون! لو الناتج طلع 1 بيدخل، لو طلع 0 بيتجاهل الـ block.
التاتش المعماري: كواليس الـ Short-Circuiting في JavaScript
في معظم لغات البرمجة (وخصوصاً JavaScript / TypeScript)، الـ && والـ || مبيشتغلوش كـ “فحص جاف” بيرجع true و false بس.
هما بيشتغلوا بنظام ذكي ومبني مباشرة على قواعد جبر بول، اسمه:
Short-Circuit Evaluation (التقييم قصير الدائرة).
يعني إيه Short-Circuit؟
بما إن الـ && ضرب.. فالمترجم أول ما يلاقي الطرف الأول صفر (False)، مبيكملش قراءة الطرف التاني أصلاً!
ليه يضيع دورة معالج في حساب الطرف اليمين، وهو ضامن رياضياً إن أي حاجة مضروبة في صفر هتطلع صفر؟
وبالمثل في الـ || (الجمع).. أول ما يلاقي الطرف الأول واحد (True)، بيقف فوراً؛ لأن أي حاجة مجموعة على واحد هتفضل True!
اللغز الشهير: الصفر العائم اللي بيبوّظ شاشات React
لو كتبت React، بنسبة 99% الموقف ده حصل معاك ودوّخك:
تخيل إنك بتعمل سلة مشتريات (Cart)، وعايز تقول:
«لو فيه منتجات، اعرضلي عداد المنتجات.. لو مفيش، متعرش حاجة خالص».
فكتبت السطر المشهور ده في الـ JSX:
function CartBadge({ count }) {
return (
<div>
<h2>سلة المشتريات</h2>
{count && <span className="badge">{count} منتجات</span>}
</div>
);
}
لو count = 3.. الشاشة هتعرض: 3 منتجات بشكل سليم.
لكن المفاجأة الصادمة: لو السلة فاضية (count = 0)..
تلاقي الشاشة طبعت رقم 0 يتيم في نص الـ UI مبوظ شكل الصفحة!
المتوقع: سلة المشتريات
الظاهر: سلة المشتريات
0
طب ليه ده بيحصل؟ إيه علاقة ده بجورج بول؟
في JavaScript، عملية && بترجع قيمة المعامل نفسه (Operand Value) مش مجرد boolean:
- لما
count = 0، الجافاسكريبت بتعتبر0قيمة Falsy. - الـ Short-Circuit بيشتغل: أول ما لقى قيمة Falsy على الشمال، وقف فوراً ورجّع القيمة دي زي ما هي: وهي رقم
0! - الـ React لما بتلاقي قيمة
falseأوnullأوundefined، بتمسحها ومبتعرضهاش على الشاشة.
لكن رقم0بالنسبة لـ React هو رقم صالح للعرض (Valid Number).. فبتاخده وترسمه كنص على الشاشة!
الحل الهندسي النظيف:
عشان تتجنب الفخ ده، المهندس الشاطر بيحول الشرط لـ Boolean صريح لا يقبل اللبس:
// ✅ الحل 1: مقارنة منطقية صريحة بترجع true أو false فعلياً
{count > 0 && <span className="badge">{count} منتجات</span>}
// ✅ الحل 2: استخدام الـ Ternary Operator الصريح
{count > 0 ? <span className="badge">{count} منتجات</span> : null}
// ✅ الحل 3: التحويل الإجباري لبوليان
{Boolean(count) && <span className="badge">{count} منتجات</span>}
سر الـ ?? مقابل || في الشغل الحديث (Nullish Coalescing)
عشان تفهم إزاي مفاهيم بول بتطور الكود بتاعنا النهاردة، بص على المعضلة دي:
زمان كنا بنكتب كود بالـ || عشان نحط قيمة افتراضية (Fallback):
function setScore(points: number) {
// لو الـ points مش موجودة، حط 10
const finalScore = points || 10;
return finalScore;
}
الكود ده فيه كارثة منطقية مستخبية:
لو اللاعب لعب ومجابش ولا نقطة وجاب 0 بالظبط:
الـ || هتشوف الـ 0 على إنه False (صفر بولياني)، فهتقوم لاغية نتيجة اللاعب ومدياله 10 درجات بدون وجه حق!
عشان كده منظمة الـ JavaScript (TC39) ضافت المعامل الجديد:?? (Nullish Coalescing Operator):
// ✅ لا يعتبر الصفر كاذباً، يتدخل فقط لو القيمة null أو undefined
const finalScore = points ?? 10;
المعامل ده بيفرق بين “انعدام القيمة (Null/Undefined)” وبين “القيمة الصفرية الصالحة (0 أو false)”.
درس معماريالمبرمج السطحي بيتعامل مع
||و??كأنهم بدايل لبعض، لكن المهندس بيفهم إن الخلط بينهم بيعمل ثغرات محاسبية ومنطقية في البيانات، لأن الصفر في منطق البزنس قيمة، بينما في جبر بول هو نفي.
الخلاصة المنطقية
الـ AND المنطقي (&&) ◄───► ضرب جبري (أي 0 يصفر الناتج)
الـ OR المنطقي (||) ◄───► جمع جبري (أي 1 ينجح العملية)
الـ NOT المنطقي (!) ◄───► طرح من واحد (قلب الحالة)
- المنطق مش كلام، المنطق معادلات: كل ما تستوعب إن شروط الـ
ifهي ضرب وجمع رياضي، كل ما هتعرف تبسط الشروط المعقدة وتقلل تشابك الكود. - احذر من فخ الـ Short-Circuiting: اتأكد دايماً إن شروطك في الـ UI بتنتج
booleanحقيقي مش أرقام تتسرب للشاشة (زي فخ الـ 0 في React). - فرّق بين الصفر والعدم: الصفر قيمة رقمية صالحة، واستخدام
??أأمن بمراحل من||لما تتعامل مع أرقام ومدخلات مستخدمين.
في المقال القادم (اليوم 4):
عرفنا قواعد جبر جورج بول في الكود..
بس السؤال بقى:
إزاي السلك الكهربي والترانزستور بينفذوا الضرب والجمع ده في الهاردوير؟ وإزاي بنبني بوابات (Logic Gates) زي AND و OR و NOT في المعالج؟ وإزاي نقدر نجمع أرقام ضخمة من شوية بوابات سيليكون؟
استنونا في المقال القادم مع: «جملة if… والبوابات اللي وراها (كيف يفكر السيليكون؟)»

