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

این مشکلات وغرهایی که داریم به یه سری چیزهایی برمیگرده که در ادامه این پست و پست های دیگه درموردش صحبت میکنم!

خوب بنظرم بریم ببینیم ما در چه دنیایی وارد شدیم و چه کارهایی میشه کرد ولی قبلش یه قهوه یا چای بریزید و کمربند ها رو محکم ببندید تا خلبان شروع کنه حرکت کردن 😁

حدود یک سال قبل از تولد من (پیر شدم رفت😯) در سال 1986 آقای Fred Brooks مدیر پروژه IBM-360 یه مقاله ای میده با نام No Silver Bullet که به چهار ویژگی ذاتی نرم افزار اشاره میکنه:

  • Complexity:

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

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

در ادامه مبحث قبل یادمون باشه پیچیدگی خاصیت ذاتی نرم افزار به حساب میاد و از این رو نمیشه اون رو نادیده گرفت یا ازش فرار کرد!

  • Conformity:

بریم سر موضوع انطباق! خبر بد اینکه بسیاری از پیچیدگی هایی که یه مهندس نرم افزار با اون روبرو میشه از نوع پیچیدگی دلبخواهی یا arbitrary هست همون چیزی که مشتری میاد میگه داداش یک خط کد بیشتر نیست این کنترل گوشی بچم رو به نرم افزار فروشگاهی من اضافه کن که تو پنلم بین کارهام ببینم چیکار میکنه!!!! این موضوع که نهادها، مردم و سیستم های گوناگون اینجور پیچیدگی ها رو به صورت سازمان نیافته و بدون نظر یا دلیل تحمیل میکنن جزء مواردی هست که نرم افزار باید از اونها عموما تبعیت کنه!(اینم شانس ماس و واس ماس😫) و نکته مهم اینه که از رابط به رابطی دیگه و از زمان تا زمانی دیگه متفاوت هستن اونم به این دلیل که افراد و اشخاص متفاوتی در طراحی دخیل بودن و این قوانین و خط و مشی هایی که برنامه ملزم به رعایت اونهاست باعث ایجاد پیچیدگی میشه و همه میدونیم حتی با صرفا طراحی مجدد نرم افزار این پیچیدگی ها ساده نخواهد شد (حالا هرچی میشه هی برو راه حل بازنویسی بده🧐)

  • Changeability:

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

  • Invisibility:

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

 

خوب بنظرم تا اینجا برای این پست کافیه در پست بعدی کمی ذربین رو نزدیک ببریم و درمورد پیچیدگی صحبت داشته باشیم و با همین فرمان بریم جلو تا جایی که با موفقیت سقوط کنیم (😂)

 

اگر مطالب بالا به دردتون خورد و دوست داشتید خوشحال میشم با کلیک روی تصویر زیر من رو به یه قهوه مهمون کنید!!!

دسته بندی شده در: