نگهداری نرم‌افزار
نگهداری نرم‌افزار در مهندسی نرم‌افزار به معنی اصلاح یک محصول نرم‌افزاری «پس از تحویل» آن است، و هدف این فعالیت آن است که برای بهبود کارایی، و دیگر ویژگی‌های نرم‌افزار، خطاهای موجود در آن را تصحیح کند.
گرایشی از مهندسی نرم‌افزار است که شامل نگهداری و اصلاح یک محصول نرم‌افزاری پس از تحویل است به منظور تصحیح اشکالات پیش‌آمده و بهبود عملکرد یا ویژگی‌های دیگر آن نرم‌افزار.
یک دید متعارف نسبت به تعمیر و نگهداری نرم‌افزار این است که آن را صرفاًشامل رفع نقصهای نرم‌افزاری بدانیم، اما یک مطالعه نشان داده‌است که بیش از ۸۰٪ از فعالیت‌های مربوط به تعمیر و نگهداری نرم‌افزار مرتبط با اقدامات اصلاحی نیست. این دید متعارف توسط کاربرانی که مشکلی در نرم‌افزار گزارش می‌دهند که در واقعیت بهبودهایی بر کارایی نرم‌افزار هستند تقویت می‌شود. مطالعات جدیدتر درصد فعالیت‌های مربوط به تعمیر و نگهداری نرم‌افزار که مرتبط با رفع اشکال هستند را نزدیک به ۲۱٪ گزارش کرده‌اند.
نگهداری نرم‌افزار و تکامل سیستم‌ها برای اولین بار توسط Meir M. Lehman در سال ۱۹۶۹ میلادی مورد بررسی قرار گرفت. طی یک دوره بیش از بیست ساله، تحقیقات او منجر به تدوین قوانین لیمن (لیمن ۱۹۹۷) شد. یافته‌های کلیدی تحقیقات وی شامل این است که تعمیر و نگهداری نرم‌افزار در واقع توسعه تکاملی آن است و نگهداری نرم‌افزار در واقع از درک آنچه برای سیستم (نرم‌افزار) در طول زمان اتفاق می‌افتد در تصمیم‌گیری کمک می‌گیرد. لیمن نشان داد که سیستم در طول زمان همچنان در حال تکامل است. آن‌ها در تکامل و رشد خود در طی زمان پیچیده‌تر می‌شوند مگر اینکه برخی از اقدامات مانند کد refactoring به منظور کاهش پیچیدگی صورت پذیرد.
در اواخر دهه ۱۹۷۰ یک بررسی گسترده و معروف طی یک مطالعه توسط Lientz و Swanson انجام شد که در آن از سهم زیاد هزینه‌های تعمیر و نگهداری در هزینه‌های چرخه حیات یک نرم‌افزار پرده برداشته شد. آن‌ها فعالیت‌های تعمیر و نگهداری را به چهار کلاس طبقه‌بندی کردند:
این بررسی نشان داد که حدود ۷۵٪ از فعالیت‌های تعمیر و نگهداری صرف دو نوع اول شد و اصلاح خطاها حدود ۲۱٪ از فعالیت‌های مربوط به تعمیر و نگهداری را به خود اختصاص داد. بسیاری از مطالعات بعدی نتایج مشابهی را نشان می‌دهند. مطالعات نشان می‌دهد که مشارکت کاربر نهایی بسیار مهم است و در جمع‌آوری داده‌ها و نیازمندی‌های جدید و تجزیه و تحلیل آن‌ها نقش مهمی ایفا می‌کند، و این علت اصلی هر گونه مشکل در تکامل و تعمیر و نگهداری نرم‌افزار است؛ بنابراین تعمیر و نگهداری نرم‌افزار مهم است چرا که بخش بزرگی از کل هزینه‌های چرخه حیات نرم‌افزار را به خود اختصاص می‌دهد و همچنین عدم توانایی در ایجاد تغییر در نرم‌افزار با سرعت و قابلیت اعتماد مناسب به این معنی است که فرصت‌های کسب و کار از دست می‌روند.
کلید نگهداری نرم‌افزار توجه به مسائل مربوط به هر دو زمینه مدیریتی و فنی است. کلید مدیریت مسائل عبارتند از: هم‌ترازی و همراهی با مشتری، ایجاد اولویت‌هایی برای نیروی انسانی، برآورد صحیح هزینه‌ها. کلید حل مسائل فنی عبارتند از: برطرف کردن محدود درک، تأثیر، تحلیل، تست، نگهداری و اندازه‌گیری.
تعمیر و نگهداری نرم‌افزار فعالیت بسیار گسترده‌ای است که شامل تصحیح خطا و پیشرفت قابلیت‌های نرم‌افزار و بهینه‌سازی آن است. از آنجایی که تغییر اجتناب ناپذیر است، مکانیسم‌های مورد استفاده باید امکان ارزیابی و کنترل و ایجاد تغییرات را داشته باشند.
بنابراین هر کاری که به منظور تغییر نرم‌افزار انجام می‌شود بخشی از عملیات تعمیر و نگهداری نرم‌افزار در نظر گرفته می‌شود و هدف آن حفظ ارزش نرم‌افزار در طول زمان می‌باشد. ارزش نرم‌افزار را می‌توان با گسترش پایه مشتری (Customer Base) آن افزایش داد و این امر نیازمند تبدیل شدن نرم‌افزار به حالتی است که برای استفاده کارآمدتر باشد و فناوری‌های جدید در آن به کار گرفته شوند. تعمیر و نگهداری ممکن است در طول ۲۰ سال رخ دهد در حالی که توسعه ممکن است مجموعاً ۱–۲ سال طول بکشد.
بخشی جدایی ناپذیر از نرم‌افزارها تعمیر و نگهداری آنهاست که نیازمند تهیه برنامه‌ای دقیق برای تعمیر و نگهداری آن در طول فرایند توسعه نرم‌افزار است. باید مشخص کنید که چگونه به درخواست‌های تغییر یا گزارش مشکلات کاربران پاسخ خواهید داد. بودجه فعالیت‌ها باید شامل تخمینی از منابع مورد نیاز و هزینه‌های آتی باشد تا دچار مشکل نشویم. تعمیر و نگهداری نرم‌افزار که می‌تواند برای ۵–۶ سال (یا حتی دهه‌ها پس از فرایند توسعه نرم‌افزار) ادامه داشته باشد نیازمند یک طرح مؤثر است که بتواند دامنه کاری نرم‌افزار را تعیین کند و زمینه را برای ارائه برآوردی از هزینه‌های چرخه زندگی نرم‌افزار فراهم کند. انتخاب استانداردهای مناسب جهت به چالش کشیدن اقدامات بعدی روی نرم‌افزار از مرحله اولیه مهندسی نرم‌افزار است که از دید سهامداران نگران دارای اهمیت بسزایی است.
این بخش توصیف شش گام فرایند تعمیر و نگهداری نرم‌افزار را عنوان می‌کند:
تأثیر عوامل مؤثر کلیدی بر نگهداری (طبقه‌بندی شده به ترتیب حداکثر تأثیر مثبت به پایین)
نه تنها ماژول‌های مستعد خطا آزاردهنده و مشکل‌ساز هستند بلکه بسیاری از دیگر عوامل نیز می‌توانند موجب تنزل عملکرد بیش از پیش سیستم نیز بشوند. برای مثال "اسپاگتی کد" یک تکه کد بسیار پیچیده‌است که نگهداری مطمئن و ایمن آن کاملاً دشوار است. یک پیش‌آمد بسیار معمول است که اغلب تنزل‌های عملکردی سیستم ناشی از عدم استفاده از ابزارهای نگهداری مناسب است همانند ابزارهای ردیابی نقص، ردیابی تغییر نرم‌افزار، نرم‌افزار مدیریت و تست نرم‌افزار. باید برای استفاده از این ابزارها اهتمام نمود.