طی چند سال گذشته و به دلیل همکاریام برای انتقال (migration) زیرساختهای سطح پایین یکی از پیچیدهترین سیستمهای نرمافزاری روی کرهی خاکی به نکات مهمی دربارهی تفاوت بین رابط (interface) و پیادهسازی آن (implementation) برخورد کردهام. معمولن ما رابط (interface) را تجریدی (abstraction) برای ارتباط با سیستم میدانیم و پیادهسازی (implementation) را هم روشی میدانیم که سیستم کارش را انجام میدهد. برای نمونه فرمان و پدالهای گاز و ترمز در خودرو مانند رابط عمل میکنند و چرخها و موتور هم مانند پیادهسازی هستند (ارتباط ما با خودرو از طریق فرمان و پدالها است ولی خودرو به کمک موتور و چرخها کار خواستهشده را انجام میدهد). چنین مفهومی به دلایل متعددی مفید است که مهمتریناش این است که پیچیدگی بسیاری از سیستمهای پرکاربرد خیلی سریع به حدی میرسد که فهم و شناخت کامل آن برای یک فرد یا گروه دشوار میگردد و تجریدها (abstraction) برای مدیریت این پیچیدگی بسیار مهم و حیاتیاند.
تعریف سطح درستِ تجرید (abstraction)، موضوع کاملن جداگانهای است که در اینجا به آن نمیپردازیم (کتاب نفر ماه افسانهای -Mythical Man-Month- را ببینید). نکته مهم این است که وقتی یک تجرید (abstraction) تعریف شد ما دوست داریم آن را غیرقابل تغییر، شفاف و تفسیرناپذیر بدانیم. به عبارت دیگر، هر رابط (interface) از دیدگاه نظری باید مرز شفافی بین استفادهکنندگان یک سیستم و پیادهسازی داخلی سیستم ترسیم کند. اما از دیدگاه عملی، با رشد تعداد استفادهکنندگان و استفاده از سیستم، این نظریه نقض میشود و استفادهکنندگان شروع به اعتماد و اتکا به جزییات پیادهسازی میکنند. این جزییات یا دانسته از طریق رابط (interface) به بیرون درز میکند یا خود استفادهکنندگان موقع استفاده از سیستم آنها را کشف کرده و میفهمند. «قانون تجریدهای دارای نشتی اسپولسکی» (Spolsky’s Law of Leaky Abstractions) توضیح میدهد که چگونه استفادهکنندگان به جزییات پیادهسازی اعتماد و اتکا میکنند.
نهایت چنین اتفاقی ما را به سوی مفهومی هدایت میکند که در محاوره به آن «قانون رابطهای پنهان یا غیرشفاف» (The Law of Implicit Interfaces) گفته میشود: با فرض وجود تعداد کافی از استفادهکنندگان، چیزی به نام پیادهسازی خصوصی (private implementation) وجود ندارد [پیادهسازی خصوصی به این معناست که استفادهکننده هیچ اطلاعی از نحوه و روش پیادهسازی داخلی سیستم ندارند]. به عبارت دیگر، در صورتی که رابط (interface) به تعداد کافی استفادهکننده داشته باشد، مجموع استفادهکنندگان خواسته یا ناخواسته به بخشهای مختلف پیادهسازی وابسته خواهند شد. نتیجهی چنین اتفاقی، سختتر شدن اعمال تغییرات در پیادهسازی رابطها است زیرا از این نقطه به بعد، پیادهسازی نه تنها باید با بخش مستندشده و شفاف رابطها (explicitly documented interface) تطبیق داشته باشد بلکه باید با بخش پنهان و غیرشفاف رابطها (implicit interface) که ناشی از روش استفاده از آنهاست نیز همخوانی داشته باشد. ما معمولن این پدیده را «سازگاری با خطا برای خطا« (bug-for-bug compatibility) مینامیم [«سازگاری با خطا برای خطا» یا «سازگاری با خطا» تکنیکی است که در آن خطاها یا رفتارهای نادرست نسخهی قبلی یک نرمافزار در نسخهی جدید آن با آگاهی و خودخواسته باقی گذاشته میشوند. مترجم]
شکلگیری رابط پنهان (implicit interface) معمولن تدریجی است و استفادهکنندگان رابط عمومن از شکلگیری آن آگاهی ندارند. برای مثال، یک رابط ممکن است هیچ تضمین یا اطلاعاتی دربارهی کارایی و سرعت خود اعلام نکرده باشد، با این حال استفادهکنندگان بر اساس تجربهی خود، کمکم به این جمعبندی میرسند که سطح سرعت و کارایی سیستم چقدر است و از آن به بعد انتظار دارند که کارایی سیستم دستِکم در همان سطح باقی بماند یا بهبود پیدا کند. این گونه انتظارات به بخشی از رابط پنهان (implicit interface) سیستم تبدیل میگردد و از آن پس، تغییرات سیستم باید این سطح از کارایی را پوشش دهد تا کارهای استفادهکنندگان دچار اختلال نگردد.
همهی استفادهکنندگان فقط به یک رابط پنهان یکسان وابسته نمیشوند. با فرض وجود تعداد کافی استفادهکنندگان، رابط پنهان در نهایت کاملن با پیادهسازی مطابقت خواهد داشت. در چنین شرایطی، رابط (interface) محو میشود و پیادهسازی (implementation) جای رابط را میگیرد و هر گونه تغییری در آن، انتظارات استفادهکنندگان را مختل میکند. اگر خوش شانس باشیم، آزمونهای جامع و خودکار میتوانند این گونه مغایرت با انتظارات استفادهکنندگان را پیدا کنند ولی نمیتوانند آنها را رفع کنند.
رابطهای پنهان (implicit interface) نتیجهی رشد طبیعی و ارگانیک سیستمهای بزرگ هستند. هرچند آرزو میکنیم که چنین مشکلی برای سیستمها به وجود نیاید، اما عاقلانه است که موقع ساخت و نگهداری سیستمهای پیچیده، مهندسان و طراحان رابطهای پنهان را مد نظر داشته باشند و به آن توجه کنند. به یاد داشته باشید که رابطهای پنهان چگونه طراحی و تکامل سیستمها را محدود میکنند و دقت کنید که برای هر سیستم پراستفادهای، رابط (interface) مفهومی بسیار پیچیدهتر از چیزی است که فکر میکنید.
هویرام کیست؟
هویرام رایت (Hyrum Wright) دانشمند ارشد (Principal Scientist) ادوبی (Adobe) است و قبل از آن، مهندس نرمافزار در گوگل بود. او روی ابزارها و زیرساخت مدیریت تغییر کد در مقیاس بزرگ کار میکند و سالهای زیادی را صرف بهبود کتابخانههای زیربنایی و مبتنی بر سیپلاسپلاس گوگل کرده است. او یکی از نویسندگان کتاب Software Engineering at Google نیز است.
منبع: www.hyrumslaw.com
گزیده:
وقتی داشتم این کد رو مینوشتم فقط من و خدا میفهمیدیم من دارم چه کار میکنم. الان دیگه فقط خدا میدونه!
ناشناس
دیدگاهتان را بنویسید