محمد ربانی بیدگلی
محمد ربانی بیدگلی
خواندن ۱۶ دقیقه·۳ سال پیش

خط تولید نرم‌افزار

چکیده

برای تولید یک نرم‌افزار لازم است تا تمام اجزای اصلی آن شناسایی شوند، سپس طراحی و پیاده‌سازی شوند. هنگامی که چندین نرم‌افزار قرار باشد که توسعه و تولید شوند و تمام این نرم‌افزارها از یک خانواده و عملکردی مشابه هم دیگر داشته باشند، مانند سیستم‌های مدیریت محتوا یا سیستم‌های تجارت الکترونیک، دیگر انجام مراحل تولید یک نرم‌افزار به ازای هر کدام از آن محصولات کار به صرفه‌ای نیست و منابع و زمان زیاد به هدر خواهد رفت. از این رو مفهومی به نام خط تولید نرم‌افزار مطرح شد. مفهوم خط تولید در به تنهای در بسیار از صنایع مانند صنعت خودرو سازی وجود دارد و چنین مفهوم در مهندسی نرم‌افزار نیز معرفی شد. در خط تولید نرم‌افزار اجزا و دارایی‌های ثابتی که ممکن است برای تمام نرم‌افزارهایی که از یک خانواده هستند استفاده شود، نگهداری می‌شوند و در سایر سیستم‌ها استفاده می‌گردد و به این صورت دیگر نیاز به ساخت اجزایی که از قبل برای یک نرم‌افزار مشابه ساخته شده بود نیست و بدین صورت زمان تولید نرم‌افزار افزایش می‌یابد و در مصرف منابع نیز صرفه‌جویی می‌گردد. در این مقاله به توضیح مفهوم خط تولید نرم‌افزار و روش‌های توسعه‌ی آن پرداخته می‌شود

مقدمه

یک شرکت خودرو سازی را در نظر بگیرید.این شرکت ماشین‌هایی در مدل‌های مختلف تولید می‌کند. یک ماشین برای آن‌ که به دست مشتری برسد باید یک سری ویژگی‌های مشخصی داشته باشد، به عنوان مثال باید رنگ شده باشد، شیشه و چراغ داشته باشند. بنابراین شرکت سازنده‌ی خودرو برای تولید محصولات خود باید یک سری کار تکراری را انجام دهند و آن کار نیاز به زیرساخت‌ها و لوازمی دارد. به همین جهت شرکت خودرو‌سازی به جای آن که به ‌ازای هر مدل خودرو لوازم و زیرساخت‌های مربوط به آن مراحل ثابت، مانند نصب در و کاپوت خودرو، رنگ کردن ماشین و غیره را از صفر بسازند و فراهم کنند، یک خط تولید درست می‌کنند که دارای مراحلی است و در هر مرحله یک کاری انجام می‌شود. به عنوان مثال در ابتدا اجزای بدنه‌ی خودرو سر هم می‌شوند، در مرحله‌ی بعدی شیشه‌ی ماشین نصب می‌شود و در انتها ماشین وارد قسمت رنگ ‌آمیزی می‌گردد. هر مدل از ماشین ویژگی‌های خاص خود را دارند و برخی از مدل‌ها ممکن است که امکانات یک مدل دیگر را نداشته باشند بنابراین خط تولید را می‌توان تغییر داد و برخی مراحل را حذف یا اضافه کرد. از طرفی در مراحل مشترک ممکن است که مواد و طرح فرق کنند، مانند نوع رنگی که در مرحله‌ی رنگ آمیزی می‌تواند متفاوت باشد. بنابراین خط تولید یک محصول دارای ویژگی‌های ثابت و متغیر می‌باشد که در نیازهای متغیر متناسب با نیازهای هر مدل تغییر می‌کند.

چنین مفهومی در تولید سیستم‌های نرم‌افزاری نیز وجود دارد و می‌توان برای محصولات نرم‌افزاری که از یک خانواده هستند از چیزی به نام خط تولید نرم‌افزار استفاده نمود. خط تولید نرم‌افزار، ابزار و روش‌هایی است برای ایجاد مجموعه‌ای از سیستم‌های نرم‌افزار مشابه، از یک مجموعه دارایی‌های نرم‌افزاری مشترک با استفاده از ابزار تولید رایج. درواقع به کمک خط تولید نرم‌افزار می‌توانید از اجزای موجود از پیش ساخته شده برای نرم‌افزارهای مختلفی که از اجزای استفاده می‌کنند، بهره ببرید. ایجاد خط تولید نرم‌افزار کار ساده‌ای نیست و پیچیدگی‌های خاص خود را دارد و در مقایسه با تولید یک محصول نرم‌افزاری سخت‌تر به بنظر می‌آید. برای ایجاد خط تولید نرم‌افزار روش‌هایی وجود دارد و باید مراحلی طی شود تا آن را ساخت. همچنین از ابزارهای مناسب خط تولید نرم‌افزار برای تولید نرم‌افزار می‌توان کمک گرفت. در این مقاله هدف بررسی مفهوم خط تولید نرم‌افزار، چند روش رایج برای ایجاد آن و ابزارهایی که می‌توان برای ایجاد آن استفاده کرد، پرداخته می‌شود. ساختار مقاله به این صورت است که در بخش دو بتدا مفهوم خط تولید نرم‌افزار و مزایای آن توضیح داده می‌شود. در بخش سوم و چهارم سه روش رایج وابزارهای موجود برای ایجاد خط تولید نرم‌افزار بررسی می‌شود. در بخش پنجم به بررسی دو مورد از خطوط تولیدی نرم‌افزار که برای تولید محصولات نرم‌افزاری در دنیای واقعی راه‌اندازی شده‌اند پرداخته می‌شود و در بخش ششم نیز جمع و نتیجه‌گیری حاصل از این تحقیق گفته می‌شود.

خط تولید نرم‌افزار

خط تولید نرم‌افزار را طبق تعریفی که توسط موسسه‌ی نرم‌افزاری Carnegie Mellon ارائه شده است، می‌توان به صورت زیر توصیف کرد:

یک مجموعه‌ای از سیستم‌های نرم‌افزاری فشرده است که مجموعه‌ای رایج و مدیریت شده از ویژگی‌هایی که نیازهای مشخصی از یک بخش بازار یا ماموریت را به اشتراک می‌گذارد و از یک مجموعه‌ی مشترکی از دارایی‌های اصلی به روش تجویز شده توسعه می‌یابد.

درواقع خط تولید نرم‌افزار یکی از روش‌های مهندسی نرم‌افزار، ابزار و تکنیک‌هایی برای ایجاد یک مجموعه‌ای از سیستم‌های نرم‌افزاری مشابه از مجموعه‌ای از دارایی‌های نرم‌افزار است که برای تولید نرم‌افزار استفاده می‌شود. در اینجا منظور از دارایی‌های سیستم‌های نرم‌افزاری می‌تواند نیازمند‌ی‌ها، معماری، کد و موارد تست باشند. هدف از ایجاد یک خط تولید نر‌م‌افزار آن است که بتوان روند توسعه‌ی نرم‌افزار را تسهیل کرد و در عین حال به صنعتی شدن آن کمک نمود. همچنین مجموعه‌ای از اجزای نرم‌افزاری با قابلیت‌ استفاده‌ی مجدد به منظور تولید سریع یک خانواده از سیستم‌های نرم‌افزار ساخت. هنگامی که از خانواده در نرم‌افزار صحبت می‌کنیم منظور سیستم‌هایی هستند که کارایی مشابه‌ای دارند و هدفشان یکی است، مانند نرم‌افزارهای تجارت الکترونیک (e-commerce). استفاده از خط تولید می‌توان مزایای زیادی به همراه داشته باشد. از جمله‌ی این مزایا می‌توان به موارد زیر اشاره نمود:

  • کاهش زمان عرضه به بازار: به واسطه‌ی توسعه‌ی سریع‌تر محصولات نرم‌افزاری از یک خانواده به وسیله‌ی خط تولید، زمان ساخت و ارائه‌ی محصول به بازار کم‌تر از زمانی خواهد بود که تمام اجزای یک محصول از صفر ساخته می‌شوند.
  • افزایش کیفیت محصول: برای ایجاد یک خط تولید نرم‌افزار دقت زیادی می‌شود و به جوانب زیادی باید توجه شود و تست‌های زیادی برای اطمینان از صحت عملکرد خط تولید انجام شود. یکی از دلایل افزایش کیفیت محصول می‌تواند رفع اشکالاتی باشد که در طول ساخت محصول و پس از ساخت آن پیدا می‌شوند.
  • کاهش ریسک و خطرات تولید: به واسطه‌ی دقت زیاد و آزمون‌هایی که انجام می‌شود، ریسک و خطرات تولید کاهش می‌یابد. همچنین به ازای هر محصول نرم‌افزاری که تولید می‌گردد اطمینان از عملکرد خط تولید، در صورتی که تغییر بنیادی در آن صورت نگرفته باشد، افزایش می‌یابد.
  • افزایش رضایت مشتری: طبیعتا افزایش کیفیت محصول و کاهش زمان عرضه به بازار رضایت مشتری را به همراه خواهد داشت.
  • استفاده موثرتر از منابع: از منابع و دارایی‌هایی که در اختیار است می‌توان به صورت مجدد استفاده کرد و نیازی نیست که پس از ساخت یک محصول به طور کامل کنار گذاشته شوند و حساب شده و متناسب با ویژگی‌های محصول درخواستی می‌توان از آن‌ها استفاده نمود
  • توانایی پیکربندی و شخصی سازی سریع: هر محصول نرم‌افزار متناسب با درخواست و نیازمندی‌های مشتری توسعه داده می‌شود و نیازهای مشتریان، تقریبا در اکثر موارد، مشابه یکدیگر نیستند. خط تولید نرم‌افزار این امکان را فراهم می‌کند تا محصولاتی که از یک خانواده هستند را بتوان متناسب با نیازهای مشتری تغییر داد و شخصی‌سازی نمود بدون آن که نیاز باشد از صفر تمام اجزا را طراحی و پیاده‌سازی نمود.

ایجاد و نگهداری یک خط تولید نرم‌افزار کار ساده‌ای نیست و در کنار مزایای فراوانی که دارد، دارای چالش‌هایی نیز می‌باشد که باید به آن‌ها توجه شود. از جمله‌ی چالش‌های مهم می‌توان به موارد زیر اشاره کرد:

  • هزینه‌ی توسعه‌ی خط محصول اولیه زیادتر از یک محصول به تنهایی است
  • برنامه‌ریزی انتشار سخت‌تر می‌شود، زیرا اولویت‌های رقابتی میان برنامه‌ها متفاوت است
  • پشتیبانی از خط تولید برای سالیان طولانی نیازمند توانایی نگهداشتن اجزای اصلی برای بازگرداندن یک سری تغییرات ایجاد شده توسط مشتری‌ها به هسته‌ی اصلی است

بنابراین برای ایجاد یک خط تولید محصول نرم‌افزاری لازم است تا به بسیار از جوانب توجه شود و نسبت به توسعه‌ی یک محصول نرم‌افزاری به تنهایی زمان زیاد‌تر و حتی نیروی انسانی بیشتری جهت بررسی و مهندسی اجزا و دارایی‌های مشترک و متغیر تشکیل دهنده‌ی نرم‌افزارهایی از یک خانواده صرف شود.

پیش از آن که روش‌های ایجاد خط تولید معرفی شوند، لازم است تا مفهومی به نام مهندسی خط تولید نرم‌افزار توضیح داده شود. مهندسی خط تولید نرم‌افزار دروافع روشی است برای ساخت یک مجموعه‌ای از سیستم‌های نرم‌افزاری متمرکز که مجموعه‌ای از ویژگی‌های مشترکی که می‌توانند سفارشی‌سازی شوند با توجه به نیازهای ذینفعان در یک محدوده‌ی مشخص استفاده می‌شود. به کمک مهندسی خط تولید می‌توان ویژگی‌های مشتری و متغیر یک خط تولید سیستم‌های نرم‌افزاری را شناخت و از آن‌ها به منظور استخراج حداکثر استفاده مجدد بهره برد. همچنین مهندسی خط تولید شامل دو فرایند است: مهندسی دامنه و مهندسی برنامه. در مهندسی دامنه محدوده کاری خط تولید و نیازهایی که دارد تعیین و اجزای آن‌ پیاده‌سازی می‌شود. نکته‌ای که مهم می‌باشد آن است که عامل کلیدی موفقیت توسعه‌ی یک خط تولید، ایجاد تمرکز مناسب برروی یک دامنه مشخص، به خوبی تعریف شده و با محدوده‌ی مناسب است. یک دامنه ناحیه‌ای از دانش است که:

  • هدف آن به حداکثر رساندن رضایت از نیازهای ذینفعان است
  • شامل مجموعه‌ای از مفاهیم و اصطلاحات است که توسط متخصصان آن ناحیه درک می‌شود
  • شامل دانش چگونگی ساخت سیستم‌های نرم‌افزاری (یا بخش‌هایی از آن‌ها) در آن ناحیه می‌باشد

بنابراین مرحله‌ی مهندسی دامنه بسیار مهم می‌باشد و به گونه‌ای آن را سنگ بنای ایجاد یک خط تولید نر‌م‌افزار مناسب می توان دانست. در مورد مهندسی برنامه نیز می‌توان گفت که مربوط به ترکیب اجزای ساخته شده در مهندسی دامنه و ساخت اجزای جدید برای رفع نیازهایی است که توسط مشتری مطرح شده‌اند. حل با توجه به آشنایی با مفهوم مهندسی خط تولید و فرایند‌های آن در ادامه به معرفی روش‌های تولید خط تولید نرم‌افزار پرداخته می‌شود.

روش‌های ایجاد خط تولید نرم‌افزار

در این بخش به معرفی سه روش ساخت خط تولید نرم‌افزار پرداخته می‌شود که هر سه از الگوهای معروف برنامه‌نویسی هستند این سه روش عبارت‌اند از برنامه ‌نویسی مبتنی بر ویژگی (Feature Oriented Programming یا به اختصار FOP)، برنامه نویسی مبتنی بر جنبه (Aspect Oriented Programming یا به اختصار AOP) و برنامه نویسی مبتنی بر شکست (Fragment Oriented Programming یا به اختصار FragOP) که در ادامه به بررسی بیشتر هر کدام از این روش‌های پرداخته می‌شود.

برنامه نویسی مبتنی بر ویژگی (FOP)

ایده‌ی اصلی FOP تجزیه‌ی طراحی یک سیستم و کد با توجه به ویژگی‌هایی است که ارائه می دهد و هدف اصلی خط تولید مبتنی بر ویژگی نیز استخراج محصول را به طور کامل خودکار کند. خط تولید مبتنی بر ویژگی شامل ۴ فرایند است که دو فرایند اول مربوط به مهندسی دامنه و دو فرایند دیگر نیز مربوط به مهندسی برنامه هستند و این ۴ فرایند عبارت‌اند از:

  • تحلیل دامنه: نوعی از تحلیل نیازها برای تمام خط تولید است و شامل ۲ مرحله‌ می‌باشد. مرحله‌ی اول محدوده‌ی دامنه نام دارد. این مرحله مربوط به فرایند تصمیم‌گیری در مورد بازه یا وسعت خط تولید است و معمولا مدیران تصمیم می‌گیرند که کدام نیازمندی‌های ایجاد شده در دامنه باید در نظر گرفته شوند. مرحله‌ی دوم طراحی دامنه است. درواقع طراحی دامنه اشتراک‌ها و متغیرهای دامنه‌ی محدود شده را ضبط و مستند می‌کند.
  • تحلیل نیازمندی‌ها: در این فرایند تیم توسعه تلاش می‌کند تا نیازمند‌های مشتری را با آن نیازمندی‌هایی که در طول تحلیل دامنه شناخته شد، نگاشت کنند. در صورتی که یکی از نیازمندی‌های مشتری با ویژگی‌ها و نیازهای دامنه مطابق نباشد سه حالت رخ می‌دهد:

- آن نیازمندی خارج از محدوده‌ی خط تولید باشد و نمی‌توان ویژگی یا محصول متناظر را ارائه داد

- می‌توان محصول را با ویژگی‌ها و نیازمندی‌های موجود توسعه داد و تولید کرد. در انتها به صورت
دستی آن را گشترش داد و افزونه‌ها و پلاگین‌هایی به آن اضافه نمود

