بدهی فنی چیه و چطور باید بازپرداختش کنیم؟

هر وامی، بازپرداختی داره. بدهی فنی، وامی است که تیم تولید نرم‌افزار با انتخاب راه حل ساده و سریع می‌گیره اما موقع بازپرداخت باید بهره بالایی بپردازه. چطور بازپرداختش کنیم؟

یک وام با بهره بالا

بدهی فنی هزینه دوباره‌کاری‌هاییه که به خاطر انتخاب راه حل ساده و سریع به جای راه حل اصولی و زمان‌بر می‌پردازیم.
اغلب اوقات به خاطر فشار مدیران و گاهی هم به دلایل دیگر، عمدی یا غیرعمدی بخشی از کد رو اون‌طور که باید پیاده نمی‌کنیم به این امید که بعداً درستش خواهیم کرد. درست در همین لحظه برای خودمون بدهی فنی درست کردیم. تصویر زیر یک نمونه واضح بدهی فنی است. چند لحظه نگاهش کنید

این تصویر زشت بدهی فنی است. اولین روزها، اینطوری نبوده ولی خب خشت اول رو کج بگذارید و تلاشی برای درست کردنش نکنید می‌شه این!

بدهی فنی مثل وام گرفتن از بانک است. زمانی می‌رسد که به وام نیاز دارید و اقدام می‌کنید. هر وامی، بازپرداختی دارد و البته این وام بهره بالایی هم داره. اگر بدهی فنی رو پرداخت نکنید، زمان (بخونید هزینه) دوباره‌کاری که براش پرداخت می‌شه حتی بیشتر از زمانی می‌شه که قرار بود در ابتدا صرف اجرای درست تمام راه‌حل بشه و نکته اینجاست که هر روز که می‌گذره این باز پرداخت سخت‌تر و پرهزینه‌تر می‌شه چون نرم‌افزار رشد می‌کنه و پیچیده‌تر می‌شه و تا چشمتون رو باز می‌کنید می‌بینید یک ایراد کوچولو که نادیده گرفته شده بود، مثل اون تصویر بالا، یک معماری زشت و نرم‌افزار زمخت می‌سازه!

دقت کنید که بدهی فنی با کد کثیف نوشتن فرق داره و به اشکال مختلفی هم ممکنه ظهور کنه مثل:

  • نقص‌ها و مشکلات شناخته‌شده که بررسی و اجرای راه‌حل رفعشون رو پشت گوش می‌اندازیم
  • طراحی یا معماری بد نرم‌افزار که غیرمنعطف بودنش رو می‌دونیم اما بهش اهمیتی نمی‌دیم
  • مدیریت ضعیف در زمان انتشار نسخ نرم‌افزار و انتظار برای اعلام مشکلات سازگاری توسط کاربران
  • و موارد مشابه دیگه

انواع بدهی فنی

مارتین فاولر بدهی فنی رو از نظر علت به دو دسته ناشی از بی‌دقتی (reckless) یا ناشی از مصلحت و دوراندیشی (prudent) و از نظر نوع به دو نوع عمدی (deliberate) و سهوی (inadvertent) تقسیم می‌کنه که نتیجه‌اش می‌شه چهار حالت زیر

چهار نوع بدهی فنی از نظر مارتین فاولر

یک نکته مهم درباره بدهی فنی که بر اساس این چهار نوع می‌شه بهش اشاره کرد اینه که داشتن بدهی فنی همیشه بد نیست و گاهی لازمه. مثلاً ممکنه به دلیل مسائل مرتبط با رقابت شدید در بازار، بخواهید امکانی رو پیش از رقبا عرضه کنید. اینجا یکی از جاهایی است که مستعد بدهی فنی محسوب می‌شه. در عین حال که بدهی فنی بعضی مواقع تجویز می‌شه، اما بازپرداخت بدهی فنی همیشه واجبه و گرنه با توجه به بهره بالا در زمان بازپرداخت، ممکنه تمام توان تیم نرم‌افزاری رو درگیر خودش کنه و عملاً تیم رو زمین‌گیر کنه

بازپرداخت بدهی فنی

یکی از روش‌های توصیه شده برای پرداخت بدهی فنی استفاده از قانون Boy Scout یا قانون پیشاهنگی است. گویا یکی از قوانین پسرهای پیشاهنگ اینه که وقتی اردوگاه رو ترک می‌کنین تمیزتر از زمان ورودتون باشه.

رابرت مارتین (عمو باب) می‌گه: همیشه کدی که روش کار می‌کنید رو یک ذره از اون زمانی که پیداش کردین بهتر کنین

بر همین اساس در نرم‌افزار توصیه شده برای اینکه درگیر بازپرداخت سود بالای بدهی فنی نشین، هر زمان که روی کدی کار می‌کنید بهتر از زمانی که شروع کردین تحویلش بدین. لذا refactor کردن منظم، رفع مشکلات شناخته شده، بهبود الگوریتم‌ها همیشه و همیشه در دستور کارتون باشه. تا کی؟ تا زمانی که نرم‌افزار زنده است و پشتیبانی داره

پی‌نوشت: فردا من هم باید برم سراغ بازپرداخت بدهی فنی ایجاد شده روی یک پروژه. راستی تیم شما چقدر بدهی فنی داره و بازپرداختش چطوریه؟ کامنت بگذارید و از تجربیات خودتون بگین