طراحی نرمافزار فرایند حل مسئله و برنامهریزی در راستای ساختن یک نرم افزار است. طراحی نرمافزار فرایندی است که توسط آن یک عامل، مشخصه ای از نرمافزار را طراحی میکند که هدف آن، به انجام رساندن اهداف از پیش تعیین شده با استفاده از مجموعه ای از اجزای اولیه و با توجه به محدودیتها است. طراحی نرمافزار میتواند به عنوان "تمام فعالیتهای مربوط به مفهوم سازی، طراحی، اجرا، راه اندازی و در نهایت اصلاح سیستمهای پیچیده" یا "فعالیتهای مشخص مورد نیاز و قبل از برنامهنویسی و … [در] یک پروسه مهندسی نرمافزار. طراحی نرمافزار معمولاً شامل حل مسئله و برنامهریزی یک راه حل نرمافزاری است که شامل طراحی جزئی اجزا و طراحی الگوریتم و طراحی معماری سطح بالا میباشد.
طراحی نرمافزار فرایند پیشبینی و تعریف راه حلهای نرمافزاری به یک یا تعدادی از مشکلات است. یکی از اجزای اصلی طراحی نرمافزار، نرمافزار مورد نیاز تجزیه و تحلیل software requirements analysis]]SRA]] است. SRA بخشی از فرایند توسعه نرمافزار است که مشخصات مورد استفاده در مهندسی نرمافزار را فهرست میکند. اگر نرمافزار بهطور «کامل اتوماتیک» (به معنی بدون کاربر یا رابط کاربری) باشد، طراحی نرمافزاری ممکن است به اندازه یک فلوچارت یا متن توصیفی دنباله ای از رویدادهای برنامهریزی شده ساده باشد. همچنین روشهای نیمه استاندارد مانند زبان مدلسازی یکسان و مفاهیم مدلسازی اساسی وجود دارد. در هر صورت، بعضی مستندات این طرح معمولاً محصول طراحی است. علاوه بر این، طراحی نرمافزار ممکن است یک پلت فرم_مستقل(platform-independent)یا پلت فرم_مشخص(platform-specific) باشد که بسته به دسترسی به تکنولوژی مورد استفاده برای طراحی دارد. تفاوت اصلی بین تجزیه و تحلیل نرمافزار و طراحی نرمافزار این است که خروجی یک تجزیه و تحلیل نرمافزاری از مشکلات کوچکتر برای حل مسئله تشکیل شدهاست. علاوه بر این، تجزیه و تحلیل نباید با تفوت زیادی در میان اعضای تیم یا گروههای مختلف، طراحی شود. در مقابل، طراحی بر قابلیتها متمرکز است و بنابراین طرحهای متعددی برای یک مشکل مشابه میتواند وجود داشته باشد. بسته به محیط، طراحی اغلب متفاوت است، چه از طریق چارچوب (frameworks)های قابل اعتماد چه با الگوهای طراحی(design patterns) مناسب پیادهسازی شده باشد. نمونههای طراحی شامل سیستمهای عملیاتی، صفحات وب، دستگاههای تلفن همراه یا حتی پارادایم ابری جدید است.
طراحی نرمافزار هم یک فرایند و هم یک مدل است. فرایند طراحی یک دنباله ای از مراحل است که طراح را قادر میسازد که تمام جنبههای ساخت نرمافزار را توصیف کند. مهارت خلاقیت، تجربیات گذشته، حس اینکه چه چیزی نرمافزار «خوب» را میسازد و تعهد کلی به کیفیت، نمونههایی از عوامل موفقیت قطعی برای یک طراحی مناسب است. با این وجود مهم است که توجه داشته باشید که فرایند طراحی همیشه یک روش ساده نیست؛ مدل طراحی را میتوان با طراحی معماری خانه مقایسه کرد. با نشان دادن کلییت چیزی که باید ساخته شود آغاز میشود (به عنوان مثال، ارائه سه بعدی خانه)؛ و به آرامی، این برای ساخت هر جزئی (به عنوان مثال، نصب لولهکشی) اراِیه شده. است بهطور مشابه، مدل طراحی که برای نرمافزار ایجاد شدهاست، دیدگاههای مختلفی از نرمافزارهای کامپیوتری را فراهم میکند. اصول طراحی اولیه، مهندس نرمافزار را قادر میسازد تا در فرایند طراحی حرکت کند. دیویس[۳] مجموعه ای از اصول طراحی نرمافزار را پیشنهاد میکند که در لیست زیر ارائه شده و گسترش یافتهاست:
- فرایند طراحی نباید از «دید تونلی» رنج ببرد. یک طراح خوب باید روشهای جایگزین را در نظر بگیرد و هر کدام را براساس نیازمندیهای سئله و منابع موجود برای انجام کار، بررسی کند.
- طراحی باید قابل تبدیل به مدلهای تحلیلی باشد. از آنجایی که تنها یک عنصر از مدل طراحی اغلب میتواند به تعدادی از نیازها برگردد، لازم است که وسیله ای برای ردیابی نحوه رعایت الزامات مدل طراحی داشته باشیم.
- طراحی نباید چرخ را دوباره اختراع کند.
- طراحی باید فاصله فکری بین نرمافزار و مشکلی را که به عنوان آن را در دنیای واقعی وجود دارد، به حداقل برساند.
- طراحی باید یکنواخت و یکپارچه شود.
- طراحی باید متناسب با تغییر باشد.
- طراحی باید طوری ساختاریافته باشد که به راحتی تخریب شود، حتی هنگامی که با دادههای غیرمعمول، حوادث یا شرایط عملیاتی مواجه میشوند.
- طراحی برنامهنویسی نیست، برنامهنویسی طراحی نیست.
- طراحی باید براساس کیفیت درهنگام یه وجود آمدنش ارزیابی شود، نه بعد از تمام شدنش.
- طراحی باید بررسی شود تا خطاهای مفهومی (معنایی)، به حداقل برسد.