مایکروبی‌دی‌بی به پستگرس

این دربارهٔ چیست؟

در حالی که برای یک موقعیت شغلی در یک شرکت مصاحبه می‌کردم، از من خواسته شد به پرسش زیر پاسخ دهم: آیا می‌توانید لطفاً دشوارترین مسئله‌ای را که حل کرده‌اید توصیف کنید؟ به‌طور خلاصه، دشوارترین مسئله‌ای که حل کردم زمانی رخ داد که در eBay کار می‌کردم، جایی که در سال 2023 یکی از پروژه‌های بزرگ داخلی eBay را از استفاده از MongoDB به Postgres منتقل کردم. با این حال، این پرسش واقعاً مرا وادار کرد که دربارهٔ این بیندیشم که چگونه این مسئلهٔ دشوار را حل کردم و به من اجازه داد دربارهٔ مسیر توسعه‌دهندگی‌ام تأمل کنم. به همین دلیل، پاسخی بسیار مفصل و جامع به آن پرسش نوشتم، و می‌خواستم پاسخ خود را در وب‌سایتم به اشتراک بگذارم.

پرسش چه بود؟

آیا می‌توانید لطفاً دشوارترین مسئله‌ای را که حل کرده‌اید توصیف کنید؟ لطفاً در کمتر از 4 پاراگراف پاسخ دهید و به ما بگویید:

  1. چه کردید
  2. چه چیزی آن را دشوار کرد
  3. از این تجربه چه آموختید
  4. در نتیجه چگونه رشد کردید

پاسخ من چه بود؟

1 - چه کردید

در حال حاضر، در حرفه‌ام، دشوارترین مسئله‌ای که حل کردم زمانی بود که در جایگاه فعلی‌ام در eBay کار می‌کردم. در حال حاضر در eBay، جایی که از طریق Hitachi Vantara به‌صورت قراردادی مشغول هستم، یک ابزار داخلی به نام Storage Management System یا STMS را توسعه می‌دهم و نگهداری می‌کنم. STMS ابزاری است که توسط تیم Service & Storage Infrastructure (SSI) eBay برای پایش و مدیریت دستگاه‌ها در سراسر مراکز دادهٔ eBay استفاده می‌شود. STMS این امکان را فراهم می‌کند که یک مهندس بتواند شاخص‌های تعداد زیادی آرایه، سوئیچ، میزبان، گروه‌های دیسک، کلاسترها و پایگاه‌های داده را پایش کند. همچنین هشداردهی برای سوئیچ‌ها و آرایه‌ها را مدیریت می‌کند و به‌سادگی به یک مهندس اجازه می‌دهد کارهای پیشرفته‌ای مانند تخصیص میزبان را انجام دهد. STMS بیش از 1.5 میلیون شاخص در دقیقه را دریافت می‌کند و این امر مربوط به بیش از ده‌ها/صدها آرایه، سوئیچ، میزبان، گروه‌های دیسک و کلاستر در سراسر مراکز دادهٔ eBay است. این ابزار برای تیم SSI به‌عنوان یک ابزار حیاتی جهت پایش و مدیریت زیرساخت ذخیره‌سازی eBay عمل می‌کند، که برای سرویس اصلی و مدل کسب‌وکار eBay حیاتی است. با دانستن همهٔ این‌ها، دشوارترین مسئله‌ای که در دوران کارم در eBay باید حل می‌کردم، مهاجرت STMS از استفاده از پایگاه‌دادهٔ MongoDB به استفاده از پایگاه‌دادهٔ Postgres بود.

2 - چه چیزی آن را دشوار کرد

آنچه این مسئله را دشوار می‌کرد این بود که MongoDB و Postgres پایگاه‌داده‌هایی اساساً متفاوت هستند. MongoDB یک پایگاه‌دادهٔ مبتنی بر سند (NoSQL) است، به این معنا که داده‌ها به‌صورت JSON در یک collection ذخیره می‌شوند (مانند سندها در یک بایگانی)، و Postgres یک پایگاه‌دادهٔ رابطه‌ای (SQL) است، به این معنا که داده‌ها به‌صورت ردیف‌هایی در یک جدول ذخیره می‌شوند (مانند یک صفحه‌گسترده). علاوه بر این، کل backend STMS برای پردازش و مدیریت داده‌ها به‌صورت JSON ساخته شده بود و از بسته‌هایی استفاده می‌کرد که منحصراً با MongoDB برای عملیات پایگاه‌داده سازگار بودند. همچنین، در حین انجام این مهاجرت، نباید هیچ‌گونه downtime وجود می‌داشت و تقریباً همهٔ ویژگی‌ها باید به کار خود ادامه می‌دادند، زیرا STMS به‌عنوان یک ابزار داخلی تا چه اندازه حیاتی است. این مهاجرت در تمامیت خود باید ظرف چند ماه، بدون downtime و بدون یک برنامهٔ روشن برای اجرا، انجام می‌شد. همچنین من پیش از آن تجربهٔ زیادی با Postgres نداشتم و، همراه با همهٔ همکارانم، هیچ تجربه‌ای در مهاجرت یک کُدبیس بزرگِ قدیمی از یک پایگاه‌دادهٔ NoSQL به SQL نداشتیم.

