الأحد، 1 مارس 2020

التصميم الامثل للموقع

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

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

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

المفاهيم الأساسية في لغات البرمجة (رابط إلى ورقة)

كريستوفر ستراشي

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

جون هيوز

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

أساس أكسيوماتي لبرمجة الكمبيوتر (رابط إلى ورقة)

بواسطة C. A. R. HOARE

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

P {Q} R
أخذت تعني:

إذا كان التوكيد P صحيحًا قبل البدء في برنامج Q ، فسيكون التوكيد R صحيحًا عند اكتماله

حيث P شرط مسبق ، Q هي تنفيذ برنامج ، و R هي النتيجة.

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

الوقت والساعات وترتيب الأحداث في نظام موزع (رابط إلى ورقة)

بقلم ليزلي لامبورت (1978)

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

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

في فهم الأنواع ، وتجريد البيانات ، وتعدد الأشكال (رابط إلى ورقة)

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

لقد فكرت في الأصل في سرد ​​نظرية ميلنر لتعدد الأشكال في البرمجة ، لكنني اعتقدت أن ورقة المسح ستكون أفضل. يجب أن أعترف أن قراءاتي لم تتعمق في استكشاف أنظمة الكتابة ، لذلك سيكون موضع تقدير كبير أي اقتراحات إضافية.

الوظائف التكرارية للتعبيرات الرمزية وحسابها بالآلة ، الجزء الأول (رابط إلى ورقة)

جون مكارثي

لقد أصبح من المبتذلة التوصية بورقة مكارثي التي تقدم LISP. لن أحسب هذا الهدف 10 ، لكنني سأكون مقصرا أن أعذره لأنه قراءة رائعة تستكمل بشكل جيد بدراسة التنفيذ البسيط لمواصفات مكارثي الأصلية (3).


تصميم موقع سهل

لترحيل البنية المماثلة من الحجب إلى عدم الحجب ، تتطلب الوظيفة (أو المهمة) التقاط الحالة الحالية ، بما في ذلك الوسائط والمتغيرات ونقاط التوقف ، عندما تحتاج إلى انتظار عمليات الإدخال / الإخراج. أيضًا ، يجب أن يكون المجدول قادراً على إعادة إدخال الوظيفة وتنفيذ التعليمات البرمجية المتبقية بعد انتهاء عمليات الإدخال / الإخراج. بخلاف لغات البرمجة الأخرى مثل C ++ ، يمكن لـ Python تحقيق المفاهيم التي تمت مناقشتها أعلاه بسهولة لأن منشئها يمكنه الحفاظ على كل الحالة وإعادة الدخول عن طريق استدعاء الوظيفة المدمجة في الموقع التالي (). من خلال استخدام المولدات ، يمكن التعامل مع عمليات الإدخال / الإخراج مثل المقتطف السابق ولكن نموذج غير محظور ، والذي يسمى رد الاتصال المضمن ، يمكن الوصول إليه داخل حلقة حدث.

حلقة الحدث

حلقة الحدث هي مجدول لإدارة المهام داخل البرنامج بدلاً من الاعتماد على أنظمة التشغيل. يعرض المقتطف التالي كيفية إجراء حلقة حدث بسيطة لمعالجة اتصالات المقبس بشكل غير متزامن. يتمثل مفهوم التنفيذ في إلحاق المهام في قائمة انتظار مهمة FIFO وتسجيل محدد عندما تكون عمليات الإدخال / الإخراج غير جاهزة. أيضًا ، يحتفظ المولد بحالة المهمة التي تتيح لها أن تكون قادرة على تنفيذ مهامها المتبقية دون وظائف رد الاتصال عندما تتوفر نتائج الإدخال / الإخراج. من خلال مراقبة كيفية عمل حلقة الحدث ، وبالتالي ، فإنه سيساعد في فهم مولد بيثون هو في الواقع شكل من أشكال coroutine.
عن طريق تعيين مهام في حلقة حدث للتعامل مع الاتصالات ، يشبه نمط البرمجة استخدام مؤشرات الترابط لإدارة عمليات الإدخال / الإخراج ولكن باستخدام جدولة على مستوى المستخدم. أيضًا ، يتيح PEP 380 تفويض المولد ، والذي يسمح للمولد بانتظار المولدات الأخرى لإنهاء وظائفها. من الواضح أن المقتطف التالي أكثر سهولة وقراءة من استخدام وظائف رد الاتصال للتعامل مع عمليات الإدخال / الإخراج.
خبير سيو
باستخدام حلقة حدث مع بناء جملة ، يمكن أن ينتج عن ، إدارة الاتصالات دون حظر الخيط الرئيسي ، وهو استخدام الوحدة النمطية ، غير المتزامن ، قبل Python 3.5. ومع ذلك ، فإن استخدام بناء الجملة ، العائد منه ، غامض لأنه قد يربط المبرمجين في عقدة: لماذا تجعل  تجعل المولد يصبح كوروتيني؟ بدلاً من استخدام العائد من التعامل مع العمليات غير المتزامنة ، يقترح PEP 492 أن يصبح coroutine مفهومًا مستقلًا في Python ، وهكذا تم تقديم بناء الجملة الجديد ، async / انتظار ، لتعزيز قابلية القراءة للبرمجة غير المتزامنة.

ما هو كوروتين؟
سيو
تعرّف وثيقة Python أن coroutines هي شكل عام من الروتين الفرعي. ومع ذلك ، هذا التعريف غامض ويعيق المطورين لفهم ما هي coroutines. استنادًا إلى المناقشة السابقة ، تكون حلقة الحدث مسؤولة عن جدولة المولدات لتنفيذ مهام محددة ، وهذا يشبه إرسال المهام إلى سلاسل الرسائل. في هذه الحالة ، تعمل المولدات مثل الخيوط المسؤولة عن "المهام الروتينية". من الواضح ، إن coroutine هو مصطلح يمثل مهمة تم تحديدها بواسطة حلقة حدث في برنامج بدلاً من أنظمة التشغيل. يعرض المقتطف التالي ماهيةcoroutine. يعمل هذا الديكور بشكل أساسي على تحويل وظيفة إلى وظيفة مولد واستخدام غلاف ، أنواع. كوروتين ، للحفاظ على التوافق مع الإصدارات السابقة.

استنتاج

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