من پت هستم
من پت هستم
خواندن ۳ دقیقه·۴ سال پیش

یادگیری X به یادگیری Y خیلی کمک می‌کند ...

بذارید با یک گفتگوی فرضی بین چند تا برنامه‌نویس شروع کنیم:

--- پت بالاخره چطور مشکل پرفورمنس سرویس‌تون را حل کردید؟

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

--- عجب خر شانسی ه این مت.

--- نه شانسی نبود، مت توی کار قبلیش چند سال با X کار کرده بود

--- مگه شما با X کار می‌کنید؟‌ من فکر کردم تمام سرویس‌هاتون بر مبنای Y است

--- اووم، نمی‌دونم والله!

احتمالا مشابه این داستان برای خیلی از ما اتفاق افتاده و به نظرم خیلی کَل-کَل‌های گیگ جماعت حول این داستان «یادگیری X به یادگیری Y خیلی کمک می‌کند.» می‌گردد. مثلا امکان داره یکی بگه «یادگیری C به یادگیری Go کمک می‌کند.» و بعد بقیه موافق و یا مخالف باشند

حالا اجازه بدهید برویم سر یک بحث موازی دیگر. معمولا تلاش می‌کنیم با انتخاب abstractionهای مناسب وابستگی لایه‌های مختلف سیستم را به هم دیگر تا حد امکان از بین ببریم. سوال مهم ۱: اگر همچین abstractionی وجود دارد، چرا ما نیاز داریم بدانیم اون abstraction چطور نوشته شده؟ مثلا چطور شناخت C و یا ساختار پردازنده‌ها می‌تواند ما را برنامه‌نویس بهتری به زبان مثلا Go بکند؟ این نقض غرض نیست؟

اینجا می‌شود مفهوم leaky abstraction را مطرح کرد [1]. حقیقت این است تقریبا هیچ abstractionی وجود ندارد که ما را از دانستن جزئیات پیاده‌سازی‌اش بی‌نیاز کند و اصطلاحا جزئیات از لایه‌ای به لایه‌ دیگر نشت می‌کنند.

سوال مهم ۲: این نشت جزئیات کی‌ قابل قبول است و کی نیست؟ من شخصا جواب واضحی برای این سوال ندارم. با این وجود اعتقاد دارم فکر کردن به جواب این سوال می‌تواند هر کسی را برنامه‌نویس بهتری بکند.

و اما جواب غیر دقیق من:

  • اگر بتوان از جزئيات پیاده‌سازی abstraction و مستقل از قردادش در توسعه feature استفاده کرد، اون abstrction مشکل جدی داره و باید انداختش دور.
  • اگر برای پیاده‌سازی یک feature نیاز به دانستن بیش از یک جمله از جزئیات پیاده‌سازی هست. وقتون را با این ‌abstraction هدر ندهید، بندازیدش دور.
  • (منطقه خاکستری)‌ اگر feature را می‌توان فقط بر اساس قرارداد توسعه داد، ولی برای ‍«بهبود» عملکرد نیاز به دانستن جزئیات پیاده‌سازی دارید، احتمال داره شرایط‌تون بد نباشه.
  • اگر برای «بهبود» عملکرد فرض خاصی در مورد پیاده‌سازی کرده‌اید، هر چه سریع‌تر نقیض اون فرض را بکنید. اگر سیستم بهبود یافته «غلط» شد، سعی کنید سریع‌تر اون فرض و یا abstraction را کنار بگذارید.

این پست بر مبنای [2] نوشته شده.

[1] https://www.joelonsoftware.com/2002/11/11/the-law-of-leaky-abstractions/

[2] https://twitter.com/iampatt/status/1199565950049120256

برنامه‌نویسیabstractionsoftware engineeringمهندسی نرم‌افزار
مهندس دون‌پایه. یک کم فیسبوک کار کردم، یک کم گوگل. یک کم postmates یک چیزی مثل پیک موتوری. حالا هم توی یک شرکت روبات خودران کار می‌کنم. تخصصم در ماشین‌لرنینگ و سیستم‌ها توزیع‌شده است.
شاید از این پست‌ها خوشتان بیاید