Crack the System Design مقابلة: نصائح من مهندس برمجيات تويتر

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

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

تحديث (3/24/2019) : إذا كنت ترغب في الانضمام إلى مجموعة من الطلاب لمعرفة المزيد عن تصميم النظام ، فأنا أقوم بتنظيم فصل دراسي صغير معًا! يمكنك الانتقال إلى هذا الرابط لمعرفة المزيد ، أو زيارة موقع الويب الخاص بي: zhiachong.com لمزيد من المعلومات.

هذه المقالة مقسمة إلى الأقسام الأربعة التالية:

  • اطرح أسئلة توضيحية
  • استخدم خلفيتك
  • معالجة مشكلة بشكل منهجي
  • احتفظ بملاحظاتك الخاصة

اطرح أسئلة توضيحية

الهدف الأساسي من مقابلة تصميم الأنظمة هو إعطاء المرشح فرصة لإثبات معرفته.

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

  • كيف ستفكر في مشكلة الفضاء
  • كيف تفكر في الاختناقات
  • ما يمكنك القيام به لإزالة هذه الاختناقات.

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

واحدة من أكثر الاستراتيجيات المفيدة التي أستخدمها شخصيًا هي طرح أسئلة توضيحية. ما هي أسئلة التوضيح "الجيدة" ، تسأل؟

يساعدك سؤال التوضيح الجيد في تحقيق شيء واحد أو أكثر من عدة أشياء:

  1. يساعدك على تضييق نطاق ما يفترض أن تفعله
  2. يساعد في توضيح ما يتوقعه المستخدم من النظام
  3. يعطيك اتجاه حول مكان المضي قدما
  4. يخبرك عن الاختناقات / مناطق المشاكل المحتملة

في مثال الصندوق الأسود ، قد تسأل ، "حسنًا ، ما الذي يحمله الصندوق؟ كم عدد العناصر التي يحملها؟ ومن هو المستخدم المقصود؟ "

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

ها أنت ذا ، هذا هو الصندوق.

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

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

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

هذه مناقشات شيقة جدًا يمكنك إجراؤها مع زميل ، وهذه إشارة قوية جدًا يبحث عنها المحاور.

استخدم خلفيتك لصالحك

في كثير من الأحيان أرى مهندسين يحاولون معرفة ما يحاول القائم بإجراء المقابلة طرحه ، ثم تلبية استجاباتهم لتناسب التوقعات.

أنا في الواقع لا أشجع أي شخص على القيام بذلك لعدة أسباب:

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

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

معالجة المشكلة بشكل منهجي

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

بعض الأشياء التي تدور في ذهني عندما أعمل على نظام جديد هي:

  • ما هو هدف النظام؟
  • من هم مستخدمو النظام؟
  • ما هو المقياس الذي نعمل به؟
  • هل هذا نظام جديد / قديم؟ كيف نتعامل مع الإصدار؟

من بين أمور أخرى…

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

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

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

بدأ عقلي يسير في اتجاهات مختلفة:

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

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

خدمة طلب القهوة الخاصة بي هي برنامج كخدمة (SAAS). يوفر واجهة لشركاء مختلفين للتوصيل بها.

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

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

احتفظ بملاحظاتك الخاصة

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

لديّ دفتر ملاحظات باسم "البرمجة" في Evernote. كلما واجهت شيئًا جديدًا ، أو شيئًا مثيرًا للاهتمام ، أقوم بتدوينه في دفتر ملاحظاتي لمزيد من الرجوع إليه.

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

هذه عينة لما تبدو عليه إحدى ملاحظاتي:

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

أقوم بتقسيم ملاحظاتي إلى:

  1. تصميمات الأنظمة
  2. إجراء المقابلات (تجربة + مراجعة المقابلات المختلفة التي أجريتها في الماضي ، مجمعة حسب اسم الشركة)
  3. بتات tid-bits العشوائية ، المعروفة بـ CS ، مثل البرامج النصية المفيدة أو حيل سطر الأوامر
  4. قراءات / أشرطة فيديو يوتيوب

جميع الملاحظات أعلاه تندرج تحت عنوان "البرمجة". بمرور الوقت ، أجد أن لدي مجموعة منظمة بشكل زائف من الأشياء التي قرأتها أو اكتشفتها في الماضي.

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

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

الموارد التي أوصي بها

مقدمة إلى: تصاميم الهندسة المعمارية والأنظمة - برنامج تعليمي رائع على Youtube من مهندس سابق في Facebook حول كيفية التعامل مع مشاكل تصميم الأنظمة

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

المقابلات الوهمية - بيئة محاكاة تحاكي المقابلة الفعلية مفيدة للغاية في التحضير للمقابلات. إذا تمكنت من العثور على صديق للقيام بذلك نيابة عنك ، فأنا أوصي به بشدة. أقوم أيضًا بإجراء مقابلات وهمية ، لذلك إذا كنت مهتمًا ، فلا تتردد في الاتصال بي على zhiachong.com!

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

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

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

Pilot G2 (Black) - بسهولة أفضل الأقلام التي استخدمتها على الإطلاق ، والأقلام الوحيدة التي سأستخدمها. أشتريها بكميات كبيرة من أمازون وأحتفظ بها في كل مكان أذهب إليه. لديّ واحدة في حقيبة ظهري ، وواحدة في المكتب ، وواحدة في مكتبي المنزلي حتى يكون لدي دائمًا قلم. إنه يكتب بشكل رائع ، ويتدفق الحبر بسلاسة ، وأنا فقط أحب الشعور بالكتابة به. بالاقتران مع Moleskin ، في بعض الأحيان أريد فقط التقاط G2 لتدوين أشياء عشوائية هناك لأن هذين الاثنين مثاليان معًا.

Grokking the System Design Interview - تأتي هذه المقابلة كتوصية من الأصدقاء. إنها دورة عبر الإنترنت تعلم كيفية تصميم النظام الموزع بالتفصيل. إنها دورة 79 دولارًا. هناك تسعير الفريق. إذا كان هناك أي اهتمام ، فسأراجعهم لمعرفة ما إذا كان من الممكن تشكيل مجموعة للحصول على خصم جماعي.

تابعوني على Twitter و Facebook و LinkedIn. اشترك في القائمة البريدية الخاصة بي حيث أرسل بانتظام النصائح والحيل وتعلم الصناعة.

إذا كنت قد استمتعت بهذه المقالة ، فقم بالتعليق أدناه: ما هي نصيحتك لبناء نظام موثوق وقابل للتطوير؟