3 - از این تجربه چه آموختید

مهاجرت کُد STMS از MongoDB به Postgres با موفقیت و بدون downtime انجام شد، در حالی که تقریباً همهٔ ویژگی‌ها و قابلیت‌ها حفظ شدند. این کار مستلزم پژوهش، یادگیری، آزمایش و رفع اشکال گسترده بود. من ساختارهای دادهٔ خود را بازطراحی کردم تا با پایگاه‌داده‌های رابطه‌ای مؤثرتر کار کنند و بسته‌های جدیدی توسعه دادم تا جایگزین بسته‌هایی شوند که به آن‌ها وابسته بودیم اما با Postgres یکپارچه نمی‌شدند. در مجموع، مهاجرت به‌صورت روان و بدون هیچ ایراد واقعی‌ای پیش رفت که از انتظارات من فراتر بود. در طول این فرایند، چیزهای زیادی آموختم. از نظر فنی، درک بهتری از Postgres، SQL، parse trees، ORMs، Sequelize، Prisma، query builders، equivalence checking، راه‌اندازی پایگاه‌دادهٔ primary-standby، و آزمون واحد مرتبط با پایگاه‌داده به دست آوردم. از نظر بنیادی، یاد گرفتم چگونه یک مسئلهٔ پیچیده را به بخش‌های کوچک‌تر به‌طور مؤثرتر تجزیه کنم و برای آن بخش‌ها راه‌حل‌های مؤثری پیاده‌سازی کنم. علاوه بر این، یاد گرفتم چگونه رهبر باشم و این پروژه را با وجود محدودیت‌های زیاد، عقب‌افتادگی‌ها و ناشناخته‌ها، تا پایان هدایت کنم.

4 - در نتیجه چگونه رشد کردید

من حرفه‌ام را در رباتیک در دوران کارشناسی آغاز کردم، اما وقتی در eBay شغل پیدا کردم به سمت توسعهٔ وب تغییر مسیر دادم و وارد حوزه‌ای شدم که پیش‌تر هیچ تجربه‌ای در آن نداشتم. این گذار، پایه‌گذار حرفه‌ای شد که با یادگیری مداوم و سازگاری تعریف می‌شد. چالش مهاجرت STMS از MongoDB به Postgres جهشی مهم در حرفهٔ من بود و به‌شدت به رشد حرفه‌ای‌ام کمک کرد. این فقط دربارهٔ تعمیق درکم از پایگاه‌داده‌ها یا تقویت مهارت‌های حل مسئله‌ام نبود. این پروژه مرا به قلمرویی تازه وارد کرد و برنامه‌ریزی دقیق و تعهد به عدم downtime را طلب می‌کرد. با هدایت این مهاجرت بدون تجربهٔ قبلی در انتقال‌های پایگاه‌داده در مقیاس بزرگ، ارزش ارتباط شفاف، کار تیمی، و تجزیهٔ چالش‌های پیچیده به بخش‌های قابل‌مدیریت را آموختم. این تجربه مهارت‌های فنی من را گسترش داد و همچنین اعتمادبه‌نفسم را افزایش داد و مرا بیشتر به‌سوی اهداف و پروژه‌های بلندپروازانه‌تر سوق داد. این نقطهٔ عطف در حرفهٔ من نه‌تنها رشد من را به‌عنوان یک توسعه‌دهنده و رهبر، بلکه به‌عنوان یک حل‌کنندهٔ مسئله نیز نشان داد و نشان داد که پذیرفتن ناشناخته و موفق شدن، کلید رشد فردی و حرفه‌ای است.

نتیجه چه بود؟

پاسخ‌های من باعث شد به مرحلهٔ دوم فرایند مصاحبه در شرکت بروم و به من اجازه داد با یکی از توسعه‌دهندگان تیم گفت‌وگویی دلپذیر داشته باشم، که واقعاً خوب بود. اما، به‌طور اصلی، این تکلیف به من اجازه داد تا دربارهٔ دشوارترین مسئلهٔ فنی‌ای که در حرفه‌ام و در دوران کارم در eBay حل کردم تأمل کنم. این کار به من امکان داد دربارهٔ رشد خود به‌عنوان یک توسعه‌دهنده/مهندس فکر کنم، مهارت‌های جدیدی توسعه دهم، و اعتمادبه‌نفسم را در سازگاری با مسائل پیچیده و حل آن‌ها تقویت کنم.