پیشگفتار:
مدتی است که با خود میاندیشم تجربیاتم را در حوزهی نرمافزار در اینجا بنویسم، هم ماندگار خواهد شد و هم شاید به دوستی کمک کند. نمیدانم “الگوی ایجاد نرمافزار” عبارت مناسبی هست یا نه، ولی تا یافتن عبارت مناسبتر از آن استفاده خواهم کرد.
داستانی از عبید زاکانی:
گویند؛
روزی “مطربی” نزد “مرحوم کرباسی” که از علمای “عهد فتحعلی شاه” بود آمد و حکم شرع را در مورد “رقصیدن” پرسید.
کرباسی با عصبانیت جواب داد:
“عملی است مذموم و فعلی است حرام.”
مطرب پرسید: “حضرت آقا، اگر من دست راستم را بجنبانم حرام است؟”
مرحوم کرباسی گفت: “خیر!”
مطرب پرسید: “اگر دست چپم را بجنبانم؟!”
مرحوم کرباسی گفت: “خیر!”
سپس مطرب از “حکم شرعی” در مورد تکان دادن پای راست و چپ پرسید و هر بار مرحوم کرباسی گفتند: “خیر” ایرادی ندارد. اصولا دست و پا برای “جنبانده شدن” خلق گشته اند.
مطرب که منتظر این فرصت بود از جای خود بلند شد و در مقابل دیدگان بهت زده مرحوم کرباسی و حاضران مجلس “شروع به رقصیدن کرد” و گفت: “حضرت آقا، رقص همان تکان دادن دست ها و پاهاست که فرمودید حرام نیست.
مرحوم کرباسی در جواب گفت: “مفرداتش” خوب است…
ولی “مرده شوی ترکیبش را ببرد”
به این معنی که تک تک امور به تنهایی خوب هستند اما مجموعشان فعل حرام است و به درد نمی خورد.
منبع: اینجا
مفردات نرمافزاری:
یکی از روشهای حل مساله این است که مساله را به قسمتهای کوچکتری تقسیم کنید و بعد از حل هر قسمت که انتظار میرود پیچیدگی کمتری داشته باشد، از ترکیب راهکارها به پاسخ اصلی برسید. برای نمونه در طراحی الگوریتم، الگوریتم را به چند گام تقسیم میکنیم و هر یک از گامها را به تعدادی زیرگام. بعد از آن که جزییات هر زیرگام نهایی شد، آنها را با یک فرایند معکوس، سر هم میکنیم تا به الگوریتم نهایی دست پیدا کنیم. مثلا برای تولید و چاپ اعداد اول (به گونهای که چاپ آنها نیز بر مبنای یک الگوی خاص باشد)، مساله را به دو گام تولید اعداد اول و چاپ اعداد تولیدشده تقسیم میکنیم. بعد از حل هر دو گام، از سر هم شدن آنها، کل مساله حل میشود. در این شرایط هر بخش پاسخ ما به تنهایی فوقالعاده است و به خوبی کار میکند.
بعضی اوقات نیز به ناچار هر گام از مساله با یک تکنولوژی خاص انجام میشود. مثلا شما برای ایجاد اعداد اول تصمیم میگیرید که از یک کتابخانه موجود استفاده کنید. همچنین فرض کنید که برای چاپ اعداد هم از کتابخانهی دیگری استفاده مینمایید. دو گام/بخش راهکار شما به صورت جداگانه به خوبی کار میکنند.
ترکیبهای نرمافزاری:
نکته اینجاست که وقتی پاسخ تکتک اجزا (گامهای الگوریتم یا زیربخشها) را پیدا میکنید، هنگام سرهمبندی این اجزا با این واقعیت مواجه میشوید که این راهکارها قابل تجمیع در یک راهکار جامع و اصلی نیستند. به عبارت دیگر فرایند تجمیع که فرایندِ عکس فرایند تجزیه است، وقتی روی زیرراهکارها پیاده میشود، یا انجامپذیر نیست و یا در صورت انجامپذیری، موجود تجمیعشده پاسخ مسالهی اصلی نیست. این اتفاق به ویژه وقتی گامها/اجزا با تکنولوژیهای متفاوت و به صورت جداگانه پیش برده میشوند، بسیار بیشتر به چشم میخورد.
اینجاست که عبید زاکانی جلوی شما ظاهر میشود و با صدای بلند برایتان میخواند: تجزیهاش خوب بود، ولی مردهشور ترکیبش را ببرد!
برای این که ذهنمان به هم نزدیک شود اجازه بدهید مثالی بیان کنم. نمیدانم تا حالا رادیو یا ضبط یا کامپیوترهای قدیمی را باز کردهاید یا خیر. یکی از بستگان جوان ما عادت داشت که وقتی رادیوی خانهشان خراب میشد، آن را با آچار و پیچگوشتی باز میکرد و بعد از ساعتها کار مهندسی فشرده و طاقتفرسا 🙂 ، وقتی میخواست رادیو را دوباره سرهم کند یک سری قطعه و یک عالمه پیچ اضافه میآورد. به عبارت ساده فرایند سرهمبندی مطابق با فرایند جداسازی پیش نمیرفت. البته این فامیل ما همیشه میگفت که کارخانهی سازندهی رادیو این تجهیزات را به عنوان قطعات یدکی و اضافی در رادیو قرار داده است. 🙂
امیدوارم تجزیه و ترکیبهایتان فوقالعاده باشد.
گزیده:
یک برنامهنویس بد به راحتی میتواند دو شغل جدید در هر سال ایجاد کند. 🙂
دیوید پرناس
منبع عکس: گنجور
دیدگاهتان را بنویسید