- آخرین را نیز آن است که این نیازمندی را به عنوان یکی از نیازهای خود دامنه و خط تولید در نظر
گرفته شود و محدوده‌ی خط تولید را تغییر دهیم که در این صورت لازم است دوباره از ابتدا و فرایند
تحلیل دامنه شروع کنیم.

  • پیاده‌سازی دامنه: پس از شناسایی و نگاشت نیازمندی‌ها نوبت به پیاده‌سازی آن‌ها به شکلی می‌رسد که قابلیت استفاده مجدد را داشته باشند. در این فرایند از کلمات توسعه‌دهندگان برای پیاده‌سازی راه‌حل‌ها نیازمندی‌های یک مشتری استفاده می‌شود. در این فرایند دو کار انجام می‌شود. ابتدا یک چارچوبی انتخاب می‌شود که قابلیت استفاده مجدد را فراهم نماید. سپس با توجه به چارچوب و راهبرد انتخاب شده ممکن است که نیاز به آماده‌سازی طراحی و کد به گونه‌ای باشد که بتوان پیاده‌سازی را تکرار کرد. به عنوان مثال ما طراحی می‌کنیم چگونه اجزای مشترک پیاده‌سازی ساختار بندی شوند و نقاط گسترش در کجا قرار گیرند و ویژگی‌های گسترش‌ها چگونه فعال و غیرفعال شوند.
  • استخراج محصول: در این فرایند نیز یک محصول با توجه به ویژگی‌های انتخاب شده در مرحله‌ی تحلیل نیازمندی‌ها می‌تواند تولید یا ترکیب شود با استفاده از اجزا و خروجی‌های توسعه‌داده شده در فرایند پیاده‌سازی دامنه.

بنابراین به کمک این ۴ فرایند می‌توان یک خط تولید مبتنی برروش FOP راه‌اندازی نمود.

برنامه نویسی مبتنی بر جنبه (AOP)

برنامه نویسی مبتنی بر جنبه یک روشی است که دغدغه‌های مقطعی را به وسیله‌ی معرفی یکی واحد ماژول‌سازی جدید به نام جنبه تقسیم می‌کند و هر جنبه نیز برروی یک ویژگی دغدغه‌ی مقطعی مشخصی تمرکز دارد. درواقع AOP اجازه می‌دهد تا برنامه را به قسمت‌های متفاوتی تقسیم کنیم که هر کدام یک دغدغه محسوب می‌شوند. در این روش ویژگی‌های مشترک به عنوان ماژول‌های اصلی در نظر گرفته می‌شوند و ویژگی‌های متغیر به عنوان جنبه‌ها پیاده‌سازی می‌شوند. در روش‌های سنتی و رسمی این ویژگی‌ها به عنوان ماژول‌های برنامه پیاده‌سازی می‌شوند و اگر یک ویژگی با سایر ویژگی‌ها بخواهد در ارتباط باشد با یک فراخوانی API توسط هر کدام از ویژگی‌ها به ویژگی مربوطه اتفاق بیفتد. به عنوان مثال در تصویر ۱ تمام ماژول‌ها نیاز دارند که بررسی کنند که آیا کاربر وارد حساب کاربر خود شده است یا خیر.

تصویر ۱- ارتباط ماژول‌ها در روش‌ سنتی
تصویر ۱- ارتباط ماژول‌ها در روش‌ سنتی

به همین منظور تمام ماژول‌های اصلی، سبد خرید و حساب من باید یک فراخوانی API به ماژول Login انجام دهند. در نتیجه کدها مربوط به فراخوانی API تنها در یک ماژول اجرا نمی‌شود بلکه در چندین ماژول اجرا می‌شوند، بنابراین در صورت نیاز به تغییر در کد فراخوانی API نیاز است تا تغییرات متعددی در سایر ماژول‌ها نیز انجام گیرد. اما به کمک روش AOP این تغییرات کاهش می‌یابد. در این روش در صورتی که ماژول‌هایی وجود داشته باشند تا بخواهند با هم در ارتباط باشند نیاز به انجام فراخوانی توسط ماژول‌های نیازمند نیست. به عنوان مثال در همان مورد بررسی احراز هویت دیگر نیازی به فراخوانی API توسط هر کدام از سه ماژول ذکر شده نیست و وظیفه‌ی بررسی احراز هویت تنها بردوش جنبه‌ی Login است و این جنبه بدون ماژول‌ها یا جنبه‌هایی که در کد برنامه تغییرات ایجاد می‌کنند این فرایند را کنترل می‌کند. در تصویر ۲ این مورد نشان داده شده است همچنین نام ماژول‌ها نیز به جنبه تغییر کرده است.

تصویر ۲- ارتباط میان جنبه‌ها در روش AOP
تصویر ۲- ارتباط میان جنبه‌ها در روش AOP

در تصویر ۳ کد یک ویژگی نمایش داده شده است. در این ویژگی یک کاربر در هر لحظه یک سفارش را بررسی می‌کند، تاریخچه‌ی تراکنش نیز در قسمت تاریخچه نیز وارد خواهد شد. برای پیاده‌سازی این ویژگی، مفهومی به نام نقطه‌ی پیوست (Join Point) و نقطه‌ی برش (Pointcut) تعریف می‌شود. نقطه‌ی پیوست جایی است که کد جنبه اجرا خواهد شد. نقطه‌ی برش نیز کد برنامه است که نقطه‌ی پیوست را انتخاب می‌کند جایی است که کد جنبه اجرا می‌شود. در تصویر ۳ قسمت مربوط به نقطه‌ی برش نشان می‌دهد که کد مربوط به افزودن تاریخچه‌ی تراکنش پس از اجرای متد Checkout در جنبه‌ی AspectCart اجرا خواهد شد. بدین ترتیب این AspectCart عملکرد برنامه‌ی خود را بدون نیاز به کنترل هویت کاربر اجرا می‌کند.

تصویر ۳- کد مربوط به Pointcut
تصویر ۳- کد مربوط به Pointcut


پس از طراحی و پیاده‌سازی جنبه‌ها به منظور اجرای آن‌ها نیاز به فرایندی به نام دوختن (Weaving) می باشد. دوختن مکانیزم پایه‌ای استفاده شده برای پیاده‌سازی AOP است که برای سازمان دادن به کلاس‌ها و جنبه‌ها به یک سیستم قابل اجراست. برای آن که بتوان تمام جنبه‌های پیاده‌سازی شده را اجرا نمود، لازم است تا به صورت ضمنی در یک فایل پیکربندی مانند Spring Bean XML که در تصویر ۴ آمده است تعریف شوند. تمام کلاس‌ها و جنبه‌ها با مکانیزم دوختن جهت شکل دادن و اجرای یک برنامه‌ پردازش خواهند شد.

