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



تمت كتابة النص الذي أنشأ "قانون التسريب التجريدي" في عام 2002. لماذا أترجمها بعد 20 عامًا تقريبًا؟ ما زالت لم تفقد أهميتها وتستحق القراءة. لم يتلق برنامج التعاون الفني بديلاً أفضل ، وأصبح قانون التجريدات المتسربة مترسخًا في حياة المطورين وهو في خطر أن يصبح بديهية. سأضيف أنني لم أحسب جميع الأطر الزمنية المشار إليها في النص ، لذا ضع في الاعتبار بعض "التحول الزمني".



إنه عنصر أساسي في السحر الهندسي للإنترنت الذي نعتمد عليه كل يوم. هذا السحر موجود في TCP ، أحد اللبنات الأساسية للإنترنت.



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



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



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



هذا هو المكان الذي يحدث فيه السحر الحقيقي: يعتمد TCP على IP. بعبارة أخرى ، يلزم TCP لتقديم البيانات بشكل موثوق باستخدام أداة غير موثوقة فقط .



لتوضيح سبب كون هذا السحر ، فكر في سيناريو واقعي ، وإن كان سخيفًا إلى حد ما ، من الحياة.



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



تخيل الآن خدمة Hollywood Express تضمن: (أ) التسليم ؛ (ب) بالترتيب الصحيح. (ج) في حالة ممتازة. المعجزات هي أن هوليوود إكسبريس ليس لديها وسيلة أخرى لنقل الممثلين ، باستثناء ما لا يمكن الاعتماد عليه - بالسيارة. هوليوود إكسبريس تتحقق من كل ممثل يصل ، وإذا كانت حالته غير مرضية ، فإن الخدمة تستدعي موطن الممثل وتطلب إرسال توأم متطابق. إذا وصل الممثلون بترتيب عشوائي ، فستعيد Hollywood Express الترتيب الأصلي. حتى إذا تحطمت سفينة أجنبية كبيرة في طريقها إلى المنطقة 51 وشلت الطريق السريع في نيفادا ، فإن الممثلين سيغيرون ببساطة المسارات ويسافرون عبر أريزونا ، ولن يخبر هوليوود إكسبريس المنتجين في كاليفورنيا بالحادث. بالنسبة للمنتجين ، كل شيء سيبدو هكذاكما لو أن الممثلين كانوا يقودون لفترة أطول قليلاً من المعتاد ولم يكن هناك تحطم جسم غامض.



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



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



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

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



  • : . « », — . , . , , , , .
  • SQL , . , , , . SQL- , . , «where a=b and b=c and a=c» , «where a=b and b=c» . , , . , . , , .
  • NFS SMB , . , . « , ”. . ( ), .forward ( ), .forward . , .
  • , ++ . , , , . ++ +, s + “bar” . ? , , , “foo” + “bar”, ++ char*. , . (, ++ . — .)
  • , , , , , . . , , . .


يترتب على قانون التجريدات المتسربة أن التجريدات لا تبسط حياتنا بقدر ما نرغب. عندما أقوم بتدريس لغة ++ C ، أود تجنب الحديث عن نوع بيانات char * وحساب المؤشر. سيكون من الرائع التحدث عن STL على الفور ، لكن يومًا ما سيكتب الطلاب "foo" + "bar" ويخافون ، ويجب أن أخبركم عن char *. أو يومًا ما يحاولون استدعاء دالة واجهة برمجة تطبيقات Windows باستخدام وسيطة OUT LPTSTR ، ولا يزال يتعين عليهم التعرف على char * والمؤشرات و unicode و wchar_t ، بالإضافة إلى TCHAR وكل ما يتسرب من خلال التجريد.



عند البرمجة باستخدام COM (نموذج كائن المكون - ترجمة تقريبًا) ، سيكون من الجيد أن تتعلم على الفور مساعدي Visual Studio وكل سحر إنشاء الكود. ولكن إذا حدث خطأ ما على الأقل ، فلن يكون لدى المبرمجين أدنى فكرة عما حدث ، ومكان البحث عن الخطأ وكيفية إصلاحه. وسيتعين علي التحدث عن IUnknown و CLSID و ProgIDS و ... أوه ، الإنسانية!



عند تدريس ASP.NET ، سيكون من الرائع التدريب على النقر المزدوج على الكائنات وكتابة التعليمات البرمجية التي سيتم تنفيذها على الخادم عندما ينقر المستخدم على الكائن. من حيث الجوهر ، يزيل ASP.NET الفرق بين التعامل مع النقر على ارتباط تشعبي ( ملف) والتعامل مع النقر فوق الزر. ولكن ها هي المشكلة: في HTML ، لا يمكنك إرسال نموذج بالنقر فوق ارتباط تشعبي وكان على مطوري ASP.NET إخفاء هذه المشكلة. لقد قاموا بحل المشكلة عن طريق إنشاء عدة أسطر من كود JavaScript في معالج الارتباط التشعبي onclick. لكن مع ذلك ، هذه فجوة في التجريد. إذا تم تعطيل JavaScript للمستخدم النهائي ، فلن يعمل ASP.NET بشكل صحيح ، ولن يتمكن مبرمج التطبيق ، دون أن يدرك ما تقوم ASP.NET بالتجريد منه ، من فهم ما حدث.



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



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



خلال أول فترة تدريب لي في Microsoft ، قمت بتطوير مكتبات للعمل باستخدام سلاسل على Macintosh. إليك مثال على وظيفة نموذجية: اكتب نسخة من strcat تُرجع مؤشرًا إلى نهاية سطر جديد. فقط بضعة أسطر من كود سي. كل ما فعلته هو الخروج مباشرة من K & R (Kernighan and Ritchie - a lane ..) - كتاب رقيق عن لغة البرمجة C



وبعد أن استقرت في CityDesk ( أغلقت الشركة في عام 2016 - prim.per.). الآن أحتاج إلى معرفة Visual Basic و COM و ATL و C ++ و InnoSetup و Internet Explorer الداخلية والتعبيرات العادية و DOM و HTML و CSS و XML. هذه كلها أدوات عالية المستوى مقارنة بأشياء K&R ، لكن ما زلت بحاجة إلى معرفة جميع عناصر K&R.



قبل عشر سنوات ، كنا نتخيل أن نماذج البرمجة الجديدة ستسهل علينا التطوير الآن. في الواقع ، تسمح لنا الأفكار المجردة التي أنشأناها على مدى عقود بالتوافق بسهولة مع مستويات جديدة من التعقيد لم نستسلم لها منذ 10 إلى 15 عامًا ، كما في حالة تطوير واجهة المستخدم الرسومية أو الشبكات. والآن لدينا الكثير من الأدوات الرائعة ، مثل لغات إدراك النماذج الموجهة للكائنات ، والتي تتيح لنا إنجاز عملنا بسرعة مذهلة. حتى يوم ما نواجه مشكلة حيث "يتسرب" التجريد ، ونحتاج إلى أسبوعين لحلها. عندما تحتاج إلى استئجار مبرمج Visual Basic للقيام برمز VB فقط ، فهذه ليست أفضل فكرة. لأن مثل هذا المبرمج سيتعثر في كل مرة يعثر فيها على ثقب في تجريد Visual Basic.



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



All Articles