هندسة البرمجيات وتصميم النظام: The Big Picture and Resource Guide

مرحبا الزملاء.

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


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



إسحاق سميث أطلق عليه الرصاص من Unsplash

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

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

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

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

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

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

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

حسنًا ، من أين تبدأ؟ يوجد لدى Donna Martin مستودع على GitHub يُطلق عليه system-design-primer ، والذي يمكنك من خلاله تعلم كيفية تصميم الأنظمة واسعة النطاق ، وكذلك التحضير للمقابلات حول هذا الموضوع. يحتوي المستودع على قسم به أمثلة على بنيات حقيقية ، حيث يتم ، على وجه الخصوص ، فحص كيفية قيام بعض الشركات المعروفة ، مثل Twitter و Uber وما إلى ذلك ، بالتعامل مع تصميم أنظمتها.

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

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

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

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



لقطة لصمويل زيلر من Unsplash

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

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

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

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

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



لقطة توني ستودارد من Unsplash

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

توزيع اتصال

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

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

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

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

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

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

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

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


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

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



Kaleidico لقطة من Unsplash

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

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

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


All Articles