ما فهمته والمشكلات التي واجهتها عند إنشاء نسخة Hacker News



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

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

توصي Skillbox بما يلي: دورة مطورة PHP عملية لمدة عام واحد.
نذكرك: لجميع قراء "هبر" - خصم 10000 روبل عند التسجيل في أي دورة من دورات Skillbox باستخدام الرمز الترويجي "Habr".

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

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

بالمناسبة ، اعتقدت أن إنشاء استنساخ منتظم سيكون مهمة سهلة. وحقيقة أن الأمر ليس كذلك ، أدركت بعد ذلك بقليل ، بدء العمل.

لا تجتاح عالية جدا

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

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

لا أستطيع حتى أن أضع في الكلمات مدى أهمية تقسيم مهمة كبيرة إلى عدة أصغر.

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

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

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

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

يدعم المشروع الآن التفويض ونشر المشاركات وفرزها والتفاعل مع المستخدمين الآخرين من خلال التعليق وعرض الملفات الشخصية وما إلى ذلك.

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

في كثير من الأماكن يتم تكرار الرمز

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



بشكل عام ، كان علي اتباع مبادئ DRY منذ البداية. لا تكرر نفسك! كنت بحاجة لكتابة برنامج وسيط من شأنه أن يفعل ما هو ضروري ، ثم ببساطة تطبيق الحل الموجود في تلك الحالات عندما كان ذلك مطلوبًا. في المستقبل ، سوف أقوم بتعديل مشروعي على أساس هذا المبدأ.

تسمية وتنظيم نقطة النهاية

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

يجب أن يكون لـ "RESTful API" واجهة موحدة ، كما يقول ويكي. في مشروعي ، نظمت كل شيء بحيث تم تحديد نقاط النهاية في ملفات المصدر ، والتي تم استدعاؤها وفقًا للوظيفة أو الغرض. تم تسجيل التسجيل والخروج من التطبيق في "auth.cr". تم تسجيل اسم المستخدم في "user.cr".

مما لا شك فيه أن هذا الجزء يتطلب معالجة. في المستقبل ، سوف أقوم بتنظيم كل شيء بحيث ترتبط الإجراءات بنقطة النهاية "/ المستخدم" ، وذلك ببساطة لأن كل هذا يتعلق بـ "المستخدم". على سبيل المثال ، لتحسين هيكل المشروع ، سوف أقسم الكود إلى أجزاء أكثر ملاءمة ويمكن التحكم فيها مع عدد كبير من الملفات. سوف أقوم بإنشاء المجلد “src / user / auth /” ، الذي سيحتوي على وظائف تسجيل الدخول والتسجيل وخروج المستخدم من التطبيق.

1_6dy_OCE7_Cjj_Df7_A0s_Aj_3i_Q

عدد الطلبات كبير جدًا

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



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

آمل أن تكون قد استمتعت بالمقالة وأنك تمكنت من تعلم شيء مفيد لنفسك.

توصي Skillbox بما يلي:

Source: https://habr.com/ru/post/ar425099/


All Articles