تصویر ۴- فایلی که جهت عملیات دوختن باید ساخته شود
تصویر ۴- فایلی که جهت عملیات دوختن باید ساخته شود

بدین ترتیب پس از فرایند دوختن محصول نهایی از خط تولید خارج و آماده‌ی بهره‌برداری و استفاده می‌شود.

برنامه‌ نویسی مبتنی بر شکست (FragOP)

برنامه نویسی مبتنی بر شکست یک روش طراحی و پیاده‌سازی اجزای دامنه‌ی خط تولید نرم‌افزار است و براساس تعریف سه مفهوم زیر بنا شده است:

  • دامنه‌ی اجزا
  • نقاط شکست: حاشیه نویسی‌هایی برروی کد اجزای دامنه است
  • شکست‌ها: یک نوع جدیدی از فایل که کد اجزای دامنه را تغییر می‌دهد

این سه مفهوم بر پایه‌ی ۶ فعالیت محقق می‌شوند که در ادامه به توضیح هر کدام از شش فعالیت ارائه شده در این روش پراخته می‌شود.

طراحی نیازمندی‌های خط تولید: اولین فعالیت فرایند FragOp می‌باشد که در آن باید طرح نیازمند‌ی‌های خط تولید از طریق طراحی ویژگی‌ها ساخته شود. به عنوان مثال در تصویر ۵ ویژگی‌های یک فروشگاه لباس نشان داده شده است که در آن ویژگی‌هایی مانند لیست محصولات، محصول، احراز هویت، مدیر محصول و نمایش کلی محصولات به عنوان ویژگی تعیین شده‌اند. نکته‌ی دیگر در این شکل آن است که برای هر ویژگی تعیین شده که کدام یک اجباری و کدام یک اختیاری می باشد.

تصویر ۵- ویژگی‌های یک فروشگاه لباس
تصویر ۵- ویژگی‌های یک فروشگاه لباس

طراحی اجزای دامنه: در این فعالیت مدل اجزای دامنه ساخته می‌شود و این مدل یک دید انتزاعی نسبت به اینکه اجزا و عناصر دامنه چگونه سازماندهی می‌شوند ارائه می‌دهد. درواقع به کمک این دید انتزاعی می‌توان اجزای دامنه، فایل‌های عملیاتی و اطلاعات در مورد فایل را بدست آورد. در تصویر ۶ به عنوان مثال نشان داده شده است که یک عنصر از اجزا و فایل‌هایی با چه زبانی ساخته شده است.

تصویر ۶- اجزای تشکیل دهنده‌ی هر عنصر
تصویر ۶- اجزای تشکیل دهنده‌ی هر عنصر

پیاده‌سازی اجزای دامنه: در این فرایند ساختار خط تولید نرم‌افزار مشخص می‌شود و پوشه‌های اجزای شناسایی شده در فعالیت اول و فایل‌های مربوط به هر عنصر که در فعالیت دوم شناخته شدند ساخته می‌شوند. در این قسمت درواقع یک استخری از اجزا به همراه پیاده‌سازی آن‌ها ایجاد می‌شود. در تصویر ۷ نمونه‌ای از فعالیت نشان داده شده است که در آن در پوشه‌ی ComponentPool یک پوشه‌ی دیگر به نام BasicViewsHtml ایجاد شده است که در آن نیز فایل‌های سازنده‌ی آن قرار دارند. در این مرحله کارهایی مانند پیاده‌سازی فایل‌ها، پیاده‌سازی نقاط شکست و پیاده‌سازی شکست‌ها نیز انجام می‌شود.

تصویر ۷- ساختار پوشه‌ها و فایل‌ها
تصویر ۷- ساختار پوشه‌ها و فایل‌ها
  • پیاده‌سازی فایل‌ها: پیاده‌سازی هر کدام از اجزا و عناصر تعیین شده در این مرحله شروع می‌شود. به عنوان مثال عنصر BasicViewsHtml شامل یک فایل header.php است که در آن کد‌های HTML و PHP نوشته شده است و سرتیتر برنامه را نشان می‌دهد. کد مربوط به این فایل در تصویر ۸ نشان داده شده است.
تصویر ۸- کد عنصر header.php
تصویر ۸- کد عنصر header.php


