چالشها، تجربهها و واقعیتهایی که در محیط Production اتفاق میافتند
وقتی دربارهی مهندسی نرمافزار صحبت میشود، معمولاً تمرکز اصلی روی طراحی سیستم، نوشتن کد، توسعهی فیچرهای جدید و انتشار نسخههای تازه است. بسیاری از مهندسان نرمافزار ماهها زمان صرف طراحی معماری، پیادهسازی قابلیتها و بهبود کیفیت کد میکنند تا در نهایت محصولی پایدار و قابل استفاده ارائه شود. اما واقعیت این است که زندگی واقعی یک نرمافزار تازه پس از انتشار آن آغاز میشود؛ زمانی که سیستم وارد محیط Production میشود و کاربران واقعی شروع به استفاده از آن میکنند.
محیط Production جایی است که یک نرمافزار از یک پروژهی مهندسی به یک سیستم زنده تبدیل میشود. سیستمی که باید در شرایط واقعی کار کند، با دادههای واقعی روبهرو شود، تحت بار واقعی قرار بگیرد و با رفتارهای غیرقابل پیشبینی کاربران تعامل داشته باشد. بسیاری از تصمیمهایی که در زمان طراحی گرفته شدهاند، در همین محیط واقعی مورد آزمایش قرار میگیرند.
در چنین شرایطی، تیم Technical Support نقش بسیار مهمی پیدا میکند. این تیم معمولاً اولین جایی است که نشانههای یک مشکل در سیستم را مشاهده میکند. زمانی که کاربری با یک خطا مواجه میشود، زمانی که یک عملیات به درستی انجام نمیشود، یا زمانی که عملکرد سیستم دچار افت میشود، اغلب اولین گزارشها به سمت تیم پشتیبانی فنی میآید.
برخلاف تصور رایج، پشتیبانی فنی در سیستمهای نرمافزاری صرفاً پاسخ دادن به تیکتها یا بررسی سطحی خطاها نیست. در بسیاری از موارد، این کار نیازمند درک عمیق از معماری سیستم، ساختار دادهها، منطق کسبوکار و نحوهی تعامل اجزای مختلف نرمافزار با یکدیگر است.
یکی از مهمترین تفاوتهای کار در محیط Production با محیط Development این است که در محیط واقعی همیشه شرایطی رخ میدهد که قبلاً پیشبینی نشدهاند. حتی اگر تستهای زیادی نوشته شده باشد، باز هم سناریوهایی وجود دارند که تنها زمانی ظاهر میشوند که سیستم در مقیاس واقعی مورد استفاده قرار میگیرد.
برای مثال، در یکی از سیستمهایی که با آن کار میکردم، کاربران گزارش میدادند که گاهی یک عملیات خاص در سیستم با خطا مواجه میشود. در ابتدا تصور میشد که این یک مشکل ساده در رابط کاربری است. اما وقتی بررسی دقیقتر آغاز شد، مشخص شد که مسئله بسیار پیچیدهتر از آن چیزی است که در ابتدا تصور میشد.
اولین قدم بررسی لاگهای سیستم بود. لاگها یکی از مهمترین ابزارها برای فهمیدن رفتار واقعی نرمافزار هستند. در بسیاری از موارد، لاگها تنها جایی هستند که میتوان دید در پشت صحنهی سیستم دقیقاً چه اتفاقی افتاده است.
اما بررسی لاگها همیشه کار سادهای نیست. در یک سیستم پیچیده، ممکن است هزاران خط لاگ در هر دقیقه تولید شود. پیدا کردن چند خط مهم در میان این حجم از اطلاعات نیازمند تجربه و درک دقیق از رفتار سیستم است.
در این مورد خاص، پس از بررسی لاگها مشخص شد که خطا در یکی از سرویسهای داخلی سیستم رخ میدهد. اما نکتهی عجیب این بود که این خطا تنها در شرایط خاصی ظاهر میشد. پس از بررسی بیشتر، مشخص شد که مشکل به دادههای خاصی در پایگاه داده مربوط است؛ دادههایی که در زمان طراحی سیستم پیشبینی نشده بودند.
این تجربه یکی از درسهای مهم کار در Production را نشان میدهد: بسیاری از مشکلات نرمافزاری در نهایت به دادهها مربوط میشوند.
پایگاه داده در بسیاری از سیستمها قلب اصلی سیستم محسوب میشود. کوچکترین ناسازگاری در دادهها میتواند باعث ایجاد رفتارهای غیرمنتظره در بخشهای مختلف نرمافزار شود. گاهی یک مقدار null در جایی که انتظار نمیرود، یا یک رابطهی دادهای ناقص، میتواند باعث ایجاد خطا در فرآیندهای مختلف شود.
در چنین شرایطی، تیم Technical Support باید بتواند میان لایههای مختلف سیستم حرکت کند. گاهی لازم است لاگها بررسی شوند، گاهی کوئریهای پایگاه داده تحلیل شوند و در برخی موارد حتی لازم است مسیر اجرای یک درخواست در میان چند سرویس مختلف دنبال شود.
در سیستمهایی که از معماری میکروسرویس استفاده میکنند، این کار میتواند بسیار پیچیدهتر شود. در چنین معماریهایی، یک عملیات ساده از دید کاربر ممکن است در پشت صحنه شامل تعامل چندین سرویس مختلف باشد.
برای مثال، ثبت یک سفارش در یک سیستم آنلاین ممکن است شامل چندین مرحله باشد: بررسی هویت کاربر، ثبت اطلاعات سفارش، بررسی موجودی، پردازش پرداخت و در نهایت ثبت نهایی سفارش. هر یک از این مراحل ممکن است در یک سرویس جداگانه انجام شود.
اگر در هر یک از این سرویسها مشکلی رخ دهد، نتیجهی آن ممکن است در بخش دیگری از سیستم دیده شود. برای مثال، ممکن است کاربر تنها یک پیام خطا در رابط کاربری ببیند، در حالی که علت اصلی مشکل در یک سرویس کاملاً متفاوت قرار دارد.
به همین دلیل، یکی از مهارتهای مهم در پشتیبانی فنی سیستمهای نرمافزاری توانایی دنبال کردن جریان یک درخواست در میان اجزای مختلف سیستم است.
در کنار مشکلات منطقی و دادهای، یکی دیگر از چالشهای رایج در محیط Production مسائل مربوط به Performance است. بسیاری از سیستمها در محیط توسعه یا تست عملکرد بسیار خوبی دارند، اما زمانی که تحت بار واقعی قرار میگیرند رفتار متفاوتی از خود نشان میدهند.
برای مثال، یک کوئری پایگاه داده ممکن است در شرایط عادی در چند میلیثانیه اجرا شود، اما زمانی که حجم دادهها افزایش پیدا میکند، همان کوئری به یکی از گلوگاههای اصلی سیستم تبدیل میشود.
در یکی از پروژهها، کاربران گزارش میدادند که یک بخش خاص از سیستم بسیار کند شده است. بررسی اولیه نشان میداد که درخواستها با تأخیر زیادی پاسخ داده میشوند. پس از تحلیل دقیقتر مشخص شد که یکی از کوئریهای پایگاه داده در شرایط خاصی باعث ایجاد قفل روی جدول میشود و همین مسئله باعث کندی کل سیستم شده است.
حل چنین مشکلاتی معمولاً نیازمند همکاری نزدیک میان تیمهای مختلف است. گاهی لازم است توسعهدهندگان تغییراتی در کد ایجاد کنند، گاهی لازم است ساختار پایگاه داده بهینه شود و در برخی موارد حتی لازم است معماری سیستم تغییر کند.
یکی دیگر از بخشهای مهم کار در Technical Support مدیریت Incident ها است. Incident به شرایطی گفته میشود که یک اختلال در سیستم باعث میشود بخشی از سرویس برای کاربران در دسترس نباشد یا به درستی کار نکند.
در چنین شرایطی، زمان اهمیت بسیار زیادی دارد. تیم فنی باید در کوتاهترین زمان ممکن وضعیت سیستم را بررسی کند و تصمیم بگیرد که بهترین اقدام چیست.
گاهی سریعترین راه حل این است که سیستم به نسخهی قبلی بازگردانده شود. گاهی لازم است یک سرویس خاص موقتاً غیرفعال شود تا فشار از روی سیستم برداشته شود. در برخی موارد نیز لازم است یک Patch سریع برای حل مشکل منتشر شود.
اما حل سریع مشکل تنها بخشی از کار است. پس از رفع اختلال، معمولاً مرحلهی مهمی به نام Root Cause Analysis آغاز میشود. هدف از این مرحله پیدا کردن علت اصلی مشکل است.
اگر علت ریشهای یک مشکل به درستی شناسایی نشود، احتمال دارد همان مشکل در آینده دوباره تکرار شود. به همین دلیل بسیاری از تیمهای حرفهای تلاش میکنند پس از هر Incident یک گزارش دقیق تهیه کنند.
این گزارش معمولاً شامل توضیح دقیق مشکل، زمان وقوع آن، تأثیر آن بر کاربران، مراحل تحلیل، علت ریشهای و اقداماتی است که برای جلوگیری از تکرار آن انجام خواهد شد.
یکی دیگر از جنبههای مهم کار در پشتیبانی فنی، مستندسازی دانش است. در سیستمهای پیچیده، بسیاری از مشکلات ممکن است در طول زمان چندین بار تکرار شوند. اگر تجربههای گذشته به درستی ثبت نشده باشند، تیم مجبور میشود هر بار همان مسیر تحلیل را از ابتدا طی کند.
ایجاد یک Knowledge Base از مشکلات، راهحلها و سناریوهای مختلف میتواند به شکل قابل توجهی سرعت حل مشکلات را افزایش دهد.
در کنار تمام این چالشها، کار در Technical Support یک مزیت بزرگ نیز دارد: دید بسیار گسترده نسبت به سیستم. افرادی که در این حوزه فعالیت میکنند به مرور با بخشهای مختلف سیستم آشنا میشوند؛ از معماری نرمافزار گرفته تا ساختار دادهها، رفتار سرویسها، زیرساخت و حتی الگوهای استفادهی کاربران.
این دید گسترده میتواند به درک عمیقتری از نحوهی کار یک سیستم نرمافزاری منجر شود. بسیاری از مهندسانی که تجربهی کار در این حوزه دارند، در طراحی سیستمهای جدید تصمیمهای دقیقتری میگیرند، زیرا به خوبی میدانند که کدام بخشها در محیط واقعی بیشتر دچار مشکل میشوند.
در نهایت شاید بتوان گفت Technical Support یکی از بخشهایی است که کمتر دربارهی آن صحبت میشود، اما نقش آن در موفقیت یک محصول نرمافززاری بسیار حیاتی است. پشت هر سیستم پایداری که کاربران هر روز از آن استفاده میکنند، مجموعهای از تلاشهای مداوم برای پایش سیستم، تحلیل مشکلات، بهبود عملکرد و یادگیری از تجربههای گذشته وجود دارد.
پشتیبانی فنی دقیقاً در نقطهای قرار دارد که نرمافزار با دنیای واقعی روبهرو میشود. جایی که خطاهای واقعی رخ میدهند، مشکلات واقعی تحلیل میشوند و تجربههای واقعی شکل میگیرند.
شاید به همین دلیل است که بسیاری از مهندسان نرمافزار معتقدند بهترین درسهای مهندسی را نه در محیط توسعه، بلکه در این حوزه آموختهاند.