ریسک های طراحی گروه دوم از ریسک های پروژه های نرم افزاری به شمار می روند. در چرخه عمر تولید نرم افزار، پس از تعیین نیازمندی ها، نوبت به طراحی نرم افزار می رسد. طراحی به معنای تعیین مولفه ها و اجزای نرم افزار و کارکردهای هریک برای برآورده ساختن نیازمندی ها است. تعیین نیازمندی ها طی ارتباط مستقیم با کاربران و با تاکید بر ابعاد کسب و کاری صورت می گیرد در حالی که طراحی مبتنی بر اصول فنی و الگوهای مهندسی نرم افزار انجام می شود. در طراحی نرم افزار، ابتدا معماری کلی آن مشخص می شود.
معماری در واقع ترکیب مولفه ها و اجزای کلان نرم افزار و ساز و کار ارتباط بین آنها است. معماری یکی از مهمترین اجزای نرم افزار به شمار می رود چرا که شالوده و سنگ بنای نرم افزار براساس آن شکل می گیرد. یک معماری خوش تعریف و منعطف، پاسخگوی نیازمندی های کاربران در آینده است. لیکن معماری نامناسب و ضعیف، نرم افزار را سست و ناتوان می سازد. پس از تعیین معماری، هریک از مولفه های نرم افزار ابتدا به صورت کلان و سپس به صورت تفصیلی طراحی می شوند.
حسب اهمیت فاز طراحی در توسعه نرم افزار، ریسک های این مرحله نیز کلیدی و حائز اهمیت هستند، برخی از مهمترین ریسک های فاز طراحی نرم افزار عبارتند از:
• سختی(Difficulty): نرم افزار یک موجودیت پیچیده است. ماهیت غیرملموس آن به همراه نیازمندی های متنوع کارکردی و غیرکارکردی که گاه با یکدیگر در تعارض هستند، تصمیم گیری در خصوص معماری و طراحی را سخت می کند. تصمیم های اشتباه و ارائه طراحی های پیچیده و دشوار باعث می شود تا در مراحل پیاده سازی نیز دشواری همچنان وجود داشته و امکان تولید یک نرم افزار با کیفیت و با قابلیت نگهداری سخت گردد. از این رو باید همواره مراقب پیچیده شدن و دشوار شدن طراحی بود تا طراحی ارائه شده قابلیت پیاده سازی و نگهداری را داشته باشد.
• ماژولاریتی(Modularity): اصول مهندسی نرم افزار تاکید می کنند تا نرم افزار تا حد امکان در قالب مولفه های نسبتاً مستقل تولید شوند. تاکید بر چنین اصلی باعث شکل گیری مفاهیم و اصول سرویس گرایی شده است. مولفه های مستقل، قابلیت نگهداری بهتری داشته و تغییر در یکی از آنها مستلزم تغییر همگی نخواهد بود. مولفه های مستقل براساس استانداردهای مشخص با یکدیگر در ارتباط بوده و وابستگی بالایی به یکدیگر ندارند. این ریسک زمانی بالا می رود که نرم افزار تولید شده به صورت یک تکه و فاقد مولفه های مستقل بوده و امکان تغییر آن محدود باشد.
• قابلیت استفاده(Useability): طراحی باید به نحوی انجام شود که مولفه های نرم افزار قابلیت استفاده مجدد را داشته باشند. در صورتی که مولفه ها به صورت یک بار مصرف تولید شوند، به مثابه سرمایه گذاری هستند که تنها یک بار قابل استفاده بوده و در دفعات بعدی باید مجددا تولید گردند.
• قابلیت نگهداری(Maintenability): نرم افزار یک بار تولید می شود، لیکن هزاران بار مورد استفاده قرار گرفته و در زمان استفاده نیز باید مرتب به روزرسانی شود. به روزرسانی های نرم افزار اغلب بواسطه تغییر در نیازمندی های کسب و کار و شکل گیری نیازمندی های جدید است. از این رو طراحی باید به گونه ای باشد که امکان اعمال تغییر در نرم افزار، اصلاح اشتباه ها و رشد آن براساس کارکردهای جدید وجود داشته باشد.
• قابلیت انتقال(Portability): تغییرات فناوری، به کارگیری نرم افزار در محیط های جدید را ضروری ساخته است. از این رو نرم افزار باید قابلیت انتقال به محیط های جدید از جمله سیستم عامل های جدید را داشته باشد. طراحی باید به گونه ای باشد که حتی الامکان نرم افزار مستقل از فناوری تولید شده تا امکان تغییر محیط عملیاتی آن وجود داشته باشد.
• قابلیت اطمینان(Reliability): اتکای کسب و کارها به نرم افزارها، قابلیت اطمینان و در دسترس بودن مستمر آنها را ضروری می سازد. نرم افزار باید به گونه ای طراحی شود که در زمان افزایش حجم عملیات و ازدیاد درخواست های کاربران با اختلال روبرو نشود. این ویژگی با عملکرد نرم افزار نیز به صورت مستقیم در ارتباط است.