ویرگول
ورودثبت نام
Saeid Noormohammadi
Saeid Noormohammadi
Saeid Noormohammadi
Saeid Noormohammadi
خواندن ۳ دقیقه·۷ ماه پیش

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

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

سیستم هایی که همه چیزشون قابل کانفیگ هستش، بیشتر اوقات دیگه هیچ تضمینی ندارن. هیچ چیزی توی اونها ثابت نیست و هر تغییری دقیقا مثل این میمونه که داریم با سیم کشی پشت یه دستگاه روشن بازی میکنیم! کم کم به جای یه سیستم مهندسی شده چیزی داریم که پیچیده و غیرقابل پیش بینی هستش. به این فکر کنید که چقدر اوضاع میتونه از کنترلمون خارج بشه!

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

پس دفعه بعدی که خواستیم یه چیزی رو "داینامیک" کنیم، یه لحظه صبر کنیم و خوب درموردش فکر کنیم.

- انعطاف پذیری همیشه ارزشمند نیست – بعضی وقت ها خودش منشا دردسره.
- بعضی تصمیم ها باید سخت گیرانه و غیرقابل تغییر باشن.
- گاهی کمی انعطاف ناپذیری، بهترین لطفیه که میتونیم در حق سیستم و هم تیمی هامون کنیم!

برای مثال فکر کنید قراره برای ایرانسل یا همراه اول یک سیستم مدیریت کمپین های تبلیغاتی طراحی کنیم. هدفمون اینه که تیم مارکتینگ بتونه بدون کمک گرفتن از تیم فنی هر نوع کمپینی رو با هر منطق دلخواهی تعریف و اجرا کنه(به عبارتی وابسته به تیم فنی نباشه). مثلا بخواد سناریو زیر رو تعریف کنه:
کاربرایی که تو 1 ماه گذشته سیم کارت غیرفعال داشتن، ساکن شهر تهران هستن پیامک تبلیغاتی A براشون ارسال بشه یا اینکه بسته تشویقی A براشون فعال بشه.
خب در ظاهر همچین چیزی هم برای تیم فنی و هم مارکتینگ خیلی جذابه. ولی وقتی وارد فاز اجرا بشیم، مشکلات خودشون رو نشون میدن. چون برای اینکه همچین چیزی رو پیاده سازی و همچین انعطافی رو داشته باشیم، باید کلی از اطلاعات جزئی و قابل فیتلر رو در لحظه تو دیتابیس داشته باشیم. از طرف دیگه هم نیاز به یهRule Engine داریم که بتونه این شرط های پیچیده و داینامیک رو روی میلیون ها رکورد اجرا کنه. خب اینجا تازه اولین مشکل خودش رو نشونه میده: فشار سنگین روی دیتابیس و زیرساخت.
اما مشکل اصلی از جایی شروع میشه که تیم مارکتینگ چون دید فنی نداره شروع میکنه به ساخت کمپین ‌هایی که یا کانفلیکت دارن یا از نظر منطقی غیرقابل پیاده سازی هستن، این باعث رفتارهای غیرقابل پیش بینی میشه. برای مثال ممکنه یک پیامکی برای یک کاربر دوبار ارسال بشه و برای شخص دیگه ای ارسال نشه، چون شرط ها اشتباه ترکیب شدن. حالا فکر کنید که بخوایم دلیلش رو پیدا کنیم! ما میمونیم و کلی قوانین و روابط پیچیده‌.
از طرف دیگه این سیستم عملا قابل تست نیست. چون هیچ تضمینی وجود نداره که قوانین جدیدی که تیم مارکتینگ از طریق UI تعریف میکنه، از نظر منطقی درست باشن یا تاثیرشون روی سایر کمپین ها در نظر گرفته شده باشه.

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

نرم افزارطراحی نرم افزارمهندسی نرم افزارsoftware engineering
۲
۱
Saeid Noormohammadi
Saeid Noormohammadi
شاید از این پست‌ها خوشتان بیاید