برنامهنویسی شئگرا یکی از شیوههای برنامهنویسی (Programming Paradigms) است، که کد برنامهنویس را به وسیله «اشیاء» نظاممند میکند و یک مسئله را به قسمتهای مختلف تقسیم میکند. هرکدام از این اشیاء میتواند حاوی کد و انواع متغیر باشد، همچنین میتوان در یک یا چند شی دستورالعملهای مختلف برای اعمال تغییر در متغیرها و ایجاد هر «حالت» ممکن برای مولفههای را ذخیره کرد.
این شیوه برنامهنویسی قصد داشت با تفکر مردم در دنیای واقعی همسان باشد، مانند مرتب کردن کدها در بخشهایی معنادار و همراهبا ارتباط با یکدیگر تا همهچیز واضح و مشخص باشد. در نهایت این روش باعث میشد با خانوادههای مختلفی از اشیاء روبهرو شوید که تمام آنها بهصورتی محتاطانه با یکدگیر ارتباط برقرار میکردند و پیامهایی را درباره وضعیت دادههای خود یا تغییراتی که لازم است صورت گیرد رد و بدل میکردند.
اما در عمل بعضی منتقدان باور دارند که OPP همیشه اینگونه عمل نمیکند.
در گروه اشخاصی که از برنامهنویسی شئگرا متنفرند، میتوان نام مهندس فولاستک (Full-stack) ارشد، ایلیا سوزدالنیتسکی (Ilya Suzdalnitski) را دید که چند ماه قبل مقالهای به نام «برنامهنویسی شئگرا – یک فاجعه چند تریلیون دلاری» منتشر کرد و از شواهد پیدا است که او تنها کسی نیست که اینگونه فکر میکند. بعد از نوشتن دو مقاله او متوجه شد:
هر دو مقاله روی هم رفته بیش از نیم میلیون بار در ماه بازدید داشته است!
مشکل کجا است؟ به گفته سوزدالنیتسکی با پیچیدهتر شدن مسائل، «OOP در تنها وظیفهای که از ابتدا برای آن ساخته شده است، شکست میخورد». برنامههای شئگرا باید بتوانند به متغیرها و حالتهای مختلف آنها ختم شوند، اما در عوض «بین اشیاء مختلف بهصورت پیشفرض و مشترک به اشتراک گذاشته میشود».
او در ایمیلی گفته است:
در بیشتر موارد، برنامههای OOP تبدیل به حباب بزرگی از متغیرهای عمومی میشوند، که هر شخص یا چیزی میتواند بدون هیچ محدودیتی به آنها دسترسی داشته باشد.
سوزدالنیتسکی باور دارد که شئگرا برای انجام تست و پالایش کد سختتر است و در مقاله خود اینگونه اظهارنظر کرده که:
نوشتن کد خوب و قابل نگهداری توسط برنامهنویسی شئگرا غیرممکن است.
به باور او و با این توصیف، باید به توسعهدهندگان بیچاره ترحم کرد. او در جای دیگر مقاله خود گفته:
وقت گرانبها و نیروی فکری صرف مسائلی مانند انتزاع و الگوهای طراحی میشود، درحالیکه باید صرف حل مشکلات دنیای واقعی شود.
سوزدالنیتسکی یکی دیگر از مشکلات اصلی برنامهنویسی شئگرا را بحث همزمانی میداند.
برنامهنویسی شئگرا در دورانی آغاز شد که CPUها تنها یک هسته داشتند و برنامهنویسان مجبور نبودن نگران مسائلی مانند همزمانی باشند.
او در ایمیل خود گفت:
یکی از دلایل اصلی افزایش محبوبیت زبانهای برنامهنویسی تابعگرا (Functional) (مانند Go و Rust) توانایی این زبانها در مدیریت همزمانی در برنامهنویسی است.
در واقع مقاله او در انتها با ستایش از برنامهنویسی تابعگرا، بهعنوان گزینه برتر و الگویی رقابتی به پایان میرسد. در برنامهنویسی تابعگرا مشکلات نه بهصورت اشیاء بلکه توابع ریاضی محض مدلسازی شده است و همچنین این شیوه باعث جلوگیری از تغییر حالت در مدلها خواهد شد. سوزدالنیتسکی سه هفته بعد مقالهای در ستایش از برنامهنویسی تابعی منتشر کرد، بهنام: «برنامهنویسی تابعی؟ حتی بهخودتان زحمت ندهید، اسباببازی احمقانهای است». البته این مقاله بیشتر بهصورت روانشناسی معکوس نوشته شده است.
OOP در تنها وظیفه خود شکست میخورد.
بهعنوان مثال در این مقاله بحث میشود که برنامهنویسی تابعگرا «باعث خواهد شد پالایش و آزمایش کد بهصورت غیرضروری آسان شود» و اینکه الگوی برنامهنویسی گمراهکنندهای «براساس ریاضیات، که مشخصا رشتهای فرومایه است و هیچ کاربردی در دنیای واقعی بجز دروس آکادمیک ندارد».
دریافت واکنش
بعد از بهچالش کشیده شدن الگوی برنامهنویسی توسط سوزدالنیتسکی، که سالها مورد استفاده قرار گرفته است، خواندن واکنشها از طرف توسعهدهندگان به این مقاله جالب خواهد بود. اولین مقاله سوزدالنیتسکی ابتدا ۱۷۴ واکنش در سایت مدیوم (Medium) را بههمراه داشت، که شامل یک مهندس نرمافزار بهنام جسی دیکی (Jesse Dickey) بود، او در اظهار نظرش گفت که حتی نام این الگو برنامهنویسی نادرست است:
شما واقعا بهصورت اشیاء برنامهنویسی نمیکنید، شما بهصورت کلاسها برنامهنویسی میکنید. پس تقریبا میتوان آن را برنامهنویسی کلاسگرا نامید.
او بعد اضافه کرد، خود کلاسها را میتوان «انواع سفارشی» نامگذاری کرد.
در سایت ردیت بیش از ده فروم مختلف مرتبط با مقاله سوزدالنیتسکی ایجاد شد، که باعث متمایز شدن توسعهدهندگان دنیای واقعی شد، که کدام سبک برنامهنویسی بهتر است، برنامهنویسی شیءگرا یا تابعگرا.
در پایین دو اظهارنظر کاربران را میخوانیم:
من از زبانهای شیءگرا استفاده میکنم، ولی تمام کد را (بیشتر Typescript) و بهصورت تابعگرا مینویسم. این سبک بسیار راحتتر است. توابع و دادهها جدا از هم هستند. پالایش یک کد درهمریخته شیءگرا میتواند واقعا کابوس باشد، تا یک راهحل خطلوله تابعگرا.
من به برنامهنویسی تابعگرا نگاهی انداختم، ولی کار کردن با آن فاجعه است. مانند این است که شما با یک صفحهگستردهای کار کنید که صفحهگسترده ندارد.
خیلی زود در بخش نظرات یک مناظره شکل گرفت که آیا باید برنامهنویس را سرزنش کرد یا شیوه برنامهنویسی را؟!
نرمافزارها باید توسط برنامهنویسان میانرده نوشته شود، نه توسط برنامهنویسان نخبه. اگر شیوه یا پشته اصلی شما نیاز به برنامهنویس نخبه داشته باشد، احتمالا طی مرور زمان شکست خواهد خورد، زیرا برنامهنویسان نخبه را سخت میتوان یکجا نگه داشت.
برنامهنویسی شئگرا باعث ابهام در کد خواهد شد (که بنا به دلایلی با انتزاع اشتباه گرفته شده است) درحالی که برنامهنویسی تابعگرا قصد دارد تا حد امکان همه چیز را ساده و صریح کند.
در نهایت و بهصورت اجتناب ناپذیری، این بحثها باعث انتشار مقالهای با عنوان تحریک آمیز «توسعهدهندگانی که از برنامهنویسی شئگرا متنفرند، نمیدانند که باید چگونه از آن استفاده کنند» در اینترنت شد. این مقاله توسط مهندس نرمافزار بریتانیای، گری ویلبی (Gary Willoughby) نوشته شده است که در پروفایل خود، خودش را اینگونه معرفی کرده: «در حرفه توسعهدهنده نرمافزار بهعنوان یک تلاشگر خلاق».
انتقال پیام
در میانه این رفت و برگشتها، باید دید که احساس سوزدالنیتسکی درمورد واکنشهای دریافتی مقالهاش چیست. بنابراین پای صحبت اون نشسته و داستان طولانی او در دنیای شیوههای برنامهنویسی کامپیوتر و ریشه اصلی علاقه او به برنامهنویسی تابعگرا را خواهیم شنید.
من بیشتر مدت زندگیام برنامهنویس بودهام و هرچقدر تجربه بیشتری کسب میکردم، متوجه میشدم، کدی که نوشتهام بد است، خیلی بد. فهمیدن دلیل بد بودن کد نوشته شده سخت بود و مطمئنا بهدلیلی کم کاری نبود. من مقدار قابل توجهی زمان در طول سالهایی که برنامهنویسی شئگرا بودم صرف یادگیری کردم. خندهدار است که بازگشت سرمایه من بسیار خرد و کوچک بود.
برای اضافه کردن یک ویژگی ساده باید میزان غیرمنطقی زمان صرف میشد و هرچقدر که میزان کد افزایش پیدا میکرد، اینکار سختتر بود و همه چیز بیشتر و بیشتر خراب میشد.
ولی در سال ۲۰۱۴ سوزدالنیتسکی با زبان اف شارپ (#F) آشنا شد. اف شارپ یک زبان برنامهنویسی چند شیوهای است که توسط مایکروسافت عرضه شده است. «این زبان همزمان عجیب و زیبا بود، ولی ایده برنامهنویسی تابعگرا در من نهفته شد».
«برنامهنویسی شئگرا خطرناک است»
در طول سالهایی که او در حال اعمال برنامهنویسی تابعگرا در کد خود به زبان سی شارپ بود، شرکتی که در آن مشغول به کار بود توانست بهصورت کامل به زبان جاوا اسکریپت مهاجرت کند. و بعد از آن روز به گفته خود سوزدالنیتسکی:
تلاش بسیار زیادی کردم تا موارد استفاده از برنامهنویسی شئگرا را پیدا کنم، ولی هرگز نتوانستم چیزی پیدا کنم.
در زبانهای برنامهنویسی غیر شئگرا، مانند جاوا اسکریپت، توابع میتوانند مجزا از اشیاء وجود داشته باشند. این موضوع بسیار خلاصی بخش بود تا دیگر مجبور نباشیم مفاهیم عجیب و غریب را اختراع کنیم (مانند SomethingManager) تا فقط توابع را در خود نگهدارد.
امروز تمام این موضوعات سوزدالنیتسکی را مجاب کرده که:
برنامهنویسی شئگرا خطرناک است. عدم تعیین وراثت در برنامهنویسی شئگرا باعث میشود کد غیرقابل اعتماد باشد.
به لطف تمام اشیاء مختلف، بههمراه اشیائی که بعضی مواقع هنگام اجرا برنامه ایجاد میشوند، ممکن است جریان برنامه درحالاجرا به مسیرهای مختلف بسیار زیادی تغییر پیدا کند.
تأثیر ویرانگری که این شیو برنامهنویسی بهنظر بیگناه روی اقتصاد جهانی داشته، بهسختی قابل درک است.
سوزدالنیتسکی فکر میکند که اظهار نظرات قوی او باعث عصبانیت عدهای شده است. ولی بعد از نیم میلیون بازدید از مقالهاش از او پرسیده شد که، آیا چیزی شنیده است که باعث تغییر نظرش شده باشد یا مسائل را جور دیگری ببیند؟
یک اظهارنظر بود که واقعا باعث شد مرا لحظهای به تفکر ببرد.
او در ادامه اضافه کرد که ایده اصلی تولید زیاد و اشباع شده برنامهنویسان شئگرا موضوعی زیرساختی و نهادینه شده است. «برای مدیران استفاده از برنامهنویسان شئگرا قابل توجیه است، زیرا استخدام توسعهدهندگان برنامهنویسی شئگرا ارزان است و خیلی از کسانی که تازه از دانشگاه فارغ التحصیل شدهاند با برنامهنویسی شئگرا آشنایی دارند». ولی متاسفانه سوزدالنیتسکی باور دارد که آنها در نهایت هزینه اینکار را پرداخت خواهند کرد. یا میتوان به این شکل گفت که: «برنامهنویسی شئگرا رایج است به این دلیل که توسعهدهندگان برنامهنویسی شئگرا بهراحتی دردسترس هستند، درحالیکه برنامهنویسان تابعگرا معمولا باهوشتر و گرانتر هستند».
محصول نهایی این دورهها معمولا دیر عرضه میشود، نگهداری آن سخت است و معمولا بهدلیل عدم قطعیت برنامهنویسی شئگرا پر از باگ است.
پس سوزدالنیتسکی شروع به نوشتن مقاله اینترنتی دیگری کرد، به این دلیل که: «اگر من میتوانم الهام بخش هزاران نفر باشم تا برنامهنویسی شئگرا را زیر سؤال ببرند و برنامهنویسی تابعگرا را امتحان کنند، بنابراین آنها کدهای بهتر و مطمئنتری خواهند نوشت». با پانصدهزار بازدید، او تصور میکند که موفق شده است دنیا را در مسیری قرار دهد که در آن توسعهدهندگان خوشحالتر، کاربران شادتر و شرکتها در حال ذخیره پول باشند.
البته او همچنین گفته که هدفی خودخواهانه دیگری نیز دارد:
اینکه شرکتهای برنامهنویسی شئگرا را مجبور کنم قبل از تماس برای مشورت با من بیشتر فکر کنند.
شما درباره برنامهنویسی شئگرا چه فکر میکنید؟ از چه شیوههایی در برنامهنویسی استفاده میکنید؟