البرمجة للجماهير

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



اسمي Zhenya وأنا مطور خلفية في ManyChat. منذ بعض الوقت ، اتصل بي فريق الموارد البشرية بطلب لتنفيذ لعبة "Bulls and Cows" ، المألوفة للكثيرين من الطفولة ، على أساس منتجنا. دعني أضيف القليل من السياق. ManyChat هي أداة لأتمتة التفاعل بين الشركات وعملائها ، مما يسمح لك بالإجابة على الأسئلة الشائعة عبر Facebook ، ومؤخرا الرسائل القصيرة والبريد الإلكتروني. "Bulls and Cows" هي لعبة منطقية ، خلال عدة محاولات ، من الضروري تخمين الرقم التخميني. يمكن للعديد معرفة ذلك من لعبة Fallout ، حيث تحتاج إلى اختراق محطة الكمبيوتر. يمكن العثور على مزيد من التفاصيل حول القواعد في نهاية المقالة.

التصور


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

لعبة تدفق الثيران والأبقار

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

تقسيم المسؤولية


ما الذي يجب تنفيذه على جانب ManyChat وماذا على جانب الكود؟ لم يبد لي الجواب على هذا السؤال في البداية. هناك أداتان للتفاعل على منصتنا: الكتلة الديناميكية والطلب الخارجي. إنها متطابقة تقريبًا باستثناء أن الأول ينفذ الطلب إلى الخادم البعيد وينتقل إلى التعليمات التالية ، والثاني يسمح لك بمقارنة بيانات الاستجابة أولاً مع متغيرات البوت. في أحد الإصدارات الأولى ، استخدمت الكتلة الديناميكية ونفذت إرسال الترتيب من طريقة API مباشرة إلى Facebook. يبدو أنه لا يوجد شيء خاطئ في هذا النهج. ولكن إذا نظرت إلى أبعد من ذلك قليلاً وافترضت أن اللاعب يريد اللعب باستخدام الرسائل القصيرة ، فسيتعين على الشفرة معرفة قناة الاتصال الخاصة بلاعب معين. لا يبدو ضروريا. في الإصدار التالي ، قمت بتبديل التدفق للعمل مع الطلب الخارجي ،إضافة سجل استجابة لمتغيرات المستخدم وإزالة أي ذكر للقناة من الشفرة. الآن يمكن استخدام رمز اللعبة في تطبيق آخر وتنفيذ أي واجهة تفاعل مطلوبة: من وحدة التحكم إلى تطبيق الهاتف المحمول. سواء كنت تفصل العرض عن منطق التحكم وفقًا لنمط MVC أو تسليط الضوء على السياقات المحدودة وفقًا لمنهج DDD - قرر بنفسك. الشيء الرئيسي هنا هو أنه على الرغم من عدم وجود متطلبات ، على مستوى اللاوعي ، حددت اختناقًا محتملًا في النظام يمكن أن يخلق مشاكل في المستقبل.سواء كنت تفصل العرض عن منطق التحكم وفقًا لنمط MVC أو تسليط الضوء على السياقات المحدودة وفقًا لمنهج DDD - قرر بنفسك. الشيء الرئيسي هنا هو أنه على الرغم من عدم وجود متطلبات ، على مستوى اللاوعي ، حددت اختناقًا محتملًا في النظام يمكن أن يخلق مشاكل في المستقبل.سواء كنت تفصل العرض عن منطق التحكم وفقًا لنمط MVC أو تسليط الضوء على السياقات المحدودة وفقًا لمنهج DDD - قرر بنفسك. الشيء الرئيسي هنا هو أنه على الرغم من عدم وجود متطلبات ، على مستوى اللاوعي ، حددت اختناقًا محتملًا في النظام يمكن أن يخلق مشاكل في المستقبل.

تسمية متغيرة


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

كتب ستيف ماكونيل في كتابه "كود مثالي" أن الاسم يجب أن يصف الكيان الممثل بشكل كامل ودقيق. أعتقد أنه من الصعب الجدال في ذلك. على سبيل المثال ، بالنسبة للمتغيرات المنطقية ، أفضل استخدام البادئة. في هذه الحالة ، يمكن للقارئ أن يفهم بالفعل ما يتعامل معه بالحرفين الأولين. بالنسبة للطول ، من المستحسن ألا يتجاوز 20 حرفًا (Gorla ، Benander ، and Benander ، 1990). كلما كان نطاق المتغير أصغر ، كان اسمه أقصر. ولكن نظرًا لأن جميع المتغيرات في ManyChat لها نطاق عالمي ، فمن الجدير استخدام مساحة الاسم. بالنسبة إلى Bulls and Cows ، استخدمت جزء البداية على هيئة حرفين قبل الميلاد مشتقين من Bulls و Cows. بالنظر إلى ما سبق ، حصلت على اسم المتغير BC Is Victory - فريدة وشاملة للغاية ، في رأيي.

جاف ، قبلة


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


التدفق مع الجاف

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


التدفق المتوافق مع KISS

YAGNI


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

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

هيا بنا لنلعب


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

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

يتم تخمين الرقم 1234. يقوم
المشارك بالافتراض الأول: 4321
يحصل على الإجابة: 0 ثيران و 4 بقرات ، يقوم
المشارك بالافتراض الثاني: 1678
ويتلقى الإجابة: 1 ثور و 0 بقرة.

للمحاولة ، اتبع الرابط واتبع المطالبات. دعني أذكرك بأن اللعبة تمر عبر Facebook Messenger. نحن نقدم مستويين من الصعوبة: لعبة لعدد محدود وغير محدود من التحركات. الفوز في نقطة صعبة سيجلب لك 3 نقاط ، في نقطة بسيطة - 2. الخسارة ، بغض النظر عن المستوى ، ستأخذ نقطة واحدة.

تم تنفيذ اللعبة على كومة تقنية قياسية: Nginx 1.17 ، PHP 7.4 ، PostgreSQL 12.1. إذا كنت ترغب في ذلك ، يمكنك استنساخ المستودع على الخادم الخاص بك ، وتثبيت القالب على صفحة ManyChat الخاصة بك وترتيب البطولة الخاصة بك.

الموجودات


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

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

لم أكن لأفكر أبدًا في أنني سأقتبس في مقال واحد عن ستيف جوبز ولينين.

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

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

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

All Articles