توسعه نرمافزار چیست؟
توسعه نرمافزاری به مجموعهای از فعالیتهای علوم کامپیوتری گفته میشود که شامل ساخت و ایجاد، طراحی، دیپلوی کردن و پشتیبانی نرمافزار میشود(به ترتیب Creating، Designing، Deploying و Supporting).
کلمه نرمافزار به خودی خود به مجموعهای از دستورالعملها یا برنامههایی گفته میشود که به کامپیوتر میگوید چه کاری باید انجام دهد، مستقل از سختافزار بوده و کامپیوتر را قابل برنامهریزی میکند. نرمافزار سه دستهبندی اساسی و اصلی دارد که عبارتند از:
نرمافزار سیستم(System Software): به منظور ارائه عملکردهای اصلی مانند سیستم عاملها، مدیریت دیسک(Disk Management)، ابزارهای کمکی(Utilities)، مدیریت سختافزارها و سایر نیازهای عملیاتی مورد استفاده قرار میگیرد.
نرمافزار برنامهنویسی(Programming Software): ابزارهایی مانند ویرایشگرهای متن(Text Editors)، کامپایلرها(Compilers)، پیوند دهندهها(Linkers)، اشکال زداها یا همان دیباگرها(Debuggers) و ابزارهای دیگر برای ایجاد کد را در اختیار برنامهنویسان و توسعهدهندگان قرار میدهد.
نرمافزارهای کاربردی(Application or app Software): در جهت کمک به کاربران برای انجام وظایف مختلفشان ایجاد شدهاند. نرمافزارهایی مانند نرمافزارهای مدیریت داده ها(Data Management)، مدیا پلیرها(Media Players)، برنامههای امنیتی، وب اپلیکیشنها و برنامههای موبایل(مانند برنامههایی که برای خرید در Amazon.com یا برای پست کردن تصاویر در اینستاگرم مورد استفاده قرار میگیرند) نمونههایی از این دستهبندی هستند.
نوع احتمالی دیگری به نام نرمافزارهای جاسازی شده یا تعبیه شده(Embedded Software) نیز وجود دارد. این نوع از نرمافزارها برای کنترل ماشینها و دستگاهایی مورد استفاده قرار میگیرند که معمولاً به عنوان کامپیوتر در نظر گرفته نمیشوند(مانند شبکههای مخابراتی، خودروها، رباتهای صنعتی و...). این دستگاهها به همراه نرمافزارشان میتوانند به عنوان قسمتی از یک شبکه به اینترنت اشیاء(IoT) متصل شوند.
توسعه نرمافزار در درجه اول توسط برنامهنویسان، مهندسان نرمافزار و توسعهدهندگان نرمافزار انجام میشود. هر یک از آنها فعالیتهای گوناگون و مجزایی از یکدیگر دارند ولی در عین حال با هم در تعامل نیز هستند و بخشهایی از کارهای یکدیگر را همپوشانی میکنند. در ادامه به نقش و وظایف هر کدام اشاره خواهیمکرد.
برنامهنویسان(Programmers or Coders): نوشتن سورس کد(Source Code) برای برنامهنویسی کامپیوترها در جهت انجام کارهایی خاص مانند ادغام پایگاه دادهها(Merging Databases)، پردازش درخواستهای آنلاین(Processing Online Orders)، مسیریابی ارتباطات(Routing Communication)، انجام جستجو یا نمایش متن و گرافیک، از جمله کارهایی هستند که برنامهنویسان انجام میدهند. برنامهنویسان معمولاً دستورالعملهای توسعهدهندگان و مهندسان نرمافزار را تفسیر میکنند و از زبانهای برنامهنویسی مانند C++ یا جاوا برای اجرای آنها استفاده میکنند.
مهندسین نرمافزار(Software Engineers): کار اصلی آنها استفاده از اصول مهندسی برای ساخت نرمافزار و طرح سیستمهایی برای حل مشکلات است. مهندسین نرمافزار از زبان مدلسازی و ابزارهای دیگر برای ابداع راه حلهایی که معمولاً برای رفع مشکلات به صورت کلی و اساسی به کار میروند، استفاده میکنند(به طورکلی برای رفع مشکلات جزئی طرح یک روش یا راه حل خاص، نه از نظر زمانی و نه از نظر هزینه مقرون به صرفه نیست). راه حلهایی که توسط مهندسین نرمافزار ابداع میشوند بر اساس روشهای علمی بوده و باید به گونهای باشند که مانند یک پل یا آسانسور برای عبور از مشکلات، عمل کنند. اما اگر روند افزایش مسئولیت آنها را در طی زمان بررسی کنیم، به این نکته پی خواهیمبرد که مسئولیت آنها به طرز چشمگیری افزایش یافته است؛ این افزایش مسئولیت به علت پیشرفت دنیای نرمافزارها، حسگرها و ریزپردازندهها و اضافهشدن آنها به محصولات مختلف میباشد. امروزه پیشرفت بسیاری از محصولات متکی به نرمافزار آنهاست و جالبتر اینکه توسعه نرمافزاری به تنهایی کافی نیست و باید با توسعه مکانیکی و الکتریکی همراه شود تا یک محصول منحصر به فرد و متمایز را تحویل دهد.
توسعهدهندگان نرمافزار(Software Developers): نقش رسمی کمتری نسبت به مهندسان دارند و میتوانند بیشتر با حوزههای مختلف مانند کدنویسی درگیر شوند؛ در عین حال، هدایت و مدیریت کلی چرخه عمر توسعه نرمافزار به عهده آنهاست. از جمله وظایف دیگر آنها میتوان به: همکاری در تیمهای مختلف جهت یافتن نیازمندیها(Requirements) و فیچرها(Features)، میدیریت تیمهای مختلف توسعهدهنده، نظارت بر فرآیند توسعه، انجام تستهای مختلف و نگهداری از نرمافزار اشاره کرد.
کار توسعه نرمافزار به کدنویسها یا تیم های توسعه محدود نمیشود بلکه افراد دیگری نیز مانند دانشمندان و سازندگان سختافزارها و دستگاهها نیز میتوانند در این تیم گنجانده شوند(در بسیاری از مواقع این افراد برای اجرای دستورات توسط کامپیوتر یا دستگاههای مختلف دیگر، کدهای نرمافزاری مختلفی را ایجاد میکنند). در واقع طبق گفته موسسه Brookings(یک اتاق فکر بیطرف آمریکایی است که به تحلیل مسائل مختلف سیاسی، اجتماعی و اقتصادی میپردازد)، این کسب و کارها کمتر از نیمی از شرکتهایی را تشکیل میدهند که در زمینه توسعه نرمافزار فعالیت دارند.
یک تمایز مهم که بهتر است آن را بدانیم، تفاوت بین توسعه نرمافزار سفارشی(Custom) و توسعه نرمافزار تجاری یا تبلیغاتی ست(Commercial). توسعه نرمافزار سفارشی فرآیند طراحی، ساخت و ایجاد، دیپلوی کردن و نگهداری نرمافزار برای مجموعه خاصی از کاربران، سازمانها یا فانکشنهاست. در مقابل، نرمافزار خارج از قفسه تجاری(Commercial Off The Shelf Software یا به اختصار COTS)، برای مجموعه وسیعی از نیازمندیهای عموم مردم طراحی شدهاست. نمونههایی از COTS عبارتند از: مایکروسافت آفیس و آنتی ویروسها.
مراحل فرآیند توسعه نرمافزار:
به صورت کلی، توسعه نرمافزار شامل مراحل زیر میشود:
۱) انتخاب یک روش مناسب: برای ایجاد چارچوبی که در آن مراحل توسعه نرمافزار اعمال شوند و به طور کلی نقشه مسیر راه پروژه را توصیف میکند. این روش میتواند شامل موارد مختلفی از جمله: توسعه اَجایل، DevOps، توسعه سریع اپلیکیشن(Rapid Application Development یا به اختصار RAD)، چارچوب اجایل مقیاس پذیر(Scaled Agile Framework یا به اختصار SAFe)، روش آبشاری و... باشد.
۲) جمعآوری نیازمندیها: برای گردآوری اطلاعات مورد نیاز در جهت درک نیازهایی مختلف افراد.
۳) انتخاب یا ساخت یک معماری نرمافزار: معماری نرمافزار یک ساختار زیربنایی ست که نرمافزار قرار است در آن اعمال و اجرا شود.
۴) توسعه یک طرح: توسعه یک طرح پیرامون راه حلهایی برای مشکلاتی که براساس نیازمندیها بوده و اغلب شامل مدلهای فرآیند و استوری برد(Process models and Storyboards) هستند.
۵) ساخت یک مدل: این مدلسازی از طریق یک زبان مدلسازی مانند SysML یا UML برای اعتبارسنجی و نمونه سازی اولیه و همچنین شبیه سازی طرح(که در پیشتر به آن اشاره شد) صورت میگیرد.
۶) ساخت کد: ساخت کد در زبان برنامهنویسی مناسب. در این بخش باید انتخاب و ساخت کد به گونهای باشد که تیم احاطه کامل روی آن داشته باشند و بتوانند در صورت بروز مشکلات آن را به سرعت شناسایی و رفع کنند. انتخاب زبان برنامهنویسی مناسب و ساخت کد با کیفیت در نهایت منجر به ارائه محصول نهایی با کیفیت هرچه بالاتر میشود.
۷) تست کردن: انجام این مرحله برای آزمایش عملکرد اپلیکیشن پیش از ارائه محصول نهایی ست. در حال حاضر شرکتهای توسعهیافته از روشهای مختلفی برای تست کردن و ارائه محصولات خود استفاده میکنند که یکی از آنها ادغام مداوم و تحویل دهی مداوم یا همان CI/CD است.
۸) مدیریت پیکربندی: پیکربندی(Configuration) برای دانستن تمامی جوانب یک نرمافزار از جمله: نیازها، طراحی، کد، تست و غیره، و همچنین ساخت نسخههای متمایز نرمافزار انجام میشود. تعیین اولویتهای تضمین کیفیت و معیارهای کیفی نرمافزار را نیز انجام میدهد.
۹) دیپلوی کردن: واژه Deploying در اینجا به معنای نرمافزاری است برای استفاده، پاسخگویی و رفع نیازهای کاربران.
۱۰) انتقال دادهها: انتقال دادهها(Data Migrating) به منظور بروزرسانی نرمافزار و یا ساخت نرمافزار جدید از منابع موجود به منابع جدید صورت میگیرد.
۱۱) مدیریت و بررسی کلی پروژه: برای حفظ کیفیت و ارائه آن در طول چرخه عمر برنامه و همچنین ارزیابی فرآیند توسعه به کمک مدلهایی مانند Capability Maturity Model یا به اختصار CMM انجام میشود.
موارد ذکر شده از مراحل مختلف فرآیند توسعه نرمافزار را میتوان به عنوان مراحل چرخه عمر اپلیکیشن دستهبندی کرد و مدیریت آن(Application Lifecycle Management یا به اختصار ALM) بسیار حائز اهمیت است. از مزایای این چرخه عمر میتوان به بازیابی مداوم مراحل مختلف آن جهت بهبود مستمر محصول اشاره کرد؛ برای مثال، پس از انتشار محصول نهایی و بررسی مجدد نیازها و تعاملات کاربران با محصول، مجموعهای جدید از نیازها و خواستههای کاربران پدید میآید که میتوان آنها را جمعآوری، دستهبندی و به صورت یک لیست درآورد و در چرخه بعدی، آنها را به اولویتهایی که باید رفع شوند اضافه نمود.
در قسمت بعد با مفاهیم بیشتری از توسعه نرمافزار آشنا خواهیمشد.