تصویر ۹- کد عنصر header.php که در آن نقطه‌ی شکست مشخص شده است
تصویر ۹- کد عنصر header.php که در آن نقطه‌ی شکست مشخص شده است
  • پیاده‌سازی نقاط شکست: در این مرحله منظور از نقاط شکست، نقاط قابل تغییری است که درون یک فایل مشخص می‌شوند. به عنوان مثال عنصر Login به سرتیتر ساخته شده در BasicViewsHtml نیاز دارد ولی باید تغییراتی در آن صورت گیرد. بنابراین در عنصر header.php یک حاشیه نویسی باید انجام شود تا مشخص گردد که می‌تواند قسمتی از کد توسط یک عنصر دیگه مانند Login تغییر کند. بنابراین کد تصویر ۸ به کد تصویر ۹ تغییر می‌کند. برای نوشتن حاشیه نویسی یک الگویی ارائه شده است که به صورت مقابل می‌باشد: LanguageCommentBlock<B|E>-<PointID>LanguageCommentBlock. به کمک این الگو محدوده‌ی تغییر الگو را می‌توان تعیین کرد. به عنوان مثال در تصویر ۹ که مربوط به کد header.php می‌باشد، محدوده‌ای که قرار است قابل تغییر باشد به صورت <--B-menu-modificator--!> نشان داده شده است. در این مورد علامت (( --!> )) همان بخش LanguageCommentBlock می‌باشد و B یا E نیز به معنای شروع و پایان محدوده‌ی تغییر است. menu-modificator نیزهمان PointID است که متنی دلخواه است که برای شناسایی نقطه‌ی شکست استفاده می‌شود.
  • پیاده‌سازی شکست: شکست درواقع یک فایل است که در آن توسعه‌دهنده تغییرات کدی که باید در فایل اجزای تعیین شده ایجاد شود را می‌نویسد. ساختار این نوع فایل در تصویر ۱۰ آمده است. در این فایل <Fragment<ID حکم شناسه را برای شکست دارد و برای پیگیری و پیمایش کد مفید می‌باشد. Action نیز نوع تغییر را مشخص می‌کند که می‌توانند اضافه، جایگزین یا پنهان کردن یک بخش از کد باشد. Priority درواقع اولویت شکست را مشخص می‌کند و بدین صورت شکست‌ها با اولویت بالاتر قبل از شکست‌هایی با الویت پایین‌تر یکپارچه می‌شوند. PointBracketsLan نوع نمایش کامنت را نشان می‌دهد که به چه صورت نقطه‌ی شکست تعریف شده است. <...,FragmentationPoints: <PontID 1, PointID 2 نیز نقاط شکست را مشخص می‌کنند و درواقع جاهایی که کد تعریف شده در این فایل باید جایگزین کد اصلی شوند را مشخص می‌کند. <...,Destinations: <fileID1 نشان می‌دهد که کدام فایل‌ها باید تغییر کند. SourceFile: <filename نیز فایلی را مشخص می‌کند که باید جایگزین شود. همچنین در صورتی که قرار باشد یک کد جایگزین شود از SourceCode استفاده می‌گردد و کد مورد نظر در آن نوشته می‌شود. به عنوان مثال در تصویر ۱۱ فایل شکست مربوط به لیست محصولات نوشته شده است که در آن فایل header.php منجر به تغییر خواهد شد.
تصویر ۱۰- ساختار فایل شکست
تصویر ۱۰- ساختار فایل شکست


تصویر ۱۱- فایل شک
تصویر ۱۱- فایل شک
  • اتصال اجزای دامنه به نیازمندی‌های دامنه: در مرحله‌ی آخر از این فعالیت نوبت به توسعه‌ی یک مدل میان مدل‌های نیازمندی‌ها ومدل پیاده‌سازی می‌رسد. درواقع در این مرحله کافی است مدل ویژگی طراحی شده در فعالیت یک و اجزای دامنه در فعالیت دو را به یکدیگر، به تناظر متصل کرد.

پیکربندی محصولات: این مرحله شامل انتخاب ویژگی‌های مشخصی است که یک محصول مشخص براساس نیازمند‌ی‌های ذینفعان شامل می‌شود

استخراج محصولات: این فعالیت شامل سه گام می‌شود:

  • تعیین پارامترهای استخراج: در این بخش مسیر پوشه، دارایی‌های اصلی و اجزایی مورد نیاز تعیین می‌شوند
  • اجرای استخراج: براساس مسیر‌ها، پوشه‌ها و فایل‌های تعیین شده توسط یک الگوریتم خودکار فایل‌ها با یکدیگر ادغام و یکپارچه می‌شوند تا برنامه‌ی مورد نظر حاصل شود. در تصویر ۱۲ نمونه‌ای از خروجی این مرحله نشان داده شده است که مربوط به header.php در قسمت ListProduct می‌باشد
  • بررسی استخراج: در این مرحله به نوعی فرایند تست و خطایابی انجام می‌شود و خطاهای گرامری برروی فایل‌های استخراج شده پیدا می‌شود
تصویر ۱۲- خروجی حاصل از خط تولید که مربوط به فایل header.php می‌باشد
تصویر ۱۲- خروجی حاصل از خط تولید که مربوط به فایل header.php می‌باشد

ابزار ایجاد خط تولید نرم‌افزار

برای ساخت یک خط تولید نرم‌افزار می‌توان از ابزارهای متفاوتی استفاده کرد که فرایند ایجاد این سیستم را راحت و سریع می‌کنند. در ادامه به معرفی سه مورد از این گونه‌ ابزارها پرداخته می‌شود و با برخی ویژگی‌های توضیح داده می‌شود.

ابزار Gears

یک ابزار خط تولید نرم‌افزار است که توسط شرکت نرم‌افزاری BigLever توسعه داده شده است. درواقع Gears یک چارچوب چرخه‌ی حیات خط تولید نرم‌افزار است که تمام قابلیت‌های ابزار خط تولید نرم‌افزار را به وسیله‌ی چرخه‌ی حیات توسعه‌ی نرم‌افزار ارائه می‌دهد. . اساس این سیستم FOP است و با استفاده از این روش باید مهندسی خط تولید را انجام داد و آن را ساخت. در جهان نیز سازمان‌ها و شرکت‌ها بزرگی از این محصول برای ایجاد خط تولید خود استفاده نموده‌اند که از جمله‌ی آن‌ها می‌توان به Engenio که یکی از بزرگ‌ترین ارائه دهندگان حافظه‌ی داده است و ارتش ایالت متحده‌ی آمریکا نام برد

ابزار VariaMos

یک چارچوب و ابزار طراحی است که به راحتی قابل گسترش است و اجازه می‌دهد که بتوانید مدل‌های خود را تعریف کنید. به عنوان ویژگی اصلی آن، از مدل‌سازی‌های ویژگی، اجزا و چسباندن (binding) پشتیبانی می‌کند. همچنین این ابزار یک ابزار متن باز بوده و می‌توان از مخزن گیت هاب آن را دانلود کرد، توسعه و گسترش داد. بنابراین به کمک این ابزار می‌توان مدل‌هایی را توسعه داد تا بتوان یک تولید خط نرم‌افزار را مناسب با روش مورد نظر ایجاد کرد.

ابزار Pure::Variant

