سلام
بخشی که می خواهم بگذارم مربوط به یک تحول جدید در برنامه نویسی است که به عنوان سمینار درس مهندسی نرم افزار در دانشگاه ما ارایه شده است
از تمامی کسانیکه در این پروژه زحمت کشیده اند کمال تشکر را دارم
مقدمه
در بیشتر سیستمهای نرم افزاری کنونی دغدغه[1]های مختلفی وجود دارد که بین بخشهای مختلف برنامه مشترک هستند و بعضاً رابطههای پیچیدهای بین بخشهای مختلف برنامه ایجاد میکنند. دغدغههایی از قبیل امنیت، امکان ثبت وقایع و ... بخش کوچکی از این دغدغهها را تشکیل میدهند. اگر برای پیادهسازی اینگونه دغدغهها از تکنیکهای برنامهنویسی شیءگرا استفاده شود، یک سیستم پیچیده، غیر قابل فهم و غیر انعطاف پذیر بهوجود میآید. روش جدید برنامهنویسی جنبهگرا[2](AOP) باعث میشود که تقسیمبندی بخشهای مختلف برنامه به نحوی ساده شود که برطرف کردن دغدغهها باعث پیچیدگی زیادی نشود. این کار باعث راحتتر شدن طراحی، فهم، و نگهداری سیستم خواهد شد. علاوه بر این، AOP باعث تولید محصولاتی با بهرهوری بالاتر، کیفیت بهتر، و امکان اضافه کردن قابلیتهای بیشتری میشود.
دغدغه[3] یک هدف مشخص، مفهوم یا حوزهی کاری است. یک سیستم نرمافزاری عادی شامل دغدغههای متعددی، از دغدغههای لایههای مرکزی گرفته تا دغدغههای لایههای سیستمی، میشود. برای مثال، دغدغهی مرکزی یک سیستم پردازش کارت اعتباری پردازش پرداختها است. در صورتی که دغدغههای سیستمی آن سر و کار داشتن با ثبت وقایع، یکپارچه کردن تراکنشها، شناسایی کاربر، امنیت، کارایی و ... است. خیلی از این دغدغهها، که به دغدغههای تداخلی[4] معروفند، بر روی پیادهسازی پیمانههای مختلف برنامه اثر میگذارند. در صورت استفاده از روشهای کنونی برنامهنویسی این دغدغههای تداخلی برروی تعداد زیادی از پیمانههای برنامه پخش میشوند و اثر میگذارند و به همین دلیل طراحی و درک سیستم مورد نظر سختتر، و همچنین پیادهسازی آن پیچیدهتر خواهد شد. تغییر هم در چنین سیستمی مطمئناً سختتر خواهد بود. برنامهنویسی جنبهگرا بهتر از روشهای متداول قبلی دغدغهها را از پیمانههای سیستم جدا میکند. به همین دلیل بهتر میتوان از تداخل دغدغهها جلوگیری کرد.
در این مقاله به بررسی مشکلاتی که تداخل دغدغهها در بخشهای مختلف برنامه ایجاد میکند میپردازیم و سپس مفاهیم پایهی برنامهنویسی جنبهگرا را مورد بررسی قرار میدهیم. در نهایت به بررسی چند نمونه از زبانهایی که از جنبهگرایی پشتیبانی میکنند میپردازیم.
بخش1 سیر تکامل روش برنامهنویسی
در روزهای اولیهی پیدایش علم کامپیوتر، برنامهنویسان برنامههای خود را مستقیماً با استفاده از کدهای سطح ماشین مینوشتند. به همین دلیل آنان فکر خود را بیشتر از اصل مسأله، متوجه مجموعه دستورات ماشین مورد نظر میکردند! بهتدریج زبانهای سطح بالاتری بهوجود آمدند که برای ما سطحی از انتزاع بر روی کامپیوترهای مختلف مورد استفاده ایجاد میکردند. وقتی به یک زبان برنامه مینوشتیم، دیگر لازم نبود به این مسأله فکر کنیم که برنامه روی چه ماشینی اجرا میشود. بعد از آن نوبت به زبانهای ساختیافته رسید. میتوانستیم برای راحتتر کردن کار، مسألهی خود را به تعدادی روال، که برای انجام کارها لازم هستند، تقسیم کنیم. برنامه نویسی شیء گرا به ما این اجازه را داد که یک سیستم را به صورت تعدادی شیء که با هم ارتباط و همکاری دارند ببینیم. کلاسها به ما این اجازه را میدادند که جزئیات پیادهسازی را پشت واسط برنامهنویسی پنهان کنیم. چند شکلی بودن امکان رفتار و واسطه مشترک برای مفاهیم مشابه را به ما میداد. به این وسیله میتوانستیم پیمانههای خاص و جدید را بدون نیاز به دستکاری در پیادهسازی مفاهیم پایه ایجاد کنیم.
روشهای برنامهنویسی و زبانها در واقع راه ارتباط با ماشین را تعریف میکنند. هر روش جدید راههای جدیدی برای تجزیهی مسأله ارائه میدهند: کد ماشین، کد مستقل از ماشین، روالها، کلاسها، و ... . هر روش جدید یک طرز نگرش تازه برای تبدیل نیازهای سیستم به زیرساختهای برنامهنویسی ارائه میدهد. تکامل این روشهای برنامهنویسی این امکان را به ما میدهد که سیستمهای پیچیدهتری ایجاد کنیم. عکس این مطلب نیز صادق است: سیستمهای پیچیده میتوانند پیادهسازی شوند، چون این روشها به ما این اجازه را میدهند.
در حال حاضر، بیشتر برنامهنویسی شیءگرا به عنوان روش ایجاد پروژههای نرمافزاری استفاده میشود. این روش قدرت خود را روی مدل کردن رفتارهای معمولی نشانداده است. ولی، همانطور که به زودی خواهیم دید، و همانطور که ممکن است شما قبلاً تجربه کرده باشید، این روش به خوبی نمیتواند روی رفتارهایی که بین چندین پیمانه (مخصوصاً پیمانههای مستقل و احتمالاًبیربط) مشترک است کار کند. بلعکس روش برنامه نویسی جنبهگرا تا حد خوبی این مشکل را برطرف میکند. به احتمال زیادی برنامهنویسی جنبهگرا ارائهدهندهی گام بزرگ بعدی در تحول روشهای برنامه نویسی خواهد بود.
بخش2 تحلیل یک سیستم به عنوان مجموعهای از دغدغهها
یک سیستم پیچیدهی نرمافزاری را میتوان به صورت پیادهسازی مخلوطی از چندین دغدغه ببینیم. یک سیستم خیلی معمولی ممکن است از تعداد زیادی دغدغه، شامل منطق کاری، کارایی، ماندگاری دادهها، ثبت وقایع و اشکالزدایی، هویت شناسی، امنیت، امنیت کار موازی[5]، بررسی اشکالها و غیره تشکیلشدهباشد. همچنین ممکن است با دغدغههای فرآیند تولید نرمافزار، مانند قابلیت درک، قابلیت نگهداری، قابلیت ردیابی، و سادگی تحول در سیستم مواجه باشیم.
ما نیازمندیها را از یک منشور مشخص کنندهی دغدغهها میگذرانیم، که این منشور دغدغههای مختلف مربوط را در هر نیازمندی مشخص میکند. همین دیدگاه برای دغدغههای فرآیند ایجاد نرمافزار نیز قابل تعمیم است.
بخش3 دغدغههای متداخل در یک سیستم
برنامهنویس، یک سیستم را به عنوان راهحلی برای چندین نیازمندی به وجود میآورد. به طور کلی میتوان این نیازمندیها را به نیازمندیهای سطح مرکزی و نیازمندیهای سطح سیستمی تقسیم کرد. بسیاری از نیازمندیهای سطح سیستمی مستقل از یکدیگر و مستقل از نیازمندیهای سطح مرکزی هستند. نیازمندیهای سیستمی همچنین در بسیاری از پیمانههای مرکزی تداخل دارند. برای مثال، یک برنامهی بنگاهی[6] از تعداد زیادی دغدغهی تداخلی مانند هویت شناسی، ثبت وقایع، استفادهی مشترک از منابع، سرپرستی، کارایی، و مدیریت ذخیرهسازی تشکیل شدهاست. هر کدام از این دغدغهها با بسیاری از زیرسیستمها تداخل دارد. برای مثال دغدغهی ذخیرهسازی بر روی تمام اشیاء ماندگار در سیستم اثر میگذارد.
به این مثال ساده ولی واقعی توجه کنید. پیادهسازی محافظت شده[7] ی یک کلاس تجاری را در نظر بگیرید:
public class SomeBusinessClass extends OtherBusinessClass
}
Core data members //
Other data members: Log stream, data-consistency flag //
Override methods in the base class //
(public void performSomeOperation(OperationInformation info
}
Ensure authentication //
Ensure info satisfies contracts //
Lock the object to ensure data-consistency in case other //
threads access it //
Ensure the cache is up to date //
Log the start of operation //
==== Perform the core operation ==== //
Log the completion of operation //
Unlock the object //
{
More operations similar to above //
(public void save(PersitanceStorage ps
{
}
(public void load(PersitanceStorage ps
{
}
{
در کد فوق، باید حداقل سه مسأله را مورد نظر قرار داد.
اول اینکه فیلدهای دیگر (Other Data Members) مربوط به دغدغهی اصلی این کلاس نیستند.
دوم اینکه به نظر نمیرسد پیادهسازی متد performSomeOperation() فقط مربوط به کار اصلی این متد باشد. در واقع در پیادهسازی این متد، در کنار دغدغهی اصلی، به کارهای جانبیای از قبیل ثبت وقایع، چک کردن هویت، امنیت کار موازی، چک کردن درستی cache و ... پرداختهاست. علاوه بر این، به نظر میرسد بسیاری از این دغدغههای جانبی به همین ترتیب در کلاسهای دیگر نیز پیادهسازی شدهاند.
سوم اینکه مشخص نیست که آیا متدهای save() و load() که کار مدیریت ماندگاری دادههای را انجام میدهند باید بخشی از قسمت اصلی این کلاس باشند یا خیر.
[1] Concern
[2] Aspect Oriented Programming
[3] Concern
[4] Cross-cutting Concerns
[5] Multithread safety
[6]
[7] Encapsulated
دلایلی برای رشد بازار ERP
ERP و مشکلات راه اندازی در سازمان
در طی دهه های قبل و لزوم استفاده از سیستمهای نرم افزاری برای شرکتها ، سیستمهای جـزیره ای و سپس سیستمهای یکپارچه مورد استفاده قرار گرفتند اما با رشد شرکتها و سازمانهای بزرگ با حجم پرسنل و محصولات بالا ، سیستمهای قبلی پاسخگوی نیاز مدیران این سازمانها نبودند . نتیجتا نسل جدیدی از این سیستمها با نام سیستمهای ERP - Enterprise Resource Planing ایجاد گردیدند ، این سیستمها با تفکری جدید و به وسیله اجرای فرآیندهای معرفی شده در سیستم عملیات سازمان را انجام می دهند .
یک سیستم ERP می کوشد تمام فعالیتها و عملیاتهای مختلف یک سازمان را در یک سیستم یکپارچه نرم افزاری بگنجاند ، شاید مهمترین تفاوتی را که بتوان در خصوص نرم افزارهای ERP با سیستمهای یکپارچه ( MIS ) نام برد روال اجرای عملیات در سیستمهای ERP است ، در سیستم ERP روال توسط فرآیندهای معرفی شده سیستم دنبال خواهد شد ، در یک سیستم ERP تمام اطلاعات در قالب یک بانک اطلاعاتی مشترک در کلیه قسمتهای مورد نیاز مورد استفاده قرار می گیرند و بخشهای مختلف سیستم با یکدیگر در تعامل می باشند ( به گردش زیر در سیستم توجه نمایید در این بخش ماژولهای درخواست کالا / مدیریت / انبار / خرید / مالی /حمل و نقل در گیر هستند ) :
- درخواست کالا توسط کاربر
- تایید درخواست کالا توسط مدیر بخش
- ارسال درخواست کاربر به بخش کنترل موجودی
- پردازش عملیات در سیستم کنترل موجودی و ارسال کالا به بخش خرید
- ارسال به قسمت کارپردازی
- خرید توسط کار پرداز از طریق مشخص کردن استعلام ، انتخاب فروشنده ، قرار داد
- ورود به سیستم مالی جهت مجوز پرداخت و صدور چک
- دریافت کالا توسط سیستم حمل و نقل
- ورود کالا به انبار
- ارسال به بخش متقاضی
در صورتیکه برای فعالیت موسسه و یا سازمان خود به این نتیجه رسیدید که به یک ERP نیاز دارید توجه داشته باشید که اجرای این سیستم با مشکلات خاصی همراه است که در ذیل به برخی از آنها اشاره می کنم :
(1) تمایل به ادامه روند سنتی :
از مشکلات اصلی سیستمهای نرم افزاری ( به خصوص ERP ها ) این است که کارکنان موسسات و سازمانها تمایلی به تغییر روشهای قبلی خود ندارد و ترجیح می دهند به صورت سنتی روند کار در موسسه را ادامه دهند . در هر صورت در اجرای نرم افزارها عمدتا امکان ادامه فرآیند بدون تغییر در روند کار افراد در موسسه امکانپذیر نیست . این مورد در تمام سیستمهای نرم افزاری عمومیت دارد ، خصوصا در سیستمهای ERP که شاید موجب تغییرات عمده ای در سازمان گردد . احتمالا بسیاری از پرسنل برای راه اندازی این سیستم جدید مقاومت می کنند و به بخش IT سازمان فشار می آورند که از سیستم قبلی استفاده نماید و یا سیستم را به شکلی که خود به آن عادت کرده اند تغییر دهند .
(2) پروسه طولانی مدت نصب و اجرای سیستم :
نصب و راه اندازی یک ERP کامل کار آسانی نیست ، در صورتی که فروشندگان مدعی نصب چند ماهه این نرم افزار در موسسه شما شدند شک نکنید که یکی از موارد زیر وجود دارد . به خاطر داشته باشید که مرحله نصب و راه اندازی یک سیستم ERP بین یک تا سه سال به زمان نیاز دارد:
- موسسه و سازمان شما بسیار کوچک است که در این صورت توصیه می شود از سیستمهای ساده تری استفاده نمایید ( سیستمهای یکپارچه )
- سیستم ERP به صورت کامل ارایه نشده و ناقص است ( مثلا ممکن است شما تنها ماژول حسابداری را درخواست نموده اید ) که در اینصورت نیز فلسفه استفاده از ERP در سازمان مورد نظر منطقی به نظر نمی رسد .
(3) آموزش به پرسنل :
از مهمترین بخشهای اجرای یک سیستم ERP آموزش سیستم به کاربران است . این آموزش تنها در حد آموزش یک نرم افزار جدید نیست ، بلکه در حقیقت آموزش یک نگرش جدید به شیوه انجام کار است که مسلما مستلزم صرف زمان زیاد و متعاقب آن صرف هزینه بیشتر نیز می باشد . توجه داشته باشید که در صورتیکه پرسنل نتوانند به درستی با سیستم جدید وفق پیدا کنند و از آن استفاده نمایند ممکن است سازمان به سرعت به بحران کشیده شود و کارایی سیستم ERP هر چقدر هم کامل باشد زیر سوال برود .
(4) مشاوره :
در حین راه اندازی و اجرای سیستم سعی کنید از بهترین مشاوران و کارشناسان متخصص استفاده کنید ، چرا که در صورتیکه مجبور به تغییرات در بخشهای دیگری از سیستم شوید ضرر بیشتری را متقبل خواهید شد ، سعی کنید نیازهای حال و آینده را در نظر بگیرید . چرا که همانطور که بیان شد سیستم ERP ممکن است دو یا سه سال دیگر در سازمان شما مستقر شود . نکته مهمی که در این قسمت باید به آن اشاره شود این است که مراقب باشید تا مشاوران و نیازهای خود را به صورت کامل بشناسید ( اجتناب از بلند پروازی های بیهوده )
(5) تحلیل و تبدیل داده ها :
در راه اندازی سیستم ERP تبدیل داده ها از مهمترین بخشهای آن است ، بسیاری از اطلاعات مشتریان در سیستمهای قبلی مورد نیاز است . تبدیل اطلاعات قدیم به اطلاعات جدید از بخشهای مهم و هزینه بر این پروژه است . اشکال آن جا است که بسیاری از داده های قبلی نیاز به تحلیل و تغییرات اساسی دارد و نمی توان به صورت مستقیم از آنها استفاده کرد .
(6) کنترل دقیق سیستم :
کنترل سیستمهای نرم افزاری از بخشهای اصلی آن است ، از آنجایی که تست این سیستمها بیشتر بر مبنای فرآیندها و سناریوها صورت می گیرد ، نسبت به سایر سیستمها نیاز به زمان و هزینه بیشتری دارد . چرا که ضمن کنترل فرمها و موارد جزئی باید ارتباطات بخشهای مختلف سیستم به صورت کامل کنترل شود . توصیه می شود برای تست سیستم ، به جای استفاده از اطلاعات اشتباه ، یک سیستم کامل را تست کنید ، یعنی اطلاعات کدینگ و اطلاعات پایه بخشهای مختلف را وارد نمایید و سپس از یک نقطه شروع سفارش تا بخشهای دریافت و ورود به انبار آنرا کنترل نمایید .
یکی از مهمترین اصول برای کنترل و تست دقیق ERP مستند سازی دقیق کلیه فرآیندهای سیستم است ، چرا که بر اساس همین مستندات سیستم توسط واحد تست کنترل می شود . پس در سیستمهای ERP بیش از هر سیستم دیگری به بخش مستندات خود بها دهید .
(7) سفارشی کردن سیستم :
تمام مواردی که تا اینجای کار بیان شد راه اندازی و نصب سیستم است ، در صورتی که پس از نصب نیاز به تغییرات در بخشهای سیستم داشته باشید مشکلات بزرگی پیش روی شما خواهد بود ، که شاید منجر به تکرار تمامی مراحل قبلی شود . از آنجایی که سیستم ERP متصل به هم می باشد با تغییر یکی از ماژولهای اولیه احتمال تغییر در قسمتهای بعدی سیستم نیز وجود دارد . شاید این بخش از پر هزینه ترین بخشهای راه اندازی سیستم ERP باشد .
یکی از مشتریان این سیستمها را در نمایشگاه الکامپ دیدم که برای تغییرات این چنینی مجبور شده بود تا به دنبال سیستم دیگری باشد !
توصیه می کنم که حتی الامکان از سفارشی کردن سیستم خودداری کنید و سعی در استفاده از Best practice نمایید ( مگر در مواردی که شما به عنوان اولین استفاده کننده از این سیستم هستید ).
(8) وابستگی به تیم فنی و هزینه های پشتیبانی :
پس از راه اندازی یک سیستم ERP بیش از هر سیستم نرم افزاری دیگری موسسه یا سازمان شما به تیم فنی و مجری پروژه نیاز خواهد داشت . در طول این مدت با برگزاری جلسات کارشناسی صورت گرفته و بازدیدهای مجری ، این تیم درباره فرآیند اجرا بیش از کارکنان شما مطلع هستند . پس از نصب و اجرای مراحل مختلف به این تیم برای تکمیل گزارشات و توسعه سیستم نیاز خواهید داشت .
(9) انتظار برگشت سرمایه :
در صورتیکه از جمله متقاضیانی هستید که انتظار دارید با نصب این سیستم به سرعت مشکلات سازمان شما مرتفع گردد و اثر خود را بر روی فرآیندهای مختلف تولید و فروش و ... بگذارد دست نگه دارید ! چرا که پس از نصب سیستم ماهها زمان لازم است تا اجرای فرآیندها به صورت موازی با سیستم قبلی همراه شود تا سیستم مراحل تست نهایی را پشت سر بگذارد .
همچنین در این قسمت هزینه های نصب ، راه اندازی و نگهداری را نیز به خاطر بسپارید .
اما با وجود تمامی موارد مشروحه دلیل اصلی استفاده از سیستم ERP چیست ؟ و چرا سازمانهای بزرگ ترجیح می دهند این سیستم را با تمام مشکلاتی که در پیش رو دارد ، جایگزین کنند ؟
برخی از اصلی ترین مزایای سیستمهای ERP به قرار زیر است .
- تمرکز اطلاعات در بخشهای مختلف سیستم که منجر به اخذ گزارشات یکپارچه جهت استفاده مدیران برای تصمیم گیری در سطوح کلان سازمان می گردد .
- یکپارچه سازی اطلاعات بخشهای مختلف (مالی ، خرید ، سفارشات مشتریان ، درخواستها و ...)
- کاهش اسناد کاغذی سازمان
- استاندارد سازی بخشهای مختلف سیستم
- امکان نظارت بیشتر مدیران سازمان به عملکرد بخشهای مختلف
- تمرکز منابع سازمان
نتیجتا پس از بررسی موارد بالا چنانچه سازمان شما با اهداف بزرگ با صرف هزینه های بالا ، در پی حل مشکلات موجود است ، استفاده از این گونه سیستمها را با در نظر گرفتن موارد بالا و پس از کارشناسی های لازم قابل بررسی می باشد .
با تشکر از آقای منسومی