هندسة البرمجيات وتصميم الأنظمة: الصورة الكبيرة ودليل الموارد

مرحبا زملائي.

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

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

هندسة البرمجيات وتصميم الأنظمة: الصورة الكبيرة ودليل الموارد

لقطة إسحاق سميث من أونسبلاش

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

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

  • ما هي المشكلة التي نحاول حلها؟
  • ما هو الحد الأقصى لعدد المستخدمين الذين سيتفاعلون مع نظامنا؟
  • ما هي أنماط كتابة وقراءة البيانات التي سنستخدمها؟
  • ما هي حالات الفشل المتوقعة وكيف سنتعامل معها؟
  • ما هي التوقعات بشأن اتساق النظام وتوافره؟
  • هل يجب عليك مراعاة أي متطلبات تتعلق بالتحقق والتنظيم الخارجي عند العمل؟
  • ما هي أنواع البيانات الحساسة التي سنقوم بتخزينها؟

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

ضبط المستوى الأولي

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

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

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

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

بناء المعرفة حول تخزين البيانات واسترجاعها

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

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

هندسة البرمجيات وتصميم الأنظمة: الصورة الكبيرة ودليل الموارد

لقطة صموئيل زيلر من أونسبلاش

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

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

أنماط الاتصال

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

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

هندسة البرمجيات وتصميم الأنظمة: الصورة الكبيرة ودليل الموارد

لقطة توني ستودارد من أونسبلاش

من المهم دائمًا تنظيم التواصل مع العالم الخارجي سلامة، والتي يجب أيضًا أن تؤخذ على محمل الجد وأن يتم متابعتها بنشاط.

توزيع الاتصال

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

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

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

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

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

دعونا نتحدث عن منطق الأعمال. هيكلة منطق الأعمال وتدفقات المهام والمكونات

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

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

النهج التعاوني

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

هندسة البرمجيات وتصميم الأنظمة: الصورة الكبيرة ودليل الموارد

لقطة كاليديكو من أونسبلاش

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

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

المصدر: www.habr.com

إضافة تعليق