این ابزار توسط شرکت Pure Systems GmbH توسعه داده شده است و از تمام فازهای توسعه‌ی نرم‌افزار از تشخیص نیازمند‌ی‌ها تا تست و نگهداری پشتیبانی می‌کند. در این ابزار نیازمند‌ی‌ها به صورت مدل‌های ویژگی بیان می‌شود که یک محصول به تنهایی را در خط تولید نرم‌افزار نشان می‌دهد. برای استفاده از این محصول ابتدا باید در سایت شرکت سازنده ثبت نام کنید و لایسنس مربوط به نرم‌افزار را دریافت نمایید. سپس یک پیام به ایمیلی که با آن ثبت نام کردید ارسال می‌شود که در آن پیام نحوه‌ی نصب و استفاده از آن توضیح داده شده است. به گفته‌ی شرکت سازنده‌ی این محصول، نزدیک به ۱۰۰ مشتری و شریک در بخش‌های محتلف شرکت‌ها هستند که در حال استفاده از راه‌حل‌ها و سرویس‌های این شرکت بهره می‌برند و ده‌ها هزار مهندس هستند که فعالیت‌های مهندسی روزانه‌ی خود را به کمک این محصول انجام می‌دهد. اما در سایت این شرکت هیچ اسمی از شرکت‌های استفاده کننده‌ از این محصول دیده نشد.

نکته‌ای که در انتخاب ابزار مهم است شیوه‌ی مدل‌سازی و روشی است که برای ایجاد خط تولید نرم‌افزار قرار است مورد استفاده قرار گیرد. در همان ابتدا روشی که قرار استفاده شود باید مشخص گردد. به عنوان مثال اگر قرار است که یک خط تولید نرم‌افزار مبتنی بر ویژگی ایجاد شود می‌توان از ابزار Gears استفاده نمود اما اگر قرار باشد که از FragOP استفاده شود دیگر نمی‌توان از این ابزار استفاده کرد و می‌توان به سراغ ابزار VariaMos رفت و به کمک آن خط تولید خود را ایجاد کرد.

موارد استفاده از خط تولید نرم‌افزار

در این بخش به توضیح دو مورد از خطوط تولید نرم‌افزار پرداخته می‌شود که در محیط صنعتی و آموزشی راه‌اندازی و استفاده شدند.

شرکت HomeAway

این شرکت رهبر جهانی اجاره‌ اقامتگاه برای تعطیلات به صورت آنلاین است. این شرکت صاحبان خانه و مدیران املاک را به مسافرانی که به دنبال فضایی جهت اقامت می‌گردند، متصل می‌کند. از نظر گستره‌ی جغرافیایی نیز این شرکت در نزدیک به ۱۰۰ کشور فعالیت دارد و بیش از ۵۰ میلیون کاربر جهت انتخاب و اجاره خانه به این شرکت مراجعه می‌کنند. این شرکت برای ارتباط مشتریان خود در جاهای مختلف جهان محصولات نرم‌افزاری دارد که از جمله‌ی آن‌ها می‌توان به HomeAway.com، Verbo.com، CeyberRentals.com، Holiday-Rentals.co.uk و FeWo-direkt.de اشاره کرد. تمام این محصولات از یک خانواده می‌باشند. شرکت BigLevers روش خط تولید نرم‌افزار را برای این شرکت پیاده‌سازی نمود. مجموعه‌ای از دارایی‌ها با قابلیت استفاده‌ی مجدد برای محصولات ذکر شده که می‌توانند درگاه‌های وب، سیستم‌های مدیریت محتوا (CMS)، عملکرد واسط کاربری گرافیکی، اضافه و حذف ویژگی‌ها، منو و صفحات وب و غیره. به ویژگی‌های متغیری که در این سیستم‌ها وجود دارد می‌توان به زبان، مکان جغرافیایی و برند و غیره اشاره نمود. بنابراین شرکت HomeAway از روش خط تولید نرم‌افزار و چارچوب Gears برای انتقال از توسعه‌ی رسمی و سنتی نرم‌افزار به توسعه‌ی خط تولید استفاده کرد. Gears شرکت HomeAway را قادر به تولید جداگانه و خودکار، ساخت، آزمون و استقرار سایت‌ها نمود.

فروشگاه لباس

در یکی از کارهای آموزشی برای ارزیابی روش FragOP پنج محصول نر‌م‌افزاری در نظر گرفته شده بود که تمام این محصولات از یک خانواده بودند و در زمینه‌ی فروش لباس فعالیت می‌کردند. برای تولید این پنج محصول از روش خط تولید نر‌م‌افزار استفاده شد. از ویژگی‌های این فروشگاه‌ها می‌توان به خرید، سبد خرید، مدیریت سایت، سیستم اشتراک‌گذاری، احراز هویت، مدیریت پایگاه داده اشاره کرد. در این پیاده‌سازی از ابزار VariaMos استفاده شد و آن را متناسب با مدل‌ و روش FragOP که در بخش سوم توضیح داده شد تغییر دادند. در مجموع ۲۵ ویژگی و ارتباط میان آن‌ها طراحی شد، ۲۰ عنصر ساخته شد که در مجموع منجر به تولید ۸۰ فایل شد که از این ۸۰ فایل، ۴۶ مورد فایل‌های اجزای دامنه بودند و ۳۶تای دیگر شکست‌ها. در انتهای این پیاده‌سازی، نتایج حاصل از استخراج پنج محصول به کمک روش FragOP در تصویر ۱۳ آمده است. در این تصویر ستون اول نام محصول، ستون دوم تعداد ویژگی‌های انتخابی برای هر محصول، ستون سوم فایل‌های پیوند شده میان ویژگی‌های انتخاب شده و فایل‌های عنصر متناظر، ستون چهارم تعداد خط کدی که برای استخراج محصول نهایی به صورت دستی تغییر کردند و ستون پنجم نیز زمان مورد نیاز برای استخراج محصول را نشان می‌دهد. نکته‌ای که در این روش وجود داشت تغییر تنها ۳ خط کد به صورت دستی جهت تولید محصول مورد نظر بود.

