بدهی فنی Technical debt
بدهی فنی یا Technical debt چیست؟
بدهی فنی (Technical debt) نوعی بدهی است که در اثر انتخاب یک رویکرد ساده در مقابل رویکردی حرفهای یا مناسبتر به وجوه فنی یک شرکت، تیم و … تحمیل میشود. بدهی فنی یکی از مسائل مهم در حوزه توسعه نرم افزار به شمار میرود که البته به حوزههای مختلف دیگر نیز قابل تعمیم است. اصطلاحاتی نظیر بدهی طراحی (Design debt) و بدهی کد (Code debt) از جمله عناوین معادل برای بدهی فنی هستند.
بدهی فنی میتواند ناشی از ناآگاهی و دانش یا مهارت ناکافی در تولید محصول باشد و یا در اثر ترجیح دادن یک روش سریع و ارزان نسبت به روشی بهتر یا رویکردی ایدهآل ایجاد شود. اعمالی که خواسته یا ناخواسته برای محدودیتهای پروژه (مانند زمان و بودجه)، راحتی توسعه یا رضایت ظاهری مشتری و … اولویت بیشتری در مقایسه با مسائل فنی و طراحی اصولی درنظر میگیرند نیز باعث ایجاد بدهی فنی میشود. این اعمال ممکن است به مشکلاتی بیانجامد که میبایست در آینده هزینه بیشتری برای حل آن پرداخت شود.
در صورتی که بدهی فنی شناسایی و پرداخت نشود مشابه با بدهیهای مالی میتواند باعث انباشته شدن بهرهها (یا هزینههای ناشی از بدهی) شود. این بدهی ممکن است از طریق هزینهای که بابت دوباره کاری های اضافی ایجاد میکند تغییر نرم افزار یا محصول را دشوارتر کند.
مثال هایی از بدهی فنی
تصور کنید برای شروع یک پروژه میخواهید یک تیم برنامه نویسی را کنار هم جمع کنید. تجربه اول شماست و افرادی که استخدام میکنید هم چندان ماهر نیستند. در نهایت نتیجه کار تیم، محصولی میشود که از لحاظ ویژگیها و کیفیت به پای رقبا نمیرسد. در چنین حالتی ممکن است برای رسیدن به جایگاه مناسب در بازار مجبور شوید این بدهی را با هزینه دوباره برای طراحی نرم افزار یا بازسازی کد پرداخت کنید.
به عنوان مثالی دیگر فرض کنید برای ساخت یک فروشگاه آنلاین، بودجه پایین یا زمان اندکی دارید. در این حالت ممکن است ترجیح دهید برای آمادهسازی سریع سایت با هزینه اندک از یک هاست ضعیف استفاده کنید. در عین حال از خیر قابلیت عضویت در سایت میگذرید. به یکباره محبوبیت فروشگاهتان با یک تبلیغ، افزایش قابل توجهی را تجربه میکند و سرویس شما مقیاسپذیری لازم را ندارد. هاست سایت قادر به پاسخگویی حجم عظیم مشتریانتان نخواهد بود و فروشگاه از دسترس خارج میشود. از سوی دیگر رسیدگی به سفارشها و پاسخ به تماسهای مشتریان به دلیل نبود سیستم عضویت و تیکتینگ، شما را به دردسر میاندازد. حالا ضمن آسیب وارده به برند شما، باید با هزینه و صرف وقت بیشتر دنبال حل این مشکلات باشید.
انواع بدهی های فنی
بدهیهای فنی را میتوان به دو دسته عمدی و غیرعمدی تقسیم کرد. بدهی های فنی عمدی (Intentional technical debt)، بدهیهایی هستند که آگاهانه ایجاد میشوند. برای مثال ممکن است مدیران یک شرکت برای تسریع مراحل توسعه نرم افزار با آگاهی از نتایج آن، صرفا حداقلهای ضروری را درنظر بگیرند؛ درحالیکه این حداقلها افزودن ویژگیهای بیشتر به نرم افزار را دشوارتر میکند. در سمت مقابل، بدهی های فنی غیرعمدی (Unintentional technical debt) نتایج ناخواستهای هستند که معمولا در اثر یک کار ضعیف، دانش و مهارت ناکافی و … ایجاد میشوند.
از جنبهای دیگر میتوان Technical debt را به انواع بدهی طراحی، بدهی کد، بدهی زیرساخت، بدهی معماری، بدهی سنجش نیازها، بدهی تست و … تقسیم کرد.
مدیریت و مقابله با بدهی فنی
پیش از هرچیز بهتر است بدانید وجود بدهی فنی همیشه هم یک نکته منفی به شمار نمیرود. گاهی اوقات ممکن است ایجاد بدهی فنیِ تحت کنترل برای پیشبرد رویه تولید محصول و ساخت نمونه های اولیه ضروری باشد. با این حال، عدم توجه کافی به این بدهی و نتایج آن میتواند همچنان منجر به هزینههای بالا شود. آگاهی از وجود این بدهی ها، قدم اول در مدیریت و پرداخت آنها به شمار میرود.
تا حد ممکن لازم است برای جلوگیری از ایجاد بدهی فنی، حین توسعه نرم افزار و تولید محصول مواردی نظیر مقیاسپذیری، مستندسازی، امکان تغییر و افزودن ویژگیهای جدید درنظر گرفته شود. کدنویسی تمیز و اصولی، رعایت استانداردهای روز و تست کامل محصول برای پیشگیری و کاهش این بدهیها ضروری هستند.
با هر تغییر در کدهای یک نرم افزار یا محصول باید تغییرات موردنیاز احتمالی در سایر بخشها نیز اعمال شود. بخشهای مرتبط در کد نرم افزار، مستندات و کامنت ها از جمله مواردی هستند که باید در صورت لزوم تغییر داده شوند. در صورتی که هر تغییر ضروری به موقع اعمال نشود یک تکنیکال دبت محسوب میشود.
در عین حال، داشتن برنامه مدون برای شناسایی بدهیهای فنی لازم است. پس از شناسایی یک بدهی فنی، برنامه ریزی، اولویت بندی امور و طراحی نقشه راه مناسب برای پرداخت بدهی ضروری است. در ادامه، پرداخت بدهی و ایجاد تغییرات در کدهای نرم افزار مطابق با طرح موردنظر انجام میشود.
دلایل بروز بدهی فنی
دلایل مختلفی در ایجاد بدهیهای فنی دخیل هستند. از جمله این دلایل میتوان به موارد زیر اشاره کرد:
مسائل تجاری
همیشه یک راه میانبر، راه بهتری نیست! این موضوع در مورد تولید محصول و توسعه نرم افزار نیز صدق میکند. ممکن است برخی مسائل تجاری باعث شود برای تولید سریعتر محصول یا تولید محصول با قیمتی ارزانتر از راهکاری نامناسب استفاده شود. همین مسأله میتواند در آینده منجر به مشکلات و هزینههای اضافی متعددی شود.
توسعه مداوم نرم افزار
توسعه مداوم نرم افزار برای تغییر و بهبود آن یا افزودن ویژگیهای جدید از مسائل طبیعی در این حوزه محسوب میشود. با این وجود توسعه نرم افزار در طول زمان میتواند باعث شود راهکارهای قدیمی مورد استفاده کیفیت ابتدایی خود را از دست بدهند و نیاز به تغییر داشته باشند. کدهای قدیمی که توسط فردی دیگر در گذشتههای دور نوشته شده است و بدون مستندسازی کافی به حال خود رها شده به این موضوع دامن میزند.
شروع به توسعه و تولید محصول پیش از سنجش کامل نیازها
شروع فوری توسعه یک نرم افزار میتواند باعث صرفهجویی در زمان شود. با این حال آغاز کار پیش از سنجش دقیق نیازها میتواند منجر به دوباره کاری و ایجاد Technical debt شود. به علاوه تغییرات لحظه آخری نیز میتواند با توجه به کمبود زمان و سرمایه، باعث ایجاد بدهی شود.
فقدان مستندات فنی
کدنویسی و تولید محصول بدون مستندسازی کامل میتواند انجام این کار را به نوعی بدهی تبدیل کند.
نبود همکاری و ارتباط مناسب میان اعضای تیم
عدم وجود همکاری میان اعضای تیم و نبود راهنمایی کافی برای اعضای مبتدی میتواند باعث ایجاد کدهای نامناسب و هزینههای اضافی ناشی از کار مجدد شود.
عدم انعطاف پذیری محصول در برابر تغییرات
استفاده نکردن از برنامه نویسی ماژولار و برنامه نویسی شئ گرا میتواند تغییرات آینده نرم افزار را دشوارتر کند.
عدم توجه به استانداردهای روز
استفاده از زبان ها و تکنولوژی ها یا فریم ورک های نامناسب و رو به زوال یا بدون پشتیبانی میتواند توسعه محصول در آینده را با هزینههای بیشتر روبرو کند. در مقابل، اگر از زبان های برنامه نویسی معتبر با کتابخانههای متعدد و پشتیبانی مناسب در توسعه نرم افزار استفاده کنید میتوانید روی تغییر نرم افزار در آینده مطابق با استانداردهای روز حساب کنید.
دانش و مهارت ناکافی
نداشتن دانش و تجربه یا مهارت کافی در کدنویسی تمیز و حرفهای از عوامل رایج ایجاد بدهی تکنیکال است. همین موضوع در مورد سایر وجوه فنی نظیر طراحی محصول، سنجش دقیق نیازها و … نیز صدق میکند.
تست ناکافی
تست نکردن یا تست ناقص و سریع یک نرم افزار یا محصول ممکن است باعث ایجاد بدهی شود. حل مشکلات و باگ های متعدد نرم افزار پس از انتشار در مقایسه با عیبیابی و اشکال زدایی به موقع، هزینههای بیشتری در پی خواهد داشت.
به تأخیر انداختن بازسازی کد
گاهی اوقات لازم است برای توسعه نرم افزار، بهبود طراحی و پشتیبانی از نیازهای آتی، ساختار بخشهایی از کد تغییر داده شود. به تأخیر انداختن بازسازی کد (Code refactoring) میتواند با افزایش حجم کد، باعث انباشت بدهی شود.
عدم آشنایی با بدهی فنی
نبود درک و آگاهی کافی در مورد Technical debt و تصمیمگیری بدون توجه به مفاهیم آن، یکی دیگر از عوامل ایجاد این بدهیها محسوب میشود.
پیوندهای پیشنهادی تک دیک