تصویر ۱۳- نتیجه‌ی تولید ۵ محصول مشابه فروشگاه لباس به کمک خط تولید به روش FragOP
تصویر ۱۳- نتیجه‌ی تولید ۵ محصول مشابه فروشگاه لباس به کمک خط تولید به روش FragOP

در هر دو مورد بررسی شده محصولاتی مورد نظر با کمترین میزان تغییرات کد و در زمانی بسیار کمتر نسبت با زمانی که هر کدام به صورت جداگانه پیاده‌سازی می‌شدند، تولید شدند.

نتیجه‌گیری

برای تولید نر‌م‌افزارهای مشابه که از یک خانواده هستند و عملکردی یکسان دارند، مانند CMSها و e-commerceها، به جای آن که هر محصول را به صورت جداگانه توسعه داد می‌توان از خط تولید نرم‌افزار استفاده کرد. خط تولید نرم‌افزار کمک می‌کند تا اجزا و دارایی‌هایی که ثابت هستند را دیگر مجدد پیاده‌سازی نکنیم و امکان استفاده‌ی مجدد آن‌ها را در محصولات مشابه فراهم می‌کند. خط تولید نرم‌افزار مزایای زیادی مانند عرضه‌ی سریع‌تر محصول به بازار، هزینه‌ی مالی و زمانی کمتر، کاهش ریسک و خطاها و در نهایت رضایت مشتری را به همراه خواهد داشت. البته ایجاد و نگهداری خط تولید چالش‌هایی دارد. به عنوان مثال مدت زمانی که برای ایجاد اولین محصول صرف می‌شود زیادتر از زمانی است که برای تولید یک محصول به تنهایی صرف می‌گردد و نگهداری از آن با توجه به تغییراتی که در نیازمندی مشتریان و کسب و کار رخ می‌دهد دشوار است و برخی تغییرات بنیادین هزینه‌ی زیادی خواهد داشت. در خط تولید نرم‌افزار مهندسی این خط تولید بسیار اهمیت دارد و باید به خوبی دامنه و محدود‌ه‌ی فعالیت‌های نرم‌افزار و نیازهای آن را شناسایی کرد که به این کار مهندسی دامنه می‌گویند. پس از شناسایی دامنه و اجزای آن و پیاده‌سازی اجزا نوبت به مهندسی برنامه می‌رسد که مربوط به بخش توسعه‌ی نرم‌افزار و ترکیب اجزای ساخته شده در مهندسی دامنه می‌باشد. نکته‌ای که در خط تولید نرم‌افزار مهم است مدیریت دارایی‌ها متغیر یا همان ویژگی‌های متغیر است. برای پیاده‌سازی خط تولید نرم‌افزار به همراه مدیریت این ویژگی‌ها روش‌هایی ارائه شده است که از الگوهای برنامه نویسی بهره برده‌اند مانند FOP، AOP و FragOP. نکته‌ای که برای ایجاد خط تولید اهمیت دارد همین انتخاب روش توسعه است که با کدام یک از روش‌ها می‌توان نیاز ذینفعان را بهتر برطرف نماید. همچنین انتخاب روش در انتخاب ابزار ایجاد خط تولید نرم‌افزار نیز موثر است و متناسب با روش تعیین شده باید ابزار مناسب را انتخاب کرد. اما در کل روش FragOP را می‌توان ترکیبی از دو روش AOP و FOP دانست که بنظر می‌آید که از انعطاف بیشتری نسبت به دو روش دیگر برخوردار باشد و در صورت وجود آمدن نیاز جدید نیاز به انجام تمام مراحل ایجاد خط تولید از ابتدا دیگر نباشد. همچنین این روش از این نظر شبیه AOP می‌باشد که مرحله‌ای مانند دوختن در انتها دارد و از این نظر مشابه FOP می‌باشد که تمام مراحل مربوط به مهندسی دامنه در آن نیز باید با دقت انجام شود. هر چند که در فعالیت پیاده‌سازی اجزای دامنه بنظر می‌رسد که گام مربوط به اتصال اجزای دامنه به نیازمندی‌های دامنه اضافه باشد و می‌توان از آن به عنوان یک مرحله‌ی اختیاری یاد کرد. البته در راستای مستندسازی می‌تواند کمک کننده باشد.

مراجع

  • Apel, Sven, Don Batory, Christian Kästner, and Gunter Saake. Feature-oriented software product lines. Springer-Verlag Berlin An, 2016
  • Munir, Qaiser, and Muhammad Shahid. "Software product line: Survey of tools." (2010)
  • Marques, Maíra, Jocelyn Simmonds, Pedro O. Rossel, and María Cecilia Bastarrica "Software product line evolution: A systematic literature review." Information and Software Technology 105 (2019): 190-208
  • Iswari, Ni Made Satvika, Eko K. Budiardjo, and Zainal A. Hasibuan. "Aspect Oriented Programming Approach for Variability Feature Implementation in Software Product Line Engineering." In 2020 Fifth International Conference on Informatics and Computing (ICIC), pp. 1-5. IEEE, 2020
  • Correa, Daniel, Raúl Mazo, and Gloria Lucia Giraldo-Goméz. "Fragment-oriented programming: a framework to design and implement software product line domain components." Dyna 85, no. 207 (2018): 74-83
  • https://biglever.com/company/customers (last_updated: 2/12/2022)
  • https://variamos.com/home/variamos-web/
  • https://insights.sei.cmu.edu/blog/decisions-for-sustaining-a-software-product-line/



این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهیدبهشتی است
معماری_نرم_افزار_بهشتیمعماری نرم‌افزار
شاید از این پست‌ها خوشتان بیاید